Repository: materials-data-facility/scythe (language: python)

Issue:
Make file test a little less specific to work with different libmagic versions
By only checking a few parameters in data_type, this change should make the `test_file` method a little more robust to slight changes in the output of the `file` command (resolves issue #35)
`test_file.py` tests fail dependent on version of `libmagic` installed
`test_file.py` is failing on a system with a more up to date libmagic due to a change in the output for a given file.

(on my more up-to-date system)
```
$ file --version
file-5.41
magic file from /usr/share/file/misc/magic
seccomp support include

$ file ./MaterialsIO/tests/data/image/dog2.jpeg
./MaterialsIO/tests/data/image/dog2.jpeg: JPEG image data, JFIF standard 1.01, resolution (DPI), density 300x300, segment length 16, Exif Standard: [\012- TIFF image data, little-endian, direntries=2, GPS-Data], baseline, precision 8, 1910x1000, components 3
```

(on an older Debian system):
```
$ file --version
file-5.32
magic file from /etc/magic:/usr/share/misc/magic

$ file MaterialsIO/tests/data/image/dog2.jpeg
./MaterialsIO/tests/data/image/dog2.jpeg: JPEG image data, JFIF standard 1.01, resolution (DPI), density 300x300, segment length 16, Exif Standard: [TIFF image data, little-endian, direntries=2, GPS-Data], baseline, precision 8, 1910x1000, frames 3
```

This causes the test suite to fail on the more up-to-date system. Notice in particular the `\012- ` added to the output (which according to the [man page](https://linux.die.net/man/1/file#:~:text=Subsequent%20matches%20will%20be%20have%20the%20string%20%27%5C012%2D%20%27), represents multiple flags were present) and also the difference between "components" and "frames" at the end.

Since the specific version of `libmagic` cannot be mandated (because it's a system package), my suggestion would be to loosen up the requirement on the `data_type` assertion in the test suit. Something like the following:

```python
for i in ['JPEG image data', 'density 300x300', 'TIFF image data', '1910x1000']:
    assert i in output['data_type']
```

The following test method works on my system:

```python
def test_file():
    my_file = os.path.join(os.path.dirname(__file__), 'data', 'image', 'dog2.jpeg')
    parser = GenericFileParser(store_path=True, compute_hash=True)
    output = parser.parse([my_file])
    expected = {
        'mime_type': 'image/jpeg',
        'length': 269360,
        'filename': 'dog2.jpeg',
        'path': my_file,
        'data_type': 'JPEG image data, JFIF standard 1.01, resolution (DPI), '
                     'density 300x300, segment length 16, Exif Standard: [TIFF '
                     'image data, little-endian, direntries=2, GPS-Data], '
                     'baseline, precision 8, 1910x1000, frames 3',
        'sha512': '1f47ed450ad23e92caf1a0e5307e2af9b13edcd7735ac9685c9f21c'
                  '9faec62cb95892e890a73480b06189ed5b842d8b265c5e47cc6cf27'
                  '9d281270211cff8f90'}
    for i in ['JPEG image data', 'density 300x300', 'TIFF image data',
              '1910x1000']:
        assert i in output['data_type']
    del output['data_type']
    del expected['data_type']
    assert output == expected
    assert isinstance(parser.schema, dict)
```


Discussion / hints:

Fix patch:
diff --git a/.gitignore b/.gitignore
index 5d98c5d..c605a6d 100644
--- a/.gitignore
+++ b/.gitignore
@@ -14,3 +14,8 @@ src/*
 
 *.coverage*
 *.pytest_cache*
+.vscode
+.venv
+.idea
+test_files/
+*.xpr
diff --git a/.python-version b/.python-version
new file mode 100644
index 0000000..f7e5aa8
--- /dev/null
+++ b/.python-version
@@ -0,0 +1,1 @@
+3.7.12
diff --git a/materials_io/electron_microscopy.py b/materials_io/electron_microscopy.py
index ec180a2..1d3b5a7 100644
--- a/materials_io/electron_microscopy.py
+++ b/materials_io/electron_microscopy.py
@@ -1,127 +1,1251 @@
-import hyperspy.api as hs
+import logging
+import re
+from typing import Tuple, Dict, Optional
+
+from hyperspy.io import load as hs_load
+from traits.trait_base import Undefined
 
 from materials_io.base import BaseSingleFileParser
+from materials_io.utils import get_nested_dict_value_by_path as get_val
+from materials_io.utils import \
+    map_dict_values, MappingElements, standardize_unit
+from materials_io.utils import set_nested_dict_value_with_units as set_val_units
+
+logger = logging.getLogger(__name__)
 
 
 class ElectronMicroscopyParser(BaseSingleFileParser):
-    """Parse metadata specific to electron microscopy"""
+    """Parse metadata specific to electron microscopy, meaning any file
+    supported by HyperSpy's I/O capabilities. Extract both the metadata
+    interpreted by HyperSpy directly, but also any important values we can
+    pick out manually.
+
+    For each value (if known), return the subdict:
+      {
+        "value": numeric/str value,
+        "unit": unit name from http://qudt.org/vocab/unit/ (see 
+                http://www.qudt.org/doc/DOC_VOCAB-UNITS.html for details)
+      }
+    
+    The allowed metadata values are controlled by the
+    ../schemas/electron_microscopy.json JSONSchema specification
+    """
+
+    def _parse_file(self, file_path: str, context: Dict = None) -> Dict:
+        self.em = {}
+        self.inst_data = None
+
+        # Read file lazily (reduce memory), both HyperSpy-formatted and raw data
+        self.hs_data = hs_load(file_path, lazy=True)
+
+        # if hs_data is a list, pull out first for metadata extraction
+        if isinstance(self.hs_data, list):
+            self.hs_data = self.hs_data[0]
+
+        self.meta = self.hs_data.metadata.as_dictionary()
+        self.raw_meta = self.hs_data.original_metadata.as_dictionary()
+        self.em['raw_metadata'] = self.raw_meta
+
+        for s in ['General', 'General_EM', 'TEM', 'SEM', 'EDS', 'EELS']:
+            self.em[s] = {}
 
-    def _parse_file(self, file_path, context=None):
-        # Read file, both HyperSpy-formatted and raw data
-        hs_data = hs.load(file_path)
-        data = hs_data.metadata.as_dictionary()
-        raw_data = hs_data.original_metadata.as_dictionary()
+        # call each individual processor
+        self._process_hs_data()
+        self._dm3_general_info()
+        self._dm3_eels_info()
+        self._dm3_tecnai_info()
+        self._dm3_eds_info()
+        self._tia_info()
+        self._tiff_info()
 
-        em = {}
-        image = {}
+        # Remove None/empty values
+        for key, val in list(self.em.items()):
+            if val is None or val == [] or val == {}:
+                self.em.pop(key)
+
+        record = {}
+        if self.em:
+            record["electron_microscopy"] = self.em
+
+        return record
+
+    def _process_hs_data(self) -> None:
+        """Parse metadata that was already extracted from HyperSpy"""
         # Image mode is SEM, TEM, or STEM
         # STEM is a subset of TEM
-        if "SEM" in data.get('Acquisition_instrument', {}).keys():
-            inst = "SEM"
-        elif "TEM" in data.get('Acquisition_instrument', {}).keys():
-            inst = "TEM"
+        if "SEM" in self.meta.get('Acquisition_instrument', {}).keys():
+            self.inst = "SEM"
+        elif "TEM" in self.meta.get('Acquisition_instrument', {}).keys():
+            self.inst = "TEM"
         else:
-            inst = "None"
+            self.inst = 'None'
 
         # HS data
-        try:
-            inst_data = data['Acquisition_instrument'][inst]
-        except Exception:
-            pass
+        self.inst_data = get_val(self.meta, ('Acquisition_instrument',
+                                             self.inst))
+        if self.inst_data is not None:
+            source = self.inst_data
+            dest = self.em
+            mapping = [
+                MappingElements(
+                    source_dict=source, source_path='acquisition_mode',
+                    dest_dict=dest, dest_path=('General_EM',
+                                               'acquisition_mode'),
+                    cast_fn=str, units=None, conv_fn=None, override=False),
+                MappingElements(
+                    source_dict=source, source_path='beam_current',
+                    dest_dict=dest, dest_path=('General_EM', 'beam_current'),
+                    cast_fn=float, units='NanoA', conv_fn=None, override=False),
+                MappingElements(
+                    source_dict=source, source_path='beam_energy',
+                    dest_dict=dest, dest_path=('General_EM', 'beam_energy'),
+                    cast_fn=float, units='KiloEV', conv_fn=None,
+                    override=False),
+                MappingElements(
+                    source_dict=source, source_path='convergence_angle',
+                    dest_dict=dest, dest_path=('General_EM',
+                                               'convergence_angle'),
+                    cast_fn=float, units='MilliRAD', conv_fn=None,
+                    override=False),
+                MappingElements(
+                    source_dict=source, source_path='magnification',
+                    dest_dict=dest, dest_path=('General_EM',
+                                               'magnification_indicated'),
+                    cast_fn=float, units='UNITLESS', conv_fn=None,
+                    override=False),
+                MappingElements(
+                    source_dict=source, source_path='microscope',
+                    dest_dict=dest, dest_path=('General_EM', 'microscope_name'),
+                    cast_fn=str, units=None, conv_fn=None, override=False),
+                MappingElements(
+                    source_dict=source, source_path='probe_area',
+                    dest_dict=dest, dest_path=('General_EM', 'probe_area'),
+                    cast_fn=float, units='NanoM2', conv_fn=None,
+                    override=False),
+
+                # stage positions
+                MappingElements(
+                    source_dict=source,
+                    source_path=('Stage', 'rotation'),
+                    dest_dict=dest,
+                    dest_path=('General_EM', 'stage_position', 'rotation'),
+                    cast_fn=float, units='DEG', conv_fn=None, override=False),
+                MappingElements(
+                    source_dict=source,
+                    source_path=('Stage', 'tilt_alpha'),
+                    dest_dict=dest,
+                    dest_path=('General_EM', 'stage_position', 'tilt_alpha'),
+                    cast_fn=float, units='DEG', conv_fn=None, override=False),
+                MappingElements(
+                    source_dict=source,
+                    source_path=('Stage', 'tilt_beta'),
+                    dest_dict=dest,
+                    dest_path=('General_EM', 'stage_position', 'tilt_beta'),
+                    cast_fn=float, units='DEG', conv_fn=None, override=False),
+                MappingElements(
+                    source_dict=source,
+                    dest_dict=dest,
+                    source_path=('Stage', 'x'),
+                    dest_path=('General_EM', 'stage_position', 'x'),
+                    cast_fn=float, units='MilliM', conv_fn=None,
+                    override=False),
+                MappingElements(
+                    source_dict=source,
+                    source_path=('Stage', 'y'),
+                    dest_dict=dest,
+                    dest_path=('General_EM', 'stage_position', 'y'),
+                    cast_fn=float, units='MilliM', conv_fn=None,
+                    override=False),
+                MappingElements(
+                    source_dict=source,
+                    source_path=('Stage', 'z'),
+                    dest_dict=dest,
+                    dest_path=('General_EM', 'stage_position', 'z'),
+                    cast_fn=float, units='MilliM', conv_fn=None,
+                    override=False),
+
+                # camera length/working distance
+                MappingElements(
+                    source_dict=source, source_path='camera_length',
+                    dest_dict=dest, dest_path=('TEM', 'camera_length'),
+                    cast_fn=float, units='MilliM', conv_fn=None,
+                    override=False),
+                MappingElements(
+                    source_dict=source, source_path='working_distance',
+                    dest_dict=dest, dest_path=('SEM', 'working_distance'),
+                    cast_fn=float, units='MilliM', conv_fn=None,
+                    override=False)]
+
+            map_dict_values(mapping)
+
+            self._process_hs_detectors()
+
+        source = self.meta
+        dest = self.em
+        mapping = [
+            # Elements present (if known)
+            MappingElements(
+                source_dict=source, dest_dict=dest,
+                source_path=('Sample', 'elements'),
+                dest_path=('General_EM', 'elements'),
+                cast_fn=list, units=None, conv_fn=None, override=False),
+            # General metadata
+            MappingElements(
+                source_dict=source, dest_dict=dest,
+                source_path=('General', 'date'),
+                dest_path=('General', 'date'),
+                cast_fn=str, units=None, conv_fn=None, override=False),
+            MappingElements(
+                source_dict=source, dest_dict=dest,
+                source_path=('General', 'doi'),
+                dest_path=('General', 'doi'),
+                cast_fn=str, units=None, conv_fn=None, override=False),
+            MappingElements(
+                source_dict=source, dest_dict=dest,
+                source_path=('General', 'original_filename'),
+                dest_path=('General', 'original_filename'),
+                cast_fn=str, units=None, conv_fn=None, override=False),
+            MappingElements(
+                source_dict=source, dest_dict=dest,
+                source_path=('General', 'notes'),
+                dest_path=('General', 'notes'),
+                cast_fn=str, units=None, conv_fn=None, override=False),
+            MappingElements(
+                source_dict=source, dest_dict=dest,
+                source_path=('General', 'time'),
+                dest_path=('General', 'time'),
+                cast_fn=str, units=None, conv_fn=None, override=False),
+            MappingElements(
+                source_dict=source, dest_dict=dest,
+                source_path=('General', 'time_zone'),
+                dest_path=('General', 'time_zone'),
+                cast_fn=str, units=None, conv_fn=None, override=False),
+            MappingElements(
+                source_dict=source, dest_dict=dest,
+                source_path=('General', 'title'),
+                dest_path=('General', 'title'),
+                cast_fn=str, units=None, conv_fn=None, override=False)]
+
+        map_dict_values(mapping)
+        self._process_hs_axes()
+
+    def _process_hs_axes(self) -> None:
+        """Parses the HyperSpy signal axis calibrations into a format that can
+        be stored with the metadata. Make sure to remove "Undefined" traits
+        from any axis values, since that value cannot be serialized to JSON
+        """
+        axes = self.hs_data.axes_manager.as_dictionary()
+
+        for k, v in axes.items():
+            # remove some non-relevant values
+            for to_remove in ['_type', 'navigate', 'is_binned']:
+                if to_remove in v:
+                    del axes[k][to_remove]
+
+            # remove potentially unserializable values from axes:
+            for key in v:
+                if v[key] is Undefined:
+                    v[key] = None
+
+            # attempt to standardize units according to QUDT:
+            if 'units' in v:
+                axes[k]['units'] = standardize_unit(axes[k]['units'])
+
+        self.em['General']['axis_calibration'] = axes
+        self.em['General']['data_dimensions'] = \
+            [v['size'] for v in
+             self.hs_data.axes_manager.as_dictionary().values()]
+
+    def _process_hs_detectors(self) -> None:
+        """Parses HyperSpy-formatted metadata specific to detectors as
+        specified by http://hyperspy.org/hyperspy-doc/current/user_guide
+        /metadata_structure.html
+        """
+        detector_node = get_val(self.inst_data, 'Detector')
+        dest_dict = self.em
+        mapping = [
+            MappingElements(
+                source_dict=self.inst_data, source_path='detector_type',
+                dest_dict=dest_dict, dest_path=('General_EM', 'detector_name'),
+                cast_fn=str, units=None, conv_fn=None, override=False
+            )
+        ]
+
+        if detector_node is not None:
+            mapping += [
+                # EDS
+                MappingElements(
+                    source_dict=detector_node,
+                    source_path=('EDS', 'azimuth_angle'),
+                    dest_dict=dest_dict, dest_path=('EDS', 'azimuth_angle'),
+                    cast_fn=float, units='DEG', conv_fn=None, override=False),
+                MappingElements(
+                    source_dict=detector_node,
+                    source_path=('EDS', 'elevation_angle'),
+                    dest_dict=dest_dict, dest_path=('EDS', 'elevation_angle'),
+                    cast_fn=float, units='DEG', conv_fn=None, override=False),
+                MappingElements(
+                    source_dict=detector_node,
+                    source_path=('EDS', 'energy_resolution_MnKa'),
+                    dest_dict=dest_dict,
+                    dest_path=('EDS', 'energy_resolution_MnKa'),
+                    cast_fn=float, units='EV', conv_fn=None, override=False),
+                MappingElements(
+                    source_dict=detector_node, source_path=('EDS', 'live_time'),
+                    dest_dict=dest_dict, dest_path=('EDS', 'live_time'),
+                    cast_fn=float, units='SEC', conv_fn=None, override=False),
+                MappingElements(
+                    source_dict=detector_node, source_path=('EDS', 'real_time'),
+                    dest_dict=dest_dict, dest_path=('EDS', 'real_time'),
+                    cast_fn=float, units='SEC', conv_fn=None, override=False),
+
+                # EELS
+                MappingElements(
+                    source_dict=detector_node,
+                    source_path=('EELS', 'aperture_size'),
+                    dest_dict=dest_dict, dest_path=('EELS', 'aperture_size'),
+                    cast_fn=float, units='MilliM', conv_fn=None,
+                    override=False),
+                MappingElements(
+                    source_dict=detector_node,
+                    source_path=('EELS', 'collection_angle'),
+                    dest_dict=dest_dict, dest_path=('EELS', 'collection_angle'),
+                    cast_fn=float, units='MilliRAD', conv_fn=None,
+                    override=False),
+                MappingElements(
+                    source_dict=detector_node,
+                    source_path=('EELS', 'dwell_time'),
+                    dest_dict=dest_dict, dest_path=('General_EM', 'dwell_time'),
+                    cast_fn=float, units='SEC', conv_fn=None, override=False),
+                MappingElements(
+                    source_dict=detector_node,
+                    source_path=('EELS', 'exposure'),
+                    dest_dict=dest_dict,
+                    dest_path=('General_EM', 'exposure_time'),
+                    cast_fn=float, units='SEC', conv_fn=None, override=False),
+                MappingElements(
+                    source_dict=detector_node,
+                    source_path=('EELS', 'frame_number'),
+                    dest_dict=dest_dict,
+                    dest_path=('EELS', 'number_of_samples'),
+                    cast_fn=int, units='NUM', conv_fn=None, override=False),
+                MappingElements(
+                    source_dict=detector_node,
+                    source_path=('EELS', 'spectrometer'),
+                    dest_dict=dest_dict,
+                    dest_path=('EELS', 'spectrometer_name'),
+                    cast_fn=str, units=None, conv_fn=None, override=False),
+            ]
+        map_dict_values(mapping)
+
+    def _dm3_general_info(self) -> None:
+        """Parse commonly-found TEM-related tags in DigitalMicrograph files"""
+        # process "Microscope Info"
+        base = self.__get_dm3_tag_pre_path() + ('Microscope Info',)
+        dest_dict = self.em
+        mapping = [
+            MappingElements(
+                source_dict=self.raw_meta,
+                source_path=base + ('Indicated Magnification',),
+                dest_dict=dest_dict,
+                dest_path=('General_EM', 'magnification_indicated'),
+                cast_fn=float, units='UNITLESS', conv_fn=None, override=False),
+            MappingElements(
+                source_dict=self.raw_meta,
+                source_path=base + ('Actual Magnification',),
+                dest_dict=dest_dict,
+                dest_path=('General_EM', 'magnification_actual'),
+                cast_fn=float, units='UNITLESS', conv_fn=None, override=False),
+            MappingElements(
+                source_dict=self.raw_meta,
+                source_path=base + ('Cs(mm)',),
+                dest_dict=dest_dict,
+                dest_path=('TEM', 'spherical_aberration_coefficient'),
+                cast_fn=float, units='MilliM', conv_fn=None, override=False),
+            MappingElements(
+                source_dict=self.raw_meta,
+                source_path=base + ('STEM Camera Length',),
+                dest_dict=dest_dict,
+                dest_path=('TEM', 'camera_length'),
+                cast_fn=float, units='MilliM', conv_fn=None, override=False),
+            MappingElements(
+                source_dict=self.raw_meta,
+                source_path=base + ('Operation Mode',),
+                dest_dict=dest_dict, dest_path=('TEM', 'operation_mode'),
+                cast_fn=str, units=None, conv_fn=None, override=False),
+            MappingElements(
+                source_dict=self.raw_meta,
+                source_path=base + ('Imaging Mode',),
+                dest_dict=dest_dict, dest_path=('TEM', 'imaging_mode'),
+                cast_fn=str, units=None, conv_fn=None, override=False),
+            MappingElements(
+                source_dict=self.raw_meta,
+                source_path=base + ('Illumination Mode',),
+                dest_dict=dest_dict, dest_path=('TEM', 'illumination_mode'),
+                cast_fn=str, units=None, conv_fn=None, override=False),
+            MappingElements(
+                source_dict=self.raw_meta,
+                source_path=base + ('Microscope',),
+                dest_dict=dest_dict,
+                dest_path=('General_EM', 'microscope_name'),
+                cast_fn=str, units=None, conv_fn=None, override=False),
+            MappingElements(
+                source_dict=self.raw_meta,
+                source_path=base + ('Stage Position', 'Stage X'),
+                dest_dict=dest_dict,
+                dest_path=('General_EM', 'stage_position', 'x'),
+                cast_fn=float, units='MilliM', conv_fn=lambda x: x/1000,
+                override=False),
+            MappingElements(
+                source_dict=self.raw_meta,
+                source_path=base + ('Stage Position', 'Stage Y'),
+                dest_dict=dest_dict,
+                dest_path=('General_EM', 'stage_position', 'y'),
+                cast_fn=float, units='MilliM', conv_fn=lambda x: x / 1000,
+                override=False),
+            MappingElements(
+                source_dict=self.raw_meta,
+                source_path=base + ('Stage Position', 'Stage Z'),
+                dest_dict=dest_dict,
+                dest_path=('General_EM', 'stage_position', 'z'),
+                cast_fn=float, units='MilliM', conv_fn=lambda x: x / 1000,
+                override=False),
+            MappingElements(
+                source_dict=self.raw_meta,
+                source_path=base + ('Stage Position', 'Stage Alpha'),
+                dest_dict=dest_dict,
+                dest_path=('General_EM', 'stage_position', 'tilt_alpha'),
+                cast_fn=float, units='DEG', conv_fn=None, override=False),
+            MappingElements(
+                source_dict=self.raw_meta,
+                source_path=base + ('Stage Position', 'Stage Beta'),
+                dest_dict=dest_dict,
+                dest_path=('General_EM', 'stage_position', 'tilt_beta'),
+                cast_fn=float, units='DEG', conv_fn=None, override=False),
+            MappingElements(
+                source_dict=self.raw_meta,
+                source_path=base + ('Emission Current (µA)',),
+                dest_dict=dest_dict,
+                dest_path=('General_EM', 'emission_current'),
+                cast_fn=float, units='MicroA', conv_fn=None, override=False),
+        ]
+
+        voltage = get_val(self.raw_meta, base + ('Voltage',), float)
+        if voltage is not None:
+            mapping += [
+                MappingElements(
+                    source_dict=self.raw_meta, dest_dict=dest_dict,
+                    source_path=base + ('Voltage',), cast_fn=float,
+                    dest_path=('General_EM', 'accelerating_voltage'),
+                    units='KiloV' if voltage >= 1000 else 'V',
+                    conv_fn=lambda x: x / 1000 if voltage >= 1000 else x,
+                    override=False)
+            ]
+
+        # "Session Info"
+        base = self.__get_dm3_tag_pre_path() + ('Session Info',)
+        mapping += [
+            MappingElements(
+                source_dict=self.raw_meta, source_path=base + ('Detector',),
+                dest_dict=dest_dict, dest_path=('General_EM', 'detector_name'),
+                cast_fn=str, units=None, conv_fn=None, override=False),
+            MappingElements(
+                source_dict=self.raw_meta, source_path=base + ('Microscope',),
+                dest_dict=dest_dict,
+                dest_path=('General_EM', 'microscope_name'),
+                cast_fn=str, units=None, conv_fn=None, override=False)]
+
+        # "Meta Data"
+        base = self.__get_dm3_tag_pre_path() + ('Meta Data',)
+        mapping += [
+            MappingElements(
+                source_dict=self.raw_meta,
+                source_path=base + ('Acquisition Mode',),
+                dest_dict=dest_dict, dest_path=('TEM', 'acquisition_mode'),
+                cast_fn=str, units=None, conv_fn=None, override=False),
+            MappingElements(
+                source_dict=self.raw_meta,
+                source_path=base + ('Format',),
+                dest_dict=dest_dict, dest_path=('TEM', 'acquisition_format'),
+                cast_fn=str, units=None, conv_fn=None, override=False),
+            MappingElements(
+                source_dict=self.raw_meta,
+                source_path=base + ('Signal',),
+                dest_dict=dest_dict, dest_path=('TEM', 'acquisition_signal'),
+                cast_fn=str, units=None, conv_fn=None, override=False),
+            # sometimes the EDS signal label is in a different place
+            MappingElements(
+                source_dict=self.raw_meta,
+                source_path=base + ('Experiment keywords', 'TagGroup1',
+                                    'Label'),
+                dest_dict=dest_dict, dest_path=('TEM', 'acquisition_signal'),
+                cast_fn=str, units=None, conv_fn=None, override=False)
+        ]
+
+        # a few miscellaneous DM tags:
+        base = self.__get_dm3_tag_pre_path()
+        mapping += [
+            MappingElements(
+                source_dict=self.raw_meta,
+                source_path=base + ('Acquisition', 'Device', 'Name'),
+                dest_dict=dest_dict, dest_path=('TEM', 'acquisition_device'),
+                cast_fn=str, units=None, conv_fn=None, override=False),
+            MappingElements(
+                source_dict=self.raw_meta,
+                source_path=base + ('DataBar', 'Device Name'),
+                dest_dict=dest_dict, dest_path=('TEM', 'acquisition_device'),
+                cast_fn=str, units=None, conv_fn=None, override=False),
+            MappingElements(
+                source_dict=self.raw_meta,
+                source_path=base + ('Acquisition', 'Parameters', 'High Level',
+                                    'Exposure (s)'),
+                dest_dict=dest_dict, dest_path=('General_EM', 'exposure_time'),
+                cast_fn=float, units='SEC', conv_fn=None, override=False),
+            MappingElements(
+                source_dict=self.raw_meta,
+                source_path=base + ('DataBar', 'Exposure Time (s)'),
+                dest_dict=dest_dict, dest_path=('General_EM', 'exposure_time'),
+                cast_fn=float, units='SEC', conv_fn=None, override=False),
+            MappingElements(
+                source_dict=self.raw_meta,
+                source_path=base + ('GMS Version', 'Created'),
+                dest_dict=dest_dict,
+                dest_path=('General_EM', 'acquisition_software_version'),
+                cast_fn=str, units=None, conv_fn=None, override=False)
+        ]
+
+        if get_val(self.raw_meta, ('ImageList', 'TagGroup0', 'ImageTags')) is\
+                not None:
+            # we have DigitalMicrograph tags, so set acquisition software name
+            set_val_units(nest_dict=dest_dict,
+                          path=('General_EM', 'acquisition_software_name'),
+                          value='DigitalMicrograph')
+
+        map_dict_values(mapping)
+
+    def __get_dm3_tag_pre_path(self) -> Tuple:
+        """Get the path into a dictionary where the important DigitalMicrograph
+        metadata is expected to be found. If the .dm3/.dm4 file contains a stack
+        of images, the metadata to extract is instead under a `plane info`
+        tag, so this method will determine if the stack metadata is present
+        and return the correct path. ``pre_path`` will be something
+        like ``('ImageList', 'TagGroup0', 'ImageTags', 'plane info',
+        'TagGroup0', 'source tags')``.
+
+        Returns:
+            A tuple containing the subsequent keys that need to be traversed
+            to get to the point in the ``raw_metadata`` where the important
+            metadata is stored
+        """
+        # test if we have a stack
+        stack_path = ('ImageList', 'TagGroup0', 'ImageTags', 'plane info')
+        stack_val = get_val(self.raw_meta, stack_path)
+        if stack_val is not None:
+            # we're in a stack
+            pre_path = ('ImageList', 'TagGroup0', 'ImageTags', 'plane info',
+                        'TagGroup0', 'source tags')
+        else:
+            pre_path = ('ImageList', 'TagGroup0', 'ImageTags')
+
+        return pre_path
+
+    def _dm3_eels_info(self) -> None:
+        """Parse EELS-related information from Gatan DigitalMicrograph format
+        """
+        # basic EELS metadata
+        pre_path = self.__get_dm3_tag_pre_path()
+        base = pre_path + ('EELS', )
+        mapping = [
+            MappingElements(
+                source_dict=self.raw_meta, dest_dict=self.em,
+                source_path=base + ('Acquisition', 'Exposure (s)'),
+                dest_path=('General_EM', 'exposure_time'), units='SEC',
+                conv_fn=None, cast_fn=float, override=False),
+            MappingElements(
+                source_dict=self.raw_meta, dest_dict=self.em,
+                source_path=base + ('Acquisition', 'Integration time (s)'),
+                dest_path=('EELS', 'integration_time'), units='SEC',
+                conv_fn=None, cast_fn=float, override=False),
+            MappingElements(
+                source_dict=self.raw_meta, dest_dict=self.em,
+                source_path=base + ('Acquisition', 'Number of frames'),
+                dest_path=('EELS', 'number_of_samples'), units='NUM',
+                conv_fn=None, cast_fn=int, override=False),
+            MappingElements(
+                source_dict=self.raw_meta, dest_dict=self.em,
+                source_path=base + ('Experimental Conditions',
+                                    'Collection semi-angle (mrad)'),
+                dest_path=('EELS', 'collection_angle'), units='MilliRAD',
+                conv_fn=None, cast_fn=float, override=False),
+            MappingElements(
+                source_dict=self.raw_meta, dest_dict=self.em,
+                source_path=base + ('Experimental Conditions',
+                                    'Convergence semi-angle (mrad)'),
+                dest_path=('General_EM', 'convergence_angle'), units='MilliRAD',
+                conv_fn=None, cast_fn=float, override=False)]
+
+        # spectrometer metadata
+        # is usually at one of two places, so try both
+        spect_dict = get_val(self.raw_meta,
+                             pre_path + ('EELS', 'Acquisition', 'Spectrometer'))
+        if spect_dict is not None:
+            spect_path = pre_path + ('EELS', 'Acquisition', 'Spectrometer')
         else:
-            try:
-                em['beam_energy'] = float(inst_data['beam_energy'])
-            except Exception:
-                pass
-            try:
-                em['magnification'] = float(inst_data['magnification'])
-            except Exception:
-                pass
-            try:
-                em['acquisition_mode'] = str(inst_data['acquisition_mode'])
-            except Exception:
-                pass
-            try:
-                detector = inst_data['Detector']
-            except Exception:
-                pass
+            spect_path = pre_path + ('EELS Spectrometer',)
+        mapping += [
+            MappingElements(
+                source_dict=self.raw_meta, dest_dict=self.em,
+                source_path=spect_path + ('Aperture label',),
+                dest_path=('EELS', 'aperture_size'), units='MilliM',
+                conv_fn=None,
+                cast_fn=lambda s: float(s.replace('mm', '')),
+                override=False),
+            MappingElements(
+                source_dict=self.raw_meta, dest_dict=self.em,
+                source_path=spect_path + ('Dispersion (eV/ch)',),
+                dest_path=('EELS', 'dispersion_per_channel'), units='EV',
+                conv_fn=None, cast_fn=float, override=False),
+            MappingElements(
+                source_dict=self.raw_meta, dest_dict=self.em,
+                source_path=spect_path + ('Energy loss (eV)',),
+                dest_path=('EELS', 'energy_loss_offset'), units='EV',
+                conv_fn=None, cast_fn=float, override=False),
+            MappingElements(
+                source_dict=self.raw_meta, dest_dict=self.em,
+                source_path=spect_path + ('Instrument name',),
+                dest_path=('EELS', 'spectrometer_name'), units=None,
+                conv_fn=None, cast_fn=str, override=False),
+            MappingElements(
+                source_dict=self.raw_meta, dest_dict=self.em,
+                source_path=spect_path + ('Drift tube voltage (V)',),
+                dest_path=('EELS', 'drift_tube_voltage'), units='V',
+                conv_fn=None, cast_fn=float, override=False),
+            MappingElements(
+                source_dict=self.raw_meta, dest_dict=self.em,
+                source_path=spect_path + ('Drift tube enabled',),
+                dest_path=('EELS', 'drift_tube_enabled'), units=None,
+                conv_fn=None, cast_fn=bool, override=False),
+            MappingElements(
+                source_dict=self.raw_meta, dest_dict=self.em,
+                source_path=spect_path + ('Prism offset (V)',),
+                dest_path=('EELS', 'prism_shift_voltage'), units='V',
+                conv_fn=None, cast_fn=float, override=False),
+            # note space at end of "Prism offset enabled " because that's how
+            # it gets loaded in from DigitalMicrograph...
+            MappingElements(
+                source_dict=self.raw_meta, dest_dict=self.em,
+                source_path=spect_path + ('Prism offset enabled ',),
+                dest_path=('EELS', 'prism_shift_enabled'), units=None,
+                conv_fn=None, cast_fn=bool, override=False),
+            MappingElements(
+                source_dict=self.raw_meta, dest_dict=self.em,
+                source_path=spect_path + ('Slit width (eV)',),
+                dest_path=('EELS', 'filter_slit_width'), units='EV',
+                conv_fn=None, cast_fn=float, override=False),
+            MappingElements(
+                source_dict=self.raw_meta, dest_dict=self.em,
+                source_path=spect_path + ('Slit inserted',),
+                dest_path=('EELS', 'filter_slit_inserted'), units=None,
+                conv_fn=None, cast_fn=bool, override=False),
+        ]
+        map_dict_values(mapping)
+
+    def _dm3_eds_info(self) -> None:
+        """Parse EDS-related information from Gatan DigitalMicrograph format"""
+        pre_path = self.__get_dm3_tag_pre_path()
+        base = pre_path + ('EDS',)
+        mapping = [
+            MappingElements(
+                source_dict=self.raw_meta, dest_dict=self.em,
+                source_path=base + ('Detector Info', 'Azimuthal angle'),
+                dest_path=('EDS', 'azimuth_angle'), units='DEG',
+                conv_fn=None, cast_fn=float, override=False),
+            MappingElements(
+                source_dict=self.raw_meta, dest_dict=self.em,
+                source_path=base + ('Detector Info', 'Detector type'),
+                dest_path=('EDS', 'detector_type'), units=None,
+                conv_fn=None, cast_fn=str, override=False),
+            MappingElements(
+                source_dict=self.raw_meta, dest_dict=self.em,
+                source_path=base + ('Acquisition', 'Dispersion (eV)'),
+                dest_path=('EDS', 'dispersion_per_channel'), units='EV',
+                conv_fn=None, cast_fn=float, override=False),
+            MappingElements(
+                source_dict=self.raw_meta, dest_dict=self.em,
+                source_path=base + ('Detector Info', 'Elevation angle'),
+                dest_path=('EDS', 'elevation_angle'), units='DEG',
+                conv_fn=None, cast_fn=float, override=False),
+            MappingElements(
+                source_dict=self.raw_meta, dest_dict=self.em,
+                source_path=base + ('Detector Info', 'Incidence angle'),
+                dest_path=('EDS', 'incidence_angle'), units='DEG',
+                conv_fn=None, cast_fn=float, override=False),
+            MappingElements(
+                source_dict=self.raw_meta, dest_dict=self.em,
+                source_path=base + ('Live time',),
+                dest_path=('EDS', 'live_time'), units='SEC',
+                conv_fn=None, cast_fn=float, override=False),
+            MappingElements(
+                source_dict=self.raw_meta, dest_dict=self.em,
+                source_path=base + ('Real time',),
+                dest_path=('EDS', 'real_time'), units='SEC',
+                conv_fn=None, cast_fn=float, override=False),
+            MappingElements(
+                source_dict=self.raw_meta, dest_dict=self.em,
+                source_path=base + ('Detector Info', 'Solid angle'),
+                dest_path=('EDS', 'solid_angle'), units='SR',
+                conv_fn=None, cast_fn=float, override=False),
+            MappingElements(
+                source_dict=self.raw_meta, dest_dict=self.em,
+                source_path=base + ('Detector Info', 'Stage tilt'),
+                dest_path=('EDS', 'stage_tilt'), units='DEG',
+                conv_fn=None, cast_fn=float, override=False)
+        ]
+
+        map_dict_values(mapping)
+
+    def _dm3_tecnai_info(self, delimiter: Optional[str] = u'\u2028') -> None:
+        """Some FEI Microscopes will write additional metadata into dm3 files
+        in a long string separated by a unicode delimiter (u'\u2028'),
+        present at ``ImageList.TagGroup0.ImageTags.Tecnai.Microscope_Info``.
+        This method parses that information.  Adapted from the
+        implementation in https://github.com/usnistgov/NexusLIMS
+
+        args:
+            delimiter: The value (a unicode string) used to split the
+                ``microscope_info`` string. Should not need to be provided (
+                this value is hard-coded in DigitalMicrograph), but specified
+                as a parameter for future flexibility
+        """
+        def __find_val(s_to_find, list_to_search):
+            """Return the first value in ``list_to_search`` that contains
+            ``s_to_find``, or ``None`` if it is not found
+
+            Note: If needed, this could be improved to use regex instead,
+            which would provide more control over the patterns to return
+            """
+            res = [x for x in list_to_search if s_to_find in x]
+            if len(res) > 0:
+                res = res[0]
+                # remove the string we searched for from the beginning of
+                # the res
+                return re.sub("^" + s_to_find, "", res)
             else:
-                em['detector'] = str(next(iter(detector)))
-
-        # Non-HS data (not pulled into standard HS metadata)
-        # Pull out common dicts
-        try:
-            micro_info = raw_data["ImageList"]["TagGroup0"]["ImageTags"]["Microscope Info"]
-        except Exception:
-            micro_info = {}
-        try:
-            exp_desc = raw_data["ObjectInfo"]["ExperimentalDescription"]
-        except Exception:
-            exp_desc = {}
-
-        # emission_current
-        try:
-            em["emission_current"] = float(micro_info["Emission Current (µA)"])
-        except Exception:
-            try:
-                em["emission_current"] = float(exp_desc["Emission_uA"])
-            except Exception:
-                pass
-        # operation_mode
-        try:
-            em["operation_mode"] = str(micro_info["Operation Mode"])
-        except Exception:
-            pass
-        # microscope
-        try:
-            em["microscope"] = str(raw_data["ImageList"]["TagGroup0"]["ImageTags"]
-                                           ["Session Info"]["Microscope"])
-        except Exception:
-            try:
-                em["microscope"] = str(micro_info["Name"])
-            except Exception:
-                pass
-        # spot_size
-        try:
-            em["spot_size"] = int(exp_desc["Spot size"])
-        except Exception:
-            pass
-
-        # Image metadata
-        try:
-            shape = []
-            base_shape = [int(dim) for dim in raw_data["ImageList"]["TagGroup0"]
-                                                      ["ImageData"]["Dimensions"].values()]
-            # Reverse X and Y order to match MDF schema (y, x, z, ..., channels)
-            if len(base_shape) >= 2:
-                shape.append(base_shape[1])
-                shape.append(base_shape[0])
-                shape.extend(base_shape[2:])
-            # If 1 dimension, don't need to swap
-            elif len(base_shape) > 0:
-                shape = base_shape
-
-            if shape:
-                image["shape"] = shape
-        except Exception as e:
-            print(e)
-            pass
+                return None
 
-        # Remove None/empty values
-        for key, val in list(em.items()):
-            if val is None or val == [] or val == {}:
-                em.pop(key)
+        def __extract_val(regex: str, str_to_search: str,
+                          match_num : int = 1) -> Optional[str]:
+            """Extract a value from a string based on a grouped regex
+            """
+            result = re.compile(regex).search(str_to_search)
+            if result is not None:
+                result = result[match_num]
+            return result
 
-        record = {}
-        if em:
-            record["electron_microscopy"] = em
-        if image:
-            record["image"] = image
+        path_to_tecnai = ('ImageList', 'TagGroup0', 'ImageTags', 'Tecnai',
+                          'Microscope Info')
+        self.tecnai_info = get_val(self.raw_meta, path_to_tecnai)
 
-        return record
+        if self.tecnai_info is None:
+            # if tecnai info is not present, return early to save some work
+            return
+        else:
+            # split the tecnai_info string into a list
+            self.tecnai_info = self.tecnai_info.split(delimiter)
+
+            # we override existing values since Tecnai info is more specific
+            mapping = [
+                MappingElements(
+                    source_dict={
+                        'Microscope_Name': __find_val('Microscope ',
+                                                      self.tecnai_info)},
+                    source_path='Microscope_Name', dest_dict=self.em,
+                    dest_path=('General_EM', 'microscope_name'), cast_fn=str,
+                    units=None, conv_fn=None, override=True),
+                MappingElements(
+                    source_dict={
+                        'Extractor_Voltage':
+                            __extract_val(r'Extr volt (\d*) V',
+                                          __find_val('Extr volt ',
+                                                     self.tecnai_info))},
+                    source_path='Extractor_Voltage', dest_dict=self.em,
+                    dest_path=('TEM', 'extractor_voltage'), cast_fn=int,
+                    units='V', conv_fn=None, override=True),
+                MappingElements(
+                    source_dict={
+                        'Emission_Current':
+                            __extract_val(r'Emission ([\d|\.]*)uA',
+                                          __find_val('Emission ',
+                                                     self.tecnai_info))},
+                    source_path='Emission_Current', dest_dict=self.em,
+                    dest_path=('General_EM', 'emission_current'), cast_fn=float,
+                    units='MicroA', conv_fn=None, override=True),
+                MappingElements(
+                    source_dict={
+                        'Operation_Mode':
+                            __extract_val(r'(.*) Defocus',
+                                          __find_val('Mode ',
+                                                     self.tecnai_info))},
+                    source_path='Operation_Mode', dest_dict=self.em,
+                    dest_path=('TEM', 'operation_mode'), cast_fn=str,
+                    units=None, conv_fn=None, override=True),
+
+                # try two different extractions of defocus for mag mode and
+                # diffraction mode:
+                MappingElements(
+                    source_dict={
+                        'Defocus':
+                            __extract_val(r'Defocus \(um\) (.*) Magn',
+                                          __find_val('Mode ',
+                                                     self.tecnai_info))},
+                    source_path='Defocus', dest_dict=self.em,
+                    dest_path=('TEM', 'defocus'), cast_fn=float,
+                    units='MicroM', conv_fn=None, override=True),
+                MappingElements(
+                    source_dict={
+                        'Defocus':
+                            __extract_val(r'Defocus ([\d|\.]*) CL',
+                                          __find_val('Mode ',
+                                                     self.tecnai_info))},
+                    source_path='Defocus', dest_dict=self.em,
+                    dest_path=('TEM', 'defocus'), cast_fn=float,
+                    units='MicroM', conv_fn=None, override=True),
+                # try magnification (not always present):
+                MappingElements(
+                    source_dict={
+                        'Magnification':
+                            __extract_val(r'Magn (\d*)x',
+                                          __find_val('Mode ',
+                                                     self.tecnai_info))},
+                    source_path='Magnification', dest_dict=self.em,
+                    dest_path=('General_EM', 'magnification_indicated'),
+                    cast_fn=int, units='UNITLESS', conv_fn=None,
+                    override=True),
+                MappingElements(
+                    source_dict={
+                        'Camera_Length':
+                            __extract_val(r'CL (.*)m',
+                                          __find_val('Mode ',
+                                                     self.tecnai_info))},
+                    source_path='Camera_Length', dest_dict=self.em,
+                    dest_path=('TEM', 'camera_length'), cast_fn=float,
+                    units='MilliM', conv_fn=lambda x: x*1000, override=True),
+                # spot size
+                MappingElements(
+                    source_dict={'Spot_Size':
+                                     __find_val('Spot ', self.tecnai_info)},
+                    source_path='Spot_Size', dest_dict=self.em,
+                    dest_path=('TEM', 'spot_size'), cast_fn=int,
+                    units='UNITLESS', conv_fn=None, override=True),
+                # Tecnai has info about apertures and lens strengths,
+                # but not extracting here (see NexusLIMS code for example)
+            ]
+            stage_vals = __find_val('Stage', self.tecnai_info)
+            if stage_vals:
+                x, y, z = re.findall(r' (-?\d*\.\d*) um', stage_vals)
+                alpha, beta = re.findall(r' (-?\d*\.\d*) deg', stage_vals)
+                stage = {'x': x, 'y': y, 'z': z, 'a': alpha, 'b': beta}
+                mapping += [
+                    MappingElements(
+                        source_dict=stage, source_path='x', dest_dict=self.em,
+                        dest_path=('General_EM', 'stage_position', 'x'),
+                        cast_fn=float, units='MicroM', conv_fn=None,
+                        override=True),
+                    MappingElements(
+                        source_dict=stage, source_path='y', dest_dict=self.em,
+                        dest_path=('General_EM', 'stage_position', 'y'),
+                        cast_fn=float, units='MicroM', conv_fn=None,
+                        override=True),
+                    MappingElements(
+                        source_dict=stage, source_path='z', dest_dict=self.em,
+                        dest_path=('General_EM', 'stage_position', 'z'),
+                        cast_fn=float, units='MicroM', conv_fn=None,
+                        override=True),
+                    MappingElements(
+                        source_dict=stage, source_path='a', dest_dict=self.em,
+                        dest_path=('General_EM', 'stage_position',
+                                   'tilt_alpha'), cast_fn=float, units='DEG',
+                        conv_fn=None, override=True),
+                    MappingElements(
+                        source_dict=stage, source_path='b', dest_dict=self.em,
+                        dest_path=('General_EM', 'stage_position', 'tilt_beta'),
+                        cast_fn=float, units='DEG', conv_fn=None,
+                        override=True),
+                ]
+
+            # process EELS spectrometer info from Tecnai string
+            if __find_val('Filter related settings', self.tecnai_info):
+                filter_dict = {
+                    'Mode': __find_val('Mode: ', self.tecnai_info),
+                    'Dispersion': __extract_val(
+                        r'(.*)\[eV/Channel\]',
+                        __find_val('Selected dispersion: ', self.tecnai_info)),
+                    'Aperture': __extract_val(
+                        r'(\d*)mm', __find_val('Selected aperture: ',
+                                               self.tecnai_info)),
+                    'Prism': __extract_val(
+                        r'(.*)\[eV\]',
+                        __find_val('Prism shift: ', self.tecnai_info)),
+                    'Drift': __extract_val(
+                        r'(.*)\[eV\]',
+                        __find_val('Drift tube: ', self.tecnai_info)),
+                    'TotalLoss': __extract_val(
+                        r'(.*)\[eV\]',
+                        __find_val('Total energy loss: ', self.tecnai_info))
+                }
+                mapping += [
+                    MappingElements(
+                        source_dict=filter_dict, source_path='Mode',
+                        dest_dict=self.em,
+                        dest_path=('EELS', 'spectrometer_mode'),
+                        cast_fn=str, units=None, conv_fn=None, override=True),
+                    MappingElements(
+                        source_dict=filter_dict, source_path='Dispersion',
+                        dest_dict=self.em,
+                        dest_path=('EELS', 'dispersion_per_channel'),
+                        cast_fn=float, units='EV', conv_fn=None, override=True),
+                    MappingElements(
+                        source_dict=filter_dict, source_path='Aperture',
+                        dest_dict=self.em,
+                        dest_path=('EELS', 'aperture_size'),
+                        cast_fn=float, units='MilliM', conv_fn=None,
+                        override=True),
+                    MappingElements(
+                        source_dict=filter_dict, source_path='Drift',
+                        dest_dict=self.em, dest_path=('EELS',
+                                                      'drift_tube_energy'),
+                        cast_fn=float, units='EV', conv_fn=None, override=True),
+                    MappingElements(
+                        source_dict=filter_dict, source_path='Prism',
+                        dest_dict=self.em, dest_path=('EELS',
+                                                      'prism_shift_energy'),
+                        cast_fn=float, units='EV', conv_fn=None, override=True),
+                    MappingElements(
+                        source_dict=filter_dict, source_path='TotalLoss',
+                        dest_dict=self.em, dest_path=('EELS',
+                                                      'total_energy_loss'),
+                        cast_fn=float, units='EV', conv_fn=None, override=True),
+                ]
+
+            map_dict_values(mapping)
+
+    def _tia_info(self) -> None:
+        """Parses information commonly found in .ser/.emi files produced by the
+        "Tecnai Imaging and Analysis" (TIA) software
+
+        Terms such as ``IntegrationTime`` and ``EnergyResolution`` appear to be
+        non-specific as to acqusition modality (i.e. could be EELS or EDS), so
+        we do not extract those into our metadata hierarchy 
+        """
+
+        mapping = [
+            MappingElements(
+                source_dict=self.raw_meta,
+                source_path=('ObjectInfo', 'ExperimentalConditions',
+                             'MicroscopeConditions', 'AcceleratingVoltage'),
+                dest_dict=self.em, dest_path=('General_EM',
+                                              'accelerating_voltage'),
+                cast_fn=float, units='V', conv_fn=None, override=False),
+
+            MappingElements(
+                source_dict=self.raw_meta,
+                source_path=('ObjectInfo', 'AcquireInfo', 'DwellTimePath'),
+                dest_dict=self.em, dest_path=('General_EM', 'dwell_time'),
+                cast_fn=float, units='SEC', conv_fn=None, override=False),
+            MappingElements(
+                source_dict=self.raw_meta,
+                source_path=('ObjectInfo', 'AcquireInfo', 'FrameTime'),
+                dest_dict=self.em, dest_path=('General_EM', 'frame_time'),
+                cast_fn=float, units='SEC', conv_fn=None, override=False),
+
+            MappingElements(
+                source_dict=self.raw_meta,
+                source_path=('ObjectInfo', 'ExperimentalDescription',
+                             'Microscope'),
+                dest_dict=self.em, dest_path=('General_EM', 'microscope_name'),
+                cast_fn=str, units=None, conv_fn=None, override=False),
+            MappingElements(
+                source_dict=self.raw_meta,
+                source_path=('ObjectInfo', 'ExperimentalDescription',
+                             'High tension_kV'),
+                dest_dict=self.em, dest_path=('General_EM',
+                                              'accelerating_voltage'),
+                cast_fn=float, units='KiloV', conv_fn=None, override=False),
+            MappingElements(
+                source_dict=self.raw_meta,
+                source_path=('ObjectInfo', 'ExperimentalDescription',
+                             'Emission_uA'), dest_dict=self.em,
+                dest_path=('General_EM', 'emission_current'),
+                cast_fn=float, units='MicroA', conv_fn=None, override=False),
+            # this value is often more specific than the one from HyperSpy,
+            # so override acquisition mode:
+            MappingElements(
+                source_dict=self.raw_meta,
+                source_path=('ObjectInfo', 'ExperimentalDescription', 'Mode'),
+                dest_dict=self.em,
+                dest_path=('General_EM', 'acquisition_mode'),
+                cast_fn=str, units=None, conv_fn=lambda x: x.strip(),
+                override=True),
+            MappingElements(
+                source_dict=self.raw_meta,
+                source_path=('ObjectInfo', 'ExperimentalDescription',
+                             'Defocus_um'),
+                dest_dict=self.em, dest_path=('TEM', 'defocus'),
+                cast_fn=float, units='MicroM', conv_fn=None, override=False),
+            MappingElements(
+                source_dict=self.raw_meta,
+                source_path=('ObjectInfo', 'ExperimentalDescription',
+                             'Magnification_x'),
+                dest_dict=self.em,
+                dest_path=('General_EM', 'magnification_indicated'),
+                cast_fn=float, units='UNITLESS', conv_fn=None, override=False),
+            MappingElements(
+                source_dict=self.raw_meta,
+                source_path=('ObjectInfo', 'ExperimentalDescription',
+                             'Camera length_m'),
+                dest_dict=self.em, dest_path=('TEM', 'camera_length'),
+                cast_fn=float, units='M', conv_fn=None, override=False),
+            MappingElements(
+                source_dict=self.raw_meta,
+                source_path=('ObjectInfo', 'ExperimentalDescription',
+                             'Spot size'),
+                dest_dict=self.em, dest_path=('TEM', 'spot_size'),
+                cast_fn=int, units='UNITLESS', conv_fn=None, override=False),
+            MappingElements(
+                source_dict=self.raw_meta,
+                source_path=(
+                    'ObjectInfo', 'ExperimentalDescription', 'Stage X_um'),
+                dest_dict=self.em,
+                dest_path=('General_EM', 'stage_position', 'x'),
+                cast_fn=float, units='MicroM', conv_fn=None, override=False),
+            MappingElements(
+                source_dict=self.raw_meta,
+                source_path=(
+                    'ObjectInfo', 'ExperimentalDescription', 'Stage Y_um'),
+                dest_dict=self.em,
+                dest_path=('General_EM', 'stage_position', 'y'),
+                cast_fn=float, units='MicroM', conv_fn=None, override=False),
+            MappingElements(
+                source_dict=self.raw_meta,
+                source_path=(
+                    'ObjectInfo', 'ExperimentalDescription', 'Stage Z_um'),
+                dest_dict=self.em,
+                dest_path=('General_EM', 'stage_position', 'z'),
+                cast_fn=float, units='MicroM', conv_fn=None, override=False),
+            MappingElements(
+                source_dict=self.raw_meta,
+                source_path=(
+                    'ObjectInfo', 'ExperimentalDescription', 'Stage A_deg'),
+                dest_dict=self.em,
+                dest_path=('General_EM', 'stage_position', 'tilt_alpha'),
+                cast_fn=float, units='DEG', conv_fn=None, override=False),
+            MappingElements(
+                source_dict=self.raw_meta,
+                source_path=(
+                    'ObjectInfo', 'ExperimentalDescription', 'Stage B_deg'),
+                dest_dict=self.em,
+                dest_path=('General_EM', 'stage_position', 'tilt_beta'),
+                cast_fn=float, units='DEG', conv_fn=None, override=False),
+
+            MappingElements(
+                source_dict=self.raw_meta,
+                source_path=(
+                    'ObjectInfo', 'ExperimentalDescription', 'Filter mode'),
+                dest_dict=self.em,
+                dest_path=('EELS', 'spectrometer_mode'),
+                cast_fn=str, units=None, conv_fn=None, override=False),
+            MappingElements(
+                source_dict=self.raw_meta,
+                source_path=(
+                    'ObjectInfo', 'ExperimentalDescription',
+                    'Filter selected dispersion_eV/Channel'),
+                dest_dict=self.em,
+                dest_path=('EELS', 'dispersion_per_channel'),
+                cast_fn=float, units='EV', conv_fn=None, override=False),
+            MappingElements(
+                source_dict=self.raw_meta,
+                source_path=(
+                    'ObjectInfo', 'ExperimentalDescription',
+                    'Filter selected aperture'),
+                dest_dict=self.em,
+                dest_path=('EELS', 'aperture_size'),
+                cast_fn=lambda x: float(x.replace('mm', '')),
+                units='MilliM', conv_fn=None,  override=False),
+            MappingElements(
+                source_dict=self.raw_meta,
+                source_path=(
+                    'ObjectInfo', 'ExperimentalDescription',
+                    'Filter prism shift_eV'),
+                dest_dict=self.em,
+                dest_path=('EELS', 'prism_shift_energy'),
+                cast_fn=float, units='EV', conv_fn=None, override=False),
+            MappingElements(
+                source_dict=self.raw_meta,
+                source_path=(
+                    'ObjectInfo', 'ExperimentalDescription',
+                    'Filter drift tube_eV'),
+                dest_dict=self.em,
+                dest_path=('EELS', 'drift_tube_energy'),
+                cast_fn=float, units='EV', conv_fn=None, override=False),
+            MappingElements(
+                source_dict=self.raw_meta,
+                source_path=(
+                    'ObjectInfo', 'ExperimentalDescription',
+                    'Filter total energy loss_eV'),
+                dest_dict=self.em,
+                dest_path=('EELS', 'total_energy_loss'),
+                cast_fn=float, units='EV', conv_fn=None, override=False)
+        ]
+        map_dict_values(mapping)
+
+    def _tiff_info(self) -> None:
+        """Parses metadata found in FEI/ThermoFisher tiff formats (and perhaps
+        others in the future), produced by SEM and dual beam tools
+        """
+        mapping = [
+            MappingElements(
+                source_dict=self.raw_meta,
+                source_path=('fei_metadata', 'System', 'Software'),
+                dest_dict=self.em, dest_path=('General_EM',
+                                              'acquisition_software_version'),
+                cast_fn=str, units=None, conv_fn=None, override=False),
+            MappingElements(
+                source_dict=self.raw_meta,
+                source_path=('fei_metadata', 'Beam', 'Spot'),
+                dest_dict=self.em, dest_path=('SEM', 'spot_size'),
+                cast_fn=lambda x: int(x) if x != '' else None, units=None,
+                conv_fn=None, override=False),
+            MappingElements(
+                source_dict=self.raw_meta,
+                source_path=('fei_metadata', 'Beam', 'HV'),
+                dest_dict=self.em, dest_path=('General_EM',
+                                              'accelerating_voltage'),
+                cast_fn=lambda x: float(x) if x != '' else None, units='KiloV',
+                conv_fn=lambda x: x/1000 if x != '' else None, override=False),
+            MappingElements(
+                source_dict=self.raw_meta,
+                source_path=('fei_metadata', 'EBeam', 'HV'),
+                dest_dict=self.em, dest_path=('General_EM',
+                                              'accelerating_voltage'),
+                cast_fn=lambda x: float(x) if x != '' else None,
+                units='KiloV', conv_fn=lambda x: x / 1000 if x != '' else None,
+                override=False),
+            MappingElements(
+                source_dict=self.raw_meta,
+                source_path=('fei_metadata', 'EBeam', 'HFW'),
+                dest_dict=self.em, dest_path=('SEM', 'horizontal_field_width'),
+                cast_fn=lambda x: float(x) if x != '' else None,
+                units='M', conv_fn=None, override=False),
+            MappingElements(
+                source_dict=self.raw_meta,
+                source_path=('fei_metadata', 'EBeam', 'VFW'),
+                dest_dict=self.em, dest_path=('SEM', 'vertical_field_width'),
+                cast_fn=lambda x: float(x) if x != '' else None, units='M',
+                conv_fn=None, override=False),
+            MappingElements(
+                source_dict=self.raw_meta,
+                source_path=('fei_metadata', 'EBeam', 'WD'),
+                dest_dict=self.em, dest_path=('SEM', 'working_distance'),
+                cast_fn=lambda x: float(x) if x != '' else None, units='M',
+                conv_fn=None, override=False),
+            MappingElements(
+                source_dict=self.raw_meta,
+                source_path=('fei_metadata', 'EBeam', 'BeamCurrent'),
+                dest_dict=self.em, dest_path=('General_EM', 'beam_current'),
+                cast_fn=lambda x: float(x) if x != '' else None, units='A',
+                conv_fn=None, override=False),
+            MappingElements(
+                source_dict=self.raw_meta,
+                source_path=('fei_metadata', 'Stage', 'StageX'),
+                dest_dict=self.em,
+                dest_path=('General_EM', 'stage_position', 'x'),
+                cast_fn=lambda x: float(x) if x != '' else None, units='MilliM',
+                conv_fn=lambda x: x * 1000 if x != '' else None, override=True),
+            MappingElements(
+                source_dict=self.raw_meta,
+                source_path=('fei_metadata', 'Stage', 'StageY'),
+                dest_dict=self.em,
+                dest_path=('General_EM', 'stage_position', 'y'),
+                cast_fn=lambda x: float(x) if x != '' else None, units='MilliM',
+                conv_fn=lambda x: x * 1000 if x != '' else None, override=True),
+            MappingElements(
+                source_dict=self.raw_meta,
+                source_path=('fei_metadata', 'Stage', 'StageZ'),
+                dest_dict=self.em,
+                dest_path=('General_EM', 'stage_position', 'z'),
+                cast_fn=lambda x: float(x) if x != '' else None, units='MilliM',
+                conv_fn=lambda x: x * 1000 if x != '' else None, override=True),
+            MappingElements(
+                source_dict=self.raw_meta,
+                source_path=('fei_metadata', 'Stage', 'StageR'),
+                dest_dict=self.em,
+                dest_path=('General_EM', 'stage_position', 'rotation'),
+                cast_fn=lambda x: float(x) if x != '' else None, units='DEG',
+                conv_fn=None, override=True),
+            MappingElements(
+                source_dict=self.raw_meta,
+                source_path=('fei_metadata', 'Stage', 'StageT'),
+                dest_dict=self.em,
+                dest_path=('General_EM', 'stage_position', 'tilt_alpha'),
+                cast_fn=lambda x: float(x) if x != '' else None, units='DEG',
+                conv_fn=None, override=True),
+            MappingElements(
+                source_dict=self.raw_meta,
+                source_path=('fei_metadata', 'Stage', 'StageTb'),
+                dest_dict=self.em,
+                dest_path=('General_EM', 'stage_position', 'tilt_beta'),
+                cast_fn=lambda x: float(x) if x != '' else None,
+                units='DEG',
+                conv_fn=None, override=True),
+
+            MappingElements(
+                source_dict=self.raw_meta,
+                source_path=('fei_metadata', 'Scan', 'PixelWidth'),
+                dest_dict=self.em, dest_path=('SEM', 'pixel_width'),
+                cast_fn=lambda x: float(x) if x != '' else None,
+                units='M', conv_fn=None, override=False),
+            MappingElements(
+                source_dict=self.raw_meta,
+                source_path=('fei_metadata', 'Scan', 'PixelHeight'),
+                dest_dict=self.em, dest_path=('SEM', 'pixel_height'),
+                cast_fn=lambda x: float(x) if x != '' else None,
+                units='M', conv_fn=None, override=False),
+            MappingElements(
+                source_dict=self.raw_meta,
+                source_path=('fei_metadata', 'Scan', 'HorFieldsize'),
+                dest_dict=self.em, dest_path=('SEM', 'horizontal_field_width'),
+                cast_fn=lambda x: float(x) if x != '' else None,
+                units='M', conv_fn=None, override=False),
+            MappingElements(
+                source_dict=self.raw_meta,
+                source_path=('fei_metadata', 'Scan', 'VerFieldsize'),
+                dest_dict=self.em, dest_path=('SEM', 'vertical_field_width'),
+                cast_fn=lambda x: float(x) if x != '' else None,
+                units='M', conv_fn=None, override=False),
+            MappingElements(
+                source_dict=self.raw_meta,
+                source_path=('fei_metadata', 'Scan', 'FrameTime'),
+                dest_dict=self.em, dest_path=('General_EM', 'frame_time'),
+                cast_fn=lambda x: float(x) if x else None, units='SEC',
+                conv_fn=None, override=False),
+            MappingElements(
+                source_dict=self.raw_meta,
+                source_path=('fei_metadata', 'Image', 'MagnificationMode'),
+                dest_dict=self.em, dest_path=('SEM', 'magnification_mode'),
+                cast_fn=None, units=None, conv_fn=None, override=False),
+            # confirmed in Quanta SEM manual that the pressure units are Pascals
+            MappingElements(
+                source_dict=self.raw_meta,
+                source_path=('fei_metadata', 'Vacuum', 'ChPressure'),
+                dest_dict=self.em, dest_path=('SEM', 'chamber_pressure'),
+                cast_fn=lambda x: float(x) if x else None, units='PA',
+                conv_fn=None, override=False)
+        ]
+        map_dict_values(mapping)
 
     def implementors(self):
-        return ['Jonathon Gaff']
+        return ['Jonathon Gaff <jgaff@uchicago.edu>',
+                'Joshua Taillon <joshua.taillon@nist.gov>']
 
     def version(self):
-        return '0.0.2'
+        return '0.1.0'
diff --git a/materials_io/schemas/electron_microscopy.json b/materials_io/schemas/electron_microscopy.json
new file mode 100644
index 0000000..9c3ec52
--- /dev/null
+++ b/materials_io/schemas/electron_microscopy.json
@@ -0,0 +1,627 @@
+{
+  "$schema": "https://json-schema.org/draft/2020-12/schema",
+  "type": "object",
+  "additionalProperties": false,
+  "properties": {
+    "electron_microscopy": {"$ref": "#/definitions/electron_microscopy_type"}
+  },
+  "definitions": {
+    "single_value_number_type": {
+      "type": "object",
+      "required": ["value"],
+      "additionalProperties": false,
+      "properties": {
+        "value": {"type": "number"},
+        "units": {"type": "string"}
+      }
+    },
+    "single_value_integer_type": {
+      "type": "object",
+      "required": ["value"],
+      "additionalProperties": false,
+      "properties": {
+        "value": {"type": "integer"},
+        "units": {"type": "string"}
+      }
+    },
+    "single_value_string_type": {
+      "type": "object",
+      "required": ["value"],
+      "additionalProperties": false,
+      "properties": {
+        "value": {"type": "string"}
+      }
+    },
+    "single_value_string_or_integer_type": {
+      "type": "object",
+      "required": ["value"],
+      "additionalProperties": false,
+      "properties": {
+        "value": {
+          "oneOf": [
+            {"type": "integer"},
+            {"type": "string"}
+          ]
+        }
+      }
+    },
+    "single_value_boolean_type": {
+      "type": "object",
+      "required": ["value"],
+      "additionalProperties": false,
+      "properties": {
+        "value": {"type": "boolean"}
+      }
+    },
+    "single_value_string_array_type": {
+      "type": "object",
+      "additionalProperties": false,
+      "properties": {
+        "value": {
+          "type": "array",
+          "items": {
+            "enum": [
+              "Ac",
+              "Ag",
+              "Al",
+              "Am",
+              "Ar",
+              "As",
+              "At",
+              "Au",
+              "B",
+              "Ba",
+              "Be",
+              "Bh",
+              "Bi",
+              "Bk",
+              "Br",
+              "C",
+              "Ca",
+              "Cd",
+              "Ce",
+              "Cf",
+              "Cl",
+              "Cm",
+              "Cn",
+              "Co",
+              "Cr",
+              "Cs",
+              "Cu",
+              "Db",
+              "Ds",
+              "Dy",
+              "Er",
+              "Es",
+              "Eu",
+              "F",
+              "Fe",
+              "Fl",
+              "Fm",
+              "Fr",
+              "Ga",
+              "Gd",
+              "Ge",
+              "H",
+              "He",
+              "Hf",
+              "Hg",
+              "Ho",
+              "Hs",
+              "I",
+              "In",
+              "Ir",
+              "K",
+              "Kr",
+              "La",
+              "Li",
+              "Lr",
+              "Lu",
+              "Lv",
+              "Mc",
+              "Md",
+              "Mg",
+              "Mn",
+              "Mo",
+              "Mt",
+              "N",
+              "Na",
+              "Nb",
+              "Nd",
+              "Ne",
+              "Nh",
+              "Ni",
+              "No",
+              "Np",
+              "O",
+              "Og",
+              "Os",
+              "P",
+              "Pa",
+              "Pb",
+              "Pd",
+              "Pm",
+              "Po",
+              "Pr",
+              "Pt",
+              "Pu",
+              "Ra",
+              "Rb",
+              "Re",
+              "Rf",
+              "Rg",
+              "Rh",
+              "Rn",
+              "Ru",
+              "S",
+              "Sb",
+              "Sc",
+              "Se",
+              "Sg",
+              "Si",
+              "Sm",
+              "Sn",
+              "Sr",
+              "Ta",
+              "Tb",
+              "Tc",
+              "Te",
+              "Th",
+              "Ti",
+              "Tl",
+              "Tm",
+              "Ts",
+              "U",
+              "V",
+              "W",
+              "Xe",
+              "Y",
+              "Yb",
+              "Zn",
+              "Zr"
+            ]
+          }
+        }
+      }
+    },
+    "raw_metadata_type": {
+      "type": "object",
+      "additionalProperties": true,
+      "properties": {}
+    },
+    "date_type": {
+      "type": "object",
+      "additionalProperties": false,
+      "properties": {
+        "value": {
+          "type": "string",
+          "format": "date"
+        }
+      }
+    },
+    "time_type": {
+      "type": "object",
+      "additionalProperties": false,
+      "properties": {
+        "value": {
+          "type": "string",
+          "format": "time"
+        }
+      }
+    },
+    "axis-type": {
+      "type": "object",
+      "additionalProperties": false,
+      "properties": {
+        "name": {
+          "oneOf": [
+            {"type": "string"},
+            {"type": "null"}
+          ]
+        },
+        "scale": {"type": "number"},
+        "offset": {"type": "number"},
+        "size": {"type": "integer"},
+        "units": {
+          "oneOf": [
+            {"type": "string"},
+            {"type": "null"}
+          ]
+        }
+      }
+    },
+    "axis_calibration_type": {
+      "type": "object",
+      "additionalProperties": false,
+      "patternProperties": {
+        "^(axis-)\\d*$": {"$ref": "#/definitions/axis-type"}
+      }
+    },
+    "data_dimensions_type": {
+      "type": "array",
+      "items": {"type": "integer"}
+    },
+    "stage_position_type": {
+      "type": "object",
+      "additionalProperties": false,
+      "properties": {
+        "x": {"$ref": "#/definitions/single_value_number_type"},
+        "y": {"$ref": "#/definitions/single_value_number_type"},
+        "z": {"$ref": "#/definitions/single_value_number_type"},
+        "tilt_alpha": {"$ref": "#/definitions/single_value_number_type"},
+        "tilt_beta": {"$ref": "#/definitions/single_value_number_type"},
+        "rotation": {"$ref": "#/definitions/single_value_number_type"}
+      }
+    },
+    "General_type": {
+      "type": "object",
+      "additionalProperties": false,
+      "properties": {
+        "authors": {
+          "$ref": "#/definitions/single_value_string_type",
+          "description": "The authors of the data, in Latex format: Surname1, Name1 and Surname2, Name2, etc."
+        },
+        "date": {
+          "$ref": "#/definitions/date_type",
+          "description": "The acquisition or creation date in ISO 8601 date format, e.g. \u20182018-01-28\u2019"
+        },
+        "doi": {
+          "$ref": "#/definitions/single_value_string_type",
+          "description": "Digital object identifier of the data, e.g. doi:10.5281/zenodo.58841"
+        },
+        "original_filename": {
+          "$ref": "#/definitions/single_value_string_type",
+          "description": "If the data was loaded from a file this key stores the name of the original file"
+        },
+        "notes": {
+          "$ref": "#/definitions/single_value_string_type",
+          "description": "Notes about the data"
+        },
+        "time": {
+          "$ref": "#/definitions/time_type",
+          "description": "The acquisition or creation time in ISO 8601 time format, e.g. \u201813:29:10\u2019"
+        },
+        "time_zone": {
+          "$ref": "#/definitions/single_value_string_type",
+          "description": "The time zone in either tzdata form, e.g. \u201cUTC\u201d, \u201cAmerica/New_York\u201d, etc., or a time offset, e.g. \u201c+03:00\u201d or \u201c-05:00\u201d"
+        },
+        "title": {
+          "$ref": "#/definitions/single_value_string_type",
+          "description": "A title for the signal, e.g. \u201cSample overview\u201d"
+        },
+        "axis_calibration": {
+          "$ref": "#/definitions/axis_calibration_type",
+          "description": "Information about the calibration of each axis found in the data"
+        },
+        "data_dimensions": {
+          "$ref": "#/definitions/data_dimensions_type",
+          "description": "The size (extent) of each dimension as an array, matching the order found in \"axis_calibration\""
+        }
+      }
+    },
+    "General_EM_type": {
+      "type": "object",
+      "additionalProperties": false,
+      "properties": {
+        "accelerating_voltage": {
+          "$ref": "#/definitions/single_value_number_type",
+          "description": "The voltage used to accelerate electrons in the microscope"
+        },
+        "acquisition_mode": {
+          "$ref": "#/definitions/single_value_string_type",
+          "description": "The \"mode\" of the instrument as recorded by the acquisition software"
+        },
+        "acquisition_software_name": {
+          "$ref": "#/definitions/single_value_string_type",
+          "description": "The name of the software used to acquire this data"
+        },
+        "acquisition_software_version": {
+          "$ref": "#/definitions/single_value_string_type",
+          "description": "The version of the software used to acquire this data"
+        },
+        "beam_current": {
+          "$ref": "#/definitions/single_value_number_type",
+          "description": "The current of the electron beam during data collection"
+        },
+        "beam_energy": {
+          "$ref": "#/definitions/single_value_number_type",
+          "description": "The energy of the electron beam"
+        },
+        "convergence_angle": {
+          "$ref": "#/definitions/single_value_number_type",
+          "description": "The pre-specimen convergence semi-angle that defines the angle of incidence of the electron beam"
+        },
+        "detector_name": {
+          "$ref": "#/definitions/single_value_string_type",
+          "description": "The name of the detector used to collect this data"
+        },
+        "dwell_time": {
+          "$ref": "#/definitions/single_value_number_type",
+          "description": "The amount of time the beam dwelled on a given pixel (in scanning mode)"
+        },
+        "emission_current": {
+          "$ref": "#/definitions/single_value_number_type",
+          "description": "The current of the electron beam at its emission point"
+        },
+        "exposure_time": {
+          "$ref": "#/definitions/single_value_number_type",
+          "description": "The amount of time the camera or detector was exposed to the siganl"
+        },
+        "elements": {
+          "$ref": "#/definitions/single_value_string_array_type",
+          "description": "A list of element periodic abbreviations representing elements found in the sample data"
+        },
+        "frame_time": {
+          "$ref": "#/definitions/single_value_number_type",
+          "description": "The total amount of time the beam exposed the sample during a data collection (the sum of all pixels' dwell times)"
+        },
+        "magnification_actual": {
+          "$ref": "#/definitions/single_value_number_type",
+          "description": "The actual calibrated magnification of the collected data"
+        },
+        "magnification_indicated": {
+          "$ref": "#/definitions/single_value_number_type",
+          "description": "The magnification indicated by the acquisition software in this collected data"
+        },
+        "microscope_name": {
+          "$ref": "#/definitions/single_value_string_type",
+          "description": "The name of the microscope used to collect this data"
+        },
+        "probe_area": {
+          "$ref": "#/definitions/single_value_number_type",
+          "description": "The area (size) of the electron beam probe at the sample"
+        },
+        "stage_position": {
+          "$ref": "#/definitions/stage_position_type",
+          "description": "The absolute positions (in multiple axes) of the hardware stage"
+        }
+      }
+    },
+    "TEM_type": {
+      "type": "object",
+      "additionalProperties": false,
+      "properties": {
+        "acquisition_device": {
+          "$ref": "#/definitions/single_value_string_type",
+          "description": "The TEM device used to acquire the signal, as reported by the acquisition software"
+        },
+        "acquisition_format": {
+          "$ref": "#/definitions/single_value_string_type",
+          "description": "The format of the data (image, spectrum, etc.) as reported by the acquisition software"
+        },
+        "acquisition_mode": {
+          "$ref": "#/definitions/single_value_string_type",
+          "description": "The TEM mode used to acquire the signal, as reported by the acquisition software"
+        },
+        "acquisition_signal": {
+          "$ref": "#/definitions/single_value_string_type",
+          "description": "The type of signal collected (EELS, EDS, etc.), as reported by the acquisition software"
+        },
+        "extractor_voltage": {
+          "$ref": "#/definitions/single_value_number_type",
+          "description": "The voltage used to extract electrons from the electron gun"
+        },
+        "illumination_mode": {
+          "$ref": "#/definitions/single_value_string_type",
+          "description": "The mode of illumination (STEM, TEM, NanoProbe, etc.) as reported by the acquisition software"
+        },
+        "imaging_mode": {
+          "$ref": "#/definitions/single_value_string_type",
+          "description": "The mode of imaging (regular imaging, diffraction, etc.) as reported by the acquisition software"
+        },
+        "operation_mode": {
+          "$ref": "#/definitions/single_value_string_type",
+          "description": "The operation mode of the microscope during data collection, as reported by the acquisition software (possible modes are specific to individual microscopes)"
+        },
+        "spherical_aberration_coefficient": {
+          "$ref": "#/definitions/single_value_number_type",
+          "description": "The spherical aberation coefficient (Cs) for the objective lens; a length describing the degree to which off-axis electrons cause blur in the image plane"
+        },
+        "defocus": {
+          "$ref": "#/definitions/single_value_number_type",
+          "description": "The focus shift (a length) of the objective lens used to acquire the data"
+        },
+        "spot_size": {
+          "$ref": "#/definitions/single_value_integer_type",
+          "description": "A manufacturer-specific indication of the strength of the first condenser lens, which generally determines the diameter of the electron beam impinging on the sample"
+        },
+        "camera_length": {
+          "$ref": "#/definitions/single_value_number_type",
+          "description": "The effective length between the sample and the imaging plane (controlled by projector lenses)"
+        }
+      }
+    },
+    "SEM_type": {
+      "type": "object",
+      "additionalProperties": false,
+      "properties": {
+        "chamber_pressure": {
+          "$ref": "#/definitions/single_value_number_type",
+          "description": "The pressure of the sample chamber when the data was acquired"
+        },
+        "horizontal_field_width": {
+          "$ref": "#/definitions/single_value_number_type",
+          "description": "The physical extent (a length) of the imaging frame width"
+        },
+        "magnification_mode": {
+          "$ref": "#/definitions/single_value_string_or_integer_type",
+          "description": "The magnification mode of the SEM specific to a given manufacturer, sometimes indicated by a word or a number"
+        },
+        "pixel_height": {
+          "$ref": "#/definitions/single_value_number_type",
+          "description": "The physical height represented by an individual pixel in the SEM scan"
+        },
+        "pixel_width": {
+          "$ref": "#/definitions/single_value_number_type",
+          "description": "The physical width represented by an individual pixel in the SEM scan"
+        },
+        "spot_size": {
+          "$ref": "#/definitions/single_value_integer_type",
+          "description": "A manufacturer-specific relative indicator of beam current and physical diameter of the electron beam impinging on the sample"
+        },
+        "working_distance": {
+          "$ref": "#/definitions/single_value_number_type",
+          "description": "The length between the final SEM lens and the beam's focus plane; controls the focus of the resulting image/scan"
+        },
+        "vertical_field_width": {
+          "$ref": "#/definitions/single_value_number_type",
+          "description": "The physical extent (a length) of the imaging frame height"
+        }
+      }
+    },
+    "EDS_type": {
+      "type": "object",
+      "additionalProperties": false,
+      "properties": {
+        "azimuth_angle": {
+          "$ref": "#/definitions/single_value_number_type",
+          "description": "The rotational angle around the optic axis between the EDS detector and the primary (alpha) tilt axis. If zero, the detector is parallel to the primary tilt axis"
+        },
+        "detector_type": {
+          "$ref": "#/definitions/single_value_string_type",
+          "description": "The specific type of EDS detector, as reported by the acquisition software"
+        },
+        "dispersion_per_channel": {
+          "$ref": "#/definitions/single_value_number_type",
+          "description": "The energy range covered by an individual pixel (channel) in the EDS detector (analagous to \"pixel_width\" but in the energy dimension)"
+        },
+        "elevation_angle": {
+          "$ref": "#/definitions/single_value_number_type",
+          "description": "The vertical angle between a reference plane normal to the optic axis and the EDS detector. If zero, the detector is perpendicular to the optic axis"
+        },
+        "energy_resolution_MnKa": {
+          "$ref": "#/definitions/single_value_number_type",
+          "description": "The full width at half maximum (FWHM) of the manganese K alpha (Mn Ka) peak. This value is used as a first approximation of the energy resolution of the detector."
+        },
+        "incidence_angle": {
+          "$ref": "#/definitions/single_value_number_type",
+          "description": "The beam incidence angle relative to the sample normal"
+        },
+        "live_time": {
+          "$ref": "#/definitions/single_value_number_type",
+          "description": "The actual time during which pulses are measured in the detector (will be necessarily less then \"real_time\"), limited due to physical limitions of pulse processing"
+        },
+        "real_time": {
+          "$ref": "#/definitions/single_value_number_type",
+          "description": "The actual data collection duration in which the sample was exposed. Will be greater than \"live_time\" due to pulse-pilup rejections within the pulse processing circuitry of the EDS dector."
+        },
+        "solid_angle": {
+          "$ref": "#/definitions/single_value_number_type",
+          "description": "The effective size of the detector, which is the ratio of the area of the face of the detector to the square of the radial distance to the beam impact point (see Goldstein et al., 3rd Ed., pp. 127)"
+        },
+        "stage_tilt": {
+          "$ref": "#/definitions/single_value_number_type",
+          "description": "The tilt angle of the SEM stage (on its primary tilt axis, if more than one available -- see \"General_EM.stage_position.tilt_alpha/beta\" for more detail)"
+        }
+      }
+    },
+    "EELS_type": {
+      "type": "object",
+      "additionalProperties": false,
+      "properties": {
+        "aperture_size": {
+          "$ref": "#/definitions/single_value_number_type",
+          "description": "The physical diameter of the EELS aperature (partly controls the collection angle)"
+        },
+        "collection_angle": {
+          "$ref": "#/definitions/single_value_number_type",
+          "description": "The collection semi-angle indicating the limit of angular spread of scattered electrons; typically expressed in milliradians"
+        },
+        "dispersion_per_channel": {
+          "$ref": "#/definitions/single_value_number_type",
+          "description": "The energy range covered by an individual pixel (channel) in the EELS detector (analagous to \"pixel_width\" but in the energy dimension)"
+        },
+        "drift_tube_voltage": {
+          "$ref": "#/definitions/single_value_number_type",
+          "description": "The voltage applied to the the EELS drift tube (some manufactures express this as a voltage, others as an energy)"
+        },
+        "drift_tube_energy": {
+          "$ref": "#/definitions/single_value_number_type",
+          "description": "The energy applied to the the EELS drift tube (some manufactures express this as a voltage, others as an energy)"
+        },
+        "drift_tube_enabled": {
+          "$ref": "#/definitions/single_value_boolean_type",
+          "description": "Whether the drift tube was enabled during EELS acquisition"
+        },
+        "energy_loss_offset": {
+          "$ref": "#/definitions/single_value_number_type",
+          "description": "The offset energy of the collected EELS data"
+        },
+        "filter_slit_width": {
+          "$ref": "#/definitions/single_value_number_type",
+          "description": "The width (in energy) of the EELS filter slit"
+        },
+        "filter_slit_inserted": {
+          "$ref": "#/definitions/single_value_boolean_type",
+          "description": "Whether the EELS filter slit was inserted during EELS acquisition"
+        },
+        "integration_time": {
+          "$ref": "#/definitions/single_value_number_type",
+          "description": "The total duration of time the EELS signal was integrated to produce the final data"
+        },
+        "number_of_samples": {
+          "$ref": "#/definitions/single_value_integer_type",
+          "description": "The number of frames or spectra integrated during the acquisition"
+        },
+        "prism_shift_voltage": {
+          "$ref": "#/definitions/single_value_number_type",
+          "description": "The voltage applied to the the EELS prism shift lenses to shift the collected specturm in the energy dimension (some manufactures express this as a voltage, others as an energy)"
+        },
+        "prism_shift_energy": {
+          "$ref": "#/definitions/single_value_number_type",
+          "description": "The energy applied to the the EELS prism shift lenses to shift the collected specturm in the energy dimension (some manufactures express this as a voltage, others as an energy)"
+        },
+        "prism_shift_enabled": {
+          "$ref": "#/definitions/single_value_boolean_type",
+          "description": "Whether the EELS prism shift was enabled during EELS acquisition"
+        },
+        "spectrometer_mode": {
+          "$ref": "#/definitions/single_value_string_type",
+          "description": "The mode of operation for the EELS spectrometer, as reported by the acquisition software"
+        },
+        "spectrometer_name": {
+          "$ref": "#/definitions/single_value_string_type",
+          "description": "The name of the EELS spectrometer, as reported by the acquisition software"
+        },
+        "total_energy_loss": {
+          "$ref": "#/definitions/single_value_number_type",
+          "description": "The total calculated energy loss, as reported by the acquisition software (note, this value is known to sometimes be incorrect)"
+        }
+      }
+    },
+    "electron_microscopy_type": {
+      "type": "object",
+      "additionalProperties": false,
+      "properties": {
+        "raw_metadata": {
+          "$ref": "#/definitions/raw_metadata_type",
+          "description": "The superset of all metadata (in its original format) as extracted using HyperSpy"
+        },
+        "General": {
+          "$ref": "#/definitions/General_type",
+          "description": "Metadata about the file itself, not directly related to electron microscopy"
+        },
+        "General_EM": {
+          "$ref": "#/definitions/General_EM_type",
+          "description": "Metadata values that are generic to all forms of electron microscopy"
+        },
+        "TEM": {
+          "$ref": "#/definitions/TEM_type",
+          "description": "Metadata values specific to transmission electron microscopy (TEM)"
+        },
+        "SEM": {
+          "$ref": "#/definitions/SEM_type",
+          "description": "Metadata values specific to scanning electron microscopy (SEM)"
+        },
+        "EDS": {
+          "$ref": "#/definitions/EDS_type",
+          "description": "Metadata values specific to X-ray Energy Dispersive Spectroscopy (EDS)"
+        },
+        "EELS": {
+          "$ref": "#/definitions/EELS_type",
+          "description": "Metadata values specific to Electron Energy Loss Spectroscopy (EELS)"
+        }
+      }
+    }
+  }
+}
\ No newline at end of file
diff --git a/materials_io/utils/__init__.py b/materials_io/utils/__init__.py
index e69de29..0c8ffb2 100644
--- a/materials_io/utils/__init__.py
+++ b/materials_io/utils/__init__.py
@@ -0,0 +1,189 @@
+from typing import Dict, Union, Tuple, Any, Callable, Optional, List
+from typing_extensions import TypedDict
+
+
+def get_nested_dict_value_by_path(nest_dict: Dict,
+                                  path: Union[Tuple, str],
+                                  cast: Optional[Callable] = None) -> Any:
+    """Get the value from within a nested dictionary structure by traversing
+    into the dictionary as deep as that path found and returning that value
+
+    Args:
+        nest_dict: A dictionary of dictionaries that is to be queried
+        path: A string or tuple that specifies the subsequent keys needed to
+            get to a value within `nest_dict`. If a string, the value will
+            return just from the first level (mostly for convenience)
+        cast: A function that (if provided) will be applied to the value. This
+            helps with serialization.
+
+    Returns:
+        The value at the path within the nested dictionary; if there's no
+        value there, return ``None``
+    """
+    sub_dict = nest_dict
+
+    if isinstance(path, str):
+        path = (path,)
+
+    for key in path:
+        try:
+            sub_dict = sub_dict[key]
+        except KeyError:
+            return None
+
+    # coerce empty values to None
+    if sub_dict in [{}, dict(), [], '', None]:
+        return None
+
+    if cast is not None:
+        return cast(sub_dict)
+    else:
+        return sub_dict
+
+
+def set_nested_dict_value(nest_dict: Dict, path: Tuple,
+                          value: Any, override: Optional[bool] = False, ):
+    """Set a value within a nested dictionary structure by traversing into
+    the dictionary as deep as that path found and changing it to ``value``.
+    If ``value`` is ``None``, immediately return without performing an action
+    Cribbed from https://stackoverflow.com/a/13688108/1435788
+
+    Args:
+        nest_dict: A dictionary of dictionaries that is to be queried
+        path: A tuple (or other iterable type) that specifies the subsequent
+            keys needed to get to a value within `nest_dict`
+        value: The value which will be given to the path in the nested
+            dictionary
+        override: If the value is already present, this flag controls whether
+            to override its existing value
+    """
+    if value is None:
+        return
+    orig_value = get_nested_dict_value_by_path(nest_dict, path)
+    for key in path[:-1]:
+        nest_dict = nest_dict.setdefault(key, {})
+    if orig_value is None or \
+            orig_value is not None and override:
+        # only set the value if it was None, or we chose to override
+        nest_dict[path[-1]] = value
+
+
+def set_nested_dict_value_with_units(nest_dict: Dict, path: Tuple,
+                                     value: Any, units: Optional[str] = None,
+                                     override: bool = False,
+                                     fn: Optional[Callable] = None):
+    """Same as :func:`~materials_io.utils.set_nested_dict_value`, but sets the
+    value in the format of a dictionary with keys ``'value'`` and ``'units'``
+    according to the specified units. If ``fn`` is supplied, it will be
+    applied to the value prior to setting it.
+
+    Args:
+        nest_dict: A dictionary of dictionaries that is to be queried
+        path: A tuple (or other iterable type) that specifies the subsequent
+            keys needed to get to a value within ``nest_dict``.
+        value: The value which will be given to the path in the nested
+            dictionary
+        units: If provided, will set the value at the given path to the
+            provided units
+        override: Whether to override a value if there is one already present
+            at the path given
+        fn: A callable function to apply to the value; can be used (for example)
+            to convert a value form one unit to another, or any other purpose
+    """
+    if value is not None:
+        if fn is not None:
+            value = fn(value)
+        to_set = {'value': value}
+        if units is not None:
+            to_set['units'] = units
+        set_nested_dict_value(nest_dict, path, to_set, override)
+
+
+# type definition for the mapping dictionaries
+MappingElements = TypedDict('MappingElements',
+                            {'source_dict': Dict,
+                             'source_path': Union[str, Tuple[str, ...]],
+                             'dest_dict': Dict,
+                             'dest_path': Union[str, Tuple[str, ...]],
+                             'cast_fn': Optional[Callable],
+                             'units': Optional[Union[None, str]],
+                             'conv_fn': Optional[Union[None, Callable]],
+                             'override': Optional[bool]})
+"""TypedDict: A TypedDict to specify the exact types expected when creating a 
+mapping dictionary to map metadata from one place to another.
+"""
+
+
+def map_dict_values(mapping: List[MappingElements]):
+    """
+    Helper method to apply map values from one dictionary into another.
+    Inspired by the implementation in :func:`hyperspy.io.dict2signal`
+
+    For each mapping we need a source dict and destination dict, then for
+    eaqch term, the source path, the destination path, the cast function,
+    the units to set, and potentially a conversion function
+
+    Args:
+        mapping: should be a list of dicts, for example:
+            [
+                {'source_path': ('source', 'path',),
+                 'dest_path': ('dest', 'path',),
+                 'cast_fn': float,
+                 'units': str,
+                 'conv_fn': lambda x: x,
+                 'override': bool}
+            ]
+    """
+    for m in mapping:
+        m.setdefault('cast_fn', None)
+        m.setdefault('units', None)
+        m.setdefault('conv_fn', None)
+
+        value = get_nested_dict_value_by_path(
+            nest_dict=m['source_dict'],
+            path=m['source_path'],
+            cast=m['cast_fn'])
+        set_nested_dict_value_with_units(
+            nest_dict=m['dest_dict'], path=m['dest_path'], value=value,
+            units=m['units'], fn=m['conv_fn'], override=m['override'])
+
+
+def standardize_unit(u: str) -> str:
+    """
+    Helper method to convert typically seen unit representations into a
+    standardized representation from QUDT
+    (http://www.qudt.org/doc/DOC_VOCAB-UNITS.html). This is
+    non-exhaustive, and may need to be updated as more types of units are
+    encountered
+
+    Args:
+        u: The unit representation to convert
+
+    Returns:
+        The unit in a QUDT-standard representation (if known; otherwise just
+        returns the unit representation as provided)
+    """
+    mapping = {
+        # length
+        'km': 'KiloM', 'cm': 'CentiM', 'm': 'M', 'mm': 'MilliM',
+        'µm': 'MicroM', 'um': 'MicroM', 'nm': 'NanoM', 'pm': 'PicoM',
+        'Å': 'ANGSTROM',
+        # current
+        'A': 'A', 'mA': 'MilliA', 'nA': 'NanoA', 'pA': 'PicoA',
+        'µA': 'MicroA', 'uA': 'MicroA',
+        # energy
+        'eV': 'EV', 'GeV': 'GigaEV', 'keV': 'KiloEV', 'MeV': 'MegaEV',
+        # mass
+        'g': 'GM', 'kg': 'KiloGM',
+        # potential
+        'V': 'V', 'kV': 'KiloV', 'MV': 'MegaV', 'mV': 'MilliV',
+        'uV': 'MicroV', 'µV': 'MicroV',
+        # inverse lengths
+        '1/nm': 'PER-NanoM', '1/mm': 'PER-MilliM', '1/m': 'PER-M',
+        '1/cm': 'PER-CentiM', '1/um': 'PER-MicroM', '1/µm': 'PER-MicroM',
+        '1/pm': 'PER-PicoM'
+    }
+    if u in mapping:
+        return mapping[u]
+    else:
+        return u
diff --git a/poetry.lock b/poetry.lock
new file mode 100644
index 0000000..6811ec5
--- /dev/null
+++ b/poetry.lock
@@ -0,0 +1,3271 @@
+[[package]]
+name = "appnope"
+version = "0.1.2"
+description = "Disable App Nap on macOS >= 10.9"
+category = "main"
+optional = true
+python-versions = "*"
+
+[[package]]
+name = "ase"
+version = "3.19.3"
+description = "Atomic Simulation Environment"
+category = "main"
+optional = true
+python-versions = ">=3.5"
+
+[package.dependencies]
+matplotlib = "*"
+numpy = "*"
+scipy = "*"
+
+[package.extras]
+docs = ["sphinx", "sphinx-rtd-theme", "pillow"]
+
+[[package]]
+name = "atomicwrites"
+version = "1.4.0"
+description = "Atomic file writes."
+category = "main"
+optional = false
+python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
+
+[[package]]
+name = "attrs"
+version = "21.4.0"
+description = "Classes Without Boilerplate"
+category = "main"
+optional = false
+python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
+
+[package.extras]
+dev = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins", "zope.interface", "furo", "sphinx", "sphinx-notfound-page", "pre-commit", "cloudpickle"]
+docs = ["furo", "sphinx", "zope.interface", "sphinx-notfound-page"]
+tests = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins", "zope.interface", "cloudpickle"]
+tests_no_zope = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins", "cloudpickle"]
+
+[[package]]
+name = "backcall"
+version = "0.2.0"
+description = "Specifications for callback functions passed in to an API"
+category = "main"
+optional = true
+python-versions = "*"
+
+[[package]]
+name = "boto3"
+version = "1.20.37"
+description = "The AWS SDK for Python"
+category = "main"
+optional = true
+python-versions = ">= 3.6"
+
+[package.dependencies]
+botocore = ">=1.23.37,<1.24.0"
+jmespath = ">=0.7.1,<1.0.0"
+s3transfer = ">=0.5.0,<0.6.0"
+
+[package.extras]
+crt = ["botocore[crt] (>=1.21.0,<2.0a0)"]
+
+[[package]]
+name = "botocore"
+version = "1.23.37"
+description = "Low-level, data-driven core of boto 3."
+category = "main"
+optional = true
+python-versions = ">= 3.6"
+
+[package.dependencies]
+jmespath = ">=0.7.1,<1.0.0"
+python-dateutil = ">=2.1,<3.0.0"
+urllib3 = ">=1.25.4,<1.27"
+
+[package.extras]
+crt = ["awscrt (==0.12.5)"]
+
+[[package]]
+name = "cached-property"
+version = "1.5.2"
+description = "A decorator for caching properties in classes."
+category = "main"
+optional = true
+python-versions = "*"
+
+[[package]]
+name = "certifi"
+version = "2021.10.8"
+description = "Python package for providing Mozilla's CA Bundle."
+category = "main"
+optional = false
+python-versions = "*"
+
+[[package]]
+name = "cffi"
+version = "1.15.0"
+description = "Foreign Function Interface for Python calling C code."
+category = "main"
+optional = false
+python-versions = "*"
+
+[package.dependencies]
+pycparser = "*"
+
+[[package]]
+name = "chardet"
+version = "4.0.0"
+description = "Universal encoding detector for Python 2 and 3"
+category = "main"
+optional = true
+python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
+
+[[package]]
+name = "charset-normalizer"
+version = "2.0.10"
+description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet."
+category = "main"
+optional = false
+python-versions = ">=3.5.0"
+
+[package.extras]
+unicode_backport = ["unicodedata2"]
+
+[[package]]
+name = "click"
+version = "8.0.3"
+description = "Composable command line interface toolkit"
+category = "main"
+optional = true
+python-versions = ">=3.6"
+
+[package.dependencies]
+colorama = {version = "*", markers = "platform_system == \"Windows\""}
+importlib-metadata = {version = "*", markers = "python_version < \"3.8\""}
+
+[[package]]
+name = "cloudpickle"
+version = "2.0.0"
+description = "Extended pickling support for Python objects"
+category = "main"
+optional = true
+python-versions = ">=3.6"
+
+[[package]]
+name = "colorama"
+version = "0.4.4"
+description = "Cross-platform colored terminal text."
+category = "main"
+optional = false
+python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
+
+[[package]]
+name = "coverage"
+version = "6.2"
+description = "Code coverage measurement for Python"
+category = "main"
+optional = false
+python-versions = ">=3.6"
+
+[package.extras]
+toml = ["tomli"]
+
+[[package]]
+name = "coveralls"
+version = "3.3.1"
+description = "Show coverage stats online via coveralls.io"
+category = "dev"
+optional = false
+python-versions = ">= 3.5"
+
+[package.dependencies]
+coverage = ">=4.1,<6.0.0 || >6.1,<6.1.1 || >6.1.1,<7.0"
+docopt = ">=0.6.1"
+requests = ">=1.0.0"
+
+[package.extras]
+yaml = ["PyYAML (>=3.10)"]
+
+[[package]]
+name = "cryptography"
+version = "36.0.1"
+description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers."
+category = "main"
+optional = false
+python-versions = ">=3.6"
+
+[package.dependencies]
+cffi = ">=1.12"
+
+[package.extras]
+docs = ["sphinx (>=1.6.5,!=1.8.0,!=3.1.0,!=3.1.1)", "sphinx-rtd-theme"]
+docstest = ["pyenchant (>=1.6.11)", "twine (>=1.12.0)", "sphinxcontrib-spelling (>=4.0.1)"]
+pep8test = ["black", "flake8", "flake8-import-order", "pep8-naming"]
+sdist = ["setuptools_rust (>=0.11.4)"]
+ssh = ["bcrypt (>=3.1.5)"]
+test = ["pytest (>=6.2.0)", "pytest-cov", "pytest-subtests", "pytest-xdist", "pretend", "iso8601", "pytz", "hypothesis (>=1.11.4,!=3.79.2)"]
+
+[[package]]
+name = "cycler"
+version = "0.11.0"
+description = "Composable style cycles"
+category = "main"
+optional = true
+python-versions = ">=3.6"
+
+[[package]]
+name = "cython"
+version = "0.29.26"
+description = "The Cython compiler for writing C extensions for the Python language."
+category = "main"
+optional = true
+python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*"
+
+[[package]]
+name = "dask"
+version = "2022.1.0"
+description = "Parallel PyData with Task Scheduling"
+category = "main"
+optional = true
+python-versions = ">=3.7"
+
+[package.dependencies]
+cloudpickle = ">=1.1.1"
+fsspec = ">=0.6.0"
+numpy = {version = ">=1.18", optional = true, markers = "extra == \"array\""}
+packaging = ">=20.0"
+partd = ">=0.3.10"
+pyyaml = ">=5.3.1"
+toolz = ">=0.8.2"
+
+[package.extras]
+array = ["numpy (>=1.18)"]
+complete = ["bokeh (>=2.1.1)", "distributed (==2022.01.0)", "jinja2", "numpy (>=1.18)", "pandas (>=1.0)"]
+dataframe = ["numpy (>=1.18)", "pandas (>=1.0)"]
+diagnostics = ["bokeh (>=2.1.1)", "jinja2"]
+distributed = ["distributed (==2022.01.0)"]
+test = ["pytest", "pytest-rerunfailures", "pytest-xdist", "pre-commit"]
+
+[[package]]
+name = "debugpy"
+version = "1.5.1"
+description = "An implementation of the Debug Adapter Protocol for Python"
+category = "main"
+optional = true
+python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*"
+
+[[package]]
+name = "decorator"
+version = "5.1.1"
+description = "Decorators for Humans"
+category = "main"
+optional = true
+python-versions = ">=3.5"
+
+[[package]]
+name = "dftparse"
+version = "0.3.0"
+description = "Library for parsing Density Functional Theory calculations"
+category = "main"
+optional = true
+python-versions = "*"
+
+[[package]]
+name = "dfttopif"
+version = "1.1.0"
+description = "Library for parsing Density Functional Theory calculations"
+category = "main"
+optional = true
+python-versions = "*"
+
+[package.dependencies]
+ase = "*"
+dftparse = ">=0.2.1"
+pypif = ">=2.0.1,<3"
+
+[package.extras]
+report = ["requests"]
+
+[[package]]
+name = "dill"
+version = "0.3.4"
+description = "serialize all of python"
+category = "main"
+optional = true
+python-versions = ">=2.7, !=3.0.*"
+
+[package.extras]
+graph = ["objgraph (>=1.7.2)"]
+
+[[package]]
+name = "docopt"
+version = "0.6.2"
+description = "Pythonic argument parser, that will make you smile"
+category = "dev"
+optional = false
+python-versions = "*"
+
+[[package]]
+name = "entrypoints"
+version = "0.3"
+description = "Discover and load entry points from installed packages."
+category = "main"
+optional = true
+python-versions = ">=2.7"
+
+[[package]]
+name = "et-xmlfile"
+version = "1.1.0"
+description = "An implementation of lxml.xmlfile for the standard library"
+category = "main"
+optional = true
+python-versions = ">=3.6"
+
+[[package]]
+name = "fair-research-login"
+version = "0.2.6"
+description = "A generalized library for storing native auth tokens"
+category = "main"
+optional = false
+python-versions = "*"
+
+[package.dependencies]
+globus-sdk = "<4.0.0"
+six = "*"
+
+[[package]]
+name = "flake8"
+version = "4.0.1"
+description = "the modular source code checker: pep8 pyflakes and co"
+category = "dev"
+optional = false
+python-versions = ">=3.6"
+
+[package.dependencies]
+importlib-metadata = {version = "<4.3", markers = "python_version < \"3.8\""}
+mccabe = ">=0.6.0,<0.7.0"
+pycodestyle = ">=2.8.0,<2.9.0"
+pyflakes = ">=2.4.0,<2.5.0"
+
+[[package]]
+name = "fsspec"
+version = "2022.1.0"
+description = "File-system specification"
+category = "main"
+optional = true
+python-versions = ">=3.6"
+
+[package.extras]
+abfs = ["adlfs"]
+adl = ["adlfs"]
+arrow = ["pyarrow (>=1)"]
+dask = ["dask", "distributed"]
+dropbox = ["dropboxdrivefs", "requests", "dropbox"]
+entrypoints = ["importlib-metadata"]
+fuse = ["fusepy"]
+gcs = ["gcsfs"]
+git = ["pygit2"]
+github = ["requests"]
+gs = ["gcsfs"]
+gui = ["panel"]
+hdfs = ["pyarrow (>=1)"]
+http = ["requests", "aiohttp"]
+libarchive = ["libarchive-c"]
+oci = ["ocifs"]
+s3 = ["s3fs"]
+sftp = ["paramiko"]
+smb = ["smbprotocol"]
+ssh = ["paramiko"]
+
+[[package]]
+name = "globus-nexus-client"
+version = "0.4.1"
+description = "Unofficial Globus Nexus Client (based on SDK clients)"
+category = "main"
+optional = false
+python-versions = ">=3.6.2"
+
+[package.dependencies]
+globus-sdk = ">=3.0.0,<4"
+
+[[package]]
+name = "globus-sdk"
+version = "3.2.1"
+description = "Globus SDK for Python"
+category = "main"
+optional = false
+python-versions = ">=3.6"
+
+[package.dependencies]
+cryptography = ">=3.3.1,<3.4.0 || >3.4.0"
+pyjwt = {version = ">=2.0.0,<3.0.0", extras = ["crypto"]}
+requests = ">=2.19.1,<3.0.0"
+
+[package.extras]
+dev = ["pytest (<7)", "pytest-cov (<3)", "pytest-xdist (<3)", "responses (==0.16.0)", "flake8 (<5)", "isort (<6)", "black (==21.12b0)", "flake8-bugbear (==21.11.29)", "mypy (==0.910)", "types-docutils", "types-jwt", "types-requests", "typing-extensions", "sphinx (<5)", "sphinx-issues (<2)", "furo (==2021.11.23)"]
+
+[[package]]
+name = "greenlet"
+version = "1.1.2"
+description = "Lightweight in-process concurrent programming"
+category = "main"
+optional = true
+python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*"
+
+[package.extras]
+docs = ["sphinx"]
+
+[[package]]
+name = "h5py"
+version = "3.6.0"
+description = "Read and write HDF5 files from Python"
+category = "main"
+optional = true
+python-versions = ">=3.7"
+
+[package.dependencies]
+cached-property = {version = "*", markers = "python_version < \"3.8\""}
+numpy = ">=1.14.5"
+
+[[package]]
+name = "hyperspy"
+version = "1.6.5"
+description = "Multidimensional data analysis toolbox"
+category = "main"
+optional = true
+python-versions = "~=3.6"
+
+[package.dependencies]
+dask = {version = ">2.1.0", extras = ["array"]}
+dill = "*"
+h5py = ">=2.3"
+imageio = "*"
+importlib-metadata = ">=3.6"
+ipyparallel = "*"
+matplotlib = ">=3.1.0,<3.5"
+natsort = "*"
+numba = "*"
+numexpr = "*"
+numpy = ">=1.17.1"
+packaging = "*"
+pint = ">=0.10"
+prettytable = "*"
+python-dateutil = ">=2.5.0"
+pyyaml = "*"
+requests = "*"
+scikit-image = ">=0.15"
+scipy = ">=1.1"
+sparse = "*"
+sympy = "*"
+tifffile = ">=2019.12.3"
+tqdm = ">=4.9.0"
+traits = ">=4.5.0"
+
+[package.extras]
+all = ["hyperspy-gui-ipywidgets (>=1.1.0)", "hyperspy-gui-traitsui (>=1.1.0)", "blosc (>=1.5)", "mrcz (>=0.3.6)", "cython", "imagecodecs", "pyUSID (>=0.0.7)", "sidpy", "scikit-learn (!=1.0)"]
+build-doc = ["sphinx (>=1.7)", "sphinx-rtd-theme", "sphinx-toggleprompt", "sphinxcontrib-mermaid", "sphinxcontrib-towncrier"]
+coverage = ["pytest-cov", "codecov"]
+dev = ["hyperspy-gui-ipywidgets (>=1.1.0)", "hyperspy-gui-traitsui (>=1.1.0)", "blosc (>=1.5)", "mrcz (>=0.3.6)", "cython", "imagecodecs", "pyUSID (>=0.0.7)", "sidpy", "pytest (>=3.6)", "pytest-mpl", "pytest-xdist", "pytest-rerunfailures", "pytest-instafail", "matplotlib (>=3.1)", "pytest-cov", "codecov", "sphinx (>=1.7)", "sphinx-rtd-theme", "sphinx-toggleprompt", "sphinxcontrib-mermaid", "sphinxcontrib-towncrier", "scikit-learn (!=1.0)"]
+gui-jupyter = ["hyperspy-gui-ipywidgets (>=1.1.0)"]
+gui-traitsui = ["hyperspy-gui-traitsui (>=1.1.0)"]
+learning = ["scikit-learn (!=1.0)"]
+mrcz = ["blosc (>=1.5)", "mrcz (>=0.3.6)"]
+speed = ["cython", "imagecodecs"]
+tests = ["pytest (>=3.6)", "pytest-mpl", "pytest-xdist", "pytest-rerunfailures", "pytest-instafail", "matplotlib (>=3.1)"]
+usid = ["pyUSID (>=0.0.7)", "sidpy"]
+
+[[package]]
+name = "idna"
+version = "3.3"
+description = "Internationalized Domain Names in Applications (IDNA)"
+category = "main"
+optional = false
+python-versions = ">=3.5"
+
+[[package]]
+name = "ijson"
+version = "3.1.4"
+description = "Iterative JSON parser with standard Python iterator interfaces"
+category = "main"
+optional = true
+python-versions = "*"
+
+[[package]]
+name = "imageio"
+version = "2.9.0"
+description = "Library for reading and writing a wide range of image, video, scientific, and volumetric data formats."
+category = "main"
+optional = true
+python-versions = ">=3.5"
+
+[package.dependencies]
+numpy = "*"
+pillow = "*"
+
+[package.extras]
+ffmpeg = ["imageio-ffmpeg"]
+fits = ["astropy"]
+full = ["astropy", "gdal", "imageio-ffmpeg", "itk"]
+gdal = ["gdal"]
+itk = ["itk"]
+
+[[package]]
+name = "importlib-metadata"
+version = "4.2.0"
+description = "Read metadata from Python packages"
+category = "main"
+optional = false
+python-versions = ">=3.6"
+
+[package.dependencies]
+typing-extensions = {version = ">=3.6.4", markers = "python_version < \"3.8\""}
+zipp = ">=0.5"
+
+[package.extras]
+docs = ["sphinx", "jaraco.packaging (>=8.2)", "rst.linker (>=1.9)"]
+testing = ["pytest (>=4.6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest-cov", "pytest-enabler (>=1.0.1)", "packaging", "pep517", "pyfakefs", "flufl.flake8", "pytest-black (>=0.3.7)", "pytest-mypy", "importlib-resources (>=1.3)"]
+
+[[package]]
+name = "importlib-resources"
+version = "5.4.0"
+description = "Read resources from Python packages"
+category = "main"
+optional = false
+python-versions = ">=3.6"
+
+[package.dependencies]
+zipp = {version = ">=3.1.0", markers = "python_version < \"3.10\""}
+
+[package.extras]
+docs = ["sphinx", "jaraco.packaging (>=8.2)", "rst.linker (>=1.9)"]
+testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest-cov", "pytest-enabler (>=1.0.1)", "pytest-black (>=0.3.7)", "pytest-mypy"]
+
+[[package]]
+name = "ipykernel"
+version = "6.7.0"
+description = "IPython Kernel for Jupyter"
+category = "main"
+optional = true
+python-versions = ">=3.7"
+
+[package.dependencies]
+appnope = {version = "*", markers = "platform_system == \"Darwin\""}
+debugpy = ">=1.0.0,<2.0"
+ipython = ">=7.23.1"
+jupyter-client = "<8.0"
+matplotlib-inline = ">=0.1.0,<0.2.0"
+nest-asyncio = "*"
+tornado = ">=4.2,<7.0"
+traitlets = ">=5.1.0,<6.0"
+
+[package.extras]
+test = ["pytest (!=5.3.4)", "pytest-cov", "flaky", "ipyparallel"]
+
+[[package]]
+name = "ipyparallel"
+version = "8.1.0"
+description = "Interactive Parallel Computing with IPython"
+category = "main"
+optional = true
+python-versions = ">=3.6"
+
+[package.dependencies]
+decorator = "*"
+entrypoints = "*"
+ipykernel = ">=4.4"
+ipython = ">=4"
+jupyter-client = "*"
+psutil = "*"
+python-dateutil = ">=2.1"
+pyzmq = ">=18"
+tornado = ">=5.1"
+tqdm = "*"
+traitlets = ">=4.3"
+
+[package.extras]
+benchmark = ["asv"]
+labextension = ["jupyter-server", "jupyterlab (>=3)"]
+nbext = ["notebook", "jupyter-server"]
+retroextension = ["jupyter-server", "retrolab"]
+serverextension = ["jupyter-server"]
+test = ["pytest", "pytest-cov", "pytest-asyncio", "pytest-tornado", "ipython", "testpath"]
+
+[[package]]
+name = "ipython"
+version = "7.31.0"
+description = "IPython: Productive Interactive Computing"
+category = "main"
+optional = true
+python-versions = ">=3.7"
+
+[package.dependencies]
+appnope = {version = "*", markers = "sys_platform == \"darwin\""}
+backcall = "*"
+colorama = {version = "*", markers = "sys_platform == \"win32\""}
+decorator = "*"
+jedi = ">=0.16"
+matplotlib-inline = "*"
+pexpect = {version = ">4.3", markers = "sys_platform != \"win32\""}
+pickleshare = "*"
+prompt-toolkit = ">=2.0.0,<3.0.0 || >3.0.0,<3.0.1 || >3.0.1,<3.1.0"
+pygments = "*"
+traitlets = ">=4.2"
+
+[package.extras]
+all = ["Sphinx (>=1.3)", "ipykernel", "ipyparallel", "ipywidgets", "nbconvert", "nbformat", "nose (>=0.10.1)", "notebook", "numpy (>=1.17)", "pygments", "qtconsole", "requests", "testpath"]
+doc = ["Sphinx (>=1.3)"]
+kernel = ["ipykernel"]
+nbconvert = ["nbconvert"]
+nbformat = ["nbformat"]
+notebook = ["notebook", "ipywidgets"]
+parallel = ["ipyparallel"]
+qtconsole = ["qtconsole"]
+test = ["nose (>=0.10.1)", "requests", "testpath", "pygments", "nbformat", "ipykernel", "numpy (>=1.17)"]
+
+[[package]]
+name = "isodate"
+version = "0.6.1"
+description = "An ISO 8601 date/time/duration parser and formatter"
+category = "main"
+optional = true
+python-versions = "*"
+
+[package.dependencies]
+six = "*"
+
+[[package]]
+name = "jedi"
+version = "0.18.1"
+description = "An autocompletion tool for Python that can be used for text editors."
+category = "main"
+optional = true
+python-versions = ">=3.6"
+
+[package.dependencies]
+parso = ">=0.8.0,<0.9.0"
+
+[package.extras]
+qa = ["flake8 (==3.8.3)", "mypy (==0.782)"]
+testing = ["Django (<3.1)", "colorama", "docopt", "pytest (<7.0.0)"]
+
+[[package]]
+name = "jmespath"
+version = "0.10.0"
+description = "JSON Matching Expressions"
+category = "main"
+optional = true
+python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*"
+
+[[package]]
+name = "jsonlines"
+version = "3.0.0"
+description = "Library with helpers for the jsonlines file format"
+category = "main"
+optional = true
+python-versions = ">=3.6"
+
+[package.dependencies]
+attrs = ">=19.2.0"
+typing-extensions = {version = "*", markers = "python_version < \"3.8\""}
+
+[[package]]
+name = "jsonschema"
+version = "4.3.0"
+description = "An implementation of JSON Schema validation for Python"
+category = "main"
+optional = false
+python-versions = ">=3.7"
+
+[package.dependencies]
+attrs = ">=17.4.0"
+importlib-metadata = {version = "*", markers = "python_version < \"3.8\""}
+importlib-resources = {version = ">=1.4.0", markers = "python_version < \"3.9\""}
+pyrsistent = ">=0.14.0,<0.17.0 || >0.17.0,<0.17.1 || >0.17.1,<0.17.2 || >0.17.2"
+typing-extensions = {version = "*", markers = "python_version < \"3.8\""}
+
+[package.extras]
+format = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339-validator", "rfc3987", "uri-template", "webcolors (>=1.11)"]
+format_nongpl = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339-validator", "rfc3986-validator (>0.1.0)", "uri-template", "webcolors (>=1.11)"]
+
+[[package]]
+name = "jupyter-client"
+version = "7.1.1"
+description = "Jupyter protocol implementation and client libraries"
+category = "main"
+optional = true
+python-versions = ">=3.6.1"
+
+[package.dependencies]
+entrypoints = "*"
+jupyter-core = ">=4.6.0"
+nest-asyncio = ">=1.5"
+python-dateutil = ">=2.1"
+pyzmq = ">=13"
+tornado = ">=4.1"
+traitlets = "*"
+
+[package.extras]
+doc = ["myst-parser", "sphinx (>=1.3.6)", "sphinx-rtd-theme", "sphinxcontrib-github-alt"]
+test = ["codecov", "coverage", "ipykernel", "ipython", "mock", "mypy", "pre-commit", "pytest", "pytest-asyncio", "pytest-cov", "pytest-timeout", "jedi (<0.18)"]
+
+[[package]]
+name = "jupyter-core"
+version = "4.9.1"
+description = "Jupyter core package. A base package on which Jupyter projects rely."
+category = "main"
+optional = true
+python-versions = ">=3.6"
+
+[package.dependencies]
+pywin32 = {version = ">=1.0", markers = "sys_platform == \"win32\" and platform_python_implementation != \"PyPy\""}
+traitlets = "*"
+
+[[package]]
+name = "kiwisolver"
+version = "1.3.2"
+description = "A fast implementation of the Cassowary constraint solver"
+category = "main"
+optional = true
+python-versions = ">=3.7"
+
+[[package]]
+name = "linear-tsv"
+version = "1.1.0"
+description = "Line-oriented, tab-separated value format"
+category = "main"
+optional = true
+python-versions = "*"
+
+[package.dependencies]
+six = "*"
+
+[package.extras]
+develop = ["tox"]
+
+[[package]]
+name = "llvmlite"
+version = "0.34.0"
+description = "lightweight wrapper around basic LLVM functionality"
+category = "main"
+optional = true
+python-versions = ">=3.6"
+
+[[package]]
+name = "locket"
+version = "0.2.1"
+description = "File-based locks for Python for Linux and Windows"
+category = "main"
+optional = true
+python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
+
+[[package]]
+name = "matplotlib"
+version = "3.4.3"
+description = "Python plotting package"
+category = "main"
+optional = true
+python-versions = ">=3.7"
+
+[package.dependencies]
+cycler = ">=0.10"
+kiwisolver = ">=1.0.1"
+numpy = ">=1.16"
+pillow = ">=6.2.0"
+pyparsing = ">=2.2.1"
+python-dateutil = ">=2.7"
+
+[[package]]
+name = "matplotlib-inline"
+version = "0.1.3"
+description = "Inline Matplotlib backend for Jupyter"
+category = "main"
+optional = true
+python-versions = ">=3.5"
+
+[package.dependencies]
+traitlets = "*"
+
+[[package]]
+name = "mccabe"
+version = "0.6.1"
+description = "McCabe checker, plugin for flake8"
+category = "dev"
+optional = false
+python-versions = "*"
+
+[[package]]
+name = "mdf-toolbox"
+version = "0.5.12"
+description = "Materials Data Facility Python utilities"
+category = "main"
+optional = false
+python-versions = ">=3.6"
+
+[package.dependencies]
+fair-research-login = ">=0.2.4"
+globus-nexus-client = ">=0.4.1"
+globus-sdk = ">=3.1.0"
+jsonschema = "<=4.3.0"
+requests = ">=2.26.0"
+
+[[package]]
+name = "monty"
+version = "2022.1.12.1"
+description = "Monty is the missing complement to Python."
+category = "main"
+optional = true
+python-versions = ">=3.5"
+
+[package.extras]
+yaml = ["ruamel.yaml"]
+
+[[package]]
+name = "more-itertools"
+version = "8.12.0"
+description = "More routines for operating on iterables, beyond itertools"
+category = "main"
+optional = false
+python-versions = ">=3.5"
+
+[[package]]
+name = "mpmath"
+version = "1.2.1"
+description = "Python library for arbitrary-precision floating-point arithmetic"
+category = "main"
+optional = true
+python-versions = "*"
+
+[package.extras]
+develop = ["pytest (>=4.6)", "pycodestyle", "pytest-cov", "codecov", "wheel"]
+tests = ["pytest (>=4.6)"]
+
+[[package]]
+name = "natsort"
+version = "8.0.2"
+description = "Simple yet flexible natural sorting in Python."
+category = "main"
+optional = true
+python-versions = ">=3.6"
+
+[package.extras]
+fast = ["fastnumbers (>=2.0.0)"]
+icu = ["PyICU (>=1.0.0)"]
+
+[[package]]
+name = "nest-asyncio"
+version = "1.5.4"
+description = "Patch asyncio to allow nested event loops"
+category = "main"
+optional = true
+python-versions = ">=3.5"
+
+[[package]]
+name = "networkx"
+version = "2.6.3"
+description = "Python package for creating and manipulating graphs and networks"
+category = "main"
+optional = true
+python-versions = ">=3.7"
+
+[package.extras]
+default = ["numpy (>=1.19)", "scipy (>=1.5,!=1.6.1)", "matplotlib (>=3.3)", "pandas (>=1.1)"]
+developer = ["black (==21.5b1)", "pre-commit (>=2.12)"]
+doc = ["sphinx (>=4.0,<5.0)", "pydata-sphinx-theme (>=0.6,<1.0)", "sphinx-gallery (>=0.9,<1.0)", "numpydoc (>=1.1)", "pillow (>=8.2)", "nb2plots (>=0.6)", "texext (>=0.6.6)"]
+extra = ["lxml (>=4.5)", "pygraphviz (>=1.7)", "pydot (>=1.4.1)"]
+test = ["pytest (>=6.2)", "pytest-cov (>=2.12)", "codecov (>=2.1)"]
+
+[[package]]
+name = "numba"
+version = "0.51.2"
+description = "compiling Python code using LLVM"
+category = "main"
+optional = true
+python-versions = ">=3.6"
+
+[package.dependencies]
+llvmlite = ">=0.34.0.dev0,<0.35"
+numpy = ">=1.15"
+
+[[package]]
+name = "numexpr"
+version = "2.8.1"
+description = "Fast numerical expression evaluator for NumPy"
+category = "main"
+optional = true
+python-versions = "*"
+
+[package.dependencies]
+numpy = ">=1.13.3"
+packaging = "*"
+
+[[package]]
+name = "numpy"
+version = "1.21.1"
+description = "NumPy is the fundamental package for array computing with Python."
+category = "main"
+optional = true
+python-versions = ">=3.7"
+
+[[package]]
+name = "openpyxl"
+version = "3.0.9"
+description = "A Python library to read/write Excel 2010 xlsx/xlsm files"
+category = "main"
+optional = true
+python-versions = ">=3.6"
+
+[package.dependencies]
+et-xmlfile = "*"
+
+[[package]]
+name = "packaging"
+version = "21.3"
+description = "Core utilities for Python packages"
+category = "main"
+optional = true
+python-versions = ">=3.6"
+
+[package.dependencies]
+pyparsing = ">=2.0.2,<3.0.5 || >3.0.5"
+
+[[package]]
+name = "palettable"
+version = "3.3.0"
+description = "Color palettes for Python"
+category = "main"
+optional = true
+python-versions = "*"
+
+[[package]]
+name = "pandas"
+version = "1.1.5"
+description = "Powerful data structures for data analysis, time series, and statistics"
+category = "main"
+optional = true
+python-versions = ">=3.6.1"
+
+[package.dependencies]
+numpy = ">=1.15.4"
+python-dateutil = ">=2.7.3"
+pytz = ">=2017.2"
+
+[package.extras]
+test = ["pytest (>=4.0.2)", "pytest-xdist", "hypothesis (>=3.58)"]
+
+[[package]]
+name = "parso"
+version = "0.8.3"
+description = "A Python Parser"
+category = "main"
+optional = true
+python-versions = ">=3.6"
+
+[package.extras]
+qa = ["flake8 (==3.8.3)", "mypy (==0.782)"]
+testing = ["docopt", "pytest (<6.0.0)"]
+
+[[package]]
+name = "partd"
+version = "1.2.0"
+description = "Appendable key-value storage"
+category = "main"
+optional = true
+python-versions = ">=3.5"
+
+[package.dependencies]
+locket = "*"
+toolz = "*"
+
+[package.extras]
+complete = ["numpy (>=1.9.0)", "pandas (>=0.19.0)", "pyzmq", "blosc"]
+
+[[package]]
+name = "pbr"
+version = "5.8.0"
+description = "Python Build Reasonableness"
+category = "main"
+optional = false
+python-versions = ">=2.6"
+
+[[package]]
+name = "pexpect"
+version = "4.8.0"
+description = "Pexpect allows easy control of interactive console applications."
+category = "main"
+optional = true
+python-versions = "*"
+
+[package.dependencies]
+ptyprocess = ">=0.5"
+
+[[package]]
+name = "pickleshare"
+version = "0.7.5"
+description = "Tiny 'shelve'-like database with concurrency support"
+category = "main"
+optional = true
+python-versions = "*"
+
+[[package]]
+name = "pillow"
+version = "7.2.0"
+description = "Python Imaging Library (Fork)"
+category = "main"
+optional = true
+python-versions = ">=3.5"
+
+[[package]]
+name = "pint"
+version = "0.18"
+description = "Physical quantities module"
+category = "main"
+optional = true
+python-versions = ">=3.7"
+
+[package.dependencies]
+importlib-metadata = {version = "*", markers = "python_version < \"3.8\""}
+packaging = "*"
+
+[package.extras]
+numpy = ["numpy (>=1.17)"]
+test = ["pytest", "pytest-mpl", "pytest-cov", "pytest-subtests"]
+uncertainties = ["uncertainties (>=3.0)"]
+
+[[package]]
+name = "pluggy"
+version = "1.0.0"
+description = "plugin and hook calling mechanisms for python"
+category = "main"
+optional = false
+python-versions = ">=3.6"
+
+[package.dependencies]
+importlib-metadata = {version = ">=0.12", markers = "python_version < \"3.8\""}
+
+[package.extras]
+dev = ["pre-commit", "tox"]
+testing = ["pytest", "pytest-benchmark"]
+
+[[package]]
+name = "prettytable"
+version = "3.0.0"
+description = "A simple Python library for easily displaying tabular data in a visually appealing ASCII table format"
+category = "main"
+optional = true
+python-versions = ">=3.7"
+
+[package.dependencies]
+importlib-metadata = {version = "*", markers = "python_version < \"3.8\""}
+wcwidth = "*"
+
+[package.extras]
+tests = ["pytest", "pytest-cov", "pytest-lazy-fixture"]
+
+[[package]]
+name = "prompt-toolkit"
+version = "3.0.24"
+description = "Library for building powerful interactive command lines in Python"
+category = "main"
+optional = true
+python-versions = ">=3.6.2"
+
+[package.dependencies]
+wcwidth = "*"
+
+[[package]]
+name = "psutil"
+version = "5.9.0"
+description = "Cross-platform lib for process and system monitoring in Python."
+category = "main"
+optional = true
+python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
+
+[package.extras]
+test = ["ipaddress", "mock", "unittest2", "enum34", "pywin32", "wmi"]
+
+[[package]]
+name = "ptyprocess"
+version = "0.7.0"
+description = "Run a subprocess in a pseudo terminal"
+category = "main"
+optional = true
+python-versions = "*"
+
+[[package]]
+name = "py"
+version = "1.11.0"
+description = "library with cross-python path, ini-parsing, io, code, log facilities"
+category = "main"
+optional = false
+python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
+
+[[package]]
+name = "pycalphad"
+version = "0.9.2"
+description = "CALPHAD tools for designing thermodynamic models, calculating phase diagrams and investigating phase equilibria."
+category = "main"
+optional = true
+python-versions = "*"
+
+[package.dependencies]
+Cython = ">=0.24"
+importlib-metadata = "*"
+matplotlib = ">=3.3"
+numpy = ">=1.13"
+pyparsing = ">=2.4"
+pytest = "*"
+pytest-cov = "*"
+scipy = "*"
+setuptools-scm = {version = ">=6.0", extras = ["toml"]}
+symengine = "0.7.2"
+sympy = "1.8"
+tinydb = ">=3.8"
+xarray = ">=0.11.2"
+
+[[package]]
+name = "pycodestyle"
+version = "2.8.0"
+description = "Python style guide checker"
+category = "dev"
+optional = false
+python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
+
+[[package]]
+name = "pycparser"
+version = "2.21"
+description = "C parser in Python"
+category = "main"
+optional = false
+python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
+
+[[package]]
+name = "pydispatcher"
+version = "2.0.5"
+description = "Multi-producer-multi-consumer signal dispatching mechanism"
+category = "main"
+optional = true
+python-versions = "*"
+
+[[package]]
+name = "pyflakes"
+version = "2.4.0"
+description = "passive checker of Python programs"
+category = "dev"
+optional = false
+python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
+
+[[package]]
+name = "pygments"
+version = "2.11.2"
+description = "Pygments is a syntax highlighting package written in Python."
+category = "main"
+optional = true
+python-versions = ">=3.5"
+
+[[package]]
+name = "pyjwt"
+version = "2.3.0"
+description = "JSON Web Token implementation in Python"
+category = "main"
+optional = false
+python-versions = ">=3.6"
+
+[package.dependencies]
+cryptography = {version = ">=3.3.1", optional = true, markers = "extra == \"crypto\""}
+
+[package.extras]
+crypto = ["cryptography (>=3.3.1)"]
+dev = ["sphinx", "sphinx-rtd-theme", "zope.interface", "cryptography (>=3.3.1)", "pytest (>=6.0.0,<7.0.0)", "coverage[toml] (==5.0.4)", "mypy", "pre-commit"]
+docs = ["sphinx", "sphinx-rtd-theme", "zope.interface"]
+tests = ["pytest (>=6.0.0,<7.0.0)", "coverage[toml] (==5.0.4)"]
+
+[[package]]
+name = "pymatgen"
+version = "2018.12.12"
+description = "Python Materials Genomics is a robust materials analysis code that defines core object representations for structures and molecules with support for many electronic structure codes. It is currently the core analysis code powering the Materials Project (https://www.materialsproject.org)."
+category = "main"
+optional = true
+python-versions = "*"
+
+[package.dependencies]
+matplotlib = ">=1.5"
+monty = ">=0.9.6"
+networkx = ">=2.1"
+numpy = ">=1.14.3"
+palettable = ">=2.1.1"
+pandas = "*"
+pydispatcher = ">=2.0.5"
+requests = "*"
+"ruamel.yaml" = ">=0.15.6"
+scipy = ">=1.0.1"
+six = "*"
+spglib = ">=1.9.9.44"
+sympy = "*"
+tabulate = "*"
+
+[package.extras]
+abinit = ["apscheduler (==2.1.0)"]
+ase = ["ase (>=3.3)"]
+provenance = ["pybtex"]
+vis = ["vtk (>=6.0.0)"]
+
+[[package]]
+name = "pyparsing"
+version = "3.0.6"
+description = "Python parsing module"
+category = "main"
+optional = true
+python-versions = ">=3.6"
+
+[package.extras]
+diagrams = ["jinja2", "railroad-diagrams"]
+
+[[package]]
+name = "pypif"
+version = "2.1.2"
+description = "Python tools for working with the Physical Information File (PIF)"
+category = "main"
+optional = true
+python-versions = "*"
+
+[package.dependencies]
+numpy = "*"
+six = ">=1.10.0,<2"
+
+[[package]]
+name = "pyrsistent"
+version = "0.18.1"
+description = "Persistent/Functional/Immutable data structures"
+category = "main"
+optional = false
+python-versions = ">=3.7"
+
+[[package]]
+name = "pytest"
+version = "3.10.1"
+description = "pytest: simple powerful testing with Python"
+category = "main"
+optional = false
+python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
+
+[package.dependencies]
+atomicwrites = ">=1.0"
+attrs = ">=17.4.0"
+colorama = {version = "*", markers = "sys_platform == \"win32\""}
+more-itertools = ">=4.0.0"
+pluggy = ">=0.7"
+py = ">=1.5.0"
+six = ">=1.10.0"
+
+[[package]]
+name = "pytest-cov"
+version = "2.9.0"
+description = "Pytest plugin for measuring coverage."
+category = "main"
+optional = false
+python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
+
+[package.dependencies]
+coverage = ">=4.4"
+pytest = ">=3.6"
+
+[package.extras]
+testing = ["fields", "hunter", "process-tests (==2.0.2)", "six", "pytest-xdist", "virtualenv"]
+
+[[package]]
+name = "python-dateutil"
+version = "2.8.2"
+description = "Extensions to the standard Python datetime module"
+category = "main"
+optional = true
+python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7"
+
+[package.dependencies]
+six = ">=1.5"
+
+[[package]]
+name = "python-magic"
+version = "0.4.24"
+description = "File type identification using libmagic"
+category = "main"
+optional = true
+python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
+
+[[package]]
+name = "pytz"
+version = "2021.3"
+description = "World timezone definitions, modern and historical"
+category = "main"
+optional = true
+python-versions = "*"
+
+[[package]]
+name = "pywavelets"
+version = "1.2.0"
+description = "PyWavelets, wavelet transform module"
+category = "main"
+optional = true
+python-versions = ">=3.7"
+
+[package.dependencies]
+numpy = ">=1.17.3"
+
+[[package]]
+name = "pywin32"
+version = "303"
+description = "Python for Window Extensions"
+category = "main"
+optional = true
+python-versions = "*"
+
+[[package]]
+name = "pyyaml"
+version = "6.0"
+description = "YAML parser and emitter for Python"
+category = "main"
+optional = true
+python-versions = ">=3.6"
+
+[[package]]
+name = "pyzmq"
+version = "22.3.0"
+description = "Python bindings for 0MQ"
+category = "main"
+optional = true
+python-versions = ">=3.6"
+
+[package.dependencies]
+cffi = {version = "*", markers = "implementation_name == \"pypy\""}
+py = {version = "*", markers = "implementation_name == \"pypy\""}
+
+[[package]]
+name = "requests"
+version = "2.27.1"
+description = "Python HTTP for Humans."
+category = "main"
+optional = false
+python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*"
+
+[package.dependencies]
+certifi = ">=2017.4.17"
+charset-normalizer = {version = ">=2.0.0,<2.1.0", markers = "python_version >= \"3\""}
+idna = {version = ">=2.5,<4", markers = "python_version >= \"3\""}
+urllib3 = ">=1.21.1,<1.27"
+
+[package.extras]
+socks = ["PySocks (>=1.5.6,!=1.5.7)", "win-inet-pton"]
+use_chardet_on_py3 = ["chardet (>=3.0.2,<5)"]
+
+[[package]]
+name = "rfc3986"
+version = "2.0.0"
+description = "Validating URI References per RFC 3986"
+category = "main"
+optional = true
+python-versions = ">=3.7"
+
+[package.extras]
+idna2008 = ["idna"]
+
+[[package]]
+name = "ruamel.yaml"
+version = "0.17.20"
+description = "ruamel.yaml is a YAML parser/emitter that supports roundtrip preservation of comments, seq/map flow style, and map key order"
+category = "main"
+optional = true
+python-versions = ">=3"
+
+[package.dependencies]
+"ruamel.yaml.clib" = {version = ">=0.2.6", markers = "platform_python_implementation == \"CPython\" and python_version < \"3.11\""}
+
+[package.extras]
+docs = ["ryd"]
+jinja2 = ["ruamel.yaml.jinja2 (>=0.2)"]
+
+[[package]]
+name = "ruamel.yaml.clib"
+version = "0.2.6"
+description = "C version of reader, parser and emitter for ruamel.yaml derived from libyaml"
+category = "main"
+optional = true
+python-versions = ">=3.5"
+
+[[package]]
+name = "s3transfer"
+version = "0.5.0"
+description = "An Amazon S3 Transfer Manager"
+category = "main"
+optional = true
+python-versions = ">= 3.6"
+
+[package.dependencies]
+botocore = ">=1.12.36,<2.0a.0"
+
+[package.extras]
+crt = ["botocore[crt] (>=1.20.29,<2.0a.0)"]
+
+[[package]]
+name = "scikit-image"
+version = "0.19.1"
+description = "Image processing in Python"
+category = "main"
+optional = true
+python-versions = ">=3.7"
+
+[package.dependencies]
+imageio = ">=2.4.1"
+networkx = ">=2.2"
+numpy = ">=1.17.0"
+packaging = ">=20.0"
+pillow = ">=6.1.0,<7.1.0 || >7.1.0,<7.1.1 || >7.1.1,<8.3.0 || >8.3.0"
+PyWavelets = ">=1.1.1"
+scipy = ">=1.4.1"
+tifffile = ">=2019.7.26"
+
+[package.extras]
+data = ["pooch (>=1.3.0)"]
+docs = ["sphinx (>=1.8)", "sphinx-gallery (>=0.10.1)", "numpydoc (>=1.0)", "sphinx-copybutton", "pytest-runner", "scikit-learn", "matplotlib (>=3.3)", "dask[array] (>=0.15.0,!=2.17.0)", "cloudpickle (>=0.2.1)", "pandas (>=0.23.0)", "seaborn (>=0.7.1)", "pooch (>=1.3.0)", "tifffile (>=2020.5.30)", "myst-parser", "ipywidgets", "plotly (>=4.14.0)", "kaleido"]
+optional = ["simpleitk", "astropy (>=3.1.2)", "cloudpickle (>=0.2.1)", "dask[array] (>=1.0.0,!=2.17.0)", "matplotlib (>=3.0.3)", "pooch (>=1.3.0)", "pyamg", "qtpy"]
+test = ["asv", "codecov", "flake8", "matplotlib (>=3.0.3)", "pooch (>=1.3.0)", "pytest (>=5.2.0)", "pytest-cov (>=2.7.0)", "pytest-localserver", "pytest-faulthandler"]
+
+[[package]]
+name = "scipy"
+version = "1.6.1"
+description = "SciPy: Scientific Library for Python"
+category = "main"
+optional = true
+python-versions = ">=3.7"
+
+[package.dependencies]
+numpy = ">=1.16.5"
+
+[[package]]
+name = "setuptools-scm"
+version = "6.4.1"
+description = "the blessed package to manage your versions by scm tags"
+category = "main"
+optional = true
+python-versions = ">=3.6"
+
+[package.dependencies]
+packaging = ">=20.0"
+tomli = ">=1.0.0"
+
+[package.extras]
+test = ["pytest (>=6.2)", "virtualenv (>20)"]
+toml = ["setuptools (>=42)"]
+
+[[package]]
+name = "six"
+version = "1.16.0"
+description = "Python 2 and 3 compatibility utilities"
+category = "main"
+optional = false
+python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*"
+
+[[package]]
+name = "sparse"
+version = "0.13.0"
+description = "Sparse n-dimensional arrays"
+category = "main"
+optional = true
+python-versions = ">=3.6, <4"
+
+[package.dependencies]
+numba = ">=0.49"
+numpy = ">=1.17"
+scipy = ">=0.19"
+
+[package.extras]
+all = ["dask", "pytest (>=3.5)", "pytest-black", "pytest-cov", "tox", "sphinx", "sphinx-rtd-theme"]
+docs = ["sphinx", "sphinx-rtd-theme"]
+tests = ["dask", "pytest (>=3.5)", "pytest-black", "pytest-cov"]
+tox = ["dask", "pytest (>=3.5)", "pytest-black", "pytest-cov", "tox"]
+
+[[package]]
+name = "spglib"
+version = "1.16.3"
+description = "This is the spglib module."
+category = "main"
+optional = true
+python-versions = "*"
+
+[package.dependencies]
+numpy = "*"
+
+[[package]]
+name = "sqlalchemy"
+version = "1.4.29"
+description = "Database Abstraction Library"
+category = "main"
+optional = true
+python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7"
+
+[package.dependencies]
+greenlet = {version = "!=0.4.17", markers = "python_version >= \"3\" and (platform_machine == \"aarch64\" or platform_machine == \"ppc64le\" or platform_machine == \"x86_64\" or platform_machine == \"amd64\" or platform_machine == \"AMD64\" or platform_machine == \"win32\" or platform_machine == \"WIN32\")"}
+importlib-metadata = {version = "*", markers = "python_version < \"3.8\""}
+
+[package.extras]
+aiomysql = ["greenlet (!=0.4.17)", "aiomysql"]
+aiosqlite = ["typing_extensions (!=3.10.0.1)", "greenlet (!=0.4.17)", "aiosqlite"]
+asyncio = ["greenlet (!=0.4.17)"]
+asyncmy = ["greenlet (!=0.4.17)", "asyncmy (>=0.2.3)"]
+mariadb_connector = ["mariadb (>=1.0.1)"]
+mssql = ["pyodbc"]
+mssql_pymssql = ["pymssql"]
+mssql_pyodbc = ["pyodbc"]
+mypy = ["sqlalchemy2-stubs", "mypy (>=0.910)"]
+mysql = ["mysqlclient (>=1.4.0,<2)", "mysqlclient (>=1.4.0)"]
+mysql_connector = ["mysql-connector-python"]
+oracle = ["cx_oracle (>=7,<8)", "cx_oracle (>=7)"]
+postgresql = ["psycopg2 (>=2.7)"]
+postgresql_asyncpg = ["greenlet (!=0.4.17)", "asyncpg"]
+postgresql_pg8000 = ["pg8000 (>=1.16.6)"]
+postgresql_psycopg2binary = ["psycopg2-binary"]
+postgresql_psycopg2cffi = ["psycopg2cffi"]
+pymysql = ["pymysql (<1)", "pymysql"]
+sqlcipher = ["sqlcipher3-binary"]
+
+[[package]]
+name = "stevedore"
+version = "1.32.0"
+description = "Manage dynamic plugins for Python applications"
+category = "main"
+optional = false
+python-versions = "*"
+
+[package.dependencies]
+pbr = ">=2.0.0,<2.1.0 || >2.1.0"
+six = ">=1.10.0"
+
+[[package]]
+name = "symengine"
+version = "0.7.2"
+description = "Python library providing wrappers to SymEngine"
+category = "main"
+optional = true
+python-versions = ">=3.6.*,<4"
+
+[[package]]
+name = "sympy"
+version = "1.8"
+description = "Computer algebra system (CAS) in Python"
+category = "main"
+optional = true
+python-versions = ">=3.6"
+
+[package.dependencies]
+mpmath = ">=0.19"
+
+[[package]]
+name = "tableschema"
+version = "1.20.2"
+description = "A utility library for working with Table Schema in Python"
+category = "main"
+optional = true
+python-versions = "*"
+
+[package.dependencies]
+cached-property = ">=1.5"
+click = ">=3.3"
+isodate = ">=0.5.4"
+jsonschema = ">=2.5"
+python-dateutil = ">=2.4"
+requests = ">=2.5"
+rfc3986 = ">=1.1.0"
+six = ">=1.9"
+tabulator = ">=1.51.3"
+unicodecsv = ">=0.14"
+
+[package.extras]
+develop = ["mock", "pylama", "pytest", "pytest-cov"]
+
+[[package]]
+name = "tabulate"
+version = "0.8.9"
+description = "Pretty-print tabular data"
+category = "main"
+optional = true
+python-versions = "*"
+
+[package.extras]
+widechars = ["wcwidth"]
+
+[[package]]
+name = "tabulator"
+version = "1.53.5"
+description = "Consistent interface for stream reading and writing tabular data (csv/xls/json/etc)"
+category = "main"
+optional = true
+python-versions = "*"
+
+[package.dependencies]
+boto3 = ">=1.9"
+chardet = ">=3.0"
+click = ">=6.0"
+ijson = ">=3.0.3"
+jsonlines = ">=1.1"
+linear-tsv = ">=1.0"
+openpyxl = ">=2.6"
+requests = ">=2.8"
+six = ">=1.9"
+sqlalchemy = ">=0.9.6"
+unicodecsv = ">=0.14"
+xlrd = ">=1.0"
+
+[package.extras]
+cchardet = ["cchardet (>=2.0)"]
+datapackage = ["datapackage (>=1.12)"]
+develop = ["mock", "pylama", "pytest", "pytest-cov", "moto"]
+html = ["pyquery (<1.4.2)"]
+ods = ["ezodf (>=0.3)", "lxml (>=3.0)"]
+
+[[package]]
+name = "tifffile"
+version = "2021.11.2"
+description = "Read and write TIFF files"
+category = "main"
+optional = true
+python-versions = ">=3.7"
+
+[package.dependencies]
+numpy = ">=1.15.1"
+
+[package.extras]
+all = ["imagecodecs (>=2021.7.30)", "matplotlib (>=3.2)", "lxml"]
+
+[[package]]
+name = "tinydb"
+version = "4.6.1"
+description = "TinyDB is a tiny, document oriented database optimized for your happiness :)"
+category = "main"
+optional = true
+python-versions = ">=3.6,<4.0"
+
+[package.dependencies]
+typing-extensions = {version = ">=3.10.0,<5.0.0", markers = "python_version <= \"3.7\""}
+
+[[package]]
+name = "tomli"
+version = "2.0.0"
+description = "A lil' TOML parser"
+category = "main"
+optional = true
+python-versions = ">=3.7"
+
+[[package]]
+name = "toolz"
+version = "0.11.2"
+description = "List processing tools and functional utilities"
+category = "main"
+optional = true
+python-versions = ">=3.5"
+
+[[package]]
+name = "tornado"
+version = "6.1"
+description = "Tornado is a Python web framework and asynchronous networking library, originally developed at FriendFeed."
+category = "main"
+optional = true
+python-versions = ">= 3.5"
+
+[[package]]
+name = "tqdm"
+version = "4.62.3"
+description = "Fast, Extensible Progress Meter"
+category = "main"
+optional = true
+python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,>=2.7"
+
+[package.dependencies]
+colorama = {version = "*", markers = "platform_system == \"Windows\""}
+
+[package.extras]
+dev = ["py-make (>=0.1.0)", "twine", "wheel"]
+notebook = ["ipywidgets (>=6)"]
+telegram = ["requests"]
+
+[[package]]
+name = "traitlets"
+version = "5.1.1"
+description = "Traitlets Python configuration system"
+category = "main"
+optional = true
+python-versions = ">=3.7"
+
+[package.extras]
+test = ["pytest"]
+
+[[package]]
+name = "traits"
+version = "6.3.2"
+description = "Observable typed attributes for Python classes"
+category = "main"
+optional = true
+python-versions = ">=3.6"
+
+[package.extras]
+docs = ["enthought-sphinx-theme", "Sphinx (>=2.1.0,!=3.2.0)"]
+examples = ["numpy", "pillow"]
+test = ["cython", "flake8", "flake8-ets", "mypy", "pyface", "setuptools", "Sphinx (>=2.1.0,!=3.2.0)", "traitsui", "numpy", "pyside2"]
+
+[[package]]
+name = "typing-extensions"
+version = "4.0.1"
+description = "Backported and Experimental Type Hints for Python 3.6+"
+category = "main"
+optional = false
+python-versions = ">=3.6"
+
+[[package]]
+name = "unicodecsv"
+version = "0.14.1"
+description = "Python2's stdlib csv module is nice, but it doesn't support unicode. This module is a drop-in replacement which *does*."
+category = "main"
+optional = true
+python-versions = "*"
+
+[[package]]
+name = "urllib3"
+version = "1.26.8"
+description = "HTTP library with thread-safe connection pooling, file post, and more."
+category = "main"
+optional = false
+python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, <4"
+
+[package.extras]
+brotli = ["brotlipy (>=0.6.0)"]
+secure = ["pyOpenSSL (>=0.14)", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "certifi", "ipaddress"]
+socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"]
+
+[[package]]
+name = "wcwidth"
+version = "0.2.5"
+description = "Measures the displayed width of unicode strings in a terminal"
+category = "main"
+optional = true
+python-versions = "*"
+
+[[package]]
+name = "xarray"
+version = "0.20.2"
+description = "N-D labeled arrays and datasets in Python"
+category = "main"
+optional = true
+python-versions = ">=3.7"
+
+[package.dependencies]
+importlib-metadata = {version = "*", markers = "python_version < \"3.8\""}
+numpy = ">=1.18"
+pandas = ">=1.1"
+typing-extensions = {version = ">=3.7", markers = "python_version < \"3.8\""}
+
+[package.extras]
+accel = ["scipy", "bottleneck", "numbagg"]
+complete = ["netcdf4", "h5netcdf", "scipy", "pydap", "zarr", "fsspec", "cftime", "rasterio", "cfgrib", "pooch", "bottleneck", "numbagg", "dask", "matplotlib", "seaborn", "nc-time-axis"]
+docs = ["netcdf4", "h5netcdf", "scipy", "pydap", "zarr", "fsspec", "cftime", "rasterio", "cfgrib", "pooch", "bottleneck", "numbagg", "dask", "matplotlib", "seaborn", "nc-time-axis", "sphinx-autosummary-accessors", "sphinx-rtd-theme", "ipython", "ipykernel", "jupyter-client", "nbsphinx", "scanpydoc"]
+io = ["netcdf4", "h5netcdf", "scipy", "pydap", "zarr", "fsspec", "cftime", "rasterio", "cfgrib", "pooch"]
+parallel = ["dask"]
+viz = ["matplotlib", "seaborn", "nc-time-axis"]
+
+[[package]]
+name = "xlrd"
+version = "2.0.1"
+description = "Library for developers to extract data from Microsoft Excel (tm) .xls spreadsheet files"
+category = "main"
+optional = true
+python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*"
+
+[package.extras]
+build = ["wheel", "twine"]
+docs = ["sphinx"]
+test = ["pytest", "pytest-cov"]
+
+[[package]]
+name = "xmltodict"
+version = "0.12.0"
+description = "Makes working with XML feel like you are working with JSON"
+category = "main"
+optional = true
+python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
+
+[[package]]
+name = "zipp"
+version = "3.7.0"
+description = "Backport of pathlib-compatible object wrapper for zip files"
+category = "main"
+optional = false
+python-versions = ">=3.7"
+
+[package.extras]
+docs = ["sphinx", "jaraco.packaging (>=8.2)", "rst.linker (>=1.9)"]
+testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest-cov", "pytest-enabler (>=1.0.1)", "jaraco.itertools", "func-timeout", "pytest-black (>=0.3.7)", "pytest-mypy"]
+
+[extras]
+all = ["ase", "pymatgen", "tableschema", "dfttopif", "hyperspy", "python-magic", "Pillow", "xmltodict", "pycalphad"]
+ase = ["ase"]
+crystal_structure = ["pymatgen", "ase"]
+csv = ["tableschema"]
+dft = ["dfttopif"]
+electron_microscopy = ["hyperspy"]
+file = ["python-magic"]
+image = ["Pillow"]
+tdb = ["pycalphad"]
+xml = ["xmltodict"]
+
+[metadata]
+lock-version = "1.1"
+python-versions = "^3.7"
+content-hash = "780ef63037effe28f8bdf541936535a1093e28b6abc3508cee4935603a09d3d8"
+
+[metadata.files]
+appnope = [
+    {file = "appnope-0.1.2-py2.py3-none-any.whl", hash = "sha256:93aa393e9d6c54c5cd570ccadd8edad61ea0c4b9ea7a01409020c9aa019eb442"},
+    {file = "appnope-0.1.2.tar.gz", hash = "sha256:dd83cd4b5b460958838f6eb3000c660b1f9caf2a5b1de4264e941512f603258a"},
+]
+ase = [
+    {file = "ase-3.19.3-py3-none-any.whl", hash = "sha256:4cb2dc9c9c7a2724d17e0da09d3e02defb42214ff11952a243b3dcf3875dafdf"},
+    {file = "ase-3.19.3.tar.gz", hash = "sha256:27c378b983dfacd49398236e7232c28590c218c31bb2205695818552c772bc4b"},
+]
+atomicwrites = [
+    {file = "atomicwrites-1.4.0-py2.py3-none-any.whl", hash = "sha256:6d1784dea7c0c8d4a5172b6c620f40b6e4cbfdf96d783691f2e1302a7b88e197"},
+    {file = "atomicwrites-1.4.0.tar.gz", hash = "sha256:ae70396ad1a434f9c7046fd2dd196fc04b12f9e91ffb859164193be8b6168a7a"},
+]
+attrs = [
+    {file = "attrs-21.4.0-py2.py3-none-any.whl", hash = "sha256:2d27e3784d7a565d36ab851fe94887c5eccd6a463168875832a1be79c82828b4"},
+    {file = "attrs-21.4.0.tar.gz", hash = "sha256:626ba8234211db98e869df76230a137c4c40a12d72445c45d5f5b716f076e2fd"},
+]
+backcall = [
+    {file = "backcall-0.2.0-py2.py3-none-any.whl", hash = "sha256:fbbce6a29f263178a1f7915c1940bde0ec2b2a967566fe1c65c1dfb7422bd255"},
+    {file = "backcall-0.2.0.tar.gz", hash = "sha256:5cbdbf27be5e7cfadb448baf0aa95508f91f2bbc6c6437cd9cd06e2a4c215e1e"},
+]
+boto3 = [
+    {file = "boto3-1.20.37-py3-none-any.whl", hash = "sha256:55c7004af4296648ee497417dfc454d9c39770c265f67e28e1c5f10e11f3b644"},
+    {file = "boto3-1.20.37.tar.gz", hash = "sha256:0e2f8aa8ee71f144d8afbe9ff7d0bb40525b94535e0695bdb200687970c9f452"},
+]
+botocore = [
+    {file = "botocore-1.23.37-py3-none-any.whl", hash = "sha256:9ea3eb6e507684900418ad100e5accd1d98979d41c49bacf15f970f0d72f75d4"},
+    {file = "botocore-1.23.37.tar.gz", hash = "sha256:f3077f1ca19e6ab6b7a84c61e01e136a97c7732078a8d806908aee44f1042f5f"},
+]
+cached-property = [
+    {file = "cached-property-1.5.2.tar.gz", hash = "sha256:9fa5755838eecbb2d234c3aa390bd80fbd3ac6b6869109bfc1b499f7bd89a130"},
+    {file = "cached_property-1.5.2-py2.py3-none-any.whl", hash = "sha256:df4f613cf7ad9a588cc381aaf4a512d26265ecebd5eb9e1ba12f1319eb85a6a0"},
+]
+certifi = [
+    {file = "certifi-2021.10.8-py2.py3-none-any.whl", hash = "sha256:d62a0163eb4c2344ac042ab2bdf75399a71a2d8c7d47eac2e2ee91b9d6339569"},
+    {file = "certifi-2021.10.8.tar.gz", hash = "sha256:78884e7c1d4b00ce3cea67b44566851c4343c120abd683433ce934a68ea58872"},
+]
+cffi = [
+    {file = "cffi-1.15.0-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:c2502a1a03b6312837279c8c1bd3ebedf6c12c4228ddbad40912d671ccc8a962"},
+    {file = "cffi-1.15.0-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:23cfe892bd5dd8941608f93348c0737e369e51c100d03718f108bf1add7bd6d0"},
+    {file = "cffi-1.15.0-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:41d45de54cd277a7878919867c0f08b0cf817605e4eb94093e7516505d3c8d14"},
+    {file = "cffi-1.15.0-cp27-cp27m-win32.whl", hash = "sha256:4a306fa632e8f0928956a41fa8e1d6243c71e7eb59ffbd165fc0b41e316b2474"},
+    {file = "cffi-1.15.0-cp27-cp27m-win_amd64.whl", hash = "sha256:e7022a66d9b55e93e1a845d8c9eba2a1bebd4966cd8bfc25d9cd07d515b33fa6"},
+    {file = "cffi-1.15.0-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:14cd121ea63ecdae71efa69c15c5543a4b5fbcd0bbe2aad864baca0063cecf27"},
+    {file = "cffi-1.15.0-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:d4d692a89c5cf08a8557fdeb329b82e7bf609aadfaed6c0d79f5a449a3c7c023"},
+    {file = "cffi-1.15.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0104fb5ae2391d46a4cb082abdd5c69ea4eab79d8d44eaaf79f1b1fd806ee4c2"},
+    {file = "cffi-1.15.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:91ec59c33514b7c7559a6acda53bbfe1b283949c34fe7440bcf917f96ac0723e"},
+    {file = "cffi-1.15.0-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:f5c7150ad32ba43a07c4479f40241756145a1f03b43480e058cfd862bf5041c7"},
+    {file = "cffi-1.15.0-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:00c878c90cb53ccfaae6b8bc18ad05d2036553e6d9d1d9dbcf323bbe83854ca3"},
+    {file = "cffi-1.15.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:abb9a20a72ac4e0fdb50dae135ba5e77880518e742077ced47eb1499e29a443c"},
+    {file = "cffi-1.15.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a5263e363c27b653a90078143adb3d076c1a748ec9ecc78ea2fb916f9b861962"},
+    {file = "cffi-1.15.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f54a64f8b0c8ff0b64d18aa76675262e1700f3995182267998c31ae974fbc382"},
+    {file = "cffi-1.15.0-cp310-cp310-win32.whl", hash = "sha256:c21c9e3896c23007803a875460fb786118f0cdd4434359577ea25eb556e34c55"},
+    {file = "cffi-1.15.0-cp310-cp310-win_amd64.whl", hash = "sha256:5e069f72d497312b24fcc02073d70cb989045d1c91cbd53979366077959933e0"},
+    {file = "cffi-1.15.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:64d4ec9f448dfe041705426000cc13e34e6e5bb13736e9fd62e34a0b0c41566e"},
+    {file = "cffi-1.15.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2756c88cbb94231c7a147402476be2c4df2f6078099a6f4a480d239a8817ae39"},
+    {file = "cffi-1.15.0-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3b96a311ac60a3f6be21d2572e46ce67f09abcf4d09344c49274eb9e0bf345fc"},
+    {file = "cffi-1.15.0-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:75e4024375654472cc27e91cbe9eaa08567f7fbdf822638be2814ce059f58032"},
+    {file = "cffi-1.15.0-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:59888172256cac5629e60e72e86598027aca6bf01fa2465bdb676d37636573e8"},
+    {file = "cffi-1.15.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:27c219baf94952ae9d50ec19651a687b826792055353d07648a5695413e0c605"},
+    {file = "cffi-1.15.0-cp36-cp36m-win32.whl", hash = "sha256:4958391dbd6249d7ad855b9ca88fae690783a6be9e86df65865058ed81fc860e"},
+    {file = "cffi-1.15.0-cp36-cp36m-win_amd64.whl", hash = "sha256:f6f824dc3bce0edab5f427efcfb1d63ee75b6fcb7282900ccaf925be84efb0fc"},
+    {file = "cffi-1.15.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:06c48159c1abed75c2e721b1715c379fa3200c7784271b3c46df01383b593636"},
+    {file = "cffi-1.15.0-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:c2051981a968d7de9dd2d7b87bcb9c939c74a34626a6e2f8181455dd49ed69e4"},
+    {file = "cffi-1.15.0-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:fd8a250edc26254fe5b33be00402e6d287f562b6a5b2152dec302fa15bb3e997"},
+    {file = "cffi-1.15.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:91d77d2a782be4274da750752bb1650a97bfd8f291022b379bb8e01c66b4e96b"},
+    {file = "cffi-1.15.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:45db3a33139e9c8f7c09234b5784a5e33d31fd6907800b316decad50af323ff2"},
+    {file = "cffi-1.15.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:263cc3d821c4ab2213cbe8cd8b355a7f72a8324577dc865ef98487c1aeee2bc7"},
+    {file = "cffi-1.15.0-cp37-cp37m-win32.whl", hash = "sha256:17771976e82e9f94976180f76468546834d22a7cc404b17c22df2a2c81db0c66"},
+    {file = "cffi-1.15.0-cp37-cp37m-win_amd64.whl", hash = "sha256:3415c89f9204ee60cd09b235810be700e993e343a408693e80ce7f6a40108029"},
+    {file = "cffi-1.15.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:4238e6dab5d6a8ba812de994bbb0a79bddbdf80994e4ce802b6f6f3142fcc880"},
+    {file = "cffi-1.15.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:0808014eb713677ec1292301ea4c81ad277b6cdf2fdd90fd540af98c0b101d20"},
+    {file = "cffi-1.15.0-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:57e9ac9ccc3101fac9d6014fba037473e4358ef4e89f8e181f8951a2c0162024"},
+    {file = "cffi-1.15.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8b6c2ea03845c9f501ed1313e78de148cd3f6cad741a75d43a29b43da27f2e1e"},
+    {file = "cffi-1.15.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:10dffb601ccfb65262a27233ac273d552ddc4d8ae1bf93b21c94b8511bffe728"},
+    {file = "cffi-1.15.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:786902fb9ba7433aae840e0ed609f45c7bcd4e225ebb9c753aa39725bb3e6ad6"},
+    {file = "cffi-1.15.0-cp38-cp38-win32.whl", hash = "sha256:da5db4e883f1ce37f55c667e5c0de439df76ac4cb55964655906306918e7363c"},
+    {file = "cffi-1.15.0-cp38-cp38-win_amd64.whl", hash = "sha256:181dee03b1170ff1969489acf1c26533710231c58f95534e3edac87fff06c443"},
+    {file = "cffi-1.15.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:45e8636704eacc432a206ac7345a5d3d2c62d95a507ec70d62f23cd91770482a"},
+    {file = "cffi-1.15.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:31fb708d9d7c3f49a60f04cf5b119aeefe5644daba1cd2a0fe389b674fd1de37"},
+    {file = "cffi-1.15.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:6dc2737a3674b3e344847c8686cf29e500584ccad76204efea14f451d4cc669a"},
+    {file = "cffi-1.15.0-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:74fdfdbfdc48d3f47148976f49fab3251e550a8720bebc99bf1483f5bfb5db3e"},
+    {file = "cffi-1.15.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ffaa5c925128e29efbde7301d8ecaf35c8c60ffbcd6a1ffd3a552177c8e5e796"},
+    {file = "cffi-1.15.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3f7d084648d77af029acb79a0ff49a0ad7e9d09057a9bf46596dac9514dc07df"},
+    {file = "cffi-1.15.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ef1f279350da2c586a69d32fc8733092fd32cc8ac95139a00377841f59a3f8d8"},
+    {file = "cffi-1.15.0-cp39-cp39-win32.whl", hash = "sha256:2a23af14f408d53d5e6cd4e3d9a24ff9e05906ad574822a10563efcef137979a"},
+    {file = "cffi-1.15.0-cp39-cp39-win_amd64.whl", hash = "sha256:3773c4d81e6e818df2efbc7dd77325ca0dcb688116050fb2b3011218eda36139"},
+    {file = "cffi-1.15.0.tar.gz", hash = "sha256:920f0d66a896c2d99f0adbb391f990a84091179542c205fa53ce5787aff87954"},
+]
+chardet = [
+    {file = "chardet-4.0.0-py2.py3-none-any.whl", hash = "sha256:f864054d66fd9118f2e67044ac8981a54775ec5b67aed0441892edb553d21da5"},
+    {file = "chardet-4.0.0.tar.gz", hash = "sha256:0d6f53a15db4120f2b08c94f11e7d93d2c911ee118b6b30a04ec3ee8310179fa"},
+]
+charset-normalizer = [
+    {file = "charset-normalizer-2.0.10.tar.gz", hash = "sha256:876d180e9d7432c5d1dfd4c5d26b72f099d503e8fcc0feb7532c9289be60fcbd"},
+    {file = "charset_normalizer-2.0.10-py3-none-any.whl", hash = "sha256:cb957888737fc0bbcd78e3df769addb41fd1ff8cf950dc9e7ad7793f1bf44455"},
+]
+click = [
+    {file = "click-8.0.3-py3-none-any.whl", hash = "sha256:353f466495adaeb40b6b5f592f9f91cb22372351c84caeb068132442a4518ef3"},
+    {file = "click-8.0.3.tar.gz", hash = "sha256:410e932b050f5eed773c4cda94de75971c89cdb3155a72a0831139a79e5ecb5b"},
+]
+cloudpickle = [
+    {file = "cloudpickle-2.0.0-py3-none-any.whl", hash = "sha256:6b2df9741d06f43839a3275c4e6632f7df6487a1f181f5f46a052d3c917c3d11"},
+    {file = "cloudpickle-2.0.0.tar.gz", hash = "sha256:5cd02f3b417a783ba84a4ec3e290ff7929009fe51f6405423cfccfadd43ba4a4"},
+]
+colorama = [
+    {file = "colorama-0.4.4-py2.py3-none-any.whl", hash = "sha256:9f47eda37229f68eee03b24b9748937c7dc3868f906e8ba69fbcbdd3bc5dc3e2"},
+    {file = "colorama-0.4.4.tar.gz", hash = "sha256:5941b2b48a20143d2267e95b1c2a7603ce057ee39fd88e7329b0c292aa16869b"},
+]
+coverage = [
+    {file = "coverage-6.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6dbc1536e105adda7a6312c778f15aaabe583b0e9a0b0a324990334fd458c94b"},
+    {file = "coverage-6.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:174cf9b4bef0db2e8244f82059a5a72bd47e1d40e71c68ab055425172b16b7d0"},
+    {file = "coverage-6.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:92b8c845527eae547a2a6617d336adc56394050c3ed8a6918683646328fbb6da"},
+    {file = "coverage-6.2-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:c7912d1526299cb04c88288e148c6c87c0df600eca76efd99d84396cfe00ef1d"},
+    {file = "coverage-6.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d5d2033d5db1d58ae2d62f095e1aefb6988af65b4b12cb8987af409587cc0739"},
+    {file = "coverage-6.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:3feac4084291642165c3a0d9eaebedf19ffa505016c4d3db15bfe235718d4971"},
+    {file = "coverage-6.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:276651978c94a8c5672ea60a2656e95a3cce2a3f31e9fb2d5ebd4c215d095840"},
+    {file = "coverage-6.2-cp310-cp310-win32.whl", hash = "sha256:f506af4f27def639ba45789fa6fde45f9a217da0be05f8910458e4557eed020c"},
+    {file = "coverage-6.2-cp310-cp310-win_amd64.whl", hash = "sha256:3f7c17209eef285c86f819ff04a6d4cbee9b33ef05cbcaae4c0b4e8e06b3ec8f"},
+    {file = "coverage-6.2-cp311-cp311-macosx_10_14_x86_64.whl", hash = "sha256:13362889b2d46e8d9f97c421539c97c963e34031ab0cb89e8ca83a10cc71ac76"},
+    {file = "coverage-6.2-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:22e60a3ca5acba37d1d4a2ee66e051f5b0e1b9ac950b5b0cf4aa5366eda41d47"},
+    {file = "coverage-6.2-cp311-cp311-win_amd64.whl", hash = "sha256:b637c57fdb8be84e91fac60d9325a66a5981f8086c954ea2772efe28425eaf64"},
+    {file = "coverage-6.2-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:f467bbb837691ab5a8ca359199d3429a11a01e6dfb3d9dcc676dc035ca93c0a9"},
+    {file = "coverage-6.2-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2641f803ee9f95b1f387f3e8f3bf28d83d9b69a39e9911e5bfee832bea75240d"},
+    {file = "coverage-6.2-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:1219d760ccfafc03c0822ae2e06e3b1248a8e6d1a70928966bafc6838d3c9e48"},
+    {file = "coverage-6.2-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:9a2b5b52be0a8626fcbffd7e689781bf8c2ac01613e77feda93d96184949a98e"},
+    {file = "coverage-6.2-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:8e2c35a4c1f269704e90888e56f794e2d9c0262fb0c1b1c8c4ee44d9b9e77b5d"},
+    {file = "coverage-6.2-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:5d6b09c972ce9200264c35a1d53d43ca55ef61836d9ec60f0d44273a31aa9f17"},
+    {file = "coverage-6.2-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:e3db840a4dee542e37e09f30859f1612da90e1c5239a6a2498c473183a50e781"},
+    {file = "coverage-6.2-cp36-cp36m-win32.whl", hash = "sha256:4e547122ca2d244f7c090fe3f4b5a5861255ff66b7ab6d98f44a0222aaf8671a"},
+    {file = "coverage-6.2-cp36-cp36m-win_amd64.whl", hash = "sha256:01774a2c2c729619760320270e42cd9e797427ecfddd32c2a7b639cdc481f3c0"},
+    {file = "coverage-6.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:fb8b8ee99b3fffe4fd86f4c81b35a6bf7e4462cba019997af2fe679365db0c49"},
+    {file = "coverage-6.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:619346d57c7126ae49ac95b11b0dc8e36c1dd49d148477461bb66c8cf13bb521"},
+    {file = "coverage-6.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:0a7726f74ff63f41e95ed3a89fef002916c828bb5fcae83b505b49d81a066884"},
+    {file = "coverage-6.2-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:cfd9386c1d6f13b37e05a91a8583e802f8059bebfccde61a418c5808dea6bbfa"},
+    {file = "coverage-6.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:17e6c11038d4ed6e8af1407d9e89a2904d573be29d51515f14262d7f10ef0a64"},
+    {file = "coverage-6.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:c254b03032d5a06de049ce8bca8338a5185f07fb76600afff3c161e053d88617"},
+    {file = "coverage-6.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:dca38a21e4423f3edb821292e97cec7ad38086f84313462098568baedf4331f8"},
+    {file = "coverage-6.2-cp37-cp37m-win32.whl", hash = "sha256:600617008aa82032ddeace2535626d1bc212dfff32b43989539deda63b3f36e4"},
+    {file = "coverage-6.2-cp37-cp37m-win_amd64.whl", hash = "sha256:bf154ba7ee2fd613eb541c2bc03d3d9ac667080a737449d1a3fb342740eb1a74"},
+    {file = "coverage-6.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:f9afb5b746781fc2abce26193d1c817b7eb0e11459510fba65d2bd77fe161d9e"},
+    {file = "coverage-6.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:edcada2e24ed68f019175c2b2af2a8b481d3d084798b8c20d15d34f5c733fa58"},
+    {file = "coverage-6.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:a9c8c4283e17690ff1a7427123ffb428ad6a52ed720d550e299e8291e33184dc"},
+    {file = "coverage-6.2-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f614fc9956d76d8a88a88bb41ddc12709caa755666f580af3a688899721efecd"},
+    {file = "coverage-6.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:9365ed5cce5d0cf2c10afc6add145c5037d3148585b8ae0e77cc1efdd6aa2953"},
+    {file = "coverage-6.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:8bdfe9ff3a4ea37d17f172ac0dff1e1c383aec17a636b9b35906babc9f0f5475"},
+    {file = "coverage-6.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:63c424e6f5b4ab1cf1e23a43b12f542b0ec2e54f99ec9f11b75382152981df57"},
+    {file = "coverage-6.2-cp38-cp38-win32.whl", hash = "sha256:49dbff64961bc9bdd2289a2bda6a3a5a331964ba5497f694e2cbd540d656dc1c"},
+    {file = "coverage-6.2-cp38-cp38-win_amd64.whl", hash = "sha256:9a29311bd6429be317c1f3fe4bc06c4c5ee45e2fa61b2a19d4d1d6111cb94af2"},
+    {file = "coverage-6.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:03b20e52b7d31be571c9c06b74746746d4eb82fc260e594dc662ed48145e9efd"},
+    {file = "coverage-6.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:215f8afcc02a24c2d9a10d3790b21054b58d71f4b3c6f055d4bb1b15cecce685"},
+    {file = "coverage-6.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:a4bdeb0a52d1d04123b41d90a4390b096f3ef38eee35e11f0b22c2d031222c6c"},
+    {file = "coverage-6.2-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:c332d8f8d448ded473b97fefe4a0983265af21917d8b0cdcb8bb06b2afe632c3"},
+    {file = "coverage-6.2-cp39-cp39-win32.whl", hash = "sha256:6e1394d24d5938e561fbeaa0cd3d356207579c28bd1792f25a068743f2d5b282"},
+    {file = "coverage-6.2-cp39-cp39-win_amd64.whl", hash = "sha256:86f2e78b1eff847609b1ca8050c9e1fa3bd44ce755b2ec30e70f2d3ba3844644"},
+    {file = "coverage-6.2-pp36.pp37.pp38-none-any.whl", hash = "sha256:5829192582c0ec8ca4a2532407bc14c2f338d9878a10442f5d03804a95fac9de"},
+    {file = "coverage-6.2.tar.gz", hash = "sha256:e2cad8093172b7d1595b4ad66f24270808658e11acf43a8f95b41276162eb5b8"},
+]
+coveralls = [
+    {file = "coveralls-3.3.1-py2.py3-none-any.whl", hash = "sha256:f42015f31d386b351d4226389b387ae173207058832fbf5c8ec4b40e27b16026"},
+    {file = "coveralls-3.3.1.tar.gz", hash = "sha256:b32a8bb5d2df585207c119d6c01567b81fba690c9c10a753bfe27a335bfc43ea"},
+]
+cryptography = [
+    {file = "cryptography-36.0.1-cp36-abi3-macosx_10_10_universal2.whl", hash = "sha256:73bc2d3f2444bcfeac67dd130ff2ea598ea5f20b40e36d19821b4df8c9c5037b"},
+    {file = "cryptography-36.0.1-cp36-abi3-macosx_10_10_x86_64.whl", hash = "sha256:2d87cdcb378d3cfed944dac30596da1968f88fb96d7fc34fdae30a99054b2e31"},
+    {file = "cryptography-36.0.1-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:74d6c7e80609c0f4c2434b97b80c7f8fdfaa072ca4baab7e239a15d6d70ed73a"},
+    {file = "cryptography-36.0.1-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:6c0c021f35b421ebf5976abf2daacc47e235f8b6082d3396a2fe3ccd537ab173"},
+    {file = "cryptography-36.0.1-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5d59a9d55027a8b88fd9fd2826c4392bd487d74bf628bb9d39beecc62a644c12"},
+    {file = "cryptography-36.0.1-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0a817b961b46894c5ca8a66b599c745b9a3d9f822725221f0e0fe49dc043a3a3"},
+    {file = "cryptography-36.0.1-cp36-abi3-manylinux_2_24_x86_64.whl", hash = "sha256:94ae132f0e40fe48f310bba63f477f14a43116f05ddb69d6fa31e93f05848ae2"},
+    {file = "cryptography-36.0.1-cp36-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:7be0eec337359c155df191d6ae00a5e8bbb63933883f4f5dffc439dac5348c3f"},
+    {file = "cryptography-36.0.1-cp36-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:e0344c14c9cb89e76eb6a060e67980c9e35b3f36691e15e1b7a9e58a0a6c6dc3"},
+    {file = "cryptography-36.0.1-cp36-abi3-win32.whl", hash = "sha256:4caa4b893d8fad33cf1964d3e51842cd78ba87401ab1d2e44556826df849a8ca"},
+    {file = "cryptography-36.0.1-cp36-abi3-win_amd64.whl", hash = "sha256:391432971a66cfaf94b21c24ab465a4cc3e8bf4a939c1ca5c3e3a6e0abebdbcf"},
+    {file = "cryptography-36.0.1-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:bb5829d027ff82aa872d76158919045a7c1e91fbf241aec32cb07956e9ebd3c9"},
+    {file = "cryptography-36.0.1-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ebc15b1c22e55c4d5566e3ca4db8689470a0ca2babef8e3a9ee057a8b82ce4b1"},
+    {file = "cryptography-36.0.1-pp37-pypy37_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:596f3cd67e1b950bc372c33f1a28a0692080625592ea6392987dba7f09f17a94"},
+    {file = "cryptography-36.0.1-pp38-pypy38_pp73-macosx_10_10_x86_64.whl", hash = "sha256:30ee1eb3ebe1644d1c3f183d115a8c04e4e603ed6ce8e394ed39eea4a98469ac"},
+    {file = "cryptography-36.0.1-pp38-pypy38_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ec63da4e7e4a5f924b90af42eddf20b698a70e58d86a72d943857c4c6045b3ee"},
+    {file = "cryptography-36.0.1-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ca238ceb7ba0bdf6ce88c1b74a87bffcee5afbfa1e41e173b1ceb095b39add46"},
+    {file = "cryptography-36.0.1-pp38-pypy38_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:ca28641954f767f9822c24e927ad894d45d5a1e501767599647259cbf030b903"},
+    {file = "cryptography-36.0.1-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:39bdf8e70eee6b1c7b289ec6e5d84d49a6bfa11f8b8646b5b3dfe41219153316"},
+    {file = "cryptography-36.0.1.tar.gz", hash = "sha256:53e5c1dc3d7a953de055d77bef2ff607ceef7a2aac0353b5d630ab67f7423638"},
+]
+cycler = [
+    {file = "cycler-0.11.0-py3-none-any.whl", hash = "sha256:3a27e95f763a428a739d2add979fa7494c912a32c17c4c38c4d5f082cad165a3"},
+    {file = "cycler-0.11.0.tar.gz", hash = "sha256:9c87405839a19696e837b3b818fed3f5f69f16f1eec1a1ad77e043dcea9c772f"},
+]
+cython = [
+    {file = "Cython-0.29.26-cp27-cp27m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c4b003b6b7aa9e74552ef8d4e6009b3e3c3e8fa585710b3a6d062e088e460c1b"},
+    {file = "Cython-0.29.26-cp27-cp27m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:ce804a021c92fea66c8c100781a111706f21bade7a546895c5a9c57fe2df8b24"},
+    {file = "Cython-0.29.26-cp27-cp27m-win32.whl", hash = "sha256:8e07121b34221458a2151d37e137b8f5b011a9c51dd38db2499a6198590aa319"},
+    {file = "Cython-0.29.26-cp27-cp27m-win_amd64.whl", hash = "sha256:233a87db76941626f1db08f4b25a4a5b425b13b64ed0e673c3641f7b650a48d8"},
+    {file = "Cython-0.29.26-cp27-cp27mu-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:93840f2071c1f15e613509eadee1fbcd335e8666772437fe5038e24059edd48c"},
+    {file = "Cython-0.29.26-cp27-cp27mu-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:10402f0f1564ffc6ecb9c45e07f995771d05bb0b0e1d151e40574638292ee3a5"},
+    {file = "Cython-0.29.26-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:6773cce9d4b3b6168d8feb2b6f06b658ef1e11cbfec075041745666d8e2a5e45"},
+    {file = "Cython-0.29.26-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:c813799d533194b7d85203d881d8b4f567a8c644a67f50d47f1ffbf316df412f"},
+    {file = "Cython-0.29.26-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_24_i686.whl", hash = "sha256:362fbb9cb4627c7786231429768b54aaba5459a2a0e46c25e59f202ca6155437"},
+    {file = "Cython-0.29.26-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:2b834ff6e4d10ba6d7a0d676dd71c1b427a181ddbbbbf79e91d1861557aab59f"},
+    {file = "Cython-0.29.26-cp34-cp34m-win32.whl", hash = "sha256:0c3093bc99facfc97e5019f6c5bc39987663792265c1334d9fc9e37c3a3dcd6f"},
+    {file = "Cython-0.29.26-cp34-cp34m-win_amd64.whl", hash = "sha256:bbf0149680c1fca07200a3ed372b22e6bad7851d191b717a61f9a68af370e180"},
+    {file = "Cython-0.29.26-cp35-cp35m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a1cc55db32cd39474081d478263b96e036552cdbbab8831c90ea43fb385a9b66"},
+    {file = "Cython-0.29.26-cp35-cp35m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:ebe32e002a9e6553de399033e259ece72aa17c77f740b265e66f122572a8a278"},
+    {file = "Cython-0.29.26-cp35-cp35m-win32.whl", hash = "sha256:6b385f68789c3e8a75b4827e8a4970ff04605ad3cb1c0b41005cc69368dad65d"},
+    {file = "Cython-0.29.26-cp35-cp35m-win_amd64.whl", hash = "sha256:1519eb639de308f5763eb0666b4cc7bd3958268f3f6228cc610b7b4d6c94b68b"},
+    {file = "Cython-0.29.26-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:e118525defec3f67471d8ee5ce04340d43195410a87e5d7ec8a1a9e953c0066a"},
+    {file = "Cython-0.29.26-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:706ea55f58c2722206e51cd9a8754ed0995c4c4231d24b095875d2641d745222"},
+    {file = "Cython-0.29.26-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_24_i686.whl", hash = "sha256:77913fe27c5e22c995bac090d01e200ff91e5f58aa944e2d2e94cbf67ea2ae34"},
+    {file = "Cython-0.29.26-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:51923120f57a42c59f5ee6bba9e89a31a394ae8cd419c753f64d8a3aea1ee8b7"},
+    {file = "Cython-0.29.26-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:82881565d04027728d7762edd8c085927a840873af7ee049d703e0ca226bc08d"},
+    {file = "Cython-0.29.26-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:531303085503959338e6cdac630626280ef111aecbb22d48321673a8c3897c0a"},
+    {file = "Cython-0.29.26-cp36-cp36m-win32.whl", hash = "sha256:0205b685802eb4c039b14f67b7ac3f00c55ff04b9e3871df2249576d3e59ba42"},
+    {file = "Cython-0.29.26-cp36-cp36m-win_amd64.whl", hash = "sha256:7df94e56872df8f396ca669466fee60256f69f678654239f706b1e643c2ac4a5"},
+    {file = "Cython-0.29.26-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:4b7d04b393d9a4b5fec0cbc4b0f29fe083a9d862d95231a6e7608978bd661d7e"},
+    {file = "Cython-0.29.26-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:af91dd63ac5f1f7fc70dc91ea063f727db42b5eb934d1f3832611be18e25171e"},
+    {file = "Cython-0.29.26-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_24_i686.whl", hash = "sha256:d83dad8dc6c63706cb3178dc79010b3865b1345090727189d2cd61758a825ee8"},
+    {file = "Cython-0.29.26-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ca10e9fde0eaba1407ab353ff07a26daaa3e4dbe356108a149e482d441f070dd"},
+    {file = "Cython-0.29.26-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:fec66cd0a48697fab903854566235aecf1084f62e3163d6589ae7335a1b4d448"},
+    {file = "Cython-0.29.26-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:b3041e45aefaa4449fd671902132c0ac1f72eedaedac745c0e1a70a13bf990bb"},
+    {file = "Cython-0.29.26-cp37-cp37m-win32.whl", hash = "sha256:ed76fb98979f02b5e89079906071983a36f3634d3028b86f935cf0196f24fcaa"},
+    {file = "Cython-0.29.26-cp37-cp37m-win_amd64.whl", hash = "sha256:4d868e1a41f5123f51a20c1b8e82f7cb6fa3370c104e98e707f7c910e8cadad1"},
+    {file = "Cython-0.29.26-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:868f309095e557f06dc58723ae865e8c65cfedb2646a562bd8080c92d69e4e4b"},
+    {file = "Cython-0.29.26-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:be550b566345bf53b95616334793ce42a128cf1d9dcde1e28cbf7ce52ea61d6d"},
+    {file = "Cython-0.29.26-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_24_i686.whl", hash = "sha256:be13be1e2b9b7395588f2a23bfa692f2f3e6f7936ccf7825c83431b8c8c3452b"},
+    {file = "Cython-0.29.26-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:41ee918480371ae5e5851ba9b1ead5a183e24aedb27bf807c7405d124e943f40"},
+    {file = "Cython-0.29.26-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:c91b1ba0d43f7f7ccde8121c672207c7891735ddcc83496af1e0ab617ddc4aba"},
+    {file = "Cython-0.29.26-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:5ecf5cf5b57086cc6c1cfc76d6353bbd7023e95da32e0883f1302ca50e481c33"},
+    {file = "Cython-0.29.26-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:0ffce25bf50fa926ec6bf8d6f29650e7cb33fae445938c9880e1ce9b776353ef"},
+    {file = "Cython-0.29.26-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:5041adfef502d67ecd5e291a7cf645a37fed7a9dac557f40d491053f35204d00"},
+    {file = "Cython-0.29.26-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_24_i686.whl", hash = "sha256:5fd5db458c9d3d2c2abd047f3190624d9cce8a80a8e0ca0baa69cfd133a523bc"},
+    {file = "Cython-0.29.26-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:75eaa22911d2ec37a3841f77b710b178c805cd378b5e1c4fb82dbc35620d2062"},
+    {file = "Cython-0.29.26-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:3aed8c642e8fb27024bca46830b7f62335a44a92354acf708d6b8d050f945a3a"},
+    {file = "Cython-0.29.26-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:b5ca05c2bfba0c2480b5fd390ecffe46b8da574d887d600388d6e3caf3f99a88"},
+    {file = "Cython-0.29.26-py2.py3-none-any.whl", hash = "sha256:f5e15ff892c8afad64931ee3dd723c4755c2c516606f9aae7613bebfac62b0f6"},
+    {file = "Cython-0.29.26.tar.gz", hash = "sha256:af377d543a762867da11fcf6e558f7a4a535ff8693f30cce123fab10c00fa312"},
+]
+dask = [
+    {file = "dask-2022.1.0-py3-none-any.whl", hash = "sha256:36e3765ef7800451deff87b3fe90cbc8a4963e65b3fd4e2a73c112c243f88608"},
+    {file = "dask-2022.1.0.tar.gz", hash = "sha256:aee6eb6517f13dc00a3cc7ed9e13c728baa5850b8a35a2b93793d593a23ecbb8"},
+]
+debugpy = [
+    {file = "debugpy-1.5.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:70b422c63a833630c33e3f9cdbd9b6971f8c5afd452697e464339a21bbe862ba"},
+    {file = "debugpy-1.5.1-cp310-cp310-win32.whl", hash = "sha256:3a457ad9c0059a21a6c7d563c1f18e924f5cf90278c722bd50ede6f56b77c7fe"},
+    {file = "debugpy-1.5.1-cp310-cp310-win_amd64.whl", hash = "sha256:5d76a4fd028d8009c3faf1185b4b78ceb2273dd2499447664b03939e0368bb90"},
+    {file = "debugpy-1.5.1-cp36-cp36m-macosx_10_15_x86_64.whl", hash = "sha256:16db27b4b91991442f91d73604d32080b30de655aca9ba821b1972ea8171021b"},
+    {file = "debugpy-1.5.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:2b073ad5e8d8c488fbb6a116986858bab0c9c4558f28deb8832c7a5a27405bd6"},
+    {file = "debugpy-1.5.1-cp36-cp36m-win32.whl", hash = "sha256:318f81f37341e4e054b4267d39896b73cddb3612ca13b39d7eea45af65165e1d"},
+    {file = "debugpy-1.5.1-cp36-cp36m-win_amd64.whl", hash = "sha256:b5b3157372e0e0a1297a8b6b5280bcf1d35a40f436c7973771c972726d1e32d5"},
+    {file = "debugpy-1.5.1-cp37-cp37m-macosx_10_15_x86_64.whl", hash = "sha256:1ec3a086e14bba6c472632025b8fe5bdfbaef2afa1ebd5c6615ce6ed8d89bc67"},
+    {file = "debugpy-1.5.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:26fbe53cca45a608679094791ce587b6e2798acd1d4777a8b303b07622e85182"},
+    {file = "debugpy-1.5.1-cp37-cp37m-win32.whl", hash = "sha256:d876db8c312eeb02d85611e0f696abe66a2c1515e6405943609e725d5ff36f2a"},
+    {file = "debugpy-1.5.1-cp37-cp37m-win_amd64.whl", hash = "sha256:4404a62fb5332ea5c8c9132290eef50b3a0ba38cecacad5529e969a783bcbdd7"},
+    {file = "debugpy-1.5.1-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:f3a3dca9104aa14fd4210edcce6d9ce2b65bd9618c0b222135a40b9d6e2a9eeb"},
+    {file = "debugpy-1.5.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:b2df2c373e85871086bd55271c929670cd4e1dba63e94a08d442db830646203b"},
+    {file = "debugpy-1.5.1-cp38-cp38-win32.whl", hash = "sha256:82f5f9ce93af6861a0713f804e62ab390bb12a17f113153e47fea8bbb1dfbe36"},
+    {file = "debugpy-1.5.1-cp38-cp38-win_amd64.whl", hash = "sha256:17a25ce9d7714f92fc97ef00cc06269d7c2b163094990ada30156ed31d9a5030"},
+    {file = "debugpy-1.5.1-cp39-cp39-macosx_10_15_x86_64.whl", hash = "sha256:01e98c594b3e66d529e40edf314f849cd1a21f7a013298df58cd8e263bf8e184"},
+    {file = "debugpy-1.5.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f73988422b17f071ad3c4383551ace1ba5ed810cbab5f9c362783d22d40a08dc"},
+    {file = "debugpy-1.5.1-cp39-cp39-win32.whl", hash = "sha256:23df67fc56d59e386c342428a7953c2c06cc226d8525b11319153e96afb65b0c"},
+    {file = "debugpy-1.5.1-cp39-cp39-win_amd64.whl", hash = "sha256:a2aa64f6d2ca7ded8a7e8a4e7cae3bc71866b09876b7b05cecad231779cb9156"},
+    {file = "debugpy-1.5.1-py2.py3-none-any.whl", hash = "sha256:194f95dd3e84568b5489aab5689a3a2c044e8fdc06f1890b8b4f70b6b89f2778"},
+    {file = "debugpy-1.5.1.zip", hash = "sha256:d2b09e91fbd1efa4f4fda121d49af89501beda50c18ed7499712c71a4bf3452e"},
+]
+decorator = [
+    {file = "decorator-5.1.1-py3-none-any.whl", hash = "sha256:b8c3f85900b9dc423225913c5aace94729fe1fa9763b38939a95226f02d37186"},
+    {file = "decorator-5.1.1.tar.gz", hash = "sha256:637996211036b6385ef91435e4fae22989472f9d571faba8927ba8253acbc330"},
+]
+dftparse = [
+    {file = "dftparse-0.3.0.tar.gz", hash = "sha256:2c3f8298171718827f112d821e270001ff21972a6cef48ed4ce5e6b4b91c373a"},
+]
+dfttopif = [
+    {file = "dfttopif-1.1.0.tar.gz", hash = "sha256:45c82f341ea3c2cff3f4cc128d49743466968b498b5681d0defeaa1b98d34cb7"},
+]
+dill = [
+    {file = "dill-0.3.4-py2.py3-none-any.whl", hash = "sha256:7e40e4a70304fd9ceab3535d36e58791d9c4a776b38ec7f7ec9afc8d3dca4d4f"},
+    {file = "dill-0.3.4.zip", hash = "sha256:9f9734205146b2b353ab3fec9af0070237b6ddae78452af83d2fca84d739e675"},
+]
+docopt = [
+    {file = "docopt-0.6.2.tar.gz", hash = "sha256:49b3a825280bd66b3aa83585ef59c4a8c82f2c8a522dbe754a8bc8d08c85c491"},
+]
+entrypoints = [
+    {file = "entrypoints-0.3-py2.py3-none-any.whl", hash = "sha256:589f874b313739ad35be6e0cd7efde2a4e9b6fea91edcc34e58ecbb8dbe56d19"},
+    {file = "entrypoints-0.3.tar.gz", hash = "sha256:c70dd71abe5a8c85e55e12c19bd91ccfeec11a6e99044204511f9ed547d48451"},
+]
+et-xmlfile = [
+    {file = "et_xmlfile-1.1.0-py3-none-any.whl", hash = "sha256:a2ba85d1d6a74ef63837eed693bcb89c3f752169b0e3e7ae5b16ca5e1b3deada"},
+    {file = "et_xmlfile-1.1.0.tar.gz", hash = "sha256:8eb9e2bc2f8c97e37a2dc85a09ecdcdec9d8a396530a6d5a33b30b9a92da0c5c"},
+]
+fair-research-login = [
+    {file = "fair-research-login-0.2.6.tar.gz", hash = "sha256:ad54267a2731ddfd550451945092753156a05398b04db575024700ed6c933070"},
+    {file = "fair_research_login-0.2.6-py2.py3-none-any.whl", hash = "sha256:bebacf7a565175243fc77afdacc3d8002fff518ead8b53c955b13fe0d6f2cd0c"},
+]
+flake8 = [
+    {file = "flake8-4.0.1-py2.py3-none-any.whl", hash = "sha256:479b1304f72536a55948cb40a32dce8bb0ffe3501e26eaf292c7e60eb5e0428d"},
+    {file = "flake8-4.0.1.tar.gz", hash = "sha256:806e034dda44114815e23c16ef92f95c91e4c71100ff52813adf7132a6ad870d"},
+]
+fsspec = [
+    {file = "fsspec-2022.1.0-py3-none-any.whl", hash = "sha256:256e2be44e62430c9ca8dac2e480384b00a3c52aef4e2b0b7204163fdc861d37"},
+    {file = "fsspec-2022.1.0.tar.gz", hash = "sha256:0bdd519bbf4d8c9a1d893a50b5ebacc89acd0e1fe0045d2f7b0e0c1af5990edc"},
+]
+globus-nexus-client = [
+    {file = "globus-nexus-client-0.4.1.tar.gz", hash = "sha256:156ff3a3dc5e07fe30b41856aad54d25129efcff913ec17669edc24c9fa755cd"},
+    {file = "globus_nexus_client-0.4.1-py3-none-any.whl", hash = "sha256:4ed05b304530ae363772e4f2af2b6c9f3c63849a1427fc6b2e315ed864416e8e"},
+]
+globus-sdk = [
+    {file = "globus-sdk-3.2.1.tar.gz", hash = "sha256:8458de9ab0ac2296b1e27c715d565767c634aa95021ef133d90c5d95d3f64785"},
+    {file = "globus_sdk-3.2.1-py3-none-any.whl", hash = "sha256:a9bcc684198bd891dd0c70df485e66124d90693b7cf38315667ec72d308b16fd"},
+]
+greenlet = [
+    {file = "greenlet-1.1.2-cp27-cp27m-macosx_10_14_x86_64.whl", hash = "sha256:58df5c2a0e293bf665a51f8a100d3e9956febfbf1d9aaf8c0677cf70218910c6"},
+    {file = "greenlet-1.1.2-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:aec52725173bd3a7b56fe91bc56eccb26fbdff1386ef123abb63c84c5b43b63a"},
+    {file = "greenlet-1.1.2-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:833e1551925ed51e6b44c800e71e77dacd7e49181fdc9ac9a0bf3714d515785d"},
+    {file = "greenlet-1.1.2-cp27-cp27m-win32.whl", hash = "sha256:aa5b467f15e78b82257319aebc78dd2915e4c1436c3c0d1ad6f53e47ba6e2713"},
+    {file = "greenlet-1.1.2-cp27-cp27m-win_amd64.whl", hash = "sha256:40b951f601af999a8bf2ce8c71e8aaa4e8c6f78ff8afae7b808aae2dc50d4c40"},
+    {file = "greenlet-1.1.2-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:95e69877983ea39b7303570fa6760f81a3eec23d0e3ab2021b7144b94d06202d"},
+    {file = "greenlet-1.1.2-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:356b3576ad078c89a6107caa9c50cc14e98e3a6c4874a37c3e0273e4baf33de8"},
+    {file = "greenlet-1.1.2-cp310-cp310-macosx_10_14_x86_64.whl", hash = "sha256:8639cadfda96737427330a094476d4c7a56ac03de7265622fcf4cfe57c8ae18d"},
+    {file = "greenlet-1.1.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:97e5306482182170ade15c4b0d8386ded995a07d7cc2ca8f27958d34d6736497"},
+    {file = "greenlet-1.1.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e6a36bb9474218c7a5b27ae476035497a6990e21d04c279884eb10d9b290f1b1"},
+    {file = "greenlet-1.1.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:abb7a75ed8b968f3061327c433a0fbd17b729947b400747c334a9c29a9af6c58"},
+    {file = "greenlet-1.1.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b336501a05e13b616ef81ce329c0e09ac5ed8c732d9ba7e3e983fcc1a9e86965"},
+    {file = "greenlet-1.1.2-cp310-cp310-win_amd64.whl", hash = "sha256:14d4f3cd4e8b524ae9b8aa567858beed70c392fdec26dbdb0a8a418392e71708"},
+    {file = "greenlet-1.1.2-cp35-cp35m-macosx_10_14_x86_64.whl", hash = "sha256:17ff94e7a83aa8671a25bf5b59326ec26da379ace2ebc4411d690d80a7fbcf23"},
+    {file = "greenlet-1.1.2-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:9f3cba480d3deb69f6ee2c1825060177a22c7826431458c697df88e6aeb3caee"},
+    {file = "greenlet-1.1.2-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:fa877ca7f6b48054f847b61d6fa7bed5cebb663ebc55e018fda12db09dcc664c"},
+    {file = "greenlet-1.1.2-cp35-cp35m-win32.whl", hash = "sha256:7cbd7574ce8e138bda9df4efc6bf2ab8572c9aff640d8ecfece1b006b68da963"},
+    {file = "greenlet-1.1.2-cp35-cp35m-win_amd64.whl", hash = "sha256:903bbd302a2378f984aef528f76d4c9b1748f318fe1294961c072bdc7f2ffa3e"},
+    {file = "greenlet-1.1.2-cp36-cp36m-macosx_10_14_x86_64.whl", hash = "sha256:049fe7579230e44daef03a259faa24511d10ebfa44f69411d99e6a184fe68073"},
+    {file = "greenlet-1.1.2-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:dd0b1e9e891f69e7675ba5c92e28b90eaa045f6ab134ffe70b52e948aa175b3c"},
+    {file = "greenlet-1.1.2-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:7418b6bfc7fe3331541b84bb2141c9baf1ec7132a7ecd9f375912eca810e714e"},
+    {file = "greenlet-1.1.2-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f9d29ca8a77117315101425ec7ec2a47a22ccf59f5593378fc4077ac5b754fce"},
+    {file = "greenlet-1.1.2-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:21915eb821a6b3d9d8eefdaf57d6c345b970ad722f856cd71739493ce003ad08"},
+    {file = "greenlet-1.1.2-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eff9d20417ff9dcb0d25e2defc2574d10b491bf2e693b4e491914738b7908168"},
+    {file = "greenlet-1.1.2-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:b8c008de9d0daba7b6666aa5bbfdc23dcd78cafc33997c9b7741ff6353bafb7f"},
+    {file = "greenlet-1.1.2-cp36-cp36m-win32.whl", hash = "sha256:32ca72bbc673adbcfecb935bb3fb1b74e663d10a4b241aaa2f5a75fe1d1f90aa"},
+    {file = "greenlet-1.1.2-cp36-cp36m-win_amd64.whl", hash = "sha256:f0214eb2a23b85528310dad848ad2ac58e735612929c8072f6093f3585fd342d"},
+    {file = "greenlet-1.1.2-cp37-cp37m-macosx_10_14_x86_64.whl", hash = "sha256:b92e29e58bef6d9cfd340c72b04d74c4b4e9f70c9fa7c78b674d1fec18896dc4"},
+    {file = "greenlet-1.1.2-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:fdcec0b8399108577ec290f55551d926d9a1fa6cad45882093a7a07ac5ec147b"},
+    {file = "greenlet-1.1.2-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:93f81b134a165cc17123626ab8da2e30c0455441d4ab5576eed73a64c025b25c"},
+    {file = "greenlet-1.1.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1e12bdc622676ce47ae9abbf455c189e442afdde8818d9da983085df6312e7a1"},
+    {file = "greenlet-1.1.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8c790abda465726cfb8bb08bd4ca9a5d0a7bd77c7ac1ca1b839ad823b948ea28"},
+    {file = "greenlet-1.1.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f276df9830dba7a333544bd41070e8175762a7ac20350786b322b714b0e654f5"},
+    {file = "greenlet-1.1.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:8c5d5b35f789a030ebb95bff352f1d27a93d81069f2adb3182d99882e095cefe"},
+    {file = "greenlet-1.1.2-cp37-cp37m-win32.whl", hash = "sha256:64e6175c2e53195278d7388c454e0b30997573f3f4bd63697f88d855f7a6a1fc"},
+    {file = "greenlet-1.1.2-cp37-cp37m-win_amd64.whl", hash = "sha256:b11548073a2213d950c3f671aa88e6f83cda6e2fb97a8b6317b1b5b33d850e06"},
+    {file = "greenlet-1.1.2-cp38-cp38-macosx_10_14_x86_64.whl", hash = "sha256:9633b3034d3d901f0a46b7939f8c4d64427dfba6bbc5a36b1a67364cf148a1b0"},
+    {file = "greenlet-1.1.2-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:eb6ea6da4c787111adf40f697b4e58732ee0942b5d3bd8f435277643329ba627"},
+    {file = "greenlet-1.1.2-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:f3acda1924472472ddd60c29e5b9db0cec629fbe3c5c5accb74d6d6d14773478"},
+    {file = "greenlet-1.1.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e859fcb4cbe93504ea18008d1df98dee4f7766db66c435e4882ab35cf70cac43"},
+    {file = "greenlet-1.1.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:00e44c8afdbe5467e4f7b5851be223be68adb4272f44696ee71fe46b7036a711"},
+    {file = "greenlet-1.1.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ec8c433b3ab0419100bd45b47c9c8551248a5aee30ca5e9d399a0b57ac04651b"},
+    {file = "greenlet-1.1.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:2bde6792f313f4e918caabc46532aa64aa27a0db05d75b20edfc5c6f46479de2"},
+    {file = "greenlet-1.1.2-cp38-cp38-win32.whl", hash = "sha256:288c6a76705dc54fba69fbcb59904ae4ad768b4c768839b8ca5fdadec6dd8cfd"},
+    {file = "greenlet-1.1.2-cp38-cp38-win_amd64.whl", hash = "sha256:8d2f1fb53a421b410751887eb4ff21386d119ef9cde3797bf5e7ed49fb51a3b3"},
+    {file = "greenlet-1.1.2-cp39-cp39-macosx_10_14_x86_64.whl", hash = "sha256:166eac03e48784a6a6e0e5f041cfebb1ab400b394db188c48b3a84737f505b67"},
+    {file = "greenlet-1.1.2-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:572e1787d1460da79590bf44304abbc0a2da944ea64ec549188fa84d89bba7ab"},
+    {file = "greenlet-1.1.2-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:be5f425ff1f5f4b3c1e33ad64ab994eed12fc284a6ea71c5243fd564502ecbe5"},
+    {file = "greenlet-1.1.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b1692f7d6bc45e3200844be0dba153612103db241691088626a33ff1f24a0d88"},
+    {file = "greenlet-1.1.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7227b47e73dedaa513cdebb98469705ef0d66eb5a1250144468e9c3097d6b59b"},
+    {file = "greenlet-1.1.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7ff61ff178250f9bb3cd89752df0f1dd0e27316a8bd1465351652b1b4a4cdfd3"},
+    {file = "greenlet-1.1.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:0051c6f1f27cb756ffc0ffbac7d2cd48cb0362ac1736871399a739b2885134d3"},
+    {file = "greenlet-1.1.2-cp39-cp39-win32.whl", hash = "sha256:f70a9e237bb792c7cc7e44c531fd48f5897961701cdaa06cf22fc14965c496cf"},
+    {file = "greenlet-1.1.2-cp39-cp39-win_amd64.whl", hash = "sha256:013d61294b6cd8fe3242932c1c5e36e5d1db2c8afb58606c5a67efce62c1f5fd"},
+    {file = "greenlet-1.1.2.tar.gz", hash = "sha256:e30f5ea4ae2346e62cedde8794a56858a67b878dd79f7df76a0767e356b1744a"},
+]
+h5py = [
+    {file = "h5py-3.6.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a5320837c60870911645e9a935099bdb2be6a786fcf0dac5c860f3b679e2de55"},
+    {file = "h5py-3.6.0-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:98646e659bf8591a2177e12a4461dced2cad72da0ba4247643fd118db88880d2"},
+    {file = "h5py-3.6.0-cp310-cp310-win_amd64.whl", hash = "sha256:5996ff5adefd2d68c330a4265b6ef92e51b2fc674834a5990add5033bf109e20"},
+    {file = "h5py-3.6.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c9a5529343a619fea777b7caa27d493595b28b5af8b005e8d1817559fcccf493"},
+    {file = "h5py-3.6.0-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:e2b49c48df05e19bb20b400b7ff7dc6f1ee36b84dc717c3771c468b33697b466"},
+    {file = "h5py-3.6.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cd9447633b0bafaf82190d9a8d56f3cb2e8d30169483aee67d800816e028190a"},
+    {file = "h5py-3.6.0-cp37-cp37m-win_amd64.whl", hash = "sha256:1c5acc660c458421e88c4c5fe092ce15923adfac4c732af1ac4fced683a5ea97"},
+    {file = "h5py-3.6.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:35ab552c6f0a93365b3cb5664a5305f3920daa0a43deb5b2c547c52815ec46b9"},
+    {file = "h5py-3.6.0-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:542781d50e1182b8fb619b1265dfe1c765e18215f818b0ab28b2983c28471325"},
+    {file = "h5py-3.6.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9f39242960b8d7f86f3056cc2546aa3047ff4835985f6483229af8f029e9c8db"},
+    {file = "h5py-3.6.0-cp38-cp38-win_amd64.whl", hash = "sha256:8ecedf16c613973622a334701f67edcc0249469f9daa0576e994fb20ac0405db"},
+    {file = "h5py-3.6.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:d8cacad89aa7daf3626fce106f7f2662ac35b14849df22d252d0d8fab9dc1c0b"},
+    {file = "h5py-3.6.0-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:dbaa1ed9768bf9ff04af0919acc55746e62b28333644f0251f38768313f31745"},
+    {file = "h5py-3.6.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:954c5c39a09b5302f69f752c3bbf165d368a65c8d200f7d5655e0fa6368a75e6"},
+    {file = "h5py-3.6.0-cp39-cp39-win_amd64.whl", hash = "sha256:9fd8a14236fdd092a20c0bdf25c3aba3777718d266fabb0fdded4fcf252d1630"},
+    {file = "h5py-3.6.0.tar.gz", hash = "sha256:8752d2814a92aba4e2b2a5922d2782d0029102d99caaf3c201a566bc0b40db29"},
+]
+hyperspy = [
+    {file = "hyperspy-1.6.5-cp36-cp36m-macosx_10_14_x86_64.whl", hash = "sha256:4b678240c96e5d81c13c594ec585c155a4d7d767bf272171cd11a8f504569238"},
+    {file = "hyperspy-1.6.5-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:5dd7095d450b4fd5e00f941ce2eba4ce79b84e2a0d7809dfd46303ed812e5eaa"},
+    {file = "hyperspy-1.6.5-cp36-cp36m-win_amd64.whl", hash = "sha256:e3531495b7200b7dcd61f2e3eea67eab90a6dfc5afe733d6a911ec6e9b7da3ec"},
+    {file = "hyperspy-1.6.5-cp37-cp37m-macosx_10_14_x86_64.whl", hash = "sha256:4eda223b9bcf5570abf195181fb02e5b5e67da40923979f62543a99b7e00038e"},
+    {file = "hyperspy-1.6.5-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f4fc943e54d345c8d1a9f9e7b1c7ef54b3e1cae73f5701b43c406c4371e7a8be"},
+    {file = "hyperspy-1.6.5-cp37-cp37m-win_amd64.whl", hash = "sha256:8b5865722466649a255f1739225ec3bde5702e17aa4c356f293abbf227e4ed73"},
+    {file = "hyperspy-1.6.5-cp38-cp38-macosx_10_14_x86_64.whl", hash = "sha256:aeb29a1510e8d28ca33121c0e39b9910ac5f2e90aaf3a9f65b0c53d4d2108d1c"},
+    {file = "hyperspy-1.6.5-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:4c1b78f3ffe9638be4465fb9c313b37ee6d38569ed9a9bc0caad926aa923b9af"},
+    {file = "hyperspy-1.6.5-cp38-cp38-win_amd64.whl", hash = "sha256:39c3884243180f09870d50f11c1f1c64f95926e29e449bd6bb0785a263cbaf55"},
+    {file = "hyperspy-1.6.5-cp39-cp39-macosx_10_14_x86_64.whl", hash = "sha256:cf442c58da63384480b72aad99db6dd5cbcb429749aa10a1e0c9333490340d7e"},
+    {file = "hyperspy-1.6.5-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:13764de065663075dd0cac25d819efff6156071ae8d5136a6d7ee00872dd3bc5"},
+    {file = "hyperspy-1.6.5-cp39-cp39-win_amd64.whl", hash = "sha256:03dc90f2161a3ce67123e8c6a4807f618d5392e840080dcc6b9be16ea7e6f79d"},
+    {file = "hyperspy-1.6.5.tar.gz", hash = "sha256:040d21c40e609d6c4b7b2c9e283a5ccf398450f5996a1dc2442d29e44e03793a"},
+]
+idna = [
+    {file = "idna-3.3-py3-none-any.whl", hash = "sha256:84d9dd047ffa80596e0f246e2eab0b391788b0503584e8945f2368256d2735ff"},
+    {file = "idna-3.3.tar.gz", hash = "sha256:9d643ff0a55b762d5cdb124b8eaa99c66322e2157b69160bc32796e824360e6d"},
+]
+ijson = [
+    {file = "ijson-3.1.4-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:6c1a777096be5f75ffebb335c6d2ebc0e489b231496b7f2ca903aa061fe7d381"},
+    {file = "ijson-3.1.4-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:475fc25c3d2a86230b85777cae9580398b42eed422506bf0b6aacfa936f7bfcd"},
+    {file = "ijson-3.1.4-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:f587699b5a759e30accf733e37950cc06c4118b72e3e146edcea77dded467426"},
+    {file = "ijson-3.1.4-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:339b2b4c7bbd64849dd69ef94ee21e29dcd92c831f47a281fdd48122bb2a715a"},
+    {file = "ijson-3.1.4-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:446ef8980504da0af8d20d3cb6452c4dc3d8aa5fd788098985e899b913191fe6"},
+    {file = "ijson-3.1.4-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:3997a2fdb28bc04b9ab0555db5f3b33ed28d91e9d42a3bf2c1842d4990beb158"},
+    {file = "ijson-3.1.4-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:fa10a1d88473303ec97aae23169d77c5b92657b7fb189f9c584974c00a79f383"},
+    {file = "ijson-3.1.4-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:9a5bf5b9d8f2ceaca131ee21fc7875d0f34b95762f4f32e4d65109ca46472147"},
+    {file = "ijson-3.1.4-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:81cc8cee590c8a70cca3c9aefae06dd7cb8e9f75f3a7dc12b340c2e332d33a2a"},
+    {file = "ijson-3.1.4-cp35-cp35m-macosx_10_9_x86_64.whl", hash = "sha256:3b98861a4280cf09d267986cefa46c3bd80af887eae02aba07488d80eb798afa"},
+    {file = "ijson-3.1.4-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:068c692efba9692406b86736dcc6803e4a0b6280d7f0b7534bff3faec677ff38"},
+    {file = "ijson-3.1.4-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:86884ac06ac69cea6d89ab7b84683b3b4159c4013e4a20276d3fc630fe9b7588"},
+    {file = "ijson-3.1.4-cp35-cp35m-manylinux2010_i686.whl", hash = "sha256:41e5886ff6fade26f10b87edad723d2db14dcbb1178717790993fcbbb8ccd333"},
+    {file = "ijson-3.1.4-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:24b58933bf777d03dc1caa3006112ec7f9e6f6db6ffe1f5f5bd233cb1281f719"},
+    {file = "ijson-3.1.4-cp35-cp35m-manylinux2014_aarch64.whl", hash = "sha256:13f80aad0b84d100fb6a88ced24bade21dc6ddeaf2bba3294b58728463194f50"},
+    {file = "ijson-3.1.4-cp35-cp35m-win32.whl", hash = "sha256:fa9a25d0bd32f9515e18a3611690f1de12cb7d1320bd93e9da835936b41ad3ff"},
+    {file = "ijson-3.1.4-cp35-cp35m-win_amd64.whl", hash = "sha256:c4c1bf98aaab4c8f60d238edf9bcd07c896cfcc51c2ca84d03da22aad88957c5"},
+    {file = "ijson-3.1.4-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:f0f2a87c423e8767368aa055310024fa28727f4454463714fef22230c9717f64"},
+    {file = "ijson-3.1.4-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:15507de59d74d21501b2a076d9c49abf927eb58a51a01b8f28a0a0565db0a99f"},
+    {file = "ijson-3.1.4-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:2e6bd6ad95ab40c858592b905e2bbb4fe79bbff415b69a4923dafe841ffadcb4"},
+    {file = "ijson-3.1.4-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:68e295bb12610d086990cedc89fb8b59b7c85740d66e9515aed062649605d0bf"},
+    {file = "ijson-3.1.4-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:3bb461352c0f0f2ec460a4b19400a665b8a5a3a2da663a32093df1699642ee3f"},
+    {file = "ijson-3.1.4-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:f91c75edd6cf1a66f02425bafc59a22ec29bc0adcbc06f4bfd694d92f424ceb3"},
+    {file = "ijson-3.1.4-cp36-cp36m-win32.whl", hash = "sha256:4c53cc72f79a4c32d5fc22efb85aa22f248e8f4f992707a84bdc896cc0b1ecf9"},
+    {file = "ijson-3.1.4-cp36-cp36m-win_amd64.whl", hash = "sha256:ac9098470c1ff6e5c23ec0946818bc102bfeeeea474554c8d081dc934be20988"},
+    {file = "ijson-3.1.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:dcd6f04df44b1945b859318010234651317db2c4232f75e3933f8bb41c4fa055"},
+    {file = "ijson-3.1.4-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:5a2f40c053c837591636dc1afb79d85e90b9a9d65f3d9963aae31d1eb11bfed2"},
+    {file = "ijson-3.1.4-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:f50337e3b8e72ec68441b573c2848f108a8976a57465c859b227ebd2a2342901"},
+    {file = "ijson-3.1.4-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:454918f908abbed3c50a0a05c14b20658ab711b155e4f890900e6f60746dd7cc"},
+    {file = "ijson-3.1.4-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:387c2ec434cc1bc7dc9bd33ec0b70d95d443cc1e5934005f26addc2284a437ab"},
+    {file = "ijson-3.1.4-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:179ed6fd42e121d252b43a18833df2de08378fac7bce380974ef6f5e522afefa"},
+    {file = "ijson-3.1.4-cp37-cp37m-win32.whl", hash = "sha256:26a6a550b270df04e3f442e2bf0870c9362db4912f0e7bdfd300f30ea43115a2"},
+    {file = "ijson-3.1.4-cp37-cp37m-win_amd64.whl", hash = "sha256:ff8cf7507d9d8939264068c2cff0a23f99703fa2f31eb3cb45a9a52798843586"},
+    {file = "ijson-3.1.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:09c9d7913c88a6059cd054ff854958f34d757402b639cf212ffbec201a705a0d"},
+    {file = "ijson-3.1.4-cp38-cp38-manylinux1_i686.whl", hash = "sha256:702ba9a732116d659a5e950ee176be6a2e075998ef1bcde11cbf79a77ed0f717"},
+    {file = "ijson-3.1.4-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:667841591521158770adc90793c2bdbb47c94fe28888cb802104b8bbd61f3d51"},
+    {file = "ijson-3.1.4-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:df641dd07b38c63eecd4f454db7b27aa5201193df160f06b48111ba97ab62504"},
+    {file = "ijson-3.1.4-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:9348e7d507eb40b52b12eecff3d50934fcc3d2a15a2f54ec1127a36063b9ba8f"},
+    {file = "ijson-3.1.4-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:93455902fdc33ba9485c7fae63ac95d96e0ab8942224a357113174bbeaff92e9"},
+    {file = "ijson-3.1.4-cp38-cp38-win32.whl", hash = "sha256:5b725f2e984ce70d464b195f206fa44bebbd744da24139b61fec72de77c03a16"},
+    {file = "ijson-3.1.4-cp38-cp38-win_amd64.whl", hash = "sha256:a5965c315fbb2dc9769dfdf046eb07daf48ae20b637da95ec8d62b629be09df4"},
+    {file = "ijson-3.1.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b8ee7dbb07cec9ba29d60cfe4954b3cc70adb5f85bba1f72225364b59c1cf82b"},
+    {file = "ijson-3.1.4-cp39-cp39-manylinux1_i686.whl", hash = "sha256:d9e01c55d501e9c3d686b6ee3af351c9c0c8c3e45c5576bd5601bee3e1300b09"},
+    {file = "ijson-3.1.4-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:297f26f27a04cd0d0a2f865d154090c48ea11b239cabe0a17a6c65f0314bd1ca"},
+    {file = "ijson-3.1.4-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:9239973100338a4138d09d7a4602bd289861e553d597cd67390c33bfc452253e"},
+    {file = "ijson-3.1.4-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:2a64c66a08f56ed45a805691c2fd2e1caef00edd6ccf4c4e5eff02cd94ad8364"},
+    {file = "ijson-3.1.4-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:d17fd199f0d0a4ab6e0d541b4eec1b68b5bd5bb5d8104521e22243015b51049b"},
+    {file = "ijson-3.1.4-cp39-cp39-win32.whl", hash = "sha256:70ee3c8fa0eba18c80c5911639c01a8de4089a4361bad2862a9949e25ec9b1c8"},
+    {file = "ijson-3.1.4-cp39-cp39-win_amd64.whl", hash = "sha256:6bf2b64304321705d03fa5e403ec3f36fa5bb27bf661849ad62e0a3a49bc23e3"},
+    {file = "ijson-3.1.4-pp27-pypy_73-macosx_10_9_x86_64.whl", hash = "sha256:5d7e3fcc3b6de76a9dba1e9fc6ca23dad18f0fa6b4e6499415e16b684b2e9af1"},
+    {file = "ijson-3.1.4-pp27-pypy_73-manylinux1_x86_64.whl", hash = "sha256:a72eb0359ebff94754f7a2f00a6efe4c57716f860fc040c606dedcb40f49f233"},
+    {file = "ijson-3.1.4-pp27-pypy_73-manylinux2010_x86_64.whl", hash = "sha256:28fc168f5faf5759fdfa2a63f85f1f7a148bbae98f34404a6ba19f3d08e89e87"},
+    {file = "ijson-3.1.4-pp36-pypy36_pp73-macosx_10_9_x86_64.whl", hash = "sha256:2844d4a38d27583897ed73f7946e205b16926b4cab2525d1ce17e8b08064c706"},
+    {file = "ijson-3.1.4-pp36-pypy36_pp73-manylinux1_x86_64.whl", hash = "sha256:252defd1f139b5fb8c764d78d5e3a6df81543d9878c58992a89b261369ea97a7"},
+    {file = "ijson-3.1.4-pp36-pypy36_pp73-manylinux2010_x86_64.whl", hash = "sha256:15d5356b4d090c699f382c8eb6a2bcd5992a8c8e8b88c88bc6e54f686018328a"},
+    {file = "ijson-3.1.4-pp36-pypy36_pp73-win32.whl", hash = "sha256:6774ec0a39647eea70d35fb76accabe3d71002a8701c0545b9120230c182b75b"},
+    {file = "ijson-3.1.4-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:f11da15ec04cc83ff0f817a65a3392e169be8d111ba81f24d6e09236597bb28c"},
+    {file = "ijson-3.1.4-pp37-pypy37_pp73-manylinux1_x86_64.whl", hash = "sha256:ee13ceeed9b6cf81b3b8197ef15595fc43fd54276842ed63840ddd49db0603da"},
+    {file = "ijson-3.1.4-pp37-pypy37_pp73-manylinux2010_x86_64.whl", hash = "sha256:97e4df67235fae40d6195711223520d2c5bf1f7f5087c2963fcde44d72ebf448"},
+    {file = "ijson-3.1.4-pp37-pypy37_pp73-win32.whl", hash = "sha256:3d10eee52428f43f7da28763bb79f3d90bbbeea1accb15de01e40a00885b6e89"},
+    {file = "ijson-3.1.4.tar.gz", hash = "sha256:1d1003ae3c6115ec9b587d29dd136860a81a23c7626b682e2b5b12c9fd30e4ea"},
+]
+imageio = [
+    {file = "imageio-2.9.0-py3-none-any.whl", hash = "sha256:3604d751f03002e8e0e7650aa71d8d9148144a87daf17cb1f3228e80747f2e6b"},
+    {file = "imageio-2.9.0.tar.gz", hash = "sha256:52ddbaeca2dccf53ba2d6dec5676ca7bc3b2403ef8b37f7da78b7654bb3e10f0"},
+]
+importlib-metadata = [
+    {file = "importlib_metadata-4.2.0-py3-none-any.whl", hash = "sha256:057e92c15bc8d9e8109738a48db0ccb31b4d9d5cfbee5a8670879a30be66304b"},
+    {file = "importlib_metadata-4.2.0.tar.gz", hash = "sha256:b7e52a1f8dec14a75ea73e0891f3060099ca1d8e6a462a4dff11c3e119ea1b31"},
+]
+importlib-resources = [
+    {file = "importlib_resources-5.4.0-py3-none-any.whl", hash = "sha256:33a95faed5fc19b4bc16b29a6eeae248a3fe69dd55d4d229d2b480e23eeaad45"},
+    {file = "importlib_resources-5.4.0.tar.gz", hash = "sha256:d756e2f85dd4de2ba89be0b21dba2a3bbec2e871a42a3a16719258a11f87506b"},
+]
+ipykernel = [
+    {file = "ipykernel-6.7.0-py3-none-any.whl", hash = "sha256:6203ccd5510ff148e9433fd4a2707c5ce8d688f026427f46e13d7ebf9b3e9787"},
+    {file = "ipykernel-6.7.0.tar.gz", hash = "sha256:d82b904fdc2fd8c7b1fbe0fa481c68a11b4cd4c8ef07e6517da1f10cc3114d24"},
+]
+ipyparallel = [
+    {file = "ipyparallel-8.1.0-py3-none-any.whl", hash = "sha256:83bdbfe1f9dc6c3487aaa645dbba1a4effa9101e14e255f3291b862cc0d696cf"},
+    {file = "ipyparallel-8.1.0.tar.gz", hash = "sha256:63f7e136e88f890e9802522fa5475dd81e7614ba06a8cfe4f80cc3056fdb7d73"},
+]
+ipython = [
+    {file = "ipython-7.31.0-py3-none-any.whl", hash = "sha256:4c4234cdcc6b8f87c5b5c7af9899aa696ac5cfcf0e9f6d0688018bbee5c73bce"},
+    {file = "ipython-7.31.0.tar.gz", hash = "sha256:346c74db7312c41fa566d3be45d2e759a528dcc2994fe48aac1a03a70cd668a3"},
+]
+isodate = [
+    {file = "isodate-0.6.1-py2.py3-none-any.whl", hash = "sha256:0751eece944162659049d35f4f549ed815792b38793f07cf73381c1c87cbed96"},
+    {file = "isodate-0.6.1.tar.gz", hash = "sha256:48c5881de7e8b0a0d648cb024c8062dc84e7b840ed81e864c7614fd3c127bde9"},
+]
+jedi = [
+    {file = "jedi-0.18.1-py2.py3-none-any.whl", hash = "sha256:637c9635fcf47945ceb91cd7f320234a7be540ded6f3e99a50cb6febdfd1ba8d"},
+    {file = "jedi-0.18.1.tar.gz", hash = "sha256:74137626a64a99c8eb6ae5832d99b3bdd7d29a3850fe2aa80a4126b2a7d949ab"},
+]
+jmespath = [
+    {file = "jmespath-0.10.0-py2.py3-none-any.whl", hash = "sha256:cdf6525904cc597730141d61b36f2e4b8ecc257c420fa2f4549bac2c2d0cb72f"},
+    {file = "jmespath-0.10.0.tar.gz", hash = "sha256:b85d0567b8666149a93172712e68920734333c0ce7e89b78b3e987f71e5ed4f9"},
+]
+jsonlines = [
+    {file = "jsonlines-3.0.0-py3-none-any.whl", hash = "sha256:15f93e1817162c85bc268c7428952beec4fc4a41f118abf891c4bedf5653624f"},
+    {file = "jsonlines-3.0.0.tar.gz", hash = "sha256:72c8ca6c056906d6acb058dd5fdd5e072a58b9c6753ce0c9ec6f2b0a1853eba4"},
+]
+jsonschema = [
+    {file = "jsonschema-4.3.0-py3-none-any.whl", hash = "sha256:ab7069946a3ad2037e79a5cdc8d0e9a74cd00721d426d75c5d69a6707c778218"},
+    {file = "jsonschema-4.3.0.tar.gz", hash = "sha256:cb7f57b40f870409d7571844d0623f66d8078c90a9c255d9a4d4314b5ec3fc7c"},
+]
+jupyter-client = [
+    {file = "jupyter_client-7.1.1-py3-none-any.whl", hash = "sha256:f0c576cce235c727e30b0a0da88c2755d0947d0070fa1bc45f195079ffd64e66"},
+    {file = "jupyter_client-7.1.1.tar.gz", hash = "sha256:540ca35e57e83c5ece81abd9b781a57cba39a37c60a2a30c8c1b2f6663544343"},
+]
+jupyter-core = [
+    {file = "jupyter_core-4.9.1-py3-none-any.whl", hash = "sha256:1c091f3bbefd6f2a8782f2c1db662ca8478ac240e962ae2c66f0b87c818154ea"},
+    {file = "jupyter_core-4.9.1.tar.gz", hash = "sha256:dce8a7499da5a53ae3afd5a9f4b02e5df1d57250cf48f3ad79da23b4778cd6fa"},
+]
+kiwisolver = [
+    {file = "kiwisolver-1.3.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:1d819553730d3c2724582124aee8a03c846ec4362ded1034c16fb3ef309264e6"},
+    {file = "kiwisolver-1.3.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:8d93a1095f83e908fc253f2fb569c2711414c0bfd451cab580466465b235b470"},
+    {file = "kiwisolver-1.3.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c4550a359c5157aaf8507e6820d98682872b9100ce7607f8aa070b4b8af6c298"},
+    {file = "kiwisolver-1.3.2-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:2210f28778c7d2ee13f3c2a20a3a22db889e75f4ec13a21072eabb5693801e84"},
+    {file = "kiwisolver-1.3.2-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:82f49c5a79d3839bc8f38cb5f4bfc87e15f04cbafa5fbd12fb32c941cb529cfb"},
+    {file = "kiwisolver-1.3.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9661a04ca3c950a8ac8c47f53cbc0b530bce1b52f516a1e87b7736fec24bfff0"},
+    {file = "kiwisolver-1.3.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2ddb500a2808c100e72c075cbb00bf32e62763c82b6a882d403f01a119e3f402"},
+    {file = "kiwisolver-1.3.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:72be6ebb4e92520b9726d7146bc9c9b277513a57a38efcf66db0620aec0097e0"},
+    {file = "kiwisolver-1.3.2-cp310-cp310-win32.whl", hash = "sha256:83d2c9db5dfc537d0171e32de160461230eb14663299b7e6d18ca6dca21e4977"},
+    {file = "kiwisolver-1.3.2-cp310-cp310-win_amd64.whl", hash = "sha256:cba430db673c29376135e695c6e2501c44c256a81495da849e85d1793ee975ad"},
+    {file = "kiwisolver-1.3.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:4116ba9a58109ed5e4cb315bdcbff9838f3159d099ba5259c7c7fb77f8537492"},
+    {file = "kiwisolver-1.3.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:19554bd8d54cf41139f376753af1a644b63c9ca93f8f72009d50a2080f870f77"},
+    {file = "kiwisolver-1.3.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a7a4cf5bbdc861987a7745aed7a536c6405256853c94abc9f3287c3fa401b174"},
+    {file = "kiwisolver-1.3.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0007840186bacfaa0aba4466d5890334ea5938e0bb7e28078a0eb0e63b5b59d5"},
+    {file = "kiwisolver-1.3.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ec2eba188c1906b05b9b49ae55aae4efd8150c61ba450e6721f64620c50b59eb"},
+    {file = "kiwisolver-1.3.2-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:3dbb3cea20b4af4f49f84cffaf45dd5f88e8594d18568e0225e6ad9dec0e7967"},
+    {file = "kiwisolver-1.3.2-cp37-cp37m-win32.whl", hash = "sha256:5326ddfacbe51abf9469fe668944bc2e399181a2158cb5d45e1d40856b2a0589"},
+    {file = "kiwisolver-1.3.2-cp37-cp37m-win_amd64.whl", hash = "sha256:c6572c2dab23c86a14e82c245473d45b4c515314f1f859e92608dcafbd2f19b8"},
+    {file = "kiwisolver-1.3.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:b5074fb09429f2b7bc82b6fb4be8645dcbac14e592128beeff5461dcde0af09f"},
+    {file = "kiwisolver-1.3.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:22521219ca739654a296eea6d4367703558fba16f98688bd8ce65abff36eaa84"},
+    {file = "kiwisolver-1.3.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:c358721aebd40c243894298f685a19eb0491a5c3e0b923b9f887ef1193ddf829"},
+    {file = "kiwisolver-1.3.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7ba5a1041480c6e0a8b11a9544d53562abc2d19220bfa14133e0cdd9967e97af"},
+    {file = "kiwisolver-1.3.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:44e6adf67577dbdfa2d9f06db9fbc5639afefdb5bf2b4dfec25c3a7fbc619536"},
+    {file = "kiwisolver-1.3.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1d45d1c74f88b9f41062716c727f78f2a59a5476ecbe74956fafb423c5c87a76"},
+    {file = "kiwisolver-1.3.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:70adc3658138bc77a36ce769f5f183169bc0a2906a4f61f09673f7181255ac9b"},
+    {file = "kiwisolver-1.3.2-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:b6a5431940f28b6de123de42f0eb47b84a073ee3c3345dc109ad550a3307dd28"},
+    {file = "kiwisolver-1.3.2-cp38-cp38-win32.whl", hash = "sha256:ee040a7de8d295dbd261ef2d6d3192f13e2b08ec4a954de34a6fb8ff6422e24c"},
+    {file = "kiwisolver-1.3.2-cp38-cp38-win_amd64.whl", hash = "sha256:8dc3d842fa41a33fe83d9f5c66c0cc1f28756530cd89944b63b072281e852031"},
+    {file = "kiwisolver-1.3.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:a498bcd005e8a3fedd0022bb30ee0ad92728154a8798b703f394484452550507"},
+    {file = "kiwisolver-1.3.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:80efd202108c3a4150e042b269f7c78643420cc232a0a771743bb96b742f838f"},
+    {file = "kiwisolver-1.3.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f8eb7b6716f5b50e9c06207a14172cf2de201e41912ebe732846c02c830455b9"},
+    {file = "kiwisolver-1.3.2-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:f441422bb313ab25de7b3dbfd388e790eceb76ce01a18199ec4944b369017009"},
+    {file = "kiwisolver-1.3.2-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:30fa008c172355c7768159983a7270cb23838c4d7db73d6c0f6b60dde0d432c6"},
+    {file = "kiwisolver-1.3.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2f8f6c8f4f1cff93ca5058d6ec5f0efda922ecb3f4c5fb76181f327decff98b8"},
+    {file = "kiwisolver-1.3.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ba677bcaff9429fd1bf01648ad0901cea56c0d068df383d5f5856d88221fe75b"},
+    {file = "kiwisolver-1.3.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7843b1624d6ccca403a610d1277f7c28ad184c5aa88a1750c1a999754e65b439"},
+    {file = "kiwisolver-1.3.2-cp39-cp39-win32.whl", hash = "sha256:e6f5eb2f53fac7d408a45fbcdeda7224b1cfff64919d0f95473420a931347ae9"},
+    {file = "kiwisolver-1.3.2-cp39-cp39-win_amd64.whl", hash = "sha256:eedd3b59190885d1ebdf6c5e0ca56828beb1949b4dfe6e5d0256a461429ac386"},
+    {file = "kiwisolver-1.3.2-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:dedc71c8eb9c5096037766390172c34fb86ef048b8e8958b4e484b9e505d66bc"},
+    {file = "kiwisolver-1.3.2-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:bf7eb45d14fc036514c09554bf983f2a72323254912ed0c3c8e697b62c4c158f"},
+    {file = "kiwisolver-1.3.2-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:2b65bd35f3e06a47b5c30ea99e0c2b88f72c6476eedaf8cfbc8e66adb5479dcf"},
+    {file = "kiwisolver-1.3.2-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:25405f88a37c5f5bcba01c6e350086d65e7465fd1caaf986333d2a045045a223"},
+    {file = "kiwisolver-1.3.2-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:bcadb05c3d4794eb9eee1dddf1c24215c92fb7b55a80beae7a60530a91060560"},
+    {file = "kiwisolver-1.3.2.tar.gz", hash = "sha256:fc4453705b81d03568d5b808ad8f09c77c47534f6ac2e72e733f9ca4714aa75c"},
+]
+linear-tsv = [
+    {file = "linear-tsv-1.1.0.tar.gz", hash = "sha256:b504d78f4075615ae75de86a16e5680701a441fc84da2a2cf9f94351ab1ccbf5"},
+]
+llvmlite = [
+    {file = "llvmlite-0.34.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:11342e5ac320c953590bdd9d0dec8c52f4b5252c4c6335ba25f1e7b9f91f9325"},
+    {file = "llvmlite-0.34.0-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:5bdf0ce430adfaf938ced5844d12f80616eb8321b5b9edfc45ef84ada5c5242c"},
+    {file = "llvmlite-0.34.0-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:e08d9d2dc5a31636bfc6b516d2d7daba95632afa3419eb8730dc76a7951e9558"},
+    {file = "llvmlite-0.34.0-cp36-cp36m-win32.whl", hash = "sha256:9ff1dcdad03be0cf953aca5fc8cffdca25ccee2ec9e8ec7e95571722cdc02d55"},
+    {file = "llvmlite-0.34.0-cp36-cp36m-win_amd64.whl", hash = "sha256:5acdc3c3c7ea0ef7a1a6b442272e05d695bc8492e5b07666135ed1cfbf4ab9d2"},
+    {file = "llvmlite-0.34.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:bb96989bc57a1ccb131e7a0e061d07b68139b6f81a98912345d53d9239e231e1"},
+    {file = "llvmlite-0.34.0-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:6d3f81992f52a94077e7b9b16497029daf5b5eebb2cce56f3c8345bbc9c6308e"},
+    {file = "llvmlite-0.34.0-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:d841248d1c630426c93e3eb3f8c45bca0dab77c09faeb7553b1a500220e362ce"},
+    {file = "llvmlite-0.34.0-cp37-cp37m-win32.whl", hash = "sha256:408b15ffec30696406e821c89da010f1bb1eb0aa572be4561c98eb2536d610ab"},
+    {file = "llvmlite-0.34.0-cp37-cp37m-win_amd64.whl", hash = "sha256:5d1f370bf150db7239204f09cf6a0603292ea28bac984e69b167e16fe160d803"},
+    {file = "llvmlite-0.34.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:132322bc084abf336c80dd106f9357978c8c085911fb656898d3be0d9ff057ea"},
+    {file = "llvmlite-0.34.0-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:8f344102745fceba6eb5bf03c228bb290e9bc79157e9506a4a72878d636f9b3c"},
+    {file = "llvmlite-0.34.0-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:05253f3f44fab0148276335b2c1b2c4a78143dfa78e6bafd7f937d6248f297cc"},
+    {file = "llvmlite-0.34.0-cp38-cp38-win32.whl", hash = "sha256:28264f9e2b3df4135cbcfca5a91c5b0b31dd3fc02fa623b4bb13327f0cd4fc80"},
+    {file = "llvmlite-0.34.0-cp38-cp38-win_amd64.whl", hash = "sha256:964f8f7a2184963cb3617d057c2382575953e488b7bb061b632ee014cfef110a"},
+    {file = "llvmlite-0.34.0.tar.gz", hash = "sha256:f03ee0d19bca8f2fe922bb424a909d05c28411983b0c2bc58b020032a0d11f63"},
+]
+locket = [
+    {file = "locket-0.2.1-py2.py3-none-any.whl", hash = "sha256:12b6ada59d1f50710bca9704dbadd3f447dbf8dac6664575c1281cadab8e6449"},
+    {file = "locket-0.2.1.tar.gz", hash = "sha256:3e1faba403619fe201552f083f1ecbf23f550941bc51985ac6ed4d02d25056dd"},
+]
+matplotlib = [
+    {file = "matplotlib-3.4.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:5c988bb43414c7c2b0a31bd5187b4d27fd625c080371b463a6d422047df78913"},
+    {file = "matplotlib-3.4.3-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:f1c5efc278d996af8a251b2ce0b07bbeccb821f25c8c9846bdcb00ffc7f158aa"},
+    {file = "matplotlib-3.4.3-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:eeb1859efe7754b1460e1d4991bbd4a60a56f366bc422ef3a9c5ae05f0bc70b5"},
+    {file = "matplotlib-3.4.3-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:844a7b0233e4ff7fba57e90b8799edaa40b9e31e300b8d5efc350937fa8b1bea"},
+    {file = "matplotlib-3.4.3-cp37-cp37m-win32.whl", hash = "sha256:85f0c9cf724715e75243a7b3087cf4a3de056b55e05d4d76cc58d610d62894f3"},
+    {file = "matplotlib-3.4.3-cp37-cp37m-win_amd64.whl", hash = "sha256:c70b6311dda3e27672f1bf48851a0de816d1ca6aaf3d49365fbdd8e959b33d2b"},
+    {file = "matplotlib-3.4.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b884715a59fec9ad3b6048ecf3860f3b2ce965e676ef52593d6fa29abcf7d330"},
+    {file = "matplotlib-3.4.3-cp38-cp38-manylinux1_i686.whl", hash = "sha256:a78a3b51f29448c7f4d4575e561f6b0dbb8d01c13c2046ab6c5220eb25c06506"},
+    {file = "matplotlib-3.4.3-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:6a724e3a48a54b8b6e7c4ae38cd3d07084508fa47c410c8757e9db9791421838"},
+    {file = "matplotlib-3.4.3-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:48e1e0859b54d5f2e29bb78ca179fd59b971c6ceb29977fb52735bfd280eb0f5"},
+    {file = "matplotlib-3.4.3-cp38-cp38-win32.whl", hash = "sha256:01c9de93a2ca0d128c9064f23709362e7fefb34910c7c9e0b8ab0de8258d5eda"},
+    {file = "matplotlib-3.4.3-cp38-cp38-win_amd64.whl", hash = "sha256:ebfb01a65c3f5d53a8c2a8133fec2b5221281c053d944ae81ff5822a68266617"},
+    {file = "matplotlib-3.4.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b8b53f336a4688cfce615887505d7e41fd79b3594bf21dd300531a4f5b4f746a"},
+    {file = "matplotlib-3.4.3-cp39-cp39-manylinux1_i686.whl", hash = "sha256:fcd6f1954943c0c192bfbebbac263f839d7055409f1173f80d8b11a224d236da"},
+    {file = "matplotlib-3.4.3-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:6be8df61b1626e1a142c57e065405e869e9429b4a6dab4a324757d0dc4d42235"},
+    {file = "matplotlib-3.4.3-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:41b6e307458988891fcdea2d8ecf84a8c92d53f84190aa32da65f9505546e684"},
+    {file = "matplotlib-3.4.3-cp39-cp39-win32.whl", hash = "sha256:f72657f1596199dc1e4e7a10f52a4784ead8a711f4e5b59bea95bdb97cf0e4fd"},
+    {file = "matplotlib-3.4.3-cp39-cp39-win_amd64.whl", hash = "sha256:f15edcb0629a0801738925fe27070480f446fcaa15de65946ff946ad99a59a40"},
+    {file = "matplotlib-3.4.3-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:556965514b259204637c360d213de28d43a1f4aed1eca15596ce83f768c5a56f"},
+    {file = "matplotlib-3.4.3-pp37-pypy37_pp73-manylinux2010_x86_64.whl", hash = "sha256:54a026055d5f8614f184e588f6e29064019a0aa8448450214c0b60926d62d919"},
+    {file = "matplotlib-3.4.3.tar.gz", hash = "sha256:fc4f526dfdb31c9bd6b8ca06bf9fab663ca12f3ec9cdf4496fb44bc680140318"},
+]
+matplotlib-inline = [
+    {file = "matplotlib-inline-0.1.3.tar.gz", hash = "sha256:a04bfba22e0d1395479f866853ec1ee28eea1485c1d69a6faf00dc3e24ff34ee"},
+    {file = "matplotlib_inline-0.1.3-py3-none-any.whl", hash = "sha256:aed605ba3b72462d64d475a21a9296f400a19c4f74a31b59103d2a99ffd5aa5c"},
+]
+mccabe = [
+    {file = "mccabe-0.6.1-py2.py3-none-any.whl", hash = "sha256:ab8a6258860da4b6677da4bd2fe5dc2c659cff31b3ee4f7f5d64e79735b80d42"},
+    {file = "mccabe-0.6.1.tar.gz", hash = "sha256:dd8d182285a0fe56bace7f45b5e7d1a6ebcbf524e8f3bd87eb0f125271b8831f"},
+]
+mdf-toolbox = [
+    {file = "mdf_toolbox-0.5.12-py2.py3-none-any.whl", hash = "sha256:ed2953795894ab0d49191235667c742385d9d4f509744f2fb67b6d43438b42aa"},
+    {file = "mdf_toolbox-0.5.12.tar.gz", hash = "sha256:1373404afaf4e3247f348daeeba2b8b7e8f9d1acbd834aeb782329326f0f6e9a"},
+]
+monty = [
+    {file = "monty-2022.1.12.1-py3-none-any.whl", hash = "sha256:40ebfcfdc08a843e30126dcb73507b6998d3a50cc24c691e5dcb21dca9d7bab6"},
+    {file = "monty-2022.1.12.1.tar.gz", hash = "sha256:54cbf726bddbb310665dc014dc79bf4c86fc6cc704e59470ccce5247050d255a"},
+]
+more-itertools = [
+    {file = "more-itertools-8.12.0.tar.gz", hash = "sha256:7dc6ad46f05f545f900dd59e8dfb4e84a4827b97b3cfecb175ea0c7d247f6064"},
+    {file = "more_itertools-8.12.0-py3-none-any.whl", hash = "sha256:43e6dd9942dffd72661a2c4ef383ad7da1e6a3e968a927ad7a6083ab410a688b"},
+]
+mpmath = [
+    {file = "mpmath-1.2.1-py3-none-any.whl", hash = "sha256:604bc21bd22d2322a177c73bdb573994ef76e62edd595d17e00aff24b0667e5c"},
+    {file = "mpmath-1.2.1.tar.gz", hash = "sha256:79ffb45cf9f4b101a807595bcb3e72e0396202e0b1d25d689134b48c4216a81a"},
+]
+natsort = [
+    {file = "natsort-8.0.2-py3-none-any.whl", hash = "sha256:09cff3cabb617f9794f643758ab5b337c1c0af1a6df11edf5c04de496fd7fb26"},
+    {file = "natsort-8.0.2.tar.gz", hash = "sha256:feb87e0ce1dc1f8f3f21e18a85216c790e746d76a5ff6889563394605f504a2b"},
+]
+nest-asyncio = [
+    {file = "nest_asyncio-1.5.4-py3-none-any.whl", hash = "sha256:3fdd0d6061a2bb16f21fe8a9c6a7945be83521d81a0d15cff52e9edee50101d6"},
+    {file = "nest_asyncio-1.5.4.tar.gz", hash = "sha256:f969f6013a16fadb4adcf09d11a68a4f617c6049d7af7ac2c676110169a63abd"},
+]
+networkx = [
+    {file = "networkx-2.6.3-py3-none-any.whl", hash = "sha256:80b6b89c77d1dfb64a4c7854981b60aeea6360ac02c6d4e4913319e0a313abef"},
+    {file = "networkx-2.6.3.tar.gz", hash = "sha256:c0946ed31d71f1b732b5aaa6da5a0388a345019af232ce2f49c766e2d6795c51"},
+]
+numba = [
+    {file = "numba-0.51.2-cp36-cp36m-macosx_10_14_x86_64.whl", hash = "sha256:af798310eeb318c56cdb83254abbe9a938cc0182d08671d7f9f032dc817e064d"},
+    {file = "numba-0.51.2-cp36-cp36m-manylinux2014_i686.whl", hash = "sha256:93e18350f2094e7432321c1275730a3143b94af012fb609cc180fa376c44867f"},
+    {file = "numba-0.51.2-cp36-cp36m-manylinux2014_x86_64.whl", hash = "sha256:9e2bb1f129bfadd757ad7a9c18ab79c3ab25ce6d6a68e58565d6c52ad07b3566"},
+    {file = "numba-0.51.2-cp36-cp36m-win32.whl", hash = "sha256:31cdf6b6d1301d5fb6c4fcb8b4c711ba5c9f60ba2fca008b550da9b56185367c"},
+    {file = "numba-0.51.2-cp36-cp36m-win_amd64.whl", hash = "sha256:df6edca13c04a31fdb5addf5205199478a7da372712829157ef491e8a6e7031f"},
+    {file = "numba-0.51.2-cp37-cp37m-macosx_10_14_x86_64.whl", hash = "sha256:a628122dacfcba9a3ea68a9e95578c6b6391016e34962c46550ea8e189e0412e"},
+    {file = "numba-0.51.2-cp37-cp37m-manylinux2014_i686.whl", hash = "sha256:106736d5a8dab6bebce989d4ab1b3f169c264582598f172e6e5b736210d2e834"},
+    {file = "numba-0.51.2-cp37-cp37m-manylinux2014_x86_64.whl", hash = "sha256:a12f16fdb4ca5edc94e2ef412e4e768c29217ef9b6fdfc237d064ebe30acfe14"},
+    {file = "numba-0.51.2-cp37-cp37m-win32.whl", hash = "sha256:025b033fd31c44bba17802293c81270084b5454b5b055b8c10c394385c232f00"},
+    {file = "numba-0.51.2-cp37-cp37m-win_amd64.whl", hash = "sha256:081788f584fa500339e9b74bf02e3c5029d408c114e555ada19cae0b92721416"},
+    {file = "numba-0.51.2-cp38-cp38-macosx_10_14_x86_64.whl", hash = "sha256:5416b584183fd599afda11b947b64f89450fcf26a9c15b408167f412b98a3a94"},
+    {file = "numba-0.51.2-cp38-cp38-manylinux2014_i686.whl", hash = "sha256:05da65dca2ac28a192c9d8f20e9e477eb1237205cfc4d131c414f5f8092c6639"},
+    {file = "numba-0.51.2-cp38-cp38-manylinux2014_x86_64.whl", hash = "sha256:aee435e3b7e465dd49971f8ea76aa414532a87736916cb399534e017334d1138"},
+    {file = "numba-0.51.2-cp38-cp38-win32.whl", hash = "sha256:bbbe2432433b11d3fadab0226a84c1a81918cb905ba1aeb022249e8d2ba8856c"},
+    {file = "numba-0.51.2-cp38-cp38-win_amd64.whl", hash = "sha256:259e7c15b24feec4a99fb41eb8c47b5ad49b544d1a5ad40ad0252ef531ba06fd"},
+    {file = "numba-0.51.2.tar.gz", hash = "sha256:16bd59572114adbf5f600ea383880d7b2071ae45477e84a24994e089ea390768"},
+]
+numexpr = [
+    {file = "numexpr-2.8.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d148e99483e15de22d0acd5100136d39a336e91c8f8d37bf2e84e9f0ab4c0610"},
+    {file = "numexpr-2.8.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ebf31aeed426840aefe1e94c89bb0b7530a72be36444ed4c73e4411865b79be5"},
+    {file = "numexpr-2.8.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:3bab5add6628fa8bb66fba7b1f0eed5d8d0ce05fdd2dcc326dde8a297a961c46"},
+    {file = "numexpr-2.8.1-cp310-cp310-win32.whl", hash = "sha256:79ec94295aa57f5a9d212116bb7359744cd2f9e05d477df0dee383b7f44b9588"},
+    {file = "numexpr-2.8.1-cp310-cp310-win_amd64.whl", hash = "sha256:cfd89f63028f8df3c9b11bf2c98085184f967a09f543a77c3335f4a0ec54f124"},
+    {file = "numexpr-2.8.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:517f299c4bc8491b5117aa276e8f3cf7ee2e89223922e92e2ea78a32985d5087"},
+    {file = "numexpr-2.8.1-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a9f046cb5752f08a9291dc1fd37a9cfd15770262188bb984e4418490fef9c9ec"},
+    {file = "numexpr-2.8.1-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:6bce8a183afe157c25385d27be314be22f06ba644c89b611d20e2570a06bd5dd"},
+    {file = "numexpr-2.8.1-cp36-cp36m-win32.whl", hash = "sha256:1639561d056d2d790a56ddab7e7df40b6181ad50338b50fba94aa42874a00958"},
+    {file = "numexpr-2.8.1-cp36-cp36m-win_amd64.whl", hash = "sha256:a97a087a5f5e56cd81c69215918fdaca60eb478a099daa757455e4ff887f7600"},
+    {file = "numexpr-2.8.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:bd402e43b8baf6436b7c2c14541f69eb4f97f023469585a7ad258c49622ff619"},
+    {file = "numexpr-2.8.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:48258db3ba89ad028744e07b09dde963f82da7f081849d3a003bb0b96b112d4f"},
+    {file = "numexpr-2.8.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:4eb79d9026f013cf8d16de8be74911c74c0c09362627bf4b39e2b7f1f3188c28"},
+    {file = "numexpr-2.8.1-cp37-cp37m-win32.whl", hash = "sha256:fd6905bc80a11908e363c9821cbf8aeeca4dca5b6a2eea90a97b055bc73443e6"},
+    {file = "numexpr-2.8.1-cp37-cp37m-win_amd64.whl", hash = "sha256:da180aaec7f6c387540b251f6ec2b8d280220c0e45731778853c8b0d86c4ae22"},
+    {file = "numexpr-2.8.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b57d3ab7054409d9b4d2148241ae70d738c0b0daeb1a0efd5ea89b9279752e22"},
+    {file = "numexpr-2.8.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d7b64b125161e722c9dc8a27df282e755bd9a5adf826b2e3e1f038e3dfdc3307"},
+    {file = "numexpr-2.8.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:a591f99ecbb413749725e8da4e52e663f0939dd5fbf1ae5a7c6c50ba734f57de"},
+    {file = "numexpr-2.8.1-cp38-cp38-win32.whl", hash = "sha256:80db25e2934fd1a1b787440d5fa7946adb79a1289d7dc64e2c8bcd6ceae660ad"},
+    {file = "numexpr-2.8.1-cp38-cp38-win_amd64.whl", hash = "sha256:d2b4b6379763ec5d794d4aaa1834ae00f1bba82a36d0b99c6e2d559302a21e85"},
+    {file = "numexpr-2.8.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:ab6b2cb64bc9391f77f08203fda5af3647ed2abcefb928cc6282727854f97735"},
+    {file = "numexpr-2.8.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2247d92da60b85de619e797e59a80e9c7302fba82dcd0525de8f7dd729a0d60f"},
+    {file = "numexpr-2.8.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5d0c98c4d8bcc25962e5859176e5728f69209cffb9b7f64bf6d1c801fe350946"},
+    {file = "numexpr-2.8.1-cp39-cp39-win32.whl", hash = "sha256:24fb5b2c17273a76e7de9cea7817c54262198657998a093fceb4030f273524c7"},
+    {file = "numexpr-2.8.1-cp39-cp39-win_amd64.whl", hash = "sha256:920c6a3088790573765e103e20592864977aa4b4d1b819c298fa9d88771cde1b"},
+    {file = "numexpr-2.8.1.tar.gz", hash = "sha256:cd779aa44dd986c4ef10163519239602b027be06a527946656207acf1f58113b"},
+]
+numpy = [
+    {file = "numpy-1.21.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:38e8648f9449a549a7dfe8d8755a5979b45b3538520d1e735637ef28e8c2dc50"},
+    {file = "numpy-1.21.1-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:fd7d7409fa643a91d0a05c7554dd68aa9c9bb16e186f6ccfe40d6e003156e33a"},
+    {file = "numpy-1.21.1-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:a75b4498b1e93d8b700282dc8e655b8bd559c0904b3910b144646dbbbc03e062"},
+    {file = "numpy-1.21.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1412aa0aec3e00bc23fbb8664d76552b4efde98fb71f60737c83efbac24112f1"},
+    {file = "numpy-1.21.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e46ceaff65609b5399163de5893d8f2a82d3c77d5e56d976c8b5fb01faa6b671"},
+    {file = "numpy-1.21.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:c6a2324085dd52f96498419ba95b5777e40b6bcbc20088fddb9e8cbb58885e8e"},
+    {file = "numpy-1.21.1-cp37-cp37m-win32.whl", hash = "sha256:73101b2a1fef16602696d133db402a7e7586654682244344b8329cdcbbb82172"},
+    {file = "numpy-1.21.1-cp37-cp37m-win_amd64.whl", hash = "sha256:7a708a79c9a9d26904d1cca8d383bf869edf6f8e7650d85dbc77b041e8c5a0f8"},
+    {file = "numpy-1.21.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:95b995d0c413f5d0428b3f880e8fe1660ff9396dcd1f9eedbc311f37b5652e16"},
+    {file = "numpy-1.21.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:635e6bd31c9fb3d475c8f44a089569070d10a9ef18ed13738b03049280281267"},
+    {file = "numpy-1.21.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:4a3d5fb89bfe21be2ef47c0614b9c9c707b7362386c9a3ff1feae63e0267ccb6"},
+    {file = "numpy-1.21.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:8a326af80e86d0e9ce92bcc1e65c8ff88297de4fa14ee936cb2293d414c9ec63"},
+    {file = "numpy-1.21.1-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:791492091744b0fe390a6ce85cc1bf5149968ac7d5f0477288f78c89b385d9af"},
+    {file = "numpy-1.21.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0318c465786c1f63ac05d7c4dbcecd4d2d7e13f0959b01b534ea1e92202235c5"},
+    {file = "numpy-1.21.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:9a513bd9c1551894ee3d31369f9b07460ef223694098cf27d399513415855b68"},
+    {file = "numpy-1.21.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:91c6f5fc58df1e0a3cc0c3a717bb3308ff850abdaa6d2d802573ee2b11f674a8"},
+    {file = "numpy-1.21.1-cp38-cp38-win32.whl", hash = "sha256:978010b68e17150db8765355d1ccdd450f9fc916824e8c4e35ee620590e234cd"},
+    {file = "numpy-1.21.1-cp38-cp38-win_amd64.whl", hash = "sha256:9749a40a5b22333467f02fe11edc98f022133ee1bfa8ab99bda5e5437b831214"},
+    {file = "numpy-1.21.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:d7a4aeac3b94af92a9373d6e77b37691b86411f9745190d2c351f410ab3a791f"},
+    {file = "numpy-1.21.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:d9e7912a56108aba9b31df688a4c4f5cb0d9d3787386b87d504762b6754fbb1b"},
+    {file = "numpy-1.21.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:25b40b98ebdd272bc3020935427a4530b7d60dfbe1ab9381a39147834e985eac"},
+    {file = "numpy-1.21.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:8a92c5aea763d14ba9d6475803fc7904bda7decc2a0a68153f587ad82941fec1"},
+    {file = "numpy-1.21.1-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:05a0f648eb28bae4bcb204e6fd14603de2908de982e761a2fc78efe0f19e96e1"},
+    {file = "numpy-1.21.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f01f28075a92eede918b965e86e8f0ba7b7797a95aa8d35e1cc8821f5fc3ad6a"},
+    {file = "numpy-1.21.1-cp39-cp39-win32.whl", hash = "sha256:88c0b89ad1cc24a5efbb99ff9ab5db0f9a86e9cc50240177a571fbe9c2860ac2"},
+    {file = "numpy-1.21.1-cp39-cp39-win_amd64.whl", hash = "sha256:01721eefe70544d548425a07c80be8377096a54118070b8a62476866d5208e33"},
+    {file = "numpy-1.21.1-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:2d4d1de6e6fb3d28781c73fbde702ac97f03d79e4ffd6598b880b2d95d62ead4"},
+    {file = "numpy-1.21.1.zip", hash = "sha256:dff4af63638afcc57a3dfb9e4b26d434a7a602d225b42d746ea7fe2edf1342fd"},
+]
+openpyxl = [
+    {file = "openpyxl-3.0.9-py2.py3-none-any.whl", hash = "sha256:8f3b11bd896a95468a4ab162fc4fcd260d46157155d1f8bfaabb99d88cfcf79f"},
+    {file = "openpyxl-3.0.9.tar.gz", hash = "sha256:40f568b9829bf9e446acfffce30250ac1fa39035124d55fc024025c41481c90f"},
+]
+packaging = [
+    {file = "packaging-21.3-py3-none-any.whl", hash = "sha256:ef103e05f519cdc783ae24ea4e2e0f508a9c99b2d4969652eed6a2e1ea5bd522"},
+    {file = "packaging-21.3.tar.gz", hash = "sha256:dd47c42927d89ab911e606518907cc2d3a1f38bbd026385970643f9c5b8ecfeb"},
+]
+palettable = [
+    {file = "palettable-3.3.0-py2.py3-none-any.whl", hash = "sha256:c3bf3f548fc228e86bd3d16928bbf8d621c1d1098791ceab446d0e3a5e1298d1"},
+    {file = "palettable-3.3.0.tar.gz", hash = "sha256:72feca71cf7d79830cd6d9181b02edf227b867d503bec953cf9fa91bf44896bd"},
+]
+pandas = [
+    {file = "pandas-1.1.5-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:bf23a3b54d128b50f4f9d4675b3c1857a688cc6731a32f931837d72effb2698d"},
+    {file = "pandas-1.1.5-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:5a780260afc88268a9d3ac3511d8f494fdcf637eece62fb9eb656a63d53eb7ca"},
+    {file = "pandas-1.1.5-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:b61080750d19a0122469ab59b087380721d6b72a4e7d962e4d7e63e0c4504814"},
+    {file = "pandas-1.1.5-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:0de3ddb414d30798cbf56e642d82cac30a80223ad6fe484d66c0ce01a84d6f2f"},
+    {file = "pandas-1.1.5-cp36-cp36m-win32.whl", hash = "sha256:70865f96bb38fec46f7ebd66d4b5cfd0aa6b842073f298d621385ae3898d28b5"},
+    {file = "pandas-1.1.5-cp36-cp36m-win_amd64.whl", hash = "sha256:19a2148a1d02791352e9fa637899a78e371a3516ac6da5c4edc718f60cbae648"},
+    {file = "pandas-1.1.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:26fa92d3ac743a149a31b21d6f4337b0594b6302ea5575b37af9ca9611e8981a"},
+    {file = "pandas-1.1.5-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:c16d59c15d946111d2716856dd5479221c9e4f2f5c7bc2d617f39d870031e086"},
+    {file = "pandas-1.1.5-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:3be7a7a0ca71a2640e81d9276f526bca63505850add10206d0da2e8a0a325dae"},
+    {file = "pandas-1.1.5-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:573fba5b05bf2c69271a32e52399c8de599e4a15ab7cec47d3b9c904125ab788"},
+    {file = "pandas-1.1.5-cp37-cp37m-win32.whl", hash = "sha256:21b5a2b033380adbdd36b3116faaf9a4663e375325831dac1b519a44f9e439bb"},
+    {file = "pandas-1.1.5-cp37-cp37m-win_amd64.whl", hash = "sha256:24c7f8d4aee71bfa6401faeba367dd654f696a77151a8a28bc2013f7ced4af98"},
+    {file = "pandas-1.1.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2860a97cbb25444ffc0088b457da0a79dc79f9c601238a3e0644312fcc14bf11"},
+    {file = "pandas-1.1.5-cp38-cp38-manylinux1_i686.whl", hash = "sha256:5008374ebb990dad9ed48b0f5d0038124c73748f5384cc8c46904dace27082d9"},
+    {file = "pandas-1.1.5-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:2c2f7c670ea4e60318e4b7e474d56447cf0c7d83b3c2a5405a0dbb2600b9c48e"},
+    {file = "pandas-1.1.5-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:0a643bae4283a37732ddfcecab3f62dd082996021b980f580903f4e8e01b3c5b"},
+    {file = "pandas-1.1.5-cp38-cp38-win32.whl", hash = "sha256:5447ea7af4005b0daf695a316a423b96374c9c73ffbd4533209c5ddc369e644b"},
+    {file = "pandas-1.1.5-cp38-cp38-win_amd64.whl", hash = "sha256:4c62e94d5d49db116bef1bd5c2486723a292d79409fc9abd51adf9e05329101d"},
+    {file = "pandas-1.1.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:731568be71fba1e13cae212c362f3d2ca8932e83cb1b85e3f1b4dd77d019254a"},
+    {file = "pandas-1.1.5-cp39-cp39-manylinux1_i686.whl", hash = "sha256:c61c043aafb69329d0f961b19faa30b1dab709dd34c9388143fc55680059e55a"},
+    {file = "pandas-1.1.5-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:2b1c6cd28a0dfda75c7b5957363333f01d370936e4c6276b7b8e696dd500582a"},
+    {file = "pandas-1.1.5-cp39-cp39-win32.whl", hash = "sha256:c94ff2780a1fd89f190390130d6d36173ca59fcfb3fe0ff596f9a56518191ccb"},
+    {file = "pandas-1.1.5-cp39-cp39-win_amd64.whl", hash = "sha256:edda9bacc3843dfbeebaf7a701763e68e741b08fccb889c003b0a52f0ee95782"},
+    {file = "pandas-1.1.5.tar.gz", hash = "sha256:f10fc41ee3c75a474d3bdf68d396f10782d013d7f67db99c0efbfd0acb99701b"},
+]
+parso = [
+    {file = "parso-0.8.3-py2.py3-none-any.whl", hash = "sha256:c001d4636cd3aecdaf33cbb40aebb59b094be2a74c556778ef5576c175e19e75"},
+    {file = "parso-0.8.3.tar.gz", hash = "sha256:8c07be290bb59f03588915921e29e8a50002acaf2cdc5fa0e0114f91709fafa0"},
+]
+partd = [
+    {file = "partd-1.2.0-py3-none-any.whl", hash = "sha256:5c3a5d70da89485c27916328dc1e26232d0e270771bd4caef4a5124b6a457288"},
+    {file = "partd-1.2.0.tar.gz", hash = "sha256:aa67897b84d522dcbc86a98b942afab8c6aa2f7f677d904a616b74ef5ddbc3eb"},
+]
+pbr = [
+    {file = "pbr-5.8.0-py2.py3-none-any.whl", hash = "sha256:176e8560eaf61e127817ef93d8a844803abb27a4d4637f0ff3bb783129be2e0a"},
+    {file = "pbr-5.8.0.tar.gz", hash = "sha256:672d8ebee84921862110f23fcec2acea191ef58543d34dfe9ef3d9f13c31cddf"},
+]
+pexpect = [
+    {file = "pexpect-4.8.0-py2.py3-none-any.whl", hash = "sha256:0b48a55dcb3c05f3329815901ea4fc1537514d6ba867a152b581d69ae3710937"},
+    {file = "pexpect-4.8.0.tar.gz", hash = "sha256:fc65a43959d153d0114afe13997d439c22823a27cefceb5ff35c2178c6784c0c"},
+]
+pickleshare = [
+    {file = "pickleshare-0.7.5-py2.py3-none-any.whl", hash = "sha256:9649af414d74d4df115d5d718f82acb59c9d418196b7b4290ed47a12ce62df56"},
+    {file = "pickleshare-0.7.5.tar.gz", hash = "sha256:87683d47965c1da65cdacaf31c8441d12b8044cdec9aca500cd78fc2c683afca"},
+]
+pillow = [
+    {file = "Pillow-7.2.0-cp35-cp35m-macosx_10_10_intel.whl", hash = "sha256:1ca594126d3c4def54babee699c055a913efb01e106c309fa6b04405d474d5ae"},
+    {file = "Pillow-7.2.0-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:c92302a33138409e8f1ad16731568c55c9053eee71bb05b6b744067e1b62380f"},
+    {file = "Pillow-7.2.0-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:8dad18b69f710bf3a001d2bf3afab7c432785d94fcf819c16b5207b1cfd17d38"},
+    {file = "Pillow-7.2.0-cp35-cp35m-manylinux2014_aarch64.whl", hash = "sha256:431b15cffbf949e89df2f7b48528be18b78bfa5177cb3036284a5508159492b5"},
+    {file = "Pillow-7.2.0-cp35-cp35m-win32.whl", hash = "sha256:09d7f9e64289cb40c2c8d7ad674b2ed6105f55dc3b09aa8e4918e20a0311e7ad"},
+    {file = "Pillow-7.2.0-cp35-cp35m-win_amd64.whl", hash = "sha256:0295442429645fa16d05bd567ef5cff178482439c9aad0411d3f0ce9b88b3a6f"},
+    {file = "Pillow-7.2.0-cp36-cp36m-macosx_10_10_x86_64.whl", hash = "sha256:ec29604081f10f16a7aea809ad42e27764188fc258b02259a03a8ff7ded3808d"},
+    {file = "Pillow-7.2.0-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:612cfda94e9c8346f239bf1a4b082fdd5c8143cf82d685ba2dba76e7adeeb233"},
+    {file = "Pillow-7.2.0-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:0a80dd307a5d8440b0a08bd7b81617e04d870e40a3e46a32d9c246e54705e86f"},
+    {file = "Pillow-7.2.0-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:06aba4169e78c439d528fdeb34762c3b61a70813527a2c57f0540541e9f433a8"},
+    {file = "Pillow-7.2.0-cp36-cp36m-win32.whl", hash = "sha256:f7e30c27477dffc3e85c2463b3e649f751789e0f6c8456099eea7ddd53be4a8a"},
+    {file = "Pillow-7.2.0-cp36-cp36m-win_amd64.whl", hash = "sha256:ffe538682dc19cc542ae7c3e504fdf54ca7f86fb8a135e59dd6bc8627eae6cce"},
+    {file = "Pillow-7.2.0-cp37-cp37m-macosx_10_10_x86_64.whl", hash = "sha256:94cf49723928eb6070a892cb39d6c156f7b5a2db4e8971cb958f7b6b104fb4c4"},
+    {file = "Pillow-7.2.0-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:6edb5446f44d901e8683ffb25ebdfc26988ee813da3bf91e12252b57ac163727"},
+    {file = "Pillow-7.2.0-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:52125833b070791fcb5710fabc640fc1df07d087fc0c0f02d3661f76c23c5b8b"},
+    {file = "Pillow-7.2.0-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:9ad7f865eebde135d526bb3163d0b23ffff365cf87e767c649550964ad72785d"},
+    {file = "Pillow-7.2.0-cp37-cp37m-win32.whl", hash = "sha256:c79f9c5fb846285f943aafeafda3358992d64f0ef58566e23484132ecd8d7d63"},
+    {file = "Pillow-7.2.0-cp37-cp37m-win_amd64.whl", hash = "sha256:d350f0f2c2421e65fbc62690f26b59b0bcda1b614beb318c81e38647e0f673a1"},
+    {file = "Pillow-7.2.0-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:6d7741e65835716ceea0fd13a7d0192961212fd59e741a46bbed7a473c634ed6"},
+    {file = "Pillow-7.2.0-cp38-cp38-manylinux1_i686.whl", hash = "sha256:edf31f1150778abd4322444c393ab9c7bd2af271dd4dafb4208fb613b1f3cdc9"},
+    {file = "Pillow-7.2.0-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:d08b23fdb388c0715990cbc06866db554e1822c4bdcf6d4166cf30ac82df8c41"},
+    {file = "Pillow-7.2.0-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:5e51ee2b8114def244384eda1c82b10e307ad9778dac5c83fb0943775a653cd8"},
+    {file = "Pillow-7.2.0-cp38-cp38-win32.whl", hash = "sha256:725aa6cfc66ce2857d585f06e9519a1cc0ef6d13f186ff3447ab6dff0a09bc7f"},
+    {file = "Pillow-7.2.0-cp38-cp38-win_amd64.whl", hash = "sha256:a060cf8aa332052df2158e5a119303965be92c3da6f2d93b6878f0ebca80b2f6"},
+    {file = "Pillow-7.2.0-pp36-pypy36_pp73-macosx_10_10_x86_64.whl", hash = "sha256:9c87ef410a58dd54b92424ffd7e28fd2ec65d2f7fc02b76f5e9b2067e355ebf6"},
+    {file = "Pillow-7.2.0-pp36-pypy36_pp73-manylinux2010_x86_64.whl", hash = "sha256:e901964262a56d9ea3c2693df68bc9860b8bdda2b04768821e4c44ae797de117"},
+    {file = "Pillow-7.2.0-pp36-pypy36_pp73-win32.whl", hash = "sha256:25930fadde8019f374400f7986e8404c8b781ce519da27792cbe46eabec00c4d"},
+    {file = "Pillow-7.2.0.tar.gz", hash = "sha256:97f9e7953a77d5a70f49b9a48da7776dc51e9b738151b22dacf101641594a626"},
+]
+pint = [
+    {file = "Pint-0.18-py2.py3-none-any.whl", hash = "sha256:4b37f3c470639ea6f96b0026c3364bde30631fa737092bdaf18ad3f4f76f252f"},
+    {file = "Pint-0.18.tar.gz", hash = "sha256:8c4bce884c269051feb7abc69dbfd18403c0c764abc83da132e8a7222f8ba801"},
+]
+pluggy = [
+    {file = "pluggy-1.0.0-py2.py3-none-any.whl", hash = "sha256:74134bbf457f031a36d68416e1509f34bd5ccc019f0bcc952c7b909d06b37bd3"},
+    {file = "pluggy-1.0.0.tar.gz", hash = "sha256:4224373bacce55f955a878bf9cfa763c1e360858e330072059e10bad68531159"},
+]
+prettytable = [
+    {file = "prettytable-3.0.0-py3-none-any.whl", hash = "sha256:d55bc2547611bd8c40f1c69bbb8daf1b6b2c326214a265d211ec9c57fc252093"},
+    {file = "prettytable-3.0.0.tar.gz", hash = "sha256:69fe75d78ac8651e16dd61265b9e19626df5d630ae294fc31687aa6037b97a58"},
+]
+prompt-toolkit = [
+    {file = "prompt_toolkit-3.0.24-py3-none-any.whl", hash = "sha256:e56f2ff799bacecd3e88165b1e2f5ebf9bcd59e80e06d395fa0cc4b8bd7bb506"},
+    {file = "prompt_toolkit-3.0.24.tar.gz", hash = "sha256:1bb05628c7d87b645974a1bad3f17612be0c29fa39af9f7688030163f680bad6"},
+]
+psutil = [
+    {file = "psutil-5.9.0-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:55ce319452e3d139e25d6c3f85a1acf12d1607ddedea5e35fb47a552c051161b"},
+    {file = "psutil-5.9.0-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:7336292a13a80eb93c21f36bde4328aa748a04b68c13d01dfddd67fc13fd0618"},
+    {file = "psutil-5.9.0-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:cb8d10461c1ceee0c25a64f2dd54872b70b89c26419e147a05a10b753ad36ec2"},
+    {file = "psutil-5.9.0-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:7641300de73e4909e5d148e90cc3142fb890079e1525a840cf0dfd39195239fd"},
+    {file = "psutil-5.9.0-cp27-none-win32.whl", hash = "sha256:ea42d747c5f71b5ccaa6897b216a7dadb9f52c72a0fe2b872ef7d3e1eacf3ba3"},
+    {file = "psutil-5.9.0-cp27-none-win_amd64.whl", hash = "sha256:ef216cc9feb60634bda2f341a9559ac594e2eeaadd0ba187a4c2eb5b5d40b91c"},
+    {file = "psutil-5.9.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:90a58b9fcae2dbfe4ba852b57bd4a1dded6b990a33d6428c7614b7d48eccb492"},
+    {file = "psutil-5.9.0-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ff0d41f8b3e9ebb6b6110057e40019a432e96aae2008951121ba4e56040b84f3"},
+    {file = "psutil-5.9.0-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:742c34fff804f34f62659279ed5c5b723bb0195e9d7bd9907591de9f8f6558e2"},
+    {file = "psutil-5.9.0-cp310-cp310-win32.whl", hash = "sha256:8293942e4ce0c5689821f65ce6522ce4786d02af57f13c0195b40e1edb1db61d"},
+    {file = "psutil-5.9.0-cp310-cp310-win_amd64.whl", hash = "sha256:9b51917c1af3fa35a3f2dabd7ba96a2a4f19df3dec911da73875e1edaf22a40b"},
+    {file = "psutil-5.9.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:e9805fed4f2a81de98ae5fe38b75a74c6e6ad2df8a5c479594c7629a1fe35f56"},
+    {file = "psutil-5.9.0-cp36-cp36m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c51f1af02334e4b516ec221ee26b8fdf105032418ca5a5ab9737e8c87dafe203"},
+    {file = "psutil-5.9.0-cp36-cp36m-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:32acf55cb9a8cbfb29167cd005951df81b567099295291bcfd1027365b36591d"},
+    {file = "psutil-5.9.0-cp36-cp36m-win32.whl", hash = "sha256:e5c783d0b1ad6ca8a5d3e7b680468c9c926b804be83a3a8e95141b05c39c9f64"},
+    {file = "psutil-5.9.0-cp36-cp36m-win_amd64.whl", hash = "sha256:d62a2796e08dd024b8179bd441cb714e0f81226c352c802fca0fd3f89eeacd94"},
+    {file = "psutil-5.9.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:3d00a664e31921009a84367266b35ba0aac04a2a6cad09c550a89041034d19a0"},
+    {file = "psutil-5.9.0-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7779be4025c540d1d65a2de3f30caeacc49ae7a2152108adeaf42c7534a115ce"},
+    {file = "psutil-5.9.0-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:072664401ae6e7c1bfb878c65d7282d4b4391f1bc9a56d5e03b5a490403271b5"},
+    {file = "psutil-5.9.0-cp37-cp37m-win32.whl", hash = "sha256:df2c8bd48fb83a8408c8390b143c6a6fa10cb1a674ca664954de193fdcab36a9"},
+    {file = "psutil-5.9.0-cp37-cp37m-win_amd64.whl", hash = "sha256:1d7b433519b9a38192dfda962dd8f44446668c009833e1429a52424624f408b4"},
+    {file = "psutil-5.9.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:c3400cae15bdb449d518545cbd5b649117de54e3596ded84aacabfbb3297ead2"},
+    {file = "psutil-5.9.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b2237f35c4bbae932ee98902a08050a27821f8f6dfa880a47195e5993af4702d"},
+    {file = "psutil-5.9.0-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1070a9b287846a21a5d572d6dddd369517510b68710fca56b0e9e02fd24bed9a"},
+    {file = "psutil-5.9.0-cp38-cp38-win32.whl", hash = "sha256:76cebf84aac1d6da5b63df11fe0d377b46b7b500d892284068bacccf12f20666"},
+    {file = "psutil-5.9.0-cp38-cp38-win_amd64.whl", hash = "sha256:3151a58f0fbd8942ba94f7c31c7e6b310d2989f4da74fcbf28b934374e9bf841"},
+    {file = "psutil-5.9.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:539e429da49c5d27d5a58e3563886057f8fc3868a5547b4f1876d9c0f007bccf"},
+    {file = "psutil-5.9.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:58c7d923dc209225600aec73aa2c4ae8ea33b1ab31bc11ef8a5933b027476f07"},
+    {file = "psutil-5.9.0-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3611e87eea393f779a35b192b46a164b1d01167c9d323dda9b1e527ea69d697d"},
+    {file = "psutil-5.9.0-cp39-cp39-win32.whl", hash = "sha256:4e2fb92e3aeae3ec3b7b66c528981fd327fb93fd906a77215200404444ec1845"},
+    {file = "psutil-5.9.0-cp39-cp39-win_amd64.whl", hash = "sha256:7d190ee2eaef7831163f254dc58f6d2e2a22e27382b936aab51c835fc080c3d3"},
+    {file = "psutil-5.9.0.tar.gz", hash = "sha256:869842dbd66bb80c3217158e629d6fceaecc3a3166d3d1faee515b05dd26ca25"},
+]
+ptyprocess = [
+    {file = "ptyprocess-0.7.0-py2.py3-none-any.whl", hash = "sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35"},
+    {file = "ptyprocess-0.7.0.tar.gz", hash = "sha256:5c5d0a3b48ceee0b48485e0c26037c0acd7d29765ca3fbb5cb3831d347423220"},
+]
+py = [
+    {file = "py-1.11.0-py2.py3-none-any.whl", hash = "sha256:607c53218732647dff4acdfcd50cb62615cedf612e72d1724fb1a0cc6405b378"},
+    {file = "py-1.11.0.tar.gz", hash = "sha256:51c75c4126074b472f746a24399ad32f6053d1b34b68d2fa41e558e6f4a98719"},
+]
+pycalphad = [
+    {file = "pycalphad-0.9.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c8ddcad22651ffa9d448a6ed765bdcc0691820689b107efc62816389e8320aa3"},
+    {file = "pycalphad-0.9.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:399e0745d3367dec451475d1156a8a4c7fc55d7997133155094c27a776dda61f"},
+    {file = "pycalphad-0.9.2-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f9868c901251eda9e6fc03a8b45fd7d0efed205cfdab38636eb7e606a7348c2e"},
+    {file = "pycalphad-0.9.2-cp37-cp37m-win32.whl", hash = "sha256:36b027df2c9e63946c15f6b3a86af469e356abc1bfabaf1011e8bcee2b05c4d7"},
+    {file = "pycalphad-0.9.2-cp37-cp37m-win_amd64.whl", hash = "sha256:e6f04c9b57f6cf1e9c507c62187ad95b70b3008e0dc20b22c86662b712a6e39e"},
+    {file = "pycalphad-0.9.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:ae8b16f154d0b60647f987217c0acd50013f7f03cef0c89b74c47edabef3330c"},
+    {file = "pycalphad-0.9.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:ad2c0836923282361b9a44363ff04ce0ef7e8f5205867ca2ee6ea6392fe890d0"},
+    {file = "pycalphad-0.9.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:ab8ce524cfcff8c65cfb36df52e1bbd0b323f1731eb70a98a077c0255c1cc9c8"},
+    {file = "pycalphad-0.9.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:b7d1e50bd1ba13760546140afb0bc380dabbd88c8baf57655c65393e056772b8"},
+    {file = "pycalphad-0.9.2-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:7221cd88b6556353a412e79bdad101bf4d8ec80647aca18d56f5efb681a4e2cc"},
+    {file = "pycalphad-0.9.2-cp38-cp38-win32.whl", hash = "sha256:c4a2b8744e2482c60caf98a788c3f05018d4b0c7554b0527a5f714a2d08bd01e"},
+    {file = "pycalphad-0.9.2-cp38-cp38-win_amd64.whl", hash = "sha256:2c67f0867c7b97a0f36140e8bdc98585ae2f86baef6a28cff0836b6272706c3e"},
+    {file = "pycalphad-0.9.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:0a983355a7c8861c448bfa3b71b5841db6316d5ade7417beb4e959385aede3b6"},
+    {file = "pycalphad-0.9.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b5136229ab5d918218000fced93b7bfbd2a733596e655b801e96cb7ff36ab867"},
+    {file = "pycalphad-0.9.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:fce55bb8d357dd99619de945a53cdc684421c3f0e93843530069a2bb60c21a0a"},
+    {file = "pycalphad-0.9.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:355770bf01f63e821e0b4cc59c65e3da9f7f4ddd1e9908c8bdbe8beaace94cff"},
+    {file = "pycalphad-0.9.2-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:71e24d564687c5da581bce6f728c7fa8e77448150542418fcd3677b6674769b1"},
+    {file = "pycalphad-0.9.2-cp39-cp39-win32.whl", hash = "sha256:fa9208f2f6448dd1aa8553a90709a0244d6fd3b2a8c15b63607a8d14f9a8f875"},
+    {file = "pycalphad-0.9.2-cp39-cp39-win_amd64.whl", hash = "sha256:3f7793d770b055e34e95f6067518164f500218bfb4002804219dc5bfa3febe2c"},
+    {file = "pycalphad-0.9.2.tar.gz", hash = "sha256:18686d48b3cd609f9ba92358badc6d0159cf1bf987add97b78481dbacc7957c4"},
+]
+pycodestyle = [
+    {file = "pycodestyle-2.8.0-py2.py3-none-any.whl", hash = "sha256:720f8b39dde8b293825e7ff02c475f3077124006db4f440dcbc9a20b76548a20"},
+    {file = "pycodestyle-2.8.0.tar.gz", hash = "sha256:eddd5847ef438ea1c7870ca7eb78a9d47ce0cdb4851a5523949f2601d0cbbe7f"},
+]
+pycparser = [
+    {file = "pycparser-2.21-py2.py3-none-any.whl", hash = "sha256:8ee45429555515e1f6b185e78100aea234072576aa43ab53aefcae078162fca9"},
+    {file = "pycparser-2.21.tar.gz", hash = "sha256:e644fdec12f7872f86c58ff790da456218b10f863970249516d60a5eaca77206"},
+]
+pydispatcher = [
+    {file = "PyDispatcher-2.0.5.tar.gz", hash = "sha256:5570069e1b1769af1fe481de6dd1d3a388492acddd2cdad7a3bde145615d5caf"},
+    {file = "PyDispatcher-2.0.5.zip", hash = "sha256:5be4a8be12805ef7d712dd9a93284fb8bc53f309867e573f653a72e5fd10e433"},
+]
+pyflakes = [
+    {file = "pyflakes-2.4.0-py2.py3-none-any.whl", hash = "sha256:3bb3a3f256f4b7968c9c788781e4ff07dce46bdf12339dcda61053375426ee2e"},
+    {file = "pyflakes-2.4.0.tar.gz", hash = "sha256:05a85c2872edf37a4ed30b0cce2f6093e1d0581f8c19d7393122da7e25b2b24c"},
+]
+pygments = [
+    {file = "Pygments-2.11.2-py3-none-any.whl", hash = "sha256:44238f1b60a76d78fc8ca0528ee429702aae011c265fe6a8dd8b63049ae41c65"},
+    {file = "Pygments-2.11.2.tar.gz", hash = "sha256:4e426f72023d88d03b2fa258de560726ce890ff3b630f88c21cbb8b2503b8c6a"},
+]
+pyjwt = [
+    {file = "PyJWT-2.3.0-py3-none-any.whl", hash = "sha256:e0c4bb8d9f0af0c7f5b1ec4c5036309617d03d56932877f2f7a0beeb5318322f"},
+    {file = "PyJWT-2.3.0.tar.gz", hash = "sha256:b888b4d56f06f6dcd777210c334e69c737be74755d3e5e9ee3fe67dc18a0ee41"},
+]
+pymatgen = [
+    {file = "pymatgen-2018.12.12-cp27-cp27m-macosx_10_6_x86_64.whl", hash = "sha256:a9302b605d12d4545a77b1ac41c72d793c8cbe79fa35d49a31019d3b7882addb"},
+    {file = "pymatgen-2018.12.12-cp37-cp37m-macosx_10_7_x86_64.whl", hash = "sha256:32798081906f071fa4d5e60b5e5dca7ed810227fca1a9a179d0247ad64f04df0"},
+    {file = "pymatgen-2018.12.12-cp37-cp37m-win_amd64.whl", hash = "sha256:af34860e54843ad8a095d082d6048a77f87b72d8a30ba008afb46ceade769769"},
+    {file = "pymatgen-2018.12.12.tar.gz", hash = "sha256:520cdf326f25dd62cb99590e081e32a0b38588740c71f4432c2d13713be64fc7"},
+]
+pyparsing = [
+    {file = "pyparsing-3.0.6-py3-none-any.whl", hash = "sha256:04ff808a5b90911829c55c4e26f75fa5ca8a2f5f36aa3a51f68e27033341d3e4"},
+    {file = "pyparsing-3.0.6.tar.gz", hash = "sha256:d9bdec0013ef1eb5a84ab39a3b3868911598afa494f5faa038647101504e2b81"},
+]
+pypif = [
+    {file = "pypif-2.1.2.tar.gz", hash = "sha256:f426a4f58157b44727a2fdbe821000d98b5a64951b9ebe8a300d38db7804eefd"},
+]
+pyrsistent = [
+    {file = "pyrsistent-0.18.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:df46c854f490f81210870e509818b729db4488e1f30f2a1ce1698b2295a878d1"},
+    {file = "pyrsistent-0.18.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5d45866ececf4a5fff8742c25722da6d4c9e180daa7b405dc0a2a2790d668c26"},
+    {file = "pyrsistent-0.18.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4ed6784ceac462a7d6fcb7e9b663e93b9a6fb373b7f43594f9ff68875788e01e"},
+    {file = "pyrsistent-0.18.1-cp310-cp310-win32.whl", hash = "sha256:e4f3149fd5eb9b285d6bfb54d2e5173f6a116fe19172686797c056672689daf6"},
+    {file = "pyrsistent-0.18.1-cp310-cp310-win_amd64.whl", hash = "sha256:636ce2dc235046ccd3d8c56a7ad54e99d5c1cd0ef07d9ae847306c91d11b5fec"},
+    {file = "pyrsistent-0.18.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:e92a52c166426efbe0d1ec1332ee9119b6d32fc1f0bbfd55d5c1088070e7fc1b"},
+    {file = "pyrsistent-0.18.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d7a096646eab884bf8bed965bad63ea327e0d0c38989fc83c5ea7b8a87037bfc"},
+    {file = "pyrsistent-0.18.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cdfd2c361b8a8e5d9499b9082b501c452ade8bbf42aef97ea04854f4a3f43b22"},
+    {file = "pyrsistent-0.18.1-cp37-cp37m-win32.whl", hash = "sha256:7ec335fc998faa4febe75cc5268a9eac0478b3f681602c1f27befaf2a1abe1d8"},
+    {file = "pyrsistent-0.18.1-cp37-cp37m-win_amd64.whl", hash = "sha256:6455fc599df93d1f60e1c5c4fe471499f08d190d57eca040c0ea182301321286"},
+    {file = "pyrsistent-0.18.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:fd8da6d0124efa2f67d86fa70c851022f87c98e205f0594e1fae044e7119a5a6"},
+    {file = "pyrsistent-0.18.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7bfe2388663fd18bd8ce7db2c91c7400bf3e1a9e8bd7d63bf7e77d39051b85ec"},
+    {file = "pyrsistent-0.18.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0e3e1fcc45199df76053026a51cc59ab2ea3fc7c094c6627e93b7b44cdae2c8c"},
+    {file = "pyrsistent-0.18.1-cp38-cp38-win32.whl", hash = "sha256:b568f35ad53a7b07ed9b1b2bae09eb15cdd671a5ba5d2c66caee40dbf91c68ca"},
+    {file = "pyrsistent-0.18.1-cp38-cp38-win_amd64.whl", hash = "sha256:d1b96547410f76078eaf66d282ddca2e4baae8964364abb4f4dcdde855cd123a"},
+    {file = "pyrsistent-0.18.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:f87cc2863ef33c709e237d4b5f4502a62a00fab450c9e020892e8e2ede5847f5"},
+    {file = "pyrsistent-0.18.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6bc66318fb7ee012071b2792024564973ecc80e9522842eb4e17743604b5e045"},
+    {file = "pyrsistent-0.18.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:914474c9f1d93080338ace89cb2acee74f4f666fb0424896fcfb8d86058bf17c"},
+    {file = "pyrsistent-0.18.1-cp39-cp39-win32.whl", hash = "sha256:1b34eedd6812bf4d33814fca1b66005805d3640ce53140ab8bbb1e2651b0d9bc"},
+    {file = "pyrsistent-0.18.1-cp39-cp39-win_amd64.whl", hash = "sha256:e24a828f57e0c337c8d8bb9f6b12f09dfdf0273da25fda9e314f0b684b415a07"},
+    {file = "pyrsistent-0.18.1.tar.gz", hash = "sha256:d4d61f8b993a7255ba714df3aca52700f8125289f84f704cf80916517c46eb96"},
+]
+pytest = [
+    {file = "pytest-3.10.1-py2.py3-none-any.whl", hash = "sha256:3f193df1cfe1d1609d4c583838bea3d532b18d6160fd3f55c9447fdca30848ec"},
+    {file = "pytest-3.10.1.tar.gz", hash = "sha256:e246cf173c01169b9617fc07264b7b1316e78d7a650055235d6d897bc80d9660"},
+]
+pytest-cov = [
+    {file = "pytest-cov-2.9.0.tar.gz", hash = "sha256:b6a814b8ed6247bd81ff47f038511b57fe1ce7f4cc25b9106f1a4b106f1d9322"},
+    {file = "pytest_cov-2.9.0-py2.py3-none-any.whl", hash = "sha256:c87dfd8465d865655a8213859f1b4749b43448b5fae465cb981e16d52a811424"},
+]
+python-dateutil = [
+    {file = "python-dateutil-2.8.2.tar.gz", hash = "sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86"},
+    {file = "python_dateutil-2.8.2-py2.py3-none-any.whl", hash = "sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9"},
+]
+python-magic = [
+    {file = "python-magic-0.4.24.tar.gz", hash = "sha256:de800df9fb50f8ec5974761054a708af6e4246b03b4bdaee993f948947b0ebcf"},
+    {file = "python_magic-0.4.24-py2.py3-none-any.whl", hash = "sha256:4fec8ee805fea30c07afccd1592c0f17977089895bdfaae5fec870a84e997626"},
+]
+pytz = [
+    {file = "pytz-2021.3-py2.py3-none-any.whl", hash = "sha256:3672058bc3453457b622aab7a1c3bfd5ab0bdae451512f6cf25f64ed37f5b87c"},
+    {file = "pytz-2021.3.tar.gz", hash = "sha256:acad2d8b20a1af07d4e4c9d2e9285c5ed9104354062f275f3fcd88dcef4f1326"},
+]
+pywavelets = [
+    {file = "PyWavelets-1.2.0-cp310-cp310-macosx_10_13_universal2.whl", hash = "sha256:4c29efb581245e4ba3e76b23b1bf254a7c79821d7e63f432e68044cf2d233e9e"},
+    {file = "PyWavelets-1.2.0-cp310-cp310-macosx_10_13_x86_64.whl", hash = "sha256:3089aa6b4962e1f5dbd0434a10f174f7a50f80bf64cb7d33cc725af07bd30ecc"},
+    {file = "PyWavelets-1.2.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:16c30e98f52e1a5d0a06b4b8f294114aaa94a0e95445b4056b6ca0a7a5535a42"},
+    {file = "PyWavelets-1.2.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:79386f4d8518e344487acf22b1c130e5907b3c45852aa50c18df5e19895aa92e"},
+    {file = "PyWavelets-1.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b9bf543d552d20cf6ddfd690c5c18afacc8440cfb09b7515b2242bb9abfcc5eb"},
+    {file = "PyWavelets-1.2.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:28bb3d7d411ffbcfaa5a81a5a32044805893752c1641b39f6544b7e0a24661c3"},
+    {file = "PyWavelets-1.2.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:333e1370167b0a2b963df82e42968000734bfa23b2ce88191e8ce9d24fc4cc57"},
+    {file = "PyWavelets-1.2.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:2ec1fc92573f56c1b129006d109e7518a098f3c8c6a2183b495619faca931461"},
+    {file = "PyWavelets-1.2.0-cp310-cp310-win32.whl", hash = "sha256:d30c09fa805533bf7c8a5d06aa8babda5ae6c1541cd652cb2ebe6ab0b9536c0e"},
+    {file = "PyWavelets-1.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:73805016353a47c5b5f9cea547ea6ae07cd3520abfd7888916ff56b01e71307a"},
+    {file = "PyWavelets-1.2.0-cp37-cp37m-macosx_10_13_x86_64.whl", hash = "sha256:ec670e78be2c3193e26c4bfa31dff1edd89ee8d7e2f4219782f3ef3f6daf37f0"},
+    {file = "PyWavelets-1.2.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:151a7f3d3db36baffe640d691403b7cd3938a1886c8a387b719e7e8b580dd4b1"},
+    {file = "PyWavelets-1.2.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:616fd2967dd153c3f539b1e0979168969f3702125caae4caa769efc5621cc2b7"},
+    {file = "PyWavelets-1.2.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:abedc0b49273a734d4592e325a5fb32f0741e115d6722e0c59964ecf21344640"},
+    {file = "PyWavelets-1.2.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:9b05d2f21da666f918692f0313484002307794b5380f7291a395b9271abdda5c"},
+    {file = "PyWavelets-1.2.0-cp37-cp37m-win32.whl", hash = "sha256:537b5a8a8a3e9e5b931d34b517aa2312a3d8385937f98c4f8ffa668483329cfb"},
+    {file = "PyWavelets-1.2.0-cp37-cp37m-win_amd64.whl", hash = "sha256:7a725030682bf891ced9819b4b21d6ef356fa11b70399d2d3adb319aead1efb0"},
+    {file = "PyWavelets-1.2.0-cp38-cp38-macosx_10_13_universal2.whl", hash = "sha256:d9831b251f63460302811607f80a20285292ed0a0a046f95b4648edc0ed90f9c"},
+    {file = "PyWavelets-1.2.0-cp38-cp38-macosx_10_13_x86_64.whl", hash = "sha256:7e4749ff324e8e01a2fdc859ac9714c4be1cbc6e8a34d5ddedb28fc9513b31a1"},
+    {file = "PyWavelets-1.2.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:333684cc0d0e89cf6cb3a8b3ea68528790e1a3edc565a100cda47e29860f892d"},
+    {file = "PyWavelets-1.2.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:71415f2c376ae3e1331249043dddb63370c92fed162ebcb108fd87e12a956d89"},
+    {file = "PyWavelets-1.2.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:44315d197bad9564210ef42f2d5a01c07ee6fd456c679d4a6d0f4e23ec9930cf"},
+    {file = "PyWavelets-1.2.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:c8b388652b6afb4bf7be313be057240386de93817c6744c2aaf43a22890733c8"},
+    {file = "PyWavelets-1.2.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a1131c27b9f79ca56dd6347d5585a609f51ed3cad0cfb6c17419b1733d3b6acd"},
+    {file = "PyWavelets-1.2.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:df4d950be507a68d107c8f618ef7a9e0d9071789cfc1a840f89d0c985448880f"},
+    {file = "PyWavelets-1.2.0-cp38-cp38-win32.whl", hash = "sha256:8a72f11c4d23f8ed8544def0003f500e98598e7a1efce892e6f964c430469c05"},
+    {file = "PyWavelets-1.2.0-cp38-cp38-win_amd64.whl", hash = "sha256:be231e4bc569f2b1177711390d406d08ce388c1e01ab864f89be8928db234856"},
+    {file = "PyWavelets-1.2.0-cp39-cp39-macosx_10_13_universal2.whl", hash = "sha256:90d53119f4b518236ad9a8a6be96d86efb1b4eeb73c28e3ed33824ae601ce7b1"},
+    {file = "PyWavelets-1.2.0-cp39-cp39-macosx_10_13_x86_64.whl", hash = "sha256:351937e4fc6f3df3555cd2813e73bfc344885c5d994fd621d13dd004d05a4cb7"},
+    {file = "PyWavelets-1.2.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:33375e3e6e361659f2519d412de2b50e2527a97c3946ffd66ca20a8ea1346fea"},
+    {file = "PyWavelets-1.2.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:449d2d5f9c1f28a1bce01f714f9f742d9fdbce90f66de0a92cad39d98d24477b"},
+    {file = "PyWavelets-1.2.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:18d84982417790a645f74cb0f968e89fb8af575dbf17a52c64af5075aa5528b8"},
+    {file = "PyWavelets-1.2.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:b3d9dab8223d0ce30e7480751f526ce1e97a1dcf5242875f8206e4449953116c"},
+    {file = "PyWavelets-1.2.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:a82e8c307b98d65737b286e0b458343ecee8505dfb519cd314a5f211f4fb92b9"},
+    {file = "PyWavelets-1.2.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:663d265cb433653ef6335973edd13c66cd86c85fbe9c09e4bd138119bac15974"},
+    {file = "PyWavelets-1.2.0-cp39-cp39-win32.whl", hash = "sha256:fd5ca221ac7bedb2a9aebcf3b05020827564db5a979b25005b3a2c7ba84069a2"},
+    {file = "PyWavelets-1.2.0-cp39-cp39-win_amd64.whl", hash = "sha256:69cfc7f2ceb0a1097e7e8d1a026cbb2ff1afecc2d79820856f1abccb6cb59cc4"},
+    {file = "PyWavelets-1.2.0.tar.gz", hash = "sha256:6cbd69b047bb4e00873097472133425f5f08a4e6bc8b3f0ae709274d4d5e9a8d"},
+]
+pywin32 = [
+    {file = "pywin32-303-cp310-cp310-win32.whl", hash = "sha256:6fed4af057039f309263fd3285d7b8042d41507343cd5fa781d98fcc5b90e8bb"},
+    {file = "pywin32-303-cp310-cp310-win_amd64.whl", hash = "sha256:51cb52c5ec6709f96c3f26e7795b0bf169ee0d8395b2c1d7eb2c029a5008ed51"},
+    {file = "pywin32-303-cp311-cp311-win32.whl", hash = "sha256:d9b5d87ca944eb3aa4cd45516203ead4b37ab06b8b777c54aedc35975dec0dee"},
+    {file = "pywin32-303-cp311-cp311-win_amd64.whl", hash = "sha256:fcf44032f5b14fcda86028cdf49b6ebdaea091230eb0a757282aa656e4732439"},
+    {file = "pywin32-303-cp36-cp36m-win32.whl", hash = "sha256:aad484d52ec58008ca36bd4ad14a71d7dd0a99db1a4ca71072213f63bf49c7d9"},
+    {file = "pywin32-303-cp36-cp36m-win_amd64.whl", hash = "sha256:2a09632916b6bb231ba49983fe989f2f625cea237219530e81a69239cd0c4559"},
+    {file = "pywin32-303-cp37-cp37m-win32.whl", hash = "sha256:b1675d82bcf6dbc96363fca747bac8bff6f6e4a447a4287ac652aa4b9adc796e"},
+    {file = "pywin32-303-cp37-cp37m-win_amd64.whl", hash = "sha256:c268040769b48a13367221fced6d4232ed52f044ffafeda247bd9d2c6bdc29ca"},
+    {file = "pywin32-303-cp38-cp38-win32.whl", hash = "sha256:5f9ec054f5a46a0f4dfd72af2ce1372f3d5a6e4052af20b858aa7df2df7d355b"},
+    {file = "pywin32-303-cp38-cp38-win_amd64.whl", hash = "sha256:793bf74fce164bcffd9d57bb13c2c15d56e43c9542a7b9687b4fccf8f8a41aba"},
+    {file = "pywin32-303-cp39-cp39-win32.whl", hash = "sha256:7d3271c98434617a11921c5ccf74615794d97b079e22ed7773790822735cc352"},
+    {file = "pywin32-303-cp39-cp39-win_amd64.whl", hash = "sha256:79cbb862c11b9af19bcb682891c1b91942ec2ff7de8151e2aea2e175899cda34"},
+]
+pyyaml = [
+    {file = "PyYAML-6.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d4db7c7aef085872ef65a8fd7d6d09a14ae91f691dec3e87ee5ee0539d516f53"},
+    {file = "PyYAML-6.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9df7ed3b3d2e0ecfe09e14741b857df43adb5a3ddadc919a2d94fbdf78fea53c"},
+    {file = "PyYAML-6.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:77f396e6ef4c73fdc33a9157446466f1cff553d979bd00ecb64385760c6babdc"},
+    {file = "PyYAML-6.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a80a78046a72361de73f8f395f1f1e49f956c6be882eed58505a15f3e430962b"},
+    {file = "PyYAML-6.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f84fbc98b019fef2ee9a1cb3ce93e3187a6df0b2538a651bfb890254ba9f90b5"},
+    {file = "PyYAML-6.0-cp310-cp310-win32.whl", hash = "sha256:2cd5df3de48857ed0544b34e2d40e9fac445930039f3cfe4bcc592a1f836d513"},
+    {file = "PyYAML-6.0-cp310-cp310-win_amd64.whl", hash = "sha256:daf496c58a8c52083df09b80c860005194014c3698698d1a57cbcfa182142a3a"},
+    {file = "PyYAML-6.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:897b80890765f037df3403d22bab41627ca8811ae55e9a722fd0392850ec4d86"},
+    {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50602afada6d6cbfad699b0c7bb50d5ccffa7e46a3d738092afddc1f9758427f"},
+    {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:48c346915c114f5fdb3ead70312bd042a953a8ce5c7106d5bfb1a5254e47da92"},
+    {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:98c4d36e99714e55cfbaaee6dd5badbc9a1ec339ebfc3b1f52e293aee6bb71a4"},
+    {file = "PyYAML-6.0-cp36-cp36m-win32.whl", hash = "sha256:0283c35a6a9fbf047493e3a0ce8d79ef5030852c51e9d911a27badfde0605293"},
+    {file = "PyYAML-6.0-cp36-cp36m-win_amd64.whl", hash = "sha256:07751360502caac1c067a8132d150cf3d61339af5691fe9e87803040dbc5db57"},
+    {file = "PyYAML-6.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:819b3830a1543db06c4d4b865e70ded25be52a2e0631ccd2f6a47a2822f2fd7c"},
+    {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:473f9edb243cb1935ab5a084eb238d842fb8f404ed2193a915d1784b5a6b5fc0"},
+    {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0ce82d761c532fe4ec3f87fc45688bdd3a4c1dc5e0b4a19814b9009a29baefd4"},
+    {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:231710d57adfd809ef5d34183b8ed1eeae3f76459c18fb4a0b373ad56bedcdd9"},
+    {file = "PyYAML-6.0-cp37-cp37m-win32.whl", hash = "sha256:c5687b8d43cf58545ade1fe3e055f70eac7a5a1a0bf42824308d868289a95737"},
+    {file = "PyYAML-6.0-cp37-cp37m-win_amd64.whl", hash = "sha256:d15a181d1ecd0d4270dc32edb46f7cb7733c7c508857278d3d378d14d606db2d"},
+    {file = "PyYAML-6.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0b4624f379dab24d3725ffde76559cff63d9ec94e1736b556dacdfebe5ab6d4b"},
+    {file = "PyYAML-6.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:213c60cd50106436cc818accf5baa1aba61c0189ff610f64f4a3e8c6726218ba"},
+    {file = "PyYAML-6.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9fa600030013c4de8165339db93d182b9431076eb98eb40ee068700c9c813e34"},
+    {file = "PyYAML-6.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:277a0ef2981ca40581a47093e9e2d13b3f1fbbeffae064c1d21bfceba2030287"},
+    {file = "PyYAML-6.0-cp38-cp38-win32.whl", hash = "sha256:d4eccecf9adf6fbcc6861a38015c2a64f38b9d94838ac1810a9023a0609e1b78"},
+    {file = "PyYAML-6.0-cp38-cp38-win_amd64.whl", hash = "sha256:1e4747bc279b4f613a09eb64bba2ba602d8a6664c6ce6396a4d0cd413a50ce07"},
+    {file = "PyYAML-6.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:055d937d65826939cb044fc8c9b08889e8c743fdc6a32b33e2390f66013e449b"},
+    {file = "PyYAML-6.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e61ceaab6f49fb8bdfaa0f92c4b57bcfbea54c09277b1b4f7ac376bfb7a7c174"},
+    {file = "PyYAML-6.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d67d839ede4ed1b28a4e8909735fc992a923cdb84e618544973d7dfc71540803"},
+    {file = "PyYAML-6.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cba8c411ef271aa037d7357a2bc8f9ee8b58b9965831d9e51baf703280dc73d3"},
+    {file = "PyYAML-6.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:40527857252b61eacd1d9af500c3337ba8deb8fc298940291486c465c8b46ec0"},
+    {file = "PyYAML-6.0-cp39-cp39-win32.whl", hash = "sha256:b5b9eccad747aabaaffbc6064800670f0c297e52c12754eb1d976c57e4f74dcb"},
+    {file = "PyYAML-6.0-cp39-cp39-win_amd64.whl", hash = "sha256:b3d267842bf12586ba6c734f89d1f5b871df0273157918b0ccefa29deb05c21c"},
+    {file = "PyYAML-6.0.tar.gz", hash = "sha256:68fb519c14306fec9720a2a5b45bc9f0c8d1b9c72adf45c37baedfcd949c35a2"},
+]
+pyzmq = [
+    {file = "pyzmq-22.3.0-cp310-cp310-macosx_10_15_universal2.whl", hash = "sha256:6b217b8f9dfb6628f74b94bdaf9f7408708cb02167d644edca33f38746ca12dd"},
+    {file = "pyzmq-22.3.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2841997a0d85b998cbafecb4183caf51fd19c4357075dfd33eb7efea57e4c149"},
+    {file = "pyzmq-22.3.0-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:f89468059ebc519a7acde1ee50b779019535db8dcf9b8c162ef669257fef7a93"},
+    {file = "pyzmq-22.3.0-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ea12133df25e3a6918718fbb9a510c6ee5d3fdd5a346320421aac3882f4feeea"},
+    {file = "pyzmq-22.3.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:76c532fd68b93998aab92356be280deec5de8f8fe59cd28763d2cc8a58747b7f"},
+    {file = "pyzmq-22.3.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:f907c7359ce8bf7f7e63c82f75ad0223384105f5126f313400b7e8004d9b33c3"},
+    {file = "pyzmq-22.3.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:902319cfe23366595d3fa769b5b751e6ee6750a0a64c5d9f757d624b2ac3519e"},
+    {file = "pyzmq-22.3.0-cp310-cp310-win32.whl", hash = "sha256:67db33bea0a29d03e6eeec55a8190e033318cee3cbc732ba8fd939617cbf762d"},
+    {file = "pyzmq-22.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:7661fc1d5cb73481cf710a1418a4e1e301ed7d5d924f91c67ba84b2a1b89defd"},
+    {file = "pyzmq-22.3.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:79244b9e97948eaf38695f4b8e6fc63b14b78cc37f403c6642ba555517ac1268"},
+    {file = "pyzmq-22.3.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ab888624ed68930442a3f3b0b921ad7439c51ba122dbc8c386e6487a658e4a4e"},
+    {file = "pyzmq-22.3.0-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:18cd854b423fce44951c3a4d3e686bac8f1243d954f579e120a1714096637cc0"},
+    {file = "pyzmq-22.3.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:de8df0684398bd74ad160afdc2a118ca28384ac6f5e234eb0508858d8d2d9364"},
+    {file = "pyzmq-22.3.0-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:62bcade20813796c426409a3e7423862d50ff0639f5a2a95be4b85b09a618666"},
+    {file = "pyzmq-22.3.0-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:ea5a79e808baef98c48c884effce05c31a0698c1057de8fc1c688891043c1ce1"},
+    {file = "pyzmq-22.3.0-cp36-cp36m-win32.whl", hash = "sha256:3c1895c95be92600233e476fe283f042e71cf8f0b938aabf21b7aafa62a8dac9"},
+    {file = "pyzmq-22.3.0-cp36-cp36m-win_amd64.whl", hash = "sha256:851977788b9caa8ed011f5f643d3ee8653af02c5fc723fa350db5125abf2be7b"},
+    {file = "pyzmq-22.3.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:b4ebed0977f92320f6686c96e9e8dd29eed199eb8d066936bac991afc37cbb70"},
+    {file = "pyzmq-22.3.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42abddebe2c6a35180ca549fadc7228d23c1e1f76167c5ebc8a936b5804ea2df"},
+    {file = "pyzmq-22.3.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c1e41b32d6f7f9c26bc731a8b529ff592f31fc8b6ef2be9fa74abd05c8a342d7"},
+    {file = "pyzmq-22.3.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:be4e0f229cf3a71f9ecd633566bd6f80d9fa6afaaff5489492be63fe459ef98c"},
+    {file = "pyzmq-22.3.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:08c4e315a76ef26eb833511ebf3fa87d182152adf43dedee8d79f998a2162a0b"},
+    {file = "pyzmq-22.3.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:badb868fff14cfd0e200eaa845887b1011146a7d26d579aaa7f966c203736b92"},
+    {file = "pyzmq-22.3.0-cp37-cp37m-win32.whl", hash = "sha256:7c58f598d9fcc52772b89a92d72bf8829c12d09746a6d2c724c5b30076c1f11d"},
+    {file = "pyzmq-22.3.0-cp37-cp37m-win_amd64.whl", hash = "sha256:2b97502c16a5ec611cd52410bdfaab264997c627a46b0f98d3f666227fd1ea2d"},
+    {file = "pyzmq-22.3.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:d728b08448e5ac3e4d886b165385a262883c34b84a7fe1166277fe675e1c197a"},
+    {file = "pyzmq-22.3.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:480b9931bfb08bf8b094edd4836271d4d6b44150da051547d8c7113bf947a8b0"},
+    {file = "pyzmq-22.3.0-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:7dc09198e4073e6015d9a8ea093fc348d4e59de49382476940c3dd9ae156fba8"},
+    {file = "pyzmq-22.3.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0ca6cd58f62a2751728016d40082008d3b3412a7f28ddfb4a2f0d3c130f69e74"},
+    {file = "pyzmq-22.3.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:468bd59a588e276961a918a3060948ae68f6ff5a7fa10bb2f9160c18fe341067"},
+    {file = "pyzmq-22.3.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:c88fa7410e9fc471e0858638f403739ee869924dd8e4ae26748496466e27ac59"},
+    {file = "pyzmq-22.3.0-cp38-cp38-win32.whl", hash = "sha256:c0f84360dcca3481e8674393bdf931f9f10470988f87311b19d23cda869bb6b7"},
+    {file = "pyzmq-22.3.0-cp38-cp38-win_amd64.whl", hash = "sha256:f762442bab706fd874064ca218b33a1d8e40d4938e96c24dafd9b12e28017f45"},
+    {file = "pyzmq-22.3.0-cp39-cp39-macosx_10_15_universal2.whl", hash = "sha256:954e73c9cd4d6ae319f1c936ad159072b6d356a92dcbbabfd6e6204b9a79d356"},
+    {file = "pyzmq-22.3.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f43b4a2e6218371dd4f41e547bd919ceeb6ebf4abf31a7a0669cd11cd91ea973"},
+    {file = "pyzmq-22.3.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:acebba1a23fb9d72b42471c3771b6f2f18dcd46df77482612054bd45c07dfa36"},
+    {file = "pyzmq-22.3.0-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:cf98fd7a6c8aaa08dbc699ffae33fd71175696d78028281bc7b832b26f00ca57"},
+    {file = "pyzmq-22.3.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d072f7dfbdb184f0786d63bda26e8a0882041b1e393fbe98940395f7fab4c5e2"},
+    {file = "pyzmq-22.3.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:53f4fd13976789ffafedd4d46f954c7bb01146121812b72b4ddca286034df966"},
+    {file = "pyzmq-22.3.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:d1b5d457acbadcf8b27561deeaa386b0217f47626b29672fa7bd31deb6e91e1b"},
+    {file = "pyzmq-22.3.0-cp39-cp39-win32.whl", hash = "sha256:e6a02cf7271ee94674a44f4e62aa061d2d049001c844657740e156596298b70b"},
+    {file = "pyzmq-22.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:d3dcb5548ead4f1123851a5ced467791f6986d68c656bc63bfff1bf9e36671e2"},
+    {file = "pyzmq-22.3.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:3a4c9886d61d386b2b493377d980f502186cd71d501fffdba52bd2a0880cef4f"},
+    {file = "pyzmq-22.3.0-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:80e043a89c6cadefd3a0712f8a1322038e819ebe9dbac7eca3bce1721bcb63bf"},
+    {file = "pyzmq-22.3.0-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:1621e7a2af72cced1f6ec8ca8ca91d0f76ac236ab2e8828ac8fe909512d566cb"},
+    {file = "pyzmq-22.3.0-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:d6157793719de168b199194f6b6173f0ccd3bf3499e6870fac17086072e39115"},
+    {file = "pyzmq-22.3.0.tar.gz", hash = "sha256:8eddc033e716f8c91c6a2112f0a8ebc5e00532b4a6ae1eb0ccc48e027f9c671c"},
+]
+requests = [
+    {file = "requests-2.27.1-py2.py3-none-any.whl", hash = "sha256:f22fa1e554c9ddfd16e6e41ac79759e17be9e492b3587efa038054674760e72d"},
+    {file = "requests-2.27.1.tar.gz", hash = "sha256:68d7c56fd5a8999887728ef304a6d12edc7be74f1cfa47714fc8b414525c9a61"},
+]
+rfc3986 = [
+    {file = "rfc3986-2.0.0-py2.py3-none-any.whl", hash = "sha256:50b1502b60e289cb37883f3dfd34532b8873c7de9f49bb546641ce9cbd256ebd"},
+    {file = "rfc3986-2.0.0.tar.gz", hash = "sha256:97aacf9dbd4bfd829baad6e6309fa6573aaf1be3f6fa735c8ab05e46cecb261c"},
+]
+"ruamel.yaml" = [
+    {file = "ruamel.yaml-0.17.20-py3-none-any.whl", hash = "sha256:810eef9c46523a3f77479c66267a4708255ebe806a2d540078408c2227f011af"},
+    {file = "ruamel.yaml-0.17.20.tar.gz", hash = "sha256:4b8a33c1efb2b443a93fcaafcfa4d2e445f8e8c29c528d9f5cdafb7cc9e4004c"},
+]
+"ruamel.yaml.clib" = [
+    {file = "ruamel.yaml.clib-0.2.6-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:6e7be2c5bcb297f5b82fee9c665eb2eb7001d1050deaba8471842979293a80b0"},
+    {file = "ruamel.yaml.clib-0.2.6-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:221eca6f35076c6ae472a531afa1c223b9c29377e62936f61bc8e6e8bdc5f9e7"},
+    {file = "ruamel.yaml.clib-0.2.6-cp310-cp310-win32.whl", hash = "sha256:1070ba9dd7f9370d0513d649420c3b362ac2d687fe78c6e888f5b12bf8bc7bee"},
+    {file = "ruamel.yaml.clib-0.2.6-cp310-cp310-win_amd64.whl", hash = "sha256:77df077d32921ad46f34816a9a16e6356d8100374579bc35e15bab5d4e9377de"},
+    {file = "ruamel.yaml.clib-0.2.6-cp35-cp35m-macosx_10_6_intel.whl", hash = "sha256:cfdb9389d888c5b74af297e51ce357b800dd844898af9d4a547ffc143fa56751"},
+    {file = "ruamel.yaml.clib-0.2.6-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:7b2927e92feb51d830f531de4ccb11b320255ee95e791022555971c466af4527"},
+    {file = "ruamel.yaml.clib-0.2.6-cp35-cp35m-win32.whl", hash = "sha256:ada3f400d9923a190ea8b59c8f60680c4ef8a4b0dfae134d2f2ff68429adfab5"},
+    {file = "ruamel.yaml.clib-0.2.6-cp35-cp35m-win_amd64.whl", hash = "sha256:de9c6b8a1ba52919ae919f3ae96abb72b994dd0350226e28f3686cb4f142165c"},
+    {file = "ruamel.yaml.clib-0.2.6-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:d67f273097c368265a7b81e152e07fb90ed395df6e552b9fa858c6d2c9f42502"},
+    {file = "ruamel.yaml.clib-0.2.6-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:72a2b8b2ff0a627496aad76f37a652bcef400fd861721744201ef1b45199ab78"},
+    {file = "ruamel.yaml.clib-0.2.6-cp36-cp36m-win32.whl", hash = "sha256:9efef4aab5353387b07f6b22ace0867032b900d8e91674b5d8ea9150db5cae94"},
+    {file = "ruamel.yaml.clib-0.2.6-cp36-cp36m-win_amd64.whl", hash = "sha256:846fc8336443106fe23f9b6d6b8c14a53d38cef9a375149d61f99d78782ea468"},
+    {file = "ruamel.yaml.clib-0.2.6-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:0847201b767447fc33b9c235780d3aa90357d20dd6108b92be544427bea197dd"},
+    {file = "ruamel.yaml.clib-0.2.6-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:78988ed190206672da0f5d50c61afef8f67daa718d614377dcd5e3ed85ab4a99"},
+    {file = "ruamel.yaml.clib-0.2.6-cp37-cp37m-win32.whl", hash = "sha256:a49e0161897901d1ac9c4a79984b8410f450565bbad64dbfcbf76152743a0cdb"},
+    {file = "ruamel.yaml.clib-0.2.6-cp37-cp37m-win_amd64.whl", hash = "sha256:bf75d28fa071645c529b5474a550a44686821decebdd00e21127ef1fd566eabe"},
+    {file = "ruamel.yaml.clib-0.2.6-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:a32f8d81ea0c6173ab1b3da956869114cae53ba1e9f72374032e33ba3118c233"},
+    {file = "ruamel.yaml.clib-0.2.6-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:7f7ecb53ae6848f959db6ae93bdff1740e651809780822270eab111500842a84"},
+    {file = "ruamel.yaml.clib-0.2.6-cp38-cp38-win32.whl", hash = "sha256:89221ec6d6026f8ae859c09b9718799fea22c0e8da8b766b0b2c9a9ba2db326b"},
+    {file = "ruamel.yaml.clib-0.2.6-cp38-cp38-win_amd64.whl", hash = "sha256:31ea73e564a7b5fbbe8188ab8b334393e06d997914a4e184975348f204790277"},
+    {file = "ruamel.yaml.clib-0.2.6-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:dc6a613d6c74eef5a14a214d433d06291526145431c3b964f5e16529b1842bed"},
+    {file = "ruamel.yaml.clib-0.2.6-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:1866cf2c284a03b9524a5cc00daca56d80057c5ce3cdc86a52020f4c720856f0"},
+    {file = "ruamel.yaml.clib-0.2.6-cp39-cp39-win32.whl", hash = "sha256:3fb9575a5acd13031c57a62cc7823e5d2ff8bc3835ba4d94b921b4e6ee664104"},
+    {file = "ruamel.yaml.clib-0.2.6-cp39-cp39-win_amd64.whl", hash = "sha256:825d5fccef6da42f3c8eccd4281af399f21c02b32d98e113dbc631ea6a6ecbc7"},
+    {file = "ruamel.yaml.clib-0.2.6.tar.gz", hash = "sha256:4ff604ce439abb20794f05613c374759ce10e3595d1867764dd1ae675b85acbd"},
+]
+s3transfer = [
+    {file = "s3transfer-0.5.0-py3-none-any.whl", hash = "sha256:9c1dc369814391a6bda20ebbf4b70a0f34630592c9aa520856bf384916af2803"},
+    {file = "s3transfer-0.5.0.tar.gz", hash = "sha256:50ed823e1dc5868ad40c8dc92072f757aa0e653a192845c94a3b676f4a62da4c"},
+]
+scikit-image = [
+    {file = "scikit-image-0.19.1.tar.gz", hash = "sha256:48f00ee1e8ec2818ae6a152c72df15f4db7f566e839f5c34e1a0c3c9e5210138"},
+    {file = "scikit_image-0.19.1-cp310-cp310-macosx_10_13_x86_64.whl", hash = "sha256:ce144d21792560a69536c2f64ba7ecd28542a6a8ac9fd6f856465d11a4eb8648"},
+    {file = "scikit_image-0.19.1-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:42ab5a6d516fced19ae317b3fbbfeb7d63434d531cb36317ad5b555c3f34c5f3"},
+    {file = "scikit_image-0.19.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7ec06bee79685d17b94889bb028baea0f34ea171be200885cc9a1b808d96ebf6"},
+    {file = "scikit_image-0.19.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8385c0f9a02698048129654feb4f136d213127fbcf1d99f28e4cdd6669984f53"},
+    {file = "scikit_image-0.19.1-cp310-cp310-win_amd64.whl", hash = "sha256:64da56c7d3098b91429b3070908e5c2b6534791f3ec516d1396fbe8fa51d1170"},
+    {file = "scikit_image-0.19.1-cp37-cp37m-macosx_10_13_x86_64.whl", hash = "sha256:5264f20f8940b852b46cf579bd9a6343dc80c2277cda78a7442efeaa68198c4f"},
+    {file = "scikit_image-0.19.1-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:92266b2eb498ebac9de50768a296e111e95752b6070344d98c2f5fd06c1e7635"},
+    {file = "scikit_image-0.19.1-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:d86387e0ba4713a460499e1d063e59a4ab16144836f6d3a5ff940316be24d07b"},
+    {file = "scikit_image-0.19.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:66411fa085aa5e1ac98daeda1f596ae1396041ee70ea0f2081d6260b803ad1a6"},
+    {file = "scikit_image-0.19.1-cp37-cp37m-win32.whl", hash = "sha256:9f88ff2f00d1bf0f6f4d3bba07530c857ba53fa3b2284dd685762514b299f734"},
+    {file = "scikit_image-0.19.1-cp37-cp37m-win_amd64.whl", hash = "sha256:8dda7a82f83296a2fcbe6ee0684d84e0ee4477cae57200117f5a55c80f8ec844"},
+    {file = "scikit_image-0.19.1-cp38-cp38-macosx_10_13_x86_64.whl", hash = "sha256:f1d8fd2989430768e2cdc30cc2a69642de67d7ddfc1c80e1977eab199aedc0a1"},
+    {file = "scikit_image-0.19.1-cp38-cp38-macosx_12_0_arm64.whl", hash = "sha256:3c6a4d9ac342c7a58b3f1d0559cd47e393619a538e03eb22f696d6df821c7d37"},
+    {file = "scikit_image-0.19.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b2ab64c66ac0c7ad4d5da167eff7c9af04770e445f9242dbe43f12d005f48107"},
+    {file = "scikit_image-0.19.1-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4849352b2dffd9f5cdf2efae99dabe14d7b2880331387826445f31d9148650f6"},
+    {file = "scikit_image-0.19.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:26ecb813e4d34874ff5f7f49216e217367db273ad8a99e556c77d616121ab219"},
+    {file = "scikit_image-0.19.1-cp38-cp38-win32.whl", hash = "sha256:50611d5dac964bc5593457b96860bd93079984376466173800e97401a5de4ec2"},
+    {file = "scikit_image-0.19.1-cp38-cp38-win_amd64.whl", hash = "sha256:058af6453644ab68a0e0018b830ef38ec4285a4d14791a28fd62e2ee2d66ff6f"},
+    {file = "scikit_image-0.19.1-cp39-cp39-macosx_10_13_x86_64.whl", hash = "sha256:ad997e0fce1492855bd19e76c4a1609eecc29328623ddda8c6297ca137999055"},
+    {file = "scikit_image-0.19.1-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:b516764deb0780feb861c99c1e8503f8804a04f02f0ffcb0f0310672467ed520"},
+    {file = "scikit_image-0.19.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:43bfe99f839367c954b670ffe635c3789c3e0957b2fab18cfa25c8b9ed85f6e0"},
+    {file = "scikit_image-0.19.1-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f97bfeaf844b45711834ff4afeb5c7ce9dcf33f33a8d8b110fb14f6bd3cd82bc"},
+    {file = "scikit_image-0.19.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:63dc34bbd46425c78f6760f348c90fcccb4169ada60857b71db3f18fabe5620a"},
+    {file = "scikit_image-0.19.1-cp39-cp39-win32.whl", hash = "sha256:97a6b82e1286f4d2a602e1362edaf0f14da417f2b4208576f6455dd01283880f"},
+    {file = "scikit_image-0.19.1-cp39-cp39-win_amd64.whl", hash = "sha256:c3d012c861792b2baec07118ecf31b246cd27051035f527dc2618ad28c6ac29e"},
+]
+scipy = [
+    {file = "scipy-1.6.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:a15a1f3fc0abff33e792d6049161b7795909b40b97c6cc2934ed54384017ab76"},
+    {file = "scipy-1.6.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:e79570979ccdc3d165456dd62041d9556fb9733b86b4b6d818af7a0afc15f092"},
+    {file = "scipy-1.6.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:a423533c55fec61456dedee7b6ee7dce0bb6bfa395424ea374d25afa262be261"},
+    {file = "scipy-1.6.1-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:33d6b7df40d197bdd3049d64e8e680227151673465e5d85723b3b8f6b15a6ced"},
+    {file = "scipy-1.6.1-cp37-cp37m-win32.whl", hash = "sha256:6725e3fbb47da428794f243864f2297462e9ee448297c93ed1dcbc44335feb78"},
+    {file = "scipy-1.6.1-cp37-cp37m-win_amd64.whl", hash = "sha256:5fa9c6530b1661f1370bcd332a1e62ca7881785cc0f80c0d559b636567fab63c"},
+    {file = "scipy-1.6.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:bd50daf727f7c195e26f27467c85ce653d41df4358a25b32434a50d8870fc519"},
+    {file = "scipy-1.6.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:f46dd15335e8a320b0fb4685f58b7471702234cba8bb3442b69a3e1dc329c345"},
+    {file = "scipy-1.6.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:0e5b0ccf63155d90da576edd2768b66fb276446c371b73841e3503be1d63fb5d"},
+    {file = "scipy-1.6.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:2481efbb3740977e3c831edfd0bd9867be26387cacf24eb5e366a6a374d3d00d"},
+    {file = "scipy-1.6.1-cp38-cp38-win32.whl", hash = "sha256:68cb4c424112cd4be886b4d979c5497fba190714085f46b8ae67a5e4416c32b4"},
+    {file = "scipy-1.6.1-cp38-cp38-win_amd64.whl", hash = "sha256:5f331eeed0297232d2e6eea51b54e8278ed8bb10b099f69c44e2558c090d06bf"},
+    {file = "scipy-1.6.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:0c8a51d33556bf70367452d4d601d1742c0e806cd0194785914daf19775f0e67"},
+    {file = "scipy-1.6.1-cp39-cp39-manylinux1_i686.whl", hash = "sha256:83bf7c16245c15bc58ee76c5418e46ea1811edcc2e2b03041b804e46084ab627"},
+    {file = "scipy-1.6.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:794e768cc5f779736593046c9714e0f3a5940bc6dcc1dba885ad64cbfb28e9f0"},
+    {file = "scipy-1.6.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:5da5471aed911fe7e52b86bf9ea32fb55ae93e2f0fac66c32e58897cfb02fa07"},
+    {file = "scipy-1.6.1-cp39-cp39-win32.whl", hash = "sha256:8e403a337749ed40af60e537cc4d4c03febddcc56cd26e774c9b1b600a70d3e4"},
+    {file = "scipy-1.6.1-cp39-cp39-win_amd64.whl", hash = "sha256:a5193a098ae9f29af283dcf0041f762601faf2e595c0db1da929875b7570353f"},
+    {file = "scipy-1.6.1.tar.gz", hash = "sha256:c4fceb864890b6168e79b0e714c585dbe2fd4222768ee90bc1aa0f8218691b11"},
+]
+setuptools-scm = [
+    {file = "setuptools_scm-6.4.1-py3-none-any.whl", hash = "sha256:93bbcc1d3e92f20eaef42df31e4b5e5a348f8cb0e48eaff3e060184a57e94b07"},
+    {file = "setuptools_scm-6.4.1.tar.gz", hash = "sha256:9bd9ff7fd5fa1cf469fe28a632336b9cfd351476c6d09379ff676d3945f669b9"},
+]
+six = [
+    {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"},
+    {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"},
+]
+sparse = [
+    {file = "sparse-0.13.0-py2.py3-none-any.whl", hash = "sha256:95ed0b649a0663b1488756ad4cf242b0a9bb2c9a25bc752a7c6ca9fbe8258966"},
+    {file = "sparse-0.13.0.tar.gz", hash = "sha256:685dc994aa770ee1b23f2d5392819c8429f27958771f8dceb2c4fb80210d5915"},
+]
+spglib = [
+    {file = "spglib-1.16.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3fc478dad2ec199004f0eab092a9e9c49f3ccde660111dcb7f8272b2619e88f6"},
+    {file = "spglib-1.16.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c5128223d61d7045aa28b8f8d1737b4677bdc85f58aec34e161669823d7c59d0"},
+    {file = "spglib-1.16.3-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:a841835a3d9a1e9d92a0d507d860f8613bc8f0bd44e3d39acef2ff67ec216adf"},
+    {file = "spglib-1.16.3-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:74ab6929bd78621f5e472f94dd196b567e4ea0f0739c385d822d40d636a5b113"},
+    {file = "spglib-1.16.3-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c98928dd873caf91aecb2fe2e7ed97753b8755b5b990e4fab84656def0c3cf2"},
+    {file = "spglib-1.16.3-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:2220e8afc201416d1eaaecb95cbf3009290361ccb73cd8aec6f062867f767925"},
+    {file = "spglib-1.16.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:522fe37e0cf4baaadb7d7ac1857f66ab3e9b1bd6903f0bd0ae2779abcbd7700a"},
+    {file = "spglib-1.16.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:21a10b5e49d6a0e59cf1db9326e55f492e40c7f08b785d0f68e74bd7efdfd757"},
+    {file = "spglib-1.16.3-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:e2ba33cc11dfb11e88ce06de848ff2b2110c782bbd97fef8aacc56a579bc9495"},
+    {file = "spglib-1.16.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:446d005c0d5c6efc20d026e4120ae8b4a9262f18690a5b7553ef3159dc200d80"},
+    {file = "spglib-1.16.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3fe4b9b58a3cde01f37a7d56110bf366b8d9c838258f40dcd27a06f150dfa0b4"},
+    {file = "spglib-1.16.3-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:0af3b8a305d3e8abe163071740c4b484a83d99d55599e540f6c0031fe70cf4d9"},
+    {file = "spglib-1.16.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:90e8e3d0747e77c5be7533ccb885644b95660c3c7deb88bec3b37922d4802ebf"},
+    {file = "spglib-1.16.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cd8825abcd1beea3341d36a21deae4ec19adfd587e476dbe0eab95eb762f40a9"},
+    {file = "spglib-1.16.3-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:120fafcba184914f32b0fa7d1a7efd4ca7b4db3061d49cf8da1ac14adf7a0cac"},
+    {file = "spglib-1.16.3.tar.gz", hash = "sha256:ff1420967d64c2d4f0d747886116a6836d9b473454cdd73d560dbfe973a8a038"},
+]
+sqlalchemy = [
+    {file = "SQLAlchemy-1.4.29-cp27-cp27m-macosx_10_14_x86_64.whl", hash = "sha256:da64423c05256f4ab8c0058b90202053b201cbe3a081f3a43eb590cd554395ab"},
+    {file = "SQLAlchemy-1.4.29-cp27-cp27m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:0fc4eec2f46b40bdd42112b3be3fbbf88e194bcf02950fbb88bcdc1b32f07dc7"},
+    {file = "SQLAlchemy-1.4.29-cp27-cp27m-win32.whl", hash = "sha256:101d2e100ba9182c9039699588e0b2d833c54b3bad46c67c192159876c9f27ea"},
+    {file = "SQLAlchemy-1.4.29-cp27-cp27m-win_amd64.whl", hash = "sha256:ceac84dd9abbbe115e8be0c817bed85d9fa639b4d294e7817f9e61162d5f766c"},
+    {file = "SQLAlchemy-1.4.29-cp27-cp27mu-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:15b65887b6c324cad638c7671cb95985817b733242a7eb69edd7cdf6953be1e0"},
+    {file = "SQLAlchemy-1.4.29-cp310-cp310-macosx_10_14_x86_64.whl", hash = "sha256:78abc507d17753ed434b6cc0c0693126279723d5656d9775bfcac966a99a899b"},
+    {file = "SQLAlchemy-1.4.29-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eb8c993706e86178ce15a6b86a335a2064f52254b640e7f53365e716423d33f4"},
+    {file = "SQLAlchemy-1.4.29-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:804e22d5b6165a4f3f019dd9c94bec5687de985a9c54286b93ded9f7846b8c82"},
+    {file = "SQLAlchemy-1.4.29-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:56d9d62021946263d4478c9ca012fbd1805f10994cb615c88e7bfd1ae14604d8"},
+    {file = "SQLAlchemy-1.4.29-cp310-cp310-win32.whl", hash = "sha256:027f356c727db24f3c75828c7feb426f87ce1241242d08958e454bd025810660"},
+    {file = "SQLAlchemy-1.4.29-cp310-cp310-win_amd64.whl", hash = "sha256:debaf09a823061f88a8dee04949814cf7e82fb394c5bca22c780cb03172ca23b"},
+    {file = "SQLAlchemy-1.4.29-cp36-cp36m-macosx_10_14_x86_64.whl", hash = "sha256:dc27dcc6c72eb38be7f144e9c2c4372d35a3684d3a6dd43bd98c1238358ee17c"},
+    {file = "SQLAlchemy-1.4.29-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e4ddd4f2e247128c58bb3dd4489922874afce157d2cff0b2295d67fcd0f22494"},
+    {file = "SQLAlchemy-1.4.29-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:9ce960a1dc60524136cf6f75621588e2508a117e04a6e3eedb0968bd13b8c824"},
+    {file = "SQLAlchemy-1.4.29-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5919e647e1d4805867ea556ed4967c68b4d8b266059fa35020dbaed8ffdd60f3"},
+    {file = "SQLAlchemy-1.4.29-cp36-cp36m-win32.whl", hash = "sha256:886359f734b95ad1ef443b13bb4518bcade4db4f9553c9ce33d6d04ebda8d44e"},
+    {file = "SQLAlchemy-1.4.29-cp36-cp36m-win_amd64.whl", hash = "sha256:e9cc6d844e24c307c3272677982a9b33816aeb45e4977791c3bdd47637a8d810"},
+    {file = "SQLAlchemy-1.4.29-cp37-cp37m-macosx_10_14_x86_64.whl", hash = "sha256:5e9cd33459afa69c88fa648e803d1f1245e3caa60bfe8b80a9595e5edd3bda9c"},
+    {file = "SQLAlchemy-1.4.29-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eeaebceb24b46e884c4ad3c04f37feb178b81f6ce720af19bfa2592ca32fdef7"},
+    {file = "SQLAlchemy-1.4.29-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:e89347d3bd2ef873832b47e85f4bbd810a5e626c5e749d90a07638da100eb1c8"},
+    {file = "SQLAlchemy-1.4.29-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5a717c2e70fd1bb477161c4cc85258e41d978584fbe5522613618195f7e87d9b"},
+    {file = "SQLAlchemy-1.4.29-cp37-cp37m-win32.whl", hash = "sha256:f74d6c05d2d163464adbdfbc1ab85048cc15462ff7d134b8aed22bd521e1faa5"},
+    {file = "SQLAlchemy-1.4.29-cp37-cp37m-win_amd64.whl", hash = "sha256:621854dbb4d2413c759a5571564170de45ef37299df52e78e62b42e2880192e1"},
+    {file = "SQLAlchemy-1.4.29-cp38-cp38-macosx_10_14_x86_64.whl", hash = "sha256:f3909194751bb6cb7c5511dd18bcf77e6e3f0b31604ed4004dffa9461f71e737"},
+    {file = "SQLAlchemy-1.4.29-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dd49d21d1f03c81fbec9080ecdc4486d5ddda67e7fbb75ebf48294465c022cdc"},
+    {file = "SQLAlchemy-1.4.29-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:e5f6959466a42b6569774c257e55f9cd85200d5b0ba09f0f5d8b5845349c5822"},
+    {file = "SQLAlchemy-1.4.29-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0072f9887aabe66db23f818bbe950cfa1b6127c5cb769b00bcc07935b3adb0ad"},
+    {file = "SQLAlchemy-1.4.29-cp38-cp38-win32.whl", hash = "sha256:ad618d687d26d4cbfa9c6fa6141d59e05bcdfc60cb6e1f1d3baa18d8c62fef5f"},
+    {file = "SQLAlchemy-1.4.29-cp38-cp38-win_amd64.whl", hash = "sha256:878daecb6405e786b07f97e1c77a9cfbbbec17432e8a90c487967e32cfdecb33"},
+    {file = "SQLAlchemy-1.4.29-cp39-cp39-macosx_10_14_x86_64.whl", hash = "sha256:e027bdf0a4cf6bd0a3ad3b998643ea374d7991bd117b90bf9982e41ceb742941"},
+    {file = "SQLAlchemy-1.4.29-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c5de7adfb91d351f44062b8dedf29f49d4af7cb765be65816e79223a4e31062b"},
+    {file = "SQLAlchemy-1.4.29-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:fbc6e63e481fa323036f305ada96a3362e1d60dd2bfa026cac10c3553e6880e9"},
+    {file = "SQLAlchemy-1.4.29-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7dd0502cb091660ad0d89c5e95a29825f37cde2a5249957838e975871fbffaad"},
+    {file = "SQLAlchemy-1.4.29-cp39-cp39-win32.whl", hash = "sha256:37b46bfc4af3dc226acb6fa28ecd2e1fd223433dc5e15a2bad62bf0a0cbb4e8b"},
+    {file = "SQLAlchemy-1.4.29-cp39-cp39-win_amd64.whl", hash = "sha256:08cfd35eecaba79be930c9bfd2e1f0c67a7e1314355d83a378f9a512b1cf7587"},
+    {file = "SQLAlchemy-1.4.29.tar.gz", hash = "sha256:fa2bad14e1474ba649cfc969c1d2ec915dd3e79677f346bbfe08e93ef9020b39"},
+]
+stevedore = [
+    {file = "stevedore-1.32.0-py2.py3-none-any.whl", hash = "sha256:a4e7dc759fb0f2e3e2f7d8ffe2358c19d45b9b8297f393ef1256858d82f69c9b"},
+    {file = "stevedore-1.32.0.tar.gz", hash = "sha256:18afaf1d623af5950cc0f7e75e70f917784c73b652a34a12d90b309451b5500b"},
+]
+symengine = [
+    {file = "symengine-0.7.2-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:ec42ca5e7c71b3d2daceea8fd77f94f4a39d509883f31cb75dea9d2e210a44d4"},
+    {file = "symengine-0.7.2-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:53eef7df58e5e39ff5aecbbdf8244abd0bc438dc8b71900df6db13a87f1c7060"},
+    {file = "symengine-0.7.2-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:d25fe71fd42be081b09c1b939aa01268e484c85eee7a182228bb3c5d643ba90e"},
+    {file = "symengine-0.7.2-cp36-cp36m-manylinux2014_ppc64le.whl", hash = "sha256:400ad6322feb88141c0490867d791f51268d3643266bb0f1260741d8c809bd95"},
+    {file = "symengine-0.7.2-cp36-cp36m-win_amd64.whl", hash = "sha256:d15d44b125afa93359dda9ce0174671f478b94ea7946140e8df0a483fd2e252b"},
+    {file = "symengine-0.7.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:544d3748764b4d66d2e341b9ba8e16bfcd8aebc15e95701067ba5225f6882d34"},
+    {file = "symengine-0.7.2-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:18d54d6cb37e891d6f74d933630ec6c4e75aab6ad4bd94d22a6adc00afb26a85"},
+    {file = "symengine-0.7.2-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:15a86d9bfbe5d588047851955924d1ff21c4081f939aeaea26cdbed88f13fd75"},
+    {file = "symengine-0.7.2-cp37-cp37m-manylinux2014_ppc64le.whl", hash = "sha256:dcea2a1e5f047138e6049c99480b334746422136d1de84944fcf6c083ae159a9"},
+    {file = "symengine-0.7.2-cp37-cp37m-win_amd64.whl", hash = "sha256:3f5b96e95c2df698fb568cb692df781bf4c032072dde882f9f99f24eed26fdd9"},
+    {file = "symengine-0.7.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:211855ee8ea2d1921569f1d4c5bb0396e86b9796edabb4f9d97fd99afaf83730"},
+    {file = "symengine-0.7.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:5f009c6e0fcb31a403b3e990060a9d2011bc1341e0710ed24a72af07ea74b102"},
+    {file = "symengine-0.7.2-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:dd40fded754e14bd9d02d7181c419c8b91209f4ea18d54f4589ef7f582988bb6"},
+    {file = "symengine-0.7.2-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:9e5ff62782cc1b450b6bc46f758b1faec08413ae82ef1c7d7141821a0101ccc3"},
+    {file = "symengine-0.7.2-cp38-cp38-manylinux2014_ppc64le.whl", hash = "sha256:cf9997ad0b78e6c7b7c9d9efe406b2b5a8cc179266c71a4ba28772b7de2f4350"},
+    {file = "symengine-0.7.2-cp38-cp38-win_amd64.whl", hash = "sha256:4726795eaf21bb67f55cf7288269ec0d4f936525b6772474f36f80f7f1d5cf82"},
+    {file = "symengine-0.7.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:a2a2c18808c6a8de39c7089cb50a09af7e99354cde4be8408c9b084916a185d8"},
+    {file = "symengine-0.7.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0b36ff364647d50c645a9b807e508c474af20a80e5d37a7271ad5366691b6904"},
+    {file = "symengine-0.7.2-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:066fe182099e4dbf67fbfc3d686a1f4a23837e08668d5ac7b264e6ef06b2c6db"},
+    {file = "symengine-0.7.2-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:d9a07694a37098542f14fbbe233ece2d5180a72b44ab9c7210f9744c9f50b059"},
+    {file = "symengine-0.7.2-cp39-cp39-manylinux2014_ppc64le.whl", hash = "sha256:0f61a5c23f921071a339ff9b798a47a23e50232807b980f8cda37128d4a34980"},
+    {file = "symengine-0.7.2-cp39-cp39-win_amd64.whl", hash = "sha256:56d4cbba3b97f3d1596e9c25e49fba111d519d6a8969881e10094fa1c20afc48"},
+    {file = "symengine-0.7.2-pp36-pypy36_pp73-macosx_10_9_x86_64.whl", hash = "sha256:dc1be8a3ef1b8a2663a65972dbc8f00c6e3d2c6f6c741eee289383cb88b6202e"},
+    {file = "symengine-0.7.2-pp36-pypy36_pp73-manylinux2010_x86_64.whl", hash = "sha256:b92fe01d5bbcb564c0452a272be503a0bd2b12c20d16f5daef9ce878ca9e43e9"},
+    {file = "symengine-0.7.2-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:4f4e86ac3a80587f9d1758b97cb0a1bd487690afaee0b144e177002286ed841a"},
+    {file = "symengine-0.7.2-pp37-pypy37_pp73-manylinux2010_x86_64.whl", hash = "sha256:da12c29ec1982041523b2bea98539b0f656740268ca51f16742ade692b047990"},
+    {file = "symengine-0.7.2.tar.gz", hash = "sha256:d033a091bc041fbe62fd271c0d873b1f4c129bc6528165b1517c3e11bcd48842"},
+]
+sympy = [
+    {file = "sympy-1.8-py3-none-any.whl", hash = "sha256:3b0b3776e357f789951bb14776c6a841f931680f20d5f8fe55977885657c9b7a"},
+    {file = "sympy-1.8.tar.gz", hash = "sha256:1ca588a9f6ce6a323c5592f9635159c2093572826668a1022c75c75bdf0297cb"},
+]
+tableschema = [
+    {file = "tableschema-1.20.2-py2.py3-none-any.whl", hash = "sha256:676948747ec8964c6e27e12ce45e203201191bb7e81a26f2eb09a1fdbe130d5c"},
+    {file = "tableschema-1.20.2.tar.gz", hash = "sha256:cfa3b0aa1c0941002384c6288794f9488cb5ea9188cf84ac700d17758cb036e7"},
+]
+tabulate = [
+    {file = "tabulate-0.8.9-py3-none-any.whl", hash = "sha256:d7c013fe7abbc5e491394e10fa845f8f32fe54f8dc60c6622c6cf482d25d47e4"},
+    {file = "tabulate-0.8.9.tar.gz", hash = "sha256:eb1d13f25760052e8931f2ef80aaf6045a6cceb47514db8beab24cded16f13a7"},
+]
+tabulator = [
+    {file = "tabulator-1.53.5-py2.py3-none-any.whl", hash = "sha256:6de83026f9dc8ac34dbc9e60cced1785ed2f4022ae0250eeaa59e92b5090f477"},
+    {file = "tabulator-1.53.5.tar.gz", hash = "sha256:0e2887d0b36483a292e75b118d7f03e710c1337435553b5f62d2a7a891b7fe55"},
+]
+tifffile = [
+    {file = "tifffile-2021.11.2-py3-none-any.whl", hash = "sha256:2e0066f90e2dbeb3e6a287cfd78bafbd2f142fabbca4a76a8ff809573baf5ad5"},
+    {file = "tifffile-2021.11.2.tar.gz", hash = "sha256:153e31fa1d892f482fabb2ae9f2561fa429ee42d01a6f67e58cee13637d9285b"},
+]
+tinydb = [
+    {file = "tinydb-4.6.1-py3-none-any.whl", hash = "sha256:ac1fdae2a7d5d7e2ca915d2666e685d63982991827c5dd097b6be4a3b5822dbc"},
+    {file = "tinydb-4.6.1.tar.gz", hash = "sha256:0d5400f5e5ae368a84d57cb234456f1cf70430fd39bcd77ccd568fea91ff2a4e"},
+]
+tomli = [
+    {file = "tomli-2.0.0-py3-none-any.whl", hash = "sha256:b5bde28da1fed24b9bd1d4d2b8cba62300bfb4ec9a6187a957e8ddb9434c5224"},
+    {file = "tomli-2.0.0.tar.gz", hash = "sha256:c292c34f58502a1eb2bbb9f5bbc9a5ebc37bee10ffb8c2d6bbdfa8eb13cc14e1"},
+]
+toolz = [
+    {file = "toolz-0.11.2-py3-none-any.whl", hash = "sha256:a5700ce83414c64514d82d60bcda8aabfde092d1c1a8663f9200c07fdcc6da8f"},
+    {file = "toolz-0.11.2.tar.gz", hash = "sha256:6b312d5e15138552f1bda8a4e66c30e236c831b612b2bf0005f8a1df10a4bc33"},
+]
+tornado = [
+    {file = "tornado-6.1-cp35-cp35m-macosx_10_9_x86_64.whl", hash = "sha256:d371e811d6b156d82aa5f9a4e08b58debf97c302a35714f6f45e35139c332e32"},
+    {file = "tornado-6.1-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:0d321a39c36e5f2c4ff12b4ed58d41390460f798422c4504e09eb5678e09998c"},
+    {file = "tornado-6.1-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:9de9e5188a782be6b1ce866e8a51bc76a0fbaa0e16613823fc38e4fc2556ad05"},
+    {file = "tornado-6.1-cp35-cp35m-manylinux2010_i686.whl", hash = "sha256:61b32d06ae8a036a6607805e6720ef00a3c98207038444ba7fd3d169cd998910"},
+    {file = "tornado-6.1-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:3e63498f680547ed24d2c71e6497f24bca791aca2fe116dbc2bd0ac7f191691b"},
+    {file = "tornado-6.1-cp35-cp35m-manylinux2014_aarch64.whl", hash = "sha256:6c77c9937962577a6a76917845d06af6ab9197702a42e1346d8ae2e76b5e3675"},
+    {file = "tornado-6.1-cp35-cp35m-win32.whl", hash = "sha256:6286efab1ed6e74b7028327365cf7346b1d777d63ab30e21a0f4d5b275fc17d5"},
+    {file = "tornado-6.1-cp35-cp35m-win_amd64.whl", hash = "sha256:fa2ba70284fa42c2a5ecb35e322e68823288a4251f9ba9cc77be04ae15eada68"},
+    {file = "tornado-6.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:0a00ff4561e2929a2c37ce706cb8233b7907e0cdc22eab98888aca5dd3775feb"},
+    {file = "tornado-6.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:748290bf9112b581c525e6e6d3820621ff020ed95af6f17fedef416b27ed564c"},
+    {file = "tornado-6.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:e385b637ac3acaae8022e7e47dfa7b83d3620e432e3ecb9a3f7f58f150e50921"},
+    {file = "tornado-6.1-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:25ad220258349a12ae87ede08a7b04aca51237721f63b1808d39bdb4b2164558"},
+    {file = "tornado-6.1-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:65d98939f1a2e74b58839f8c4dab3b6b3c1ce84972ae712be02845e65391ac7c"},
+    {file = "tornado-6.1-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:e519d64089b0876c7b467274468709dadf11e41d65f63bba207e04217f47c085"},
+    {file = "tornado-6.1-cp36-cp36m-win32.whl", hash = "sha256:b87936fd2c317b6ee08a5741ea06b9d11a6074ef4cc42e031bc6403f82a32575"},
+    {file = "tornado-6.1-cp36-cp36m-win_amd64.whl", hash = "sha256:cc0ee35043162abbf717b7df924597ade8e5395e7b66d18270116f8745ceb795"},
+    {file = "tornado-6.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:7250a3fa399f08ec9cb3f7b1b987955d17e044f1ade821b32e5f435130250d7f"},
+    {file = "tornado-6.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:ed3ad863b1b40cd1d4bd21e7498329ccaece75db5a5bf58cd3c9f130843e7102"},
+    {file = "tornado-6.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:dcef026f608f678c118779cd6591c8af6e9b4155c44e0d1bc0c87c036fb8c8c4"},
+    {file = "tornado-6.1-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:70dec29e8ac485dbf57481baee40781c63e381bebea080991893cd297742b8fd"},
+    {file = "tornado-6.1-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:d3f7594930c423fd9f5d1a76bee85a2c36fd8b4b16921cae7e965f22575e9c01"},
+    {file = "tornado-6.1-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:3447475585bae2e77ecb832fc0300c3695516a47d46cefa0528181a34c5b9d3d"},
+    {file = "tornado-6.1-cp37-cp37m-win32.whl", hash = "sha256:e7229e60ac41a1202444497ddde70a48d33909e484f96eb0da9baf8dc68541df"},
+    {file = "tornado-6.1-cp37-cp37m-win_amd64.whl", hash = "sha256:cb5ec8eead331e3bb4ce8066cf06d2dfef1bfb1b2a73082dfe8a161301b76e37"},
+    {file = "tornado-6.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:20241b3cb4f425e971cb0a8e4ffc9b0a861530ae3c52f2b0434e6c1b57e9fd95"},
+    {file = "tornado-6.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:c77da1263aa361938476f04c4b6c8916001b90b2c2fdd92d8d535e1af48fba5a"},
+    {file = "tornado-6.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:fba85b6cd9c39be262fcd23865652920832b61583de2a2ca907dbd8e8a8c81e5"},
+    {file = "tornado-6.1-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:1e8225a1070cd8eec59a996c43229fe8f95689cb16e552d130b9793cb570a288"},
+    {file = "tornado-6.1-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:d14d30e7f46a0476efb0deb5b61343b1526f73ebb5ed84f23dc794bdb88f9d9f"},
+    {file = "tornado-6.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:8f959b26f2634a091bb42241c3ed8d3cedb506e7c27b8dd5c7b9f745318ddbb6"},
+    {file = "tornado-6.1-cp38-cp38-win32.whl", hash = "sha256:34ca2dac9e4d7afb0bed4677512e36a52f09caa6fded70b4e3e1c89dbd92c326"},
+    {file = "tornado-6.1-cp38-cp38-win_amd64.whl", hash = "sha256:6196a5c39286cc37c024cd78834fb9345e464525d8991c21e908cc046d1cc02c"},
+    {file = "tornado-6.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f0ba29bafd8e7e22920567ce0d232c26d4d47c8b5cf4ed7b562b5db39fa199c5"},
+    {file = "tornado-6.1-cp39-cp39-manylinux1_i686.whl", hash = "sha256:33892118b165401f291070100d6d09359ca74addda679b60390b09f8ef325ffe"},
+    {file = "tornado-6.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:7da13da6f985aab7f6f28debab00c67ff9cbacd588e8477034c0652ac141feea"},
+    {file = "tornado-6.1-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:e0791ac58d91ac58f694d8d2957884df8e4e2f6687cdf367ef7eb7497f79eaa2"},
+    {file = "tornado-6.1-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:66324e4e1beede9ac79e60f88de548da58b1f8ab4b2f1354d8375774f997e6c0"},
+    {file = "tornado-6.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:a48900ecea1cbb71b8c71c620dee15b62f85f7c14189bdeee54966fbd9a0c5bd"},
+    {file = "tornado-6.1-cp39-cp39-win32.whl", hash = "sha256:d3d20ea5782ba63ed13bc2b8c291a053c8d807a8fa927d941bd718468f7b950c"},
+    {file = "tornado-6.1-cp39-cp39-win_amd64.whl", hash = "sha256:548430be2740e327b3fe0201abe471f314741efcb0067ec4f2d7dcfb4825f3e4"},
+    {file = "tornado-6.1.tar.gz", hash = "sha256:33c6e81d7bd55b468d2e793517c909b139960b6c790a60b7991b9b6b76fb9791"},
+]
+tqdm = [
+    {file = "tqdm-4.62.3-py2.py3-none-any.whl", hash = "sha256:8dd278a422499cd6b727e6ae4061c40b48fce8b76d1ccbf5d34fca9b7f925b0c"},
+    {file = "tqdm-4.62.3.tar.gz", hash = "sha256:d359de7217506c9851b7869f3708d8ee53ed70a1b8edbba4dbcb47442592920d"},
+]
+traitlets = [
+    {file = "traitlets-5.1.1-py3-none-any.whl", hash = "sha256:2d313cc50a42cd6c277e7d7dc8d4d7fedd06a2c215f78766ae7b1a66277e0033"},
+    {file = "traitlets-5.1.1.tar.gz", hash = "sha256:059f456c5a7c1c82b98c2e8c799f39c9b8128f6d0d46941ee118daace9eb70c7"},
+]
+traits = [
+    {file = "traits-6.3.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:6202ef3b2eb25663418b7afcacc998ebebcffcb629cefc8bc467e09967c71334"},
+    {file = "traits-6.3.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f4241fd3877f51c5bfa00146eeba9bf20c2c58e5f985f4def2a2e7a910567768"},
+    {file = "traits-6.3.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5d2aa937df4acd4d12d5db8cb7d411174600df592cab4d13ae978afdfeae65d1"},
+    {file = "traits-6.3.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:f7e1ad9181eaf29aa133cd1def6b9d7858655fa8d3ac5d5af0f2fc76f01acf8c"},
+    {file = "traits-6.3.2-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:d61c0f8807879a791844a47d8eb79200fed12790fcc8ff2a964ac099f866fb1e"},
+    {file = "traits-6.3.2-cp310-cp310-win32.whl", hash = "sha256:dc2154ff9ccee40a9022d619984130a39e52f9de6dd3e82ff9a667952322136c"},
+    {file = "traits-6.3.2-cp310-cp310-win_amd64.whl", hash = "sha256:f800d7de44df975f4cd2dbc0985542be23381f1095cd546b781edd43c73ac5f0"},
+    {file = "traits-6.3.2-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:c48be3e299952cbf779f70b11c3f81a02b53633c4b6c21b5f4feae55fdaf2f43"},
+    {file = "traits-6.3.2-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3dfa390863b1801eec9a47988df509742ac74f164c460f057aa7fbb174750035"},
+    {file = "traits-6.3.2-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:5fabbf380fbd50fa3bb4fa6650d2ac4ca20a86c801cb41874cacd0a2aec62bf7"},
+    {file = "traits-6.3.2-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:a16bb961ea844bd9912755adb85343bd7c1cc9a12fd98cf2610b23fb6508bfd4"},
+    {file = "traits-6.3.2-cp36-cp36m-win32.whl", hash = "sha256:20217a3d62cc1e569c06df059f171cc7e31ccb05bf8b50525caa675a3cba17a0"},
+    {file = "traits-6.3.2-cp36-cp36m-win_amd64.whl", hash = "sha256:8939e228bfc412978ddf8a9df85f9efc670d56f9532400e6397544f109655a08"},
+    {file = "traits-6.3.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:9a8f69bd525afaeca2e4deedbdb699962124b651b821a582a5adfd27c8ba032b"},
+    {file = "traits-6.3.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:53c49f1d1d17f601f334d83aaa2f7566cc61c77b90e0f0aebee81bfb37440758"},
+    {file = "traits-6.3.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:ecf7a63365de6823641586d9b79efbb51f23d1ef2c54a09f4cb8e60a25f07410"},
+    {file = "traits-6.3.2-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:9818a6fcb3ce98aca34530a434e91c76c77aeba76fef4e5ccacd8fac1475e474"},
+    {file = "traits-6.3.2-cp37-cp37m-win32.whl", hash = "sha256:40e98a367f43e6aee365443481946d72f3ffb593965ba941980bb8c55c534149"},
+    {file = "traits-6.3.2-cp37-cp37m-win_amd64.whl", hash = "sha256:ff0f72123a7e244c9b166a4b0705dc092930c44ab7f002331be9076ef586eaa4"},
+    {file = "traits-6.3.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:f767222fb96c406fd75fe2decfc725febe1a378ff117dd8e4fb3bb5c34776d26"},
+    {file = "traits-6.3.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:894a0ca79dd0bfc9e0a5d8de1f3d338dac79131dddd4e529137487da8a4761be"},
+    {file = "traits-6.3.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4cade43fddde13c78ec701d5c4b516c060b23864d1d8c1a63439926888054f3c"},
+    {file = "traits-6.3.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:2b110f6f44a5a9315fa019c67e882b0e0e2dad26ff2ed8b67a9ff3116244c40b"},
+    {file = "traits-6.3.2-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:16096dd7da1a49281e454f03083c18c67ee15922454b9782a02d9b263040d327"},
+    {file = "traits-6.3.2-cp38-cp38-win32.whl", hash = "sha256:2f16d7718ab061234ce5354fbe9942e85d467a3b2dd2654e0243b6bafdfcc385"},
+    {file = "traits-6.3.2-cp38-cp38-win_amd64.whl", hash = "sha256:4140dd22ed24bbcf3f60bd46c1a36e6fb92f4abdff3ec5449dbcbce5338a1ddf"},
+    {file = "traits-6.3.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:27afa5c9899fd2089825c71b0951c244e33d08192d094861eae16ba5491dea13"},
+    {file = "traits-6.3.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6318f75246bb187f666ce78071abff204cbac300608a9ad6720b5583b0ac3812"},
+    {file = "traits-6.3.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:02ecb7847f05a0295915a4e920a4cd2b5d2ad893f0fcd2b942e172648527703f"},
+    {file = "traits-6.3.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:ca4fc1076629ecd26810c24761452ee26ef6b9d62ef3f923d1f3f1929c23131a"},
+    {file = "traits-6.3.2-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:6c0167e8919b245588acfb53628fc103eb5f609bf0c42db873a5dd165feb3e5c"},
+    {file = "traits-6.3.2-cp39-cp39-win32.whl", hash = "sha256:98cfd9b08271eca16ae66d4aa171a8474cc8141bfc9827d0928a5e36a0c025b9"},
+    {file = "traits-6.3.2-cp39-cp39-win_amd64.whl", hash = "sha256:4ed07efffa7f045d69561f45bfa0d36a0a6790adea1575b5d3a5f0e433c9f241"},
+    {file = "traits-6.3.2.tar.gz", hash = "sha256:4520ef4a675181f38be4a5bab1b1d5472691597fe2cfe4faf91023e89407e2c6"},
+]
+typing-extensions = [
+    {file = "typing_extensions-4.0.1-py3-none-any.whl", hash = "sha256:7f001e5ac290a0c0401508864c7ec868be4e701886d5b573a9528ed3973d9d3b"},
+    {file = "typing_extensions-4.0.1.tar.gz", hash = "sha256:4ca091dea149f945ec56afb48dae714f21e8692ef22a395223bcd328961b6a0e"},
+]
+unicodecsv = [
+    {file = "unicodecsv-0.14.1.tar.gz", hash = "sha256:018c08037d48649a0412063ff4eda26eaa81eff1546dbffa51fa5293276ff7fc"},
+]
+urllib3 = [
+    {file = "urllib3-1.26.8-py2.py3-none-any.whl", hash = "sha256:000ca7f471a233c2251c6c7023ee85305721bfdf18621ebff4fd17a8653427ed"},
+    {file = "urllib3-1.26.8.tar.gz", hash = "sha256:0e7c33d9a63e7ddfcb86780aac87befc2fbddf46c58dbb487e0855f7ceec283c"},
+]
+wcwidth = [
+    {file = "wcwidth-0.2.5-py2.py3-none-any.whl", hash = "sha256:beb4802a9cebb9144e99086eff703a642a13d6a0052920003a230f3294bbe784"},
+    {file = "wcwidth-0.2.5.tar.gz", hash = "sha256:c4d647b99872929fdb7bdcaa4fbe7f01413ed3d98077df798530e5b04f116c83"},
+]
+xarray = [
+    {file = "xarray-0.20.2-py3-none-any.whl", hash = "sha256:048eee6036efd2a03e7eb3e91b5359c38da9e80aa6fa82def644a102d59bd78f"},
+    {file = "xarray-0.20.2.tar.gz", hash = "sha256:c2ebe80ca81b10a0241f6876dcc34ac9696e5c5cdcdf4758da7cf4bd732c41f7"},
+]
+xlrd = [
+    {file = "xlrd-2.0.1-py2.py3-none-any.whl", hash = "sha256:6a33ee89877bd9abc1158129f6e94be74e2679636b8a205b43b85206c3f0bbdd"},
+    {file = "xlrd-2.0.1.tar.gz", hash = "sha256:f72f148f54442c6b056bf931dbc34f986fd0c3b0b6b5a58d013c9aef274d0c88"},
+]
+xmltodict = [
+    {file = "xmltodict-0.12.0-py2.py3-none-any.whl", hash = "sha256:8bbcb45cc982f48b2ca8fe7e7827c5d792f217ecf1792626f808bf41c3b86051"},
+    {file = "xmltodict-0.12.0.tar.gz", hash = "sha256:50d8c638ed7ecb88d90561beedbf720c9b4e851a9fa6c47ebd64e99d166d8a21"},
+]
+zipp = [
+    {file = "zipp-3.7.0-py3-none-any.whl", hash = "sha256:b47250dd24f92b7dd6a0a8fc5244da14608f3ca90a5efcd37a3b1642fac9a375"},
+    {file = "zipp-3.7.0.tar.gz", hash = "sha256:9f50f446828eb9d45b267433fd3e9da8d801f614129124863f9c51ebceafb87d"},
+]
diff --git a/pyproject.toml b/pyproject.toml
new file mode 100644
index 0000000..dab1167
--- /dev/null
+++ b/pyproject.toml
@@ -0,0 +1,77 @@
+[tool.poetry]
+name = "materials_io"
+version = "0.0.1"
+description = "A library of tools that generate summaries of the data contained in scientific data files"
+authors = ["Materials Data Facility <materialsdatafacility@uchicago.edu>"]
+license = "Apache"
+
+[tool.poetry.dependencies]
+python = "^3.7"
+mdf-toolbox = "^0.5.3"
+stevedore = "^1.28.0"
+
+ase = { version = "~3.19", optional = true }
+pymatgen = { version = "^2018.11.30", optional = true}
+tableschema = { version = "^1,<2", optional = true }
+dfttopif = { version = "^1.1.0", optional = true }
+hyperspy = { version = "^1.4.1", optional = true }
+python-magic = { version = "^0.4.15", optional = true }
+Pillow = { version = "^7.0.0", optional = true }
+xmltodict = { version = "^0.12.0", optional = true }
+pycalphad = { version = "^0.9", optional = true }
+
+[tool.poetry.dev-dependencies]
+flake8 = "^4.0.1"
+pytest = "^3.10.1"
+coveralls = "^3.3.1"
+pytest-cov = "^2.9.0"
+
+[tool.poetry.extras]
+ase = ['ase']
+crystal_structure = ['pymatgen', 'ase']
+csv = ['tableschema']
+dft = ['dfttopif']
+electron_microscopy = ['hyperspy']
+file = ['python-magic']
+image = ['Pillow']
+tdb = ['pycalphad']
+xml = ['xmltodict']
+# to make it easy to add all extras, maintain the list below as the sum
+# of all the dependencies above
+all = ['ase',
+       'pymatgen',
+       'tableschema',
+       'dfttopif',
+       'hyperspy',
+       'python-magic',
+       'Pillow',
+       'xmltodict',
+       'pycalphad']
+
+[tool.poetry.plugins]
+
+[tool.poetry.plugins."materialsio.parser"]
+"ase" = "materials_io.ase:AseParser"
+"crystal" = "materials_io.crystal_structure:CrystalStructureParser"
+"csv" = "materials_io.csv:CSVParser"
+"dft" = "materials_io.dft:DFTParser"
+"em" = "materials_io.electron_microscopy:ElectronMicroscopyParser"
+"filename" = "materials_io.filename:FilenameExtractor"
+"generic" = "materials_io.file:GenericFileParser"
+"image" = "materials_io.image:ImageParser"
+"json" = "materials_io.json:JSONExtractor"
+"noop" = "materials_io.testing:NOOPParser"
+"tdb" = "materials_io.tdb:TDBExtractor"
+"xml" = "materials_io.xml:XMLExtractor"
+"yaml" = "materials_io.yaml:YAMLExtractor"
+
+[tool.poetry.plugins."materialsio.adapter"]
+"noop" = "materials_io.adapters.base:NOOPAdapter"
+"serialize" = "materials_io.adapters.base:SerializeAdapter"
+
+[build-system]
+requires = ["poetry-core>=1.0.0"]
+build-backend = "poetry.core.masonry.api"
+
+[tool.pytest.ini_options]
+addopts = "--ignore=setup.py --ignore=.venv --cov=materials_io"
diff --git a/setup.cfg b/setup.cfg
index 9309182..c8b4963 100644
--- a/setup.cfg
+++ b/setup.cfg
@@ -2,8 +2,8 @@
 universal = 1
 
 [tool:pytest]
-addopts = --ignore=setup.py --cov=materials_io
+addopts = --ignore=setup.py --ignore=.venv --cov=materials_io
 
 [flake8]
-exclude = .git,*.egg*,src/*
+exclude = .git,*.egg*,src/*,.venv
 max-line-length = 100
diff --git a/setup.py b/setup.py
index 3467e06..aabbd45 100644
--- a/setup.py
+++ b/setup.py
@@ -24,7 +24,7 @@
     name="materials_io",
     version=version,
     packages=find_packages(include=['materials_io*']) + ['materials_io.schemas'],
-    install_requires=['mdf_toolbox>=0.5.3', 'stevedore>=1.28.0', 'materials_io'],
+    install_requires=['mdf_toolbox>=0.5.3', 'stevedore>=1.28.0'],
     extras_require=extra_reqs,
     include_package_data=True,
     package_data={'materials_io.schemas': ['*.json']},


Test patch:
diff --git a/tests/conftest.py b/tests/conftest.py
new file mode 100644
index 0000000..d387e14
--- /dev/null
+++ b/tests/conftest.py
@@ -0,0 +1,33 @@
+import tarfile
+import pathlib
+
+tar_f = pathlib.Path(__file__).parent / 'data' / 'electron_microscopy' / \
+        'test_files.tar.gz'
+
+
+def pytest_sessionstart(session):
+    """
+    Called after the Session object has been created and
+    before performing collection and entering the run test loop.
+
+    Unpack the compressed electron_microscopy est files.
+    """
+    with tarfile.open(tar_f, 'r:gz') as tar:
+        tar.extractall(path=pathlib.Path(tar_f).parent)
+
+
+def pytest_sessionfinish(session, exitstatus):
+    """
+    Called after whole test run finished, right before
+    returning the exit status to the system.
+
+    Remove the unpacked test files.
+    """
+    with tarfile.open(tar_f, 'r:gz') as tar:
+        fn_list = tar.getnames()
+
+    fn_list = [pathlib.Path(__file__).parent / 'data' /
+               'electron_microscopy' / f for f in fn_list]
+    for path in fn_list:
+        if path.is_file():
+            path.unlink()
diff --git a/tests/data/electron_microscopy/test-1.dm3 b/tests/data/electron_microscopy/test-1.dm3
deleted file mode 100644
index af6f263..0000000
Binary files a/tests/data/electron_microscopy/test-1.dm3 and /dev/null differ
diff --git a/tests/data/electron_microscopy/test-1.dm4 b/tests/data/electron_microscopy/test-1.dm4
deleted file mode 100644
index a6d2ba0..0000000
Binary files a/tests/data/electron_microscopy/test-1.dm4 and /dev/null differ
diff --git a/tests/data/electron_microscopy/test-EDS_spectrum.dm3 b/tests/data/electron_microscopy/test-EDS_spectrum.dm3
deleted file mode 100644
index 5c5ab8e..0000000
Binary files a/tests/data/electron_microscopy/test-EDS_spectrum.dm3 and /dev/null differ
diff --git a/tests/data/electron_microscopy/test_files.tar.gz b/tests/data/electron_microscopy/test_files.tar.gz
new file mode 100644
index 0000000..0d84807
Binary files /dev/null and b/tests/data/electron_microscopy/test_files.tar.gz differ
diff --git a/tests/test_electron_microscopy.py b/tests/test_electron_microscopy.py
index 43c7636..564a3a6 100644
--- a/tests/test_electron_microscopy.py
+++ b/tests/test_electron_microscopy.py
@@ -1,48 +1,613 @@
 import pytest
-import os
+import pathlib
+import json
+import jsonschema
 
+from materials_io import electron_microscopy
 from materials_io.electron_microscopy import ElectronMicroscopyParser
 
 
-data_file_loc = os.path.join(os.path.dirname(__file__), 'data', 'electron_microscopy')
+def file_path(fname):
+    return pathlib.Path(pathlib.PurePath(__file__).parent,
+                        'data', 'electron_microscopy', fname)
 
 
 @pytest.fixture
-def dm3():
-    return os.path.join(data_file_loc, 'test-1.dm3')
+def parser():
+    return ElectronMicroscopyParser()
 
 
 @pytest.fixture
-def dm4():
-    return os.path.join(data_file_loc, 'test-1.dm4')
+def schema() -> dict:
+    """Return the JSON schema associated with this parser as a dictionary"""
+    p = pathlib.PurePath(electron_microscopy.__file__)
+    schema_path = p.parent / 'schemas' / f"{p.stem}.json"
+    with open(schema_path, 'r') as f:
+        schema = json.load(f)
+    return schema
 
 
-@pytest.fixture
-def eds():
-    return os.path.join(data_file_loc, 'test-EDS_spectrum.dm3')
+def test_dm3(parser, schema):
+    res = parser.parse([file_path('test-1.dm3')])
+    assert res['electron_microscopy']['General'] == {
+        'original_filename': {'value': 'test-1.dm3'},
+        'title': {'value': 'test'},
+        'axis_calibration': {
+            'axis-0': {'name': 'x', 'scale': 1.0, 'offset': -0.0,
+                       'size': 2, 'units': ''}},
+        'data_dimensions': [2]
+    }
+    assert jsonschema.validate(res, schema) is None
 
 
-@pytest.fixture
-def parser():
-    return ElectronMicroscopyParser()
+def test_dm4(parser, schema):
+    res = parser.parse([file_path('test-1.dm4')])
+    assert res['electron_microscopy']['General'] == {
+        'original_filename': {'value': 'test-1.dm4'},
+        'title': {'value': 'test'},
+        'axis_calibration': {
+            'axis-0': {'name': 'y', 'scale': 1.0, 'offset': -0.0,
+                       'size': 2, 'units': ''},
+            'axis-1': {'name': 'x', 'scale': 1.0, 'offset': -0.0,
+                       'size': 2, 'units': ''}},
+        'data_dimensions': [2, 2]}
+    assert jsonschema.validate(res, schema) is None
+
+
+def test_eds(parser, schema):
+    res = parser.parse([file_path('01_test-EDS_spectrum.dm3')])
+
+    assert res['electron_microscopy']['General'] == {
+        'date': {'value': '2016-08-08'},
+        'original_filename': {'value': '01_test-EDS_spectrum.dm3'},
+        'time': {'value': '21:46:19'},
+        'title': {'value': 'EDS Spectrum'},
+        'axis_calibration': {
+            'axis-0': {'name': 'x', 'scale': 0.004999999888241291,
+                       'offset': -0.47799998168647306, 'size': 4096,
+                       'units': 'KiloEV'}},
+        'data_dimensions': [4096]
+    }
+    assert res['electron_microscopy']['General_EM'] == {
+        'acquisition_mode': {'value': 'STEM'},
+        'beam_current': {'value': 0.0, 'units': 'NanoA'},
+        'beam_energy': {'value': 200.0, 'units': 'KiloEV'},
+        'magnification_indicated': {'value': 320000.0,
+                                    'units': 'UNITLESS'},
+        'microscope_name': {'value': 'FEI Titan'}, 'stage_position': {
+            'tilt_alpha': {'value': 24.950478513002935, 'units': 'DEG'},
+            'x': {'value': -0.480393, 'units': 'MilliM'},
+            'y': {'value': 0.057116, 'units': 'MilliM'},
+            'z': {'value': 0.028449299999999997, 'units': 'MilliM'}},
+        'acquisition_software_name': {'value': 'DigitalMicrograph'},
+        'emission_current': {'value': 0.0, 'units': 'MicroA'},
+        'accelerating_voltage': {'value': 200.0, 'units': 'KiloV'},
+        'acquisition_software_version': {'value': '2.31.734.0'}}
+    assert res['electron_microscopy']['TEM'] == {
+        'camera_length': {'value': 135.0, 'units': 'MilliM'},
+        'spherical_aberration_coefficient': {'value': 0.0,
+                                             'units': 'MilliM'},
+        'operation_mode': {'value': 'SCANNING'},
+        'imaging_mode': {'value': 'DIFFRACTION'},
+        'illumination_mode': {'value': 'STEM NANOPROBE'},
+        'acquisition_mode': {'value': 'Parallel dispersive'},
+        'acquisition_format': {'value': 'Spectrum'},
+        'acquisition_signal': {'value': 'X-ray'}}
+    assert res['electron_microscopy']['EDS'] == {
+        'azimuth_angle': {'value': 45.0, 'units': 'DEG'},
+        'elevation_angle': {'value': 18.0, 'units': 'DEG'},
+        'energy_resolution_MnKa': {'value': 130.0, 'units': 'EV'},
+        'live_time': {'value': 3.806, 'units': 'SEC'},
+        'real_time': {'value': 4.233, 'units': 'SEC'},
+        'detector_type': {'value': 'SIUTW'},
+        'dispersion_per_channel': {'value': 5.0, 'units': 'EV'},
+        'incidence_angle': {'value': 90.0, 'units': 'DEG'},
+        'solid_angle': {'value': 0.7, 'units': 'SR'},
+        'stage_tilt': {'value': 0.0, 'units': 'DEG'}}
+    assert jsonschema.validate(res, schema) is None
+
+    res = parser.parse([file_path('02_EDS_SI_Titan.dm4')])
+    assert res['electron_microscopy']['General'] == {
+        'date': {'value': '2019-05-21'},
+        'original_filename': {'value': '02_EDS_SI_Titan.dm4'},
+        'time': {'value': '15:49:18'},
+        'title': {'value': 'EDS Spectrum Image'},
+        'axis_calibration': {
+            'axis-0': {'name': 'y', 'scale': 0.6477993130683899,
+                       'offset': -0.0, 'size': 100, 'units': 'NanoM'},
+            'axis-1': {'name': 'x', 'scale': 0.009992999956011772,
+                       'offset': -0.0014575000671512572, 'size': 4096,
+                       'units': 'KiloEV'}},
+        'data_dimensions': [100, 4096]
+    }
+    assert res['electron_microscopy']['General_EM'] == {
+        'acquisition_mode': {'value': 'STEM'},
+        'beam_current': {'value': 0.0, 'units': 'NanoA'},
+        'beam_energy': {'value': 300.0, 'units': 'KiloEV'},
+        'magnification_indicated': {'value': 910000.0, 'units': 'UNITLESS'},
+        'microscope_name': {'value': 'Titan80-300_D3094'},
+        'stage_position': {
+            'tilt_alpha': {'value': 15.208992784409162, 'units': 'DEG'},
+            'tilt_beta': {'value': -0.88000014796348, 'units': 'DEG'},
+            'x': {'value': 0.013455, 'units': 'MilliM'},
+            'y': {'value': 0.137812, 'units': 'MilliM'},
+            'z': {'value': 0.0009226799999999999, 'units': 'MilliM'}},
+        'acquisition_software_name': {'value': 'DigitalMicrograph'},
+        'emission_current': {'value': 0.0, 'units': 'MicroA'},
+        'accelerating_voltage': {'value': 300.0, 'units': 'KiloV'},
+        'detector_name': {'value': 'GIF CCD'},
+        'acquisition_software_version': {'value': '2.32.888.0'}}
+    assert res['electron_microscopy']['TEM'] == {
+        'camera_length': {'value': 77.0, 'units': 'MilliM'},
+        'spherical_aberration_coefficient': {'value': 1.0,
+                                             'units': 'MilliM'},
+        'operation_mode': {'value': 'SCANNING'},
+        'imaging_mode': {'value': 'DIFFRACTION'},
+        'illumination_mode': {'value': 'STEM NANOPROBE'},
+        'acquisition_mode': {'value': 'Parallel dispersive'},
+        'acquisition_format': {'value': 'Spectrum image'},
+        'acquisition_signal': {'value': 'X-ray'}}
+    assert res['electron_microscopy']['EDS'] == {
+        'azimuth_angle': {'value': 45.0, 'units': 'DEG'},
+        'elevation_angle': {'value': 40.0, 'units': 'DEG'},
+        'energy_resolution_MnKa': {'value': 130.0, 'units': 'EV'},
+        'live_time': {'value': 1.0, 'units': 'SEC'},
+        'real_time': {'value': 0.5, 'units': 'SEC'},
+        'detector_type': {'value': 'SIUTW'},
+        'incidence_angle': {'value': 90.0, 'units': 'DEG'},
+        'solid_angle': {'value': 0.002, 'units': 'SR'},
+        'stage_tilt': {'value': 0.0, 'units': 'DEG'}}
+    assert jsonschema.validate(res, schema) is None
+
+
+def test_edax_eds(parser, schema):
+    res = parser.parse([file_path('03_edax_sem_eds_map_dataZeroed.spd')])
+
+    assert res['electron_microscopy']['General'] == {
+        'original_filename': {'value': '03_edax_sem_eds_map_dataZeroed.spd'},
+        'title': {'value': 'EDS Spectrum Image'},
+        'axis_calibration': {
+            'axis-0': {'name': 'y', 'scale': 0.014227345585823059,
+                       'offset': 0.0, 'size': 200, 'units': 'MicroM'},
+            'axis-1': {'name': 'x', 'scale': 0.014235896058380604,
+                       'offset': 0.0, 'size': 256, 'units': 'MicroM'},
+            'axis-2': {'name': 'Energy', 'scale': 0.005, 'offset': 0.0,
+                       'size': 2500, 'units': 'KiloEV'}},
+        'data_dimensions': [200, 256, 2500]
+    }
+    assert res['electron_microscopy']['General_EM'] == {
+        'beam_energy': {'value': 22.0, 'units': 'KiloEV'},
+        'stage_position': {'tilt_alpha': {'value': 0.0, 'units': 'DEG'}},
+        'elements': {'value': ['Ce', 'Co', 'Cr', 'Fe', 'Gd',
+                               'La', 'Mg', 'O', 'Sr']}
+    }
+    assert res['electron_microscopy']['EDS'] == {
+        'azimuth_angle': {'value': 0.0, 'units': 'DEG'},
+        'elevation_angle': {'value': 34.0, 'units': 'DEG'},
+        'energy_resolution_MnKa': {'value': 126.6025161743164,
+                                   'units': 'EV'},
+        'live_time': {'value': 2621.43994140625, 'units': 'SEC'}
+    }
+    assert jsonschema.validate(res, schema) is None
+
+
+def test_eels(parser, schema):
+    res = parser.parse([file_path('04_Titan_EELS_SI_dataZeroed.dm3')])
+    assert res['electron_microscopy']['General'] == {
+        'date': {'value': '2016-04-22'},
+        'original_filename': {'value': '04_Titan_EELS_SI_dataZeroed.dm3'},
+        'time': {'value': '16:34:54'},
+        'title': {'value': 'EELS Spectrum Image'},
+        'axis_calibration': {
+            'axis-0': {'name': 'x', 'scale': 0.0010174631606787443,
+                       'offset': -0.0, 'size': 1186, 'units': 'MicroM'},
+            'axis-1': {'name': 'Energy loss', 'scale': 0.5,
+                       'offset': 300.0, 'size': 2048, 'units': 'EV'}},
+        'data_dimensions': [1186, 2048]
+    }
+    assert res['electron_microscopy']['General_EM'] == {
+        'acquisition_mode': {'value': 'STEM'},
+        'beam_current': {'value': 0.0, 'units': 'NanoA'},
+        'beam_energy': {'value': 300.0, 'units': 'KiloEV'},
+        'convergence_angle': {'value': 13.0, 'units': 'MilliRAD'},
+        'magnification_indicated': {'value': 57000.0, 'units': 'UNITLESS'},
+        'microscope_name': {'value': 'FEI Tecnai Remote'},
+        'stage_position': {
+            'tilt_alpha': {'value': 1.8231688928401335, 'units': 'DEG'},
+            'tilt_beta': {'value': -2.420001839294058, 'units': 'DEG'},
+            'x': {'value': -0.035997, 'units': 'MilliM'},
+            'y': {'value': -0.0107027, 'units': 'MilliM'},
+            'z': {'value': -0.14221899999999998, 'units': 'MilliM'}},
+        'dwell_time': {'value': 0.5, 'units': 'SEC'},
+        'acquisition_software_name': {'value': 'DigitalMicrograph'},
+        'emission_current': {'value': 0.0, 'units': 'MicroA'},
+        'accelerating_voltage': {'value': 300.0, 'units': 'KiloV'},
+        'exposure_time': {'value': 0.5, 'units': 'SEC'},
+        'acquisition_software_version': {'value': '2.32.888.0'}}
+    assert res['electron_microscopy']['TEM'] == {
+        'camera_length': {'value': 60.0, 'units': 'MilliM'},
+        'spherical_aberration_coefficient': {'value': 1.0,
+                                             'units': 'MilliM'},
+        'operation_mode': {'value': 'SCANNING'},
+        'imaging_mode': {'value': 'DIFFRACTION'},
+        'illumination_mode': {'value': 'STEM NANOPROBE'},
+        'acquisition_mode': {'value': 'Parallel dispersive'},
+        'acquisition_format': {'value': 'Spectrum image'},
+        'acquisition_signal': {'value': 'EELS'},
+        'acquisition_device': {'value': 'US1000FT 1'}}
+    assert res['electron_microscopy']['EELS'] == {
+        'aperture_size': {'value': 2.5, 'units': 'MilliM'},
+        'collection_angle': {'value': 13.88888931274414,
+                             'units': 'MilliRAD'},
+        'number_of_samples': {'value': 1, 'units': 'NUM'},
+        'spectrometer_name': {'value': 'GIF Tridiem ER'},
+        'dispersion_per_channel': {'value': 0.5, 'units': 'EV'},
+        'energy_loss_offset': {'value': 400.0, 'units': 'EV'},
+        'drift_tube_voltage': {'value': 400.0, 'units': 'V'},
+        'drift_tube_enabled': {'value': True},
+        'prism_shift_voltage': {'value': 0.0, 'units': 'V'},
+        'prism_shift_enabled': {'value': True},
+        'filter_slit_width': {'value': 10.0, 'units': 'EV'},
+        'filter_slit_inserted': {'value': False}}
+    assert jsonschema.validate(res, schema) is None
+
+
+def test_non_titan_dm3(parser, schema):
+    res = parser.parse([file_path('05_nonTitan_diffraction.dm3')])
+    assert res['electron_microscopy']['General'] == {
+        'date': {'value': '2019-07-01'},
+        'original_filename': {'value': '05_nonTitan_diffraction.dm3'},
+        'time': {'value': '14:55:56'}, 'title': {'value': 'D20cm'},
+        'axis_calibration': {
+            'axis-0': {'name': 'y', 'scale': 1.0, 'offset': -0.0, 'size': 2672,
+                       'units': ''},
+            'axis-1': {'name': 'x', 'scale': 1.0, 'offset': -0.0, 'size': 4008,
+                       'units': ''}},
+        'data_dimensions': [2672, 4008]}
+    assert res['electron_microscopy']['General_EM'] == {
+        'microscope_name': {'value': 'Test JEOL  '},
+        'acquisition_software_name': {'value': 'DigitalMicrograph'},
+        'exposure_time': {'value': 0.1, 'units': 'SEC'}}
+    assert res['electron_microscopy']['TEM'] == {
+        'acquisition_device': {'value': 'Orius '}}
+    assert jsonschema.validate(res, schema) is None
+
+
+def test_dm3_tecnai(parser, schema):
+    eels_mdata = {
+        'spectrometer_mode': {'value': 'Spectroscopy'},
+        'dispersion_per_channel': {'value': 0.1, 'units': 'EV'},
+        'aperture_size': {'value': 3.0, 'units': 'MilliM'},
+        'drift_tube_energy': {'value': 0.0, 'units': 'EV'},
+        'prism_shift_energy': {'value': -0.0, 'units': 'EV'},
+        'total_energy_loss': {'value': 0.0, 'units': 'EV'}
+    }
+
+    # parse imaging mode tecnai file
+    res = parser.parse([file_path('06_Titan_Tecnai_image.dm3')])
+
+    assert res['electron_microscopy']['General'] == {
+        'date': {'value': '2019-03-13'},
+        'original_filename': {'value': '06_Titan_Tecnai_image.dm3'},
+        'time': {'value': '15:02:56'},
+        'title': {'value': '04 - 40um obj - 8100x'},
+        'axis_calibration': {
+            'axis-0': {'name': 'y', 'scale': 0.0012943786568939686,
+                       'offset': -0.0, 'size': 2048, 'units': 'MicroM'},
+            'axis-1': {'name': 'x', 'scale': 0.0012943786568939686,
+                       'offset': -0.0, 'size': 2048, 'units': 'MicroM'}},
+        'data_dimensions': [2048, 2048]
+    }
+    assert res['electron_microscopy']['General_EM'] == {
+        'acquisition_mode': {'value': 'TEM'},
+        'beam_current': {'value': 0.0, 'units': 'NanoA'},
+        'beam_energy': {'value': 300.0, 'units': 'KiloEV'},
+        'magnification_indicated': {'value': 8100, 'units': 'UNITLESS'},
+        'microscope_name': {'value': 'Titan 300 kV D3188 SuperTwin'},
+        'acquisition_software_name': {'value': 'DigitalMicrograph'},
+        'magnification_actual': {'value': 10816.0, 'units': 'UNITLESS'},
+        'emission_current': {'value': 131.0, 'units': 'MicroA'},
+        'accelerating_voltage': {'value': 300.0, 'units': 'KiloV'},
+        'exposure_time': {'value': 1.0, 'units': 'SEC'},
+        'stage_position': {
+            'x': {'value': 147.847, 'units': 'MicroM'},
+            'y': {'value': -132.289, 'units': 'MicroM'},
+            'z': {'value': 126.673, 'units': 'MicroM'},
+            'tilt_alpha': {'value': 0.65, 'units': 'DEG'},
+            'tilt_beta': {'value': 0.0, 'units': 'DEG'}}}
+    assert res['electron_microscopy']['TEM'] == {
+        'spherical_aberration_coefficient': {'value': 1.2,
+                                             'units': 'MilliM'},
+        'camera_length': {'value': 0.0, 'units': 'MilliM'},
+        'operation_mode': {'value': 'TEM uP SA Zoom Image'},
+        'imaging_mode': {'value': 'IMAGING'},
+        'illumination_mode': {'value': 'TEM'},
+        'acquisition_device': {'value': 'BM-UltraScan'},
+        'extractor_voltage': {'value': 4400, 'units': 'V'},
+        'defocus': {'value': -0.0, 'units': 'MicroM'},
+        'spot_size': {'value': 2, 'units': 'UNITLESS'}}
+    assert res['electron_microscopy']['EELS'] == eels_mdata
+    assert jsonschema.validate(res, schema) is None
+
+    # parse diffraction mode tecnai dm3
+    res = parser.parse([file_path('07_Titan_Tecnai_diffraction.dm3')])
+    assert res['electron_microscopy']['General'] == {
+        'date': {'value': '2019-09-19'},
+        'original_filename': {'value': '07_Titan_Tecnai_diffraction.dm3'},
+        'time': {'value': '18:35:12'},
+        'title': {'value': 'CA40_10mrad_CL245'},
+        'axis_calibration': {
+            'axis-0': {'name': 'y', 'scale': 0.02902260050177574,
+                       'offset': -0.0, 'size': 2048,
+                       'units': 'PER-NanoM'},
+            'axis-1': {'name': 'x', 'scale': 0.02902260050177574,
+                       'offset': -0.0, 'size': 2048,
+                       'units': 'PER-NanoM'}},
+        'data_dimensions': [2048, 2048]
+    }
+    assert res['electron_microscopy']['General_EM'] == {
+        'acquisition_mode': {'value': 'STEM'},
+        'beam_current': {'value': 0.0, 'units': 'NanoA'},
+        'beam_energy': {'value': 300.0, 'units': 'KiloEV'},
+        'magnification_indicated': {'value': 1800000, 'units': 'UNITLESS'},
+        'microscope_name': {'value': 'Titan 300 kV D3188 SuperTwin'},
+        'acquisition_software_name': {'value': 'DigitalMicrograph'},
+        'magnification_actual': {'value': 245.00000000000003,
+                                 'units': 'UNITLESS'},
+        'emission_current': {'value': 150.0, 'units': 'MicroA'},
+        'accelerating_voltage': {'value': 300.0, 'units': 'KiloV'},
+        'exposure_time': {'value': 2.0, 'units': 'SEC'},
+        'stage_position': {'x': {'value': -201.9, 'units': 'MicroM'},
+                           'y': {'value': 269.484, 'units': 'MicroM'},
+                           'z': {'value': 31.231, 'units': 'MicroM'},
+                           'tilt_alpha': {'value': 0.64, 'units': 'DEG'},
+                           'tilt_beta': {'value': 0.22, 'units': 'DEG'}}}
+    assert res['electron_microscopy']['TEM'] == {
+        'camera_length': {'value': 245.0, 'units': 'MilliM'},
+        'spherical_aberration_coefficient': {'value': 1.2,
+                                             'units': 'MilliM'},
+        'operation_mode': {'value': 'STEM nP SA Zoom Diffraction'},
+        'imaging_mode': {'value': 'DIFFRACTION'},
+        'illumination_mode': {'value': 'STEM'},
+        'acquisition_device': {'value': 'BM-UltraScan'},
+        'extractor_voltage': {'value': 4500, 'units': 'V'},
+        'defocus': {'value': 0.082, 'units': 'MicroM'},
+        'spot_size': {'value': 8, 'units': 'UNITLESS'}}
+    assert res['electron_microscopy']['EELS'] == eels_mdata
+    assert jsonschema.validate(res, schema) is None
+
+    # parse diffraction mode tecnai with no spectrometer info
+    res = parser.parse([file_path(
+        '08_Titan_diffraction_Tecnai_no_spectrometer.dm3')])
+    assert res['electron_microscopy']['General'] == {
+        'date': {'value': '2019-03-22'}, 'original_filename': {
+            'value': '08_Titan_diffraction_Tecnai_no_spectrometer.dm3'},
+        'time': {'value': '14:39:25'},
+        'title': {'value': '02-380mm_A'},
+        'axis_calibration': {
+            'axis-0': {'name': 'y', 'scale': 0.014335760846734047,
+                       'offset': -0.0, 'size': 2048,
+                       'units': 'PER-NanoM'},
+            'axis-1': {'name': 'x', 'scale': 0.014335760846734047,
+                       'offset': -0.0, 'size': 2048,
+                       'units': 'PER-NanoM'}},
+        'data_dimensions': [2048, 2048]
+    }
+    assert res['electron_microscopy']['General_EM'] == {
+        'acquisition_mode': {'value': 'TEM'},
+        'beam_current': {'value': 0.0, 'units': 'NanoA'},
+        'beam_energy': {'value': 300.0, 'units': 'KiloEV'},
+        'microscope_name': {'value': 'Titan 300 kV D3188 SuperTwin'},
+        'acquisition_software_name': {'value': 'DigitalMicrograph'},
+        'magnification_indicated': {'value': 380.0, 'units': 'UNITLESS'},
+        'magnification_actual': {'value': 496.0, 'units': 'UNITLESS'},
+        'emission_current': {'value': 140.0, 'units': 'MicroA'},
+        'accelerating_voltage': {'value': 300.0, 'units': 'KiloV'},
+        'exposure_time': {'value': 1.0, 'units': 'SEC'},
+        'stage_position': {'x': {'value': 357.213, 'units': 'MicroM'},
+                           'y': {'value': 40.045, 'units': 'MicroM'},
+                           'z': {'value': 13.386, 'units': 'MicroM'},
+                           'tilt_alpha': {'value': 2.03, 'units': 'DEG'},
+                           'tilt_beta': {'value': 0.38, 'units': 'DEG'}}}
+    assert res['electron_microscopy']['TEM'] == {
+        'camera_length': {'value': 380.0, 'units': 'MilliM'},
+        'spherical_aberration_coefficient': {'value': 1.2,
+                                             'units': 'MilliM'},
+        'operation_mode': {'value': 'TEM uP SA Zoom Diffraction'},
+        'imaging_mode': {'value': 'DIFFRACTION'},
+        'illumination_mode': {'value': 'TEM'},
+        'acquisition_device': {'value': 'BM-UltraScan'},
+        'extractor_voltage': {'value': 4500, 'units': 'V'},
+        'defocus': {'value': 0.0, 'units': 'MicroM'},
+        'spot_size': {'value': 3, 'units': 'UNITLESS'}}
+    assert jsonschema.validate(res, schema) is None
+
+
+def test_dm3_stack(parser, schema):
+    res = parser.parse([file_path('09_Titan_STEM_stack.dm3')])
+    # note that the axis_calibration values are bogus, but they're not read
+    # correctly my DigitalMicrograph, so we cannot expect to do better than
+    # the proprietary software. The proper calibration appears to be present
+    # at res['electron_microscopy']['raw_metadata']['ImageList']['TagGroup0'][
+    #        'ImageTags']['plane info']['TagGroup0']['calibration']
+    assert res['electron_microscopy']['General'] == {
+        'original_filename': {'value': '09_Titan_STEM_stack.dm3'},
+        'title': {'value': '2_2'}, 'axis_calibration': {
+            'axis-0': {'name': 'z', 'scale': 1.0, 'offset': -0.0, 'size': 12,
+                       'units': ''},
+            'axis-1': {'name': 'y', 'scale': 1.0, 'offset': -0.0, 'size': 1024,
+                       'units': ''},
+            'axis-2': {'name': 'x', 'scale': 1.0, 'offset': -0.0, 'size': 1024,
+                       'units': ''}},
+        'data_dimensions': [12, 1024, 1024]}
+    assert res['electron_microscopy']['General_EM'] == {
+        'acquisition_software_name': {'value': 'DigitalMicrograph'},
+        'magnification_indicated': {'value': 7200000.0, 'units': 'UNITLESS'},
+        'stage_position': {'x': {'value': 0.156234, 'units': 'MilliM'},
+                           'y': {'value': -0.033405000000000004,
+                                 'units': 'MilliM'},
+                           'z': {'value': 0.0010485, 'units': 'MilliM'},
+                           'tilt_alpha': {'value': 5.127416497359591,
+                                          'units': 'DEG'},
+                           'tilt_beta': {'value': 10.17498559638975,
+                                         'units': 'DEG'}},
+        'emission_current': {'value': 0.0, 'units': 'MicroA'},
+        'accelerating_voltage': {'value': 300.0, 'units': 'KiloV'},
+        'detector_name': {'value': 'GIF CCD'},
+        'microscope_name': {'value': 'Test Microscope  '},
+        'acquisition_software_version': {'value': '2.32.888.0'}}
+    assert res['electron_microscopy']['TEM'] == {
+        'spherical_aberration_coefficient': {'value': 1.0, 'units': 'MilliM'},
+        'camera_length': {'value': 100.0, 'units': 'MilliM'},
+        'operation_mode': {'value': 'SCANNING'},
+        'imaging_mode': {'value': 'DIFFRACTION'},
+        'illumination_mode': {'value': 'STEM NANOPROBE'},
+        'acquisition_device': {'value': 'DigiScan'}}
+    assert jsonschema.validate(res, schema) is None
+
+
+def test_eels_acquisition_spectrometer(parser, schema):
+    res = parser.parse([file_path('10_Titan_EELS_proc.dm3')])
+    assert res['electron_microscopy']['General'] == {
+        'original_filename': {'value': '10_Titan_EELS_proc.dm3'},
+        'title': {'value': 'SI24 Extracted Spectrum total'},
+        'axis_calibration': {
+            'axis-0': {'name': 'Energy loss', 'scale': 0.20000000298023224,
+                       'offset': -17.600000262260437, 'size': 1340,
+                       'units': 'EV'}},
+        'data_dimensions': [1340]}
+    assert res['electron_microscopy']['General_EM'] == {
+        'acquisition_mode': {'value': 'STEM'},
+        'beam_current': {'value': 0.0, 'units': 'NanoA'},
+        'beam_energy': {'value': 300.0, 'units': 'KiloEV'},
+        'convergence_angle': {'value': 10.0, 'units': 'MilliRAD'},
+        'magnification_indicated': {'value': 20000.0, 'units': 'UNITLESS'},
+        'microscope_name': {'value': 'FEI Tecnai'},
+        'exposure_time': {'value': 517.4999862909317, 'units': 'SEC'},
+        'acquisition_software_name': {'value': 'DigitalMicrograph'},
+        'emission_current': {'value': 0.0, 'units': 'MicroA'},
+        'accelerating_voltage': {'value': 300.0, 'units': 'KiloV'}}
+    assert res['electron_microscopy']['TEM'] == {
+        'camera_length': {'value': 77.0, 'units': 'MilliM'},
+        'spherical_aberration_coefficient': {'value': 1.2, 'units': 'MilliM'},
+        'operation_mode': {'value': 'STEM'},
+        'imaging_mode': {'value': 'DIFFRACTION'},
+        'illumination_mode': {'value': 'STEM'},
+        'acquisition_mode': {'value': 'Parallel dispersive'},
+        'acquisition_format': {'value': 'Spectrum'},
+        'acquisition_signal': {'value': 'EELS'},
+        'acquisition_device': {'value': 'ENFINA'}}
+    assert res['electron_microscopy']['EELS'] == {
+        'collection_angle': {'value': 6.5, 'units': 'MilliRAD'},
+        'number_of_samples': {'value': 575, 'units': 'NUM'},
+        'aperture_size': {'value': 2.0, 'units': 'MilliM'},
+        'dispersion_per_channel': {'value': 0.20000000298023224, 'units': 'EV'},
+        'energy_loss_offset': {'value': 0.0, 'units': 'EV'},
+        'spectrometer_name': {'value': 'Enfina'},
+        'drift_tube_voltage': {'value': 0.0, 'units': 'V'},
+        'drift_tube_enabled': {'value': True},
+        'prism_shift_voltage': {'value': 0.0, 'units': 'V'},
+        'prism_shift_enabled': {'value': True}}
+    assert jsonschema.validate(res, schema) is None
+
+
+def test_hs_signal_no_units(parser, schema):
+    res = parser.parse([file_path('11_hs_signal_no_axis_units.hspy')])
+    assert res['electron_microscopy']['General'] == {
+        'axis_calibration': {
+            'axis-0': {'name': None, 'scale': 1.0,
+                       'offset': 0.0, 'size': 10, 'units': None},
+            'axis-1': {'name': None, 'scale': 1.0,
+                       'offset': 0.0, 'size': 10, 'units': None},
+            'axis-2': {'name': None, 'scale': 1.0,
+                       'offset': 0.0, 'size': 10, 'units': None}},
+        'data_dimensions': [10, 10, 10]}
+    assert jsonschema.validate(res, schema) is None
+
+
+def test_tia_haadf(parser, schema):
+    res = parser.parse([file_path('12_TIA_HAADF.emi')])
+    assert res['electron_microscopy']['General'] == {
+        'date': {'value': '2019-06-28'},
+        'original_filename': {'value': '12_TIA_HAADF_1.ser'},
+        'time': {'value': '15:53:31'}, 'axis_calibration': {
+            'axis-0': {'name': 'y', 'scale': 5.153783352972127,
+                       'offset': -2.638737076721729e-06, 'size': 1024,
+                       'units': 'NanoM'},
+            'axis-1': {'name': 'x', 'scale': 5.153783352972127,
+                       'offset': -2.638737076721729e-06, 'size': 1024,
+                       'units': 'NanoM'}}, 'data_dimensions': [1024, 1024]}
+
+    assert res['electron_microscopy']['General_EM'] == {
+        'acquisition_mode': {'value': 'STEM nP SA Zoom Image'},
+        'beam_energy': {'value': 300.0, 'units': 'KiloEV'},
+        'magnification_indicated': {'value': 14000.0, 'units': 'UNITLESS'},
+        'microscope_name': {'value': 'Test Titan EMI File for test'},
+        'stage_position': {'tilt_alpha': {'value': 0.0, 'units': 'DEG'},
+                           'tilt_beta': {'value': 0.0, 'units': 'DEG'},
+                           'x': {'value': -0.031415, 'units': 'MilliM'},
+                           'y': {'value': 0.042773000000000005,
+                                 'units': 'MilliM'},
+                           'z': {'value': -0.010576, 'units': 'MilliM'}},
+        'accelerating_voltage': {'value': 300000.0, 'units': 'V'},
+        'dwell_time': {'value': 1.2e-05, 'units': 'SEC'},
+        'frame_time': {'value': 14.9988, 'units': 'SEC'},
+        'emission_current': {'value': 138.0, 'units': 'MicroA'}}
+
+    assert res['electron_microscopy']['TEM'] == {
+        'camera_length': {'value': 0.0, 'units': 'MilliM'},
+        'defocus': {'value': -0.063, 'units': 'MicroM'},
+        'spot_size': {'value': 7, 'units': 'UNITLESS'}}
+
+    assert res['electron_microscopy']['EELS'] == {
+        'spectrometer_mode': {'value': 'Spectroscopy'},
+        'dispersion_per_channel': {'value': 0.1, 'units': 'EV'},
+        'aperture_size': {'value': 3.0, 'units': 'MilliM'},
+        'prism_shift_energy': {'value': -0.0, 'units': 'EV'},
+        'drift_tube_energy': {'value': 0.0, 'units': 'EV'},
+        'total_energy_loss': {'value': 0.0, 'units': 'EV'}}
+    assert jsonschema.validate(res, schema) is None
 
 
-# TODO (lw): Our parser does not actually get anything from these files
-# Update 1/15/20 (JG): EM parser now parses image data (still no EM data though)
-def test_dm3(parser, dm3):
-    assert parser.parse([dm3]) == {'image': {'shape': [2]}}
+def test_quanta_sem_tif(parser, schema):
+    res = parser.parse([file_path('20_quanta_sem.tif')])
+    assert res['electron_microscopy']['General'] == {
+        'date': {'value': '2022-03-03'},
+        'original_filename': {'value': '20_quanta_sem.tif'},
+        'time': {'value': '17:27:45'}, 'axis_calibration': {
+            'axis-0': {'name': 'height', 'scale': 1.25e-09, 'offset': 0.0,
+                       'size': 943, 'units': 'M'},
+            'axis-1': {'name': 'width', 'scale': 1.25e-09, 'offset': 0.0,
+                       'size': 1024, 'units': 'M'}},
+        'data_dimensions': [943, 1024]}
+    assert res['electron_microscopy']['General_EM'] == {
+        'beam_energy': {'value': 30.0, 'units': 'KiloEV'},
+        'microscope_name': {'value': 'Quanta FEG'},
+        'stage_position': {'rotation': {'value': -0.0524327, 'units': 'DEG'},
+                           'x': {'value': -1.55644, 'units': 'MilliM'},
+                           'y': {'value': 3.15249, 'units': 'MilliM'},
+                           'z': {'value': 5.99983, 'units': 'MilliM'},
+                           'tilt_alpha': {'value': 0.0184572, 'units': 'DEG'},
+                           'tilt_beta': {'value': 0.0, 'units': 'DEG'}},
+        'acquisition_software_version': {'value': '4.1.15.2218'},
+        'accelerating_voltage': {'value': 30.0, 'units': 'KiloV'},
+        'frame_time': {'value': 29.5667, 'units': 'SEC'}}
+    assert res['electron_microscopy']['SEM'] == {
+        'working_distance': {'value': 6.25552, 'units': 'MilliM'},
+        'spot_size': {'value': 3},
+        'horizontal_field_width': {'value': 1.28e-06, 'units': 'M'},
+        'vertical_field_width': {'value': 1.105e-06, 'units': 'M'},
+        'pixel_width': {'value': 1.25e-09, 'units': 'M'},
+        'pixel_height': {'value': 1.25e-09, 'units': 'M'},
+        'magnification_mode': {'value': 3},
+        'chamber_pressure': {'value': 0.000703102, 'units': 'PA'}}
+    assert jsonschema.validate(res, schema) is None
 
 
-def test_dm4(parser, dm4):
-    assert parser.parse([dm4]) == {'image': {'shape': [2, 2]}}
+def test_implementors(parser):
+    assert 'Jonathon Gaff <jgaff@uchicago.edu>' in parser.implementors()
+    assert 'Joshua Taillon <joshua.taillon@nist.gov>' in parser.implementors()
 
 
-def test_eds(parser, eds):
-    assert parser.parse([eds]) == {'electron_microscopy': {'acquisition_mode': 'STEM',
-                                                           'beam_energy': 200.0,
-                                                           'detector': 'EDS',
-                                                           'emission_current': 0.0,
-                                                           'magnification': 320000.0,
-                                                           'microscope': 'FEI Titan',
-                                                           'operation_mode': 'SCANNING'},
-                                   'image': {'shape': [4096]}}
+def test_version(parser):
+    assert parser.version() == '0.1.0'
diff --git a/tests/test_file.py b/tests/test_file.py
index 2496355..8643a42 100644
--- a/tests/test_file.py
+++ b/tests/test_file.py
@@ -5,13 +5,23 @@
 def test_file():
     my_file = os.path.join(os.path.dirname(__file__), 'data', 'image', 'dog2.jpeg')
     parser = GenericFileParser(store_path=True, compute_hash=True)
-    assert parser.parse([my_file]) == {
-        'mime_type': 'image/jpeg', 'length': 269360, 'filename': 'dog2.jpeg',
+    output = parser.parse([my_file])
+    expected = {
+        'mime_type': 'image/jpeg',
+        'length': 269360,
+        'filename': 'dog2.jpeg',
         'path': my_file,
-        'data_type': 'JPEG image data, JFIF standard 1.01, resolution (DPI), density '
-                     '300x300, segment length 16, Exif Standard: [TIFF image data, '
-                     'little-endian, direntries=2, GPS-Data], baseline, precision 8, '
-                     '1910x1000, frames 3',
-        'sha512': '1f47ed450ad23e92caf1a0e5307e2af9b13edcd7735ac9685c9f21c9faec62'
-                  'cb95892e890a73480b06189ed5b842d8b265c5e47cc6cf279d281270211cff8f90'}
+        'data_type': 'JPEG image data, JFIF standard 1.01, resolution (DPI), '
+                     'density 300x300, segment length 16, Exif Standard: [TIFF '
+                     'image data, little-endian, direntries=2, GPS-Data], '
+                     'baseline, precision 8, 1910x1000, frames 3',
+        'sha512': '1f47ed450ad23e92caf1a0e5307e2af9b13edcd7735ac9685c9f21c'
+                  '9faec62cb95892e890a73480b06189ed5b842d8b265c5e47cc6cf27'
+                  '9d281270211cff8f90'}
+    for i in ['JPEG image data', 'density 300x300', 'TIFF image data',
+              '1910x1000']:
+        assert i in output['data_type']
+    del output['data_type']
+    del expected['data_type']
+    assert output == expected
     assert isinstance(parser.schema, dict)
diff --git a/tests/test_utils.py b/tests/test_utils.py
index f9a97ac..970aa85 100644
--- a/tests/test_utils.py
+++ b/tests/test_utils.py
@@ -1,6 +1,7 @@
 from materials_io.utils.interface import (get_available_parsers, execute_parser,
                                           get_available_adapters, run_all_parsers_on_directory,
                                           ParseResult)
+from materials_io.utils import set_nested_dict_value
 from materials_io.image import ImageParser
 import pytest
 import json
@@ -72,3 +73,48 @@ def test_run_all_parsers():
 
 def test_list_adapters():
     assert 'noop' in get_available_adapters()
+
+
+def test_set_nested_dict():
+    dest_dict1 = {
+        'key1': 'val1',
+        'key2': {
+            'key2.1': 'val2.1',
+            'key2.2': 'val2.2'}
+    }
+    dest_dict2 = {
+        'key1': 'val1',
+        'key2': {
+            'key2.1': 'val2.1',
+            'key2.2': 'val2.2'}
+    }
+
+    set_nested_dict_value(dest_dict2, ('key3', 'key3.1'), None)
+    assert dest_dict1 == dest_dict2
+
+    set_nested_dict_value(dest_dict2, ('key3', 'key3.1'), 4)
+    assert dest_dict2 == {
+        'key1': 'val1',
+        'key2': {
+            'key2.1': 'val2.1',
+            'key2.2': 'val2.2'},
+        'key3': {'key3.1': 4}
+    }
+
+    set_nested_dict_value(dest_dict2, ('key3', 'key3.1'), 5, override=False)
+    assert dest_dict2 == {
+            'key1': 'val1',
+            'key2': {
+                'key2.1': 'val2.1',
+                'key2.2': 'val2.2'},
+            'key3': {'key3.1': 4}
+    }
+
+    set_nested_dict_value(dest_dict2, ('key3', 'key3.1'), 5, override=True)
+    assert dest_dict2 == {
+        'key1': 'val1',
+        'key2': {
+            'key2.1': 'val2.1',
+            'key2.2': 'val2.2'},
+        'key3': {'key3.1': 5}
+    }