Skip to main content

Multi-Label Anisotropic Euclidean Distance Transform 3D

Project description

PyPI version DOI

Multi-Label Anisotropic 3D Euclidean Distance Transform (MLAEDT-3D)

Compute the Euclidean Distance Transform of a 1d, 2d, or 3d labeled image containing multiple labels in a single pass with support for anisotropic dimensions. Curious what the output looks like? Download the movie!

import edt
import numpy as np

# e.g. 6nm x 6nm x 30nm for the S1 dataset by Kasthuri et al., 2014
labels = np.ones(shape=(512, 512, 512), dtype=np.uint32, order='F')
dt = edt.edt(
  labels, anisotropy=(6, 6, 30), 
  black_border=True,
  parallel=4 # number of threads, <= 0 sets to num cpu
)
# see more features below

Use Cases

  1. Compute the distance transform of a volume containing multiple labels simultaneously and then query it using a fast masking operator.
  2. Convert the multi-label volume into a binary image (i.e. a single label) using a masking operator and compute the ordinary distance transform.

Python Installation

pip Binary Installation

pip install edt

Binaries are available for some platforms. If your platform is not supported, pip will attempt to install from source, in which case follow the instructions below.

pip Source Installation

Requires a C++ compiler.

sudo apt-get install g++ python3-dev
pip install numpy
pip install edt --no-binary :all:

Python Usage

Consult help(edt) after importing. The edt module contains: edt and edtsq which compute the euclidean and squared euclidean distance respectively. Both functions select dimension based on the shape of the numpy array fed to them. 1D, 2D, and 3D volumes are supported. 1D processing is extremely fast. Numpy boolean arrays are handled specially for faster processing.

If for some reason you'd like to use a specific 'D' function, edt1d, edt1dsq, edt2d, edt2dsq, edt3d, and edt3dsq are available.

The two optional parameters are anisotropy and black_border. Anisotropy is used to correct for distortions in voxel space, e.g. if X and Y were acquired with a microscope, but the Z axis was cut more corsely.

