summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.gitignore12
-rw-r--r--main.py514
-rw-r--r--pixi.lock2349
-rw-r--r--pixi.toml19
-rw-r--r--topology.py153
-rw-r--r--usage.md24
6 files changed, 3071 insertions, 0 deletions
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..6aef260
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,12 @@
+# Ignore everything by default
+/*
+/**/*.*
+!.gitignore
+!main.py
+!topology.py
+!pixi.toml
+!pixi.lock
+!usage.md
+# pixi environments
+.pixi/*
+!.pixi/config.toml
diff --git a/main.py b/main.py
new file mode 100644
index 0000000..ab08045
--- /dev/null
+++ b/main.py
@@ -0,0 +1,514 @@
+import sys
+import numpy as np
+import cv2
+import mapbox_earcut as earcut
+import pyray as pr
+import tifffile
+import topology
+import time
+import tkinter as tk
+from tkinter import filedialog
+
+def point_dist(p1, p2):
+ return (p1.x - p2.x)**2 + (p1.y - p2.y)**2
+
+def load_image_data(img_path):
+ print(f"Loading image {img_path}...")
+ if img_path.lower().endswith('.tif') or img_path.lower().endswith('.tiff'):
+ img_data = tifffile.imread(img_path)
+ if len(img_data.shape) == 3 and img_data.shape[0] in [1, 3, 4]:
+ img_data = np.transpose(img_data, (1, 2, 0))
+ else:
+ img_data = cv2.imread(img_path)
+ if img_data is not None:
+ img_data = cv2.cvtColor(img_data, cv2.COLOR_BGR2RGB)
+ return img_data
+
+def load_segmentation_data(seg_path, height, width):
+ print(f"Loading segmentation {seg_path}...")
+ if seg_path.lower().endswith('.npy'):
+ seg_data = np.load(seg_path, allow_pickle=True)
+ if seg_data.shape == (): # It's a dict
+ seg_data = seg_data.item()['masks']
+ else: # bin file
+ seg_data = np.fromfile(seg_path, dtype=np.uint16)
+ seg_data = seg_data.reshape((height, width))
+ return seg_data
+
+def create_texture_from_numpy(img_data):
+ if len(img_data.shape) == 2: # grayscale
+ img_rgb = cv2.cvtColor(img_data, cv2.COLOR_GRAY2RGB)
+ else:
+ # TIF might have alpha or weird channels, assume first 3 are RGB for now
+ img_rgb = img_data[:, :, :3]
+ if img_rgb.dtype != np.uint8: # normalize to 8-bit if it's 16-bit tiff
+ img_rgb = cv2.normalize(img_rgb, None, 0, 255, cv2.NORM_MINMAX, dtype=cv2.CV_8U)
+
+ cv2.imwrite("tmp_bg.png", cv2.cvtColor(img_rgb, cv2.COLOR_RGB2BGR))
+ return pr.load_texture("tmp_bg.png")
+
+def open_file_dialog():
+ root = tk.Tk()
+ root.withdraw()
+ # Attempt to make it topmost for some window managers
+ root.attributes('-topmost', True)
+ file_path = filedialog.askopenfilename(
+ title="Select Image or Segmentation File",
+ filetypes=[
+ ("Image/Seg files", "*.png *.jpg *.jpeg *.tif *.tiff *.npy *.bin"),
+ ("Image files", "*.png *.jpg *.jpeg *.tif *.tiff"),
+ ("Segmentation files", "*.npy *.bin"),
+ ("All files", "*.*")
+ ]
+ )
+ root.destroy()
+ return file_path
+
+def save_file_dialog():
+ root = tk.Tk()
+ root.withdraw()
+ root.attributes('-topmost', True)
+ file_path = filedialog.asksaveasfilename(
+ title="Save Segmentation As",
+ defaultextension=".npy",
+ filetypes=[
+ ("NPY files", "*.npy"),
+ ("Binary files", "*.bin"),
+ ("All files", "*.*")
+ ]
+ )
+ root.destroy()
+ return file_path
+
+def main():
+ img_path = sys.argv[1] if len(sys.argv) > 1 else None
+ seg_path = sys.argv[2] if len(sys.argv) > 2 else None
+
+ img_data = None
+ vertices = []
+ regions = []
+ width, height = 800, 600 # Default window size if no image
+
+ if img_path:
+ img_data = load_image_data(img_path)
+ if img_data is not None:
+ height, width = img_data.shape[:2]
+ if seg_path:
+ seg_data = load_segmentation_data(seg_path, height, width)
+ print("Extracting shared boundary vertices...")
+ vertices, regions = topology.extract_boundaries(seg_data)
+ else:
+ print(f"Failed to load image: {img_path}")
+ img_path = None
+
+ # Raylib Initialization
+ print("Initialize Window...")
+ scale_factor = 1.0
+ if img_data is not None:
+ max_dim = 1000
+ if max(width, height) > max_dim:
+ scale_factor = max_dim / max(width, height)
+ window_w = int(width * scale_factor)
+ window_h = int(height * scale_factor)
+ else:
+ window_w, window_h = 800, 600
+
+ pr.set_config_flags(pr.FLAG_WINDOW_RESIZABLE)
+ pr.init_window(window_w, window_h, "Segmentation Editor")
+ pr.set_target_fps(60)
+
+ bg_texture = None
+ if img_data is not None:
+ bg_texture = create_texture_from_numpy(img_data)
+
+ # State
+ dragging_vertex_idx = -1
+ hovered_vertex_idx = -1
+ last_click_time = 0.0
+ selected_region_idx = -1
+ selection_time = 0.0
+
+ empty_selection_origin = None
+ empty_selection_time = 0.0
+
+ # Selection radius (scaled by zoom later implicitly by world coordinates)
+ PICK_RADIUS = 10.0
+
+ # Camera for panning/zooming
+ camera = pr.Camera2D()
+ camera.target = pr.Vector2(0, 0)
+ camera.offset = pr.Vector2(0, 0)
+ camera.rotation = 0.0
+ camera.zoom = scale_factor
+
+ while not pr.window_should_close():
+
+ if pr.window_should_close(): break
+
+ def handle_file_load(path):
+ nonlocal img_data, height, width, bg_texture, img_path, vertices, regions, seg_path
+ low_path = path.lower()
+ if low_path.endswith(('.png', '.jpg', '.jpeg', '.tif', '.tiff')):
+ # New Image
+ new_img = load_image_data(path)
+ if new_img is not None:
+ img_data = new_img
+ height, width = img_data.shape[:2]
+ if bg_texture: pr.unload_texture(bg_texture)
+ bg_texture = create_texture_from_numpy(img_data)
+ img_path = path
+ # Reset
+ vertices = []
+ regions = []
+ print(f"Loaded image: {path}")
+ elif low_path.endswith(('.npy', '.bin')):
+ if img_data is not None:
+ seg_data = load_segmentation_data(path, height, width)
+ print("Extracting shared boundary vertices...")
+ new_vertices, new_regions = topology.extract_boundaries(seg_data)
+ vertices, regions = new_vertices, new_regions
+ seg_path = path
+ print(f"Loaded segmentation: {path}")
+ else:
+ print("Please load an image first!")
+
+ def save_segmentation(out_path):
+ nonlocal vertices, regions, width, height, seg_path
+ print(f"Saving modified mask to {out_path}...")
+ new_mask = topology.reconstruct_mask(vertices, regions, width, height)
+
+ # Read original dict to keep image parity
+ if out_path.endswith('.npy'):
+ if seg_path and seg_path.endswith('.npy'):
+ orig_data = np.load(seg_path, allow_pickle=True)
+ if orig_data.shape == (): # It's a dict
+ new_dict = orig_data.item().copy()
+ new_dict['masks'] = new_mask
+ np.save(out_path, new_dict)
+ print(f"Saved merged dict to {out_path}")
+ return
+
+ np.save(out_path, new_mask)
+ print(f"Saved array to {out_path}")
+ elif out_path.endswith('.bin'):
+ with open(out_path, "wb") as f:
+ f.write(new_mask.tobytes())
+ print(f"Saved binary to {out_path}")
+ else:
+ # Default to NPY
+ np.save(out_path if out_path.endswith('.npy') else out_path + ".npy", new_mask)
+ print(f"Saved to {out_path}")
+
+ # File Picker Shortcut (Ctrl+O)
+ if pr.is_key_down(pr.KEY_LEFT_CONTROL) and pr.is_key_pressed(pr.KEY_O):
+ picked_path = open_file_dialog()
+ if picked_path:
+ handle_file_load(picked_path)
+
+ # File Drag and Drop Handling
+ if pr.is_file_dropped():
+ dropped_files = pr.load_dropped_files()
+ for i in range(dropped_files.count):
+ # FilePathList.paths is a char**, we need to convert to python string
+ dropped_path = pr.ffi.string(dropped_files.paths[i]).decode('utf-8')
+ handle_file_load(dropped_path)
+ pr.unload_dropped_files(dropped_files)
+
+ mouse_pos = pr.get_mouse_position()
+ world_mouse_pos = pr.get_screen_to_world_2d(mouse_pos, camera)
+
+ # Find hovered vertex globally
+ hovered_vertex_idx = -1
+ min_dist = float('inf')
+ # scale picking radius inversely with zoom so the apparent hit circle size remains constant
+ dynamic_pick_radius_sq = (PICK_RADIUS / camera.zoom)**2
+
+ # Optimization: in a huge graph, you'd use a generic spatial index here (e.g. quadtree)
+ # For ~10k vertices array scan is usually fine in Python for 60fps
+ for i, (vx, vy) in enumerate(vertices):
+ v_pos = pr.Vector2(vx, vy)
+ d = point_dist(world_mouse_pos, v_pos)
+ if d < dynamic_pick_radius_sq and d < min_dist:
+ min_dist = d
+ hovered_vertex_idx = i
+
+ # Handle Mouse Input
+ if pr.is_mouse_button_pressed(pr.MOUSE_BUTTON_LEFT):
+ if hovered_vertex_idx != -1:
+ dragging_vertex_idx = hovered_vertex_idx
+ else:
+ # Check for double click region selection
+ current_time = time.time()
+ if current_time - last_click_time < 0.5:
+ # Double click detected in empty space, test regions
+ pt = (world_mouse_pos.x, world_mouse_pos.y)
+ clicked_region = -1
+ for r_idx, region in enumerate(regions):
+ poly_pts = [vertices[i] for i in region['vertex_indices']]
+ if len(poly_pts) >= 3:
+ # pointPolygonTest needs float32 numpy array
+ poly_arr = np.array(poly_pts, dtype=np.float32)
+ dist = cv2.pointPolygonTest(poly_arr, pt, False)
+ if dist >= 0:
+ clicked_region = r_idx
+ break
+ if clicked_region != -1:
+ selected_region_idx = clicked_region
+ selection_time = current_time
+ empty_selection_origin = None
+ print(f"Region {selected_region_idx} selected for deletion")
+ else:
+ selected_region_idx = -1
+ empty_selection_origin = pr.Vector2(world_mouse_pos.x, world_mouse_pos.y)
+ empty_selection_time = current_time
+ print(f"Empty space selected for creation at {empty_selection_origin.x}, {empty_selection_origin.y}")
+ last_click_time = current_time
+
+ elif pr.is_mouse_button_released(pr.MOUSE_BUTTON_LEFT):
+ dragging_vertex_idx = -1
+
+ # Handle Dragging
+ if dragging_vertex_idx != -1:
+ vertices[dragging_vertex_idx][0] = world_mouse_pos.x
+ vertices[dragging_vertex_idx][1] = world_mouse_pos.y
+
+ # Camera Panning (Right Click)
+ if pr.is_mouse_button_down(pr.MOUSE_BUTTON_RIGHT):
+ delta = pr.get_mouse_delta()
+ delta.x = delta.x * -1.0 / camera.zoom
+ delta.y = delta.y * -1.0 / camera.zoom
+ camera.target = pr.vector2_add(camera.target, delta)
+
+ # Camera Panning (Arrow Keys)
+ pan_speed = 10.0 / camera.zoom
+ if pr.is_key_down(pr.KEY_RIGHT):
+ camera.target.x += pan_speed
+ if pr.is_key_down(pr.KEY_LEFT):
+ camera.target.x -= pan_speed
+ if pr.is_key_down(pr.KEY_DOWN):
+ camera.target.y += pan_speed
+ if pr.is_key_down(pr.KEY_UP):
+ camera.target.y -= pan_speed
+
+ # Camera Zooming (Scroll)
+ wheel = pr.get_mouse_wheel_move()
+ if wheel != 0:
+ mouse_world_pos = pr.get_screen_to_world_2d(pr.get_mouse_position(), camera)
+ camera.offset = pr.get_mouse_position()
+ camera.target = mouse_world_pos
+ camera.zoom += wheel * 0.1
+ if camera.zoom < 0.1: camera.zoom = 0.1
+
+ # Deletion logic
+ if pr.is_key_pressed(pr.KEY_D):
+ if selected_region_idx != -1 and time.time() - selection_time < 5.0:
+ print(f"Deleting region {selected_region_idx}")
+ regions.pop(selected_region_idx)
+ selected_region_idx = -1
+
+ # Garbage Collect unreferenced vertices to clean up visual clutter
+ used_indices = set()
+ for r in regions:
+ used_indices.update(r['vertex_indices'])
+
+ # We must rebuild the vertices array to exclude orphans and remap region indices
+ new_vertices = []
+ index_map = {} # old_idx -> new_idx
+
+ for old_idx, v in enumerate(vertices):
+ if old_idx in used_indices:
+ new_idx = len(new_vertices)
+ new_vertices.append(v)
+ index_map[old_idx] = new_idx
+
+ # Reassign vertices mapping
+ vertices = new_vertices
+ # Remap region references
+ for r in regions:
+ r['vertex_indices'] = [index_map[idx] for idx in r['vertex_indices']]
+
+ print(f"Garbage collection removed {len(index_map) - len(new_vertices)} orphaned vertices.")
+
+ # Creation Logic
+ if pr.is_key_pressed(pr.KEY_N):
+ current_time = time.time()
+ if empty_selection_origin is not None and current_time - empty_selection_time < 5.0:
+ print("Creating new region...")
+ # Create 50x50 square centered at empty_selection_origin
+ ox, oy = empty_selection_origin.x, empty_selection_origin.y
+ half_size = 25.0
+
+ new_pts = [
+ [ox - half_size, oy - half_size],
+ [ox + half_size, oy - half_size],
+ [ox + half_size, oy + half_size],
+ [ox - half_size, oy + half_size]
+ ]
+
+ new_indices = []
+ for pt in new_pts:
+ new_indices.append(len(vertices))
+ vertices.append(pt)
+
+ # Find new unique ID
+ existing_ids = [r['original_id'] for r in regions]
+ new_uid = max(existing_ids) + 1 if existing_ids else 1
+
+ color = pr.Color(np.random.randint(50, 255), np.random.randint(50, 255), np.random.randint(50, 255), 255)
+
+ regions.append({
+ 'original_id': new_uid,
+ 'vertex_indices': new_indices,
+ 'color': color
+ })
+
+ empty_selection_origin = None # consume the selection
+ print(f"Created region {new_uid}")
+ elif selected_region_idx != -1 and current_time - selection_time < 5.0:
+ print(f"Adding vertex to region {selected_region_idx}...")
+
+ region = regions[selected_region_idx]
+ indices = region['vertex_indices']
+
+ # Find the closest edge to insert the new vertex
+ min_dist = float('inf')
+ best_insert_idx = -1
+ best_insert_pt = None
+
+ m_pt = np.array([world_mouse_pos.x, world_mouse_pos.y])
+
+ for i in range(len(indices)):
+ idx1 = indices[i]
+ idx2 = indices[(i+1) % len(indices)]
+
+ v1 = np.array(vertices[idx1])
+ v2 = np.array(vertices[idx2])
+
+ # Compute distance from point to line segment
+ l2 = np.sum((v1 - v2)**2)
+ if l2 == 0.0:
+ dist = np.linalg.norm(m_pt - v1)
+ proj_pt = v1
+ else:
+ t = max(0, min(1, np.dot(m_pt - v1, v2 - v1) / l2))
+ proj_pt = v1 + t * (v2 - v1)
+ dist = np.linalg.norm(m_pt - proj_pt)
+
+ if dist < min_dist:
+ min_dist = dist
+ best_insert_idx = (i + 1) % len(indices)
+ best_insert_pt = proj_pt.tolist()
+
+ if best_insert_idx != -1 and best_insert_pt is not None:
+ # Insert the new vertex into the global array
+ new_v_idx = len(vertices)
+ vertices.append(best_insert_pt)
+
+ # Insert the reference into the region's topological loop
+ # We insert at `best_insert_idx` to split the edge
+ if best_insert_idx == 0:
+ # if it's the wrap-around edge, append to end
+ indices.append(new_v_idx)
+ else:
+ indices.insert(best_insert_idx, new_v_idx)
+
+ print(f"Added vertex to region {selected_region_idx} at {best_insert_pt}")
+
+ # Saving function
+ if pr.is_key_pressed(pr.KEY_S):
+ if pr.is_key_down(pr.KEY_LEFT_CONTROL):
+ out_path = save_file_dialog()
+ if out_path:
+ save_segmentation(out_path)
+ else:
+ # Default S saves to original seg path if possible, else tmp
+ out = "tmp_modified_seg.npy"
+ if seg_path:
+ # Actually, user said keep original 's' for tmp save
+ pass
+ save_segmentation(out)
+
+ pr.begin_drawing()
+ pr.clear_background(pr.RAYWHITE)
+
+ if bg_texture:
+ pr.begin_mode_2d(camera)
+ # Draw Background
+ pr.draw_texture(bg_texture, 0, 0, pr.WHITE)
+ else:
+ pr.draw_text("No Image Loaded", pr.get_screen_width()//2 - 100, pr.get_screen_height()//2 - 20, 20, pr.GRAY)
+ pr.draw_text("Drag and drop an image file here", pr.get_screen_width()//2 - 150, pr.get_screen_height()//2 + 10, 15, pr.LIGHTGRAY)
+ pr.begin_mode_2d(camera)
+
+ # Draw Region Boundaries
+ current_time_render = time.time()
+ for idx, region in enumerate(regions):
+ indices = region['vertex_indices']
+ if len(indices) < 2:
+ continue
+
+ color = region['color']
+
+ # Draw filled context if selected for deletion
+ if idx == selected_region_idx and (current_time_render - selection_time) < 5.0:
+ poly_pts = [vertices[i] for i in indices]
+ poly_arr = np.array(poly_pts, dtype=np.float32)
+ try:
+ triangles = earcut.triangulate_float32(poly_arr, np.array([len(poly_pts)], dtype=np.uint32))
+ fill_color = pr.Color(color.r, color.g, color.b, 100)
+ for i in range(0, len(triangles), 3):
+ p1 = pr.Vector2(poly_pts[triangles[i]][0], poly_pts[triangles[i]][1])
+ p2 = pr.Vector2(poly_pts[triangles[i+1]][0], poly_pts[triangles[i+1]][1])
+ p3 = pr.Vector2(poly_pts[triangles[i+2]][0], poly_pts[triangles[i+2]][1])
+ # Earcut often generates clockwise, draw backwards
+ pr.draw_triangle(p1, p3, p2, fill_color)
+ except Exception:
+ pass
+
+ # draw line strip manually
+ for i in range(len(indices)):
+ idx1 = indices[i]
+ idx2 = indices[(i+1) % len(indices)] # wrap around
+ v1 = vertices[idx1]
+ v2 = vertices[idx2]
+ p1 = pr.Vector2(v1[0], v1[1])
+ p2 = pr.Vector2(v2[0], v2[1])
+
+ # Make lines thicker depending on zoom to be visible
+ line_thick = max(1.0, 2.0 / camera.zoom)
+ pr.draw_line_ex(p1, p2, line_thick, color)
+
+ # Draw Vertices
+ # Only draw vertices if zoomed in enough, to prevent clutter on full view
+ if camera.zoom > 0.5:
+ vert_radius = max(2.0, 3.0 / camera.zoom)
+ for i, (vx, vy) in enumerate(vertices):
+ color = pr.RED if (i == hovered_vertex_idx or i == dragging_vertex_idx) else pr.BLUE
+ pr.draw_circle_v(pr.Vector2(vx, vy), vert_radius, color)
+
+ # Draw Creation Crosshair
+ if empty_selection_origin is not None and (time.time() - empty_selection_time) < 5.0:
+ ch_size = 10.0 / camera.zoom
+ ch_thick = max(1.0, 2.0 / camera.zoom)
+ p_center = empty_selection_origin
+ pr.draw_line_ex(pr.Vector2(p_center.x - ch_size, p_center.y), pr.Vector2(p_center.x + ch_size, p_center.y), ch_thick, pr.RED)
+ pr.draw_line_ex(pr.Vector2(p_center.x, p_center.y - ch_size), pr.Vector2(p_center.x, p_center.y + ch_size), ch_thick, pr.RED)
+
+ pr.end_mode_2d()
+
+ # UI Overlay
+ pr.draw_text("Segmentation Point Editor", 10, 10, 20, pr.BLACK)
+ pr.draw_text("Left Click + Drag point: Move boundary", 10, 40, 10, pr.DARKGRAY)
+ pr.draw_text("Double Left Click: Select mask/empty space", 10, 55, 10, pr.DARKGRAY)
+ pr.draw_text("'D' Key: Delete selected mask | 'N' Key: Create mask", 10, 70, 10, pr.DARKGRAY)
+ pr.draw_text("'Ctrl+O': Open | 'S': Tmp Save | 'Ctrl+S': Save As", 10, 85, 10, pr.DARKGRAY)
+ pr.draw_text("Right Click / Arrows: Pan camera | Mouse Wheel: Zoom", 10, 100, 10, pr.DARKGRAY)
+
+ pr.end_drawing()
+
+ if bg_texture:
+ pr.unload_texture(bg_texture)
+ pr.close_window()
+
+if __name__ == "__main__":
+ main()
diff --git a/pixi.lock b/pixi.lock
new file mode 100644
index 0000000..703792b
--- /dev/null
+++ b/pixi.lock
@@ -0,0 +1,2349 @@
+version: 6
+environments:
+ default:
+ channels:
+ - url: https://conda.anaconda.org/conda-forge/
+ indexes:
+ - https://pypi.org/simple
+ packages:
+ linux-64:
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-20_gnu.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/alsa-lib-1.2.15.3-hb03c661_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/aom-3.9.1-hac33072_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/blosc-1.21.6-he440d0b_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-1.2.0-hed03a55_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.2.0-hb03c661_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/brunsli-0.1-hd1e3526_2.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_9.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/c-blosc2-2.23.1-hc31b594_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-hbd8a1cb_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/cairo-1.18.4-he90730b_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/charls-2.4.3-hecca717_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.3-py314h97ea11e_4.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhcf101f3_2.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/cyrus-sasl-2.1.28-hac629b4_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/dav1d-1.2.1-hd590300_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/dbus-1.16.2-h24cb091_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/double-conversion-3.4.0-hecca717_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2
+ - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2
+ - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2
+ - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_3.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/fontconfig-2.17.1-h27c8c51_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2
+ - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-hc364b38_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/fonttools-4.62.0-pyh7db6752_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/freetype-2.14.2-ha770c72_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/giflib-5.2.2-hd590300_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/graphite2-1.3.14-hecca717_2.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-13.2.0-h6083320_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/icu-78.3-h33c6efd_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/imagecodecs-2026.3.6-py314he1f8f65_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/jxrlib-1.1-hd590300_3.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.3-hb9d3cd8_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.5.0-py314h97ea11e_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.22.2-ha1258a1_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.18-h0c24ade_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.45.1-default_hbd61a6d_101.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/lerc-4.1.0-hdb68285_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libaec-1.1.5-h088129d_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libavif16-1.4.1-hcfa2d63_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-5_h4a7cf45_openblas.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.2.0-hb03c661_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.2.0-hb03c661_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.2.0-hb03c661_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.11.0-5_h0358290_openblas.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libclang-cpp22.1-22.1.0-default_h99862b1_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libclang13-22.1.0-default_h746c552_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libcups-2.3.3-h7a8fb5f_6.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.25-h17f619e_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libdrm-2.4.125-hb03c661_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libegl-1.7.0-ha4b6fd6_2.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.4-hecca717_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.5.2-h3435931_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.14.2-ha770c72_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype6-2.14.2-h73754d4_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_18.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_18.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libgd-2.3.3-h5fbf134_12.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.2.0-h69a702a_18.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.2.0-h68bc16d_18.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libgl-1.7.0-ha4b6fd6_2.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libglib-2.86.4-h6548e54_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libglvnd-1.7.0-ha4b6fd6_2.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libglx-1.7.0-ha4b6fd6_2.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_18.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libhwy-1.3.0-h4c17acf_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h3b78370_2.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.1.2-hb03c661_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libjxl-0.11.2-ha09017c_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.11.0-5_h47877c9_openblas.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libllvm22-22.1.1-hf7376ad_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.2-hb03c661_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libmpdec-4.0.0-hb03c661_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libntlm-1.8-hb9d3cd8_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.30-pthreads_h94d23a6_4.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libopengl-1.7.0-ha4b6fd6_2.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libpciaccess-0.18-hb9d3cd8_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.55-h421ea60_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libpq-18.3-h9abb657_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.52.0-hf4e2dac_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_18.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.2.0-hdf11a46_18.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.1-h9d88235_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.41.3-h5347b49_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libvulkan-loader-1.4.341.0-h5279c79_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.6.0-hd42ef1d_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-h8a09558_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libxkbcommon-1.13.1-hca5e8e5_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-16-2.15.2-hca6bf5a_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.15.2-he237659_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libxslt-1.1.43-h711ed8c_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_2.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/libzopfli-1.0.3-h9c3ff4c_0.tar.bz2
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.10.0-h5888daf_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/mapbox_earcut-1.0.3-py314h3a4f467_2.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/matplotlib-3.10.8-py314hdafbbf9_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.10.8-py314h1194b4b_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyhd8ed1ab_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-2.4.3-py314h2b28147_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.4-h55fea9a_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/openjph-0.26.3-h8d634f6_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/openldap-2.6.10-hbde042b_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.1-h35e630c_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.0-pyhcf101f3_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.47-haa7fec5_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/pillow-12.1.1-py314h8ec4b1a_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/pixman-0.46.4-h54a6638_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-hb9d3cd8_1002.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.3.2-pyhcf101f3_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/pyside6-6.10.2-py314h3987850_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.14.3-h32b2ec7_101_cp314.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/qt6-main-6.10.2-pl5321h16c4a6b_6.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/rav1e-0.8.1-h1fbca29_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-h853b02a_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/scipy-1.17.1-py314hf07bd8e_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/snappy-1.2.2-h03e3b7b_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/svt-av1-4.0.1-hecca717_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/tifffile-2026.3.3-pyhd8ed1ab_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h366c992_103.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/tornado-6.5.3-py314h5bd0f2a_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-17.0.1-py314h5bd0f2a_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/wayland-1.25.0-hd6090a7_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/xcb-util-0.4.1-h4f16b4b_2.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/xcb-util-cursor-0.1.6-hb03c661_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/xcb-util-image-0.4.0-hb711507_2.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/xcb-util-keysyms-0.4.1-hb711507_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/xcb-util-renderutil-0.3.10-hb711507_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/xcb-util-wm-0.4.2-hb711507_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/xkeyboard-config-2.47-hb03c661_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libice-1.1.2-hb9d3cd8_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libsm-1.2.6-he73a12e_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.13-he1eb515_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.12-hb03c661_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxcomposite-0.4.7-hb03c661_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxcursor-1.2.3-hb9d3cd8_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdamage-1.1.6-hb9d3cd8_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb03c661_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.7-hb03c661_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-6.0.2-hb03c661_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.8.2-hb9d3cd8_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxrandr-1.5.5-hb03c661_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxrender-0.9.12-hb9d3cd8_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxtst-1.2.5-hb9d3cd8_3.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxxf86vm-1.1.7-hb03c661_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/zfp-1.0.1-h909a3a2_5.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/zlib-ng-2.3.3-hceb46e0_1.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda
+ - pypi: https://files.pythonhosted.org/packages/47/d9/d83e293854571c877a92da46fdec39158f8d7e68da75bf73581225d28e90/cffi-2.0.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
+ - pypi: https://files.pythonhosted.org/packages/fd/55/b3b49a1b97aabcfbbd6c7326df9cb0b6fa0c0aefa8e89d500939e04aa229/opencv_python-4.13.0.92-cp37-abi3-manylinux_2_28_x86_64.whl
+ - pypi: https://files.pythonhosted.org/packages/0c/c3/44f3fbbfa403ea2a7c779186dc20772604442dde72947e7d01069cbe98e3/pycparser-3.0-py3-none-any.whl
+ - pypi: https://files.pythonhosted.org/packages/cc/b4/817944e9cbf8a3f6a8a0d1914fa68a28effb3b455dd57a244684b79bfac7/raylib-5.5.0.4-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
+packages:
+- conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-20_gnu.conda
+ build_number: 20
+ sha256: 1dd3fffd892081df9726d7eb7e0dea6198962ba775bd88842135a4ddb4deb3c9
+ md5: a9f577daf3de00bca7c3c76c0ecbd1de
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ - libgomp >=7.5.0
+ constrains:
+ - openmp_impl <0.0a0
+ license: BSD-3-Clause
+ license_family: BSD
+ purls: []
+ size: 28948
+ timestamp: 1770939786096
+- conda: https://conda.anaconda.org/conda-forge/linux-64/alsa-lib-1.2.15.3-hb03c661_0.conda
+ sha256: d88aa7ae766cf584e180996e92fef2aa7d8e0a0a5ab1d4d49c32390c1b5fff31
+ md5: dcdc58c15961dbf17a0621312b01f5cb
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ - libgcc >=14
+ license: LGPL-2.1-or-later
+ license_family: GPL
+ purls: []
+ size: 584660
+ timestamp: 1768327524772
+- conda: https://conda.anaconda.org/conda-forge/linux-64/aom-3.9.1-hac33072_0.conda
+ sha256: b08ef033817b5f9f76ce62dfcac7694e7b6b4006420372de22494503decac855
+ md5: 346722a0be40f6edc53f12640d301338
+ depends:
+ - libgcc-ng >=12
+ - libstdcxx-ng >=12
+ license: BSD-2-Clause
+ license_family: BSD
+ purls: []
+ size: 2706396
+ timestamp: 1718551242397
+- conda: https://conda.anaconda.org/conda-forge/linux-64/blosc-1.21.6-he440d0b_1.conda
+ sha256: e7af5d1183b06a206192ff440e08db1c4e8b2ca1f8376ee45fb2f3a85d4ee45d
+ md5: 2c2fae981fd2afd00812c92ac47d023d
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ - libgcc >=13
+ - libstdcxx >=13
+ - libzlib >=1.3.1,<2.0a0
+ - lz4-c >=1.10.0,<1.11.0a0
+ - snappy >=1.2.1,<1.3.0a0
+ - zstd >=1.5.6,<1.6.0a0
+ license: BSD-3-Clause
+ license_family: BSD
+ purls: []
+ size: 48427
+ timestamp: 1733513201413
+- conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-1.2.0-hed03a55_1.conda
+ sha256: e511644d691f05eb12ebe1e971fd6dc3ae55a4df5c253b4e1788b789bdf2dfa6
+ md5: 8ccf913aaba749a5496c17629d859ed1
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ - brotli-bin 1.2.0 hb03c661_1
+ - libbrotlidec 1.2.0 hb03c661_1
+ - libbrotlienc 1.2.0 hb03c661_1
+ - libgcc >=14
+ license: MIT
+ license_family: MIT
+ purls: []
+ size: 20103
+ timestamp: 1764017231353
+- conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.2.0-hb03c661_1.conda
+ sha256: 64b137f30b83b1dd61db6c946ae7511657eead59fdf74e84ef0ded219605aa94
+ md5: af39b9a8711d4a8d437b52c1d78eb6a1
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ - libbrotlidec 1.2.0 hb03c661_1
+ - libbrotlienc 1.2.0 hb03c661_1
+ - libgcc >=14
+ license: MIT
+ license_family: MIT
+ purls: []
+ size: 21021
+ timestamp: 1764017221344
+- conda: https://conda.anaconda.org/conda-forge/linux-64/brunsli-0.1-hd1e3526_2.conda
+ sha256: b4831ac06bb65561342cedf3d219cf9b096f20b8d62cda74f0177dffed79d4d5
+ md5: 5948f4fead433c6e5c46444dbfb01162
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ - libbrotlicommon >=1.2.0,<1.3.0a0
+ - libbrotlidec >=1.2.0,<1.3.0a0
+ - libbrotlienc >=1.2.0,<1.3.0a0
+ - libgcc >=14
+ - libstdcxx >=14
+ license: MIT
+ license_family: MIT
+ purls: []
+ size: 168501
+ timestamp: 1761758949420
+- conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_9.conda
+ sha256: 0b75d45f0bba3e95dc693336fa51f40ea28c980131fec438afb7ce6118ed05f6
+ md5: d2ffd7602c02f2b316fd921d39876885
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ - libgcc >=14
+ license: bzip2-1.0.6
+ license_family: BSD
+ purls: []
+ size: 260182
+ timestamp: 1771350215188
+- conda: https://conda.anaconda.org/conda-forge/linux-64/c-blosc2-2.23.1-hc31b594_0.conda
+ sha256: b6ce82ebe3cf24e70179bd656eacfa97ce9df9a500f2cec6843043466a5e6af8
+ md5: 68ceffc6cadae61846a207cae60de094
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ - libgcc >=14
+ - libstdcxx >=14
+ - lz4-c >=1.10.0,<1.11.0a0
+ - zlib-ng >=2.3.3,<2.4.0a0
+ - zstd >=1.5.7,<1.6.0a0
+ license: BSD-3-Clause
+ license_family: BSD
+ purls: []
+ size: 353899
+ timestamp: 1772620395951
+- conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-hbd8a1cb_0.conda
+ sha256: 67cc7101b36421c5913a1687ef1b99f85b5d6868da3abbf6ec1a4181e79782fc
+ md5: 4492fd26db29495f0ba23f146cd5638d
+ depends:
+ - __unix
+ license: ISC
+ purls: []
+ size: 147413
+ timestamp: 1772006283803
+- conda: https://conda.anaconda.org/conda-forge/linux-64/cairo-1.18.4-he90730b_1.conda
+ sha256: 06525fa0c4e4f56e771a3b986d0fdf0f0fc5a3270830ee47e127a5105bde1b9a
+ md5: bb6c4808bfa69d6f7f6b07e5846ced37
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ - fontconfig >=2.15.0,<3.0a0
+ - fonts-conda-ecosystem
+ - icu >=78.1,<79.0a0
+ - libexpat >=2.7.3,<3.0a0
+ - libfreetype >=2.14.1
+ - libfreetype6 >=2.14.1
+ - libgcc >=14
+ - libglib >=2.86.3,<3.0a0
+ - libpng >=1.6.53,<1.7.0a0
+ - libstdcxx >=14
+ - libxcb >=1.17.0,<2.0a0
+ - libzlib >=1.3.1,<2.0a0
+ - pixman >=0.46.4,<1.0a0
+ - xorg-libice >=1.1.2,<2.0a0
+ - xorg-libsm >=1.2.6,<2.0a0
+ - xorg-libx11 >=1.8.12,<2.0a0
+ - xorg-libxext >=1.3.6,<2.0a0
+ - xorg-libxrender >=0.9.12,<0.10.0a0
+ license: LGPL-2.1-only or MPL-1.1
+ purls: []
+ size: 989514
+ timestamp: 1766415934926
+- pypi: https://files.pythonhosted.org/packages/47/d9/d83e293854571c877a92da46fdec39158f8d7e68da75bf73581225d28e90/cffi-2.0.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
+ name: cffi
+ version: 2.0.0
+ sha256: afb8db5439b81cf9c9d0c80404b60c3cc9c3add93e114dcae767f1477cb53775
+ requires_dist:
+ - pycparser ; implementation_name != 'PyPy'
+ requires_python: '>=3.9'
+- conda: https://conda.anaconda.org/conda-forge/linux-64/charls-2.4.3-hecca717_0.conda
+ sha256: 53504e965499b4845ca3dc63d5905d5a1e686fcb9ab17e83c018efa479e787d0
+ md5: 937ca49a245fcf2b88d51b6b52959426
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ - libgcc >=14
+ - libstdcxx >=14
+ license: BSD-3-Clause
+ license_family: BSD
+ purls: []
+ size: 161768
+ timestamp: 1772712510770
+- conda: https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.3-py314h97ea11e_4.conda
+ sha256: b0314a7f1fb4a294b1a8bcf5481d4a8d9412a9fee23b7e3f93fb10e4d504f2cc
+ md5: 95bede9cdb7a30a4b611223d52a01aa4
+ depends:
+ - numpy >=1.25
+ - python
+ - libstdcxx >=14
+ - libgcc >=14
+ - __glibc >=2.17,<3.0.a0
+ - python_abi 3.14.* *_cp314
+ license: BSD-3-Clause
+ license_family: BSD
+ purls:
+ - pkg:pypi/contourpy?source=hash-mapping
+ size: 324013
+ timestamp: 1769155968691
+- conda: https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhcf101f3_2.conda
+ sha256: bb47aec5338695ff8efbddbc669064a3b10fe34ad881fb8ad5d64fbfa6910ed1
+ md5: 4c2a8fef270f6c69591889b93f9f55c1
+ depends:
+ - python >=3.10
+ - python
+ license: BSD-3-Clause
+ license_family: BSD
+ purls:
+ - pkg:pypi/cycler?source=hash-mapping
+ size: 14778
+ timestamp: 1764466758386
+- conda: https://conda.anaconda.org/conda-forge/linux-64/cyrus-sasl-2.1.28-hac629b4_1.conda
+ sha256: 7684da83306bb69686c0506fb09aa7074e1a55ade50c3a879e4e5df6eebb1009
+ md5: af491aae930edc096b58466c51c4126c
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ - krb5 >=1.22.2,<1.23.0a0
+ - libgcc >=13
+ - libntlm >=1.8,<2.0a0
+ - libstdcxx >=13
+ - libxcrypt >=4.4.36
+ - openssl >=3.5.5,<4.0a0
+ license: BSD-3-Clause-Attribution
+ license_family: BSD
+ purls: []
+ size: 210103
+ timestamp: 1771943128249
+- conda: https://conda.anaconda.org/conda-forge/linux-64/dav1d-1.2.1-hd590300_0.conda
+ sha256: 22053a5842ca8ee1cf8e1a817138cdb5e647eb2c46979f84153f6ad7bde73020
+ md5: 418c6ca5929a611cbd69204907a83995
+ depends:
+ - libgcc-ng >=12
+ license: BSD-2-Clause
+ license_family: BSD
+ purls: []
+ size: 760229
+ timestamp: 1685695754230
+- conda: https://conda.anaconda.org/conda-forge/linux-64/dbus-1.16.2-h24cb091_1.conda
+ sha256: 8bb557af1b2b7983cf56292336a1a1853f26555d9c6cecf1e5b2b96838c9da87
+ md5: ce96f2f470d39bd96ce03945af92e280
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ - libgcc >=14
+ - libstdcxx >=14
+ - libzlib >=1.3.1,<2.0a0
+ - libglib >=2.86.2,<3.0a0
+ - libexpat >=2.7.3,<3.0a0
+ license: AFL-2.1 OR GPL-2.0-or-later
+ purls: []
+ size: 447649
+ timestamp: 1764536047944
+- conda: https://conda.anaconda.org/conda-forge/linux-64/double-conversion-3.4.0-hecca717_0.conda
+ sha256: 40cdd1b048444d3235069d75f9c8e1f286db567f6278a93b4f024e5642cfaecc
+ md5: dbe3ec0f120af456b3477743ffd99b74
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ - libgcc >=14
+ - libstdcxx >=14
+ license: BSD-3-Clause
+ license_family: BSD
+ purls: []
+ size: 71809
+ timestamp: 1765193127016
+- conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2
+ sha256: 58d7f40d2940dd0a8aa28651239adbf5613254df0f75789919c4e6762054403b
+ md5: 0c96522c6bdaed4b1566d11387caaf45
+ license: BSD-3-Clause
+ license_family: BSD
+ purls: []
+ size: 397370
+ timestamp: 1566932522327
+- conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2
+ sha256: c52a29fdac682c20d252facc50f01e7c2e7ceac52aa9817aaf0bb83f7559ec5c
+ md5: 34893075a5c9e55cdafac56607368fc6
+ license: OFL-1.1
+ license_family: Other
+ purls: []
+ size: 96530
+ timestamp: 1620479909603
+- conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2
+ sha256: 00925c8c055a2275614b4d983e1df637245e19058d79fc7dd1a93b8d9fb4b139
+ md5: 4d59c254e01d9cde7957100457e2d5fb
+ license: OFL-1.1
+ license_family: Other
+ purls: []
+ size: 700814
+ timestamp: 1620479612257
+- conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_3.conda
+ sha256: 2821ec1dc454bd8b9a31d0ed22a7ce22422c0aef163c59f49dfdf915d0f0ca14
+ md5: 49023d73832ef61042f6a237cb2687e7
+ license: LicenseRef-Ubuntu-Font-Licence-Version-1.0
+ license_family: Other
+ purls: []
+ size: 1620504
+ timestamp: 1727511233259
+- conda: https://conda.anaconda.org/conda-forge/linux-64/fontconfig-2.17.1-h27c8c51_0.conda
+ sha256: aa4a44dba97151221100a637c7f4bde619567afade9c0265f8e1c8eed8d7bd8c
+ md5: 867127763fbe935bab59815b6e0b7b5c
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ - libexpat >=2.7.4,<3.0a0
+ - libfreetype >=2.14.1
+ - libfreetype6 >=2.14.1
+ - libgcc >=14
+ - libuuid >=2.41.3,<3.0a0
+ - libzlib >=1.3.1,<2.0a0
+ license: MIT
+ license_family: MIT
+ purls: []
+ size: 270705
+ timestamp: 1771382710863
+- conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2
+ sha256: a997f2f1921bb9c9d76e6fa2f6b408b7fa549edd349a77639c9fe7a23ea93e61
+ md5: fee5683a3f04bd15cbd8318b096a27ab
+ depends:
+ - fonts-conda-forge
+ license: BSD-3-Clause
+ license_family: BSD
+ purls: []
+ size: 3667
+ timestamp: 1566974674465
+- conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-hc364b38_1.conda
+ sha256: 54eea8469786bc2291cc40bca5f46438d3e062a399e8f53f013b6a9f50e98333
+ md5: a7970cd949a077b7cb9696379d338681
+ depends:
+ - font-ttf-ubuntu
+ - font-ttf-inconsolata
+ - font-ttf-dejavu-sans-mono
+ - font-ttf-source-code-pro
+ license: BSD-3-Clause
+ license_family: BSD
+ purls: []
+ size: 4059
+ timestamp: 1762351264405
+- conda: https://conda.anaconda.org/conda-forge/noarch/fonttools-4.62.0-pyh7db6752_0.conda
+ sha256: ed4462f6e49b8dea4e45f7294cca576a38cf4fc41e04bbcd95f9cf55be7776b9
+ md5: 049f68f9c90f00069c748cd6fb7bfb55
+ depends:
+ - brotli
+ - munkres
+ - python >=3.10
+ - unicodedata2 >=15.1.0
+ track_features:
+ - fonttools_no_compile
+ license: MIT
+ license_family: MIT
+ purls:
+ - pkg:pypi/fonttools?source=compressed-mapping
+ size: 837910
+ timestamp: 1773137210630
+- conda: https://conda.anaconda.org/conda-forge/linux-64/freetype-2.14.2-ha770c72_0.conda
+ sha256: 36857701b46828b6760c3c1652414ee504e7fc12740261ac6fcff3959b72bd7a
+ md5: eeec961fec28e747e1e1dc0446277452
+ depends:
+ - libfreetype 2.14.2 ha770c72_0
+ - libfreetype6 2.14.2 h73754d4_0
+ license: GPL-2.0-only OR FTL
+ purls: []
+ size: 174292
+ timestamp: 1772757205296
+- conda: https://conda.anaconda.org/conda-forge/linux-64/giflib-5.2.2-hd590300_0.conda
+ sha256: aac402a8298f0c0cc528664249170372ef6b37ac39fdc92b40601a6aed1e32ff
+ md5: 3bf7b9fd5a7136126e0234db4b87c8b6
+ depends:
+ - libgcc-ng >=12
+ license: MIT
+ license_family: MIT
+ purls: []
+ size: 77248
+ timestamp: 1712692454246
+- conda: https://conda.anaconda.org/conda-forge/linux-64/graphite2-1.3.14-hecca717_2.conda
+ sha256: 25ba37da5c39697a77fce2c9a15e48cf0a84f1464ad2aafbe53d8357a9f6cc8c
+ md5: 2cd94587f3a401ae05e03a6caf09539d
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ - libgcc >=14
+ - libstdcxx >=14
+ license: LGPL-2.0-or-later
+ license_family: LGPL
+ purls: []
+ size: 99596
+ timestamp: 1755102025473
+- conda: https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-13.2.0-h6083320_0.conda
+ sha256: 2b6958ab30b2ce330b0166e51fc5f20f761f71e09510d62f03f9729882707497
+ md5: 71c2c966e17a65b08b995f571310fb9f
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ - cairo >=1.18.4,<2.0a0
+ - graphite2 >=1.3.14,<2.0a0
+ - icu >=78.3,<79.0a0
+ - libexpat >=2.7.4,<3.0a0
+ - libfreetype >=2.14.2
+ - libfreetype6 >=2.14.2
+ - libgcc >=14
+ - libglib >=2.86.4,<3.0a0
+ - libstdcxx >=14
+ - libzlib >=1.3.1,<2.0a0
+ license: MIT
+ license_family: MIT
+ purls: []
+ size: 2342310
+ timestamp: 1773909324136
+- conda: https://conda.anaconda.org/conda-forge/linux-64/icu-78.3-h33c6efd_0.conda
+ sha256: fbf86c4a59c2ed05bbffb2ba25c7ed94f6185ec30ecb691615d42342baa1a16a
+ md5: c80d8a3b84358cb967fa81e7075fbc8a
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ - libgcc >=14
+ - libstdcxx >=14
+ license: MIT
+ license_family: MIT
+ purls: []
+ size: 12723451
+ timestamp: 1773822285671
+- conda: https://conda.anaconda.org/conda-forge/linux-64/imagecodecs-2026.3.6-py314he1f8f65_1.conda
+ sha256: f809ec8fd9ac52dfbf350dc3a7893f7ef0a684b8ac225b27413fa2d23c281f2f
+ md5: 0c933094ba24841b2262f0996112a12f
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ - blosc >=1.21.6,<2.0a0
+ - brunsli >=0.1,<1.0a0
+ - bzip2 >=1.0.8,<2.0a0
+ - c-blosc2 >=2.23.1,<2.24.0a0
+ - charls >=2.4.3,<2.5.0a0
+ - giflib >=5.2.2,<5.3.0a0
+ - jxrlib >=1.1,<1.2.0a0
+ - lcms2 >=2.18,<3.0a0
+ - lerc >=4.0.0,<5.0a0
+ - libaec >=1.1.5,<2.0a0
+ - libavif16 >=1.4.0,<2.0a0
+ - libbrotlicommon >=1.2.0,<1.3.0a0
+ - libbrotlidec >=1.2.0,<1.3.0a0
+ - libbrotlienc >=1.2.0,<1.3.0a0
+ - libdeflate >=1.25,<1.26.0a0
+ - libgcc >=14
+ - libjpeg-turbo >=3.1.2,<4.0a0
+ - libjxl >=0.11,<1.0a0
+ - liblzma >=5.8.2,<6.0a0
+ - libpng >=1.6.55,<1.7.0a0
+ - libstdcxx >=14
+ - libtiff >=4.7.1,<4.8.0a0
+ - libwebp-base >=1.6.0,<2.0a0
+ - libzlib >=1.3.1,<2.0a0
+ - libzopfli >=1.0.3,<1.1.0a0
+ - lz4-c >=1.10.0,<1.11.0a0
+ - numpy >=1.23,<3
+ - openjpeg >=2.5.4,<3.0a0
+ - openjph >=0.26.3,<0.27.0a0
+ - python >=3.14,<3.15.0a0
+ - python_abi 3.14.* *_cp314
+ - snappy >=1.2.2,<1.3.0a0
+ - zfp >=1.0.1,<2.0a0
+ - zlib-ng >=2.3.3,<2.4.0a0
+ - zstd >=1.5.7,<1.6.0a0
+ license: BSD-3-Clause
+ license_family: BSD
+ purls:
+ - pkg:pypi/imagecodecs?source=hash-mapping
+ size: 2077114
+ timestamp: 1772886182043
+- conda: https://conda.anaconda.org/conda-forge/linux-64/jxrlib-1.1-hd590300_3.conda
+ sha256: 2057ca87b313bde5b74b93b0e696f8faab69acd4cb0edebb78469f3f388040c0
+ md5: 5aeabe88534ea4169d4c49998f293d6c
+ depends:
+ - libgcc-ng >=12
+ license: BSD-2-Clause
+ license_family: BSD
+ purls: []
+ size: 239104
+ timestamp: 1703333860145
+- conda: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.3-hb9d3cd8_0.conda
+ sha256: 0960d06048a7185d3542d850986d807c6e37ca2e644342dd0c72feefcf26c2a4
+ md5: b38117a3c920364aff79f870c984b4a3
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ - libgcc >=13
+ license: LGPL-2.1-or-later
+ purls: []
+ size: 134088
+ timestamp: 1754905959823
+- conda: https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.5.0-py314h97ea11e_0.conda
+ sha256: e3488ea4a336f29e57de8f282bf40c0505cfc482e03004615e694b48e7d9c79f
+ md5: 7397e418cab519b8d789936cf2dde6f6
+ depends:
+ - python
+ - libstdcxx >=14
+ - libgcc >=14
+ - __glibc >=2.17,<3.0.a0
+ - python_abi 3.14.* *_cp314
+ license: BSD-3-Clause
+ license_family: BSD
+ purls:
+ - pkg:pypi/kiwisolver?source=compressed-mapping
+ size: 77363
+ timestamp: 1773067048780
+- conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.22.2-ha1258a1_0.conda
+ sha256: 3e307628ca3527448dd1cb14ad7bb9d04d1d28c7d4c5f97ba196ae984571dd25
+ md5: fb53fb07ce46a575c5d004bbc96032c2
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ - keyutils >=1.6.3,<2.0a0
+ - libedit >=3.1.20250104,<3.2.0a0
+ - libedit >=3.1.20250104,<4.0a0
+ - libgcc >=14
+ - libstdcxx >=14
+ - openssl >=3.5.5,<4.0a0
+ license: MIT
+ license_family: MIT
+ purls: []
+ size: 1386730
+ timestamp: 1769769569681
+- conda: https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.18-h0c24ade_0.conda
+ sha256: 836ec4b895352110335b9fdcfa83a8dcdbe6c5fb7c06c4929130600caea91c0a
+ md5: 6f2e2c8f58160147c4d1c6f4c14cbac4
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ - libgcc >=14
+ - libjpeg-turbo >=3.1.2,<4.0a0
+ - libtiff >=4.7.1,<4.8.0a0
+ license: MIT
+ license_family: MIT
+ purls: []
+ size: 249959
+ timestamp: 1768184673131
+- conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.45.1-default_hbd61a6d_101.conda
+ sha256: 565941ac1f8b0d2f2e8f02827cbca648f4d18cd461afc31f15604cd291b5c5f3
+ md5: 12bd9a3f089ee6c9266a37dab82afabd
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ - zstd >=1.5.7,<1.6.0a0
+ constrains:
+ - binutils_impl_linux-64 2.45.1
+ license: GPL-3.0-only
+ license_family: GPL
+ purls: []
+ size: 725507
+ timestamp: 1770267139900
+- conda: https://conda.anaconda.org/conda-forge/linux-64/lerc-4.1.0-hdb68285_0.conda
+ sha256: f84cb54782f7e9cea95e810ea8fef186e0652d0fa73d3009914fa2c1262594e1
+ md5: a752488c68f2e7c456bcbd8f16eec275
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ - libgcc >=14
+ - libstdcxx >=14
+ license: Apache-2.0
+ license_family: Apache
+ purls: []
+ size: 261513
+ timestamp: 1773113328888
+- conda: https://conda.anaconda.org/conda-forge/linux-64/libaec-1.1.5-h088129d_0.conda
+ sha256: 822e4ae421a7e9c04e841323526321185f6659222325e1a9aedec811c686e688
+ md5: 86f7414544ae606282352fa1e116b41f
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ - libgcc >=14
+ - libstdcxx >=14
+ license: BSD-2-Clause
+ license_family: BSD
+ purls: []
+ size: 36544
+ timestamp: 1769221884824
+- conda: https://conda.anaconda.org/conda-forge/linux-64/libavif16-1.4.1-hcfa2d63_0.conda
+ sha256: e29d8ed0334305c6bafecb32f9a1967cfc0a081eac916e947a1f2f7c4bb41947
+ md5: f79415aee8862b3af85ea55dea37e46b
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ - aom >=3.9.1,<3.10.0a0
+ - dav1d >=1.2.1,<1.2.2.0a0
+ - libgcc >=14
+ - rav1e >=0.8.1,<0.9.0a0
+ - svt-av1 >=4.0.1,<4.0.2.0a0
+ license: BSD-2-Clause
+ license_family: BSD
+ purls: []
+ size: 148710
+ timestamp: 1774042709303
+- conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-5_h4a7cf45_openblas.conda
+ build_number: 5
+ sha256: 18c72545080b86739352482ba14ba2c4815e19e26a7417ca21a95b76ec8da24c
+ md5: c160954f7418d7b6e87eaf05a8913fa9
+ depends:
+ - libopenblas >=0.3.30,<0.3.31.0a0
+ - libopenblas >=0.3.30,<1.0a0
+ constrains:
+ - mkl <2026
+ - liblapack 3.11.0 5*_openblas
+ - libcblas 3.11.0 5*_openblas
+ - blas 2.305 openblas
+ - liblapacke 3.11.0 5*_openblas
+ license: BSD-3-Clause
+ license_family: BSD
+ purls: []
+ size: 18213
+ timestamp: 1765818813880
+- conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.2.0-hb03c661_1.conda
+ sha256: 318f36bd49ca8ad85e6478bd8506c88d82454cc008c1ac1c6bf00a3c42fa610e
+ md5: 72c8fd1af66bd67bf580645b426513ed
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ - libgcc >=14
+ license: MIT
+ license_family: MIT
+ purls: []
+ size: 79965
+ timestamp: 1764017188531
+- conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.2.0-hb03c661_1.conda
+ sha256: 12fff21d38f98bc446d82baa890e01fd82e3b750378fedc720ff93522ffb752b
+ md5: 366b40a69f0ad6072561c1d09301c886
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ - libbrotlicommon 1.2.0 hb03c661_1
+ - libgcc >=14
+ license: MIT
+ license_family: MIT
+ purls: []
+ size: 34632
+ timestamp: 1764017199083
+- conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.2.0-hb03c661_1.conda
+ sha256: a0c15c79997820bbd3fbc8ecf146f4fe0eca36cc60b62b63ac6cf78857f1dd0d
+ md5: 4ffbb341c8b616aa2494b6afb26a0c5f
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ - libbrotlicommon 1.2.0 hb03c661_1
+ - libgcc >=14
+ license: MIT
+ license_family: MIT
+ purls: []
+ size: 298378
+ timestamp: 1764017210931
+- conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.11.0-5_h0358290_openblas.conda
+ build_number: 5
+ sha256: 0cbdcc67901e02dc17f1d19e1f9170610bd828100dc207de4d5b6b8ad1ae7ad8
+ md5: 6636a2b6f1a87572df2970d3ebc87cc0
+ depends:
+ - libblas 3.11.0 5_h4a7cf45_openblas
+ constrains:
+ - liblapacke 3.11.0 5*_openblas
+ - blas 2.305 openblas
+ - liblapack 3.11.0 5*_openblas
+ license: BSD-3-Clause
+ license_family: BSD
+ purls: []
+ size: 18194
+ timestamp: 1765818837135
+- conda: https://conda.anaconda.org/conda-forge/linux-64/libclang-cpp22.1-22.1.0-default_h99862b1_0.conda
+ sha256: 914da94dbf829192b2bb360a7684b32e46f047a57de96a2f5ab39a011aeae6ea
+ md5: d966a23335e090a5410cc4f0dec8d00a
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ - libgcc >=14
+ - libllvm22 >=22.1.0,<22.2.0a0
+ - libstdcxx >=14
+ license: Apache-2.0 WITH LLVM-exception
+ license_family: Apache
+ purls: []
+ size: 21661249
+ timestamp: 1772101075353
+- conda: https://conda.anaconda.org/conda-forge/linux-64/libclang13-22.1.0-default_h746c552_0.conda
+ sha256: 4a9dd814492a129f2ff40cd4ab0b942232c9e3c6dbc0d0aaf861f1f65e99cc7d
+ md5: 140459a7413d8f6884eb68205ce39a0d
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ - libgcc >=14
+ - libllvm22 >=22.1.0,<22.2.0a0
+ - libstdcxx >=14
+ license: Apache-2.0 WITH LLVM-exception
+ license_family: Apache
+ purls: []
+ size: 12817500
+ timestamp: 1772101411287
+- conda: https://conda.anaconda.org/conda-forge/linux-64/libcups-2.3.3-h7a8fb5f_6.conda
+ sha256: 205c4f19550f3647832ec44e35e6d93c8c206782bdd620c1d7cf66237580ff9c
+ md5: 49c553b47ff679a6a1e9fc80b9c5a2d4
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ - krb5 >=1.22.2,<1.23.0a0
+ - libgcc >=14
+ - libstdcxx >=14
+ - libzlib >=1.3.1,<2.0a0
+ license: Apache-2.0
+ license_family: Apache
+ purls: []
+ size: 4518030
+ timestamp: 1770902209173
+- conda: https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.25-h17f619e_0.conda
+ sha256: aa8e8c4be9a2e81610ddf574e05b64ee131fab5e0e3693210c9d6d2fba32c680
+ md5: 6c77a605a7a689d17d4819c0f8ac9a00
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ - libgcc >=14
+ license: MIT
+ license_family: MIT
+ purls: []
+ size: 73490
+ timestamp: 1761979956660
+- conda: https://conda.anaconda.org/conda-forge/linux-64/libdrm-2.4.125-hb03c661_1.conda
+ sha256: c076a213bd3676cc1ef22eeff91588826273513ccc6040d9bea68bccdc849501
+ md5: 9314bc5a1fe7d1044dc9dfd3ef400535
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ - libgcc >=14
+ - libpciaccess >=0.18,<0.19.0a0
+ license: MIT
+ license_family: MIT
+ purls: []
+ size: 310785
+ timestamp: 1757212153962
+- conda: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda
+ sha256: d789471216e7aba3c184cd054ed61ce3f6dac6f87a50ec69291b9297f8c18724
+ md5: c277e0a4d549b03ac1e9d6cbbe3d017b
+ depends:
+ - ncurses
+ - __glibc >=2.17,<3.0.a0
+ - libgcc >=13
+ - ncurses >=6.5,<7.0a0
+ license: BSD-2-Clause
+ license_family: BSD
+ purls: []
+ size: 134676
+ timestamp: 1738479519902
+- conda: https://conda.anaconda.org/conda-forge/linux-64/libegl-1.7.0-ha4b6fd6_2.conda
+ sha256: 7fd5408d359d05a969133e47af580183fbf38e2235b562193d427bb9dad79723
+ md5: c151d5eb730e9b7480e6d48c0fc44048
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ - libglvnd 1.7.0 ha4b6fd6_2
+ license: LicenseRef-libglvnd
+ purls: []
+ size: 44840
+ timestamp: 1731330973553
+- conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.4-hecca717_0.conda
+ sha256: d78f1d3bea8c031d2f032b760f36676d87929b18146351c4464c66b0869df3f5
+ md5: e7f7ce06ec24cfcfb9e36d28cf82ba57
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ - libgcc >=14
+ constrains:
+ - expat 2.7.4.*
+ license: MIT
+ license_family: MIT
+ purls: []
+ size: 76798
+ timestamp: 1771259418166
+- conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.5.2-h3435931_0.conda
+ sha256: 31f19b6a88ce40ebc0d5a992c131f57d919f73c0b92cd1617a5bec83f6e961e6
+ md5: a360c33a5abe61c07959e449fa1453eb
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ - libgcc >=14
+ license: MIT
+ license_family: MIT
+ purls: []
+ size: 58592
+ timestamp: 1769456073053
+- conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.14.2-ha770c72_0.conda
+ sha256: 2e1bfe1e856eb707d258f669ef6851af583ceaffab5e64821b503b0f7cd09e9e
+ md5: 26c746d14402a3b6c684d045b23b9437
+ depends:
+ - libfreetype6 >=2.14.2
+ license: GPL-2.0-only OR FTL
+ purls: []
+ size: 8035
+ timestamp: 1772757210108
+- conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype6-2.14.2-h73754d4_0.conda
+ sha256: aba65b94bdbed52de17ec3d0c6f2ebac2ef77071ad22d6900d1614d0dd702a0c
+ md5: 8eaba3d1a4d7525c6814e861614457fd
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ - libgcc >=14
+ - libpng >=1.6.55,<1.7.0a0
+ - libzlib >=1.3.1,<2.0a0
+ constrains:
+ - freetype >=2.14.2
+ license: GPL-2.0-only OR FTL
+ purls: []
+ size: 386316
+ timestamp: 1772757193822
+- conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_18.conda
+ sha256: faf7d2017b4d718951e3a59d081eb09759152f93038479b768e3d612688f83f5
+ md5: 0aa00f03f9e39fb9876085dee11a85d4
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ - _openmp_mutex >=4.5
+ constrains:
+ - libgcc-ng ==15.2.0=*_18
+ - libgomp 15.2.0 he0feb66_18
+ license: GPL-3.0-only WITH GCC-exception-3.1
+ license_family: GPL
+ purls: []
+ size: 1041788
+ timestamp: 1771378212382
+- conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_18.conda
+ sha256: e318a711400f536c81123e753d4c797a821021fb38970cebfb3f454126016893
+ md5: d5e96b1ed75ca01906b3d2469b4ce493
+ depends:
+ - libgcc 15.2.0 he0feb66_18
+ license: GPL-3.0-only WITH GCC-exception-3.1
+ license_family: GPL
+ purls: []
+ size: 27526
+ timestamp: 1771378224552
+- conda: https://conda.anaconda.org/conda-forge/linux-64/libgd-2.3.3-h5fbf134_12.conda
+ sha256: 245be793e831170504f36213134f4c24eedaf39e634679809fd5391ad214480b
+ md5: 88c1c66987cd52a712eea89c27104be6
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ - fontconfig >=2.15.0,<3.0a0
+ - fonts-conda-ecosystem
+ - icu >=78.1,<79.0a0
+ - libexpat >=2.7.3,<3.0a0
+ - libfreetype >=2.14.1
+ - libfreetype6 >=2.14.1
+ - libgcc >=14
+ - libjpeg-turbo >=3.1.2,<4.0a0
+ - libpng >=1.6.53,<1.7.0a0
+ - libtiff >=4.7.1,<4.8.0a0
+ - libwebp-base >=1.6.0,<2.0a0
+ - libzlib >=1.3.1,<2.0a0
+ license: GD
+ license_family: BSD
+ purls: []
+ size: 177306
+ timestamp: 1766331805898
+- conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.2.0-h69a702a_18.conda
+ sha256: d2c9fad338fd85e4487424865da8e74006ab2e2475bd788f624d7a39b2a72aee
+ md5: 9063115da5bc35fdc3e1002e69b9ef6e
+ depends:
+ - libgfortran5 15.2.0 h68bc16d_18
+ constrains:
+ - libgfortran-ng ==15.2.0=*_18
+ license: GPL-3.0-only WITH GCC-exception-3.1
+ license_family: GPL
+ purls: []
+ size: 27523
+ timestamp: 1771378269450
+- conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.2.0-h68bc16d_18.conda
+ sha256: 539b57cf50ec85509a94ba9949b7e30717839e4d694bc94f30d41c9d34de2d12
+ md5: 646855f357199a12f02a87382d429b75
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ - libgcc >=15.2.0
+ constrains:
+ - libgfortran 15.2.0
+ license: GPL-3.0-only WITH GCC-exception-3.1
+ license_family: GPL
+ purls: []
+ size: 2482475
+ timestamp: 1771378241063
+- conda: https://conda.anaconda.org/conda-forge/linux-64/libgl-1.7.0-ha4b6fd6_2.conda
+ sha256: dc2752241fa3d9e40ce552c1942d0a4b5eeb93740c9723873f6fcf8d39ef8d2d
+ md5: 928b8be80851f5d8ffb016f9c81dae7a
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ - libglvnd 1.7.0 ha4b6fd6_2
+ - libglx 1.7.0 ha4b6fd6_2
+ license: LicenseRef-libglvnd
+ purls: []
+ size: 134712
+ timestamp: 1731330998354
+- conda: https://conda.anaconda.org/conda-forge/linux-64/libglib-2.86.4-h6548e54_1.conda
+ sha256: a27e44168a1240b15659888ce0d9b938ed4bdb49e9ea68a7c1ff27bcea8b55ce
+ md5: bb26456332b07f68bf3b7622ed71c0da
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ - libffi >=3.5.2,<3.6.0a0
+ - libgcc >=14
+ - libiconv >=1.18,<2.0a0
+ - libzlib >=1.3.1,<2.0a0
+ - pcre2 >=10.47,<10.48.0a0
+ constrains:
+ - glib 2.86.4 *_1
+ license: LGPL-2.1-or-later
+ purls: []
+ size: 4398701
+ timestamp: 1771863239578
+- conda: https://conda.anaconda.org/conda-forge/linux-64/libglvnd-1.7.0-ha4b6fd6_2.conda
+ sha256: 1175f8a7a0c68b7f81962699751bb6574e6f07db4c9f72825f978e3016f46850
+ md5: 434ca7e50e40f4918ab701e3facd59a0
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ license: LicenseRef-libglvnd
+ purls: []
+ size: 132463
+ timestamp: 1731330968309
+- conda: https://conda.anaconda.org/conda-forge/linux-64/libglx-1.7.0-ha4b6fd6_2.conda
+ sha256: 2d35a679624a93ce5b3e9dd301fff92343db609b79f0363e6d0ceb3a6478bfa7
+ md5: c8013e438185f33b13814c5c488acd5c
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ - libglvnd 1.7.0 ha4b6fd6_2
+ - xorg-libx11 >=1.8.10,<2.0a0
+ license: LicenseRef-libglvnd
+ purls: []
+ size: 75504
+ timestamp: 1731330988898
+- conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_18.conda
+ sha256: 21337ab58e5e0649d869ab168d4e609b033509de22521de1bfed0c031bfc5110
+ md5: 239c5e9546c38a1e884d69effcf4c882
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ license: GPL-3.0-only WITH GCC-exception-3.1
+ license_family: GPL
+ purls: []
+ size: 603262
+ timestamp: 1771378117851
+- conda: https://conda.anaconda.org/conda-forge/linux-64/libhwy-1.3.0-h4c17acf_1.conda
+ sha256: 2bdd1cdd677b119abc5e83069bec2e28fe6bfb21ebaea3cd07acee67f38ea274
+ md5: c2a0c1d0120520e979685034e0b79859
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ - libgcc >=14
+ - libstdcxx >=14
+ license: Apache-2.0 OR BSD-3-Clause
+ purls: []
+ size: 1448617
+ timestamp: 1758894401402
+- conda: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h3b78370_2.conda
+ sha256: c467851a7312765447155e071752d7bf9bf44d610a5687e32706f480aad2833f
+ md5: 915f5995e94f60e9a4826e0b0920ee88
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ - libgcc >=14
+ license: LGPL-2.1-only
+ purls: []
+ size: 790176
+ timestamp: 1754908768807
+- conda: https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.1.2-hb03c661_0.conda
+ sha256: cc9aba923eea0af8e30e0f94f2ad7156e2984d80d1e8e7fe6be5a1f257f0eb32
+ md5: 8397539e3a0bbd1695584fb4f927485a
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ - libgcc >=14
+ constrains:
+ - jpeg <0.0.0a
+ license: IJG AND BSD-3-Clause AND Zlib
+ purls: []
+ size: 633710
+ timestamp: 1762094827865
+- conda: https://conda.anaconda.org/conda-forge/linux-64/libjxl-0.11.2-ha09017c_0.conda
+ sha256: 0c2399cef02953b719afe6591223fb11d287d5a108ef8bb9a02dd509a0f738d7
+ md5: 1df8c1b1d6665642107883685db6cf37
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ - libgcc >=14
+ - libstdcxx >=14
+ - libhwy >=1.3.0,<1.4.0a0
+ - libbrotlienc >=1.2.0,<1.3.0a0
+ - libbrotlidec >=1.2.0,<1.3.0a0
+ license: BSD-3-Clause
+ license_family: BSD
+ purls: []
+ size: 1883476
+ timestamp: 1770801977654
+- conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.11.0-5_h47877c9_openblas.conda
+ build_number: 5
+ sha256: c723b6599fcd4c6c75dee728359ef418307280fa3e2ee376e14e85e5bbdda053
+ md5: b38076eb5c8e40d0106beda6f95d7609
+ depends:
+ - libblas 3.11.0 5_h4a7cf45_openblas
+ constrains:
+ - blas 2.305 openblas
+ - liblapacke 3.11.0 5*_openblas
+ - libcblas 3.11.0 5*_openblas
+ license: BSD-3-Clause
+ license_family: BSD
+ purls: []
+ size: 18200
+ timestamp: 1765818857876
+- conda: https://conda.anaconda.org/conda-forge/linux-64/libllvm22-22.1.1-hf7376ad_0.conda
+ sha256: 1145f9e85f0fbbdba88f1da5c8c48672bee7702e2f40c563b2dd48350ab4d413
+ md5: 97cc6dad22677304846a798c8a65064d
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ - libgcc >=14
+ - libstdcxx >=14
+ - libxml2
+ - libxml2-16 >=2.14.6
+ - libzlib >=1.3.1,<2.0a0
+ - zstd >=1.5.7,<1.6.0a0
+ license: Apache-2.0 WITH LLVM-exception
+ license_family: Apache
+ purls: []
+ size: 44256563
+ timestamp: 1773371774629
+- conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.2-hb03c661_0.conda
+ sha256: 755c55ebab181d678c12e49cced893598f2bab22d582fbbf4d8b83c18be207eb
+ md5: c7c83eecbb72d88b940c249af56c8b17
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ - libgcc >=14
+ constrains:
+ - xz 5.8.2.*
+ license: 0BSD
+ purls: []
+ size: 113207
+ timestamp: 1768752626120
+- conda: https://conda.anaconda.org/conda-forge/linux-64/libmpdec-4.0.0-hb03c661_1.conda
+ sha256: fe171ed5cf5959993d43ff72de7596e8ac2853e9021dec0344e583734f1e0843
+ md5: 2c21e66f50753a083cbe6b80f38268fa
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ - libgcc >=14
+ license: BSD-2-Clause
+ license_family: BSD
+ purls: []
+ size: 92400
+ timestamp: 1769482286018
+- conda: https://conda.anaconda.org/conda-forge/linux-64/libntlm-1.8-hb9d3cd8_0.conda
+ sha256: 3b3f19ced060013c2dd99d9d46403be6d319d4601814c772a3472fe2955612b0
+ md5: 7c7927b404672409d9917d49bff5f2d6
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ - libgcc >=13
+ license: LGPL-2.1-or-later
+ purls: []
+ size: 33418
+ timestamp: 1734670021371
+- conda: https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.30-pthreads_h94d23a6_4.conda
+ sha256: 199d79c237afb0d4780ccd2fbf829cea80743df60df4705202558675e07dd2c5
+ md5: be43915efc66345cccb3c310b6ed0374
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ - libgcc >=14
+ - libgfortran
+ - libgfortran5 >=14.3.0
+ constrains:
+ - openblas >=0.3.30,<0.3.31.0a0
+ license: BSD-3-Clause
+ license_family: BSD
+ purls: []
+ size: 5927939
+ timestamp: 1763114673331
+- conda: https://conda.anaconda.org/conda-forge/linux-64/libopengl-1.7.0-ha4b6fd6_2.conda
+ sha256: 215086c108d80349e96051ad14131b751d17af3ed2cb5a34edd62fa89bfe8ead
+ md5: 7df50d44d4a14d6c31a2c54f2cd92157
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ - libglvnd 1.7.0 ha4b6fd6_2
+ license: LicenseRef-libglvnd
+ purls: []
+ size: 50757
+ timestamp: 1731330993524
+- conda: https://conda.anaconda.org/conda-forge/linux-64/libpciaccess-0.18-hb9d3cd8_0.conda
+ sha256: 0bd91de9b447a2991e666f284ae8c722ffb1d84acb594dbd0c031bd656fa32b2
+ md5: 70e3400cbbfa03e96dcde7fc13e38c7b
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ - libgcc >=13
+ license: MIT
+ license_family: MIT
+ purls: []
+ size: 28424
+ timestamp: 1749901812541
+- conda: https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.55-h421ea60_0.conda
+ sha256: 36ade759122cdf0f16e2a2562a19746d96cf9c863ffaa812f2f5071ebbe9c03c
+ md5: 5f13ffc7d30ffec87864e678df9957b4
+ depends:
+ - libgcc >=14
+ - __glibc >=2.17,<3.0.a0
+ - libzlib >=1.3.1,<2.0a0
+ license: zlib-acknowledgement
+ purls: []
+ size: 317669
+ timestamp: 1770691470744
+- conda: https://conda.anaconda.org/conda-forge/linux-64/libpq-18.3-h9abb657_0.conda
+ sha256: c7e61b86c273ec1ce92c0e087d1a0f3ed3b9485507c6cd35e03bc63de1b6b03f
+ md5: 405ec206d230d9d37ad7c2636114cbf4
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ - icu >=78.2,<79.0a0
+ - krb5 >=1.22.2,<1.23.0a0
+ - libgcc >=14
+ - openldap >=2.6.10,<2.7.0a0
+ - openssl >=3.5.5,<4.0a0
+ license: PostgreSQL
+ purls: []
+ size: 2865686
+ timestamp: 1772136328077
+- conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.52.0-hf4e2dac_0.conda
+ sha256: d716847b7deca293d2e49ed1c8ab9e4b9e04b9d780aea49a97c26925b28a7993
+ md5: fd893f6a3002a635b5e50ceb9dd2c0f4
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ - icu >=78.2,<79.0a0
+ - libgcc >=14
+ - libzlib >=1.3.1,<2.0a0
+ license: blessing
+ purls: []
+ size: 951405
+ timestamp: 1772818874251
+- conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_18.conda
+ sha256: 78668020064fdaa27e9ab65cd2997e2c837b564ab26ce3bf0e58a2ce1a525c6e
+ md5: 1b08cd684f34175e4514474793d44bcb
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ - libgcc 15.2.0 he0feb66_18
+ constrains:
+ - libstdcxx-ng ==15.2.0=*_18
+ license: GPL-3.0-only WITH GCC-exception-3.1
+ license_family: GPL
+ purls: []
+ size: 5852330
+ timestamp: 1771378262446
+- conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.2.0-hdf11a46_18.conda
+ sha256: 3c902ffd673cb3c6ddde624cdb80f870b6c835f8bf28384b0016e7d444dd0145
+ md5: 6235adb93d064ecdf3d44faee6f468de
+ depends:
+ - libstdcxx 15.2.0 h934c35e_18
+ license: GPL-3.0-only WITH GCC-exception-3.1
+ license_family: GPL
+ purls: []
+ size: 27575
+ timestamp: 1771378314494
+- conda: https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.1-h9d88235_1.conda
+ sha256: e5f8c38625aa6d567809733ae04bb71c161a42e44a9fa8227abe61fa5c60ebe0
+ md5: cd5a90476766d53e901500df9215e927
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ - lerc >=4.0.0,<5.0a0
+ - libdeflate >=1.25,<1.26.0a0
+ - libgcc >=14
+ - libjpeg-turbo >=3.1.0,<4.0a0
+ - liblzma >=5.8.1,<6.0a0
+ - libstdcxx >=14
+ - libwebp-base >=1.6.0,<2.0a0
+ - libzlib >=1.3.1,<2.0a0
+ - zstd >=1.5.7,<1.6.0a0
+ license: HPND
+ purls: []
+ size: 435273
+ timestamp: 1762022005702
+- conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.41.3-h5347b49_0.conda
+ sha256: 1a7539cfa7df00714e8943e18de0b06cceef6778e420a5ee3a2a145773758aee
+ md5: db409b7c1720428638e7c0d509d3e1b5
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ - libgcc >=14
+ license: BSD-3-Clause
+ license_family: BSD
+ purls: []
+ size: 40311
+ timestamp: 1766271528534
+- conda: https://conda.anaconda.org/conda-forge/linux-64/libvulkan-loader-1.4.341.0-h5279c79_0.conda
+ sha256: a68280d57dfd29e3d53400409a39d67c4b9515097eba733aa6fe00c880620e2b
+ md5: 31ad065eda3c2d88f8215b1289df9c89
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ - libstdcxx >=14
+ - libgcc >=14
+ - xorg-libx11 >=1.8.12,<2.0a0
+ - xorg-libxrandr >=1.5.5,<2.0a0
+ constrains:
+ - libvulkan-headers 1.4.341.0.*
+ license: Apache-2.0
+ license_family: APACHE
+ purls: []
+ size: 199795
+ timestamp: 1770077125520
+- conda: https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.6.0-hd42ef1d_0.conda
+ sha256: 3aed21ab28eddffdaf7f804f49be7a7d701e8f0e46c856d801270b470820a37b
+ md5: aea31d2e5b1091feca96fcfe945c3cf9
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ - libgcc >=14
+ constrains:
+ - libwebp 1.6.0
+ license: BSD-3-Clause
+ license_family: BSD
+ purls: []
+ size: 429011
+ timestamp: 1752159441324
+- conda: https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-h8a09558_0.conda
+ sha256: 666c0c431b23c6cec6e492840b176dde533d48b7e6fb8883f5071223433776aa
+ md5: 92ed62436b625154323d40d5f2f11dd7
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ - libgcc >=13
+ - pthread-stubs
+ - xorg-libxau >=1.0.11,<2.0a0
+ - xorg-libxdmcp
+ license: MIT
+ license_family: MIT
+ purls: []
+ size: 395888
+ timestamp: 1727278577118
+- conda: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda
+ sha256: 6ae68e0b86423ef188196fff6207ed0c8195dd84273cb5623b85aa08033a410c
+ md5: 5aa797f8787fe7a17d1b0821485b5adc
+ depends:
+ - libgcc-ng >=12
+ license: LGPL-2.1-or-later
+ purls: []
+ size: 100393
+ timestamp: 1702724383534
+- conda: https://conda.anaconda.org/conda-forge/linux-64/libxkbcommon-1.13.1-hca5e8e5_0.conda
+ sha256: d2195b5fbcb0af1ff7b345efdf89290c279b8d1d74f325ae0ac98148c375863c
+ md5: 2bca1fbb221d9c3c8e3a155784bbc2e9
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ - libgcc >=14
+ - libstdcxx >=14
+ - libxcb >=1.17.0,<2.0a0
+ - libxml2
+ - libxml2-16 >=2.14.6
+ - xkeyboard-config
+ - xorg-libxau >=1.0.12,<2.0a0
+ license: MIT/X11 Derivative
+ license_family: MIT
+ purls: []
+ size: 837922
+ timestamp: 1764794163823
+- conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.15.2-he237659_0.conda
+ sha256: 275c324f87bda1a3b67d2f4fcc3555eeff9e228a37655aa001284a7ceb6b0392
+ md5: e49238a1609f9a4a844b09d9926f2c3d
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ - icu >=78.2,<79.0a0
+ - libgcc >=14
+ - libiconv >=1.18,<2.0a0
+ - liblzma >=5.8.2,<6.0a0
+ - libxml2-16 2.15.2 hca6bf5a_0
+ - libzlib >=1.3.1,<2.0a0
+ license: MIT
+ license_family: MIT
+ purls: []
+ size: 45968
+ timestamp: 1772704614539
+- conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-16-2.15.2-hca6bf5a_0.conda
+ sha256: 08d2b34b49bec9613784f868209bb7c3bb8840d6cf835ff692e036b09745188c
+ md5: f3bc152cb4f86babe30f3a4bf0dbef69
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ - icu >=78.2,<79.0a0
+ - libgcc >=14
+ - libiconv >=1.18,<2.0a0
+ - liblzma >=5.8.2,<6.0a0
+ - libzlib >=1.3.1,<2.0a0
+ constrains:
+ - libxml2 2.15.2
+ license: MIT
+ license_family: MIT
+ purls: []
+ size: 557492
+ timestamp: 1772704601644
+- conda: https://conda.anaconda.org/conda-forge/linux-64/libxslt-1.1.43-h711ed8c_1.conda
+ sha256: 0694760a3e62bdc659d90a14ae9c6e132b525a7900e59785b18a08bb52a5d7e5
+ md5: 87e6096ec6d542d1c1f8b33245fe8300
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ - libgcc >=14
+ - libxml2
+ - libxml2-16 >=2.14.6
+ license: MIT
+ license_family: MIT
+ purls: []
+ size: 245434
+ timestamp: 1757963724977
+- conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_2.conda
+ sha256: 55044c403570f0dc26e6364de4dc5368e5f3fc7ff103e867c487e2b5ab2bcda9
+ md5: d87ff7921124eccd67248aa483c23fec
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ constrains:
+ - zlib 1.3.2 *_2
+ license: Zlib
+ license_family: Other
+ purls: []
+ size: 63629
+ timestamp: 1774072609062
+- conda: https://conda.anaconda.org/conda-forge/linux-64/libzopfli-1.0.3-h9c3ff4c_0.tar.bz2
+ sha256: ff94f30b2e86cbad6296cf3e5804d442d9e881f7ba8080d92170981662528c6e
+ md5: c66fe2d123249af7651ebde8984c51c2
+ depends:
+ - libgcc-ng >=9.3.0
+ - libstdcxx-ng >=9.3.0
+ license: Apache-2.0
+ license_family: Apache
+ purls: []
+ size: 168074
+ timestamp: 1607309189989
+- conda: https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.10.0-h5888daf_1.conda
+ sha256: 47326f811392a5fd3055f0f773036c392d26fdb32e4d8e7a8197eed951489346
+ md5: 9de5350a85c4a20c685259b889aa6393
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ - libgcc >=13
+ - libstdcxx >=13
+ license: BSD-2-Clause
+ license_family: BSD
+ purls: []
+ size: 167055
+ timestamp: 1733741040117
+- conda: https://conda.anaconda.org/conda-forge/linux-64/mapbox_earcut-1.0.3-py314h3a4f467_2.conda
+ sha256: beeeb031033872372432010a772db6900a87283f393e24d22110391a88f3bef6
+ md5: b26c75e0adcf8bae7d6fd358942d2954
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ - libgcc >=14
+ - libgd
+ - libstdcxx >=14
+ - numpy >=1.23,<3
+ - python >=3.14.0rc2,<3.15.0a0
+ - python_abi 3.14.* *_cp314
+ license: ISC AND BSD-3-Clause
+ purls:
+ - pkg:pypi/mapbox-earcut?source=hash-mapping
+ size: 93013
+ timestamp: 1756667670924
+- conda: https://conda.anaconda.org/conda-forge/linux-64/matplotlib-3.10.8-py314hdafbbf9_0.conda
+ sha256: 0c9417291ada8df3415ad13d52db38707adaba42584246264294e0faaaa54f77
+ md5: 8286e3966eac286d5ac7c7a4afbac812
+ depends:
+ - matplotlib-base >=3.10.8,<3.10.9.0a0
+ - pyside6 >=6.7.2
+ - python >=3.14,<3.15.0a0
+ - python_abi 3.14.* *_cp314
+ - tornado >=5
+ license: PSF-2.0
+ license_family: PSF
+ purls: []
+ size: 17473
+ timestamp: 1763055464987
+- conda: https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.10.8-py314h1194b4b_0.conda
+ sha256: ee773261fbd6c76fc8174b0e4e1ce272b0bbaa56610f130e9d3d1f575106f04f
+ md5: b8683e6068099b69c10dbfcf7204203f
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ - contourpy >=1.0.1
+ - cycler >=0.10
+ - fonttools >=4.22.0
+ - freetype
+ - kiwisolver >=1.3.1
+ - libfreetype >=2.14.1
+ - libfreetype6 >=2.14.1
+ - libgcc >=14
+ - libstdcxx >=14
+ - numpy >=1.23
+ - numpy >=1.23,<3
+ - packaging >=20.0
+ - pillow >=8
+ - pyparsing >=2.3.1
+ - python >=3.14,<3.15.0a0
+ - python-dateutil >=2.7
+ - python_abi 3.14.* *_cp314
+ - qhull >=2020.2,<2020.3.0a0
+ - tk >=8.6.13,<8.7.0a0
+ license: PSF-2.0
+ license_family: PSF
+ purls:
+ - pkg:pypi/matplotlib?source=hash-mapping
+ size: 8473358
+ timestamp: 1763055439346
+- conda: https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyhd8ed1ab_1.conda
+ sha256: d09c47c2cf456de5c09fa66d2c3c5035aa1fa228a1983a433c47b876aa16ce90
+ md5: 37293a85a0f4f77bbd9cf7aaefc62609
+ depends:
+ - python >=3.9
+ license: Apache-2.0
+ license_family: Apache
+ purls:
+ - pkg:pypi/munkres?source=hash-mapping
+ size: 15851
+ timestamp: 1749895533014
+- conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda
+ sha256: 3fde293232fa3fca98635e1167de6b7c7fda83caf24b9d6c91ec9eefb4f4d586
+ md5: 47e340acb35de30501a76c7c799c41d7
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ - libgcc >=13
+ license: X11 AND BSD-3-Clause
+ purls: []
+ size: 891641
+ timestamp: 1738195959188
+- conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-2.4.3-py314h2b28147_0.conda
+ sha256: f2ba8cb0d86a6461a6bcf0d315c80c7076083f72c6733c9290086640723f79ec
+ md5: 36f5b7eb328bdc204954a2225cf908e2
+ depends:
+ - python
+ - libstdcxx >=14
+ - libgcc >=14
+ - __glibc >=2.17,<3.0.a0
+ - python_abi 3.14.* *_cp314
+ - libcblas >=3.9.0,<4.0a0
+ - liblapack >=3.9.0,<4.0a0
+ - libblas >=3.9.0,<4.0a0
+ constrains:
+ - numpy-base <0a0
+ license: BSD-3-Clause
+ license_family: BSD
+ purls:
+ - pkg:pypi/numpy?source=compressed-mapping
+ size: 8927860
+ timestamp: 1773839233468
+- pypi: https://files.pythonhosted.org/packages/fd/55/b3b49a1b97aabcfbbd6c7326df9cb0b6fa0c0aefa8e89d500939e04aa229/opencv_python-4.13.0.92-cp37-abi3-manylinux_2_28_x86_64.whl
+ name: opencv-python
+ version: 4.13.0.92
+ sha256: 620d602b8f7d8b8dab5f4b99c6eb353e78d3fb8b0f53db1bd258bb1aa001c1d5
+ requires_dist:
+ - numpy<2.0 ; python_full_version < '3.9'
+ - numpy>=2 ; python_full_version >= '3.9'
+ requires_python: '>=3.6'
+- conda: https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.4-h55fea9a_0.conda
+ sha256: 3900f9f2dbbf4129cf3ad6acf4e4b6f7101390b53843591c53b00f034343bc4d
+ md5: 11b3379b191f63139e29c0d19dee24cd
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ - libgcc >=14
+ - libpng >=1.6.50,<1.7.0a0
+ - libstdcxx >=14
+ - libtiff >=4.7.1,<4.8.0a0
+ - libzlib >=1.3.1,<2.0a0
+ license: BSD-2-Clause
+ license_family: BSD
+ purls: []
+ size: 355400
+ timestamp: 1758489294972
+- conda: https://conda.anaconda.org/conda-forge/linux-64/openjph-0.26.3-h8d634f6_0.conda
+ sha256: 4587e7762f27cad93619de77fa0573e2e17a899892d4bed3010196093e343533
+ md5: 792d5b6e99677177f5527a758a02bc07
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ - libstdcxx >=14
+ - libgcc >=14
+ - libtiff >=4.7.1,<4.8.0a0
+ license: BSD-2-Clause
+ license_family: BSD
+ purls: []
+ size: 279846
+ timestamp: 1771349499024
+- conda: https://conda.anaconda.org/conda-forge/linux-64/openldap-2.6.10-hbde042b_1.conda
+ sha256: 2e185a3dc2bdc4525dd68559efa3f24fa9159a76c40473e320732b35115163b2
+ md5: 3c40a106eadf7c14c6236ceddb267893
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ - cyrus-sasl >=2.1.28,<3.0a0
+ - krb5 >=1.22.2,<1.23.0a0
+ - libgcc >=14
+ - libstdcxx >=14
+ - openssl >=3.5.5,<4.0a0
+ license: OLDAP-2.8
+ license_family: BSD
+ purls: []
+ size: 785570
+ timestamp: 1771970256722
+- conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.1-h35e630c_1.conda
+ sha256: 44c877f8af015332a5d12f5ff0fb20ca32f896526a7d0cdb30c769df1144fb5c
+ md5: f61eb8cd60ff9057122a3d338b99c00f
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ - ca-certificates
+ - libgcc >=14
+ license: Apache-2.0
+ license_family: Apache
+ purls: []
+ size: 3164551
+ timestamp: 1769555830639
+- conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.0-pyhcf101f3_0.conda
+ sha256: c1fc0f953048f743385d31c468b4a678b3ad20caffdeaa94bed85ba63049fd58
+ md5: b76541e68fea4d511b1ac46a28dcd2c6
+ depends:
+ - python >=3.8
+ - python
+ license: Apache-2.0
+ license_family: APACHE
+ purls:
+ - pkg:pypi/packaging?source=compressed-mapping
+ size: 72010
+ timestamp: 1769093650580
+- conda: https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.47-haa7fec5_0.conda
+ sha256: 5e6f7d161356fefd981948bea5139c5aa0436767751a6930cb1ca801ebb113ff
+ md5: 7a3bff861a6583f1889021facefc08b1
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ - bzip2 >=1.0.8,<2.0a0
+ - libgcc >=14
+ - libzlib >=1.3.1,<2.0a0
+ license: BSD-3-Clause
+ license_family: BSD
+ purls: []
+ size: 1222481
+ timestamp: 1763655398280
+- conda: https://conda.anaconda.org/conda-forge/linux-64/pillow-12.1.1-py314h8ec4b1a_0.conda
+ sha256: 9e6ec8f3213e8b7d64b0ad45f84c51a2c9eba4398efda31e196c9a56186133ee
+ md5: 79678378ae235e24b3aa83cee1b38207
+ depends:
+ - python
+ - libgcc >=14
+ - __glibc >=2.17,<3.0.a0
+ - libwebp-base >=1.6.0,<2.0a0
+ - zlib-ng >=2.3.3,<2.4.0a0
+ - python_abi 3.14.* *_cp314
+ - tk >=8.6.13,<8.7.0a0
+ - libjpeg-turbo >=3.1.2,<4.0a0
+ - libxcb >=1.17.0,<2.0a0
+ - openjpeg >=2.5.4,<3.0a0
+ - lcms2 >=2.18,<3.0a0
+ - libtiff >=4.7.1,<4.8.0a0
+ - libfreetype >=2.14.1
+ - libfreetype6 >=2.14.1
+ license: HPND
+ purls:
+ - pkg:pypi/pillow?source=hash-mapping
+ size: 1073026
+ timestamp: 1770794002408
+- conda: https://conda.anaconda.org/conda-forge/linux-64/pixman-0.46.4-h54a6638_1.conda
+ sha256: 43d37bc9ca3b257c5dd7bf76a8426addbdec381f6786ff441dc90b1a49143b6a
+ md5: c01af13bdc553d1a8fbfff6e8db075f0
+ depends:
+ - libgcc >=14
+ - libstdcxx >=14
+ - libgcc >=14
+ - __glibc >=2.17,<3.0.a0
+ license: MIT
+ license_family: MIT
+ purls: []
+ size: 450960
+ timestamp: 1754665235234
+- conda: https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-hb9d3cd8_1002.conda
+ sha256: 9c88f8c64590e9567c6c80823f0328e58d3b1efb0e1c539c0315ceca764e0973
+ md5: b3c17d95b5a10c6e64a21fa17573e70e
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ - libgcc >=13
+ license: MIT
+ license_family: MIT
+ purls: []
+ size: 8252
+ timestamp: 1726802366959
+- pypi: https://files.pythonhosted.org/packages/0c/c3/44f3fbbfa403ea2a7c779186dc20772604442dde72947e7d01069cbe98e3/pycparser-3.0-py3-none-any.whl
+ name: pycparser
+ version: '3.0'
+ sha256: b727414169a36b7d524c1c3e31839a521725078d7b2ff038656844266160a992
+ requires_python: '>=3.10'
+- conda: https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.3.2-pyhcf101f3_0.conda
+ sha256: 417fba4783e528ee732afa82999300859b065dc59927344b4859c64aae7182de
+ md5: 3687cc0b82a8b4c17e1f0eb7e47163d5
+ depends:
+ - python >=3.10
+ - python
+ license: MIT
+ license_family: MIT
+ purls:
+ - pkg:pypi/pyparsing?source=hash-mapping
+ size: 110893
+ timestamp: 1769003998136
+- conda: https://conda.anaconda.org/conda-forge/linux-64/pyside6-6.10.2-py314h3987850_1.conda
+ sha256: 1d9b764ed6dec7ac3deb300e553700fbde821d8627776e929e68c2a22274fa98
+ md5: 572aaa4811844ba16c265647f06e1106
+ depends:
+ - python
+ - qt6-main 6.10.2.*
+ - libgcc >=14
+ - __glibc >=2.17,<3.0.a0
+ - libstdcxx >=14
+ - libxslt >=1.1.43,<2.0a0
+ - libopengl >=1.7.0,<2.0a0
+ - python_abi 3.14.* *_cp314
+ - qt6-main >=6.10.2,<6.11.0a0
+ - libegl >=1.7.0,<2.0a0
+ - libvulkan-loader >=1.4.341.0,<2.0a0
+ - libclang13 >=21.1.8
+ - libgl >=1.7.0,<2.0a0
+ - libxml2
+ - libxml2-16 >=2.14.6
+ license: LGPL-3.0-only
+ license_family: LGPL
+ purls:
+ - pkg:pypi/pyside6?source=hash-mapping
+ - pkg:pypi/shiboken6?source=hash-mapping
+ size: 13110239
+ timestamp: 1773742509847
+- conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.14.3-h32b2ec7_101_cp314.conda
+ build_number: 101
+ sha256: cb0628c5f1732f889f53a877484da98f5a0e0f47326622671396fb4f2b0cd6bd
+ md5: c014ad06e60441661737121d3eae8a60
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ - bzip2 >=1.0.8,<2.0a0
+ - ld_impl_linux-64 >=2.36.1
+ - libexpat >=2.7.3,<3.0a0
+ - libffi >=3.5.2,<3.6.0a0
+ - libgcc >=14
+ - liblzma >=5.8.2,<6.0a0
+ - libmpdec >=4.0.0,<5.0a0
+ - libsqlite >=3.51.2,<4.0a0
+ - libuuid >=2.41.3,<3.0a0
+ - libzlib >=1.3.1,<2.0a0
+ - ncurses >=6.5,<7.0a0
+ - openssl >=3.5.5,<4.0a0
+ - python_abi 3.14.* *_cp314
+ - readline >=8.3,<9.0a0
+ - tk >=8.6.13,<8.7.0a0
+ - tzdata
+ - zstd >=1.5.7,<1.6.0a0
+ license: Python-2.0
+ purls: []
+ size: 36702440
+ timestamp: 1770675584356
+ python_site_packages_path: lib/python3.14/site-packages
+- conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda
+ sha256: d6a17ece93bbd5139e02d2bd7dbfa80bee1a4261dced63f65f679121686bf664
+ md5: 5b8d21249ff20967101ffa321cab24e8
+ depends:
+ - python >=3.9
+ - six >=1.5
+ - python
+ license: Apache-2.0
+ license_family: APACHE
+ purls:
+ - pkg:pypi/python-dateutil?source=hash-mapping
+ size: 233310
+ timestamp: 1751104122689
+- conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314.conda
+ build_number: 8
+ sha256: ad6d2e9ac39751cc0529dd1566a26751a0bf2542adb0c232533d32e176e21db5
+ md5: 0539938c55b6b1a59b560e843ad864a4
+ constrains:
+ - python 3.14.* *_cp314
+ license: BSD-3-Clause
+ license_family: BSD
+ purls: []
+ size: 6989
+ timestamp: 1752805904792
+- conda: https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda
+ sha256: 776363493bad83308ba30bcb88c2552632581b143e8ee25b1982c8c743e73abc
+ md5: 353823361b1d27eb3960efb076dfcaf6
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ - libgcc-ng >=12
+ - libstdcxx-ng >=12
+ license: LicenseRef-Qhull
+ purls: []
+ size: 552937
+ timestamp: 1720813982144
+- conda: https://conda.anaconda.org/conda-forge/linux-64/qt6-main-6.10.2-pl5321h16c4a6b_6.conda
+ sha256: dd2fdde2cfecd29d4acd2bacbb341f00500d8b3b1c0583a8d92e07fc1e4b1106
+ md5: 3a00bff44c15ee37bfd5eb435e1b2a51
+ depends:
+ - libxcb
+ - xcb-util
+ - xcb-util-wm
+ - xcb-util-keysyms
+ - xcb-util-image
+ - xcb-util-renderutil
+ - xcb-util-cursor
+ - __glibc >=2.17,<3.0.a0
+ - libgcc >=14
+ - libstdcxx >=14
+ - xorg-libice >=1.1.2,<2.0a0
+ - icu >=78.3,<79.0a0
+ - libllvm22 >=22.1.0,<22.2.0a0
+ - krb5 >=1.22.2,<1.23.0a0
+ - xorg-libx11 >=1.8.13,<2.0a0
+ - xorg-libxtst >=1.2.5,<2.0a0
+ - libfreetype >=2.14.2
+ - libfreetype6 >=2.14.2
+ - libxml2
+ - libxml2-16 >=2.14.6
+ - libtiff >=4.7.1,<4.8.0a0
+ - libegl >=1.7.0,<2.0a0
+ - xorg-libxxf86vm >=1.1.7,<2.0a0
+ - libdrm >=2.4.125,<2.5.0a0
+ - xcb-util >=0.4.1,<0.5.0a0
+ - libbrotlicommon >=1.2.0,<1.3.0a0
+ - libbrotlienc >=1.2.0,<1.3.0a0
+ - libbrotlidec >=1.2.0,<1.3.0a0
+ - libvulkan-loader >=1.4.341.0,<2.0a0
+ - libclang-cpp22.1 >=22.1.0,<22.2.0a0
+ - double-conversion >=3.4.0,<3.5.0a0
+ - dbus >=1.16.2,<2.0a0
+ - xcb-util-renderutil >=0.3.10,<0.4.0a0
+ - alsa-lib >=1.2.15.3,<1.3.0a0
+ - wayland >=1.24.0,<2.0a0
+ - xcb-util-cursor >=0.1.6,<0.2.0a0
+ - libpng >=1.6.55,<1.7.0a0
+ - libclang13 >=22.1.0
+ - libwebp-base >=1.6.0,<2.0a0
+ - zstd >=1.5.7,<1.6.0a0
+ - pcre2 >=10.47,<10.48.0a0
+ - xorg-libxrandr >=1.5.5,<2.0a0
+ - libcups >=2.3.3,<2.4.0a0
+ - libpq >=18.3,<19.0a0
+ - libjpeg-turbo >=3.1.2,<4.0a0
+ - xorg-libxcomposite >=0.4.7,<1.0a0
+ - xcb-util-keysyms >=0.4.1,<0.5.0a0
+ - xorg-libxcursor >=1.2.3,<2.0a0
+ - harfbuzz >=13.1.1
+ - openssl >=3.5.5,<4.0a0
+ - fontconfig >=2.17.1,<3.0a0
+ - fonts-conda-ecosystem
+ - libxcb >=1.17.0,<2.0a0
+ - libzlib >=1.3.1,<2.0a0
+ - libsqlite >=3.52.0,<4.0a0
+ - xorg-libsm >=1.2.6,<2.0a0
+ - libgl >=1.7.0,<2.0a0
+ - libglib >=2.86.4,<3.0a0
+ - xorg-libxext >=1.3.7,<2.0a0
+ - libxkbcommon >=1.13.1,<2.0a0
+ - xorg-libxdamage >=1.1.6,<2.0a0
+ - xcb-util-image >=0.4.0,<0.5.0a0
+ - xcb-util-wm >=0.4.2,<0.5.0a0
+ constrains:
+ - qt ==6.10.2
+ license: LGPL-3.0-only
+ license_family: LGPL
+ purls: []
+ size: 58118322
+ timestamp: 1773865930316
+- conda: https://conda.anaconda.org/conda-forge/linux-64/rav1e-0.8.1-h1fbca29_0.conda
+ sha256: cf550bbc8e5ebedb6dba9ccaead3e07bd1cb86b183644a4c853e06e4b3ad5ac7
+ md5: d83958768626b3c8471ce032e28afcd3
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ - libgcc >=14
+ constrains:
+ - __glibc >=2.17
+ license: BSD-2-Clause
+ license_family: BSD
+ purls: []
+ size: 5595970
+ timestamp: 1772540833621
+- pypi: https://files.pythonhosted.org/packages/cc/b4/817944e9cbf8a3f6a8a0d1914fa68a28effb3b455dd57a244684b79bfac7/raylib-5.5.0.4-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
+ name: raylib
+ version: 5.5.0.4
+ sha256: 9784976d71ef1e95ed4e652c410052c22dcc3f59fee752784fdb6e1d702b2e97
+ requires_dist:
+ - cffi>=1.15.1
+- conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-h853b02a_0.conda
+ sha256: 12ffde5a6f958e285aa22c191ca01bbd3d6e710aa852e00618fa6ddc59149002
+ md5: d7d95fc8287ea7bf33e0e7116d2b95ec
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ - libgcc >=14
+ - ncurses >=6.5,<7.0a0
+ license: GPL-3.0-only
+ license_family: GPL
+ purls: []
+ size: 345073
+ timestamp: 1765813471974
+- conda: https://conda.anaconda.org/conda-forge/linux-64/scipy-1.17.1-py314hf07bd8e_0.conda
+ sha256: 1ae427836d7979779c9005388a05993a3addabcc66c4422694639a4272d7d972
+ md5: d0510124f87c75403090e220db1e9d41
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ - libblas >=3.9.0,<4.0a0
+ - libcblas >=3.9.0,<4.0a0
+ - libgcc >=14
+ - libgfortran
+ - libgfortran5 >=14.3.0
+ - liblapack >=3.9.0,<4.0a0
+ - libstdcxx >=14
+ - numpy <2.7
+ - numpy >=1.23,<3
+ - numpy >=1.25.2
+ - python >=3.14,<3.15.0a0
+ - python_abi 3.14.* *_cp314
+ license: BSD-3-Clause
+ license_family: BSD
+ purls:
+ - pkg:pypi/scipy?source=compressed-mapping
+ size: 17225275
+ timestamp: 1771880751368
+- conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda
+ sha256: 458227f759d5e3fcec5d9b7acce54e10c9e1f4f4b7ec978f3bfd54ce4ee9853d
+ md5: 3339e3b65d58accf4ca4fb8748ab16b3
+ depends:
+ - python >=3.9
+ - python
+ license: MIT
+ license_family: MIT
+ purls:
+ - pkg:pypi/six?source=hash-mapping
+ size: 18455
+ timestamp: 1753199211006
+- conda: https://conda.anaconda.org/conda-forge/linux-64/snappy-1.2.2-h03e3b7b_1.conda
+ sha256: 48f3f6a76c34b2cfe80de9ce7f2283ecb55d5ed47367ba91e8bb8104e12b8f11
+ md5: 98b6c9dc80eb87b2519b97bcf7e578dd
+ depends:
+ - libgcc >=14
+ - __glibc >=2.17,<3.0.a0
+ - libstdcxx >=14
+ - libgcc >=14
+ license: BSD-3-Clause
+ license_family: BSD
+ purls: []
+ size: 45829
+ timestamp: 1762948049098
+- conda: https://conda.anaconda.org/conda-forge/linux-64/svt-av1-4.0.1-hecca717_0.conda
+ sha256: 4a1d2005153b9454fc21c9bad1b539df189905be49e851ec62a6212c2e045381
+ md5: 2a2170a3e5c9a354d09e4be718c43235
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ - libgcc >=14
+ - libstdcxx >=14
+ license: BSD-2-Clause
+ license_family: BSD
+ purls: []
+ size: 2619743
+ timestamp: 1769664536467
+- conda: https://conda.anaconda.org/conda-forge/noarch/tifffile-2026.3.3-pyhd8ed1ab_0.conda
+ sha256: da24795c3000566167fbb51c0933acd7a46fe2661375ad4d8a1748aab2bc9537
+ md5: cecacab21bc8f4ed17fac11bc8b08cf0
+ depends:
+ - imagecodecs >=2025.11.11
+ - numpy >=1.19.2
+ - python >=3.11
+ constrains:
+ - matplotlib-base >=3.3
+ license: BSD-3-Clause
+ license_family: BSD
+ purls:
+ - pkg:pypi/tifffile?source=compressed-mapping
+ size: 193137
+ timestamp: 1772701074188
+- conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h366c992_103.conda
+ sha256: cafeec44494f842ffeca27e9c8b0c27ed714f93ac77ddadc6aaf726b5554ebac
+ md5: cffd3bdd58090148f4cfcd831f4b26ab
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ - libgcc >=14
+ - libzlib >=1.3.1,<2.0a0
+ constrains:
+ - xorg-libx11 >=1.8.12,<2.0a0
+ license: TCL
+ license_family: BSD
+ purls: []
+ size: 3301196
+ timestamp: 1769460227866
+- conda: https://conda.anaconda.org/conda-forge/linux-64/tornado-6.5.3-py314h5bd0f2a_0.conda
+ sha256: b8f9f9ae508d79c9c697eb01b6a8d2ed4bc1899370f44aa6497c8abbd15988ea
+ md5: e35f08043f54d26a1be93fdbf90d30c3
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ - libgcc >=14
+ - python >=3.14,<3.15.0a0
+ - python_abi 3.14.* *_cp314
+ license: Apache-2.0
+ license_family: Apache
+ purls:
+ - pkg:pypi/tornado?source=hash-mapping
+ size: 905436
+ timestamp: 1765458949518
+- conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda
+ sha256: 1d30098909076af33a35017eed6f2953af1c769e273a0626a04722ac4acaba3c
+ md5: ad659d0a2b3e47e38d829aa8cad2d610
+ license: LicenseRef-Public-Domain
+ purls: []
+ size: 119135
+ timestamp: 1767016325805
+- conda: https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-17.0.1-py314h5bd0f2a_0.conda
+ sha256: ff1c1d7c23b91c9b0eb93a3e1380f4e2ac6c37ea2bba4f932a5484e9a55bba30
+ md5: 494fdf358c152f9fdd0673c128c2f3dd
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ - libgcc >=14
+ - python >=3.14,<3.15.0a0
+ - python_abi 3.14.* *_cp314
+ license: Apache-2.0
+ license_family: Apache
+ purls:
+ - pkg:pypi/unicodedata2?source=hash-mapping
+ size: 409562
+ timestamp: 1770909102180
+- conda: https://conda.anaconda.org/conda-forge/linux-64/wayland-1.25.0-hd6090a7_0.conda
+ sha256: ea374d57a8fcda281a0a89af0ee49a2c2e99cc4ac97cf2e2db7064e74e764bdb
+ md5: 996583ea9c796e5b915f7d7580b51ea6
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ - libexpat >=2.7.4,<3.0a0
+ - libffi >=3.5.2,<3.6.0a0
+ - libgcc >=14
+ - libstdcxx >=14
+ license: MIT
+ license_family: MIT
+ purls: []
+ size: 334139
+ timestamp: 1773959575393
+- conda: https://conda.anaconda.org/conda-forge/linux-64/xcb-util-0.4.1-h4f16b4b_2.conda
+ sha256: ad8cab7e07e2af268449c2ce855cbb51f43f4664936eff679b1f3862e6e4b01d
+ md5: fdc27cb255a7a2cc73b7919a968b48f0
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ - libgcc >=13
+ - libxcb >=1.17.0,<2.0a0
+ license: MIT
+ license_family: MIT
+ purls: []
+ size: 20772
+ timestamp: 1750436796633
+- conda: https://conda.anaconda.org/conda-forge/linux-64/xcb-util-cursor-0.1.6-hb03c661_0.conda
+ sha256: c2be9cae786fdb2df7c2387d2db31b285cf90ab3bfabda8fa75a596c3d20fc67
+ md5: 4d1fc190b99912ed557a8236e958c559
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ - libgcc >=14
+ - libxcb >=1.13
+ - libxcb >=1.17.0,<2.0a0
+ - xcb-util-image >=0.4.0,<0.5.0a0
+ - xcb-util-renderutil >=0.3.10,<0.4.0a0
+ license: MIT
+ license_family: MIT
+ purls: []
+ size: 20829
+ timestamp: 1763366954390
+- conda: https://conda.anaconda.org/conda-forge/linux-64/xcb-util-image-0.4.0-hb711507_2.conda
+ sha256: 94b12ff8b30260d9de4fd7a28cca12e028e572cbc504fd42aa2646ec4a5bded7
+ md5: a0901183f08b6c7107aab109733a3c91
+ depends:
+ - libgcc-ng >=12
+ - libxcb >=1.16,<2.0.0a0
+ - xcb-util >=0.4.1,<0.5.0a0
+ license: MIT
+ license_family: MIT
+ purls: []
+ size: 24551
+ timestamp: 1718880534789
+- conda: https://conda.anaconda.org/conda-forge/linux-64/xcb-util-keysyms-0.4.1-hb711507_0.conda
+ sha256: 546e3ee01e95a4c884b6401284bb22da449a2f4daf508d038fdfa0712fe4cc69
+ md5: ad748ccca349aec3e91743e08b5e2b50
+ depends:
+ - libgcc-ng >=12
+ - libxcb >=1.16,<2.0.0a0
+ license: MIT
+ license_family: MIT
+ purls: []
+ size: 14314
+ timestamp: 1718846569232
+- conda: https://conda.anaconda.org/conda-forge/linux-64/xcb-util-renderutil-0.3.10-hb711507_0.conda
+ sha256: 2d401dadc43855971ce008344a4b5bd804aca9487d8ebd83328592217daca3df
+ md5: 0e0cbe0564d03a99afd5fd7b362feecd
+ depends:
+ - libgcc-ng >=12
+ - libxcb >=1.16,<2.0.0a0
+ license: MIT
+ license_family: MIT
+ purls: []
+ size: 16978
+ timestamp: 1718848865819
+- conda: https://conda.anaconda.org/conda-forge/linux-64/xcb-util-wm-0.4.2-hb711507_0.conda
+ sha256: 31d44f297ad87a1e6510895740325a635dd204556aa7e079194a0034cdd7e66a
+ md5: 608e0ef8256b81d04456e8d211eee3e8
+ depends:
+ - libgcc-ng >=12
+ - libxcb >=1.16,<2.0.0a0
+ license: MIT
+ license_family: MIT
+ purls: []
+ size: 51689
+ timestamp: 1718844051451
+- conda: https://conda.anaconda.org/conda-forge/linux-64/xkeyboard-config-2.47-hb03c661_0.conda
+ sha256: 19c2bb14bec84b0e995b56b752369775c75f1589314b43733948bb5f471a6915
+ md5: b56e0c8432b56decafae7e78c5f29ba5
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ - libgcc >=14
+ - xorg-libx11 >=1.8.13,<2.0a0
+ license: MIT
+ license_family: MIT
+ purls: []
+ size: 399291
+ timestamp: 1772021302485
+- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libice-1.1.2-hb9d3cd8_0.conda
+ sha256: c12396aabb21244c212e488bbdc4abcdef0b7404b15761d9329f5a4a39113c4b
+ md5: fb901ff28063514abb6046c9ec2c4a45
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ - libgcc >=13
+ license: MIT
+ license_family: MIT
+ purls: []
+ size: 58628
+ timestamp: 1734227592886
+- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libsm-1.2.6-he73a12e_0.conda
+ sha256: 277841c43a39f738927145930ff963c5ce4c4dacf66637a3d95d802a64173250
+ md5: 1c74ff8c35dcadf952a16f752ca5aa49
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ - libgcc >=13
+ - libuuid >=2.38.1,<3.0a0
+ - xorg-libice >=1.1.2,<2.0a0
+ license: MIT
+ license_family: MIT
+ purls: []
+ size: 27590
+ timestamp: 1741896361728
+- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.13-he1eb515_0.conda
+ sha256: 516d4060139dbb4de49a4dcdc6317a9353fb39ebd47789c14e6fe52de0deee42
+ md5: 861fb6ccbc677bb9a9fb2468430b9c6a
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ - libgcc >=14
+ - libxcb >=1.17.0,<2.0a0
+ license: MIT
+ license_family: MIT
+ purls: []
+ size: 839652
+ timestamp: 1770819209719
+- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.12-hb03c661_1.conda
+ sha256: 6bc6ab7a90a5d8ac94c7e300cc10beb0500eeba4b99822768ca2f2ef356f731b
+ md5: b2895afaf55bf96a8c8282a2e47a5de0
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ - libgcc >=14
+ license: MIT
+ license_family: MIT
+ purls: []
+ size: 15321
+ timestamp: 1762976464266
+- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxcomposite-0.4.7-hb03c661_0.conda
+ sha256: 048c103000af9541c919deef03ae7c5e9c570ffb4024b42ecb58dbde402e373a
+ md5: f2ba4192d38b6cef2bb2c25029071d90
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ - libgcc >=14
+ - xorg-libx11 >=1.8.12,<2.0a0
+ - xorg-libxfixes >=6.0.2,<7.0a0
+ license: MIT
+ license_family: MIT
+ purls: []
+ size: 14415
+ timestamp: 1770044404696
+- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxcursor-1.2.3-hb9d3cd8_0.conda
+ sha256: 832f538ade441b1eee863c8c91af9e69b356cd3e9e1350fff4fe36cc573fc91a
+ md5: 2ccd714aa2242315acaf0a67faea780b
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ - libgcc >=13
+ - xorg-libx11 >=1.8.10,<2.0a0
+ - xorg-libxfixes >=6.0.1,<7.0a0
+ - xorg-libxrender >=0.9.11,<0.10.0a0
+ license: MIT
+ license_family: MIT
+ purls: []
+ size: 32533
+ timestamp: 1730908305254
+- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdamage-1.1.6-hb9d3cd8_0.conda
+ sha256: 43b9772fd6582bf401846642c4635c47a9b0e36ca08116b3ec3df36ab96e0ec0
+ md5: b5fcc7172d22516e1f965490e65e33a4
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ - libgcc >=13
+ - xorg-libx11 >=1.8.10,<2.0a0
+ - xorg-libxext >=1.3.6,<2.0a0
+ - xorg-libxfixes >=6.0.1,<7.0a0
+ license: MIT
+ license_family: MIT
+ purls: []
+ size: 13217
+ timestamp: 1727891438799
+- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb03c661_1.conda
+ sha256: 25d255fb2eef929d21ff660a0c687d38a6d2ccfbcbf0cc6aa738b12af6e9d142
+ md5: 1dafce8548e38671bea82e3f5c6ce22f
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ - libgcc >=14
+ license: MIT
+ license_family: MIT
+ purls: []
+ size: 20591
+ timestamp: 1762976546182
+- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.7-hb03c661_0.conda
+ sha256: 79c60fc6acfd3d713d6340d3b4e296836a0f8c51602327b32794625826bd052f
+ md5: 34e54f03dfea3e7a2dcf1453a85f1085
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ - libgcc >=14
+ - xorg-libx11 >=1.8.12,<2.0a0
+ license: MIT
+ license_family: MIT
+ purls: []
+ size: 50326
+ timestamp: 1769445253162
+- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-6.0.2-hb03c661_0.conda
+ sha256: 83c4c99d60b8784a611351220452a0a85b080668188dce5dfa394b723d7b64f4
+ md5: ba231da7fccf9ea1e768caf5c7099b84
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ - libgcc >=14
+ - xorg-libx11 >=1.8.12,<2.0a0
+ license: MIT
+ license_family: MIT
+ purls: []
+ size: 20071
+ timestamp: 1759282564045
+- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.8.2-hb9d3cd8_0.conda
+ sha256: 1a724b47d98d7880f26da40e45f01728e7638e6ec69f35a3e11f92acd05f9e7a
+ md5: 17dcc85db3c7886650b8908b183d6876
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ - libgcc >=13
+ - xorg-libx11 >=1.8.10,<2.0a0
+ - xorg-libxext >=1.3.6,<2.0a0
+ - xorg-libxfixes >=6.0.1,<7.0a0
+ license: MIT
+ license_family: MIT
+ purls: []
+ size: 47179
+ timestamp: 1727799254088
+- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxrandr-1.5.5-hb03c661_0.conda
+ sha256: 80ed047a5cb30632c3dc5804c7716131d767089f65877813d4ae855ee5c9d343
+ md5: e192019153591938acf7322b6459d36e
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ - libgcc >=14
+ - xorg-libx11 >=1.8.12,<2.0a0
+ - xorg-libxext >=1.3.6,<2.0a0
+ - xorg-libxrender >=0.9.12,<0.10.0a0
+ license: MIT
+ license_family: MIT
+ purls: []
+ size: 30456
+ timestamp: 1769445263457
+- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxrender-0.9.12-hb9d3cd8_0.conda
+ sha256: 044c7b3153c224c6cedd4484dd91b389d2d7fd9c776ad0f4a34f099b3389f4a1
+ md5: 96d57aba173e878a2089d5638016dc5e
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ - libgcc >=13
+ - xorg-libx11 >=1.8.10,<2.0a0
+ license: MIT
+ license_family: MIT
+ purls: []
+ size: 33005
+ timestamp: 1734229037766
+- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxtst-1.2.5-hb9d3cd8_3.conda
+ sha256: 752fdaac5d58ed863bbf685bb6f98092fe1a488ea8ebb7ed7b606ccfce08637a
+ md5: 7bbe9a0cc0df0ac5f5a8ad6d6a11af2f
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ - libgcc >=13
+ - xorg-libx11 >=1.8.10,<2.0a0
+ - xorg-libxext >=1.3.6,<2.0a0
+ - xorg-libxi >=1.7.10,<2.0a0
+ license: MIT
+ license_family: MIT
+ purls: []
+ size: 32808
+ timestamp: 1727964811275
+- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxxf86vm-1.1.7-hb03c661_0.conda
+ sha256: 64db17baaf36fa03ed8fae105e2e671a7383e22df4077486646f7dbf12842c9f
+ md5: 665d152b9c6e78da404086088077c844
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ - libgcc >=14
+ - xorg-libx11 >=1.8.12,<2.0a0
+ - xorg-libxext >=1.3.6,<2.0a0
+ license: MIT
+ license_family: MIT
+ purls: []
+ size: 18701
+ timestamp: 1769434732453
+- conda: https://conda.anaconda.org/conda-forge/linux-64/zfp-1.0.1-h909a3a2_5.conda
+ sha256: 5fabe6cccbafc1193038862b0b0d784df3dae84bc48f12cac268479935f9c8b7
+ md5: 6a0eb48e58684cca4d7acc8b7a0fd3c7
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ - _openmp_mutex >=4.5
+ - libgcc >=14
+ - libstdcxx >=14
+ license: BSD-3-Clause
+ license_family: BSD
+ purls: []
+ size: 277694
+ timestamp: 1766549572069
+- conda: https://conda.anaconda.org/conda-forge/linux-64/zlib-ng-2.3.3-hceb46e0_1.conda
+ sha256: ea4e50c465d70236408cb0bfe0115609fd14db1adcd8bd30d8918e0291f8a75f
+ md5: 2aadb0d17215603a82a2a6b0afd9a4cb
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ - libgcc >=14
+ - libstdcxx >=14
+ license: Zlib
+ license_family: Other
+ purls: []
+ size: 122618
+ timestamp: 1770167931827
+- conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda
+ sha256: 68f0206ca6e98fea941e5717cec780ed2873ffabc0e1ed34428c061e2c6268c7
+ md5: 4a13eeac0b5c8e5b8ab496e6c4ddd829
+ depends:
+ - __glibc >=2.17,<3.0.a0
+ - libzlib >=1.3.1,<2.0a0
+ license: BSD-3-Clause
+ license_family: BSD
+ purls: []
+ size: 601375
+ timestamp: 1764777111296
diff --git a/pixi.toml b/pixi.toml
new file mode 100644
index 0000000..314fca6
--- /dev/null
+++ b/pixi.toml
@@ -0,0 +1,19 @@
+[workspace]
+authors = ["n <n@gate.local.lan>"]
+channels = ["conda-forge"]
+name = "SegManip"
+platforms = ["linux-64"]
+version = "0.1.0"
+
+[tasks]
+
+[dependencies]
+numpy = ">=2.4.3,<3"
+tifffile = ">=2026.3.3,<2027"
+mapbox_earcut = ">=1.0.3,<2"
+matplotlib = ">=3.10.8,<4"
+scipy = ">=1.17.1,<2"
+
+[pypi-dependencies]
+raylib = ">=5.5.0.4, <6"
+opencv-python = ">=4.13.0.92, <5"
diff --git a/topology.py b/topology.py
new file mode 100644
index 0000000..27ecc0c
--- /dev/null
+++ b/topology.py
@@ -0,0 +1,153 @@
+import numpy as np
+import cv2
+from scipy.ndimage import label
+
+def extract_boundaries(segmentation_mask, simplify_tolerance=2.0):
+ """
+ Extract shared boundary vertices from a segmentation mask.
+ Returns:
+ vertices: List of [x, y] coordinates.
+ regions: List of dicts, each containing:
+ 'original_id': The mask ID.
+ 'vertex_indices': List of lists of indices into `vertices` array,
+ representing the outer contour and holes.
+ 'color': Display color.
+ """
+ height, width = segmentation_mask.shape
+ unique_ids = np.unique(segmentation_mask)
+ structure = np.array([[0,1,0],[1,1,1],[0,1,0]])
+
+ # We will build a unified list of vertices to share them.
+ # To do this efficiently, we'll first extract all contours for all regions.
+ # Then we will snap close vertices together.
+
+ all_contours = [] # list of (uid, contour_points)
+
+ for uid in unique_ids:
+ if uid == 0:
+ continue
+
+ bin_mask = (segmentation_mask == uid).astype(np.uint8)
+ labeled_mask, num_features = label(bin_mask, structure=structure)
+
+ for region_idx in range(1, num_features + 1):
+ region_mask = (labeled_mask == region_idx).astype(np.uint8)
+
+ # Find contours
+ contours, _ = cv2.findContours(region_mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_TC89_L1)
+
+ for contour in contours:
+ if len(contour) < 3:
+ continue
+
+ # Simplify contour to reduce vertex count (critical for performance and dragging)
+ simplified = cv2.approxPolyDP(contour, simplify_tolerance, True)
+ if len(simplified) < 3:
+ continue
+
+ # Reshape to (N, 2)
+ pts = simplified.reshape(-1, 2)
+ all_contours.append((uid, pts))
+
+ # Now unify the vertices. If two vertices are very close, they map to the same shared vertex.
+ # This allows dragging a boundary point to deform both regions.
+ shared_vertices = []
+ vertex_map = {} # maps quantized (x,y) to index in shared_vertices
+
+ regions = []
+
+ # Quantize grid size for snapping vertices together
+ snap_dist = 3.0
+
+ for uid, pts in all_contours:
+ current_region_indices = []
+ for pt in pts:
+ x, y = pt[0], pt[1]
+
+ # Find if there is a vertex close enough
+ # For exact sharing we could just use (x,y), but cv2 contours on adjacent regions
+ # might be off by 1 pixel. We snap them to a grid or search.
+ # A simple spatial dictionary works well if we assume borders are exactly touching or within 1-2px
+ qx, qy = int(np.round(x / snap_dist)), int(np.round(y / snap_dist))
+
+ # check neighbors
+ found_idx = -1
+ for dx in [-1, 0, 1]:
+ for dy in [-1, 0, 1]:
+ if (qx+dx, qy+dy) in vertex_map:
+ # Check exact distance just in case
+ v_idx = vertex_map[(qx+dx, qy+dy)]
+ vx, vy = shared_vertices[v_idx]
+ if (x-vx)**2 + (y-vy)**2 <= snap_dist**2:
+ found_idx = v_idx
+ break
+ if found_idx != -1:
+ break
+
+ if found_idx == -1:
+ # Add new vertex
+ found_idx = len(shared_vertices)
+ shared_vertices.append([float(x), float(y)])
+ vertex_map[(qx, qy)] = found_idx
+
+ current_region_indices.append(found_idx)
+
+ import pyray as pr
+ color = pr.Color(np.random.randint(50, 255), np.random.randint(50, 255), np.random.randint(50, 255), 255)
+
+ regions.append({
+ 'original_id': uid,
+ 'vertex_indices': current_region_indices,
+ 'color': color
+ })
+
+ return shared_vertices, regions
+
+def reconstruct_mask(vertices, regions, width, height):
+ """
+ Rasterize the regions defined by vertices back into a uint16 segmentation mask.
+ """
+ output_mask = np.zeros((height, width), dtype=np.uint16)
+
+ for region in regions:
+ uid = region['original_id']
+ indices = region['vertex_indices']
+
+ if len(indices) < 3:
+ continue
+
+ # Gather (x,y) coordinates for this poly
+ poly_pts = []
+ for idx in indices:
+ poly_pts.append(vertices[idx])
+
+ # cv2 fillPoly expects int32 coordinates in shape (N, 1, 2)
+ pts = np.array(poly_pts, dtype=np.int32).reshape((-1, 1, 2))
+
+ cv2.fillPoly(output_mask, [pts], int(uid))
+ # Polylines help cover exact mathematical edge boundaries depending on thickness
+ cv2.polylines(output_mask, [pts], True, int(uid), thickness=2)
+
+ # Now patch tiny 1-2 pixel rasterization gaps left behind
+ # But ONLY in narrow interstitial boundary spaces between *different* masks,
+ # not dilating out into massive valid empty background spaces.
+ zero_mask = (output_mask == 0)
+
+ if np.any(zero_mask):
+ from scipy.ndimage import distance_transform_edt
+
+ # Compute distance to the *nearest* non-zero pixel
+ global_mask = ~zero_mask
+ dist, inds = distance_transform_edt(zero_mask, return_distances=True, return_indices=True)
+
+ # We only want to fill pixels that are very close to an edge (<= 2 pixels)
+ # AND we only want to fill them if they are in a "crack" between segmentations.
+ # A simple heuristic for a crack vs open space is just strictly limiting to dist <= 1.5.
+ # This will fill 1-pixel jagged gaps and touching boundaries, but will leave
+ # actual hollow spaces alone (since it only dilates 1 pixel inward).
+ fill_candidates = zero_mask & (dist <= 1.5)
+
+ # Apply the nearest labels where there are gaps
+ output_mask[fill_candidates] = output_mask[tuple(inds[:, fill_candidates])]
+
+ return output_mask
diff --git a/usage.md b/usage.md
new file mode 100644
index 0000000..a36f5c2
--- /dev/null
+++ b/usage.md
@@ -0,0 +1,24 @@
+# Segmentation Editor
+
+## Editor Controls
+
+### Mouse Controls
+
+- **Right Click**: Pan the view.
+- **Left Click**: Select a vertex.
+- **Drag**: Move a vertex.
+- **Scroll**: Zoom in and out.
+- **Double Left Click**: Then press the following keys within 5 seconds
+ - **N**: Create a new segmentation if double click was over empty space.
+ - **N**: Create a new vertex if double click was over segmentation.
+ - **D**: Delete the selected segmentation.
+
+### Keyboard Controls
+
+- **Escape**: Leave the editor.
+- **Arrow Keys**: Pan the view.
+- **S**: Save the segmentation.
+
+### File Drag and Drop
+
+- **Drag and Drop**: Drag and drop an image and a segmentation to open them.