black_border allows you to specify that the edges of the image should be considered in computing pixel distances (it's also slightly faster).

import edt
import numpy as np

# e.g. 6nm x 6nm x 30nm for the S1 dataset by Kasthuri et al., 2014
labels = np.ones(shape=(512, 512, 512), dtype=np.uint32, order='F')
dt = edt.edt(
  labels, anisotropy=(6, 6, 30), 
  black_border=True,
  parallel=1 # number of threads, <= 0 sets to num cpu
)
# signed distance function (0 is considered background)
sdf = edt.sdf(...) # same arguments as edt

# You can extract individual components of the distance transform
# in sequence rapidly using this technique. A random image may be slow
# as this uses "runs" of voxels to address only parts of the image at a time.
# in_place=True may be faster and more memory efficient, but is read-only.
for label, image in edt.each(labels, dt, in_place=True):
  process(image) # stand in for whatever you'd like to do

# There is also a voxel_graph argument that can be used for dealing
# with shapes that loop around to touch themselves. This works by
# using a voxel connectivity graph represented as a image of bitfields
# that describe the permissible directions of travel at each voxel.
# Voxels with an impermissible direction are treated as eroded
# by 0.5 in that direction instead of being 1 unit from black.
# WARNING: This is an experimental feature and uses 8x+ memory.
graph = np.zeros(labels.shape, dtype=np.uint8)
graph |= 0b00111111 # all 6 directions permissible (-z +z -y +y -x +x)
graph[122,334,312] &= 0b11111110 # +x isn't allowed at this location
graph[123,334,312] &= 0b11111101 # -x isn't allowed at this location
dt = edt.edt(
  labels, anisotropy=(6, 6, 30), 
  black_border=True,
  parallel=1, # number of threads, <= 0 sets to num cpu
  voxel_graph=graph,
) 

Note on Memory Usage: Make sure the input array to edt is contiguous memory or it will make a copy. You can determine if this is the case with print(data.flags).

C++ Instructions for MLAEDT-3D

Compute the Euclidean Distance Transform of a 1d, 2d, or 3d labeled image containing multiple labels in a single pass with support for anisotropic dimensions. C++ function expect the input array to be in Fortran (column-major) order. If your array is in C (row-major) order, it will also work but you must reverse the order of the dimension and anisotropy arguments (sx,sy,sz -> sz,sy,sx and wx,wy,wz -> wz,wy,wx).

Compiling

You only need src/edt.hpp and src/threadpool.h for most purposes.

C++ Examples

#include "edt.hpp"

int* labels1d = new int[512]();
int* labels2d = new int[512*512]();
int* labels3d = new int[512*512*512]();

// ... populate labels ...

// 1d, 2d, and 3d anisotropic transforms, wx = anisotropy on x-axis 
float* dt = edt::edt<int>(labels1d, /*sx=*/512, /*wx=*/1.0, /*black_border=*/true); 
float* dt = edt::edt<int>(labels2d, 
  /*sx=*/512, /*sy=*/512, /*wx=*/1.0, /*wy=*/1.0,
  /*black_border=*/true, /*parallel=*/1); 
float* dt = edt::edt<int>(labels3d, 
  /*sx=*/512, /*sy=*/512, /*sz=*/512,
  /*wx=*/4.0, /*wy=*/4.0, /*wz=*/40.0,
  /*black_border=*/true, /*parallel=*/2); 

// get the squared distance instead (avoids computing sqrt)
float* dt = edt::edtsq<int>(labels1d, /*sx=*/512, /*wx=*/1.0, /*black_border=*/true); 
float* dt = edt::edtsq<int>(labels2d, 
  /*sx=*/512, /*sy=*/512, /*wx=*/1.0, /*wy=*/1.0,
  /*black_border=*/true, /*parallel=*/4); 
float* dt = edt::edtsq<int>(labels3d, 
  /*sx=*/512, /*sy=*/512, /*sz=*/512,
  /*wx=*/4.0, /*wy=*/4.0, /*wz=*/40.0,
  /*black_border=*/true, /*parallel=*/8); 

// signed distance field edt::sdf and edt::sdfsq
float* dt = edt::sdf<int>(labels3d, 
  /*sx=*/512, /*sy=*/512, /*sz=*/512,
  /*wx=*/4.0, /*wy=*/4.0, /*wz=*/40.0,
  /*black_border=*/true, /*parallel=*/8);

High Performance Binary Images

Binary images are treated specially in 2D and 3D to avoid executing the extra multi-label logic (1D is very fast even with it). This results in a substantial savings of perhaps 20-50% depending on the compiler. For a 512x512x512 cube filled with ones, on a 4.0 GHz linux machine with g++, I witnessed reductions from 9 sec. to 7 sec. (1.29x). On 2.8 GHz Mac OS with clang-902.0.39.2 I saw a reduction from 12.4 sec to 7.9 sec (1.56x).

The code will easily handle all integer types, and the image only needs to be binary in the sense that there is a single non-zero label, it doesn't have to be ones.

Boolean typed images are handled specially by a specialization of the edt function, so nothing different from above needs to be done. If you have an integer typed image, you'll need to use binary_edt or binary_edtsq instead to take advantage of this.

You'll get slightly higher performance setting black_border=true.

#include "edt.hpp"

using namespace edt;

bool* labels2d = new bool[512*512]();
bool* labels3d = new bool[512*512*512]();

float* dt = edt<bool>(labels2d, 
  /*sx=*/512, /*sy=*/512, /*wx=*/1.0, /*wy=*/1.0,
  /*black_border=*/true); 
float* dt = edt<bool>(labels3d, 
  /*sx=*/512, /*sy=*/512, /*sz=*/512,
  /*wx=*/4.0, /*wy=*/4.0, /*wz=*/40.0,
  /*black_border=*/true); 


int* labels2d = new int[512*512]();
int* labels3d = new int[512*512*512]();

float* dt = binary_edt<int>(labels2d, /*sx=*/512, /*sy=*/512, /*wx=*/1.0, /*wy=*/1.0); 
float* dt = binary_edt<int>(labels3d, 
  /*sx=*/512, /*sy=*/512, /*sz=*/512,
  /*wx=*/4.0, /*wy=*/4.0, /*wz=*/40.0,
  /*black_border=*/true); 

Motivation

A Labeled 3D Image. Credit: Kisuk Lee
Fig. 1. A labeled 3D connectomics volume. Credit: Kisuk Lee

The connectomics field commonly generates very large densely labeled volumes of neural tissue. Some algorithms, such as the TEASAR skeletonization algorithm [1] and its descendant [2] require the computation of a 3D Euclidean Distance Transform (EDT). We found that the scipy implementation of the distance transform (based on the Voronoi method of Maurer et al. [3]) was too slow for our needs despite being relatively speedy.

The scipy EDT took about 20 seconds to compute the transform of a 512x512x512 voxel binary image. Unfortunately, there are typically more than 300 distinct labels within a volume, requiring the serial application of the EDT. While cropping to the ROI does help, many ROIs are diagonally oriented and span the volume, requiring a full EDT. I found that in our numpy/scipy based implementation of TEASAR, EDT was taking approximately a quarter of the time on its own. The amount of time the algorithm spent per a block was estimated to be multiple hours per a core.

It's possible to compute the EDT much more quickly by computing the distance transform for all labels in one pass by making it boundary aware. Since the distance transform does not result in overlapping boundaries, it is trivial to then extract individual ROIs by to querying the block with the shapes of individual labels.

Fig. 2. Extracting the distance transform of a single label from dense segmentation. (a) a 2d slice of dense segmentation (b) extraction of a single label into a binary image (c) simultaneous distance transform of all labels in (a) (d) distance transform of (b) which can be achieved by direct distance transform of (b) or by the multiplication of (b) with (c).
Fig. 2. Extracting the distance transform of a single label from dense segmentation. (a) a 2d slice of dense segmentation (b) extraction of a single label into a binary image (c) simultaneous distance transform of all labels in (a) (d) distance transform of (b) which can be achieved by direct distance transform of (b) or by the multiplication of (b) with (c).

The implementation presented here uses concepts from the 1994 paper by T. Saito and J. Toriwaki [4] and uses a linear sweeping method inspired by the 1966 method of Rosenfeld and Pfaltz [4] and of Mejister et al [7] with that of Mejister et al's and Felzenszwald and Huttenlocher's 2012 [6] two pass linear time parabolic minmal envelope method. I later learned that this method was discovered as early as 1992 by Rein van den Boomgaard in his thesis. [10] I incorporate a few minor modifications to the algorithms to remove the necessity of a black border. My own contribution here is the modification of both the linear sweep and linear parabolic methods to account for multiple label boundaries.

This implementation was able to compute the distance transform of a binary image in 7-8 seconds. When adding in the multiple boundary modification, this rose to 9 seconds. Incorporating the cost of querying the distance transformed block with masking operators, the time for all operators rose to about 90 seconds, well short of the over an hour required to compute 300 passes.

Basic EDT Algorithm Description

A naive implementation of the distance transform is very expensive as it would require a search that is O(N2) in the number of voxels. In 1994, Saito and Toriwaki (ST) showed how to decompose this search into passes along x, y, and z linear in the number of voxels. After the X-axis EDT is computed, the Y-axis EDT can be computed on top of it by finding the minimum x2 + y2 for each voxel within each column. You can extend this argument to N dimensions. The pertient issue is then finding the minima efficiently without having to scan each column a quadratic number of times.

Felzenszwalb and Huttenlocher (FH) [6] and others have described taking advantage of the geometric interpretation of the distance function, as a parabola. Using ST's decomposition of the EDT into three passes, each broken up by row, the problem becomes one dimensional. FH described computing each pass on each row by finding the minimal envelope of the space created by the parabolas that project from the vertices located at (i, f(i)) for a one dimensional image f.

This method works by first scanning the row and finding a set of parabolas that constitue the lower envelope. Simultaneously during this linear scan, it computes the abscissa of the nearest parabola to the left and thereby defines the effective domain of each vertex. This linear reading scan is followed by a linear writing scan that records the height of the envelope at each voxel.

This method is linear and relatively fast, but there's another trick we can do to speed things up. The first transformation is special as we have to change the binary image f into a floating point representation. FH recommended using an indicator function that records zeros for out of set and infinities for within set voxels on the first pass. However, this is somewhat cumbersome to reason about and requires an additional remapping of the image.

The original Rosenfeld and Pfaltz (RP) paper [5] demonstrated a remarkably simple two pass sweeping algorithm for computing the manhattan distance (L1 norm, visualized here). On the first pass, the L1 and the L2 norm agree as only a single dimension is involved. Using very simple operators and sweeping forward we can compute the increasing distance of a voxel from its leftmost bound. We can then reconcile the errors in a backward pass that computes the minimum of the results of the first pass and the distance from the right boundary. Mejister, Roerdink, and Hesselink (MRH) [7] described a similar technique for use with binary images within the framework set by ST.

In all, we manage to achieve an EDT in six scans of an image in three directions. The use of the RP and MRH inspired method for the first transformation saves about 30% of the time as it appears to use a single digit percentage of the CPU time. In the second and third passes, due to the read and write sequence of FH's method, we can read and write to the same block of memory, increasing cache coherence and reducing memory usage.

Multi-Label 1D RP and MRH Inspired Algorithm

The forward sweep looks like:

f(a_i) = 0               ; a_i = 0  
       = a_i + 1         ; a_i = 1, i > 0
       = inf             ; a_i = 1, i = 0

I modify this to include consideration of multi-labels as follows:

let a_i be the EDT value at i
let l_i be the label at i (seperate 1:1 corresponding image)
let w be the anisotropy value

f(a_i, l_i) = 0          ; l_i = 0
f(a_i, l_i) = a_i + w    ; l_i = l_i-1, l_i != 0

f(a_i, l_i) = w          ; l_i != l_i-1, l_i != 0 
  f(a_i-1, l_i-1) = w    ; l_i-1 != 0
  f(a_i-1, l_i-1) = 0    ; l_i-1 = 0

The backwards pass is unchanged:

from n-2 to 1:
    f(a_i) = min(a_i, a_i+1 + 1)
from 0 to n-1:
    f(a_i) = f(a_i)^2

Anisotropy Support in FH Algorithm

A small update to the parabolic intercept equation is necessary to properly support anisotropic dimensions. The original equation appears on page 419 of their paper (reproduced here):

s = ((f(r) + r^2) - (f(q) + q^2)) / 2(r - q)

Where given parabola on an XY plane:
s:    x-coord of the intercept between two parabolas
r:    x-coord of the first parabola's vertex
f(r): y-coord of the first parabola's vertex
q:    x-coord of the second parabola's vertex
f(q): y-coord of the second parabola's vertex

However, this equation doesn't work with non-unitary anisotropy. The derivation of the proper equation follows.

1. Let w = the anisotropic weight
2. (ws - wq)^2 + f(q) = (ws - wr)^2 + f(r)
3. w^2(s - q)^2 + f(q) = w^2(s - r)^2 # w^2 can be pulled out after expansion
4. w^2( (s-q)^2 - (s-r)^2 ) = f(r) - f(q)
5. w^2( s^2 - 2sq + q^2 - s^2 + 2sr - r^2 ) = f(r) - f(q)
6. w^2( 2sr - 2sq + q^2 - r^2 ) = f(r) - f(q)
7. 2sw^2(r-q) + w^2(q^2 - r^2) = f(r) - f(q)
8. 2sw^2(r-q) = f(r) - f(q) - w^2(q^2 - r^2)

=> s = (w^2(r^2 - q^2) + f(r) - f(q)) / 2w^2(r-q)

As the computation of s is one of the most expensive lines in the algorithm, two multiplications can be saved by factoring w2 (r2 - q2) into w2 (r - q) (r + q). Here we save one multiplication in computing r*r + q*q and replace it with a subtraction. In the denominator of s, we avoid having to multiply by w2 or compute r-q again. This trick prevents anisotropy support from adding substantial costs.

Let w2 = w * w
Let factor1 = (r - q) * w2
Let factor2 = r + q

Let s = (f(r) - f(q) + factor1 * factor2) / (2 * factor1);

Multi-Label Felzenszwalb and Huttenlocher Variation

The parabola method attempts to find the lower envelope of the parabolas described by vertices (i, f(i)).

We handle multiple labels by running the FH method on contiguous blocks of labels independently. For example, in the following column:

Y LABELS:  0 1 1 1 1 1 2 0 3 3 3 3 2 2 1 2 3 0
X AXIS:    0 9 9 1 2 9 7 0 2 3 9 1 1 1 4 4 2 0
FH Domain: 1 1 1 1 1 1 2 2 3 3 3 3 4 4 5 6 7 7

Each domain is processed within the envelope described below. This ensures that edges are labeled 1. Alternatively, one can preprocess the image and set differing label pixels to zero and run the FH method without changes, however, this causes edge pixels to be labeled 0 instead of 1. I felt it was nicer to let the background value be zero rather than something like -1 or infinity since 0 is more commonly used in our processes as background.

Additional Parabolic Envelope

Applies to parameter black_border=True.

The methods of RP, ST, and FH all appear to depend on the existence of a black border ringing the ROI. Without it, the Y pass can't propogate a min signal near the border. However, this approach seems wasteful as it requires about 6s2 additional memory (for a cube) and potentially a copy into bordered memory. Instead, I opted to impose an envelope around all passes. For an image I with n voxels, I implicitly place a vertex at (-1, 0) and at (n, 0). This envelope propogates the edge effect through the volume.

To modify the first X-axis pass, I simply mark I[0] = 1 and I[n-1] = 1. The parabolic method is a little trickier to modify because it uses the vertex location to reference I[i]. -1 and n are both off the ends of the array and therefore would crash the program. Instead, I add the following lines right after the second pass write:

// let w be anisotropy
// let i be the index
// let v be the abcissa of the parabola's vertex
// let n be the number of voxels in this row
// let d be the transformed (destination) image

d[i] = square(w * (i - v)) + I[v] // line 18, pp. 420 of FH [6]
envelope = min(square(w * (i+1)), square(w * (n - i))) // envelope computation
d[i] = min(envelope, d[i]) // application of envelope

These additional lines add about 3% to the running time compared to a program without them. I have not yet made a comparison to a bordered variant.

Performance vs. SciPy

Fig. 3: Extraction of Individual EDT from 334 Labeled Segments in SNEMI3D MIP 1 (512x512x100 voxels)
Fig. 3. Extraction of Individual EDT from 334 Labeled Segments in SNEMI3D MIP 1 (512x512x100 voxels)

The above experiment was gathered using memory_profiler while running the below code once for each function.

import edt
from tqdm import tqdm
from scipy import ndimage

import numpy as np

labels = load_snemi3d_image()
uniques = np.unique(labels)[1:]

def edt_test():
  res = edt.edt(labels, order='F')
  for segid in tqdm(uniques):
    extracted = res * (labels == segid)

def ndimage_test():
  for segid in tqdm(uniques):
    extracted = (labels == segid)
    extracted = ndimage.distance_transform_edt(extracted)

References

  1. M. Sato, I. Bitter, M.A. Bender, A.E. Kaufman, and M. Nakajima. "TEASAR: Tree-structure Extraction Algorithm for Accurate and Robust Skeletons". Proc. 8th Pacific Conf. on Computer Graphics and Applications. Oct. 2000. doi: 10.1109/PCCGA.2000.883951 (link)
  2. I. Bitter, A.E. Kaufman, and M. Sato. "Penalized-distance volumetric skeleton algorithm". IEEE Transactions on Visualization and Computer Graphics Vol. 7, Iss. 3, Jul-Sep 2001. doi: 10.1109/2945.942688 (link)
  3. C. Maurer, R. Qi, and V. Raghavan. "A Linear Time Algorithm for Computing Exact Euclidean Distance Transforms of Binary Images in Arbitrary Dimensions". IEEE Transactions on Pattern Analysis and Machine Intelligence. Vol. 25, No. 2. February 2003. doi: 10.1109/TPAMI.2003.1177156 (link)
  4. T. Saito and J. Toriwaki. "New Algorithms for Euclidean Distance Transformation of an n-Dimensional Digitized Picture with Applications". Pattern Recognition, Vol. 27, Iss. 11, Nov. 1994, Pg. 1551-1565. doi: 10.1016/0031-3203(94)90133-3 (link)
  5. A. Rosenfeld and J. Pfaltz. "Sequential Operations in Digital Picture Processing". Journal of the ACM. Vol. 13, Issue 4, Oct. 1966, Pg. 471-494. doi: 10.1145/321356.321357 (link)
  6. P. Felzenszwald and D. Huttenlocher. "Distance Transforms of Sampled Functions". Theory of Computing, Vol. 8, 2012, Pg. 415-428. doi: 10.4086/toc.2012.v008a019 (link)
  7. A. Meijster, J.B.T.M. Roerdink, and W.H. Hesselink. (2002) "A General Algorithm for Computing Distance Transforms in Linear Time". In: Goutsias J., Vincent L., Bloomberg D.S. (eds) Mathematical Morphology and its Applications to Image and Signal Processing. Computational Imaging and Vision, vol 18. Springer, Boston, MA. doi: 10.1007/0-306-47025-X_36 (link)
  8. H. Zhao. "A Fast Sweeping Method for Eikonal Equations". Mathematics of Computation. Vol. 74, Num. 250, Pg. 603-627. May 2004. doi: 10.1090/S0025-5718-04-01678-3 (link)
  9. H. Zhao. "Parallel Implementations of the Fast Sweeping Method". Journal of Computational Mathematics. Vol. 25, No.4, Pg. 421-429. July 2007. Institute of Computational Mathematics and Scientific/Engineering Computing. (link)
  10. "The distance transform, erosion and separability". https://www.crisluengo.net/archives/7 Accessed October 22, 2019. (This site claims Rein van den Boomgaard discovered a parabolic method at the latest in 1992. Boomgaard even shows up in the comments! If I find his thesis, I'll update this reference.)

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

edt-3.1.1.tar.gz (3.2 MB view details)

Uploaded Source

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

edt-3.1.1-cp314-cp314t-win_amd64.whl (244.3 kB view details)

Uploaded CPython 3.14tWindows x86-64

edt-3.1.1-cp314-cp314t-win32.whl (200.8 kB view details)

Uploaded CPython 3.14tWindows x86

edt-3.1.1-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (2.9 MB view details)

Uploaded CPython 3.14tmanylinux: glibc 2.27+ x86-64manylinux: glibc 2.28+ x86-64

edt-3.1.1-cp314-cp314t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl (2.8 MB view details)

Uploaded CPython 3.14tmanylinux: glibc 2.26+ ARM64manylinux: glibc 2.28+ ARM64

edt-3.1.1-cp314-cp314t-macosx_11_0_arm64.whl (270.8 kB view details)

Uploaded CPython 3.14tmacOS 11.0+ ARM64

edt-3.1.1-cp314-cp314t-macosx_10_13_x86_64.whl (283.5 kB view details)

Uploaded CPython 3.14tmacOS 10.13+ x86-64

edt-3.1.1-cp314-cp314-win_amd64.whl (211.7 kB view details)

Uploaded CPython 3.14Windows x86-64

edt-3.1.1-cp314-cp314-win32.whl (175.3 kB view details)

Uploaded CPython 3.14Windows x86

edt-3.1.1-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (2.9 MB view details)

Uploaded CPython 3.14manylinux: glibc 2.27+ x86-64manylinux: glibc 2.28+ x86-64

edt-3.1.1-cp314-cp314-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl (2.9 MB view details)

Uploaded CPython 3.14manylinux: glibc 2.26+ ARM64manylinux: glibc 2.28+ ARM64

edt-3.1.1-cp314-cp314-macosx_11_0_arm64.whl (255.0 kB view details)

Uploaded CPython 3.14macOS 11.0+ ARM64

edt-3.1.1-cp314-cp314-macosx_10_13_x86_64.whl (271.4 kB view details)

Uploaded CPython 3.14macOS 10.13+ x86-64

edt-3.1.1-cp313-cp313-win_amd64.whl (206.6 kB view details)

Uploaded CPython 3.13Windows x86-64

edt-3.1.1-cp313-cp313-win32.whl (170.6 kB view details)

Uploaded CPython 3.13Windows x86

edt-3.1.1-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (3.0 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.27+ x86-64manylinux: glibc 2.28+ x86-64

edt-3.1.1-cp313-cp313-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl (2.9 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.26+ ARM64manylinux: glibc 2.28+ ARM64

edt-3.1.1-cp313-cp313-macosx_11_0_arm64.whl (253.0 kB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

edt-3.1.1-cp313-cp313-macosx_10_13_x86_64.whl (270.8 kB view details)

Uploaded CPython 3.13macOS 10.13+ x86-64

edt-3.1.1-cp312-cp312-win_amd64.whl (206.2 kB view details)

Uploaded CPython 3.12Windows x86-64

edt-3.1.1-cp312-cp312-win32.whl (170.8 kB view details)

Uploaded CPython 3.12Windows x86

edt-3.1.1-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (3.0 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.27+ x86-64manylinux: glibc 2.28+ x86-64

edt-3.1.1-cp312-cp312-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl (2.9 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.26+ ARM64manylinux: glibc 2.28+ ARM64

edt-3.1.1-cp312-cp312-macosx_11_0_arm64.whl (253.6 kB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

edt-3.1.1-cp312-cp312-macosx_10_13_x86_64.whl (271.9 kB view details)

Uploaded CPython 3.12macOS 10.13+ x86-64

edt-3.1.1-cp311-cp311-win_amd64.whl (210.2 kB view details)

Uploaded CPython 3.11Windows x86-64

edt-3.1.1-cp311-cp311-win32.whl (174.5 kB view details)

Uploaded CPython 3.11Windows x86

edt-3.1.1-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (2.9 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.27+ x86-64manylinux: glibc 2.28+ x86-64

edt-3.1.1-cp311-cp311-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl (2.9 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.26+ ARM64manylinux: glibc 2.28+ ARM64

edt-3.1.1-cp311-cp311-macosx_11_0_arm64.whl (253.1 kB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

edt-3.1.1-cp311-cp311-macosx_10_9_x86_64.whl (273.0 kB view details)

Uploaded CPython 3.11macOS 10.9+ x86-64

edt-3.1.1-cp310-cp310-win_amd64.whl (210.1 kB view details)

Uploaded CPython 3.10Windows x86-64

edt-3.1.1-cp310-cp310-win32.whl (175.1 kB view details)

Uploaded CPython 3.10Windows x86

edt-3.1.1-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (2.9 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.27+ x86-64manylinux: glibc 2.28+ x86-64

edt-3.1.1-cp310-cp310-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl (2.8 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.26+ ARM64manylinux: glibc 2.28+ ARM64

edt-3.1.1-cp310-cp310-macosx_11_0_arm64.whl (254.1 kB view details)

Uploaded CPython 3.10macOS 11.0+ ARM64

edt-3.1.1-cp310-cp310-macosx_10_9_x86_64.whl (274.4 kB view details)

Uploaded CPython 3.10macOS 10.9+ x86-64

edt-3.1.1-cp39-cp39-win_amd64.whl (210.5 kB view details)

Uploaded CPython 3.9Windows x86-64

edt-3.1.1-cp39-cp39-win32.whl (175.5 kB view details)

Uploaded CPython 3.9Windows x86

edt-3.1.1-cp39-cp39-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (2.9 MB view details)

Uploaded CPython 3.9manylinux: glibc 2.27+ x86-64manylinux: glibc 2.28+ x86-64

edt-3.1.1-cp39-cp39-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl (2.8 MB view details)

Uploaded CPython 3.9manylinux: glibc 2.26+ ARM64manylinux: glibc 2.28+ ARM64

edt-3.1.1-cp39-cp39-macosx_11_0_arm64.whl (255.0 kB view details)

Uploaded CPython 3.9macOS 11.0+ ARM64

edt-3.1.1-cp39-cp39-macosx_10_9_x86_64.whl (275.4 kB view details)

Uploaded CPython 3.9macOS 10.9+ x86-64

edt-3.1.1-cp38-cp38-win_amd64.whl (211.6 kB view details)

Uploaded CPython 3.8Windows x86-64

edt-3.1.1-cp38-cp38-win32.whl (177.8 kB view details)

Uploaded CPython 3.8Windows x86

edt-3.1.1-cp38-cp38-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (2.9 MB view details)

Uploaded CPython 3.8manylinux: glibc 2.27+ x86-64manylinux: glibc 2.28+ x86-64

edt-3.1.1-cp38-cp38-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl (2.9 MB view details)

Uploaded CPython 3.8manylinux: glibc 2.26+ ARM64manylinux: glibc 2.28+ ARM64

edt-3.1.1-cp38-cp38-macosx_11_0_arm64.whl (258.3 kB view details)

Uploaded CPython 3.8macOS 11.0+ ARM64

edt-3.1.1-cp38-cp38-macosx_10_9_x86_64.whl (278.0 kB view details)

Uploaded CPython 3.8macOS 10.9+ x86-64

File details

Details for the file edt-3.1.1.tar.gz.

File metadata

  • Download URL: edt-3.1.1.tar.gz
  • Upload date:
  • Size: 3.2 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.3

File hashes

Hashes for edt-3.1.1.tar.gz
Algorithm Hash digest
SHA256 4b0ab5d898077eda76d1ebdec6e3a4085fd33d4c85195d71abf464ff225915c5
MD5 6b9d5e36b6ca0b6a7f97692b9d598994
BLAKE2b-256 a5ca432c11df2a261fcae71dea11eeabfc5affd8ada22aaafa378212c1e9c9e2

See more details on using hashes here.

File details

Details for the file edt-3.1.1-cp314-cp314t-win_amd64.whl.

File metadata

  • Download URL: edt-3.1.1-cp314-cp314t-win_amd64.whl
  • Upload date:
  • Size: 244.3 kB
  • Tags: CPython 3.14t, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.3

File hashes

Hashes for edt-3.1.1-cp314-cp314t-win_amd64.whl
Algorithm Hash digest
SHA256 969fe10154928f518c0aace937577503919424a3562c93963560a121222bee0c
MD5 2f54bf1ae45f617add8858e197c68071
BLAKE2b-256 b328fd338c80f15feb478f9368371ec56be321952dad93480033c21bc0f55118

See more details on using hashes here.

File details

Details for the file edt-3.1.1-cp314-cp314t-win32.whl.

File metadata

  • Download URL: edt-3.1.1-cp314-cp314t-win32.whl
  • Upload date:
  • Size: 200.8 kB
  • Tags: CPython 3.14t, Windows x86
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.3

File hashes

Hashes for edt-3.1.1-cp314-cp314t-win32.whl
Algorithm Hash digest
SHA256 0490c9a5628689050c3eb3384c01975d50498711c9cbcf831acc2715ea6a482a
MD5 9f1405cf3169f1681fe682e515741b37
BLAKE2b-256 f3eb1a9e8ad1d420c1a98f9b44304228a18e60841d49351a47325bdbf3f50720

See more details on using hashes here.

File details

Details for the file edt-3.1.1-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for edt-3.1.1-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 e1ad8ba3913b12fdbe89a09f16f98dd3ebbf237d2da3e82117a6c01e01ce593b
MD5 5708c8f02d30798178f4a2748a2727a8
BLAKE2b-256 67e3d6e7b71b04b49184199bfe61d996e201e05b75d0fb25b6da26da78bb4b86

See more details on using hashes here.

File details

Details for the file edt-3.1.1-cp314-cp314t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for edt-3.1.1-cp314-cp314t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 f4838426e712b9562cfb89a13f9569092a77701cf8d1611d64ac5bbf233362bd
MD5 c83f9994108c5a51751ff0b5fb87c0ed
BLAKE2b-256 03d27fef02bfcba8ce566e7cbcede617f34aec407785d96bb512701d79497d30

See more details on using hashes here.

File details

Details for the file edt-3.1.1-cp314-cp314t-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for edt-3.1.1-cp314-cp314t-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 9fdbbd0270b5adcc9acd8d6ef1227f1d766346a9c71e240075f58809feac8305
MD5 fb44b599e0d165b02b724f7908254a32
BLAKE2b-256 ae178272c17cf425a586685b4ee32cf23e1a2e6ecaaeccbba6eed2175b45b1bc

See more details on using hashes here.

File details

Details for the file edt-3.1.1-cp314-cp314t-macosx_10_13_x86_64.whl.

File metadata

File hashes

Hashes for edt-3.1.1-cp314-cp314t-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 477e708e261017d54331ea3627f4e2652200185f5f936747264d3998ee279526
MD5 97e8634b92821a27f768a800f1e41891
BLAKE2b-256 a7767d37aa429e4c3fb8a2969f6367f7a56a8029e68e5b706446dd52b886cc83

See more details on using hashes here.

File details

Details for the file edt-3.1.1-cp314-cp314-win_amd64.whl.

File metadata

  • Download URL: edt-3.1.1-cp314-cp314-win_amd64.whl
  • Upload date:
  • Size: 211.7 kB
  • Tags: CPython 3.14, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.3

File hashes

Hashes for edt-3.1.1-cp314-cp314-win_amd64.whl
Algorithm Hash digest
SHA256 ad93e3226dcb69839a537c38e65b2bcc5cde0ea0fd476e07abaebfb722edb691
MD5 f8bc20a79f02a045c4b2c99e920d4b4b
BLAKE2b-256 0b450743929814002d5cf0b1f47b6d17a7d4c2faaea1c6534f6a48d8eb0caa4d

See more details on using hashes here.

File details

Details for the file edt-3.1.1-cp314-cp314-win32.whl.

File metadata

  • Download URL: edt-3.1.1-cp314-cp314-win32.whl
  • Upload date:
  • Size: 175.3 kB
  • Tags: CPython 3.14, Windows x86
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.3

File hashes

Hashes for edt-3.1.1-cp314-cp314-win32.whl
Algorithm Hash digest
SHA256 5115a4bda2b56b755a1c0c1853bbdb364b95c53ab8fdc12c98912d60d200a36e
MD5 8efd7c07efa08a132aca29d53d3561cf
BLAKE2b-256 f782099bc5a443345a38d1317adebd62e60a24f073d0f6d5911c1cb4eac711bd

See more details on using hashes here.

File details

Details for the file edt-3.1.1-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for edt-3.1.1-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 d0bce89efebb61f9c7f8f1bde8e9bc63f3ff49c0e3b076c7837d5a16c14af4ef
MD5 a5dab55729d98e6f47ba2bc5ae1eeb35
BLAKE2b-256 6f45102a9d2aacd89e5f2c628f5d377c13cd2d628a70eef747a7165f88150ac7

See more details on using hashes here.

File details

Details for the file edt-3.1.1-cp314-cp314-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for edt-3.1.1-cp314-cp314-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 9422ccf32dc05751699fb068b43922c34d854b11430dd21011f5ed7121597ac5
MD5 ead376ae223ff5c1f7ee75472754af32
BLAKE2b-256 715d62852cfae6e2e112efbf9e6d7101955c5ddd81de59e1d7e9c31cfb74a82e

See more details on using hashes here.

File details

Details for the file edt-3.1.1-cp314-cp314-macosx_11_0_arm64.whl.

File metadata

  • Download URL: edt-3.1.1-cp314-cp314-macosx_11_0_arm64.whl
  • Upload date:
  • Size: 255.0 kB
  • Tags: CPython 3.14, macOS 11.0+ ARM64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.3

File hashes

Hashes for edt-3.1.1-cp314-cp314-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 4198c5c568653a633f030fc4f4595e626a0fe71673f267fe923c2140671569f5
MD5 04fcddbb02e9b8250628624fac127786
BLAKE2b-256 fe3b88ce3ad0c6d9de5411ba1fc110cc83d9bd791ce8403c8d8e31ce6f7eb410

See more details on using hashes here.

File details

Details for the file edt-3.1.1-cp314-cp314-macosx_10_13_x86_64.whl.

File metadata

File hashes

Hashes for edt-3.1.1-cp314-cp314-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 69e5f5e7323ba2a2113b38884bbe0b31aa5e6bcdebc9c3cb79c98b7907790835
MD5 80d79628bc799a8f2a386e19afba99fc
BLAKE2b-256 073fe0413a2058c5a90a6ef7a09ea308b7d1088b68919c4b9e9698ace10a66fa

See more details on using hashes here.

File details

Details for the file edt-3.1.1-cp313-cp313-win_amd64.whl.

File metadata

  • Download URL: edt-3.1.1-cp313-cp313-win_amd64.whl
  • Upload date:
  • Size: 206.6 kB
  • Tags: CPython 3.13, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.3

File hashes

Hashes for edt-3.1.1-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 d6804fe5fcbd7d03813eb48fc33cdfd25cb166d0241768969ee24f209fca07de
MD5 b4aed52e7deb58b590fb94b78fb74798
BLAKE2b-256 fbcfce2e98dc0b060c705c321090d9d9fcd9ab39b041309ccc0ca0ae9009cc94

See more details on using hashes here.

File details

Details for the file edt-3.1.1-cp313-cp313-win32.whl.

File metadata

  • Download URL: edt-3.1.1-cp313-cp313-win32.whl
  • Upload date:
  • Size: 170.6 kB
  • Tags: CPython 3.13, Windows x86
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.3

File hashes

Hashes for edt-3.1.1-cp313-cp313-win32.whl
Algorithm Hash digest
SHA256 06c0ff97bc705803880a153c34b12b8245da51951198f4689942020a9bfcf6ff
MD5 70b66fe60cf410278882eca72fa2dbed
BLAKE2b-256 228733fa8d7787489dd21957de56fbc6ad655dd156382b78e9ce2aeef125a044

See more details on using hashes here.

File details

Details for the file edt-3.1.1-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for edt-3.1.1-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 b464bd8bb6e14edfc07f8c1382700446bc20a2b521ec494f3de1fd5d20471cf3
MD5 6925ad6db8f215590a20859d03ac8e9c
BLAKE2b-256 c01635778deac2353ed385e81bda4dfd2eefcc1c0c1e1c083f4cb39ef0025d18

See more details on using hashes here.

File details

Details for the file edt-3.1.1-cp313-cp313-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for edt-3.1.1-cp313-cp313-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 467ce55f466ce21c5fb90462cabf82c73796920a8a9d5c0f655b01c6f427c7c3
MD5 818dcea780db251d0b31362415e1f26e
BLAKE2b-256 0aeb37e1a719432e747aa6b8d2046eae910f76640bd9be4d71f667cc3dda2356

See more details on using hashes here.

File details

Details for the file edt-3.1.1-cp313-cp313-macosx_11_0_arm64.whl.

File metadata

  • Download URL: edt-3.1.1-cp313-cp313-macosx_11_0_arm64.whl
  • Upload date:
  • Size: 253.0 kB
  • Tags: CPython 3.13, macOS 11.0+ ARM64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.3

File hashes

Hashes for edt-3.1.1-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 6b6922e81f1b47832a7a71302eb79372f3aea2a0bbca6bb6b6f6275df18bdaab
MD5 7c86fe0ef554f0a0b3272443f231e98e
BLAKE2b-256 fa1592f5dceb6b953f1c31b4b627466977fc5a3d18514eeed27f7be1d287b105

See more details on using hashes here.

File details

Details for the file edt-3.1.1-cp313-cp313-macosx_10_13_x86_64.whl.

File metadata

File hashes

Hashes for edt-3.1.1-cp313-cp313-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 05959ab8c0f9ce1a1b2736d27c83780f1a2ab77232428f5a606d5e447b7f9a3a
MD5 133048f970c3df4f526458996e4388df
BLAKE2b-256 2a3a46f02072334c42146ffd241251ac5ca795e84f6d6ffa87b95df37d047e64

See more details on using hashes here.

File details

Details for the file edt-3.1.1-cp312-cp312-win_amd64.whl.

File metadata

  • Download URL: edt-3.1.1-cp312-cp312-win_amd64.whl
  • Upload date:
  • Size: 206.2 kB
  • Tags: CPython 3.12, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.3

File hashes

Hashes for edt-3.1.1-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 da204a3b1e2b98a414a0d45a5e3806b91e0e16daf43581d98e7adef74f960769
MD5 3c42ec9de5dbbd79f388bad1e9cd67eb
BLAKE2b-256 2488623a76e7451d9b147bf8f025921c42063e85eac3729e88807af3336bab46

See more details on using hashes here.

File details

Details for the file edt-3.1.1-cp312-cp312-win32.whl.

File metadata

  • Download URL: edt-3.1.1-cp312-cp312-win32.whl
  • Upload date:
  • Size: 170.8 kB
  • Tags: CPython 3.12, Windows x86
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.3

File hashes

Hashes for edt-3.1.1-cp312-cp312-win32.whl
Algorithm Hash digest
SHA256 d713a4b0a8e097cb5bf2c7fdebd9dc76f6668de7c4e62e0ca846b68ddbd6f64d
MD5 3fb24bde51f08c543b6d2762ee3b13d7
BLAKE2b-256 214d1509a586dddd92288410d5de605c38f83fb1f1e7572193ca941bd2a88c86

See more details on using hashes here.

File details

Details for the file edt-3.1.1-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for edt-3.1.1-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 2f5e28666d723e577327d4fc2ce5c4fd572e20299a2b14e5bb829a675a95340e
MD5 36c0d6c3e2464129446d358efc2fe902
BLAKE2b-256 f179dad79e48da52bed034fcf3589d4f2d97a77d010b7776ffd0d29f6d63516b

See more details on using hashes here.

File details

Details for the file edt-3.1.1-cp312-cp312-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for edt-3.1.1-cp312-cp312-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 ec432bdf8441bdf7d98bf3295280662dbba65c9dcecc54d8713b5238ffeb16e7
MD5 0c95b10e8dcbdc999ea0adb87a27d4b0
BLAKE2b-256 05b15d88ed781e1b72d24c9ff0a08fae46b7d704d1d057f1888fb922345c79f2

See more details on using hashes here.

File details

Details for the file edt-3.1.1-cp312-cp312-macosx_11_0_arm64.whl.

File metadata

  • Download URL: edt-3.1.1-cp312-cp312-macosx_11_0_arm64.whl
  • Upload date:
  • Size: 253.6 kB
  • Tags: CPython 3.12, macOS 11.0+ ARM64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.3

File hashes

Hashes for edt-3.1.1-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 9850d32ed0e39fae0677a3ec33202a2f4a1be8bf19d0a9371b555adbca649f56
MD5 3fb1372623522186132623a1382a400f
BLAKE2b-256 2ffe3d0bb0dcb15382f290fc747d0709fe3d72adf5dad3f9f86d7743845d3a42

See more details on using hashes here.

File details

Details for the file edt-3.1.1-cp312-cp312-macosx_10_13_x86_64.whl.

File metadata

File hashes

Hashes for edt-3.1.1-cp312-cp312-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 7234587b35ce80dcf15ad7c81b45d79d75822c8b6b723e100573a5101bde90d9
MD5 4ed6fd361b6b6584d080608c17a467ae
BLAKE2b-256 8be2f54b48f0385898b1e5ee406cf99394e7764c9d77fff1741f0fb979f784d0

See more details on using hashes here.

File details

Details for the file edt-3.1.1-cp311-cp311-win_amd64.whl.

File metadata

  • Download URL: edt-3.1.1-cp311-cp311-win_amd64.whl
  • Upload date:
  • Size: 210.2 kB
  • Tags: CPython 3.11, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.3

File hashes

Hashes for edt-3.1.1-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 9c2694cdc1651def1cd78331f90bf45efaa4cbd4d9e753acc60a3033b422c529
MD5 fb61cfa4c4d53fa1beb3821fd5d3fff0
BLAKE2b-256 3e442664e9419358cced35395446c2cddfba9a5b0d538543d779b72a53b40b71

See more details on using hashes here.

File details

Details for the file edt-3.1.1-cp311-cp311-win32.whl.

File metadata

  • Download URL: edt-3.1.1-cp311-cp311-win32.whl
  • Upload date:
  • Size: 174.5 kB
  • Tags: CPython 3.11, Windows x86
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.3

File hashes

Hashes for edt-3.1.1-cp311-cp311-win32.whl
Algorithm Hash digest
SHA256 25134ae70b393682110f081ecfdc773fbd3661b551b6225db96950a69bbedb35
MD5 d32d68f34967d1dd97ab024fa376e7b8
BLAKE2b-256 0ec644fa2239478d01c4d02b29dcd36a220f2415dcad8bb609776658e580add5

See more details on using hashes here.

File details

Details for the file edt-3.1.1-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for edt-3.1.1-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 3630630459b8ad32b12bb9840f204cf405b2c64fa827140e55762528364d7a28
MD5 d89533d1405dde62ed23fc70c671bb2f
BLAKE2b-256 559d4e857ba351d6d8cffb7a375b0e557c0feb8a2af8da9cfe331b54fa98c7e4

See more details on using hashes here.

File details

Details for the file edt-3.1.1-cp311-cp311-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for edt-3.1.1-cp311-cp311-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 a9f238097b3f6a93bdbf1860d0efa42bc88a868e5416ff0a18316e001c9c355a
MD5 83e5ba5b88c5e2335c154a38e52211a7
BLAKE2b-256 c698c56d761056c6712edd57f384486508431889f66da850fb32e17f78fee1df

See more details on using hashes here.

File details

Details for the file edt-3.1.1-cp311-cp311-macosx_11_0_arm64.whl.

File metadata

  • Download URL: edt-3.1.1-cp311-cp311-macosx_11_0_arm64.whl
  • Upload date:
  • Size: 253.1 kB
  • Tags: CPython 3.11, macOS 11.0+ ARM64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.3

File hashes

Hashes for edt-3.1.1-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 9fe86dafa1e4703c670ab5e36cd9334b9a15eb0c97ff42700a544f438bafbfc8
MD5 bca9d0532bf8b0ca3d0b910df65e28e7
BLAKE2b-256 800b53ba9d3727b1b87a77449e36415a20885718e21886bdff528c1e2a5beb27

See more details on using hashes here.

File details

Details for the file edt-3.1.1-cp311-cp311-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for edt-3.1.1-cp311-cp311-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 0ce45f983747ba5a096e35dbfc13beafcbe2c6d2746d87c06915ddeac16af7e6
MD5 3bb961a420aeb3a43bb62947184acefd
BLAKE2b-256 8350fa05c178abd6fcfe4369c7b651650fe3395558320766d0334f2606642de9

See more details on using hashes here.

File details

Details for the file edt-3.1.1-cp310-cp310-win_amd64.whl.

File metadata

  • Download URL: edt-3.1.1-cp310-cp310-win_amd64.whl
  • Upload date:
  • Size: 210.1 kB
  • Tags: CPython 3.10, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.3

File hashes

Hashes for edt-3.1.1-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 3d6692f010a3ab6fc2b802f22173d8d6ed5e4154cf524a9821f273870f6af45b
MD5 bb32a392b937fd45d4cf5e7ac68a8046
BLAKE2b-256 fe4d999a42a45a75cbd63811aca365b538c1ed72456d1243fc00edaa2e2e6e11

See more details on using hashes here.

File details

Details for the file edt-3.1.1-cp310-cp310-win32.whl.

File metadata

  • Download URL: edt-3.1.1-cp310-cp310-win32.whl
  • Upload date:
  • Size: 175.1 kB
  • Tags: CPython 3.10, Windows x86
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.3

File hashes

Hashes for edt-3.1.1-cp310-cp310-win32.whl
Algorithm Hash digest
SHA256 15dee70100c553ddf71979c5d7c297a0386a02970b3b18d8ee5a5b778bd51996
MD5 40537bf6a9b5719d52d0d37f185a0dce
BLAKE2b-256 adbe81c0cad69f306fe1ef34a1b86e066e13021c0e813e858eada4fa2810deaa

See more details on using hashes here.

File details

Details for the file edt-3.1.1-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for edt-3.1.1-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 c8108ce1e4ee328c5bf32948d8da22e78df955147dc3eac4c80ba3de9512f449
MD5 4f10bc60f1530722563b7299d9f7c7d5
BLAKE2b-256 2ed648f59656a8cf4d9672700d42585d83a9dc065f34dd1786ac07f320cc8da0

See more details on using hashes here.

File details

Details for the file edt-3.1.1-cp310-cp310-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for edt-3.1.1-cp310-cp310-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 09b6fd94a7146305a9c7d964551d6148249c8692e08d6065a56aa79ccd625585
MD5 65a1479d9d8ebb703e751c2eb22adef0
BLAKE2b-256 3989358cf81ac3c94cf2c8e243788e6282cb1ec7980c64d12859cbdc016865d8

See more details on using hashes here.

File details

Details for the file edt-3.1.1-cp310-cp310-macosx_11_0_arm64.whl.

File metadata

  • Download URL: edt-3.1.1-cp310-cp310-macosx_11_0_arm64.whl
  • Upload date:
  • Size: 254.1 kB
  • Tags: CPython 3.10, macOS 11.0+ ARM64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.3

File hashes

Hashes for edt-3.1.1-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 11ee8df9bab9e1649190d2a286a9b35a2dea90bf6f60fb9a299c8a8371e258c7
MD5 75a2d0140c551386fc29661573af5f5b
BLAKE2b-256 e03ae99a0b59cf953a2c2b3e5e9451389e4b8f40579614229aef44f13f2f8b6a

See more details on using hashes here.

File details

Details for the file edt-3.1.1-cp310-cp310-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for edt-3.1.1-cp310-cp310-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 e249ab445adc21ec9c458a3a0215e9bcf3e487154947a4b9172c5506bf2ed39e
MD5 cbf35c6c93881e413c2601a31384abf4
BLAKE2b-256 54c694335dd01d33fff33b02bc7c79c4b2ec4664ccbbe9b55ccb73868555d6c0

See more details on using hashes here.

File details

Details for the file edt-3.1.1-cp39-cp39-win_amd64.whl.

File metadata

  • Download URL: edt-3.1.1-cp39-cp39-win_amd64.whl
  • Upload date:
  • Size: 210.5 kB
  • Tags: CPython 3.9, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.3

File hashes

Hashes for edt-3.1.1-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 30444575acf447b1fcaf7c3b86f1258dd8922e110bcc8298ab4dc125644a4ef1
MD5 9037a15a6a1a4f19fc6026e351b29f08
BLAKE2b-256 93c7e9d16249e53f4c16b74f5c793f61d67824da37f0c450351f01830465541c

See more details on using hashes here.

File details

Details for the file edt-3.1.1-cp39-cp39-win32.whl.

File metadata

  • Download URL: edt-3.1.1-cp39-cp39-win32.whl
  • Upload date:
  • Size: 175.5 kB
  • Tags: CPython 3.9, Windows x86
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.3

File hashes

Hashes for edt-3.1.1-cp39-cp39-win32.whl
Algorithm Hash digest
SHA256 ef93dd31f356b903422d3b39eec8a80202549f22c5ca0f960f0c0e15a59d4a45
MD5 8d00bc76ff099212aa16b2d7a26fd204
BLAKE2b-256 29e4682b4d0d2a7bbb8a2981f9d9ea867d6fd6f6087c335b135fd95818113f8b

See more details on using hashes here.

File details

Details for the file edt-3.1.1-cp39-cp39-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for edt-3.1.1-cp39-cp39-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 f854c3e30df9b24ccf1c6fc814908bfcd4dda6083458de68bb890810cef245eb
MD5 21838da117ff735ff65da62f6b587092
BLAKE2b-256 0231f6ac23224721b095da38254a532d8d20712d9352faaab2e5bc290dcba77e

See more details on using hashes here.

File details

Details for the file edt-3.1.1-cp39-cp39-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for edt-3.1.1-cp39-cp39-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 d6da20e76b1d7e967f09d19ed4189e4767f8f354832f0d347e1c86134a1c9104
MD5 a8468abd192ae6f4da5494bc098a50c5
BLAKE2b-256 1c6522791ecba38b49b189f8ea39927210cc1c515cbe5e01a2df2c74ef6fd5f2

See more details on using hashes here.

File details

Details for the file edt-3.1.1-cp39-cp39-macosx_11_0_arm64.whl.

File metadata

  • Download URL: edt-3.1.1-cp39-cp39-macosx_11_0_arm64.whl
  • Upload date:
  • Size: 255.0 kB
  • Tags: CPython 3.9, macOS 11.0+ ARM64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.3

File hashes

Hashes for edt-3.1.1-cp39-cp39-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 23be8a4da291015037e0cc4f022aba0e95bdce00b1348e4b236b0d4bd8fa7de9
MD5 e6f81732016ed15cb1d3321bef096304
BLAKE2b-256 2cdadf6739a61057735b0dd1839cf1c7873b3bba24697b6c540d75667a129b61

See more details on using hashes here.

File details

Details for the file edt-3.1.1-cp39-cp39-macosx_10_9_x86_64.whl.

File metadata

  • Download URL: edt-3.1.1-cp39-cp39-macosx_10_9_x86_64.whl
  • Upload date:
  • Size: 275.4 kB
  • Tags: CPython 3.9, macOS 10.9+ x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.3

File hashes

Hashes for edt-3.1.1-cp39-cp39-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 a6265173abc89e989f3ab78ce24d4ad9208b0dd0e1f56c296b941b65cc314864
MD5 e04c08ad6d749f448ced08f0e3ff2477
BLAKE2b-256 69345dc5a395db979323990d70cd30ffe78d4a2b434c08380424b2478ac627c8

See more details on using hashes here.

File details

Details for the file edt-3.1.1-cp38-cp38-win_amd64.whl.

File metadata

  • Download URL: edt-3.1.1-cp38-cp38-win_amd64.whl
  • Upload date:
  • Size: 211.6 kB
  • Tags: CPython 3.8, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.3

File hashes

Hashes for edt-3.1.1-cp38-cp38-win_amd64.whl
Algorithm Hash digest
SHA256 b8dc352ad73c6a568200101ee797a1bc19f6f0f80bfd61f46926b4063446e9c9
MD5 8a19bd3797d3152bfb9aaabfe9b71559
BLAKE2b-256 dc265cf44126eb18ab4ad5320e1b7b5fe3f18aa893c6468958e92548a2ba44d1

See more details on using hashes here.

File details

Details for the file edt-3.1.1-cp38-cp38-win32.whl.

File metadata

  • Download URL: edt-3.1.1-cp38-cp38-win32.whl
  • Upload date:
  • Size: 177.8 kB
  • Tags: CPython 3.8, Windows x86
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.3

File hashes

Hashes for edt-3.1.1-cp38-cp38-win32.whl
Algorithm Hash digest
SHA256 666b22f03accc2742adc74b75b9ed7e8426d5f46f53c95b11fe78e622c155e0c
MD5 e98cfab01bc4d48d52b60fd9c8be078b
BLAKE2b-256 66ad3b741ca1239195560a0f32a1c61dde370fa0bfbdec7c9d1a820535c991e4

See more details on using hashes here.

File details

Details for the file edt-3.1.1-cp38-cp38-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for edt-3.1.1-cp38-cp38-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 5cb2197bb8efffa6d0a87e45db0504d344507f021d0b7e4da519f58a82ef327c
MD5 2282dca6bcd737950a3f1bb661a82ab8
BLAKE2b-256 96cdfd2c511a6cee71ce2e1d6ea5ac9fdd666d6d6dcec2390075c480732b0247

See more details on using hashes here.

File details

Details for the file edt-3.1.1-cp38-cp38-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for edt-3.1.1-cp38-cp38-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 ff575d8c689b1b5fae6a0dd6c48d6be52fc77998a9fcbeac964d133c01b711d8
MD5 b16c66ccb5688bb1c5d8d4c1b1b505cf
BLAKE2b-256 6f0d72e0ce57d1d448bb2aad5f491bcc7c9f60bd77385934099541c94bb30342

See more details on using hashes here.

File details

Details for the file edt-3.1.1-cp38-cp38-macosx_11_0_arm64.whl.

File metadata

  • Download URL: edt-3.1.1-cp38-cp38-macosx_11_0_arm64.whl
  • Upload date:
  • Size: 258.3 kB
  • Tags: CPython 3.8, macOS 11.0+ ARM64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.3

File hashes

Hashes for edt-3.1.1-cp38-cp38-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 cee6dcc98ad6f2781fc18be525eb1c26db5fd5ed56def1799bf249cffd576c85
MD5 edf86a88f732c49c006960a67c01f27e
BLAKE2b-256 337de65c395f2fdeff631a77490f8e6818fdbb130a481cbf45c1f8009ee92fc5

See more details on using hashes here.

File details

Details for the file edt-3.1.1-cp38-cp38-macosx_10_9_x86_64.whl.

File metadata

  • Download URL: edt-3.1.1-cp38-cp38-macosx_10_9_x86_64.whl
  • Upload date:
  • Size: 278.0 kB
  • Tags: CPython 3.8, macOS 10.9+ x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.3

File hashes

Hashes for edt-3.1.1-cp38-cp38-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 c58b99bd214a01e33a6d0444c26ee0abdac8acc5621eab8454fbfaf0d542e679
MD5 d09094cbd8c1b5f3e2367d3160cbbd85
BLAKE2b-256 321618c977be36be77b17aab801f42b4303b8097e872317303e6c37a2deddd91

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page