From 2199647a7a76ea02a4f592b773ac3be505cf151e Mon Sep 17 00:00:00 2001 From: dimonDDL Date: Wed, 29 May 2024 13:53:09 +0200 Subject: [PATCH 01/27] Added rudimentary support for T2S+ v2 --- ht301_hacklib.py | 56 ++++++++++++++++++++++++++++++++++++++++++++++-- pyplot.py | 2 ++ 2 files changed, 56 insertions(+), 2 deletions(-) diff --git a/ht301_hacklib.py b/ht301_hacklib.py index 0b3094b..0a59865 100755 --- a/ht301_hacklib.py +++ b/ht301_hacklib.py @@ -2,6 +2,7 @@ import math from sys import platform from typing import Tuple +from time import sleep import cv2 import numpy as np @@ -54,12 +55,19 @@ class Camera: fourLinePara:int cap:cv2.VideoCapture frame_raw_u16:np.ndarray - def __init__(self, video_dev:cv2.VideoCapture|None=None) -> None: + + camera_raw = False + reference_frame = None + offset_mean = 0.0 + dead_pixels_mask = None + + def __init__(self, video_dev:cv2.VideoCapture|None=None, camera_raw = False) -> None: if video_dev is None: video_dev = self.find_device() if not video_dev: raise Exception("No video device found!") self.cap = video_dev + self.camera_raw = camera_raw self.height = int(self.cap.get(cv2.CAP_PROP_FRAME_HEIGHT))-ROWS_SPECIAL_DATA self.width = int(self.cap.get(cv2.CAP_PROP_FRAME_WIDTH)) @@ -99,11 +107,17 @@ def find_device(cls) -> cv2.VideoCapture: raise ValueError(f"Cannot find camera with a width of one of {cls.supported_resolutions} that also matches: {width=} and {height=}") def info(self) -> Tuple[dict, np.ndarray]: + # TODO fix this readout shutTemper = read_u16(self.frame_raw_u16, self.fourLinePara + self.amountPixels + 1) floatShutTemper = shutTemper / 10.0 - self.ZEROC + print(f"Raw shut temp: {shutTemper}, float shut temp: {floatShutTemper}") + floatShutTemper = 20.0 + # TODO fix this readout coreTemper = read_u16(self.frame_raw_u16, self.fourLinePara + self.amountPixels + 2) floatCoreTemper = coreTemper / 10.0 - self.ZEROC + print(f"Raw core temp: {coreTemper}, float core temp: {floatCoreTemper}") + floatCoreTemper = 20.0 cal_00 = float(read_u16(self.frame_raw_u16, self.fourLinePara + self.amountPixels)) self.cal_01 = read_f32(self.frame_raw_u16, self.fourLinePara + self.amountPixels + 3) @@ -208,6 +222,19 @@ def read(self) -> Tuple[bool, np.ndarray]: ret, frame_raw = self.cap.read() self.frame_raw_u16: np.ndarray = frame_raw.view(np.uint16).ravel() frame_visible = self.frame_raw_u16[:self.fourLinePara].copy().reshape(self.height, self.width) + if self.reference_frame is not None: + frame_float = frame_visible.astype(np.float32) + + corrected_frame = frame_float - self.reference_frame + self.offset_mean + + corrected_frame = np.clip(corrected_frame, 0, 65535) + + if self.dead_pixels_mask is not None: + inpaint_radius = 3 + corrected_frame = cv2.inpaint(corrected_frame, self.dead_pixels_mask, inpaint_radius, cv2.INPAINT_TELEA) + + frame_visible = corrected_frame.astype(np.uint16) + return ret, frame_visible def set_correction(self, correction: float) -> None: @@ -289,9 +316,34 @@ def set_point(self, x: int, y: int, index: int) -> None: self.cap.set(cv2.CAP_PROP_ZOOM, x1) self.cap.set(cv2.CAP_PROP_ZOOM, y1) + def calibrate_raw(self) -> None: + '''Camera calibration for cameras that return raw data only''' + # uniformity correction + sleep(0.5) # wait for the camera to get ready + self.cap.set(cv2.CAP_PROP_ZOOM, 0x8000) # close shutter + sleep(0.3) # wait for the shutter to close + + ret, frame_visible = self.read() + + if ret: + self.reference_frame = frame_visible.astype(np.float32) + self.offset_mean = np.mean(self.reference_frame) + else: + raise RuntimeError("Failed to capture reference frame") + + # dead pixel correction + threshold = 0.01 + self.dead_pixels_mask = cv2.inRange(frame_visible.astype(np.float32), 0, threshold).astype(np.uint8) + + print(f"Found {np.count_nonzero(self.dead_pixels_mask)} dead pixels") + print(f"At: {np.argwhere(self.dead_pixels_mask)}") + def calibrate(self) -> None: '''camera calibration''' - self.cap.set(cv2.CAP_PROP_ZOOM, 0x8000) + if self.camera_raw: + self.calibrate_raw() + else: + self.cap.set(cv2.CAP_PROP_ZOOM, 0x8000) def release(self) -> None: ''' Release cap opencv ''' diff --git a/pyplot.py b/pyplot.py index fb3df48..4c0a3d0 100755 --- a/pyplot.py +++ b/pyplot.py @@ -24,6 +24,8 @@ camera:ht301_hacklib.Camera if sys.argv[-1].endswith('.npy'): camera = ht301_hacklib.CameraEmulator(sys.argv[-1]) +elif '-r' in sys.argv or '--rawcam' in sys.argv: + camera = ht301_hacklib.Camera(camera_raw=True) else: camera = ht301_hacklib.Camera() From 62808e1215089b0b99299d8424ab4ff5761e72a2 Mon Sep 17 00:00:00 2001 From: dmytro Date: Wed, 29 May 2024 20:48:58 +0200 Subject: [PATCH 02/27] Added comprehensive support for T2S+ v2 --- .gitignore | 3 ++- ht301_hacklib.py | 65 +++++++++++++++++++++++++++++++++++++++++++++--- pyplot.py | 46 +++++++++++++++++++++++----------- 3 files changed, 95 insertions(+), 19 deletions(-) diff --git a/.gitignore b/.gitignore index ed8ebf5..f53d18e 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ -__pycache__ \ No newline at end of file +__pycache__ +.vscode diff --git a/ht301_hacklib.py b/ht301_hacklib.py index 0a59865..426f518 100755 --- a/ht301_hacklib.py +++ b/ht301_hacklib.py @@ -2,6 +2,7 @@ import math from sys import platform from typing import Tuple +import time from time import sleep import cv2 @@ -83,6 +84,10 @@ def __init__(self, video_dev:cv2.VideoCapture|None=None, camera_raw = False) -> # using Raw mode 16 bit data self.cap.set(cv2.CAP_PROP_ZOOM, 0x8004) + # Wait for the camera to apply the temperature range change + self.wait_for_range_application() + + # Calibrate the camera self.calibrate() @@ -110,13 +115,13 @@ def info(self) -> Tuple[dict, np.ndarray]: # TODO fix this readout shutTemper = read_u16(self.frame_raw_u16, self.fourLinePara + self.amountPixels + 1) floatShutTemper = shutTemper / 10.0 - self.ZEROC - print(f"Raw shut temp: {shutTemper}, float shut temp: {floatShutTemper}") + #print(f"Raw shut temp: {shutTemper}, float shut temp: {floatShutTemper}") floatShutTemper = 20.0 # TODO fix this readout coreTemper = read_u16(self.frame_raw_u16, self.fourLinePara + self.amountPixels + 2) floatCoreTemper = coreTemper / 10.0 - self.ZEROC - print(f"Raw core temp: {coreTemper}, float core temp: {floatCoreTemper}") + #print(f"Raw core temp: {coreTemper}, float core temp: {floatCoreTemper}") floatCoreTemper = 20.0 cal_00 = float(read_u16(self.frame_raw_u16, self.fourLinePara + self.amountPixels)) @@ -318,11 +323,16 @@ def set_point(self, x: int, y: int, index: int) -> None: def calibrate_raw(self) -> None: '''Camera calibration for cameras that return raw data only''' + self.reference_frame = None + self.offset_mean = 0.0 + self.dead_pixels_mask = None # uniformity correction - sleep(0.5) # wait for the camera to get ready + sleep(0.5) self.cap.set(cv2.CAP_PROP_ZOOM, 0x8000) # close shutter sleep(0.3) # wait for the shutter to close - + self.flush_buffer() + # by issuing this command faster than once per second, we can keep the shutter closed + self.cap.set(cv2.CAP_PROP_ZOOM, 0x8000) ret, frame_visible = self.read() if ret: @@ -421,6 +431,53 @@ def temperature_range_high(self): self.correction_coefficient_m = 1.17 self.correction_coefficient_b = -40.9 + def wait_for_range_application(self, timeout=20): + """Wait for the camera to apply the temperature range change, this is detected when the video stops being uniform""" + print("Waiting for camera to stabilize...") + start_time = time.time() + done = False + while time.time() - start_time < timeout: + ret, frame_visible = self.read() + if ret and np.std(frame_visible) > 0: + done = True + break + time.sleep(0.1) + + if self.camera_raw: + # Now we keep the shutter open and wait for the camera to stabilize, + # we do this by running the calibration, waiting a bit and checking the average + # of all the pixels, when the change gets below a certain threshold we can consider + # the camera to be stable. + # Throughout this routine we keep the shutter closed. + lowest = 1000 + margin = 0.1 + min_val = 0.01 + while time.time() - start_time < timeout: + self.cap.set(cv2.CAP_PROP_ZOOM, 0x8000) + self.calibrate() + ret, frame_visible = self.read() + if ret: + # calculate how uniform the frame is + std = np.std(frame_visible) + self.cap.set(cv2.CAP_PROP_ZOOM, 0x8000) + sleep(0.1) + if std > min_val and lowest - std < margin: + print(f"Camera is stable with std: {std}") + return True + + if std < lowest and std > min_val: + lowest = std + + elif done: + print("Camera is stable") + return True + + return False + + def flush_buffer(self, num_reads=16): + for i in range(num_reads): + ret, frame_visible = self.read() + class MockVidoCapture: def set(self, propId, value): diff --git a/pyplot.py b/pyplot.py index 4c0a3d0..4315a36 100755 --- a/pyplot.py +++ b/pyplot.py @@ -1,4 +1,6 @@ #!/usr/bin/python3 +import argparse +import cv2 import numpy as np import matplotlib import matplotlib.pyplot as plt @@ -20,16 +22,27 @@ } draw_temp = True -# choose the camera class -camera:ht301_hacklib.Camera -if sys.argv[-1].endswith('.npy'): - camera = ht301_hacklib.CameraEmulator(sys.argv[-1]) -elif '-r' in sys.argv or '--rawcam' in sys.argv: - camera = ht301_hacklib.Camera(camera_raw=True) -else: - camera = ht301_hacklib.Camera() +# Argument parsing +parser = argparse.ArgumentParser(description='Thermal Camera Viewer') +parser.add_argument('-r', '--rawcam', action='store_true', help='use the raw camera') +parser.add_argument('-d', '--device', type=str, help='use the camera at camera_path') +parser.add_argument('file', nargs='?', type=str, help='use the emulator with the data in file.npy') +args = parser.parse_args() +# Choose the camera class +camera: ht301_hacklib.Camera +if args.file and args.file.endswith('.npy'): + camera = ht301_hacklib.CameraEmulator(args.file) +else: + camera_kwargs = {} + if args.rawcam: + camera_kwargs['camera_raw'] = True + if args.device: + camera_path = args.device + cv2_cam = cv2.VideoCapture(camera_path) + camera_kwargs['video_dev'] = cv2_cam + camera = ht301_hacklib.Camera(**camera_kwargs) #see https://matplotlib.org/tutorials/colors/colormaps.html cmaps_idx = 1 @@ -115,11 +128,15 @@ def animate_func(i): info, lut = camera.info() lut_frame = lut[frame] - if diff['enabled']: show_frame = lut_frame - diff['frame'] - else: show_frame = lut_frame + if diff['enabled']: + show_frame = lut_frame - diff['frame'] + else: + show_frame = lut_frame + if diff['annotation_enabled']: - annotation_frame = lut_frame - diff['frame'] - else: annotation_frame = lut_frame + annotation_frame = lut_frame - diff['frame'] + else: + annotation_frame = lut_frame im.set_array(show_frame) @@ -132,7 +149,7 @@ def animate_func(i): if update_colormap: im.set_clim(exposure['T_min'], exposure['T_max']) - fig.canvas.resize_event() #force update all, even with blit=True + fig.canvas.draw_idle() # force update all, even with blit=True update_colormap = False return [] @@ -215,7 +232,8 @@ def press(event): camera.temperature_range_normal() else: camera.temperature_range_high() - camera.calibrate() + camera.wait_for_range_application() # this takes care of calibration as well + update_colormap = True if event.key in ['left', 'right', 'up', 'down']: exposure['auto'] = False T_cent = int((exposure['T_min'] + exposure['T_max'])/2) From c642d53ba04b68c3d2da36062e667ae08b4fffea Mon Sep 17 00:00:00 2001 From: dmytro Date: Fri, 31 May 2024 15:40:11 +0200 Subject: [PATCH 03/27] minor additions to calibration procedures and coefficients --- ht301_hacklib.py | 26 ++++++++++++++++++++------ 1 file changed, 20 insertions(+), 6 deletions(-) diff --git a/ht301_hacklib.py b/ht301_hacklib.py index 426f518..667391a 100755 --- a/ht301_hacklib.py +++ b/ht301_hacklib.py @@ -90,7 +90,9 @@ def __init__(self, video_dev:cv2.VideoCapture|None=None, camera_raw = False) -> # Calibrate the camera self.calibrate() - + def get_resolution(self) -> Tuple[int, int]: + return self.width, self.height + def find_device(cls) -> cv2.VideoCapture: """Find a supported thermal camera @@ -223,10 +225,12 @@ def info(self) -> Tuple[dict, np.ndarray]: return info, temperatureTable # read raw data from cam, seperate visible frame from metadata - def read(self) -> Tuple[bool, np.ndarray]: + def read(self, raw = False) -> Tuple[bool, np.ndarray]: ret, frame_raw = self.cap.read() self.frame_raw_u16: np.ndarray = frame_raw.view(np.uint16).ravel() frame_visible = self.frame_raw_u16[:self.fourLinePara].copy().reshape(self.height, self.width) + if raw: + return ret, frame_visible if self.reference_frame is not None: frame_float = frame_visible.astype(np.float32) @@ -333,7 +337,7 @@ def calibrate_raw(self) -> None: self.flush_buffer() # by issuing this command faster than once per second, we can keep the shutter closed self.cap.set(cv2.CAP_PROP_ZOOM, 0x8000) - ret, frame_visible = self.read() + ret, frame_visible = self.read(raw=True) if ret: self.reference_frame = frame_visible.astype(np.float32) @@ -342,8 +346,13 @@ def calibrate_raw(self) -> None: raise RuntimeError("Failed to capture reference frame") # dead pixel correction - threshold = 0.01 - self.dead_pixels_mask = cv2.inRange(frame_visible.astype(np.float32), 0, threshold).astype(np.uint8) + frame_visible_float = frame_visible.astype(np.float32) + min_val = np.min(frame_visible_float) + max_val = np.max(frame_visible_float) + threshold_margin = (max_val - min_val) * 0.05 # Adjust the multiplier as needed + threshold = min_val + threshold_margin + + self.dead_pixels_mask = cv2.inRange(frame_visible_float, 0, threshold).astype(np.uint8) print(f"Found {np.count_nonzero(self.dead_pixels_mask)} dead pixels") print(f"At: {np.argwhere(self.dead_pixels_mask)}") @@ -428,6 +437,11 @@ def temperature_range_normal(self): def temperature_range_high(self): """Switch camera to the high temperature range (-20°C to 450°C)""" self.cap.set(cv2.CAP_PROP_ZOOM, 0x8021) + if self.camera_raw: + # TODO verify these + self.correction_coefficient_m = 0.1 + self.correction_coefficient_b = 0 + return self.correction_coefficient_m = 1.17 self.correction_coefficient_b = -40.9 @@ -476,7 +490,7 @@ def wait_for_range_application(self, timeout=20): def flush_buffer(self, num_reads=16): for i in range(num_reads): - ret, frame_visible = self.read() + ret, frame_visible = self.read(raw=True) class MockVidoCapture: From f72a7fde9b4beed617c7aa4897deffd67cc9bd2f Mon Sep 17 00:00:00 2001 From: dmytro Date: Tue, 4 Jun 2024 18:16:35 +0200 Subject: [PATCH 04/27] wip termperature correction register search --- ht301_hacklib.py | 35 ++++++++++++++++++++++++++++------- 1 file changed, 28 insertions(+), 7 deletions(-) diff --git a/ht301_hacklib.py b/ht301_hacklib.py index 667391a..d5bdea2 100755 --- a/ht301_hacklib.py +++ b/ht301_hacklib.py @@ -114,17 +114,38 @@ def find_device(cls) -> cv2.VideoCapture: raise ValueError(f"Cannot find camera with a width of one of {cls.supported_resolutions} that also matches: {width=} and {height=}") def info(self) -> Tuple[dict, np.ndarray]: + #fuzzing readout + # for i in range(256 * 4): + # print(f"Off: {i}; u16: {read_u16(self.frame_raw_u16, self.fourLinePara + i)}") + # #print(f"Off: {i}; f32: {read_f32(self.frame_raw_u16, self.fourLinePara + i)}") + # return + + # TODO fix this readout shutTemper = read_u16(self.frame_raw_u16, self.fourLinePara + self.amountPixels + 1) - floatShutTemper = shutTemper / 10.0 - self.ZEROC - #print(f"Raw shut temp: {shutTemper}, float shut temp: {floatShutTemper}") - floatShutTemper = 20.0 + if self.camera_raw: + if shutTemper < 0x801: + floatShutTemper = float(shutTemper) + corrFactor = 0.625 + else: + floatShutTemper = float(0xfff - shutTemper) + corrFactor = -0.625 + floatShutTemper = (floatShutTemper * corrFactor + 2731.5) / 10.0 + -273.15 + #TODO figure out this correction factor thing + floatShutTemper = floatShutTemper - 10 + else: + floatShutTemper = shutTemper / 10.0 - self.ZEROC + print(f"shutTemper: {shutTemper}, floatShutTemper: {floatShutTemper}, corrFactor: {corrFactor}") + # TODO fix this readout coreTemper = read_u16(self.frame_raw_u16, self.fourLinePara + self.amountPixels + 2) - floatCoreTemper = coreTemper / 10.0 - self.ZEROC - #print(f"Raw core temp: {coreTemper}, float core temp: {floatCoreTemper}") - floatCoreTemper = 20.0 + if self.camera_raw: + shutterFix = read_u16(self.frame_raw_u16, self.fourLinePara + (self.amountPixels * 2 + 0x2f) + 1) + print(f"shutterFix: {shutterFix}") + floatCoreTemper = floatShutTemper + else: + floatCoreTemper = coreTemper / 10.0 - self.ZEROC cal_00 = float(read_u16(self.frame_raw_u16, self.fourLinePara + self.amountPixels)) self.cal_01 = read_f32(self.frame_raw_u16, self.fourLinePara + self.amountPixels + 3) @@ -145,7 +166,7 @@ def info(self) -> Tuple[dict, np.ndarray]: humi = read_f32(self.frame_raw_u16, self.fourLinePara + self.userArea + 6) emiss = read_f32(self.frame_raw_u16, self.fourLinePara + self.userArea + 8) distance = read_u16(self.frame_raw_u16, self.fourLinePara + self.userArea + 10) - + fpa_avg = read_u16(self.frame_raw_u16, self.fourLinePara) fpaTmp = read_u16(self.frame_raw_u16, self.fourLinePara + 1) maxx1 = read_u16(self.frame_raw_u16, self.fourLinePara + 2) From 8fd9c56c35e6b6d1472bbe2bbabe19f3fd689016 Mon Sep 17 00:00:00 2001 From: dmytro Date: Sat, 8 Jun 2024 01:02:54 +0200 Subject: [PATCH 05/27] updated readme, removed debug info, added some helpful comments --- README.md | 8 ++++++++ ht301_hacklib.py | 39 ++++++++++++++++----------------------- 2 files changed, 24 insertions(+), 23 deletions(-) diff --git a/README.md b/README.md index d6b8673..bd6f898 100644 --- a/README.md +++ b/README.md @@ -37,6 +37,14 @@ mouse: left button - add Region Of Interest (ROI) right button - add user temperature annotation ``` + +Alternatively if you can specify the video device directly with `-d` to skip the search routine. Also for T2S+ V2 users (where the camera sends raw data and doesn't do onboard processing) you can specify the `-r` option to tell the program to treat the camera stream as raw sensor data. +Example: + +``` +./pyplot.py -d /dev/video14 -r +``` + ![pyplot output](docs/pyplot-output1.png) ![pyplot output](docs/pyplot-output2.png) diff --git a/ht301_hacklib.py b/ht301_hacklib.py index d5bdea2..b311377 100755 --- a/ht301_hacklib.py +++ b/ht301_hacklib.py @@ -114,14 +114,6 @@ def find_device(cls) -> cv2.VideoCapture: raise ValueError(f"Cannot find camera with a width of one of {cls.supported_resolutions} that also matches: {width=} and {height=}") def info(self) -> Tuple[dict, np.ndarray]: - #fuzzing readout - # for i in range(256 * 4): - # print(f"Off: {i}; u16: {read_u16(self.frame_raw_u16, self.fourLinePara + i)}") - # #print(f"Off: {i}; f32: {read_f32(self.frame_raw_u16, self.fourLinePara + i)}") - # return - - - # TODO fix this readout shutTemper = read_u16(self.frame_raw_u16, self.fourLinePara + self.amountPixels + 1) if self.camera_raw: if shutTemper < 0x801: @@ -131,19 +123,19 @@ def info(self) -> Tuple[dict, np.ndarray]: floatShutTemper = float(0xfff - shutTemper) corrFactor = -0.625 floatShutTemper = (floatShutTemper * corrFactor + 2731.5) / 10.0 + -273.15 - #TODO figure out this correction factor thing - floatShutTemper = floatShutTemper - 10 + # TODO fix this readout for the T2S+ v2 + # The temperature is indeed being red out, but the sensor is located in some weird place, + # it gets hot super fast and causes the entire image to drift, I couldn't figure out how to deal with that + # hard coding ~18C (room temp) works pretty good tho... + floatShutTemper = 18.0 else: floatShutTemper = shutTemper / 10.0 - self.ZEROC - - print(f"shutTemper: {shutTemper}, floatShutTemper: {floatShutTemper}, corrFactor: {corrFactor}") - # TODO fix this readout coreTemper = read_u16(self.frame_raw_u16, self.fourLinePara + self.amountPixels + 2) if self.camera_raw: - shutterFix = read_u16(self.frame_raw_u16, self.fourLinePara + (self.amountPixels * 2 + 0x2f) + 1) - print(f"shutterFix: {shutterFix}") - floatCoreTemper = floatShutTemper + # TODO fix this readout for the T2S+ v2 + # I don't even think the v2 has a separate core and shutter temperature registers... + floatCoreTemper = 18.0 else: floatCoreTemper = coreTemper / 10.0 - self.ZEROC @@ -346,7 +338,7 @@ def set_point(self, x: int, y: int, index: int) -> None: self.cap.set(cv2.CAP_PROP_ZOOM, x1) self.cap.set(cv2.CAP_PROP_ZOOM, y1) - def calibrate_raw(self) -> None: + def calibrate_raw(self, quiet=False) -> None: '''Camera calibration for cameras that return raw data only''' self.reference_frame = None self.offset_mean = 0.0 @@ -375,13 +367,14 @@ def calibrate_raw(self) -> None: self.dead_pixels_mask = cv2.inRange(frame_visible_float, 0, threshold).astype(np.uint8) - print(f"Found {np.count_nonzero(self.dead_pixels_mask)} dead pixels") - print(f"At: {np.argwhere(self.dead_pixels_mask)}") + if not quiet: + print(f"Found {np.count_nonzero(self.dead_pixels_mask)} dead pixels") + print(f"At: {np.argwhere(self.dead_pixels_mask)}") - def calibrate(self) -> None: + def calibrate(self, quiet=False) -> None: '''camera calibration''' if self.camera_raw: - self.calibrate_raw() + self.calibrate_raw(quiet=quiet) else: self.cap.set(cv2.CAP_PROP_ZOOM, 0x8000) @@ -479,7 +472,7 @@ def wait_for_range_application(self, timeout=20): time.sleep(0.1) if self.camera_raw: - # Now we keep the shutter open and wait for the camera to stabilize, + # Now we keep the shutter closed and wait for the camera to stabilize, # we do this by running the calibration, waiting a bit and checking the average # of all the pixels, when the change gets below a certain threshold we can consider # the camera to be stable. @@ -489,7 +482,7 @@ def wait_for_range_application(self, timeout=20): min_val = 0.01 while time.time() - start_time < timeout: self.cap.set(cv2.CAP_PROP_ZOOM, 0x8000) - self.calibrate() + self.calibrate(quiet=True) ret, frame_visible = self.read() if ret: # calculate how uniform the frame is From b6c012b223972d27a5972503fe20e9647e76ecf0 Mon Sep 17 00:00:00 2001 From: Cuprum77 Date: Tue, 18 Jun 2024 12:18:58 +0200 Subject: [PATCH 06/27] added if statements to prevent crash when there's no dead pixels --- ht301_hacklib.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/ht301_hacklib.py b/ht301_hacklib.py index b311377..1106e72 100755 --- a/ht301_hacklib.py +++ b/ht301_hacklib.py @@ -365,7 +365,9 @@ def calibrate_raw(self, quiet=False) -> None: threshold_margin = (max_val - min_val) * 0.05 # Adjust the multiplier as needed threshold = min_val + threshold_margin - self.dead_pixels_mask = cv2.inRange(frame_visible_float, 0, threshold).astype(np.uint8) + # if there are no dead pixels, we don't need to do anything + if np.count_nonzero(frame_visible_float < threshold) == 0: + self.dead_pixels_mask = cv2.inRange(frame_visible_float, 0, threshold).astype(np.uint8) if not quiet: print(f"Found {np.count_nonzero(self.dead_pixels_mask)} dead pixels") From 75ebbdefb2acee2fb8eab4a6ea8e6509b77cb99a Mon Sep 17 00:00:00 2001 From: dimonDDL Date: Sat, 22 Jun 2024 01:10:28 +0200 Subject: [PATCH 07/27] wip figuring out all the registers for the T2S+ v2 --- 2024-06-21_23-02-55.npy | Bin 0 -> 100480 bytes display.py | 79 + ht301_hacklib.py | 91 +- p.png | Bin 0 -> 151049 bytes registers_t2s.txt | 170 ++ run.txt | Bin 0 -> 190306 bytes run1.txt | 5120 +++++++++++++++++++++++++++++++++++++++ 7 files changed, 5422 insertions(+), 38 deletions(-) create mode 100644 2024-06-21_23-02-55.npy create mode 100644 display.py create mode 100644 p.png create mode 100644 registers_t2s.txt create mode 100644 run.txt create mode 100644 run1.txt diff --git a/2024-06-21_23-02-55.npy b/2024-06-21_23-02-55.npy new file mode 100644 index 0000000000000000000000000000000000000000..daa8d0a498e63085d104ba758a2b94fe42166c05 GIT binary patch literal 100480 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 WfB*A8m-62~|GNVJU4j3-0{;itz9;km literal 0 HcmV?d00001 diff --git a/display.py b/display.py new file mode 100644 index 0000000..51d5f9b --- /dev/null +++ b/display.py @@ -0,0 +1,79 @@ +import numpy as np +import matplotlib.pyplot as plt +from matplotlib.widgets import Button + +# Load the numpy file +data = np.load('./2024-06-21_23-02-55.npy') + +# Function to get the pixel number +def get_pixel_number(x, y, width, height, origin=(0, 0)): + zero_x, zero_y = origin + pixel_number = (y - zero_y) * width + (x - zero_x) + return pixel_number + +# Click event handler +def onclick(event): + global arrow, rect + x, y = int(event.xdata), int(event.ydata) + height, width = data.shape + + if x >= 0 and y >= 0 and x < width and y < height: + pixel_number = get_pixel_number(x, y, width, height, origin=(zero_x, zero_y)) + pixel_value = data[y, x] + print(f'Pixel ({x}, {y}) has number: {pixel_number} and value: {pixel_value}') + + # Clear the previous highlight + if arrow: + arrow.remove() + if rect: + rect.remove() + + # Draw an arrow pointing to the clicked pixel with detailed information + arrow = ax.annotate(f'({x}, {y})\nNumber: {pixel_number}\nValue: {pixel_value}', + xy=(x, y), xytext=(x+10, y+10), + arrowprops=dict(facecolor='red', shrink=0.05), + bbox=dict(boxstyle="round,pad=0.3", edgecolor='red', facecolor='white')) + + # Draw a rectangle around the clicked pixel + rect = plt.Rectangle((x-0.5, y-0.5), 1, 1, edgecolor='red', facecolor='none') + ax.add_patch(rect) + + fig.canvas.draw() + +# Function to highlight all non-zero pixels +def highlight_non_zero(event): + global scatter + if scatter: + scatter.remove() + scatter = None + else: + non_zero_pixels = np.argwhere(data != 0) + y, x = non_zero_pixels[:, 0], non_zero_pixels[:, 1] + scatter = ax.scatter(x, y, color='blue', s=10) + + fig.canvas.draw() + +# Load and display the image +fig, ax = plt.subplots() +plt.subplots_adjust(bottom=0.2) # Adjust to make space for the button +ax.imshow(data, cmap='gray') + +# Define origin +zero_x, zero_y = 0, 192 # Adjust these values to set a different origin + +# Initialize annotation and rectangle variables +arrow = None +rect = None +scatter = None + +# Connect the click event +cid = fig.canvas.mpl_connect('button_press_event', onclick) + +# Add a button to highlight non-zero pixels +ax_button = plt.axes([0.8, 0.05, 0.1, 0.075]) +btn = Button(ax_button, 'Toggle Non-Zero') +btn.on_clicked(highlight_non_zero) + +# plt.tight_layout() + +plt.show() \ No newline at end of file diff --git a/ht301_hacklib.py b/ht301_hacklib.py index 1106e72..f335118 100755 --- a/ht301_hacklib.py +++ b/ht301_hacklib.py @@ -113,68 +113,81 @@ def find_device(cls) -> cv2.VideoCapture: except: pass raise ValueError(f"Cannot find camera with a width of one of {cls.supported_resolutions} that also matches: {width=} and {height=}") + def bin_to_twos_complement(self, binary: str) -> int: + if binary[0] == '1': + return int(binary, 2) - 2**len(binary) + return int(binary, 2) + def info(self) -> Tuple[dict, np.ndarray]: - shutTemper = read_u16(self.frame_raw_u16, self.fourLinePara + self.amountPixels + 1) + shutTemper = read_u16(self.frame_raw_u16, self.fourLinePara + self.amountPixels + 1) # 257 if self.camera_raw: - if shutTemper < 0x801: + if shutTemper < 2049: floatShutTemper = float(shutTemper) corrFactor = 0.625 else: floatShutTemper = float(0xfff - shutTemper) corrFactor = -0.625 + shutterFix = self.bin_to_twos_complement((bin(read_u16(self.frame_raw_u16, self.fourLinePara + self.amountPixels * 2 + 47))[2:].zfill(16))[:8]) / 10.0 # 559 floatShutTemper = (floatShutTemper * corrFactor + 2731.5) / 10.0 + -273.15 + floatShutTemper = floatShutTemper + shutterFix # TODO fix this readout for the T2S+ v2 # The temperature is indeed being red out, but the sensor is located in some weird place, # it gets hot super fast and causes the entire image to drift, I couldn't figure out how to deal with that # hard coding ~18C (room temp) works pretty good tho... - floatShutTemper = 18.0 + #floatShutTemper = 18.0 else: floatShutTemper = shutTemper / 10.0 - self.ZEROC - coreTemper = read_u16(self.frame_raw_u16, self.fourLinePara + self.amountPixels + 2) + coreTemper = read_u16(self.frame_raw_u16, self.fourLinePara + self.amountPixels + 2) # 258 if self.camera_raw: # TODO fix this readout for the T2S+ v2 # I don't even think the v2 has a separate core and shutter temperature registers... - floatCoreTemper = 18.0 + #floatCoreTemper = 18.0 + floatCoreTemper = floatShutTemper - shutterFix + #floatShutTemper = 18.0 else: floatCoreTemper = coreTemper / 10.0 - self.ZEROC + + # print(f"Shutter temperature: {floatShutTemper}°C, Core temperature: {coreTemper / 10.0 - self.ZEROC}°C") - cal_00 = float(read_u16(self.frame_raw_u16, self.fourLinePara + self.amountPixels)) - self.cal_01 = read_f32(self.frame_raw_u16, self.fourLinePara + self.amountPixels + 3) - cal_02 = read_f32(self.frame_raw_u16, self.fourLinePara + self.amountPixels + 5) - cal_03 = read_f32(self.frame_raw_u16, self.fourLinePara + self.amountPixels + 7) - cal_04 = read_f32(self.frame_raw_u16, self.fourLinePara + self.amountPixels + 9) - cal_05 = read_f32(self.frame_raw_u16, self.fourLinePara + self.amountPixels + 11) + # TODO check all of these + cal_00 = float(read_u16(self.frame_raw_u16, self.fourLinePara + self.amountPixels)) # 256 + self.cal_01 = read_f32(self.frame_raw_u16, self.fourLinePara + self.amountPixels + 3) # 259 + cal_02 = read_f32(self.frame_raw_u16, self.fourLinePara + self.amountPixels + 5) # 261 + cal_03 = read_f32(self.frame_raw_u16, self.fourLinePara + self.amountPixels + 7) # 263 + cal_04 = read_f32(self.frame_raw_u16, self.fourLinePara + self.amountPixels + 9) # 265 + cal_05 = read_f32(self.frame_raw_u16, self.fourLinePara + self.amountPixels + 11) # 267 - cameraSoftVersion: np.ndarray = read_u8(self.frame_raw_u16, self.fourLinePara + self.amountPixels + 24, step=8) + cameraSoftVersion: np.ndarray = read_u8(self.frame_raw_u16, self.fourLinePara + self.amountPixels + 24, step=8) # 280-287? cameraSoftVersion = cameraSoftVersion.tobytes().decode("ascii").rstrip("\x00") - sn: np.ndarray = read_u8(self.frame_raw_u16, self.fourLinePara + self.amountPixels + 32, step=3) - sn = sn.tobytes().decode("ascii").rstrip("\x00") + # this one is reading out incorrectly? + sn: np.ndarray = read_u8(self.frame_raw_u16, self.fourLinePara + self.amountPixels + 32, step=3) # 288-290? + sn = sn.tobytes().decode("ascii").rstrip("\x00") - correction = read_f32(self.frame_raw_u16, self.fourLinePara + self.userArea) - Refltmp = read_f32(self.frame_raw_u16, self.fourLinePara + self.userArea + 2) - Airtmp = read_f32(self.frame_raw_u16, self.fourLinePara + self.userArea + 4) - humi = read_f32(self.frame_raw_u16, self.fourLinePara + self.userArea + 6) - emiss = read_f32(self.frame_raw_u16, self.fourLinePara + self.userArea + 8) - distance = read_u16(self.frame_raw_u16, self.fourLinePara + self.userArea + 10) - - fpa_avg = read_u16(self.frame_raw_u16, self.fourLinePara) - fpaTmp = read_u16(self.frame_raw_u16, self.fourLinePara + 1) - maxx1 = read_u16(self.frame_raw_u16, self.fourLinePara + 2) - maxy1 = read_u16(self.frame_raw_u16, self.fourLinePara + 3) - self.max_raw = read_u16(self.frame_raw_u16, self.fourLinePara + 4) - minx1 = read_u16(self.frame_raw_u16, self.fourLinePara + 5) - miny1 = read_u16(self.frame_raw_u16, self.fourLinePara + 6) - self.min_raw = read_u16(self.frame_raw_u16, self.fourLinePara + 7) - self.avg_raw = read_u16(self.frame_raw_u16, self.fourLinePara + 8) + correction = read_f32(self.frame_raw_u16, self.fourLinePara + self.userArea) # 383 + Refltmp = read_f32(self.frame_raw_u16, self.fourLinePara + self.userArea + 2) # 385 + Airtmp = read_f32(self.frame_raw_u16, self.fourLinePara + self.userArea + 4) # 387 + humi = read_f32(self.frame_raw_u16, self.fourLinePara + self.userArea + 6) # 389 + emiss = read_f32(self.frame_raw_u16, self.fourLinePara + self.userArea + 8) # 391 + distance = read_u16(self.frame_raw_u16, self.fourLinePara + self.userArea + 10) # 393 + + fpa_avg = read_u16(self.frame_raw_u16, self.fourLinePara) # 0 + fpaTmp = read_u16(self.frame_raw_u16, self.fourLinePara + 1) # 1 + maxx1 = read_u16(self.frame_raw_u16, self.fourLinePara + 2) # 2 + maxy1 = read_u16(self.frame_raw_u16, self.fourLinePara + 3) # 3 + self.max_raw = read_u16(self.frame_raw_u16, self.fourLinePara + 4) # 4 + minx1 = read_u16(self.frame_raw_u16, self.fourLinePara + 5) # 5 + miny1 = read_u16(self.frame_raw_u16, self.fourLinePara + 6) # 6 + self.min_raw = read_u16(self.frame_raw_u16, self.fourLinePara + 7) # 7 + self.avg_raw = read_u16(self.frame_raw_u16, self.fourLinePara + 8) # 8 fpatmp_ = 20.0 - (float(fpaTmp) - self.fpa_off) / self.fpa_div - center_raw = read_u16(self.frame_raw_u16, self.fourLinePara + 12) - user_raw00 = read_u16(self.frame_raw_u16, self.fourLinePara + 13) - user_raw01 = read_u16(self.frame_raw_u16, self.fourLinePara + 14) - user_raw02 = read_u16(self.frame_raw_u16, self.fourLinePara + 15) + center_raw = read_u16(self.frame_raw_u16, self.fourLinePara + 12) # 12 + user_raw00 = read_u16(self.frame_raw_u16, self.fourLinePara + 13) # 13 + user_raw01 = read_u16(self.frame_raw_u16, self.fourLinePara + 14) # 14 + user_raw02 = read_u16(self.frame_raw_u16, self.fourLinePara + 15) # 15 distance_adjusted = (20.0 if distance >= 20.0 else distance) * self.distance_multiplier atm = self.atmt(humi, Airtmp, distance_adjusted) @@ -234,7 +247,7 @@ def info(self) -> Tuple[dict, np.ndarray]: "Tmax_C": temperatureTable[self.max_raw], "Tcenter_C": temperatureTable[center_raw], } - + return info, temperatureTable # read raw data from cam, seperate visible frame from metadata @@ -362,11 +375,12 @@ def calibrate_raw(self, quiet=False) -> None: frame_visible_float = frame_visible.astype(np.float32) min_val = np.min(frame_visible_float) max_val = np.max(frame_visible_float) - threshold_margin = (max_val - min_val) * 0.05 # Adjust the multiplier as needed + print(f"Min: {min_val}, Max: {max_val}, Avg: {np.mean(frame_visible_float)}") + threshold_margin = (max_val - min_val) * 0.05 # Adjust the margin if not detected correctly threshold = min_val + threshold_margin - # if there are no dead pixels, we don't need to do anything - if np.count_nonzero(frame_visible_float < threshold) == 0: + # if there are no dead pixels, we skip the dead pixel correction + if np.count_nonzero(frame_visible_float < threshold) != 0: self.dead_pixels_mask = cv2.inRange(frame_visible_float, 0, threshold).astype(np.uint8) if not quiet: @@ -441,6 +455,7 @@ def get_temp_table(self, correction, Airtmp, table_offset, distance_adjusted): n[np.isnan(n)] = 0.0 wtot = np.power(n - self.cal_a + self.ZEROC, 4) ttot = np.power((wtot - self.numerator_sub) / self.denominator, 0.25) - self.ZEROC + # TODO, ttot is being directly read out according to the decomp, how is it calculated here exactly? (fVar7) offset ~269 temperatureTable = ttot + (distance_adjusted * 0.85 - 1.125) * (ttot - Airtmp) / 100.0 + correction return self.correction_coefficient_m * temperatureTable + self.correction_coefficient_b diff --git a/p.png b/p.png new file mode 100644 index 0000000000000000000000000000000000000000..bf8b62dcccb56cd5efa7dabf4317b42c25f6eea7 GIT binary patch literal 151049 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 z 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%0D!CHl8Ed`D;3*%l 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 RyNcU>`I}p&{QTc~{vUca;DrDH literal 0 HcmV?d00001 diff --git a/registers_t2s.txt b/registers_t2s.txt new file mode 100644 index 0000000..b0c6f7e --- /dev/null +++ b/registers_t2s.txt @@ -0,0 +1,170 @@ +Registers of the 4 line params and what they mean for the T2S+ v2 +The values are specified from zero being the start of the 4 line params. + +Abbreviations: +FPA - Focal Plane Array + +--- LINE ZERO --- + +0: FPA average value +1: Temperate of the FPA? +2-15: ZERO +16: UNKNOWN (value: 15805) +17-255: ZERO + +--- LINE ONE --- + +256: cal_00? +257: Shutter Temperate +258: Core Temperate (reads 0 tho) +259-260: cal_01? +261-262: cal_02? +263-264: cal_03? +265-266: cal_04? +267-268: cal_05? +268-271: ZERO +272: UNKNOWN (value: 16840) +273: ZERO +274: UNKNOWN (value: 16840) +275: UNKNOWN (value: 26214) +276: UNKNOWN (value: 16102) +277: UNKNOWN (value: 57672) +278: UNKNOWN (value: 16250) +279: UNKNOWN (value: 1) +280-287: Software version string +288-289: ZERO +290-293: Serial Number? +294-295: ZERO +296: UNKNOWN (value: 12884) +297: UNKNOWN (value: 11091) +298: UNKNOWN (value: 13312) +299: UNKNOWN (value: 76) +300: UNKNOWN (value: 12371) +301: UNKNOWN (value: 57856) +302: UNKNOWN (value: 63430) +303-382: ZERO + +--- USER DATA --- + +383-384: Correction +385-386: Refltmp +387-388: Air temperate +389-390: Humidity +391-392: Emissivity +393-394: Distance +395-511: ZERO + +--- LINE TWO --- + +512: UNKNOWN (value: 17741) +513: UNKNOWN (value: 12849) +514: UNKNOWN (value: 14649) +515: UNKNOWN (value: 21504) +516: UNKNOWN (value: 21298) +517: UNKNOWN (value: 43) +518-519: ZERO +520: UNKNOWN (value: 12884) same as 296 +521: UNKNOWN (value: 11091) same as 297 +522: UNKNOWN (value: 13312) same as 298 +523: UNKNOWN (value: 76) same as 299 +524: UNKNOWN (value: 12371) same as 300 +525: UNKNOWN (value: 57856) same as 301 +526: UNKNOWN (value: 63430) same as 302 +527: ZERO +528: UNKNOWN (value: 48641) +529: UNKNOWN (value: 8965) +530: UNKNOWN (value: 256) +531: ZERO +532: UNKNOWN (value: 259) +533: UNKNOWN (value: 1) +534: UNKNOWN (value: 100) +535: UNKNOWN (value: 1) +536: UNKNOWN (value: 256) +537: UNKNOWN (value: 276) +538: UNKNOWN (value: 150) +539: ZERO +540: UNKNOWN (value: 258) +541: UNKNOWN (value: 1200) +542: UNKNOWN (value: 100) +543: UNKNOWN (value: 100) +544: UNKNOWN (value: 100) +545: UNKNOWN (value: 350) +546: UNKNOWN (value: 70) +547: UNKNOWN (value: 3072) +548: UNKNOWN (value: 768) +549: UNKNOWN (value: 65280) +550: UNKNOWN (value: 127) +551: ZERO +552: UNKNOWN (value: 513) +553: UNKNOWN (value: 3594) +554: UNKNOWN (value: 3331) +555: UNKNOWN (value: 20) +556-558: ZERO +559: UNKNOWN (value: 64000) +560: UNKNOWN (value: 21810) +561: UNKNOWN (value: 15984) +562: UNKNOWN (value: 28312) +563: UNKNOWN (value: 16889) +564: UNKNOWN (value: 50604) +565: UNKNOWN (value: 46887) +566: UNKNOWN (value: 22859) +567: UNKNOWN (value: 15366) +568: UNKNOWN (value: 47186) +569: UNKNOWN (value: 16190) +570-572: ZERO +573: UNKNOWN (value: 16840) +574: ZERO +575: UNKNOWN (value: 16840) +576: UNKNOWN (value: 26214) +577: UNKNOWN (value: 16102) +578: UNKNOWN (value: 57672) +579: UNKNOWN (value: 16250) +580: UNKNOWN (value: 1) +581: UNKNOWN (value: 12059) +582: UNKNOWN (value: 15581) +583: UNKNOWN (value: 33345) +584: UNKNOWN (value: 16314) +585: UNKNOWN (value: 50604) +586: UNKNOWN (value: 14375) +587: UNKNOWN (value: 65012) +588: UNKNOWN (value: 15316) +589: UNKNOWN (value: 65012) +590: UNKNOWN (value: 16132) +591: UNKNOWN (value: 17280) +592: UNKNOWN (value: 257) +593: UNKNOWN (value: 3156) +594: UNKNOWN (value: 8967) +595: UNKNOWN (value: 3875) +596: UNKNOWN (value: 8967) +597: UNKNOWN (value: 3137) +598: UNKNOWN (value: 7938) +599: UNKNOWN (value: 3875) +600: UNKNOWN (value: 7943) +601: UNKNOWN (value: 3137) +602: UNKNOWN (value: 7426) +603: UNKNOWN (value: 3875) +604: UNKNOWN (value: 7943) +605: UNKNOWN (value: 3393) +606: UNKNOWN (value: 7938) +607: UNKNOWN (value: 3875) +608: UNKNOWN (value: 7943) +609: UNKNOWN (value: 45442) +610: UNKNOWN (value: 59280) +611: UNKNOWN (value: 616) +612: UNKNOWN (value: 2113) +613: UNKNOWN (value: 45825) +614: UNKNOWN (value: 9955) +615: UNKNOWN (value: 24807) +616: UNKNOWN (value: 3968) +617: UNKNOWN (value: 14980) +618: UNKNOWN (value: 8132) +619: UNKNOWN (value: 2721) +620: ZERO +621-624: 65535 +624-767: ZERO + +--- LINE THREE --- +768-1023: ZERO + + + diff --git a/run.txt b/run.txt new file mode 100644 index 0000000000000000000000000000000000000000..018bc7e49d538f2acc988241f76d64fbfdbd5ae0 GIT binary patch literal 190306 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�LO%5s zGw0r&+AGI-rrw>}dgqyXcWUdMXX@Rlt#_WOcc-@Ad8Xc-+Ir`idUtB;ohRz&YaF4U b^GyAI*M9mgy7tpS*Uow7+`ChI Date: Sun, 22 Sep 2024 20:14:14 +0200 Subject: [PATCH 08/27] added offset parameter and simplified reading frames from the camera library --- android_app_logs.txt | 11 +++++++++++ ht301_hacklib.py | 14 ++++++++++++-- pyplot.py | 26 +++++++++++++------------- 3 files changed, 36 insertions(+), 15 deletions(-) create mode 100644 android_app_logs.txt diff --git a/android_app_logs.txt b/android_app_logs.txt new file mode 100644 index 0000000..e238f11 --- /dev/null +++ b/android_app_logs.txt @@ -0,0 +1,11 @@ +libUVCCamera: [20119*serenegiant_usb_UVCCamera.cpp:226:nativeGetByteArrayTemperaturePara]:nativeGetByteArrayTemperaturePara:0,0,0,0,0 +jsonObject: {"doAction":1,"deviceSn":"ME1299","deviceModel":"google,Pixel 3","deviceNo":"T2S+","appVersion":"6.7.240509","osVersion":"Android12,level31"} +libUVCCamera: [20206*thermometry.c:367:EAthermometryT4Line]:EAthermometryT4Line start +libUVCCamera: [20206*thermometry.c:368:EAthermometryT4Line]:correction:0.000000, Refltmp:25.000000,Airtmp:25.000000 ,humi:0.450000,emiss:0.980000,distance:1 +libUVCCamera: [20206*thermometry.c:417:EAthermometryT4Line]:shutTemper:451 +libUVCCamera: [20206*thermometry.c:446:EAthermometryT4Line]:a:0.234700, b:31.179001, ka:-0.000010, kb:0.008200, kc:0.745000 +libUVCCamera: [20206*thermometry.c:458:EAthermometryT4Line]:correction:0.000000, Refltmp:25.000000, Airtmp:25.000000, humi:0.450000, emiss:0.980000, distance:1 +libUVCCamera: [20206*thermometry.c:486:EAthermometryT4Line]:WriteTable fpatemp:29.53, shuttemp:27.59, floatShutTemper:28.19, shutterFix:-0.60 +libUVCCamera: [20206*thermometry.c:549:EAthermometryT4Line]:EAthermometryT4Line end +MediaPlayerNative: pause called in state 8, mPlayer(0x78c52c1eb0) +MediaPlayerNative: error (-38, 0) \ No newline at end of file diff --git a/ht301_hacklib.py b/ht301_hacklib.py index f335118..4296376 100755 --- a/ht301_hacklib.py +++ b/ht301_hacklib.py @@ -62,7 +62,7 @@ class Camera: offset_mean = 0.0 dead_pixels_mask = None - def __init__(self, video_dev:cv2.VideoCapture|None=None, camera_raw = False) -> None: + def __init__(self, video_dev:cv2.VideoCapture|None=None, camera_raw = False, fixed_offset : float = 0.0) -> None: if video_dev is None: video_dev = self.find_device() if not video_dev: @@ -72,6 +72,7 @@ def __init__(self, video_dev:cv2.VideoCapture|None=None, camera_raw = False) -> self.height = int(self.cap.get(cv2.CAP_PROP_FRAME_HEIGHT))-ROWS_SPECIAL_DATA self.width = int(self.cap.get(cv2.CAP_PROP_FRAME_WIDTH)) + self.userOffset = fixed_offset self.fourLinePara = self.width * self.height self.init_parameters() @@ -210,6 +211,8 @@ def info(self) -> Tuple[dict, np.ndarray]: table_offset = cal_00 - (cal_00_corr if cal_00_corr > 0 else 0) temperatureTable = self.get_temp_table(correction, Airtmp, table_offset, distance_adjusted) + + temperatureTable = temperatureTable + self.userOffset ''' build infomation ''' info = { @@ -272,6 +275,13 @@ def read(self, raw = False) -> Tuple[bool, np.ndarray]: return ret, frame_visible + def get_frame(self) -> np.ndarray: + ret, frame = self.read() + info, lut = self.info() + lut_frame = lut[frame] + return lut_frame + + def set_correction(self, correction: float) -> None: self.sendFloatCommand(position=SET_CORRECTION, value=correction) @@ -477,7 +487,7 @@ def temperature_range_high(self): self.correction_coefficient_b = -40.9 def wait_for_range_application(self, timeout=20): - """Wait for the camera to apply the temperature range change, this is detected when the video stops being uniform""" + """Wait for the camera to apply the temperature range change""" print("Waiting for camera to stabilize...") start_time = time.time() done = False diff --git a/pyplot.py b/pyplot.py index 4315a36..719a0cd 100755 --- a/pyplot.py +++ b/pyplot.py @@ -26,6 +26,7 @@ parser = argparse.ArgumentParser(description='Thermal Camera Viewer') parser.add_argument('-r', '--rawcam', action='store_true', help='use the raw camera') parser.add_argument('-d', '--device', type=str, help='use the camera at camera_path') +parser.add_argument('-o', '--offset', type=float, help='set a fixed offset for the temperature data') parser.add_argument('file', nargs='?', type=str, help='use the emulator with the data in file.npy') args = parser.parse_args() @@ -42,6 +43,8 @@ camera_path = args.device cv2_cam = cv2.VideoCapture(camera_path) camera_kwargs['video_dev'] = cv2_cam + if args.offset: + camera_kwargs['fixed_offset'] = args.offset camera = ht301_hacklib.Camera(**camera_kwargs) #see https://matplotlib.org/tutorials/colors/colormaps.html @@ -51,8 +54,7 @@ matplotlib.rcParams['toolbar'] = 'None' # temporary fake frame -lut_frame = frame = np.full((camera.height, camera.width), 25.) -info = {} +frame = np.full((camera.height, camera.width), 25.) lut = None # will be defined later fig = plt.figure() @@ -64,7 +66,7 @@ pass ax = plt.gca() -im = ax.imshow(lut_frame, cmap=cmaps[cmaps_idx]) +im = ax.imshow(frame, cmap=cmaps[cmaps_idx]) divider = make_axes_locatable(ax) cax = divider.append_axes("right", size="5%", pad=0.05) cbar = plt.colorbar(im, cax=cax) @@ -122,21 +124,19 @@ def log_annotations_to_csv(annotation_frame): def animate_func(i): - global lut, frame, info, paused, update_colormap, exposure, im, diff, lut_frame - ret, frame = camera.read() + global frame, paused, update_colormap, exposure, im, diff + frame = camera.get_frame() if not paused: - info, lut = camera.info() - lut_frame = lut[frame] if diff['enabled']: - show_frame = lut_frame - diff['frame'] + show_frame = frame - diff['frame'] else: - show_frame = lut_frame + show_frame = frame if diff['annotation_enabled']: - annotation_frame = lut_frame - diff['frame'] + annotation_frame = frame - diff['frame'] else: - annotation_frame = lut_frame + annotation_frame = frame im.set_array(show_frame) @@ -184,10 +184,10 @@ def print_help(): #keyboard def press(event): global paused, exposure, update_colormap, cmaps_idx, draw_temp, temp_extra_annotations, csv_filename - global lut_frame, lut, frame, diff, annotations, roi + global lut, frame, diff, annotations, roi if event.key == 'h': print_help() if event.key == ' ': paused ^= True; print('paused:', paused) - if event.key == 'd': diff['frame'] = lut_frame; diff['annotation_enabled'] = diff['enabled'] = True; print('set diff') + if event.key == 'd': diff['frame'] = frame; diff['annotation_enabled'] = diff['enabled'] = True; print('set diff') if event.key == 'x': diff['enabled'] ^= True; print('enable diff:', diff['enabled']) if event.key == 'c': diff['annotation_enabled'] ^= True; print('enable annotation diff:', diff['annotation_enabled']) if event.key == 't': draw_temp ^= True; print('draw temp:', draw_temp) From c3f051b54e6bcb8b144b29655b016c3d34d88f9e Mon Sep 17 00:00:00 2001 From: dimonDDL Date: Sun, 22 Sep 2024 20:35:54 +0200 Subject: [PATCH 09/27] updated readme --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index bd6f898..b9442b7 100644 --- a/README.md +++ b/README.md @@ -38,11 +38,11 @@ mouse: right button - add user temperature annotation ``` -Alternatively if you can specify the video device directly with `-d` to skip the search routine. Also for T2S+ V2 users (where the camera sends raw data and doesn't do onboard processing) you can specify the `-r` option to tell the program to treat the camera stream as raw sensor data. +Alternatively if you can specify the video device directly with `-d` to skip the search routine. Also for T2S+ V2 users (where the camera sends raw data and doesn't do onboard processing) you can specify the `-r` option to tell the program to treat the camera stream as raw sensor data. There is also the `-o` parameter which adds an offset to the entire frames temperature values. This is useful for calibrating the camera. Example: ``` -./pyplot.py -d /dev/video14 -r +./pyplot.py -d /dev/video14 -r -o -12.3 ``` ![pyplot output](docs/pyplot-output1.png) From a723c3331fb074a5f49424b81c683a255b87a236 Mon Sep 17 00:00:00 2001 From: dimonDDL Date: Mon, 23 Sep 2024 22:05:35 +0200 Subject: [PATCH 10/27] proof of concept lock in thermometry implementation --- pyplot.py | 126 +++++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 119 insertions(+), 7 deletions(-) diff --git a/pyplot.py b/pyplot.py index 719a0cd..966d064 100755 --- a/pyplot.py +++ b/pyplot.py @@ -6,12 +6,20 @@ import matplotlib.pyplot as plt import matplotlib.animation as animation import matplotlib.patches as patches -from matplotlib.backend_bases import MouseButton -from mpl_toolkits.axes_grid1 import make_axes_locatable -import ht301_hacklib import utils import time import sys +import csv +import math +import serial + +import ht301_hacklib + +from matplotlib.backend_bases import MouseButton +from mpl_toolkits.axes_grid1 import make_axes_locatable +from datetime import datetime + + fps = 40 exposure = {'auto': True, @@ -27,12 +35,22 @@ parser.add_argument('-r', '--rawcam', action='store_true', help='use the raw camera') parser.add_argument('-d', '--device', type=str, help='use the camera at camera_path') parser.add_argument('-o', '--offset', type=float, help='set a fixed offset for the temperature data') + +# lock in thermometry options (all of these are requred) +parser.add_argument('-l', '--lockin', type=float, help='enable lock-in thermometry with the given frequency (in Hz), ideally several times smaller than the camera fps') +parser.add_argument('-p', '--port', type=str, help='set the serial port for the power supply control (will send 1 to turn on the load, 0 to turn it off new line terminated) at 115200 baud') +parser.add_argument('-i', '--integration', type=float, help='set the integration time for the lock-in thermometry (in seconds)') + + + parser.add_argument('file', nargs='?', type=str, help='use the emulator with the data in file.npy') args = parser.parse_args() # Choose the camera class camera: ht301_hacklib.Camera +lockin = False + if args.file and args.file.endswith('.npy'): camera = ht301_hacklib.CameraEmulator(args.file) else: @@ -45,6 +63,19 @@ camera_kwargs['video_dev'] = cv2_cam if args.offset: camera_kwargs['fixed_offset'] = args.offset + + if args.lockin: + lockin = True + draw_temp = False + # check if all lock-in thermometry options are provided + if not args.port or not args.integration: + print('Error: lock-in thermometry also requires --port and --integration options') + sys.exit(1) + + fequency = args.lockin + port = args.port + integration = args.integration + camera = ht301_hacklib.Camera(**camera_kwargs) #see https://matplotlib.org/tutorials/colors/colormaps.html @@ -56,6 +87,7 @@ # temporary fake frame frame = np.full((camera.height, camera.width), 25.) lut = None # will be defined later +start_skips = 2 fig = plt.figure() @@ -92,8 +124,7 @@ 'frame': np.zeros(frame.shape) } -import csv -from datetime import datetime #to easily get miliseconds + csv_filename = None def log_annotations_to_csv(annotation_frame): anns_data = [] @@ -123,9 +154,90 @@ def log_annotations_to_csv(annotation_frame): writer.writerow([datetime.now()] + anns_data) + +def get_lockin_frame(freq, port, integration): + """This function will perform all of the lock-in thermometry operations, and return + the in-phase and quadrature frames after the integration time is up, while controlling + the load via serial communication based on the period of the signal.""" + + try: + ser = serial.Serial(port, 115200) # Open the serial port + except serial.SerialException as e: + print(f'Error: could not open serial port {port}') + sys.exit(1) + + start_time = time.time() + in_phase_sum = np.zeros((camera.height, camera.width)) + quadrature_sum = np.zeros((camera.height, camera.width)) + total_frames = 0 + + # Calculate the period of the signal + period = 1.0 / freq + half_period = period / 2.0 # Toggle every half period + load_on = True # Track whether the load is on or off + last_toggle_time = start_time # Track the last time we toggled the load + + while (time.time() - start_time) < integration: + current_time = time.time() - start_time # Time since the loop started + ret, frame = camera.read() + if not ret: + print('Error: could not read frame from camera') + sys.exit(1) + + total_frames += 1 + + if(total_frames % 10 == 0): + print(f'Frame: {total_frames}, Time: {current_time:.2f}/{integration:.2f}') # Debugging statement + + # Check if a half period has passed (i.e., time to toggle the load) + if current_time - (last_toggle_time - start_time) >= half_period: + # Toggle the load state + if load_on: + ser.write(b'0\n') # Send 0 to turn the load off + load_on = False + else: + ser.write(b'1\n') # Send 1 to turn the load on + load_on = True + + # print(f'Load state: {load_on}, Time: {current_time}') # Debugging statement + + # Update the last toggle time + last_toggle_time += half_period + + # Calculate the phase angle based on the current time and frequency + phase = 2 * math.pi * freq * current_time + + # Calculate sine and cosine factors + sin_weight = 2*math.sin(phase) + cos_weight = -2*math.cos(phase) + + # print(f"time: {current_time}, phase: {phase}, sin: {sin_weight}, cos: {cos_weight} , load: {load_on}") + + # Multiply the frame by sin and cos to get in-phase and quadrature components + in_phase = frame * sin_weight + quadrature = frame * cos_weight + + # Accumulate the sums + in_phase_sum += in_phase + quadrature_sum += quadrature + + # After integration time, normalize by the total frames (optional) + in_phase_sum /= total_frames + quadrature_sum /= total_frames + + return in_phase_sum, quadrature_sum + + def animate_func(i): - global frame, paused, update_colormap, exposure, im, diff - frame = camera.get_frame() + global frame, paused, update_colormap, exposure, im, diff, start_skips + if lockin and start_skips > 0: + frame = camera.get_frame() + start_skips -= 1 + elif lockin: + frame, quad_frame = get_lockin_frame(fequency, port, integration) + else: + frame = camera.get_frame() + if not paused: if diff['enabled']: From 3050c7cf8c46939a49df2eefd9ffeb4ac433fffa Mon Sep 17 00:00:00 2001 From: dimonDDL Date: Sat, 28 Sep 2024 23:57:46 +0200 Subject: [PATCH 11/27] added lock in thermography to the UI and documentation --- 2024-06-21_23-02-55.npy | Bin 100480 -> 0 bytes README.md | 41 +- android_app_logs.txt | 11 - docs/lock-in.png | Bin 0 -> 327290 bytes ht301_hacklib.py | 8 +- p.png | Bin 151049 -> 0 bytes pyplot.py | 131 +- registers_t2s.txt | 170 -- run.txt | Bin 190306 -> 0 bytes run1.txt | 5120 --------------------------------------- 10 files changed, 152 insertions(+), 5329 deletions(-) delete mode 100644 2024-06-21_23-02-55.npy delete mode 100644 android_app_logs.txt create mode 100644 docs/lock-in.png delete mode 100644 p.png delete mode 100644 registers_t2s.txt delete mode 100644 run.txt delete mode 100644 run1.txt diff --git a/2024-06-21_23-02-55.npy b/2024-06-21_23-02-55.npy deleted file mode 100644 index daa8d0a498e63085d104ba758a2b94fe42166c05..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 100480 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 WfB*A8m-62~|GNVJU4j3-0{;itz9;km diff --git a/README.md b/README.md index b9442b7..ec413a8 100644 --- a/README.md +++ b/README.md @@ -1,19 +1,19 @@ # ht301_hacklib -Thermal camera opencv python lib. +### Thermal camera python library Supported thermal cameras: - Hti HT-301 -- Xtherm T3S, thanks to Angel-1024! -- Xtherm T2L, T2S+, thanks to Christoph Mair +- Xtherm T3S, thanks to Angel-1024 +- Xtherm T2L, T2S+, thanks to Christoph Mair and DiminDDL It's a very simple hacked together lib, might be useful for somebody, uses `matplotlib` which is a little bit on the slow side, or pure `opencv` - much faster but without most features -Tested on ubuntu 20.04 and windows 11: +Upon startup the app automatically looks for supported cameras by matching the resolutions. ``` -$ ./pyplot.py +python ./pyplot.py keys: 'h' - help 'q' - quit @@ -38,11 +38,16 @@ mouse: right button - add user temperature annotation ``` -Alternatively if you can specify the video device directly with `-d` to skip the search routine. Also for T2S+ V2 users (where the camera sends raw data and doesn't do onboard processing) you can specify the `-r` option to tell the program to treat the camera stream as raw sensor data. There is also the `-o` parameter which adds an offset to the entire frames temperature values. This is useful for calibrating the camera. -Example: +Alternatively you can specify the video device directly with `-d` to skip the search routine. + +Also for T2S+ V2 users (and potentially for others, where the camera sends raw data and doesn't do onboard processing resulting in the image looking like a pixelated mess) you can specify the `-r` option to tell the program to treat the camera stream as raw sensor data. This will perform a few calibration routines and present you with a usable image doing the sensor processing in python. There is also the `-o` parameter which adds an offset to the entire frames temperature values. This is useful for calibrating the camera since the raw mode sometimes ends up with a constant offset to the image, but this is specific to the camera and thus can be found once and then used for subsequent runs. + +### Examples + +Example that reads device `/dev/video14` in raw mode and adds an offset of -12.3 to the temperature values: ``` -./pyplot.py -d /dev/video14 -r -o -12.3 +python ./pyplot.py -d /dev/video14 -r -o -12.3 ``` ![pyplot output](docs/pyplot-output1.png) @@ -50,14 +55,25 @@ Example: View saved ('r' key) raw data file: ``` -$ ./pyplot.py 2022-09-11_18-49-07.npy +python ./pyplot.py 2022-09-11_18-49-07.npy ``` -Opencv version: +### Lock In Thermography + +This feature allows you to use the camera in a lock-in mode. This allows for very precise measurements of hotspots on anything that can be modulated in some way. Examples include silicon dies, circuit boards, people (lock in based on heart rate) and potentially many others. + +As mentioned above the device under test needs to be stimulated on command from, the script sends commands into a provided serial port to do this. +A `1\n` indicates that we want to turn the modulation on, a `0\n` turns it off. The modulation frequency, serial port and integration time are all provided as command line arguments. + +For example, the below command will use a modulation frequency of 1Hz, an integration time of 10s and send the commands to `/dev/ttyACM0`: + ``` -$ ./opencv.py +python ./pyplot.py -l 1 -p /dev/ttyACM0 -i 10 ``` -![opencv output](docs/opencv-output.png) + +The modulation frequency should ideally be at least set 10x lower than the camera's frame rate, this is needed to get multiple samples as the sample heats up and cools down. The longer the integration time the more cycles will be "averaged" together, reducing noise, but the longer it takes to get a single frame. More info can be found in the paper linked below. + +![lockin output](docs/lock-in.png)
@@ -71,4 +87,5 @@ $ ./opencv.py ## Related materials - https://www.mdpi.com/1424-8220/17/8/1718 +- https://www-old.mpi-halle.mpg.de/mpi/publi/pdf/540_02.pdf diff --git a/android_app_logs.txt b/android_app_logs.txt deleted file mode 100644 index e238f11..0000000 --- a/android_app_logs.txt +++ /dev/null @@ -1,11 +0,0 @@ -libUVCCamera: [20119*serenegiant_usb_UVCCamera.cpp:226:nativeGetByteArrayTemperaturePara]:nativeGetByteArrayTemperaturePara:0,0,0,0,0 -jsonObject: {"doAction":1,"deviceSn":"ME1299","deviceModel":"google,Pixel 3","deviceNo":"T2S+","appVersion":"6.7.240509","osVersion":"Android12,level31"} -libUVCCamera: [20206*thermometry.c:367:EAthermometryT4Line]:EAthermometryT4Line start -libUVCCamera: [20206*thermometry.c:368:EAthermometryT4Line]:correction:0.000000, Refltmp:25.000000,Airtmp:25.000000 ,humi:0.450000,emiss:0.980000,distance:1 -libUVCCamera: [20206*thermometry.c:417:EAthermometryT4Line]:shutTemper:451 -libUVCCamera: [20206*thermometry.c:446:EAthermometryT4Line]:a:0.234700, b:31.179001, ka:-0.000010, kb:0.008200, kc:0.745000 -libUVCCamera: [20206*thermometry.c:458:EAthermometryT4Line]:correction:0.000000, Refltmp:25.000000, Airtmp:25.000000, humi:0.450000, emiss:0.980000, distance:1 -libUVCCamera: [20206*thermometry.c:486:EAthermometryT4Line]:WriteTable fpatemp:29.53, shuttemp:27.59, floatShutTemper:28.19, shutterFix:-0.60 -libUVCCamera: [20206*thermometry.c:549:EAthermometryT4Line]:EAthermometryT4Line end -MediaPlayerNative: pause called in state 8, mPlayer(0x78c52c1eb0) -MediaPlayerNative: error (-38, 0) \ No newline at end of file diff --git a/docs/lock-in.png b/docs/lock-in.png new file mode 100644 index 0000000000000000000000000000000000000000..786fbec2066f299caf68ec21b754d97822a81c54 GIT binary patch literal 327290 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 aytKsUh#q zfeg<7b0%u{Gw$^2NZorxnYa!F{C(XU4^W!Xwz5dsvO%Cmpr(;kPG6Z-51s`!m}7gk z+lO1T=Fe@7gM?`GYPZCXQeAGw) zb80{M!s(hN#t$5(ai z`F;cS=~lM8M@5IBfU_*4#y#+qk8jL@wHLv&623Eh+TNpf|9auLPe<2-j0g0^W>>(2 zZH{P}m-aTK;hRCOR`r_{T75MV6w>+ueLEGGYSk(RDkEOI)7ciCL1{Hi>w*{7kRe4} z(=XY2wOviahW&U=8XpT!!u1~x;!svDw)nfr@Yx(0eB%B7zZals$Mf%-HX~DtHWm2; zFzQ2pHY(5N^9(@oOk`BB3TBR*p`7co9-GLD1k&VVm50OOONoWsh+F#kw3SYUMQb;b z!7}V`B)&Q!BI0R!9=8=YN+bB!#b3WYvNC(YJIT*w)sh?>h1Y#Xdu*yK7J%^zH-H{pZ_;QRLonol zI`ozzQ`F@3F?}$175(m33F?b%m+rb+8tVNm6b>ZR`AQg! zeyBbTuQdcu4w%4H9-!O$oP1egI2h&sBwD
Dr9*PDs} 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

_y9OuX(bUwX+Y&$UT@Hh4!u|(F`!EB2b@; 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 z zfCPH7HW@pJr4Ai14Q0l9_;3`dIF9sd!O2C5~@)32cf@opKe}Qsc z`bui~B$)-`{>P;8Gjiq8_!fd1PX-Asgfs8Q3fhp$mQn|Hx08$2z((|8H2vGiA*b+! z>dvx`sA!6Km&7k-YzM*JpxZHeT@ik{P|=)JP`XKKq$XHfM23A)9+O|YGMMrsqQasi zHqD?sKg~;Fn^5;#{Yd~ema;X8c(iUY#nw#Bx(cL=yHfLqwFG&&J z$aaGqnSO$p?t{}bq73oA2Bu+Y%(nl%UIeI-zj_o_Wh=Ed7IGmIsu)0!V* z>$CYWIe@L(pq?ZbeR^ve4kge99~CU02b&YU{=%h}7DcP&%vkN6d4)pUHGGTad~ zcuj>s2GM>+{)$sPIbhjk0J$&YK#4IAlQAVMZ7#;HBIbm(+dfIFwY&`*IIhwYH%mxo zEZ4$pQt*ZeEp*#Cd!1J@l`_nKl!^Y6V9zG$MkEzg`eX7Q(=5`=dGTamK9kwpu6^w>RYkCD2?-hRIcPu0c8Fl<=)udoFS=-9#GJR_end=V4{H=}Oiy~YQ)jHP09ZAv;9 z#cG4!8ncn4$IRKSXCOUoOq;pi1GTBBFR$SVC!!btOYESIONOY z*Dv}O0?rn;&(~V+f2;g;YkfX*9I!QdTt-=57*NL_Vx_Gl=OHTM?y78Xz5oD<&W)pK z%_UfD`-vvhJ?B5hClf?A37gv3eYBM3kXxPZ_Ffl!wQTvh4~UE*E@xkzG%Kv z6BZ*y(wSsZoFCJWaXw!e{n6-%rkvS=;X>}ui4ap(29e8TQx&CRnK#XjLcOaPT_1lR zPxwXHQFhaf;uP;KEE6jpE6>6|RzSf+z!FI!_0{gCP11}RZ;wxsL{CnfG-w(W$>VZ) z+9Vc|MPFigvud~J)=hSskhwrwH~l+f9azix{c|=Nq%=1!e~#FE#3)U;m|dAiRpX@5 zJ@Q%9yLt~E`B`KeJ6uoy#k7tK8zE2nI$i;pr#+ zC;w{s;zccY-lKoN&oDpL9{2eE@x3#O4YQd)zuT^2qbtKN`Tc^10O+rRB1*rk9UWai zn`dDE^7pts3ob_?>Q*9Ro-Rpo);wuiw~@T?+bOTgCtHU%Bzfl1gKACY#1Y!)KOjdT z%JsVe+#|4+l?N8|&vTNx=JLbXgYP{T9k7pxaf@Krx7fB^8)#yoH0+2k)v!`>qvW;& zGpVLLkwYXi>+ug|bgxDi%g3F9qZTpEmfAigPsn)2!zVkGW%_}D4Hd$UP-XGs z2R`%gMv;cJy5youZh2gQ;>?W4i>Q0T4WVInTN!ptv%=pPB=eEErByTb`?QN{G8Z0m zRTNZN)bf0hUI$!FCI_AS-O+5>>}F65YK{cdv%b0%B7` zcWZ62mxj96z`u2}L2=1-vFT8`*d;<~GO78WQfpybB>0yP#k)}4+XEmB$TD;;?3MSCTBhkezer|{! zgg_UZA*TS-7KBwyMOLg#=4&1AInqOytjyk*#-bVbB2RWN%eb-MGbSJ6qE;mQTaEFn zAk0>Kb%h*~7;?^7p}%4a(zS%XH1HwlJxWxd%?xf)god-2`o(lXJBr_Vyy zPlCLRS(7RTVU`>!z8%N&iY`uOkzpT+k%6A1c48<>kl82VbfKMI!U)#`?JfRP@P~;* zij9^QC1j9+2voMtbn#v1-KnZoXg!-|=^h#}!R zBtfv-63n5}J&;mRd}aTvPZIt#ic5mDn6bCoaKu|6==892_b3Sb4zkL&^rF3b@LTOC z6vL*l@r>3PgQ;<$XDP4aPd6KN}yh;iZPBt$ElJ6V@>BlM>l+0wJ!Fhce%)x8GZ}1E z9-+d4PLY)oU2Xl~HD;I{jh9Fx^) zXTF2nz4}ldxNUdY<`v}O&9k^@^@@DV4}ca)55hn!2I9r0b&7)%p^c#yv72p41Uh48 zKduTY*DiAz8?M|=s9!&0k4F!6 zCuijw<_eBedn^8EF(W-L|H5oBD&n}6Pz&SqCb@XCIKu+|wIAj}*~LkHiRCoKFB6C! zFsC~ixw3yaiz2&`e;}|>KSZaSo5b*eYtIwP1y-{{alCxQ%9(GQep4(z0Q$mlwsKlU zl+Nl@v`i=43IJ6`V1^ur8ZoHBvt)$bV#IP--KCn2!^gi_`3kibmLib6zY4 zMG|_GF zYRtUbR?X*HLuAV2LkIiYwem{9Wchm2!k!c8-rV1rSh$Dk2M*L&LVeOKrD@REb8sm% z_1IsH!|`L15x2H%@u_D+wZ%>#Qn2m)_=@d`6W*V+s4DF)$qkKhsqnbb8lvm&gLc=F z;R~bVet;gkHMOyEF!{(~ayiB7p=R`t7ss<&c__f|WBR^OwlG^2Mc&Ow5yBx2Q5dfy z&O^Hl+*h8uP4mI4FZ03_hIA3HpSBCiljav!I2lR}Br$%9i7FzFi7s6rgvLStW>QVF z2-2l4{T!OxVGgiaF*mo-WQ?bSLiZd=53)jT7r#>Ws}b<7osS9QuzG>aT4tdce6y{jKUYn|aQD^90a-3In2e4Ts6DAkDo5$%?P$6<_sPu_` zTS9E8JU?cE@P*fgLtZL{D}be-LssP9NtrmmIYK`k!gic~af=3g;K9epFJ|zZ4g6iiuXOd=u(eaB=P!8jGdA+0!9W8k7*UHQpL8t*%L9jqu2 zdia*M#~COqTvkN0bxow9Q(px}M^L(>kL)qa(rXfJ#!!41+MV zj?6118mAFED$W3+HSXejjL3TxY-kYqTz#Ma`Ig!JQnji*L!3Y3dCo$j zf^1wF>=qK>0wIAH^%W@*SujJ0IC>j8rydWVG@oFM6oMun)e`0Xohg{%T+EOKuqeCFfvM~jKmX#euEvH=`C^I$~o zwYks{s0gN15p1dvK1HkfGf>i<`7#r&+~Av44+ZlIgL5&&U~Oa55Eu!IL}|*Fe3bh=SL@vSH#e zxCDT%mfn~&$WGg!KK*Q3XRHo4G?)Mlt`U^_U=n?=waufS|Bg5@&JjQsk{OOrJ@~%o zQ@^;k&;<+KnBqgc&d#8kt{}>F9I~$V)dQCUWPqtDx7zWIoh63RS#zz3E|!wk<{*J3 zkNjO%3FRk&s3J142j%uLy|FGbEr%mPJAg4_K2N;atty~o3$-8DSQ8<7jnxI^YZ$J` zUl#UQ+nUazU|i0hw{SI;OgiSyLU4677gCoQ=$~hH@9r*JuGboIK-0glmY8~TDalz_ z70cF|(YVUma5M`qEhQ9Z`0HA^N^QWY%ISZO7L#IY=S5RVYJ(nFCTS^M7ZwoW$~VV| zODhZ-yFcoQW1kDd!SlCMnv;7j2aci6pO|DewQrDC{WRpU1)g}Sw2=;eH-)xp|1w#r za~#oGlAqg(LVZp)od7j#DG*`MRzx{#K8=Zq( zCTS2{{5&XV1xXffj$T%XELlMD`wvLTD*@h+%!=^O-00s{!l87MTUspMJ5L6Sb@l#S z4X;l4CNFu6g5*};E_GZs+~cG?n+T`zre(iX@4lhK%m*~z_6}isAzu_I?D@WgWRgdA z#*uWDq{G`?AllUFbK*wa7~Req&%B19P1Ue1PAyos8M_acP=QY_>Jh!<%!w`o=7z0m zMP2OuN(MD5sYjKKBh{@Y)j^6jSIdIj!HH5pl~ZXgrg;rhduO$6cWweL5B%8|);A%8 zQZQ%|=0ayX66JMobU)(`4Y(#R!Wr}Jna?CjfOzl6~ESJqcg-(;VjBhtypnGK>3 zNmVdKLsotRk}ykb#rx6w`}_%*#r*O)w8f9UCOqH9Pv!H#*9SaSoI|z*z0^?JUy?AU zpA3-BaPyAjjt?K@*(8bTIm=VO+~b|dE?potL|w5SjIO~KRyiCrbKE^?frmd_=wPI< zpFdtrIujWxcdKe)5^9|&5aHc=MwY9+WchX0>F?gX&*G``|91dcA`C=lHfj$Z>sv?6 z(sSu(i^L%3dR?D;YQ4J58ZS2F(#hhq;yk&<&;nY~EfK?^YH5d&rvB&^D3c~X*Vo#D zdk7}vRhhm1?j!ju=YLu(8N2mRRMW2ETbIy7lP)Hh_WZE=@CVf>K;JZQGN6U@dS9jA zvih_D*Ph<|@pDUsv=6LjIxd2u#9m0_M7P zaDQw!9|9u}=v@zZ(WPST*b0={X%bmZ=2_l~wK&M8@dD9Eb1WoO+KKK@Q--j zj8kg1(S`j+qa&$P$L>!R(gytVBt2w80S!8G=f)8IpmxqSW!`egca48dBHp2`;E5yNrvFY z^2&*hq9WWOzk;_d#`g^xsvCp<3o|ch>kA|Sc2+W#y-<-8v|J!8vX9~JpGLGIJVD@F* z_*=xa4e6rYzfNvDbT|2|Hf>`FZev{L;dCHW`MsW8z1??hZoUubzetemo=pk8?FvBw zAahf1e|DbLcJ?T2nQ{S7{1fQyeZPsF_iO(OO-=Hs_Nj2Gms=@zB<8VZtQuSIYnciF^?}bv?20=%;O* za(6MD3krO(rU3o^%GY&&I1-@1?A<2Mw_?sMS^g=@jx)e4xQ$iL>-+@&R?HNFm>I{B zjY!zFAYu zp&aYOxoIqNq?+QH_P%1T`8~@8QC~upjDQxU82BJ7@8qIEi2qvGle z<&nkqrg5Wad>wBQPp&H5XgXwo>-2Hb#T4!y*8Y3=ilowt{2bWipwS9<=5f;hT|8#zt+unrAswXs7@)bzk?UC|oAn z!C)q-TK)ANuY!t6g9&|BEAs3N;I5a#LT72bN3HUEH@1dBg?Yke69~co`~teVo{G;l z>(oB@QQLANd!(6P-ki2v|6AJm=fSw#e1G;Ef+%|q?BC4VA1CYwtKN>QHl85Ylzk@m zA-)a&&6kPI{vn^Wq3wS-{j1i+4%GJ>zc(d7x8Fjc*%A3mm-LZ~9H&1wd(yA2Kjq71_|f|9%Fe3sOCXjV;U!?gudDx=_ogMUajW zx1t16IqU*AnnyK%`{^_!D;{|vbL0HgDH2|K672}Zv=Sh#fG@Z$pe9H!4(q@MrpP?M z9A#4H4AJH93s`Mr!cMlR@BKPW#Z#3()pY;xo!BlATn&n~4V6U2582ytF!xXgi<8Dm zq^{CBtkHQ1Mq-W=oqNv^>nbgovFBoI@>db+yiS4#c^({caF*ntg|F%`gqwsT26;YO zrpmDY^o|Q~99-^fVIW2@m|kkNRa`DYTQy_rB1_KjFDFWVDKfa8d9@##2wTlT2s0*O zdZ=kRex)91s-031tyGC@r0&gAHL52#%6bt#5i{UWhMYZr zv(G=rLJ_vUVS$qOTTdP8$f9)*((Gt(#AqGQ3Sfu+^e^#w8^Ko|7tnIL$@vPe0k1 z`5JB+L?A~07&lM^0(i{(14bH^5Q7FR9h%1Ie;^GlO1P>o2H!UK5`vg3_q4ma5K}zZ zXCyeO!3+Tva-r{i12I$G!&Lc^BR+OsZwXAt*lXFFS+5*?*xIUWG4qM9SI$|DQEvQT zQyLZtgYSZRP3zE4uH&up50j_iHslbaYu?$rxAv!7_B!;wB?2`^zD?sUX3c8-?!@ys z+~^tM0||%a!ObGOxHS>zpv%QbO%9nNZgrZ3wElX^f!_$mYdejh;9bP#PT8eH!)_?b zxz@A$A3wm8I3&>6Rn+94*GLEjLOPyrj#{p>?%U!0F5&&a@3&oVID+ptLXho}Sx6lE z9~A5TCHtLS@G)NK@stm;yY?PIljRNt(NT4UF+;Xn;YnRcgih)Nks7p!K zsXX;dcYl&RdkHInD*Gc_md280?QR2D1HF*xs7t9u+pNEvI{Z4Z!$U@rQukDNNS~Q+ zO7n=?_;(ku#QTC)J_!pMj&idP{dhhGC@y>dgJCzq5g!iMAnEn+OZHe)IDv`)+59X5 zaRur((8KO;RqHsKg#vpSKk_;g&I|I6jGjfz>A@@ZEv%IVl{MjjY%W=P2_2LDmaNI= zNk&PEbmOKj8g)^Z>@lCri%ZTovIkDf^}?K0U>H##{Dq8(>01v_Ql$z9x@-J)t$>2f zksdF>yQpBxBeN3+dcZkJ7Q{!rb#mbX-{5)WTmUyWwcb9&0ojR-wC8Ow!z! zTf`YN>2Xas(Xq0(CmWHK>54{?qyIVfku#&A(Ds5Ojf6LH=(J~n@7A0>=yQNY5}@9>)f!I-C=kqB*F^q z2va*1kS6c}^|eGUHmnCo`7Qt!FyuxkzC_-@h0c{a)uPult$~{y_%NYEC-?Da(>J># zdxp|6R0v$D#VB0SCr9y+kwxo*FC*NVR_c7MfWmjj2zg+Dw&2Vb( z?cLk6lK*ip{vWXR6e3vZ++pa1qN8d*(Y*|Lb6Jb>kNPcJRLO1MJ5HJm) zlHlXsz{SgN=2!IdwU)s5OOm&~Wv}dekL;hx9jB%bqg5}m=KWa;UOg;Yu9GN7P1N)A zUc?sInr;i zbu(90bT@*aQ<9!&@vL%g$%+QvTpmxHm`tHt6C{-5(+@LvssRMc#q!IZEiM73gq>#v z(QRM)2rHu7sidQl^r17plmw(s$NcTg#>A|C0!5v))D0u-uMn+Ljkhq@G@zDywiLkx zX%*i@!^M@v&6>#kO)5d_R{v9hsyay_jG6RP;ES&MNOY^4y-N($DZUb*A4;oqfYOIx zG}hz1HC04r=?ux0uXL6}=dd8v#9^L%!0a$fE=wahVTjyPwJ#{+<|~GL3d`f_!ZUde ztJ}^jZ-A=d8+uYlGle9}d}=InHC5qpR?s zlUl?&Pb~seE|k!IfojY+!ZM1|*suei*^;Smw20g%r=OzTF4O?9i|U9}a-C`?h(i>B z?`~zEoukK`W;A(m6$Hfp)M{=S4lZonA1(bdztMSwEL42%=-j-h*}NdJ(5`vygWzOS zzg8s#43YS~Ea;R%V9OtCaqB;_FT(w5&PIR`|Lv!`w^NMrKnX2W+H>=I{s zBXDk<2oSe6ZjibPZ^I$sf+^!&$(a+AH=@+UUIbJeJ%Kt`OJXcO-bxrv!odo)ol zX-muHbwNIfo;AM?j_fpfn*by>UtUf#7?X9q}|Ovm{;~7vWg(-_Dr=Maso$HjskkrqJCA$D5|DN zjnm%3J$s_r(rMIeB~&^r351=fb=YO@e|B;J)e9DO=6&62U4u1EG8)vm{OScmhqkOQ zdvLHkT?)2Hps(%(q#P%Xa5Eo!Ye>?;2oO(txDvGP=OO+WqNO!rZ-%F8d&S+g-W ziLD^dWjL9qab-}x*K*QMbtwAipv7oITE@;di@t!pHbr}AIKWh%2p3N|^$B@tbPziO zy+6cA#=Pw1#H#0RcqFWa$#M0d9d0XcZ4yMa#>r2kv%b82+?vBk5ySOmj@MW~Mo?ps zbYTq^XzI+e7hp$JMUQ2?ep&~v!8l}imZYS?XA_bow=OT+JF!8AA#gSjYc#bs@^0tQ zu4b*hvQp^Qb21J}9jLW+(`8gNO;PU$@WyIhMf-|#b=po717oVA)-Pzj;f?RI?z-E& zd7MPcd{OwVcEYcocVa+Dpo}qLt-ym47*(V)ppwHOkD+l`o|0L@OBZQOfe-G&ylyc$ z4@;85#vA#1T_pd-1*xxnnb&!GdRpcI!^d{KTL{W+&!9>6F>lCZa+) z#0*GV;76EQks6gV@@OGjZk;rCu{sdevYEF_pVn$G%T(i^=k<@Sl}i=evK(%S$6(#? z@2vk0;4y9rU<`N0zCo!-AMkf%xf>aWkw4~`2do^F$$Mz-z2<583w+iuB6GZ6qi6qB zeU=izGkT*YmTISunHRKao@G>)M_J3-P{j8BQz*BLYwtV4yPoKR8I-JvNgGcnw3^Q z^txepkG->&hPJ66jyk?5%id=$W`$f8yFJKquKY`fB#kqkG?-N$1Fe^&W>RVvnVL=_ zO~O{Ija9myI;kee;7zeMsA_a}Wz z9zN~KrjC5oea0(EDX{hzSw0)v^R@6_`Sr|c-uH<6!~;em9TS33`3CW^;L>1fSH}i~ zBY7s4?@oSkU|Wl+@+7suXrX>NF+Qb`6TaD?@b%kuIW2PWLvySg(WGITs z^0a`0xv7X(hh+$u?=Ep!rG&DfZ6gkk9C}qPHQw85e@c;(L@yo;!?V<=e)f7G%O+fmRe)dpnc4{g^I^l;Fd830tMkLg)K(IW#Z|AO zs7B;b0Zxz7LWolb!l7T9E=v**W(Tqx%*R zzY|;t>UwcbC3Zcxb)`p8*csP#LjEGK_ueJAXq!-au2<^&hkkGa)~i_$zzbdi+y53a zcRX}JG{J@3nTiiv@Iu@*S`dZ7GqdmEzmrMu;zkgy3Su+4SS0~G1Ta59y&OR%Q)hk8 zegDOojT1{1jj5@hnx?UD4;FSJCsdgC26J#|&B8Z>Yj%_f}u0=)&`yDRSGD<|mwSjUvqSjefE8zN%I04`$AQb8>+(img$wPN z4%_E`$}+pbIVj-;*3YSwHx6pyfRXV}CXQTtT8GVQYZQtxij_E0e)>ui$R>FPGT#d1$l5QsOq+&JJgRl~9 zxM53ptQ))6rN!{v&KeD`BHCBgp926Z2l|fh%r|)<*P^w6?lOIlMSfd9*f9HeeZ&Qx zCj;)+D@q0pzRDY6-h}Qc3-{!Jzxr|(s5JSPTQWuo8^ZUV zr(nAA@RI(Uj>!UbU(7TAbJm3Oe$5bZI(WhM3`6J&<0>@!AynzPMZM$r+rNM0kbl+D zchbL;Zk-q%Zr%|3)%L)}f09WEzZ-IA6Z^;PhbNu%|7QRR|M#s~^NWp+@Xd$F&2H_@ zr-kA(WWYb6_28J^U9I`w<<%8rBnwS%F~l6fMf_!I4ZAWeDHP8PdyHWJ3Y*c*UMZ8r zL}8cvph3Jyj5Uiv;(~32xK3sZyLyw*nE6FO`zPLxYs6uU9Ol2?h9%Nm*ftjK1(e8Nq%69Kcw zxw~0+olA4x19`~YSPF5=C5l^NXBcWpL2FdzE^{U9chvAczIenaGGru0l#BdtUL}b2 zQ=lB|cB%U5F-r3XMN1mta5rfglS*W_B`q_P$8ua&j3W=cp?*4wibKZ4nuJ~0cr?9c zwT5*y<3GL?LR{0!UU&46%aUxb*1sE9 z(0j~{{XAZAxS6wzv(YmmZjFS8K5>-LHdUq}ZW=@6>N7YGW0e{c7M)#0vDwd1_Ck4- zWy6ub%Ye!Wcl)pbF4agLTN-1FD-A_%m=#)HkbEGkKi;&(4kd^Ao>krT2ol4|eBqStruwHPdFme^m#hS#W3n z?&`h1=#$BZ`u4i{E}(alwz!q-dz5?$tA7dm&>a2D-TrSG*3D&R#GgJQ`I!LMl>)*5D-gxn!!}XsMerNNw&F^R5Hn^$d%+~#oZ!`4$Zu4!m zj<={-*-p^sc~|Jo*!yhJm+4=B4^KR3^D%QXb)&07cq#gIDf-b|a9>q$|MV4NjwSKP z@txxhNnesjBVM=hJj?oW+||baeMf<1L*Cg4{wp27_|QtnOA4`HwxWh~0E3$avIiBp zkBY&!yDY!C&-TLsp2?s_dVgo_*eEWsydrR)NYegxjKk^IMPTizOLw8|o9F0Ot?IJD zwSj&LDdLixz<8|)w7Y`NR^#&}zV2ks(L)9N-YvLxqpx;jSc%V|xP?=W&!B0ePsKiF zRR-#ht7v7iCWSdPmlGF{x-Gqy%_}c7vKnpjfJrXlIXTHi?wYrTFRGg|s#{IlBkA=O zagrB_xS%)g$9$W$1}}^O%*j29J0h$b!#-HpRmcx6JeJkFG$6G&F72ZPWvuRzw;S3L zLQU@M^faO3^Q75FV?(U?w7%100mkp5V!i(72D+6Umz?(4A9maiUB#`+nwc9h?rw>R zdvr~#EHWH-1QZ{&CgjC87=-n$_VHLaG>sU~1!VcBL+}$q&9p&?i$fLo77>X<@UM>= z)>FxcVRU#!yjr|fXC9>4=^|<`XW9NRYT~DM!3*-lDG9(B@H${V1_i&4s;7OwJBBY; zv)fdpw)xy@ogUx698Z64rJ8uCW9B*^%(`fnes{$;I(kY2cc_Qyq5hSVHbM(^93SB5 zjx3@LS{qY|k#qgolMvSiw`#5;W5vMip|_K=RDW4MjE=_jEn`cOh>HvBr`W)ehNH9n zz*Ti?YKXu3lr5S2r@YWeN+hcbU5^VJm=zjq3i0!8Tgi?f z%i%ED3HbN0Oj3C(A?e|qR=R22A>XNA*QtK7eT}(Fa2(xk{Ny9LGzEC3qfVW_d}Ak2?Kiq2DC1 zrVh|>9K6s~^{Q+3_BDT*O6ZtKUWB{>hW%X-*bPcmd^8ho{zrwy7}F^?fw(AUKQ#;6+V=8JuyJCrYoU;5Q+m$qNzHw z`Yg|5I&X;W?$g_>-;>fmx~SXT+w;bK=h6G-`|IXV`o>@C;`{Q~X|&f5o%`CI1Mhx+ zXQW6)p`y ztbiU^6gW$-Sf2R&;%o!~W{WXm>y|hjBGY&kF3F>y??`|txDGiudZkIrI10(Np6Tw* zRL&!%Uo>ZC5}NiI18pWBV&_PE$~#Q8g_*tZAmPuETgZ|EEuc(6SAyLyStY*YjX+(&Jl5ovBY+`*wCybKHw#8A9XMx%wUwFDiPC|TulkH zi{q`F3{Vy3E3OBFjDPZFi_ExmOh;FLIgdJ4;2F`-$vB$ZmxwQCJu7Mnx5V70r?UZi zFoZ-mL?76(0WI`>$=B^G#f!xmn+MmGx~)Afbnd@|0#x-)G)F@kBx$)VH(@mb@B~Z^ zc}M>IJZJ&OL&yzh*CMM@MrF@678h^c9+e4z5K0`mN*G~43X@>Utc~kWRnsp%JyPz| zl?G#Kwc0e<*rDKWn(>t&M>v2FTqZsL)h5)4EqhFHHFV%>sx* z^XU9^dD37)V|Yi+f|8pvC7a!or6wBFjL0W6Ib%zr3Q%!9+VHe$_Bj6Ys2Qtpg5;am z0{u~8Jek0lv0!M{;i6B9FhKlMt({s3k9n_W`O}(xR(2w$#nKyq)Ks*hyc^g_^ay%s zlIawGqZ9FgsqEm)Fv_+q7kv^PzqPc@z(BS_sUN{bGl;{&#XZ3=3yKCpG~w0SY_4qq zVrNU6%TrFXanyK(g?s0|u5Zp+cmuU2II?^48m`75iEFMY)$_h@s+1vvJ2K^F@6H#) zkNo09r#L!39g&aBti}gY`X=x=nv+;Jnr!Ke7W!X<9 z{%bvU4ulH*J3npS)z#G>QnMfNUdE?h#(kPz&He7on>z0WHg5zTvMwI8;7?B3EvE1- zd~VhKI65KG+S9^)Q>ewisxe%>>uLU>9#SeE-Aa-8{9O=lGGAd-MvsB=YKWT8wAf99 z(CUoqRM4d;GzH|+E~U>c>M-k^e^yy>PB!NSN{;}#*Gen^)uQw3lO;cs5TH?(pkn(^b5oZ91r5zA-D*{5fmh`1*+=~nRYA!hf zWyqjq1D#PT%|xF-r@9-oK<$t^&k;>W*5;+FF^_iL6xy+Ta4W2d=<=zae87pAa;wx* zWJfT9>j@E%pP0#_Z2K)qG#i)kQw-+hPa6lbcwtH&mvIX-{VAe$9YlAnO1OvV&V_n{ zN-t8kx3LAGbB(&@d!X>lPX)r~VM&w)6P6-74wAIxS+rsyQ3aJ4Et?ljJp8z=SUh3n zksii)_TYtpX+_wUOt6y_IBx+5iWDp>M<$(EA3VAPlWJ5^lQ1vci{x(3tiwnJRaw-+ z8ip9puH8ahEeAW~1P^fNC8k4OHM1QHdkO$-F*@1NFpi4Pe{~4LWQVIX@uHWS=-J3} zmOMT&Y2Q8^iej>g%v)PHsE3{yQ?PpF#})RPo)RKix!G^|y``mqn$|GWSXmtxQeCJ#E#bZ(C?K?dE3G=&RpVpeqnpC#rdF)53nhllD z+?UR=2q*&8iuv|D(T8pqI|t^`H^bOkliGALA`2dhNua4}lPSCjr1Ja>4%yIWW=g4r~Y!fczwcIDBrwNaG8 zLFp96T?9jQtB5&Dln*mV(NeAfsGnYEmv-UXN1)^ zp*nAznsMx7d88#+LdEk@>N{i4If8&avH>>`p((|nqhydBLjKo-|?<2mSZWzqqiT12u z6N(XdNf@RPYAPO!w-jC%ey8CzK4X>gukG2f z!)yAYba-Qe#!c)83Qxwl{^45n_B;f*m{Pr_$qw^KNmTg@f-xq~th>Vu zt=E5QFgsY-5H(x6z0nbb(?RRSD@zyDIgX6*k#GPODb+Xa@@JGwqVA;!p-Z!s@W;8v_PZtfi4O?k;m8D~cls17%i=YZN}D=JG99 z{8Y9Ne+Fn`8)#LVx$&nzBs(2(k%r&oJsR?jpvjGycx2Y!eK{`+6wu`S#lE#fI94xY zS}QLIkKl0CR^MS45$wnHa#lVt{=H_y(ra|(o=ls<3>-|61tX3qgM6jMGN&TKpdMJW zlhV|OLFzvWOG9dIaMF9lZjzzB@#q>s7a?qcGz`_vq8gEgozrc*XX>{Ntk@cv`FKFU zuIhSX8IPt&iWX53G;`N8D$7wo8h{T@qEk9u=DeSv3|ghs(T7Z#IGy{Xn-;f4N#T$s z04L5u3O902FAVl!QShu+@(bce;o!@7Crml>@p=5HQ`ZX#zN5U*hY{FfW{BG@d6|5mBIrD_N7dNeUG0O?O-azMf5TDUZDq;N zP48xb`jbViJYvb9M(2|`G7V!9+F*4xuuyQEl)SrDA2k?DA#!0URs=&*x=?Lw*avTy z6um?%oz3y7H6RyZ@6>PE-f7itQ*Duu+Q(L#WIX#KZHUS*nl*~)hi!uCq*tABy0m2^ zd$3G!KZg2Z>%(Fzd`m;4jH?@>hOM?qjXbKA%e2kMM-`9&h$3R9T3CM#_uea3Y4O)o zZnt~d#LJQzEo#QWT0TN~o>xw)fezAN8UG))L;Pu{&MHFIfM8mI&mQE;0DNxqdOLQN z<){4gdiIsJXRl1DmO<2}!zvELVu^^Jqu1C*x0<<57(r<_MfMf`|CT{C{qz&_`+nCJioH8@Wo2d2V%JGq=h*vO z#?&L>sVkrNNs}+b#?wNR-rqgH6Yb3~l9wKm3_Y(Mv|Ev$)+Z^+I!~x6gLX^Gz$>STV zgLAcuVIpD7)II$mh>nHZLz%iPXTM{QL4h$GSK3{-6p_>_C;elkFY!gXzt}P`E&3pb zQe!dPh6S960tnxtfvQm?H)qHAkyhAU8%f8iL|R5cmhS__I8&*JLPjT7~w3(@K#SD{3Cvi=xJ86k<7QB^*Fh6~JFHPYbzEXj20{LBle z+D&loo&V-|lnx9I*={9P{haYf7q|c9ge_B_&vz_0e7D7=C)}^D*5#v3%69MoopxVn z#m9i<-$NJLnMDawGukJsjg*rQ8wOP`4dSRfMG{Ba-IhpQKFZpH`#vWq)kyI>angc^ ze0#(hr<&YV@&3{(k~Up6Xvts^Ya-K;*%zQFs$McI$oMaeg-mBwwe^nZAJn9EY_fs_ ztdEFGsJn(B3zN#o=c@^*q&c4P7}$|2EQa4$V8Qa}(>Ue$d&v0!auW`4Ol0U*(2UeZ9OTy_mE+@Z z+o=2%N^*si9)BP^%aVfowxVPhqzWcwvXJ}4%mkiJ{n8{jR-ao4Nh)C@n(N~8U2vs*U$`X za5+I{!_eFT&@Xd$KfolRtiKri=$aTd2_{j*ayCw&4bD4D5g$Y{3j+2U2;?yjv=c7qByZ+@J z)9fx_O0ogG%@zJc>n{~poJxFu1>&_08u`Z}*47UqmOB%H14>iRpuV$45#Yi$SZ^dH zBDBCZ?|&ygT|lZr#v;&0ML@$wh@2|ll=!t6EYG|bmlE`=fp=ayOvI1=CTfB*Hz7ht zB_r5coj z1en)Bgl6EeD+|oLYMCzIG@eW!{}!e6JZ+3Tm6s=5eJdrXwOf)mG_Gc=XU zMLYL2;UhE*slW7fL(-3Fp6&0)@!^d=RrfrBSt=omPc}tP=`w@=d-LN@d;aTqK}dDz z|C;5`_1Ql65L0^s`o95c9dEy`&Fl*41DLtUok5M#j1gVCB;6j*Um6$lN87P=Sl`Ai zA|1J)J} z!r=g&e3luOT6aNM#X#OXGH6n25Yxo$%yoYZVp#xTe6s|Af>A+b_Qzg#7_5iImJp>s zU|Pk|86*sVN$^Q%CqQtRB~23*?j~m9)u+xJX$~NKFxF) zZ_PHED}wKcRYkwiNVL5^rS#h}2-~tsAwUy0ehqSQk{bNHuhcS2x;1nR4leuK5pA31 z0Vfs-9bzCDv_Ycd4u}{Qtwb!tFpoqJ))cQU;)+Z>I9cwMu%tO%6{uHn=*H^qRyilV z#rm=Qyr!B&NYC)0;{T}nrog(|VC@~dv29z8Z8WxR+iqj+m~GtHHX7S(oW@NWr_EXU z&VMfci(F)D&6+ju%ro{)OVOvHAsrj%0sW*94O)8E+wzEKGQcB6Pb2=a@9qKuUmXzG(_~T&a{8Pf1m-lv@2==T+ez!r#E;`QNCExZhkk4{9oPX?SI!SrC4NW1Z;V4>KDwKY0pi zf~mhQM@V5RCDIo1$Qf-P)@O^HZ#Dm9lFP?IH{Zo%z}Y1P2ip0HRb=af8wAmG!)LdL zE;o@OGOZDk?PbJ+z=sv94b%5_UZwO!to}`h<0W1Ld+<;e_qX)20~n`F{u*d>-fy0N zChpG~`l=cvt5?7SJL6iOX}_dYEc+d~bnALV@$>sZD5XE}s_@!=Sa`UH#PRI23x)OD ztQXLE#)4`HW+4Pt2~DC(uN-ul8{HmqX)ZFbEpfc;Lu86!Z1LmR}j`LV5)Ov zU4w?DShp$0$1A{z zZtsgAmcQj6xTeS}v2Qo^^ZBeZX-%ei4$9ujHhy_u3VAA8t)%-;YhxA2!|#G56-S3g zD_-uW;%BKMth`LCK!uEtimS}^&Mq>7sS1wnRhf}vG1J~Pvn~(Z5TCkv-g;o1qpcc| zUW}&AHjIE0$k$1?L03Xb3OM3!By&?f^JLpb^HBu|t$O26x@Usa?i?CrLKzGn!eP&> zmFK|Z2k54tQJ*Y)Sq3molBMHWLCPN@blq)aP^P}22`3~a)(;Cd6{sQ5{%@y!TgMGr zD5ycA0bzfqGL{Wu(ByP~$;J8^y2aY@`QJ=jnq#!=TCS@>JP{}lcDQjRmQkwAqQvxl zUL3TMW-@79M5d1T`ulim8nzaa%>2dA6QzO9kiO#>&W`80$By#)RtX`5mkY4%$(8Y){SRbWx^fyW^K5FhA%5O z22UAwK#cY;kh*~}`g^MV@&@c-D0P0OdEI0EM*;fzJ}9bh@)0;?&y81C5B{&~wSNiT ztKmRD_R-%nvN7+$r__l3tfo;L$9*uk#KoLbzPbLi=Qx_W(%!9JHms=2C};I|_Bmzh zvfa%_r3*a_MzNRtXt_EXlF3In4%DndSOYVje#91^(Jy8>qUnxYV}_(5xM-zZL1bce z*bc-TVs7o(2`Rl+jL#L-DU4PPBOTK(%C`%l{NZ<*be3ra_(kG9JIb7+r(jc9JRuNa z6tEp;y+NcQkA|{lO>*n@AOs&edUw#ILsm)V+($_ZZmXbPggw|6(kydI*=%=1N3f0Y z1v4jDYo#SC&J%Oi{z?izCzQ!t3WQt;^w$23Mqc;oWtsEP3@8Xb1FVyil3|Ol?a*L; zcNv+&;+5CbOp35QGpps%o>%5*qOlQCgIGuW&)pBou@A;I_~vaEy4)+2>0N`_59Kn{*tmDcaNy{B(!~zq|4V&`faE(N8o+I-KdiKf|B=LxL>tBm8XG0^FYRRLyWPYER zIt@~uLTU)N(Ju%50;Y!?Wwj&@7atx^xR-b$Byc>p-;xckIa%EdJHNe&6GD6+&t9-J zxUjd+^MtUdGdK*3Q0d`>tSz2lcgH=qdLR-_*DWS2YMvU4aZsQj02B&R1jo*KlP zm=I5zT6d-Ua*15~=A{VzEh3PhZxs=DWxY9I5ZS9`f1W@>Gs7mnt_E4_8fbBLP^NXG zM5WM`Wn(+uEiklx{rMs6O)sDEP3=M#s+#qsfz^Kb zQ56O34~UQJO1VrR(yD}DgSS>cwR>N+aCCeTekc@{4W!;O18P!!e^~<%GS~gFIZ_+> z7rEQ2f^_XelNdM!bJZCOB+}x@0al^6PTorbG20eSIi5bpTuL#%4k6bQmI& z<0fU%QkIyam@qzxC2WcfnD~oH{L6`Yzzi-LPa$pyYmKqpW+xb7_2|r5xob@SB4DZ6 zd}_B6%}L+UOs zt#E8)x#<`f=c1sbjn*BUkhL>h^NU4zW)O~&jw$xPMSH0$v!R);ksMOs=8p$JeVzxPDdK*sZNGF zK2KYURp*&`aVO2nzTi}sF*pDI>?0EzUH8dM>yJW@hl`$q+PSXYM*~E?oB~ zK-anWqu27@B$}Mlr6%)%lrSEWq0IP}MT&<4$VJ~jv+0#}!Qtza4zrafXSZl;0t}hq z&-D_6;42$(DTQrol!fGRLp5sQ}1f6*1jSp;Y#!ijy-dSm5P2W06Rq2Rw zrY%e}vY}J9@T*nnbYHfm`!yQO&JA&VC41=3w;KSVEuwOSUcX;N*|%6efC!MPLvzn` zh}-||;Kb^#(#vfnm5T9kd9G%DiPt`rTH$Y_W+iYqN7vODZgS&}RWe9TDrG&C^j+CNotQE+buag~X}u z*qh3{eTZ1DMPI)SkB0-j9s^f5ccPVvo`5J!?*^{6x`mJ}8RbFunRm|ixViPHQ_nf?x@yF!0*ZnwgVxe>i4t_~%c%CF66IGRzWeIbSUyj5UpoDkZW3&)Jw-Yr3JsjU zsV|>CP?0!F=Eg)Q0ZXoa`^vkvlvJj4OhNNC93o}uaJ10F0&XmQhpS$UpU2Z&n`P(I z2{a4_dPIrteH27Zn_Ruy${f6tf+d=Z4KhqW?T-Z;;&Io0 zZjW&93XqRY%|A)y4U1tW@zsvt4iW$I0I_!ByWEw=;t#N;c@6Yz58AHnuRiF^Gw``) z*Gl(4M*bzJz^t^5%&OpZ+5SrRsJB3(HQHVhwpclu(h1oQ7PA9d82MiEY}6IbY)QUs z!VC%hmv(h1LZ>nnYBxv%nYofvnfvl0iTYhNyky)I`w{LY20BQGz;`CELrnr2FhTADcPOIc#)>bB46=ED!5wh^hx8 zv<*LQy>b1Tcc(lYE6je25~G{_&oMJ>sMNV6@xBbfeao6LLbCy~`h-IapqqIrfW6Oq=EU$2Izf`n23`Rm@o5wxeMp%9mVh<8*h=o*8&q2;!n#QKdi}so{!=u&g zp$b~=G8U;3@7{&TJS!wvGeI?f6C6w~XEvs~p|eL@91T)o?fi}VFbF->@jUp(Ut&7c z3<@_$HLb#ib$n1i22UAHywoWudJ&*7W@%4lsW`rGo)H0qd2%*mF#K>rOmU8}AkrNh zZRgA`2VKk{4QyX89icifl43?-AXKVFr%xuZ3w=3LfSKFmppSJoZ&S)!H&x&{$ihjj z?tssYwCW6M1(oM>?qbX@{Z_Ut=`dSXKxy%!JqFw2$57R}BFulm_dSA>F?$AY)!&7! zb>JlX&{g|Uy!UZfL|~Le#o~EY8%?;xsA!~Tf2K$(VNG)PUt~+}V_e0%DJgOhD498# zh0)<*8iWxPm7^E!X^x=ai)Qkbb)G)RENL4q9U~)uWa13Ey3Mto{`0G*=6lWMzwPIq ztLnuzWETkwIWn;rWI5$bqA|oV9dIX>&(I0KrTAA124REQSh2pxD@oZKT{~>w&&6|e zmhEbV%(U99#qLpGOV;U`qWIjNaybhjOJq)2E$2ru)A+>TD8aP8iv=25F)6gV^cYk$ zp60x_cddVu9^Wdec?KuHU!w2c?CT5MlvL(Zm6YTM3HZJ_7~5TaokU(h2n8QH{!?S4N3YVgOc8%1le?ik+;l&1qfjUf(*P%BL#y$KGRWN6I5IN~9-K9) z=9S2ib9DA(Yf^Y%VvJ+lDpHk~=L^rM!o-r#6^BFIjA31jR6A3iJJ=80TBX0iar2>RgwKFHI~ZbAFR7-9esVp#Id=s=#wJFqejhrA{U{c z6YXHm6kW~`Jp`hUCV&|IzCIJ8KVY#FDBq9CLP%wrdTpyj&f0qE)^_6DrovXeQ<94o z<>9tsYp22@*VKGyZrqvm$mKahh&xSJ%q=>I7DS4eZcA6Y)5Yvtg(D zN4Ox4WRkdQ9EB;p-}cGtVuIiC@5IrNa!m#rT6nISK|bbR7H3;mx7>Dpg;)q29eOhKONe>eUpRtVlw4sM+EY3@ss9NtzAw*zQLH*G%tlw$U!R7e%? z*=7T-*pWbO?KkNW^7;z}4TZd1Z<_~vQ9P?Ye|;0vf{kPIN|S*aU0ONOud@$jba;N) z=84~39x6ITnlxRZkyD^moH&LV?CfM@nL}fXw?eaFvVJ|c@Zw{(#P2W?qHaam%*Dx- zhJViVI7_6Hyfg^Yz~Eo{X9?M+0-q)Fs$m)u#i!?LlpJk!IoL~pQNdJnuxw8u!SZ${ zi;cf64jLF1%of}keminEf~-wfhOot+j8k(3Y|NP5zQvpz|5nY^fmK`XZx$sOhHBB$ zGy;0NQL$A_ofzwqH)pCWnspm~vC(CPH zNHE?%RhKFq@A*f-Kv5wzQ_{_|p3pmci`Z9ArAI`--)LT$S!-FfUKmoNii9OCp`o9g z<_{?@hS!OsMT1!!J+Xvg32#Z}iD-+}M8C#^pzxtvCw}y0`*@RYPa0Lllna>LrKNdc z)@G!+c+8GtHWYVH(v@vcgGP8QUM0XcaKgr9+dzJ>i>K@fNzFO>a~rwfW%oH|B$69ew!Dm{oA^(YbT55kz_6;Yy7nJ#f87}V{>H}4n*~@B9x{{1g*?L zsaROd_aS&y=(an(V9L_K)hwRtJ92agwGd7{e-83+H0Cp*F(Likr@;$wVw&u)4APfQ3@&Ni#g&3WiX#-|TFdF{fjnD8Yjf4-(_2@a;PR2G11RcRyZ)`)7V zb+c1jo5KJ>$9@-dA-jxpM#pfmhq za!G)9U+HpbeAsKhw|{RKYs@%N5}%wY8GSyP{j^|nFzqS_NmbGekLo03lhJZajidwL zPb``)lHs$5(9QJ#Ti0~=!GOE?qniygV@eor9o0lk;lYoC?Wz!itj(ef|EoP$jDIjH z3Zu3HTxttHA$MSeOQXVBIz`sPOwE^dWUJP_r; zfV(b(6#3b)m>S_cYE_fP1NKk@HceSo&d(1551*;#Tu5&KG+^k7$cX$r9f67OSvUn- z$gqKU@H6(7YXIeG~C59@dJRl7$s*h4Lcx7Gu(pB_KCi1_Sxn*`4}bbF~? z3ZwFe<1!Q)WF}?KwvXDEf+gFT0`aKPXADedA0Jw14OoVh>1CS2&a~ujqIGwT`=6-n zw{f3#k}M8=C0+e*d9b2AS)A064=Dzus4B~8GBfgybLH?!KMm0c)B5H+JIpCZwqPh~kW+@NPxdHc$wZGF}qCzPV0)wZp>`p?DHx}#SD-#`1Y zEKRg&Lc7s499Ct%bq;exa{0hv8LC&Chou8$4$;}}#sML#)3S({D2#9tWnOS5pUP}- zNXv&+63?);Ap&* z-!*wcWl3T=!Rl?v;08Y3?UO2JG=hqxiiSIq(FR)GEY<0v1FJH!>L262hF>f+o5k&l zudXH|Z5eFka14>C%~Bx3M{_JYd1;5fdXM;5Lc5tsqiUJkb*q!zn7srYxBg3=0ki~X`cZ*?f*rE2jD%ShR!c(G+dne&dEwAFS7k-~b%(dCV+2??F(Gr!A z_T%!sNS;7HZ<|h|ud&4D`F62OAL4@zaB1LgukM{o$BKToOawsIch8b5l)E*QfDK<_ z?Zm%^a#P720434uND>W)v4u+M9(Es{BOhiD%~RkrSO=3OVwlJ=Y~EV)VaI3WQ+$#) zlPr=?iN)j;%*K=pd$IMh=MP?_%y31UN_DV;WQNq>q`N<~F0B(aRpVh~X6ObZNA5;l zh!J*PyVSF^zXtyMh>bSNuwEd7wR(M5?Vi`YCb^sCG&$d4*3)C(ZXDAdHSE>mpNlM{ z?3$m$4ndC749&no`(U?bZXaFCEVCG={dg_SSgCApR#G8WVn*h_%3fhImd?{u?k-3Z zWBN5>*4(=3cNU>;`X>f7eAGzxn1>*p9`NtmQj*8+2G=>qFE~jef(w0X667$d;G8DL zDf_Z8NmFbi+5WA`T>|v=kIu1LNdtvcUleu2u_Q;j=5qb9UVY8^@D_>x<$sj(ag8%8 zCnIM4S-`?AcQ;+BQORYq+wC;K@@ntyq{yNudgh0Ia+yI;nDxxosR>`{b+WAf9qgx@ z4EmbHhhZtP>V}GvOdN`=nJP*cy(p{U5hh<6(3_zV1&dJjfiBmgt-6;R$6>%X6G}4r zgn&hHJ~@g_o6&eQQ;>oW9Yx~)i;WGrVZKu6q}ZZQ`8Us+uz$QxBRKWb=?M&ueZK{r2ButUCB#^9?OT7rTn1-2 z{)xhc=k38};=xt62qQ>=Ec34VVhCB<1hG^*P)L|KGbqQM0P!xQ3zu&UQOqdpTgCvZ zRh9km$*bAmJWDxn?xi9S!?332@)tX|dY9p+IO5eRyg1}xj$3L!3RI+)@@MLE&7rZz ze2_)BVlVQ;z$m+vCN29L9+MD1X%?*K9CBwSw=0;cw|Mb#l3nX4E;(euD8fS<(o7;3 zxmf%Ze*mpv3|;!of~bheN(%m7wyH$kcO;ev$rBp|Z_;7((oos5(UZ3qUHB9d;%0oX(K(BNXNZ*`N|JrnEhHAKMo16& zy@g3z+jb|4f1!LJ$}oL`i_av|u0c^$AlmCxCMP4)`SvdjeZag=axz!*nFD=RYwSp} zM#yB9wZco6yeT$5_BZz$Pb<_{qqWr&ElH$N(sB^UQ4TjrVV5R4f_;2AWFAU?QQ=ez)Q>87|gum@|v7WB59Wx-| zn3f8bHWjwP^+nmwE8x50nMFY(R%q6^KM5WX%Qx_VOv_D3!emJXld$MG&hvaehux38 zO4bcLw|xF+F)K=OXRk8HBO)y}w3zT?l4>+}MJ+~8B0(?$6tG%=j-fJ-@z?LSz=e)* zzC-d{x|RVRqpn1YvbZ%}Yc;S#LL6UXHspIf5>ja& zxrZvzHTk%VO5E}#s}Y6QtQc8jP@8z+cGU5*(yDsf{!_2e>dGxu<&okN;gS_psw^=1 zgb<@lwAfs`@|G&t)s7}fbcE>1u+RJlIY(QWT9Aa$OYc_`V5ePK9uBnRjEL}UV46Q|5ImnI z@NgjseVV~3vn&rB2HF!x%0~y?-MO5Q{|``n!zD{ftp>og3FaI!x`{JKMKS3Y-O^+{ z+?7+O?UwJN_L^dHP;`$;+=yd0_Dp>HI{g*-(FVwUEH-*!DdSODCyUc9NVe9^e=)hx z`mfb#S$g_+4k5-MH#>B_9LWnd4pHuM|3FNm@ert4>livo#$aG*>>CuiY*m4zX?8t6 z7!-C1v?7HojN6>e%^(>xS)wdoqY-4O_FR3T!iU#Ty&2L(3{ROX#1uu0Oc|dQu$9m) z6?RY&gMwtCn)=9J9MG$+M9<;CaolX@Og{IWPJ%o#R8kWhE?A@DIO|IsLG3T81#?$H zseOPzX;vM1m;ERl5t7^-^CfBoqe{GlSfmA|f{AjBK}C1i8CP21H-h<@1xKInoLXys zYLxh%#w%>ga#D5vdMx}+8w zx9h$%KLoBh*#eJD2NA-YDwF2a9nuSf2YLh&>OwcA?0{}r(tOQJNxY~g4_R`Wfd%w- z3In_ebPPCQQx}6K@7&*PWmV16CQEc8Mf0;qOpyy;+-!f?n1$3rcXRryV)kzX((8^C z!Vk`8UpAqT54M?5a5E@(e{kEDLEhu1;Qz|UUv6YH0l<@nJl!wofXzB33{mZB_WZfY z9zp_q2PgSQct&bS#>$QnpFiXhp{6p8+qT@{NgN-p5RvQmoGr+nUztp;FXWcDYFiIx z8$bVH2+&1csK&CJx+8qcP8XjJc&y%AX$Ph1Dyls~ie<+bnU-dsLio^)j; zlV3)0c5pn0bko!Kq$6}gJGP^@fX59*(L4exn-6NzEdNwPh*KmQYj`47Dao~fcxplj zEoHTY6sbN6qGd-Zl5g*qAIW)9coGfamS>dv)Rb)`t2CxCXU!3+bx@CZDjsZ0Oi6y5 zRycNcB&*fDNqCjtlNCVSlp&=o83n5;WnO`;f2R{aqQ*#| zv4sC?`8JIpa*@vXL*!60ZY9;ZS?@@se~Tpwi$}8LMC8Ow@@SkRW-|Gwlr5$v?4wbU zb=l63993muZnNTdV!>lXt__khZ^aw4l>VeBYj$*o zQhfGO^p4H;$}qnbMm}qa>o_s4B}96-eilIYC^Ofsz9Liy81iQuQ1lm2fVuLIBcz2R$&&MABm{79%L|Ovu+qs^+v{^>ZBv84 zu&t@QY>G~BTu@EQAs5{fHBGBY=zfz4pETB{NTgED&y0N1hU7@5d!X~3Nx#xICXIHJ z`znKaXe_p9{AauMtCp|qHxG;1ht!tsz7~eM(y0_Cb0$7=%Cwu#!Cb!1#OQI2`JiIT z5o+9laxkU?TKgj`8ewsCLyU)|>dx86#zPGd)m9kqnMeT+QyZR(WK()7nq6=U5h*=}#I#VuRu zmLqA7a*%0hrC$CeW+IX?44Uyxb{QMLePss5r&GK9)7Q>2OJSG55p*}XQk4<-53R_8 zPFbl|Wr-T|soyD{qDKnjZZYVwssFU8iL7_vi;RI*^G^z zyA?5rDnb+=ACD$(@^o`ZsByXQNhE%*NTx_8kz_UK<-&CsTRY(Ay$4|;&XiN6X*hx_ zNTh8GCBwGXjVc1=@>`oZnGYQTy3j1Aqr^HGO-0#){J}$~;ZRNsD@;0kb4#(m%3t_z z$!#L7+-SFs=!J$M#PX;l%LNNigdtBlViBQluq0a^X2Cx-dn{ekq+SKGTe!?_AL{}YswIuZxK8&Xxse?04IVuW?n9WpiaiXRgEVE~a0&I4=cFSgKeJRI=P&9a!>08d$X>1AXu}6 z2t(6zw0`7FeykJwrLii@Z~RNgg<9>EF(sMJD*XQ8fELFSoj+V|9IfNjYTQ$Fl&D?; zMxG9A!Pr10mLqrG?8Rp#zTWEX!}=H*M@$dx+mXvF{}>>LkX)iNB1(|vk6NLWp!g&e z7uy(rLH7}Il}c{n_IT#UVuiZvbw3=XlDYwK06*T0Qr6qdQT(~wA`GF{#iUW}gTXZj zv9ImMkxTgr3_B7ySZ`SCB(unLwlvTw)UVS)AcR(G%G6Lr03XwC7Go$nu6><4l<2V; zm^~n2Cd+8!iIlNUIWR&$3q)hnll&@lMgXNY^nzCL4UJ0QtD0Q~Epu)-xAh z$?%}0U-MsHO*Ga3;gqS9y3M9q_qoXZN9J=+@ccSHaKfm@mf0^AIFRC?!7tU>M-Bfp zNY9?ATq8F9rFMQjtG-$2iKd@-*n1dl2uE{Ew&a%4RzvE_t)0R6G|QyoGZIn5L`Wy4 zYEHHyuEbDq53L7?>8Z!xFJym_$BF13p$es18q^l|A?74bL=xClj-Y-}oC_PBZ7Hyc zTd)u}Diw}DJ7^esej?M&1(bp)O_RBXGr>+OpJ zx&!eTrNc%sS)pY<(yt83(W;vYrKc%uj?hiv@1L2KkoSvIl?Uca6xgk&i8LxT74rr0 zjsM+b{Jt%C>)JBcsx^v7z@&M6n2!Q?nhhfo`5q+W@j4MXb^Vrp-6wtPt0>El`SI*tc)R`0vq3#VULU3%@=viNa zh-u7Ay*V(%A1=!nge*4)YuI4VW699?)qnRR*h_zIL7IdSt)GKtrrmABB&=5q56o4e zT^bkU{l=I#K=(@mzhsmw{CX*ARyR>A|4M2%=xdpxN#vrtKAAst=>9qu%z$zVv`z~Y(j4n*Q{S|Njeo;S{n=vwDR-p+{ZT=AL>eYxZRq#Z`h zJMbxF%^KnL!6hZkt?ApWIihZ4Js)))c_l{V6Hj;tzuX-~Z~%!~|4-z2c`Pxvwg0OH z=w$x$XSMgPOGauidf>z09k?9So1aE@L)9f3idMHL8Fmv=RnL-!{Z$@_rycAH?C9-$69=%7~adkaeMWbm!(b$?|hvhOFq6X$fy$_~>= zNY6o>YPji0JvAfrzbNZyevvn4R*5JtUwTrHCude*NvO#~Q$$flRUS?|C{S?~7bYWp z?5HZl)tV2MsW|io72qNE1@rYXWd{U}YbPFmgC~}ckC~hr|2k2|4tV~QEeBK({O-*p z7kc{ZW)qrQb~b*KSjUWa@Z%IWF)nckXB>q2IYf zxz+j7_cG~|+x0L%I{3G$>xXi5tw}j}i$BWV52bX%8Uz2<0H)^qU-E5w?*#h1{{G=Q zD+UJvs_DMhBLbG)ww->jWV0Ae>iD5lAWRHmbKdSkVR>lTaFQrd>!0G?iF0d@>jwPD zPeONCH9gOEGw$vU8O3YlRwK_t1<=lh_X%H;|faN#dU@_pySUcjaq~;5G0jz zU{n;Q!j9T8Zko}y1eBbEwSPNOIArOitEdX8az|4uVR6unHk!Rqi=EzL5B!sdR^fh1 zDjtrJ7`q6lX2KNwXorjap;iIbax4ZtD4xZUYMkLtGA53cBHxs_oG82g19o~uQqms^ zmx#pmRG5gdMC|N}Voz_yAZEHhblB0TpBJUSMJ!IVA?4}KB+e;Q&;Mg3^dnbCNg$$Q zb=lK|kF2ADr%>y~(nYkL-()<1*Xr(~YE#k1BlazLRm@^Xo31=WXmZDhf{yK}oIH}0 zGxQt}H04|O_ln?QLrhJ=MZb&G+9~3 zh{mRzqmL-Gbvj5#PO1&GJjZT5_WGKtCTg{m=>j88I(P7S^hY>tf~ezwM938T?dtqI zBnXeq1O)n7-MT$clqejNs?3k@cJ=mGr0dVT!fN2d)^DKH9``ee-w7PQwzlX;J}jr( zU=%c#`@Hr#%P_hqV)<~cYj6^Tp@w_oH=OjLBv<9ZXsdlk5(S6R$m9UbEi% z8LxS^D~RK?4mV>HZE@d1Ww$dFk-!S$82yU={4ok}!xUA11aCu+pG>Hv5y2gWKRM z_k<2IXi}D~2{ZiC^|G_sj$I{GBzdVzIismJrQ+yrdJERJj>Cj+G(#FcJSm}H5~BSe z)$ntpa6f>ay859^_FNrzIisZhcRpV-CUF&KsfKb(IqHQoY+4MZUP2poH@}q1N2)^| zUGY756=Do6ETlP_0*lssnve4`u`-0m*iApy$Nc($!1KB=<8~|7y8H%{YNMw@u6f9j zQ>-}eKhL7uFXtKAF-cdYYWc)dxLHi@|;b4qJ;b*!8fy=gdt;;YNBsKumgC{I| zXC8m=yFMLe>~}wG4{GTuv&E;WNrl+sVI}E< za_}8B5eL^snJRTpz~Z3lubb0m4NWyEMPhn%P3bSqceZbgBwR@Vw;lYayua$L@$ye*(4sV`l{)9vIQ4~Fo221O|Hb~z+$ zMg5a5Rt+TtZ*5f|haY#Ny@#9*D#4-Y(jTS%ROz9yqc1Qd*)~!9G+JP7>20pl+dZD= z%J@GKDxFz3lXOj1mVcRYIEWOb45*JsfJXxhQj9ii{Lam(w2hOJd zdGQjA&h>b%#zyC?Ue8_;(4n7++~DuG{hdL5z5ni5L4A{1oUTin+PjpbPw-CN zcUp180yr~*x5!>wo-23XchX}5aC-h-d0~uBn^;RzxQcU{er%zc`M}Y65IRQdj8UN) z8aI$<({Ba}`i1^oqO`i6NueIDxQ)zC=t`rlR}JgCw#}!c3@JQ zWiRWMTD++fZ3_qz$ED?BzO14zhGHf3txvg@Pak)JiBfRyFp+ zg?nccFkCJ4x>4L-S)FVj!!vb^8uAT)6nU^(#PK*nR?05Ll52PImoxFyu{#ooU0(@Q zV?0-4>3{H2o=t&y)bpv#$-0RFdQ-r{>68>8ZUa58iZSs0N-iS-9WgHgNs!Q-7Apd} zNq=zSGfap5r*<_i*CZ`YjrA%+Z3ad{t(;+VjnPMgtQKF>tV%dg0jVr`%GXET%wC#^ zZeEO54>8wzV{&(xkpM*aGcHg4(jm^!t-NDZ? zFAj}UJpWozx##rS-KdoXo8FFUV8i=OJP5RE45EYnK0|=U4>_{4v#(p*3$_Xyp8xy` zzi8bNUgt3%L7vRzbFcoPl*f<#{(MP-9!-0dI&p8bdv37bp)08F?ca+zFnYi3=_rTY zez^+e`+j;<8l(2!3DjfvfC*cNaL~a&r<#ZHr{jXe3D(|#>O-N2O?N_#L}ucxFdGzn z4(M1M<^jN%N3R(9qX2$qPNzH}F{4&h-~ER3%*93N&wDTDs_O0$yeflsju@${xgt2D zpeIWWhBOp@?AC#% z?Gu&u_cv~*c#8s0-ca2xoy3}o!K+T47a$NoEols4Oy9-D_B)kLD@NI_$bhSi`sZZM zyl7<%FPw8m5EHlx>d{n=Hl{qg!zvpxK1Z?i&EJBzSK0*r)AD$uUL}~IS{MIL#3R?clOX7Se3-gB=eUc3^D5y7iT@<&3LtZ3`F@D8xU8_C{~Q+e zPePHF6X~99n=`?{%)X3?Ob$!L{J?wNP1hg9kGrVBU)-npj-i?>^nIEDg2U(d+IFJ| zL7>m1K|W1?)AgNxel*b%gb7dz^T=D?&f|!&;UceTGcl*NY_CAaY0cyE~11j~1R8zwys=ZGn}3q4Cde1JS0gBZ7jU=U;Qeh9%uw#IHuX z5AxbR(>MN+JB&brvSIEpdYRaJGZc^$I8Lj{KFm*op?~i;Q1^c%*6KoZRGQUx-@kj* ze~))Rliv5{1>UckoZEoA5Dri>kTK%kVHT11n*om*0ASV;wSJO z;b|~nzXH<-hu?SonB1SQwLR{|^2($x$0Ri2f|La=nobCef$-YD)|$obOXQ&1YyXl; zLF=dPfh+8g9Y%dFMcf}UBG0Ovo~Igb!ReM(qeBL^;&u1_?%Xm09R@+ohLF_ zc}vvBHhqutf;IpZXbsAQLBetP&frA=%Jjc%|M6Da%me7OqjARCKO2C8aUvifm;}}b zA(_Xq1Im~KG`XKBa{2HyNcztt0__Mm;5!~^J0PqL`#APg8YPZ`*8|!Op;E@y6+H88 zzcXg2zR3cS9lV8l_Scu4w{2N^B|yLI97hp4u>q1(T3zk9z+)n$>QKu*Lgck-dSq|> zqSyJuode#rM|CmgXy(vCGCRDxSf7Qy%k!`A7Z)E+=8I%D8<+?LL3L9+8$SVc zvZL61Di}w^htX&~^G->f$1gPlw=rrwAwRBs-y?kBc8UyGih|$%&9QGdG@@kZTtLkF-D zBwxX@WmL^w`l%p6;sYP_JIx>u8)RNy-W6gfKq_MVE?`35HTEi?rr#MZ`1jAk;}LIf zH1I1BfZNR*QnRsr3H`r9D*WHg;Q)8%cX7dTGA~)#xnEwCaI^EUx}DDCbtV}}AnwGszwc)UBwX-zl2esM)?3>D z0_B$EKhAevwBQMNF&X*&qJIBIPDgeeD*0pg%`T9+?Ld9(p68w`k${8yKm=c+5uZJo z|BSdEYi&sx0Kn{5A60YK6NP2%&1yA1)3DBvrn2@ubY3X=X8)t>K){NeBR+tF)TO+zYyQk_s9DwsgGn#DHc0-NtOTyZ_~>=02Lvi&ZU>b{xre zB&yPDMr7^&gVD0(rBCGZGn6h(UUkFRXBP$lF2(vyfsfa_033-~Zv{ev?}Mm%0*j>M z2W}20>RoolduO0f1wqx#!LuHgufXh4((S+pLkECYpbjJdc=k*lM}o`tW0H69fF~T_ z^T%Ii2t|!q$1+;D@77I1;vCV5;0CK-2plk9)O10)Qa1 zX$u18-xor`hO|GQR!#xU^R`BTcbb5b$}sfG0xkr!Ogaad=LbF8-j00=nnxxT-UO0O zBN^-fSZM@sX%3*$7X@Fh2dw~j!wu|K+dHzG*Q;;2uQ6z!&jrAPReu=F(P4%$51^-e z`F@5#P1bZ?+Ue=*2jUx6bQ=Sm$V$CIevLD&KYC^u2BP*ewdshIs4&`^-iDPX194)0Y6?ZoP#-8dtV#=BNl*Aw15r6 zGnUr2bM}Vq)dnO)GarzU-3P>8?G^_Q-*1+2>;Mw3UIWyaV!Htk>E9EXDau5_hW5%u z`p3;64D*g-6-ACou0XT zp7(s?oH5S%{(*0d?cTyB?t85{uX$a+TK+iXFu_da&&*^NC4`6aBrh#%=U!7xjEH{lohh{P?Yy2Q2RTTp2Me9#s{C+l$1$6^7BLu%uj^f38wVlz;0+&2>RgxsE! zVk%Jaj+y^!fXD0{z)`X0gMi%z$|Il0iKWq}`*Ubipmtw|qjYG4y8?T?s=j#EM!(t` zkGp;ypV<(zhd9jASy`HaK9n$)69%0H zAHg_dG4<_v-AO+O9PDeF6M7I9h3>OqfQ8Tngw+0W8sNIR>XnQFEpBdhHXK;-EbqW5 z^Ti^PuMQxVd@kFXXS-7vG`F+8P+K|u=dsttTU0vUPY)l`9DB$}pSbe|VN;>Q+|Q@< zz{ggmT_Jeeb5$(0zdda~Z1QJ@KGB2v0xOAAGFV%$#04KJ9c@4xs7)}K3@RAYt2Udu zjVf!V5MU2S!IGw61cgX=h@!WM5-E7+1ui$&Y;O0z4V3$085FSY3bRgLFhDf4Mw9U) zcLrf~0w6DZue|kRbAJmM!YV)=T7kl>V;Rv7nlFu^mkGwt-N~Ylt>HW^q@br@i;}pp zhA?;NL6i>bv5Gm`MUz~Y5&Xk#S{MpWm|SIbr?7&zH=+T;w2SHwuWY2a4S!&ZEV`XwCAhw@#M4ZFZ(6$%WnHmw=bY- z*4&>7nsv{MKRbUj!O_U9mh4kp-ZD>63dRBoJtIdXs8e4A4bg9oi&A@Uj3p52y_+az z+6Eg;7b8(&Yu!(_h-&{TdB0=b3SJ>GbP|_;Jm;XH7V$i@HgX;k6kZKsaJX6tF4yy# zejW`brj?Sa;STWN8Ky;-iKic1K@~OwH}?vJMv~ZB@sidok4pcij=iLoO9OYTar%Dy z@|?+#uI~+aA7Y11{+-xjn18{nHVWb5b>M8%D$;S-OtDhP4hF-q{g1^7bulh_gKp>N z#m}3-aWo4`>S*hyPtfz&_MRU`<>*I?IB!CPzA*UA@vzw8RkSubgJM*dKaND5)-FJU zSStQIfhr^^DxyvHCveaOw1IherueQE9N?f{BSW|_xbljvHPzKwV04C-DjclwpuzU+ z7ToR%aP&-Z{m5YL{UT_~3+BN^uqWK_&u7dcLWgVkG)sEHszHT8yTsV-Z%_8smQF41f5vlb^)<{*OL1;?{wt zpb|_xpe0_rZ2c?V^7sBw*0#C*9J^UB0K#2hGB~0Az6K`B9 zGYkg6ZXz%_8CTJG6rh4(lV^T@{s_c`5{vz*@Lw{<%v=C%Gn~HtC^#V3f3$*^>3-OJ zDY_U1E*1uup*o;vy5888mX->-+C{U%pD*YZ>41KJ9DB+P%&o{UOzJ13pkvyzo+86k zfDQjondEZ#?Xi^&PU0&N-Q@?h;Wu^ws}csy`Pl4ih|NR+T!m#$em>KQAJ@wULI6E! zxNvT86Ukn^tKUepZgpJi$<|?CnYS&Eytr@2`B-7Ruc;#6i_lgxWBg(*GN-0&H?|w# zDiBPdS-oG7`tHq4?(;5aCI&zL(EHG@nMzVYDeQ!7_^W^#4o!5TjB8c{?Y>AdQlg*KNTh5^9i|I@0_Z^0?y8EFF!xe z=kZ4Sn)y*wU3dkN(yOKxS!Qvm!a%o)ao?`X{{y5t64 zQxCvG{UKaq>8j^3?}sY~NLj_xa%C=8tq?)#3oVwVhl?MM&`mEYLW4R|KG1!odF~dC zU4wx^8&r9O$G_bfs6QM@Lvz-rn~6+^LB3v>IxIwB&l-#5H5x$mBqFHA$pN6zK3i!a zW)uw#grtuwQMnucJTmgwNU*lG?F4OTFnD7YC+mGw++aym$Ry|3fBEm3OtCWk!oC|I zMSjrf`vY8t%`$BN_Ny45|9jmCwp?}dnD30|3;(@41*hcbdlH=2yrdDsh+h9s4D6f# z{{qa$`b=}6qb%ZG_+D8fHaNRvqp8Jtoz|6}T+CVk2pN3oady|uljuwUHA1%o0?Pt$ z_qk&$${xLV@dBDK-!`95Z%=&1fo^>hz^~Ki%WD2xj2f5@>ejH+z^#Gm9+(`^Ak>Id z^5YZm7D|U+3W7>;rD^7!*$Z_EV3P+7a5rKCP=&&1bIvL=5-fERFkrB30^KCIKL}80 zy@HK}xI@&xTGzk?5Q$JwdS}beb8C9QAQcT&tgXyXCb9Q3|Dy$XcwI&X8j=t0N75O+ z(D8h>Gr{M5b9T;N1z-t(WULNwKb${+TaFBS0xlkOU{(N-;|_YJg@UyWrY@Bw=&lrg zK)g4ANF3XdNUrR(RU#-JV`G3?zIAM9+jQJR0YP>FxD-_oAX%wp7SRrBKQ!_yrJz*R z)YgI{{jEbvx0QvgECN7^-dx;gjjVZYE2UtNaLWOptIl!lPNMO!MGRm&D4;8Yis)Nb zuwv_@c z^;4*@M8f;V6f|37wE)*L1wEtSZQ0>z9Rv8SLqkIVMFx1}ry&XOcM6x^=Scr)K|gE* z27(hpOvY+Q((ZYF%1M7E`>xh$O<`jn;XB<>fSHS>lS3Qe69ccJY;BPh@2B&g*g$2a z6~QN_BT02BkWfhlEiaXG8d(W{CweL+=zXtJ$_T5i-J91bY+_QVa2A*mLZisMhKgJH zHxq7jOcB#sjR|ovp?-w5>M9#seUH{|LwCROV?Fzt84!=FErseEM9sv=wDFgxHgs6S zJIiPZjg2;6DslJA-zv4+TKI|$6z?4Tom-wi{wlUa1_g9^0fZsDdGTj<1K*oW;^VY3 z;c7E#Uyffk;=*ggY`%HdyVykt#i%IEhz;(d?v?Rl6C8iYa3rz1uVlc_; zWLA7wP+wbEY-sSS{zCV(>P}*G-ejPn3`<;Pd#sq!F88*b6rt#ic-LfW+^!jBo*4JQ zDxchf_ls)jM6#u&hKkl^lvg@YV?Ht0ZVegLIOj>)`0TMQRMqKGQ)K&Aw;54Si}^h8 zWTcqJX>9%2(b1L;%ojSHH}`*h;F6l?yQ$^73RPKO#or$~$( z;0z57@3z1hi?%G=EMdVhD&y=m?xwz>7qyHBr;sj+zRjY;r(jq+?J5Fira@Sc6dQzNor9{puC)?<6gI>>T)_pqmnRbFdvbZ*)}NCy1HCCf8?tx)o@k%NDGQfW-g-WLqgx1!dgl*uSswb#3%hZWC1 z(?4`kbDwzbkUMF=C73F%i)M|{TDf6nG%#xn3&>a6E?lIK%~{L6M}XHZj}EiL{6W&^ zubt?FSD6#7Q_J-`oRD-&C&6=OkYL($kr2R+@&MJ7(pFJ-lSWb~nrtwDWl2mRk5YEvWC7J7p z=~j};mO|d*SK`}NwuIYNE;z*zy(|7<;?-J%q7_GR1|BI4u2NM$gpz5oC**hoNCZOP zEd56sTmIXhyQuy<5Cm-Su|>COKY)Y38|UK@LK8Svlb?7v1rOkA%e=wj`h{6F9iuIi zi<_~I8gik~5Fo|1Li3a|>qkPt!-@+WZTmU0L&d?~Sf*#f*0@zJ%{A6-`b=;$!f zusxDxM#A3z4x^7nD7h>pJ=kuJF`$+~L&}@N3{9Q8^xo;1ER@W%GuAnr0`#LslbuNA;W5B4R}f}6&_M;-FBY65G=EgzCW5$o9%ayCZJ#^cH%65 zF3ly9d!$Cw!jAL^am88A^p%>f&5MKB_xo_WLEJ$Z`gBOZE{4Z6^Pa))HYTca$#r=s zCuYte;`-2a_(e1-adW_h+m%URI%qbx%We|;$Z8T zr1eT3!VjR{1V%Am2h^;8!3bf}3lWLXsQ|#g9nF;coAXZas1ygl9hw5d&HC-zt`w_` zPzX@Pr^EF5&q&e02H|5XfXwdcCNYWF+ z2j9*q8jE39;+XV0W0rMYM8QU|n9hLxC*EAGb)37- za7^H_WwjvsRDUZSQ$wzeQ<~ts@SJqy)=X(>=Kfoh9R4c8S0O`EA^ZKlZyA|s@3;3w zO7wNc>-Q(?8YDel$c#*>t=8Xa){#<&U}(>-}}#4uhkYt z#NjaS_FFd5Ks5|At@=x?SH!SDoc3z7p-Rz{MHQ9!e&uz?>d*X&D4dU*pkL++t`*$iT~Q=q`Mlrp1;c z=t#NLOwO5%xw7jP!k0nNXD157#EVzCKr0K^ON-Tr-lMp)QhJAIkA0l;>ep<6{h* z95$DnaYx&84@FyFfp@}-sLP0QXQ@mME&UtaOjm8sp@-5< zvHi)^R-Ouo8lTZ5?DlHP4>>u9nT}`km;pVVUt%KQIVu6QaJDyt)B5Y9##!RAunEcU z8M24_8hI^`h?`}~QWyZAhCe^X$i!J#O;n_GL=3~tXovR$VOgSc%#ujaU zhi49EH)Z+ga^Ag60J3pmd{S|DcP|Um2A0Ihk!G_@=Sz`jndC;9jd4D?cO5rzE6Tr1 z1dfgfPfg7qG5J#_31<#$-+65#+1dvgi{eYkAfKO9!0PTecI5F2pJu<5I_KOR2wY_n zsUoNuf!ULZV^36%8lv{6<|#hXP7mix2C->7 z$>$t4PmMq8bj*lRuBmK#=sqGn{GCfy_$27)_t>&A=3o3BSlXx}VNOz#w0B%ViXP@! zy>5S;99`)Q4 zXl=J=s+6Wt=xxjPcRd1h14?HwPIT=)!0}Rxgi@&iK;YJh@zbUh47Q4<0EQJ_i{P(V zc-Qz(?D253cib!afCmO;5KZ3?#;KP?0;w87UvX491~U+%NHu?lP5(|snq>YFoJ0J( z7*}7x@`G~hXE=JR^Vi$^64ShS_dAU|6J%-Kqte;~xlXGWTONiU+-OEEPpQn~H#`hS zeKs72Cnkrh-zC~Geis^1mb$v*f0W0+{qq^_xfN^M@~+CQjUDZCI>chyt1PyppLMq1 z=1IaU_T^*z6{!-p7BszOioE)(*e)sweTJP5(eVxhTJ+lZw4Wth>_KuagFv`rA zZk036^6O>(Ly*$dfuDV;h~B0IR|NNzk%>PBDLO-)pOgvKMctp1SO1GRJn*NC_io^` zAl9J$px+ZmM*E>=vrPk{pUDF;h&<>q);g^H)lx&6*q;xIMT`LB;DI=m`+8p3DNA_c zOmz}7+;nW}#-3rKAmaP<-bpP3%SjZ1Qc>aE!dwTSLUy%Y0@HT*=}hj z5-t8u>qGAfArCi`mJ!FIgyAw2`|4K(Jsbq|I<>{uT)e}!P3H7CitLGscIa5%sY%47 zZBdA?4eaLd>fe4Xt*^8@)eQJ%FQ?Gs#HUkiEl|#3m9H)t6y~_jH6Hkob0m?wBCaJG zK0`kd5@}6`G*0U>Y>i-cvLpyoE>gE4#tloOy?xR|o5xRSVo+c0re{TfpX&y0!0;Nw%UXi#~a8p3?J|Mg$aL%E4yb}z3QkW_j=md z5WGbvm;JRz?iJxB)}AyyKi%#*!qd7gZ@8@CJf$WRwk^K7v{Hk>9AID)FWj@p70HZVhwWL>~4+j(MTL&A83zh|_Z7K;8 zX!z|z&7W&tQ5Ja`_<_VHe%jpPhjG;Bn2sQmdX2GE`ETag-?DICs_hQd_VS-(lay@N zXX92l?6Z8+OD;Aan5xeTz@T6tYSnaVX%;Lh{AAu;@2B>IV`fIo2v%oWsQSve;N)~; z3w2KilkYRqAv`X{&lNXxvbWLt;~x8-&j_bq-?0#0v&NM)nXEa+HdKgfh^Dy($oz8o zGN(Z+m;Ew?BCvk!QecRL99wd#cGB)~VQs$Bv&b+ECdTp?V*_$C9B0Gpd!=)GdT*5I zN9?N8d`p#|0)epeexxTvB8>cLOT4dLZ=%V1U8H=$G2sQD`Cn?&?~dN`{GS z5gt6|`29oT>tTl<)SSM_sIVHR#c%O)zx_+TTzlKK#1Ig(l4_ilqs#PmTx*@k&3bmT z`{_#ajHIAr@v)^j76?|y$8bMkOY_WkU^09>U>%7W5`We)T4OF89|I3ROk4a~lL?86 z^?rlSNysX!V^8fhz3g0utPElY#d(ugtUeq(l1QwVtrL^nigVyLDJ&M<5|v{FOKL0I zUAZq#mR=MwK|jA2wWc5%I4ak5@s zq_jc*JW?vc$yT#mNVAg9koQTpJJN`5oPK*UW<5$=fXHs&Dh8Qq+h z1@=YHk!j9zl=Gi5?)d^av1}?4$yuA z%@}J!$&)_-s*VJIs2~>|u+DkG+Q_WZd;!_MwwY>wA-6ZBXVMKgD+jAIyG0lSQO+QYsQAOy)DYG_4y4K{}K|a{ysR>I>CHOWJ8$6I~8+wD8}I`jtcXo}JJ#<)@8~O5_JIUJ@rJ=()z1HED~4p0vcp zF)3L_ypUOIGGR_K`YP&?ugLaRJ)w3+!`7d=S%t69se{SI!1@HFi9U!T{+`i~<-PR8 zyQaluQ%9iZ4)8&p4$OVzTF^X;ie*tuoT6b&*vS$}fXbG@wW9J2>vKB?tHSR`7EBBI z^yAyR->jYJNzQ(&ZhM=B$52WA0AK7a2$o~JBGoe3nLf5itLahkMH0;sheY~-UZ z0*%S|<8GdhW1j&PEaJrY@i^QBI+tq7@94!sQ-Y8h)0pQ%Hfz-4B1r3Cxvk(QztdS7`Xum4i zEen8gb5Y3{YM{4UBCD|JEPUgmi?Q79MSiN~iX+7c9-ig-0zPrKWYbN@*;_sLea4cA1D@jHg>!tUnrXQ`uvEGzXPu=z6p49!N zHQ#)iODxG)6cxRy@u&<%p>~$ab_Zo7-zdG%O=lAuMJ-t-43Oht zT%VUL@1jD*&DDxx=yhBs9eg6n`kXhyluoxYrt`2qa|T6x@#=#=H6Z@2xE9i_j{5T? zWgZKc6|3uIZO(4CFon_Rl}m~hs~bn@Gu}*Y;`bV z3)GOfMub)*P_?0z3JT3z=Z?2H9!(nze8&U~_#?2w93asbRmLr(&z23sY+vvD>kIfqw#Q#KJszoM*UHj;Um(-nYP-ljEe-pKe}b`DH-GN{88LT<(<{;^KJdNa>Mo$(d~GhuPuevV_IHF zRULj6i55aM@9q*70BNGF2r z5Q$y^medDWaC+gI|slPam%UyJ)Y(?H_`)OUT3q1A>jaYEhm zgXc0SjZG8k?EotwqLg~WjHNM+S$Hhbh(+`~{>#?Vl=~g_nQgO9o17`Z(Oag##P_p* zyQ=)s1+{xh-tOqam2Oxr}}cWiB=kt(!u4wOg2law)creu{81%A9;=okAiEl za%u*TYu!27)=>z*{CZ*QGR#1%lu+&q@hs->wB|!1MtPN)-z&j{G=$7&)L-D#4GjX@ zx-QdC9N>M?x@B1ADDwo-iUL!gadXBp;;UG9;yNw=?BI*6;-I{J9X9=_9Vhn6)9?$L zs#2mALful8nk*{M>e%mhK8gJa7-YFtuQ$uKkDP-ds`!mZI|f-wOJ`X}qQdKNRd=RC z@?RmWgg5EC%>F=2@{&tb!h^Bpi+`5)NeZWlrxcz129^*!kzK#V?yC_4N`_Fnf%TEbuNFd5e*WVwN`B%YxL&j-CZ zuv5}Fl|k^uOtsAfFW?Q{0=?6~zQpZet0d@f!huG54H!7kcFam4ohr$EFkxZAj=&i0 z?15PY%2x3o)yLGo*PLj{$>IbYX;p3ar_TR85Xkc>QOG11(qWprvnqxL<7lsXPyf`i zEfTcyOn#O&jn83}jW8umiK*tYBo5olcW0?_v0Kb3LF*9gVJUPErBn&g>fEk z;gp(sRKGYXzXhM9Z3LHAe-%R)?KQ5nBsTurWs#>gTxil7iAjFU@DY?gS`oBpvbc5G z&Q*g5LhyMW2MY`w1A0#0?=MfY-@DlBxu-cD{o&7hiuQ097xF9n(5iykE?pol(EjzK zSmTI}4Bc`j^(+5~PbLWo7bwdoLrM>s1bwgy`L-yOV*s^XV6r06XHDxqVyFj$C)tfx!nfIbc!~gLWI_ zNC7Uv@;V?x;sc5(J%r+_lLKfd0&-6kNnl7h=QZy_y}X4q$YAWkgv2(+ACBeU0!1p2 zeUThNqkF1dt$}8VJ8(C=j7uv2cT(v+!gpCV6F0P7Pq8{5Po)3XyZLirbPBVOCjiWF1*v z=cNrC&~M~ZT6rUKETlx3kFIf7yYpe%S8~R`-4n3IgKX7KMgp))Q+>^ zj#Iu!)ET+z`Sm|qfGkua$}6@A+=v>2mLNhq;aS%>B`wod^CNk+f{F;8X-(Q!ilu^Y z&INS#tHXSrV1CBv!zEOk8C>nA>*bg^f)p8Fv9ixuKfGIB_Ohu<`0G*NcL9;@Tm%L_bq^x=MGblvjAuo`fH44Vr2B+cD2 z3S>3YES~|-?fiJd1~VC~`?sr?`r@bItYNrHjVSeG{k;0?BS#}~hU68`2;V)obpKG7 z{;Vb3NoSSH9l>43E#ZB)?DEzW+8UJ?Jh3l5otMU7B1Mwx*_-o8HjKD=6GPQBh5=bv zCnagQCX0#>a-UUWZSuq+B2)4bYo5bsC9&V4n{f|cakv@UU{#NAHRE9>|oKw zfq&!qLOmepK_Y&c${gK8Y$GOd*d%DQJ#1{Z8ts?C{b4`*UQW8lW=h?D?ZOd|-yoe_ zf)mf+)!*G(K&IUt-9^I($8p+P#yTsTcC6cJQE{~e4CdENZuoW0z`F17Qkc0F!}Hoj zOwkd!@>m0~;`r0^zLRPf)*u*F@(&U%#E<`cM8w(%SD*pPlMiK5!?5$KH{7n8jlBU! zOffd*&WRoMq0($PUW~m$$m)bA@^lVqp=#P>!i&n9v=b4i(u>yVu}Oy&mT9!A5ImxAHITRf|O|LE4E z>?PdBVj06OLufs8Ym{Xh)d2pKGF}h|fos7NRqyi0w2-Z(QU< z=azi)(M$wB_is&OQugjM7NM2u;7VW74n1$r6c7l~?yI~vO3XP;W0u5Egt^GUJEXj#mnG}aB&B8GBSV0o4*^95n z$s9^4brzP6ITFjKDMpg|`p>`g`_#aNb>R89x}*rhDq*j&F<&s}JFd9AL&C0>i?dGp zx_XoQ;ZxJR@$8JxJzHP+quqDevK+t4THGR(*?0z?!}64_qk|R4xs(mKhcVVfv}E8z zPY;ORvZqtfzg|`#w~iTV*Tod_JwvKr={XfGsaxRR%W1_(=qzPMB1Kn)ar;5b>_)u zrIZ*MEFwe!RLzvVg@s&0^YLP-FBjsc3A5%?KcB<>8BG?R*x8Kj(hnG!U`Kd1q(kB@ zMn|xvN_M5GN96r!&4VFkYD@vkAR)KL9J;p922OZB-L;5ab0IcXkB$dJ!(hz+P*&%QZ`Yz z=O5oD_u&+N(W5of{#ztc@R>(^>PF{~CBEM%W2}0YPnVSYJ44Lxt4sByh)D+p56<0< zMr5&w!^Yh{BYhzYF>>ZYd4$8hUsb;=U>8M71q;m6wJ?)bs`n4q^SY*o+|%YaKhaar z7B|acqntd7R6w;%RadPWNd?Ii6BcH%B&OAyUwpH-*R+ju5xR_wIc-pu< zrgkot2~D?QU?l&~wbeBUW!vkjH+-Tk!`QKI-G{3LClSxiqDhyp)yL7-xLiW)mgO<_ z;**-#^~S7?6FipIBXKKTCAP?6x`cM^=VAlDZR~t0_OG`3zcWc#m839Ms}Z2~T#Sjo z+O;UEv-p+}6h&I$<0Q;~<$)6^9-=_=uw){S_`n!O6*W03t1Cv3ZK@x&$FU?=rVC zG#*wbqh1u+l=R<)fv_2zb3uRvwXX8dY3LfBmGPP2j|8b(X(}_0%I53ugSS9nSdT+UA=?n%U4<|ExSt>Wr{F*KiA8omMt#OPGd4eWa2{!~w975Oyd06)G z#4cUKKT^Z3%c|K&Vsr0=hT{^3h$>yWE{^ulCchbxWW;iiwZ#)zOvmbDC)r!h;GvlG z*Gl^_dK}E*rCi-2?kk)s%h0OWS{e+a^QVsFBSm(}sAw7W#t+D~v6vD(M?I56%=4pU zCnILRaE7C~VY@d%;w(6l5-9ESgDG&zS!@o6r&$^tkV=};#Sg)$r=8-M`=Uk*X8h6(Y$4 zU1wfi4jd@_n|Afanbp%m0L)1&?s+B!JZ(@1-UNF1b`d~?ao;(M1G#I13r#tv?rKTZ zs1)eVj0e&9O7ts#mb1YRlA$|Md#BTH#b|HSi1nPR33K56$tcFf?DCH8g=;G!jEi@f z-NGj>&%5vHSEu-zXq^3dv*Y_8@&0+6*OgU+x9g{^{b}ZSi~J8If0~`J8yv7}Zq)*P z+J&3G^SU9{3RgHThxl1T2RbFZldWD)ar%F#4}c}Jdq;hcSUd0ei(O>os;{V85M*~SU%Yp; z0yGS5Heb_&z(|9`({u!1yXd3}k`Jh_fJ|Ct*f zLjlfO|5MaID>#>|iQI>b^CXfkO0P=;T350clAjUc?V zlHkcqN^Z_Oj^`t}t3R!2o55>dt!TKq?f5F1@!s5qb#kg^0+H4^TvBg-eJO!2dq{`K zVr>Isk(3O^Wg+b^!MDsL&li#0mKfI3nZbs!71{db{Kwe?)znyA2OG}&iyF>|X~>lX zj8@3dq}*~GX}=71@jti^sGbrtK7plS4jB?43JJQf5UB)u^GL{glwJj_EGXrWW*mZT zZ}!S*s;5BQ=5kYluHktjq-XR`B?R(eX~w>4(6~X_ zA&}+)8->yV%0Cc*#QVa)@_P(`BFGoAJ4vYvw!pv=;7!_>FH_$&ph3bvfSyLbd_UJs zb@;nkOxMKw{8bCiKJ(`dgM&`LaYo#32YS*(xKlI#!J^l~Y8*r=Fa6Vsc?Y8juZ^@@ zR_P+i<7C1~udEtv8gmszoPA9&&AVpf>%4Hj@>myL61?CWFW1uGTY)Eie#2^Ot z63K21rd^%pA%0&hRI!#v3X+W>63b_YcQ6)aKqNXim6MsRUxhs)7I1Lpl!5K&T+i}d zepq(?4BuOiP^&e&_dN){?WDH)J$jH4X29k^cu0lkQ%u$X?{Js{BI-+PYJpYUF?ViZ zUe0IjnDg;1!u-p=&vD-si4$ZA(E2$vI(fLf307@9jYMzNS}xCi!VYh2PZ(RJCi5ITfdU(XFlcj$gzO#5vPdu}+x9^26BnV7tu+Ub)q!218vcCaS&nhs#V?^zPLQ@B(ca;&yE(iIj0P#?N zGzSSO0UU0c?mFF07fk5~cyijOt)!?ra9p;*RPXhV#P;KRdjF=s1qe<%@aF{lZuVLO zw(5?bu?%2U0@5^6a9SS$=wL!_S1G;zR6;3l?;3UrVAfRNBc%yKU>$l3)BQ3B31R@x z-zbR<<;HRZSn>i3g!de2TCshuXG_-o4)t?)UgS0CPCR04S*WhxQNXCMj7(P*4DY# z0!5J35R;f#>D(_*ft|oIaxjgiufb~l3DQc){7>&a;edgy?7}CDL?kl8`4U8Ms7rc> zb+HW;kr+qUk5#Un^NGf@ctwO%19=r5!IJ@BJpvAVT&0?rNK5=}JfpnSay(`r4i^Uc zvBDa<97%u!dSob}bwxd%A6oXT^G~*6w#m3~WqnOqZ1GI{-^7tjEZt2?e`pI!72f)% zCkZHX79u$5_g%}$U^s2=cz!;eu)gfBajvaBF(TTS$wz5Qd-~{G%%(fT2z(54zQgs? z_+V04fsrhFu_dc}B+uUuA^EDy(uhN$eU+;b>3WX^oHrKmWoWIk-PQBQ6Xio>$)A^L z6|+bmF#7Tu(iq!l&L?5nTJD91;WS!Nd4Hl~sOXkKerXcV?W4#&87sFOzv(j_uOO`0 z^v7ph)uKA_rE3L9xM)9y&R(G6__%Th(o1MZoJ(rw-?SeCiy;<3iVb(fL6pn=`03KW zf7`cQzlN+(pfmd9a0k|K4^&&Bl?T>B8}Kgi0U43e$LkHMC`S(iBGEcb;w|fD@EdSt zmj5Rk$pT{S0Y6g-kgBy`ZcBmF`MT?XBKFID#ukgvY||5 zP%@8qi_4L>1jwJ>_o-fF;-iA*wJw>&A*oo9J>2a=Yahaz@e{&tYFGK8U417CLLun!eG~Q=;z|3~Fd;9_ z*PHZ;6dmy4D%eIKjFY;PI%4rCt+e4|_^y@c{zMEONq@n4mUW_8kU32ps!S+jPp~4# z?oOK3FL=Ugr7|yQ(`Gx2PLLG5TknO6C=~^Bp4POkw)#n4KfsW?C3Ed_cL*E87)rTT zCko_L$_uz;Nz8~Yi6tY6E`U(F4HK;x?>pAu@C7D8uCM14=0?!VcPNT%^L3rCNuqC&~bU$%FGHn8_ z2vpM`!(tOCvB|t<@KDlf8UPdznm_~+s?VGasi+HUgX>-pv@bw3iS$z6$IHegX;fdZ zZJGzXJ%R1J68Oq;fg-N`7@&~Yup>}uD|c#C*r4#vtLYyt|x)ajaK<&VR1Pp!a z9Z1%R(QX*w05BTQ%s*EiFx*0g-hU13rXFgqKfb;QD6619?uNK+u=dx0wx8S13K)C0 zr;3xjz;2;oAHbl;fYE-=%j#jtlZs>J)G1<>Kfpgt4Z*hFeD0KDf73Tda9NL;fP}yY zw?lOM;rJQ6^6%rbm6+d^49;&pVj5|0lNaUTk&b^W6jrozc61Z z=ggU&PJ>_Kz)9%EoR*Sf#gUKFdsm;LDM99glRw}*t6jX!#sC*C@D$xc*M}qkuOmD) z`6)V1_5DqJ{wD_52=kb;kn2!~royFKz+7I)Dcp7Pn(LP>c|o<^-tm(;^erBS(OuBW zAF*RlAo{d;-_k4NgBT}CVTn%tJ2_XZl$H9%0WX!nW%^QonQ?rvro zYOxGTQtl9N#Dm()45Gb|U_VbO30Ty-K)A=zqVq_-`zVg&9WLN!IiOr#V7Og|T0+nc zM$mwO0>Bhf7cqcE_hKeeduW}GIUy~RWZ_)-k$-8hSy~JlG`=PqxqUwBN^pb4=v;LS>N;$Q6 zTux8!XU-qDx%E%fivl(ZE0<~sAPn9&E1o^IGw2AK;iC#g~ zPRMEfC+x|n@XH(K(66nYc|u(K`?tHvQh!!1bU z_*Dryx*yM+N(VZDb+7^yqcyLkTWUy+x9$-|@vaUI^s1!L4*;UT1z1EIqUn1Y(BvMx zcLHOK9Ta4jEb97g;gzP!3eaytV_T(~x8Zk7<(()rt!~vs&YdGe@|p266W|5kJ@>Q` z1Cuh<@2`NwdQn+W(*u=fFkDeoy&mcShT$KRwjul63)XO7m>k_W2MH)dDlFv%>sJp% zG-7y!ZDSFhTaO%+^sW*DWR8q^iGcUWP5|X45{kjiuMfW^h}<@EC?7s0NGfchvc=Gr zRjqFo8Dv&JVn?H7bqHcKl~aEeNoK$+51N)?l>2^P(_9z_Y zV}|QbT%9ad7DDBfZI2=M{+F_O2wMS}M)*rN(?2SH zyV3dYV!U`bag+ix#L8zS`Ej6_N zK;Xg3_W^E>#ZypNxH4Cp+C$Y?0!<_L@z2tETdqM+;ZcSr#-U#n1L z3HXK;pXsU*iEwC%{~Xy3bKRRR6)3v^eH_ls_#Z=9dPB>LAMdQ~?Ro6Bz$Xun{)3*> zK#kb5uj<`U)C#q@XWjZX2y4m)U+NAv1msHp1JuWmD;-KXgWg8tpYIr;9|%`pVqtL= z+eqQWZwN`)i`P!fR$g>W@!UkO@G#O;TE<8r_R&j}EeK6A2xeuCySJ>#}QVwYxQBzuu=mjtf3BvuRsAj5&9bV9wr`gdrXyw`ne-ZAXNf-ddB!T1Lj z;9=K=U(YK>2T#mCKsY`b&TQT9#h`_=a%%J;)2{9-m1;p#a`1q`xD^J$WScDKfb%+`XLv(5FJUWiVRTe>0GQXAjvg`p!B?FtEeHhqc zAj9WB01RL^goqRGTJPTjSqkX0NDk(JnE;XpLrQay{!sxsCNq#~g(TQXWCIniM8=Iu zY@iWC)H#(;2i>&IpB)k=>AuqDW-2HE1h^H+IPVNggCHq87#|e8yu^0TMIn$5##-3P zsO$&E0%0jM(wcTq%1GPX(ntu(o$K899piqyU(OgF9B>YMtvUbk zJimwbdj|g@p#6ZeP9pHwO)hgFNQSG5{J*Wt@0CGD;5Bx7oee{UPU+#&m;u^ZB9!B+}b{Etl#&06AP z;Zp%tt?(9I_>?x9%eNa3%=+eb@%T{j1#U%EhbUwBRg9qIWns}8QNkHxu$k%>IrFOy ztbXL&oP7!sR;md7xpvr1^e8}^&sdgtr_hE_)5}kea)v#MnA~f@)`rylPiHL( zTWj$h-6VFRs?L7zjlI<2@BS*i6mb%#y?NM=ex-t?DQz59 zb(~DQ0@x!%FZ$5t$K2zSWcd>F+`>)sKSJ9-uC#`=X-7G zYQx+RdFL^yi%90{sa@-9Y&c2bqQl|A?HqJPmKKEAc$+CEP`2oP{RMa$XowEW5c)|1 zT$rZEd*=;s`@fi^JD8A153nHak^`)N0THomy3LSvC$++@CfknGl5LI)EFTuMxU^IU zI1rVs2cM1?pqdEWXK9peO=p2$U&hH4pw=Q97@}#s>`d62PVuJ_)h(D!cyu z0TU3#sR?k*l3ZQ`Fkq0|8||HHsUwdXE-L*`-pA)RkbsNtNR zRM2jDOu&{_BZ;1Y(rI|jE{i=Zmpo10UrIQR7aimBq`ao|*a+{E5epYihp4BB$Pn|l znv26OVIL+kWmx_?2x(Z$p7A%$6b^0it8e-GDZ(e?d3JjelakUC{5GEZ4LYjGFt(0v zx!gx&lNf04kn1-+5QFUYJkmqI$`Ir3hPZpHTfJ_9(86r5x<@*JqsFY9U%N<_@*X|DYRs@i?1skz493s^u__waOUiVK|AGq3 z>!gkTWR)lfoLHKp5Q_KlN?zATBdw1MJy8X$AuI$}Yafv!k*WuKr-QZf+_FUs1WSOH>(&0J14bym7ZM7qR@ zEv*U@?l=!ZDHn?DZ;{cJnj~KpvrbEWp;I#1kK3zGENNuKEu)q0>q98Pntd3`D$->A zNA^g0JKd;OCB~aj`0L*Doe@4OiDe$*vUP>)5q_eeq2_er$u4%M*iuRTj~o;RpF5S< z;<8Qg*+o$KPeZWssTj-9$-#pLdWe zy>bu#B$usZa!d65m--nQZX!eNVWtuL2Jf-YmUu*qvp$UB;7U;vMkZhE3w0^Y)0Wxi~a& z#)OV0Ln82)=|3d3VBfL{hCp8dVJZQ9G~|$jNZ-_34-~J1Y?r2Bz6fh?zk?vcVCwBq z?vi3mJG+$)0r7x)5Qg4spCGb{4qn5Yze%cYfS0uedakd4H01(~LP0AA-7%nxc??Y} zj~9W(*TjFnV-#wC5J)Xr zKvgz>4W{iVP$2?iVB`mo9fFe9(U@)cWCnXUPHfe<1pu zY0xx>y0Q}|cj_o@xN$imsRx}SULu>0suT0oy3eBc@w3b?i1Shi)L)N3GN3hOxetv0 z&Os4Og{vAW@)6@l$xCcHy%78-@@$+2&1ysXnDrunDSFa8SvWAp!yMhqjXB}7p?1XM zGf`_gB!bDnWb_xpUm~TQb1`@Sux)rmD$(Z}qCZJ+!@(Fzp8kt{LALwr%n4>VMO0s4 zW5r>jK0`#8(E6+(@J(lBy?H8{oJtJe&5SWcx|;9li$C(~jlNH4LP+E5kkCFvy5i?6 zCoAz54_^n>DALK(8B}GV_!*7adonm}TRI?(Iy>g1kj9z`j_$`A=~=1o`*bFZ%sDDv z$?w<)>H!VN1O2NZx=4$0q4|Dj2(QZ1K?sfKoT?gY!6Z{$KHa7c*vwG6)&SY*`0va) z(SO83z&PqlGcbz=V%#F|c0YHnLjmk-ZV0K^(*pUpLD9hth*J>U@4qtybo`rzvD_Y_ zj)02#1bhbC?2Kna4DT%NZ_Y{rpMaqen`h9uBL9Nm0HiW zodc9Bh+}0v5Z43H>*ytf5D%QAx|tr`9T|(Y0z3_%m_N-~yGQ+dcRdJgg>*DTnMB^{ zlH`AL`mofg7z`by4cR5DAlqyn&wA$%xkXsg zeziL%M8^w{KlAIgYD&`)6Ig6$&4m3Fm47^td-mpA;85L5{kN<#0$-(<3^v}o!!u%h zPD{==qO=Vo6wlxI>WLnYv1rp4IWZ7d4&jHjSZKpvw1lwY@vR4CdgS{i=vPt>e_$b* zcRO-F)x>Yw4~|Z=dY7k+b(K?&pM8scSK^60nRVVlImBu7lCLbzi04tKtdS2+)abzR zpJCU-3%b9Hj>6_PImo)ImAI~?2ukp9M$WN5(JgG810CZO;-SbKSPMIR3sw+?-nbWJ zO0P06gtqh=Cx`6A#|dM_9GSFmW-kLlT8;{5GOkg6aGRq+Qx-5Jez5VeYgvS-7mzv{ z+Dv@23jFUN&fqd`Kz}0f!0;koVrZJ)PJ1Ws2Yvcibb}icGUF5P=t&+Zz zG9`hmXAhN$wjYv2GkFKS|=G?^a+;< zT#Q!U{XfZ5dfk;(YOLQ6q9=_~f^boT>`MxY6%aAF8g&G)4C!4|aM0PtE~=D^UwO(h z&#+;6(BUV)`gk|J$a|=PQptcJ(|l)i`co$I5|I?EJrTJbZ|U^bgx&bMm{F;anhZ0R z@v8jSE%FWuf4GA9jx!u>UFlMGXA$A0OR$e?xUTPNnsDq~`Ex{0L47BdM422Uv>|Fl+$wA=-eVn>4*&4*H?q_H@$P3~5(vGww+bxE47!J7=J z(FVYsJwzoN6w{SXorz*k1p5{HB;_rQ4&0;^8u?BwL#s*?MNV=w*W$%YArEPzT6+YN z;Ae>Fc|Euq%E`bU^R{8`->t%ihpc~7@*g=`Rl{cz%E-;_#KTjAHkej07KSO+Eh1Uk zd3Km9_kD6>nq957G7Q1hW8@pZxX{>* z9g4m8cXa_nVLe9uTdBOUDy3(twxmP_ud)+^^+EbBsY}pLSpPXTp%s?i@eheCIFD}1 zA+Ma~pA!*Zx)=V;GhqYgd%aJ2S48A*{@UB#|Cum0n0#P=j?w^WWI-QV*{?>LYtW4( zA&$2zqs&;o67Ra5sJtl{7~jzR@);)f@yLa#BT{?nnq&rbuD!aSrqoHyUSYqbtup&c zLW@<~ABo7=NNWr_#0`{gkvdAO1Q$lLlpEGf(wX3hOjHPWGIaX74lI zmCz|^dE&rMwe@rpgU)^$VM%ZI((@x>ko9PYyP`Avu}7zOpZJ^b?Z2#H${Ck^4Lf`J zW9a#rP90AtsJ!4gg`LssC?7ord*T~@e>}%8k++KaDLMIjBZRE(WOy*$ZUj34xGbM* z!)h%OCLK!CuzNxSn!KJ_v9~yyV&RJX^vqx8FJiRUV(#qSOCKZhu`MKR$04zk5lt*G zMJ-uhsAzt+oIa3x(=K6#yRgg2{Eu?AVWtiiG1*x3=JdX0T@3Y2$Vt$O2(7{=&Mv-x zogV4&hC=?f+`8#5l+BG3^ml|vYc@_3ZwO($mS_4zcqUUpy09WW-*6GD2JB@R#LJv^B}$?`hz|Fohd>v>5+$85&l#u}ISM z-f;v{tBpKkA}SraFieu7LzM8~A8-6xZW1@x1DclkUZ!U}by23v&#xM>YG!Uhq#Dma z5MoSooufcwr;IxdXz@cpfFU161agqDY|wsa&E8u?z$xiS6>|{*m2;i?RhFMjv=xolBBN-Q}|h&%~<>#M#UDbo%4>A?ux&MnA5D1e$CUdOy5qPdDa_n*N@Q zTo{WIo8*0VUsDU6jQ{s3$~J88t4>ugu4yshqAS5}8&wy1H#(Xm)BFregY_{c>+VZs znTb-2MzBp?s@mh<&?dKp=S6ONe!_+8FKE)|J?dxbMxgQEIe$xT(oLU@mNU3nT#6SV z=U!{!(JgC%lzBQ(tA2oHLZR&t#8_KyI^trr@zR|J1Ndnx=4#=w3N7k&1PySfXm`wh z42wM$YtC$3Sj`R-Sy>YKZ$_Db0BY9bmPt{2=5(A@OO~q`LY5SuV=#{sYm_BYLGrG! zK!-Uv_GH-9`sNuKnI%|zlism7qf^EUsFw`u%#e#c_AU$~JT}4?DV~~@9$7_9;n&wv z3YLJQI1jj<*%8)QvJ;Q@*d~+mVJw`mR2fxkCXF9kvglN>SzG3?u%Cry0skF+LOKtH z!hlWzkl!FDi>HwW5;vq>8UlfApbgig=SLOd&w3-fy5$m)T3F8c({smqhaNiz=QYJ!;p;kfXF(YhIdl&xiY>uO!*2Q?ZrYDRh7^pg;Xhzde&vrWsAgp9&${* znv8=8ap-3wo9^lkNvtg0SKPjDi+QmOv;UBrNMvx={rxsFuRr1$?=Q($8G9s-5tu0) z?xG{M?^>UTSFq=_o15^>bG$0sw8J(i0rOb{E!UR~*VG(j!+d)g;`rc9nyy{+%Q~UL z*Kbnlo#d9RabEX^>UOfxE?)@qv_8U!M0TRXDH`v<4YNJWsGJ^JX^lU$*hvrMFUY}g z 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%0AALZeO)s$?z zOcqIbld`|dydibyMjpUeISeg*efzg)>69ux(4FM9eJb#SWipW zEz^msu1ogHQS7?&z%(>I&cRuTwFyg^YX6S-sLmO054n7Y`w4G>6Hc{|ryC`ZZ|bJ^ ztU48`Hff&Iq=dgW$rN(FmcH^OV=G_c=H3&O{tT3r%YP`0qd zK#%{SgBQnTXMU@umR#7VZ80s=L9mJ3ZjLl_4(J>oZ7G9dLOhEPKd~YPZ%GNpYU;gw z!rn3VxYmtuz}ZlAdg&9tq#+B?SY&~wC7q{irk3em=j8=;&HsAw150laX(SWWMQ*zp zhz_;zHl&t9>+r!5%wp8*6II=DL%pP7A3`ywJn`0a`MVtlZ{pA}o`qqeg4vZ(nvp^_ z2d?hYY~oaW4@;XJT8!(mUi1>HzRg(qp*kb8$A;Cegr*4q?Pb9k+NBs#`2Fuf4nfVr zQ&E^Sdv-K-t_dn}9rz(HtcVxBD-C_B@+9}kVwx}E=B8t>Gb5lZ;OYujed};5U9(}m z#}>D|p>!-}jRAJ&|Gd+y)s32jV-TcqWuX`sod0=0$T%a~i&o#&R_qedE7x#*64`VC zvl=_@)=ppWW9V)yRw>)oGbz&hf;;HjL7rbSIJmdsOK>P-HrK%yF%=IIu%4)`WxA5^ zr|JJQZE^blH+UidzSpDq_o_ihUits=ufIEP&_71xo4;NZdfUFs8g$u^KZq#$^jutA zHlC;N&xmOR$Z+r(Nw4K>p*EU07P~}F!JZMmDwxDSRNRZ(D={jJC0#6M2_V=mUrs^` zYO`Q5QtaSW>F=a8gNvtB#Po)!7FA%KY$9tE;i^GMtu;=&`C(1?DQ0i)$oVv3$o{E+ zktjZEq=(3`a*&a4HL15{i~xI= z9?&{sXr0J<(Ch8xp@BhAY)1&j=(6KVx+>VEloudcaA;?PmcE?}m9_EAo5e=1f%ftvK zcB6i5s-d*Wlpzeu)j7)~=Nk6M+u^ewcdxboF8r>J$XB`SzT!nod90PkE4ykO zK`TM$>aZt-8)DEC7L>ZAsyq_g41QC`vz;kKHy!|xGAiLn7dX>|SuUx?xp_Xlu|f*R zKh3qvxeO!Gf;zU*RpnNXoGQzO@z{7j}YAW z2-mSp8kjD~&teni8-37N|6@gOB)sw^1tk*7Eo6!ZHc!VHJ5@)%KDC8Gjc5W^U(Do~ zi@q7TP8mgI!@jH49rsV>G*-{lB2SG<=0kEpGU;=nAN@L@5lR%e6%LdOXl#eT-Gy^_ z$WNE~g9}ClNgVp597aFiZb}!0b~Xqp9?P0#pvHhrW=ouFao;LZ2zuzo+P15qC?FI< z?z2}2p`K6dK&?%Og#TB;zw968=D!%SmYVb2FeoxT=nn;YaBzG3+v!~GV*)>B@;0MM zWseSJoa zYdxql_ggpvS!v%XDXXsCe}_uGu7A2x!C7#xw{n~AHJ<7*Un(pa#bm|Ad3ELRbn`6) zF)&&5Z`DEwo-nR4M>Z-yUhJJs2_86d_oi#<*gyxmK7Nb*HjYVzT~=-C%Zux=u~9K2 zXC!iZ(~3U`@rXkhgWvy;wF+^_h!d=z?ry104MqcynYsg|5e;I{>|NoqO17AH(P74f z0c;d^ik+z#QfZN(>RBS6ZSoCB zGC{q5H(4KkZ7GTBta9(k>(T9Bi z{b_tP<7E)eh6}-oTkB{hED$r>pKhu9oziMkTp*hmhD?gBEpdFcj&U{|Ejd^E^JUao z+!Q#MjlCj6Qv-<*nPm1(YMc^H=QWUzk&Rh#9DszBJn}+eA{A#U@-d_`9xllSr1gA{ zqyfHi1A5ZE#Gr~_hzV-phsyaZtl0wc_6bO(9=s>bvS61Qv~MzkG8_UES6m!)r^algd0n@r94aJ8DD9_WXy z7i(q{&qNO$G#;o#``fXx*_1zRxoA75I(qm@EBAh7qI82(48Ig)T^m3q7XfoWU>_;I zDl)7c9$-~Eyb&NR=LQwQoizZu>#3;FnNfU~h?*)+ci6@#ieOf6u{A#wuBDlG9D_5K z9TUN}CN^U`6IzNf$k zW&4#&XAg6*D_DjuK!$jn*+6fCJn#<&VxR#S_k5uy^JZOrP!(+)B_f5SG$b&rOv#t5 z=JGc|Zmx1;&G?;F9i>a!+noCN2U*q07q4_{IOUQ`R-?O|ORwL_VOmsoARH4~M8Xk?Wj=Sj8tTGkGi^V=ypR z&?o^7<|N|NpfNc1pb}-8M--+-TiKH4e?RW#B?#3%O9|j+7I(LO&0uz1PY-(Wm(H@m zD*aWA2jH`o=7auVrbfzcq(0SEV}6k~3c%ZZN<=3;#af;ubZmf|tx7}Ini@yxdLYER zmtHY>HgYos-3k*OZ6imhaaN&V1H3HN?OkYe+W;e|LNqs+0v~(u0Fb(*d!95r15%G> zhR>T_G}<|RwRuZD3b?GW0L+5Feo86HO`1|B3}Goe5=-Y@RvHC%VSFpH@L&kvARvJ@ zl&iH#0seGmiR7J45u_hJ^$w)5sJ5Q9A2C1MW7!N_V9dnoU2vbIRJ^Ac7*58G%js_n zgkzc}A4kMg4SWo@N?PNWm9^Xs(B6?MclLlBza7|BfN!8725W|iwTu%cyI*wB$N=JO z&4)dpP3MI4bj#&c?>@M}r$SFNeV+a1^zY4bxe^phKM#ANiUi>3&GDcCRrdG&Bm$lV4gywO5L#H|^Vv2W-YAt*R2M&_ufF{h`#HNp#YwYf)27Q;>=g^!SchXCZ|o*# zf>jnx6Q0YI?QnA^M%?SM1S!6zFcCwG4}Uh;#j@V3)yEk|x_oiPylE~FP5qDn&cD2H)8%Q-3LoIkHH8!$W8|TWZ*Q2%ud`5FpjJP?cqKpyGYmFJ!XNs-)i7wO zDxFf+w}|Kx!N|A@lPbpM^nss1~{)R5s!Wr_6&;07`m6^0F{)lUVZH;Qq7u=oHJ9XeUT z-VhBNcI{ect{fn6hPjg0bzg&oA23D5&5ypEVOD8vqYgXG^q}DM#_^mQ3jT8WtN4O+ zY)p2WgN%%IpxlN7#RrbVFg-6f2@V=wa#1ecjLpd>5!S-=pW6OCVmm88`r)`Wi8YvQ zPDwC6ApRraw?Nna4-RD3aU7#FcWN63uJthWGQGtKfxYd3hjjWqH0+FcGS{+)E6eOu zWsQt4pPM4^q)QE93t@-^32s9;x^m@@dv2#Hz-P=Caq}36M6P#BFqP~B&Ws>#;O!bL zk<-L1pKM79IEz|={DE-(Z-gNYSC!?wyyD^dHma#Joz5~%OD^YB$FKA^Bw=%)GI}Kv zWI?uZ(#Ymkn;Gir+F6W|aIvB>r>-dxlnIZZ0Vc;?Lw(V5X<-~g=q1v4&3+KECs zf%m(g-Y#B8Dc7_??}B~)Hh5WSTiN_7Y5V5p{ZM>K#*#(&#b91ehwH)x8XDx59&7iW zdPwrRmKq{@|l@Sf`@kc>*UTJPKSW4KKTq>#!RYWyV9LMmRtyV3$ zcnPg{cM+-T8y*|2$5z)TC@6a4Y!fP$V!h4DFRzVC(P!QaVwdxdOTZvzw9-fd)%}c9 zDe^brz7P{1_V)@06sn3APTq+bBj+0Y`v6Y6de0^!SY;^7`*ox7_+cz#5?|=CwXv&% zVCnz+z0H8mYt$e5#dr+cYBPs2xSK_je@=;UDSo|oU96T1aKg~+N>}NFlknK&a%O#a z9m}e#1}d+diy~+W{<#fuV2CKeckL#zF2i3)&l}G*BRDIXlE+=imi_zTZze1Acwl>k z7<$rd3Me|_Fo`ct=L3avCjBCKPah)sfuy@6R&PsXlS@<^&EgYr| zwPJYEI0R$W$v}?-iiZk5llx^-?^4q{)h0)Lgl&a{ljmCTaO73ijgePMl(^!(vxsRW z;1p1)YqNSkp`yH^uB6%2l_(yhrq`Z85N5ohuH*Sphi4el78CF`J7R@06CfIOTxn8Z zmnueI&Q!?Ub7z_pTb4t)XCS6u_qVpB=7athlSx755^)iD;G>>dK4CpqB;MZt!_`@a zMb-B0o^Fut8oEnBTIud?29Ov+VCWWx?(UQvx>LFv>Fy9D1O*Y$J>2`fpZD4O8*?0d zTi06GKhE>~g-^YIwdOYyQZ*>m{PNPlzOUjeC?tMvg&37Uls8?&tfDxry=^g!7M<-) zCJ9>py7-a)9VjQ1_+@8&b|?gj_$KnAG5LD#8yU(>_Sqae`5)3ZmYKB|EvJxEQ;C#yB|RslDS@+=aSqylVZ?S z+r@jr_)>$XAK`-Er@2&iD4KY>s(HgZ7pqM&{UVbQ&BfNTynhhir<8fU1MJaTUZ4>6+922lJbhIH4lyQ$n6x^JjR+!}Rlxpz!z8IjO0AY!duqmg z%cPrV!Zf%I<^}O49~ww|+_UuyC(H|qa;VRPOtKmst(B!@ND-5Hv}V?n_^|IcU_oaT zbTy*3Rk-rsdIpc{+v{o?@xW;Ygf*kYnDa*eT!NT)!C5y5Y}_uTP}%g}G$YYoGRGo8 zXT<$ZcBj+*`pdJNbwViuXqxnIhGlC)%oR#;H z!b|c|y4XYf=a?$(aFaaa`TK5#z<5-tG!5CkiuZ#47aYYZ0RIcqzoEJ}JOi zGHG|rq+wEAL@f0pyyJb>nU>5zM~TV!uNHvS5tlYxR3sxx`xBc`go`)TJ`j}z^@qIe z-fWOMIxZYJDs8Ni5yzWY1!>wxfn@OSEuqDoQOBAdVXaR%a6>r$-dMEZlqLxcZ&9u& z>qTUQ#G=|oATFp%c>BM}L78=An-~MsRnBpTezB;`uI?`6qqEPiL=;IAOcUm)LI#7= zWO(4#O{!Cva}wL@;ZtZO2T?}fks<&oRmGtZ8%c7jsOR#xbo5S z%d@I}2fF%;t@7hk5AXQu#T26>icb=RT_!pIpF(ddr4d6wtcC$HdA4Z>8ormqLq zD`d3a-kLdWe71EL4~?4GUyE-;t_MQ^C5=K7ousrO$*<_86ciJa*{se+GN<3r0ivPw zfRh1(yfVP4Kx@C%xv0qx=6B2=`lB#k^_dG{Vo@-%;-|@air-{Y`@0}~%^W;kF>s=m z^K!3M3uY+f2_AuO-cmW1yP-N5t-`X4L|qWd{h*2uwrFWfK(d!v#s}|%agAoj`}Bx87q%F$=xU6 zxN$JfVaFJDe_eB)N~7TDhoRvmRtC!--_f?bkw{Q=PYk3<^N^4h)qs4kI`>6m5l?^*^@s5HhLG7hlX7*;v0BA!rLYHZjLbEco?4%V+7BPU%ZO4C_J zp1yJi8dHumW{tE{;SFH)OcsU4WA@u|&R?7W=YAUk6cn3L`Q0lI(>1m#iL)+^t}rP; zB<}%ZGvB2Ng%m}HKv(UDxc#+W!y1LyvQvy{N_Ykiwv?r$0Enh1$XU}_KX1>ye_X=6 zF0suM)l5-esn3(aQEtS?tmq(;;1{*ttG8%Fa*SVQ&TZvMbcl>-LfdgZ`VC#eZOsci zCTs=IQS}YOqrQ4(K7HySC(hv9Js79B9{Wl&47%l6eiei{?&GMw2`PFTem(-$&!I&aGiB8Ji@c+m7~lX)zG)19#ug(cOVU>p8FAQz^9A zq0qD(Orh>;Dh5vlm0j1+pTiM-__$9P5eZ@yMG*&O@vnH}3!cl^466>V2a(-LdQjg` z0!<2rhEv{H1$^(iw({T;3wq`}ji)K<{Uv@~VXf0C(2YgT#{vObo2=q;Q6JgTK%?0n zgyrD<5iCI`&?EUJAA$IgX(l#98q0Aq>taWD$oWJel!Gt;6j*kez_e;d28HA26Szs)5blM) zMlt(405pV3RZ)hE4J7 z_SHuQI^kCg@a94h+xH7g&ap<;6ZuPbbb7WlL*D!Rt>w;gL6T94UfF}hT^^bh$yd?h z-OE3tNq--Zb|JcN0R=Zn>&4sQzmgVFaGeDpo(`aptgIX)4d%>^(pR@8*yXHIxuW5a zv_UQk0YM8s#bAS|45&WX&&z{EhE;r|`XNYOo{u#(kN-ktXWk^e@DR<7(fCecSOLvy z$diDU9remo*OD>K@}RU}jDn$vO_sHn8Pq$Yu>X!>_?}Kq^Swi??EF%X0nifjp(-FZ zh2!%wm!X#a;8$BGobs?8Gi>7GpR1Mtqkq~Xi+%yi+PhOJWrB+^vQ(mMAr$v2oMe2d z$m{u|dPX*Yj*}nK^lUJqWg-aAX=VCiU1YO5uX21TQVz=r=n$r@Ek(JY7FS2e-ob`B z#>7kW&X9q8jm?MI#w^KQl4H6(bMND_&=+#c0~W@U$r;;GQME89pw(55Mx%^Nl*J$V zR)yGN=yK;Q3Yi`%rV<0xw1d6Yr}8|>4X|sqan=8d1mo+C>)g)4ssj7ml0Pdh#cnvg zK#@!K;L&JI_J?7d#TsbxahKHoX8XKnR&)|F!>MrAQ`(T=4lL7Qu4Zo~B5YN$4Iy%O zAI*s7^s|k_U*<$XwM=cb`u1k5gl)9cE(iIA_M69!b1{*>Km@vG>-U zt;WT3;_KG?@7YJ7CsZLzJ{~1G%ldq8q`U5y-$`vHehOL2^h%wr_-=x*F_v0*JU-{I&{!DcLEZ+6v&1JlhwbeW;-j7C-pVQ_nnaxX z$@Gq_Qdzh=_>;WZ8|YUQidLY-svHe-364P>UD7}z7l9Q(BeYceeWb&Hk1kUMGNbei zeDV7j5J)_|2sPdiJ>!7pHy)V;UOooA){m~u@5S6?RvnWZN{${9$KRaXkKeQ$JBJ>9 zwhI&#$Z!*ew?s(01v?w*<$cTN=daJd%EY}96I^0NV#Ty{UStX-I2QNMy-$lG zuGd$3h-n^INBgGQVR)wNTCdNTqX{&{3s6i{FP^?rM~TPVD7+@d?jsfgcrL>E~-7SEsgA z9y6uulGC~JQWz!)8nyz#5?1AMBsRoz#4rf_)SD@%?<@FF+>*rV<*`r$Yz#g2h@aW> zUP|>QdUYaoYVMm5Y>+Bb4Rg5l5avVAM*wcTRD@Fy7V0x}wS%PVrx4u(b(DC#nizF| z-QIp7NE<(Pw06|f13|)ZzCqfA2GK8pfjm6ZKcQVD{L|oqNYD8}p?jpO2g1fB>F@7! zry^FEaW#~%N?XJA zpY}-ZLZ|9|lW2fijFf6uLj6@N>YVw|(@w3w>=*#FJyCZo$;B4Uz9OFh`d%f%0FN9T`KF`E6!OTHK_NYv}AN-CpdXYEL|YoGA4=FTl*bmlycKz;9i?tE1cX8g`|U^ z;RxDYZ4DfJR0xBPTeHz^>|LH`{9fUMp@&N0gPV@S=~^#piWOHVP4iqo$>&qqU(0Ph zVK2H^(osBapK;}Dm<$o0=FfEmx6jPE*}ce%^mSBT;s(zImZt7K?O+z#b=5;r@b~G2 zc{Jc96(0t&)D3(KW2ZhmQ0)9d`2#aKzx7_KG7IbdbKX1h5)|JJqmhrkq#nbpMYoze z|8=HVeDv3Rcx*Bx?>w?fkTqKJ^;m5;ea9MPt~T_R}LhZor49p6_GA3tAJ9- zh2Z|_fCm1L4XI&bzC+ l|CZj$-EF*bcK%;rzwl#a!j6HEsb+P#j1Gonh$?@fX>j zUdkKM!sa$j=qY~?;NCA_(i?8C$hIVLJgyy?a9`oGtX$!14v-cfgOE98!{`xaoJ9Pu zcIDbB>!PG35UsaZLbzF9i?&K@uANHu8qf zEn>c=VVL|?1i`6Lh#OOzi~aK#Y$a74#= znt_FiusZFzY%@ioiazmHg98@oUA!O!)Mq?=G?D>cto?p>Dqoz{A!?FV@pzPk=`m6% zPbYpiZ8V?f0JIhbm#l*E5vuF>UDEbbZ_Bk;a5+g0H|UZqE6sEeG)I)(q?pRpUsZn0 zOiZNU=I2HSgJ@HSEw17Yzk@=q!t8@`wY)MU`OGFDL`HXd8MTMSp8PiyEZ!d3tSGzo zWf})=m(}=V58|L;Foia`9|_}-5rL78u+8Wx6@6?&h2sGF;C!&NuEWt9N(^3OI+-rQ zY2wZ1o2EP?<66y(+A06tlegLD4+jqfw5eVqPWhjv9`Yw;0av(SA{E@GbG>GI9wLB{n-+ zFp<28%jmm5OhZH7hx_F5KUSOE@nz68DWxnOQ4#!2$3luZT5Eiorgi0Fl^_ zuCDdIx-3YObDe_ZmEYA&_pEa9ZP@XrvnNolR1~LVL?YY}ATulH5VTl&9*E9O*_qgE zrR$I^kS}aS*lEM{!Wi_MzFIgE6kZe{BJ{(E3y^_%>YGtFxJr4nKgkO0LhoC*>WU+< zRiXVrha3G}C0WOfjNp6Htg{}v-)i;=0Z z74{1eB3Hx%n#ck7;+;pe8G%V=WS{oA|Lo5Q!$7w*Bd$ZYFtf?c+KaSC?0b~@5DXF} z3NZRdb$yf3OZh@@H~R_I-(%$VQ6y`F8Bn~wpulay^tr#{c7Dal2fXe3&!zZzZaCxU zwZNsHYOS7fBUY<1m*%cW0l_|Eh!?qFDp(q;Mp!l$on$7#MJ*5Uq-$Qz2x-CBuq?kM z6*q-TrE7aB@YvKjBdrz^&XL?IKP|OLOk&K?f@xT&PQdg%+x>?BKj-ndhoYs(o*7{ zt$66W3gg~C)g|nJQX=1-A~0S)QvQ-o2zaXnNlGCWw(s(iab1Nx*~--$HEQV;Wf@tI zD%`#nU{Egj`3IL*yDu_W=y0bra8yP%;Cnv#7n7K;ttF$WUwG(klNae_MjMjf*huZ* zA(T>mA(oQrz4?8Kv}MNv%9!pQ(U7*pu8YH7TX#n5S?F|WdB>CX;Mg0XQdS-8<)_|? z33zy$ol+`z35+e>PQNnQI#hs0BC;?{pFJ2laavNHEJL82A2@@bijN9 zlj=XgJNG_&Qc_dz7r=r$zB}~ZIS2*)5es}?3Hsc;aO`eKaWa!PI6sevgM&l8B+mK2 z!w?&U2OJ=23|$Jw!#=(dnq4M9)RYJP9OwRrUsXz}=VIbnpdfFTUELKLhtdRS;J5o| z7mGb{=Nsj0?$-H^0A2w{8~TeI=dMaa&h?VVV!QX?;4>|Qa|FYHPs^u$Qbc*5q6P~O zOjBMhAiXZvv1HVyD+Gebp(BueJKF$EUf>j_uZ{J9tc9n+k&Z|iq~8@?5i6;liVU%| zSSzdoiD{^_odH3Ly4ZCpz;oeB0AY&wdZ}J|RQoTECe2_cbFMnhHg7lh)IJl;W7e2=v*P= zs)7X7e{%6?@wSj~Crd4-pDin|hD=)64m#ys`FLzGy%xRl3@(mZdXv#JW{H11tS_blH=M>~_EAGd`Ei zL`fMNvjq2-to3W2R1^C13|5(o1FxmM&&lPR`o_E2O@W#TCCT}V{v^eCyo{<-&~Be{ zfTt;r|>(LVnm-VC|wvm8yv1h5AE9kOZcOGfM$gq_RAc>3HcbMZ@+5Y-6 zly#kxiHY30Hom>O_&xNvr7!-i&&?sk&J^RNQ>i`O_ByX=+lO7~zwX+4#UI2V!4cHH zr^y|x-!x5*J&95X zAwj08;dRSII@1s3wV(OM-4q?`r4AieI=4cOd(-jowRbBhl8hDtbtT8PEeeWht*(*7 zw9+NVR$;izYSD6(tS9*%pV{|fpkgZ0%-UbFmDB5NgoWSfsubg+Sz!}L!1~>u0mStP+~y` zlu3cg0#s>}kG-C&kp(7lT|<}OS#N!PNC(TM*58l|+IQH9TS-g`$D^Ne9ABik9oF*O*(M>o^ z<$5Y<4uk4-O16`bz|2=){Woq}A@{0z5|vz#jKO;X5$~3E82HH*#(6UP-oD}7g$<)~ z55o{|5w>CnWN^XiLBAJp@m`+iw%^R_{O?%qrV;8eiQ`K{3kPTZe5U{X<>UK8h2-+7 z`G=4KLv+Vrcx^bf?a}=GPQyIv4>PQGJHoiP|Gv32EdOX{VICUKO|PARe>xmkj79G# z_tOA(>XrG^KFL8S&C~8-?n~CeOB~O{RYDo@B<1ZBi=`a-D85L=p1u#@i0!Ds*Jyyv z(1pn)*>speSGTG?nz!Fer@Hc^l3w@9ZC2HK+Rde}gD3pr6IPT!@1*B$x#%zLDF?`K z=G=WPi|*7CmKCMt1D3G9BW3aBlswfd?W%%+3Z5xU1c`)S50+GZ7=!1u1pM=VRvFRzLR{C*_DsgVA zK`OjW5-p%aFF7HtnxNb`K7Smd#Xp#tONoP;7uFNYPdRhIqs4}~_N~Dj0k!JpU%Y^{ ztHj>6gJK~hKrW3)u0dSn+My+3#Prx{0LOF7ABAE!8dUavPise%k$$B;Trtg zi!s@yMnQZ{bodK@CLKf|B|&TddP`#8B==JdvB{&jE6(I3bWcbpdFN;ClyXja<$;MY zd)mF`38;0CrV@fNs$%4Of*X>|@Yt0%S!Tf0UozHyFQ)0`z*2V&;co(yNW}Jr(;Eh^;zyE%BF%3;h@e@jsyN&E?|Qus)RJA1CMw0Ss2oIhfs& zcf&wq9Pyzr2-DxVmyD$s7}WI(-3exnr!u>1%-H)`7bLD$AQ6|stiBI3*Kxw45n3%F z-(T`{UdWpHx49=4pUn^dD1b&!zqU%tm)nFiebK0j!rjkC&fEH(~aCSe}!FMqt4SideQ0 z2bj>$Yk9R9f^?E=^!b$)!I}PT%f1k34CqWhg2o&|N;gokJl6x(-G5h;A>ix~OV}`u zjDAoky8XOP;?=l5`jxJhMNy2C#ZmMZAoB9=4W{tqPY{WnT)IvR^Z{^}xNoFWUTR|>`cs#Tmi*qJTH zc#^6^#7iF}A-B6Kl19nEM4#-FtF8M*i;l9^@?jG#@e?GJi}vHUmY_wmx)>OGN6*M+Jq-^huZuCi z$Kw4%Eh;Vf^{$<}ftOY-Ygi;Nr2~rj8;V8$1gK% zwQ#&uM`V(C_nFo1#(GgE3sF7UIz|JhiV7-j)ooha_ns{`tImi6EEalnGN~se+W0J* zv>I9qbz@X_8?A#{NA{a54VHI6$ott`~4-O+#a+P|0B01Wz zTV3)QN%`?zn9CHwj>mUHqB>#^-W(+}T@Tu3%OO|GqzkuaYI*~u#)@O!_Xvh@;!}O^ zh-!di!hG|d-?atxVKzumyT)xa&MVNo>Ev^z;Gwqitw%vL)LPh(5^YqEH>FxQk53>+=>cebaoyJ3zW8Mj|gYy%y_I zD@|(k6--Lc0AEFP^mr&$dwfjli470m04)>kh!H(`vcRiZC|5W4l>R0k^h4h3PmNLC ziubJFb|@^|K-_P(;>-llC5#?aDGknZ=G`8i&OA0W$Ut_`eqO2aUXpl zt-d$|hp^vl!tKs4S*|(1%yN(JVJz6M@l9UAqH)V!Y6LduO!}*^jY( zHni1`UyI)`T2TDRQn{^yewS;DdN>YSrGR>C#sU8^S3$7g9O+gmQ8`&FB;o zIv6-mh}eySoVaK9+62SuZ^J2bkD|>fgP|AN@TTnR#H#YbTCb{Hx+G80$QK z=g-B?KlbmJunLzMai|f;hk$eA@5gU?eQwrn&3^}}2DV*OzjISV$vE`nA<<fWC z2ftAiZxxfdMK|3)n~#|&{o0Cg+t;716k!5v??!6;<-^5lH=+vsr%m|~8O)%Txv^*P zq_C8GH50E-55=CVs|eu4IW+kT1dcc9*g?=aLT_CXwm47+7Ii_ssaMpN4x=|LFYQwf ztis}9l&%*KZI7^1*q7$N6n|S$Xr}%|S@ZYpzkABvAR;r^s4%_Yg&axw_B+Abk2H@B zG=s2#BiV}~IsrPp^Sfqe0OrE~ee>7>KDmazdE2dxIazoaiZ=%Q$Xh2RJjprK{fWmg zUyno#L6%cz9YTA&?)pqJ(_#IM(u;esI3Ldxv&QN-Xwgo)%ulMr|$pb&A%AwNHECFIOr zG?q3N;5JXfambAZ-=F3n{AFMwo?a#L3$BE2uOPj28a5-obZuqnz3_Abg3h?H7i4?m z_2OpNbe|A8zdndGj$!&ZX_5TBAkDJFK$JA&Hi=;N{fG_`JNDPAXywXs6bsS?9QfOO zjIRw3!m%Md6Aaahls}CqZc|OUmDOk{G%GI@r$z{qX^Uk?q;Y@5GneA5Yi#s*8IjYH zkf^DUqP8^h!{W8nKZ0(Z??rcDy7f-Z4;FH75CncE`p4cwa6v#T)bK;PX_kjfoe@;H zlIbgl8*XlM`Ksi@s^RYAoe*WKe{aDcffw`SKd{%8o;!j6`xJ>MK`rarj<7rpFadT4>mKLR6}?#D;#>j*ZDE<;o#JBxl%2P zs%&zdoXb>>6?Whl3IaezXf%r-y>q52Nj|-egKuFmTey3{1W?Gv3&#^H;w-^$!;rfq zQM-KNfpsQCkySY>al(Z>5g&>kEI*2e4%M(XN0$$kw?j)ZYhzR2NNV&0vVk@$2k}13 z8`4!d&>jpdA8g7By_rav;T?c_oqmSu=jdEqb5oaEI$92gZwN0!we)f>RvS7gbu9}fHgO~|zB8d% zC+;7=xw6u<@qGi}v)Q=psz$>p`cY&qu#!J*&rUv*T)!3jkV!dmPRhz|Ta%5v7+4Zn z2@DIHi$3;Pvt^9s>HSnw>{v3BTGLwRREYvos9C=55|OPUmhSa6Isg84>R)~JFY`E9 z@$`29Ht{#z^uL{kqc-JC53o3)<)sVHL>~zx8vVA-89PVJg@pZPeGgHPyacl$1~1|u(vx4Icqj>UK7mlGMVpo7p090>v@*!H#awG}-5TbsA$ zZibCYg$J@>cJ}5Vx}JM}&60J`C|-bJCHiO3hH*`MrqSYeNqcbq?O-)>%ufm3am=mM z+)7~-U?kFvkCGLWv{iM7!n^5L2*F?zY$cYBt`GXuD^zkaOy22~TneiwBhm>%lujVg zbuYGi^M%WGu?n0ODy{KnB}LsPFbNrnV4n~ukCk3vdxb}3(&6mJ1ZZjU4Q-pZ6B2HB z{0b*!@?5E0`$CCa)=Jh$XCwnc7 zAulI+CxR5&e(FpwF|U4&hson>PXF0>DSC%?^1i4C>Y`uq_-3omfheQI`JhCVF}$Kq zLtKaHNk@gT0E6IP&V`;;-sJ?biP8^xH~ntB9VeCo=9dB=WGsqxDwQ^l8nGU4+U_L3 zluEO3d;PaI_Z8tx!P|rvF7?s<2mb?#U$7y0EUe5q`0;hY`!;7M7Dg&XeHqfM^#1Ya ze#s(%)wze3gMI=n2DQZG2o-9Uow#jO=M%*3m2zDl$}=X4O=#&{G@7u^>?|#T%U}Ca zc`Bs!orR&@y?~l05Ks0`c3zHluG;j}%bQA(q zDOFFF{-*O>6$8d&ECXnvGpbY`r^r?^D9fD3XGKBc%Ej;dBMa4K^O~+l(=&+)lEbZA zpr2Too%X)*GPuv*#0CqUi9*9dtC;;v=D(_%cmzB>IIbSBaNi3@<9tMj_oC6aix+y#CPJDRA zb@@Ksz2$ynEj6?z()HFP_T9R-j&%N4xk>5|x#)LcROaX_zE7`S|69HU7GA%!FTd6b zp4V==j?|uEKytP}u;mB>Y?AW#<4Xz{Y|zG$e+^;YebEbihh@aQ$N%kB3Trq*h3$)T z#iUedi^lH-;7y~4yYi*8=bV9(({zH0*#-i}r-`lFF!p1KD8pp zABKJxvl&J(lUZ;_%ebTDNW3x&;R&*B4uPP(GQQB!FrfUKNXBkqjIDN~5|?^y$`NJJ zIjO1qX_ujy{_Sn%MSqP@O;}PTl^A^H_NRMD5A%@1aPXiCV5CsSrm11G@Ql`=)(L28 zvW45GHhV>tCf2|LjSs6}aL8SP@HL^5ln1D=MzD=2ZP%!dGnC_VOj@mDe_}up(j~xn z-5L21xb#Fv1pCt|i#*xFva9x@OeLQEp+%TLifMXWq{hj>tN<@zU0!_K_VMq&XXa>G zB3Hw;^hewB60!TX?hmOa@AP29A9dKnzd6^#Brpbk822%?Db^hL?bd}yJR+|!(D@yg zPRestMXHoK|A--*Rms7uVU}=myfljg$?DlAlK2tueTUYEmuJJ-)n#388r z%cx!k$4vac9v*C~dEY1u_Ywf?J}g+P6LSPg$s+t z&>W6URKm7ZfmjA7F-+^gR}IUG&V*g;Yq+tj^XM(ruvlw({pNfnM?^Q#62l>;k$^sb zlMkK##WMlPZ5>={uOED0Oq9~9o~q<+hDMyv%s4c)`NM?34Tbcp+)RIQ-nkOa9wvZj z5Y5k~Mw&heA9EZ$no}+#HbADtI+`F<_-NfhfN*g@#Hw0Yw@d@{ z_vVpKd*w4Jc#B_CHl7!|O}XQnWKNrPk^68Q?n1~$OMYr_j->r~dYTIEcv0kG;;GhE zl=#7Vde{S#;;FCsiGEcvUoex-oe~p1*uz<^6ABVwwn9fBl(PLx+k7mX5%S#S#%W-J zT1Wk#o$+1YO)bL+I+>;vkE&F{`=rv768|0u+6vgduI8hz6w2$hFa8{+X&#@sfr@&~ zix@@evN}*_ml|W*;QblF1|Md&nA!m3xQ)lAUTHhxCTu)7p2`dXY_II283?2{hb!bF zJ2}{uFjh4%9Z$hHaYL=Q13UVNqviOOVL!P%>-{BV8f8)ImFZ{-WzhuviLml-SsidKknV+bmP&`BAEKt{i1`1k)3 z7rwXfD2Ica*D1{QW8@w1i6FJK0?py#7fY=&h$!$NOYKsSh;LBc=T)((q*}7(*|^GQ z&(SEmE~SgDUH0I0Dc0&qmpDG#1L7JC6Gy)Jw_Bwq;dg@t5+>Xv8>r@gL)jXzKnS)=qpxFY0rwWF%--Zz%zy&;ml4dKvd1OWKve%6wjLNdp- znds8Hte=rmS*Az(-R4=?&9|8$3Zx?=C=vvm;~2}CG25-rC?&YeHZ0$jLaZWiq$`9q zfG~+{ig89kzS$$C|;g%(%s} z@)WYJWkilHeOp#kU9*utBW-PkQHR8%q{+U<%fb}kb@N0T!LwGMm|Ao6sn1WJka04I zGQ5-3G5}m5utR6vI1YrSOJ#px@Qj0f&_NvW_<4gF%SMXST zsLv*+dhPVam$`x8TpP1n6GWlemib9UDvc(i>y@tF{2!RoX1^DczlgRI84^`Beo zs{+y)K8lkdkKW|oC2_#L=e3tXgW-8LmoM=dbq;7#kZF>RZWno88yi4<5D%{B-U#b? z0HHpr>t2|;{Hu)Nn$la}#4tk{m^4)Sa2wuBt$d|Hy3ig2>BWk09k86~k(RM5m)XzY z?J800oM>XO=C}=2Ph@s%wM1uwn{ORgJEUSM^^qr{QQHnE7y-@)LqIL2*|@zf-=0aN zNumR+$COcKLjyCX{+rllQa9>ZO0zXD2rkEH6&qJh%)w!nvUEL%$@B#Aklkg_CT>5p znKX%;5jWd^#PiSj4x9;N&Ni6L+)ut5g?Pl*S!$xgNW?}?$8pA<%Q8RV^GXMKs@-t+ zJl=@G6ubW$M#GC<#u?r(-*#|4`FZK*d$nB!I6xn$gPPjg$W1OXSA}FsqSmG*WblR@ zI7&QfM*s5s+XGqjQ)en6s|+G<^m4wPBo)7z`u5cIM zWjjqQa)`~R0?}e7VoYL3uE&Vo3-oRE*z?GjLzNOK3Y{a(noPx2Ne?Nj9H|`pQ{ybN z=)K<mr82{M@GNlt`J!XqCgA z^&QPAlUDrzi3*J$}H%r_XWF&`UQ`_Uw8SdZY(GSA5_(OQ)c7 zi?^YQ5jt%S#&14gx{OkJCk>sr&8@T;_Ws0+yT*Iaju1<0j+staQ#Gn9_CLni-3WqC z1EA2=#BA>0*24$lTUlLGAy;A4)n3}>tCOflIhRPE@&Lt5LStQ7%kA3Z`PBl?wyi&_ zI31B(KbU_87?7kXHF`=vROc@aHRhbPe5@qQ07c@WN9LUk;UXXamc?O8WOO@6=G{;4!IYb0n09 zUQy=!9q9<1XDu$zof;7|oudS)aqBibk|FBok+=uEc5R_#15zMdq591fi{a|UYkiDg zvr$N#-cs_bbJq#85QE2XOxRZVHPhKzi{~JkvY(TJ0Tci^%03Ern9;zdT5P>&66BwE z`!H3!sl#CoGfX3~s*YI_YPU2q=>ZD0z+;Zpx(~1E2`xyc#3avo<33qXlG!^EU)lW7 zAmS;6k}TW4&Q}noLETKGh3A116nU{kXT>E5P*Aw#YH1zdWkh8tmj(fNy2Ege@2W6L zi^2tMmSJkHPvQNHA&JBnamDd5Uq~bE{v-~z#}O14br>ume?c=KrPp&X|1IGPnVJa< zKB9d;h{In-Q*oQkauQUUon!5s2LAG)Sd;Zvjt=93u$C#}5`O-KKuvICTte2oU69Vw z7yT^B)QN6qMH>o~wPU?uTE^75k#V=S)!EbraSR*#6p-uB_LH5DilW#_T}B)-=V$+U z*DYRgJk2_$8r$|}a_-c;gH3CYX6{o28D#3c;&lBz(az(L82VHdGXtEJh&6~3NJ}9c zSrkU8I+WK;N)enkm0ZDA+2I(($plN8g)NDKByG+|6H>LD$&@7kbVc2?j*lP7#o>Am zw0^ZS@}P9-@9_T4SH`n2ZP((Bt%wg8n+2%eRIVczh6Sm*`B}pJ&^x7$e`^80+xFi1 zmExMv&;pVDj%=C?DnibLa$Qzwg;mFv&-eqwYm6?DrJj0^v6iWgJZi-=f$>yQ8p_@) zRb+CJ3yEzvv01?*GX2M~M-@vQ@570H8p*NMaDvxg(*e)oj|eVbN03Q_2#LXiSOjS^ z`JskQ6h-`&wJmKR1t<}j^K8wb&TgNmk}hNAQhYwsq0RkPeW%e-EF7E_r!NthtH23< zRcLM1K%D=CjF(UE90wSSW+f9F(zC*N*Ijq(YkBlwO%T`Eula|wp0~osd-<}V~iDUDOJU;K`29#=85R5>lNpJDA7n+4KWy~!+4 z;nqV;>6U3}n%N?2_7U_}e0Kbc1|OT~Ln*foiHm>=C-)DEPY7M%OWzv@dVc0tut>8V zuOS588x0oL2H2ngq1vpC8<)GUqdOq+Uf4+(lGuW|IhSQs^cIYiHN3%QbzGnevh45g zx~|iaYCfdhR^G+sY}uY;=&KTVZb(-{(~Gd395+Bq(Rz9Hly%PO2aKZ7gl~zoJFbE* zW5eEzM9B5ihS`K6={g(-C)as7xP*S;B60$h;N*qnzGH)|D#L)AJob{+x#bVqbcP!Z zadGIbAcdGP6gR!>O>4(EQi2glBA8<-92_f=QhEV10XRxIcv}pmR+KUwHZI;-dUzuR zPY=UCOPZr`^ckY-5!GRnppFG{&w?oo&~$l zIj$&mI{2UWJpt!9%TCw$z0$5K;at z*H+s8uts3C-q$n?Yd9TivDMVIWI@7MoJA7*qk}2s#))MC1yEUs>e7<`M2<1;$j2Ig zvvU<5>bcrv2OLrzP2-6bxT@K_cl>CgSS28Z#=62x&$bt?nVrbr&rk=w`=GQ=32Fe& zK=HiP3Q!$bOdS}Coz!=b+3zT{*>0Nxm@+Wrn>K5OC39mOWkiysnc&8DwdK9g&0E-2xGumU&Z`=HVUq{f2sOcWd{7PZjIpC4}iT)3w3 z7n@&ZmEF4w$i^`0mi_=WTvu0(T820L>!P9SJY8=ySTl^gB1K(Q^O;^lh?U_-3NDYS z%|r4n)B549C3DADmB(P;IQQXgf~(P}J++%{%)1?!pH_&slV>=%9Mk%Bc_#BC$tOr^ zodA9M(zj3ybUrD&QF2YVDR1C9%1PqL18MWUbpf9Gs1Rc+Y%mrBRyik7Ri#Qb7$1@g zG%A1s^5c^Fdy4D8h={DhI-q8t4aJ4!CKgrohm>L8KeeQJ%@3f5K+ftPT6()Skzc~$ z&)Q4*@|~zRe*~5tldzUbEgPp`oj+1ukdn>stlafDthWT8@voW<90_Y|%(gOqa6RACPDxcDKFoe(cL4oXziivncDehlJx_#kT zhhf3x36g;izk8fV{VCPxsfMdUg#7V~A zTzVp%@Caj4sc2EHdpfus4fI#n+Kuz#+sgB62k*P{*0Je&a3PjqZbSum;Jm&utxb9_ z>yuN@Ug*j{#T8m3qGj@AQ|ngxR@jW?hd_1XS5M$ZgMPMKIHuk^UrS=nrlE?Eqobc#G-ljO+uBgbKNdd`;59FF)R!vO!HrVnA@x8tBkATV!VuS7&SIZ__b{pKNy8r%pgbCFB5zK#o$+(`fl^}q- zzVzy);D)&+uH(JB5!L@sb$=BX)%*Q{qa%nxBPrb_-Q5F7cXz``cPrh9Aky949ZGk1 zhcrWobe%nZe&6%IIOpbE9$#Dt^MaZE?B`i)?X}(kuqE8aJa0Bb&!4V4NnorU$9rfa zJV@y53)+UYqBlOk@M7NJ9rpwf%BT(w4oYJHG^HaD24V7ezF+U0UX$lu4FZ@HkDYFc zk^kcc9>3u3>Hkv;GTQpNm;RKzV+386&-fti7!@p0-^|)DAwwQK(H!!3q`R$wm&9!9 zy6r2cu9LG}E!d=$rBLNbI&8SIP(~84_07_MN&m^o-xGITLRz&Z{t>|V5+irrT3PB*IJVlybjPOfpIgnf5S4= zywa5l1{vT1xKm`>pfdm?f;JMx>~|gsKt)bF?pb0eV6GV7$1?x{*)5pe52bAOuy+ zm5f&D0?J%W?17BbIPtwE9)A2mPRsrTCF#<1eiFpNZJzPy?N5!u@5fgvu<0Ad(<#a{ zh<*2lRxXH4>#xo-96c6{+pqS$UZ1Ap99$NZP$36m;ffKgt31V~ULUb-cwKm9cNlMyHZb!zlk*ZA$-G%XRmCt+CyoRU=>~1ox`Flo~JF zPOGZDv*Kx)%o9F~>cmZd@KlI($JyqlY?M2dgzr@=LWFKzv$ZB7*@Iu$9Ao230D$zV zck0$zBWKjaaf)e0z3I!6IU}1tzDejN^hh81{p}c7#-FRk zZR0F1o0s&`66NZ$19v(svxDA&2aV<8PZ{0&u`;+$ht*zu{QQwg@~$PL9?za#GOher z74<{fe0+(Wqgq1p;1=he=&xD5QeHQwzCT@FPsdR|(P#Ba5}X^8K!cl>K_yu{1;-Im zHn_>cwM$kwe7k9M%B|b_PBj+BsaMAl2ViP~^vtFG#>)mCeyJt)T|wPHy#Ppu6B};2 zE5`bMZVV#RHs8}j__qr$(rb>`lGoxwD3~;VfrW+2;NGcgx7n5|lx0u*Agu=9O=qBq z$UD^?tU<#aBIi9v(Z#~_g_8UIV8p;d#52alT)?r%{! z$k-DzCz*&%4fGl#9ge1ja>G;>60A;h%BVigoy`9JEZ2o%d0qNDdpBNBeyii;&wNAu z>EcbdUKiem1b8Po6;8__@x9(iX7|c|78U07b^(&z8&Mu?&Jph=?TPysR%EtfS&KvD z{FepzeY-0aCdNH;IK5Zg&f8N9-@+xWOM3)Y58*s%Axc=38Grm-+G5$eV*H z!0ll$o`y!^NCn^ltbK+l9RCp9ozu1NO=h=@K*}Qf#{_r-OqdtF*MJ|fAj6Mk2=Xh} z6Z@R~YTs)+^*!wd%nn=tIQe*!NoVF|ndPQ)=KTtGY%AgaMrQ!s-8P-!J~e!zqJJ-F zK>B-Jc|(W1AhrCPNIKP?hT4v0T=~PyCjspw?S%}+G8&ngx^xxF1+fAKwPB}xm2&uA zZC+`qyGIP9a&I`*kbe84%l-W&kAwFEbWgabX{hPwYiT_((bC+ZB8$*q(-Jp#!Q!@ zLa?K5*y}XC^j4km{o-<_;80?5#8i-5gH46R7Z$RQ>eBZavKbp~t1VnPph0o?wa8Q2e{NT2pzpE#A){#<&^)7ss)xLkTnydT&JA7X=Y~p!( zZTa=0vYz|%`bo04J9t87Kul+F6YNA7bEkTV`R8Jx6(6UM|81qp=jx=1f z8Z!-X!0+j^h*(-v(V0?pplUEm!4MZ~xPD?BLW8zhZkCZjP7N)uOc)M5Z4G76)mrk& zUhK)VZ_DYi4ORJ94WY~uM(7$pd!x4n(_i;7-t}6?ZAm=SDwl()KHo$J?EsC^V44gM zxOqKi6wn@Flk=VeG71XS^2vH935-ubleX35dZaOu%55*U925M8Q55~9sFesVLQ5_Y zXk=E7ZpL+VWz+(OT`6oA}qmX z%X)@4($XVkzDk6Mz8B>Uspi@?%q}-#T+yH@t2jA-OQ=1w*|&IP%$nNLz>Wea6?1AAjYD*9&XvCB0T2lT+UR6;LgbEaCLIhGF7T zAq||ZOwodxQWBy}sdMN+|9&@; z#0n3YEBjU6xE7&ZYhi3;1oA(7?f*GDo9qFA6?r*5ND+I!R9D~3C3&mfS8=c5gSGDWB%t z_sV^9BC}tCD`sQFVxrW6iwQ>lE+fZ$h`;aQD2rsLa})oDIjMS3t2n6-N!W>uqr+XR z(3FKwhyP2dUS8?4YbB9SsaPQ<5mjjgdk5){kL76__(bIa&cyF+Cb~hmwv@_6$_+9W zF&M$po8Epq@^!bKA9R(={#eY<;mrk*BE}ju{Zf%T@XI+hV2L@uSB8?VwnCpYs%-YU z@@P2@=_4H0AdyRWNU@Gc0G4&s z70tW&47v@-fq{WHfPBWB^D)ehz3J|-lmNQSpN=|Lt{aNP)C7W=aG${{t{dQqD{^P} z2g$4tWe(N94buix+gfcNtbW(-{@m7lACH&nKiuByuHWIzm1$#6Nru6m!L?f5Y;U~p z{vL!1;;hxpxRjE%q#YSW@mV)8_N%!%(C4Y;=HzSHkS&nM&O7#osV&lf>qRmAt#pWf zh&P)<^M}^N3y*P(jwqa52n(9UszgFzx;g#TrDlUOk!YHahLcnh{0BkkvUW%nYQ<28 z#<=yuK3KtoJg?z)dzMKs!X^ZS%j(>4HgtV$5?3yko!6l*BsiuMX*ZuQj1#OtZmGYX z8qq`2xVUSbyrLh+zwN4&TgjA-ggq({6t@TpmvXF?w=08Vq zQs2Z6bJRC))Eh(4NH2L*R7m(#`MsY?2&TC_(@huY_07hf-Sa3k3w^i+?~?q zCLj2amMFb?*K^mq@jlt7L^y@?}Ng>f9d{}7KP0dr}#863F z5KB^^fo=`0dIh5}O6adD3!whg#~3tbZaKgZ;8Vv!TxEJIPH^1T{6)N@2(`Z$rKCdl z*uC`?<31(1x^ho0*<+;2_{~z>ccQ?AU?!0BjfK}Wd75NoD3wSJ9A z^b>ph@|;i#ipey@zVJI}dyn)zKZGkz%8CZKOV5!}d8mj1q;FIcf$)#={4o9;#R-}F z+vW~XxHgGSJzm3{{Q!qE!J-nIk?p9Mm@AHT7sU-zFH#Xs&bqM3Nv6By@Z`1U`abIZ zZT{n6KYe<6!QXT$rlJSpK5cgEv^86hwyQi%Gb$ui4Ji(d-}HuADN7+8V)9t|sPdZ5 zMSV2986R;^HjDidyQBgr=P2@bk^d5}Gv)QDvl5Nn?2eIrn>9+C;9)YIgwE}|MdM1G z6i%~N&4EX56agDA=)S!SugiV&OwABCEiqBKvbyX3$HZ<(?^c>;LS%|?s>ce`C@+_3 z!S0;;e9)_jxuvhvQkCzYyQcwBPgZLkV)s=-q$3LUKDKTYx6}zi;*KB3_i?#3m1Ma0 zn?l4CIpECinVK1Yq$gV+(qhev#NxQ_h+9+Sm|RxfD1G*QVqG)-u=ZgM;@#SLZA`h8 zQQTrshe*@`+c=1B_(#WID!ELdcA8$GM|g(jc;1U^3Ir>UyMsbUfJtdQU!mW0z2;32 z>%5olzQvw-EB9wf{rMRQR74YVl%3zcUVk7tiG#DI?Tdpk!oud*HGS3PrY(adav-hu znUnd|>K;ATnVq*Dy49Yf2CME}o03qh3Dw2)n=yMGGKmT+T~qx#%6zt6I7*USCaDmqWtTZ~7fB z1K(sO*S%$765CQC+_vNZPrOqek_gv0U%B8AHCZ!O`S|KAbx$Q^(igLop<#%V3>X46ma2GDZmKNFZui?Pi#+>=tb5%N`+Snb!4-b=^ z+a^r*!Yml5R1qL2#ZoW5QY9!eLspC3E9btqe+B>x}*@zH)v>zU(FDd4g zBR;9GBF^Et@KcX~v0W-q>X`6HM2k+)1_|pv>SISbJ}ryQO9jnUiw7l=z6oHVx&<1f zv9`+%n{iUayuTY{e=vd7)o%b3&k(>7y>RcbqoafPMZt_8=wz^27mIg0Xi4q-awr^0 zAL}E1b}4)~1_4`VQOkE-WCYa+15-G*30g!1EQAufbe@dhu+VCyax3G}*c~BuCgLwv z!5Pe5bm|J0GC?*1(x2lN=s~pVS?oGg^%7>plL=RvRl#+bNt3oQhlOvh>()U~@|j7V zX#^ULl%BXq4pIy+!Mz4aawV5+{Y~^75G#W%Yvrb6!~N2G8@x!qJbN;UnjwwN!}@QS z2gv*$E`c$S=npyB90K^7%CwnN{S=|p$MGo!3oL#yoLn3O^0~#-9Lv%3Lw%Cto0oN{ zWBG3ia(FQ8kl&r&;v4=zQ0l!xa1qjlveggFzuBuTDKZau+Z8r-8bFb^{yoR^oRH`B zFTErP0$xu@PoIv}^$2BB&&%wsUKeF6wF0;HL9>K(Y zsALn3&bN9)SKN-~$|rP8$I^H)h5U5vr`oENI$GKr6H6Nl6Q`6ttg%yvb7nT_{C0>2 z>LLQ@W-Mk|1(_sNXc1LGDZF@7r@@M&hpg09VPfO0NN@)^WoMjJbygIjyA86_OE&Q- zh+og((4z>7I^&qO;2Nzs33&F!S`ivlj1}gVB+TLtK#UFBoZ*wH8&evET|JMwp^k@Q zxy!{~M8f+ynX7Vhsef@WcT9|WQkQ_UoF zT~?>F@I`XbcjA`537SpNBa-={f?h)0)MuXnMWgIUrQUIPpCt=(u}(fLR{A6WsN->x zrZpdx238)-#x#j*T0EmW;zWPjMa*3Z>`69MPF_2eqRvdu$j~s;)TsrVGvXdDk$3iIN-#a5K72NK%FE}D7wxu ztr@3o1QUNL^{)r8h0GO2!!aA8DoL# zypH;4ov_DZBPNB3t;yrSV_(`NOD!e^M$<0$YdsE0jeM5ud@{#kBZVOQ0V?phkz^#T z=6g%NEV82c98z3kgzhA|E^IF(4+4$(iKfMGJzr0#cB(h%{Y|;c4d&&13xVR}?S-(p z+6LZkNFe;kLnYRguzCwrJTzG2LiY?zt;aQI+_MV${*RX)fX>AW5Ss7Nz0Mf z)#=euH%t`k@@U@F#RUuK0RIH~%-?2=h?v^6ZP$(>o>Bh_)$e`9evrVW7gWYPQL)f6 zT@WXX#p!B(A<5TJMjdW&o%3OpOH#-QK12_6hR=vd=%6WHW!ehL#zZnr#y(preW(p@ zJ5@KK&7PVO0TtOgmlNQk-9iLR-uLYyC}AmEL$Q-Y@`^BU+vT0#?#*Tvo|pYO@Hz8h zvU^{Va2P&v?g%H;n-Fd)ltJsZ?V0`h?d|P*v=aL%>K6DGE>MC2e!n@s4i{&-H)+a* zl1#xpk>K2(h)%zm_Ly;OphdUf{uEvAaAB$AOORWoxvO?v<{Z7`=kCB)mPX5RS4d50AYA!RuifMA%+gHl3j0m^8v5=f#(`$%NTph0fyM&MVYK zZ-o5KYFZJf>g!Sl`kq`Y`K_<>>@TFrDR~7h!wWfD9;b?MGDB6y7{4A`NtDx3*OhE92y_Bv%#qAAAdP0mmb9m3YeNy zS*1)lo82c}xE1>rnF(~`;Sp4R6+$Sm)i*ASdCtG}G)JEy4m^i^y7f&tA;On>fs&i5 zf@Yd93$|3992iE$EcJZ;`K#tA{d#8WQdfSPez+@tTBE+SR1G02Vm{MQmg%#%-h1B^ z=47+86xQq2V_yf1id5krE@g1VET8bb74&B(?#}Sh=Vz-ST0S*oVzNLd4889sBMT=- z4p~TXF~~6ciYZ9M9%}#}6Pfi;0oSTAEiTB-0 ziN_Kt(z+#Z5#YQf;_29(y6c6ZiG?_05%m&Bk$)suR+%=+DNdcBZpobdtBG$MYNP@* zSUh7&dfF*cjbQYR$ICJ|I#+P=+-4G=Y&6Ft>KZ=$jKGw!QZNE{Wo9mzGquxDPKClc zqs1Z`!Xj^q6zR$Ve*LgTTtbu2(z)wn0P@LQS`d!586EgO`M&H1Tp7dl`(eeY`kmx& zeUwxcs$q>yJzVVwf_j9k3;a~q`GcFq=G=?!!k%EH%Mf_I5@T(g%?z?Yv=X%8Tr>Ge zhJYSh{r9x$LHNuW(zP1ZeuHN0# zW9Xi!*DM-_i_j5dk&-m1#65xzIFUG9Q$27-a_WY@)16D{!&(-HQph3y+pz&GuLMdE zZothdECurgeA-PP5caj24C{1heI65wQRK{(6dpJ?-XRDjYbxc1 zF_V^8@4IbnrA9G-=8yp+Z7gXeP0qAOzv1KxLz-IRZpbe@RnU^C4J92x4mf}ZV+>G! zA<#%*Bnr~dk3S-cydq^%leMrXIb1>{(p%4o3lwwb@OswvZ@1di7RlycLW%T!*S>w{6fNGACj~KI!8aeA0Fg^+0lkMBUqYxQi0szma4t=gBD1 z&93a6rQoSoOf5ZZQPxtHK&;1pd7V+C{8(N`}HyI8qYK? z*R9nd=7(fnE~qi7J@SfN({=F-eEu`Z&s;wg#u) z3zWBk;AKrOBF%Ih{#Z$8Tz!|QW4p8{V~?E(9ws38;QE!o#)>&4Ax0sRgC=7CY+p+2 zm}0KJdAz|`*N2HZ&O8jb)^#e^HxU<&X*rtZJe@m7qTyr!(Z!6sFZ7N;(j&TBkmh|;+*q* z5hSE6u>>WhcX%$j8g`Z90yXuQp&-_{$jn;L!=)CB4Q$DOKh@O?3 zYznY`qi3VDNN>c+PFQUEGBOJ5rWuh_;|b3v!^cjr-by=K)5(wB5&g=Vha@4S82jz| z-&VFc9v6Ngh7FWBRSML#Iv%3HO?mH&bMI-48VCE5^;}0h{)T}(H#jq)7uy~Fb2xb8ibEL5X4crkSS%2@RHx{=#X6p+=6ZwR`Bu*dq}Aci=@(| zI-{YuN)UvB+GgbiOZV51UN4U&1%GZrF21Yi_6d~s3>!?L*dQ|nE1OS@QL)tLYsyUK z6Fp#u$qyo1mfXx^FNnX3+@wlv-$2wfcVY&okTLWT4m_|U4V0Do*_NG|3d*c`_H-^6 z)?zt3skgBd-Z`F+1~yxFYiVo=q|eo~P^?jZ4&uqz3>nX>He08=iwUZ(k;Z%LA%qsZ zTOCa!l2XYnhJrQ!zGb4CF~Hsg6^k}v7XsIFipWjD>N7?9dTbxxDmqx1YXzzKR*og2 z+ObRiKnfxA4;SjT|4d$8catuTw_RO7W)nkdmj@!K7!FWq73fI)$zCLa!8{rW5 z_3$GngoSLA8c{IDO}p+*^8OBzcM619d&_hqCxPULom6}~uJC%+D>1VpCCHzNBJS2u z7q^P;rjqJhj>MF(FZ{u98jGY_w6pBOc10w^$ZXPBuNr%fQ(gul`Wckq*V~VzOYs~n zHO&}e_G45Oc1k9$;;IMd&5hjDf$!|W_LPgZr)fl!4_E=2?8^k60$3&?td7)Kt_Z+j zYZDh!b>1&dZWr^Q1Z*9hL#yQ8YMg3BHYyQ^sZEbn3;#qXjEOE&n%5U3{#e7)##&)a z9`sWBSH_>cgU?IMpbIqyon;kyAYeQ#H& zu(FvDtL4hic{r4B;mYSKE$bZZSll=AC?6>aRc)lb`_8kbjG|qf4xa~wHiG9_xVu0b zxopZ&c%2@v^q`99RB~q4GW@E=B5-;=iU%BU$_Y#DV-ny+r^@f;e+?WY2|9i`Xw*tw zTDhS9@s7!nmXR`+LVB)Y5JOStiMgEoPT#_Og{T%;qDwU&cvwHAfpHi;Akv*4xHco? zw?573bRF|CyUMrQ2Yl%1bGCFX_+j04zX1ER5)>o`ngz4&%4i*-($$d>J}z# zSMesd`Zvf$KZvm2+jyn-$S3g|uKd7nIXm#GyD>YkYfCJ+${C6N7#s$N7_{_#qeN4( zQIr(hz2atFszpt}%}#3V@Pl|}HSJiDp{icdeEo|>?1XZ1zDv6A3yrFRXz92$%!Mw^ zEnFhD@w9TpZz)opPQ0YZ$&xUWl2D~1jrlB~7yXDkD1;HTOW#%YqcjF{TA@d&9;0cP zYz|Na$v7Tl9Bs7(p;S3=S-qe#HJ?2QK^l?vR8q_J!?Wk)jhJ_&6L%-xBDrxdi5ONe zdri_D_4aFbeQBjuXgh|iZB~0x-qBD$4l&kEsv)j&(z#kMUhzrvf@uGEE>u4{;cZSb z5}uQ^%Y4tznaRY?3PwbdcErqb?4cZ^$C)ibtV5>9>()=$gYK*i%nlXd)+zK_^wt8g zrunXYrV;J;)e_{evOjALuN5VZ56SPS?tzi{00kL zaxsuA2j0x#PvFAMJn5H4d9O6lf#pl;vWbs*A)R=IBu0FjQzVsf2afS?(}>7{H_o>6 zc{!prKP)X3Cxt)Jtt144;vz73?Mm&%rSf3uWUtas%xmVX zYHlT{>g;D~-N3=04^!zFrsJ`VSHo3bWQ%)%#iT_8^cp;%B zA#=OQAB&)lxl)#b%v|1PpoIxpK&RC(MB$Zv2zj`u8 zhW_EI3Xb=6O9(npIB0{Up&>?4+&x`e75#)A_U3xxx@0KWM~)v-gXw<#1+hPRk|#YW zHK>Ij`?RtKjMB*IO`6s1&4GGHHd(lMF78Fuc_kBk$LS|bTP~Im(l;=T)GhcvD1MpS zH81bc`>1Y;ug^t5fNwB1y^$OI87pum_kKLFlhxZ zhgFh|iwn6iDW=jn5V2g3-3G#_mhHQ}W^fAclnbv#^flVmt+`_85P+GDC^0S|?oD2tPsL!^?&FMRdXR_{~gs0^iM_VdiZ>RFcaN zki_4Hi4TG{E;645U}NWp9m6N8-SN!zrga*j^S7X%1@fseH%(}Qf6@8UQ9EvWnR8a{ zw%abox`6>R3{OU^vL7A#Z#wfb`$c>>4O3RaoM6tEhQUF3ydk$?5{mNn4Ne+)B+;z- zg`9(0EB+3DCZnyUlvr^(wYG-P5yG3Ki+#;_twG!>0rIK8W@!c`(ZR*Jx}^E7=Z^zs zl)|X_(^Pvxn3^e!J*oKbReK_1q@H&b|E8wBEq5%AO}C4-Ym_Y9o*I|46+a}td|3*a zrzl=7X64h_{`m#b{^WFPLl+yhLw%F++4-y-5orJCOtbF0*|@ZDmQ>uQ`|;&sOFk;9 zH(%40*Iv=(_G#IxY=Yx7207^vX|U)}V$v@5Ljfuw?ySv^5khi^)`$VkHVWHOmJXZ# zz60aUBj(hh8vYlj5X^%l>lHBT6Fhv&oQvV_u9A;|reJ402eayWsmBmfF~#rhKTL8I*R96kW+5h~~>A|~#u zF(00=YwYII)N@2=uw4#;i9-r*jVFe|CIX~pUq90hb%CpVW`+Q>tJjcq;UbYu=xVxX z2-6Ct-&#@AS*7ydVNg{tlCakH-S*eO3{D&{KQ_Aj5&ls(F1>En)WRyVE^u$-YX(A1e&8=vTN9N}hmXc;4=M*@S}6>P#i(=&G5Y7yKiH^9x=2TG%$- zWp2s8piiH1M8NI444edvmWt|qxwiR}DK+M0UW$xldY5W*W@B+HKjxH8lTa<9opm@j zVK6|MIeZvuwdM*{*((}jtjvelywmgEOkJ*sAN6_SOJ`=YeA9=zir=t~gz5%Gg5Gsu zD@_cAi_D5iKabpt%yyt@7w2vw*^i{9a%#bI;jlp*Tmxqy<+L1S&&Li#k7@dcW$uR` z+6IG-<*I#Gs-v^lnrHDdv0JVx4EQC_Ndwde~Xes^nw?Ffj z9q;b$Cg$hewfeWBqN0p|UjHD(T-yYgOya$N&kNkf_wQkDHQ#J^$I=Pb_@Q;vG5fXP ze@#=dz7F5}v(abolXKz_p!27E!TWp){D{T04;dr^OxQLyNHcu5p80c3GrSIqdA6h2 zzs;XCZKIYMc6L}U1EP(>y@n6HhEd*aKp?yg>vPPZ_^$!R2Atzqpo{qS)N|bX45mJd zhlj_rCeF7Do6%XOIfjf}Q-XKBo!HlW%Ig;z?G077XV%wafo6Kv^a0`I-nqp>kJe(SgMz`j^$>ep>@Aba)t^*JExM^mY(9=zJ>ZtCE07S{LHNUWcTkgx|**`D}G+@ECB zGV&krAPBjf6Q&{w2YU7Dl^+?7P0+~oZ%No&&iT-N>peJyrOszolIerO%$R9K;m5Db zC@3h#;~9brHRebF2o4Uk(Bw!F#j4ffa)9CgBoV{U!4V{UUn?x$xC}1cIke*bwD1|2 zeC>rzzk0#i4eR^CzBYNBPXJ+{ouTgle1*~PZ!XDZsPF@sUB|73o;S3f4FCGDw9*8C z+uTgX`e9uW0JjH-XVt#OGxJf6tNrj zPrLRGfXXxRY}$W~Z&;FXSn&j`Y^tm#$r%hg2sI5nsQ^2NYpV9LmQ^O$sfB-y8Z>{> z`Ru3XG6{x#Dv;4)jd|04PUM*)po4-bbQ1NR{Ve^|=QY3E@y~BmvQ>7gd@FwUP$_dL zs`OzN?5uN4&CiDdvas7g|DoU=+j=}f^6B8{Alo{CBHJ7WkReH@nZ8$xf+yie^Og1- zn>=aTa6f}_4Z=?SpYJh=k0g{D29K2gw@9KqCX}v9|NGAP8%8z^7WD6nW$-`X$iL-G zGW&n7l2nfE-|*!n*)|{x+r4O+8U6I+$DrTBaj?ktUAxmyFhON-JO>=vb^jWTxCh3{ za0lElcmQac<0$9+M*X}2e+-3?0I-$me9i(%dLC{svJ<*sqO`w#A&fAcdH~RfHeDd! z9fAGf48X&3ELvQjtZKD;aROV2#d%k*OuP2g{q?Coe<7?=Re>eY)D!$t7 zs=p0fy;$M&FW{_2Gy5LM!Ui-jstrjjUG%WTE)XW?E95KAfzL#=mMU{0NLT%DN4$i= z7QF#Q&*09ZmWGSH@kU^s_Z$gle>?OOxi9oa;&OL1T8D7Tifweb#u|V>C({G## zV{>WHnH&0E&NkYgNr?y*S$}`njcfL;qE{D&UIq>fKDP&tNn# zt@3&x(7s)M02J}liSY2Ma&vR-PhXfh;ZYZ%iPN zuJBs7;nOc*yLCZyAZ1$BaNXVA{f=hw{Q$j4btF@m1PPa^=Ww>P8bIKJekL;NPC(t_ zo0)a$-dJXM?tWywhD{&M%qWxBffEda@3M4mZW@mO^Iibb?cL4w|IX)r%l!iHKP}b0 zb>1EM#k-dlNMPTFVc&Kx>0w_oehm;_ctP_~I7thF0zfeU1MdL}sVK{Oj=k6mt?tYQ zKIgrSj(Je&?L{Gwckf(E`Au2eiW$ z1sp06i~EV*1ArR6cf_ClUF~w9B5<=2$g`K`Tm_kD0_cgEzwXzc{o2mDkbrb03gjF> zzCPX;$W@VXadF!mTZ4hS6E3y~?QwA!z$-MKoeZ)76b&Mi5%~Rs<`xi2`+($jHuRx# z19o6xSTkS&u)wVOdyuGKusZUg&;H@nnDDa?C}~1afQ@a+18u^ahF<;x0hqG>rrA(BB@=A1hkq~&$58Nl!43xO5|DCw z>N&jF9Zd}dP?6i;H4T0NzfsZXog^0WAAl>s^6GezHX^4#{}>2c-5VPl!17g_0#AiE zvxblApVm8w0QBX)3*SPmrD6>bh5>Ixk9lB+SM~qRE1^GLYroIqc@5h=c6|A)%90MCnEG1HTP(*^)4_Tc~;g4-XI11-`hFGYcTJ z>5zxzP0%-pfcmbtic{Mv&%azOv9%dW(%|dsd-dxzNgZ?h-*4@}K=T;bNtp8$#X~Kw zN5{ZZ#&HZ0|1p~Xjd-g`FCxG9)u(%)%Fu2U+l>Q5{Z;@Te-FSOmjIYFPzAW8 zNeMb$L6w1Zr#;3#-=IOt>j8!JAL+c#1-{4C{l^#M!uG;{ zv(XlTOId(Lb3#)fXJL+($Kxo8KB0ieLy|92S``mJ5Chtw{v(3a5BlA66t z|Bm*DKf_RQ&l>*eTHr0@)b}+ z6g~oeQ=b~`*NNBsfkNf@^!e#@d0K&gG{b3#?h59n2L(Q7%yt-BEG$Ohh>VY4&Kug7 zyW*SzYI**4fFBIx{_gJh&(1IuC|;o4G-@){t^ z*VbB&Hvq_u+Eu%2+lHk09=85Es71?jo_hXYF;NM5Ef<%RwQNaHTbA{bz literal 0 HcmV?d00001 diff --git a/ht301_hacklib.py b/ht301_hacklib.py index 4296376..4c37a13 100755 --- a/ht301_hacklib.py +++ b/ht301_hacklib.py @@ -71,6 +71,7 @@ def __init__(self, video_dev:cv2.VideoCapture|None=None, camera_raw = False, fix self.camera_raw = camera_raw self.height = int(self.cap.get(cv2.CAP_PROP_FRAME_HEIGHT))-ROWS_SPECIAL_DATA self.width = int(self.cap.get(cv2.CAP_PROP_FRAME_WIDTH)) + self.frame_rate = self.cap.get(cv2.CAP_PROP_FPS) self.userOffset = fixed_offset @@ -255,6 +256,7 @@ def info(self) -> Tuple[dict, np.ndarray]: # read raw data from cam, seperate visible frame from metadata def read(self, raw = False) -> Tuple[bool, np.ndarray]: + """Retunrs a raw frame from the camera""" ret, frame_raw = self.cap.read() self.frame_raw_u16: np.ndarray = frame_raw.view(np.uint16).ravel() frame_visible = self.frame_raw_u16[:self.fourLinePara].copy().reshape(self.height, self.width) @@ -276,11 +278,15 @@ def read(self, raw = False) -> Tuple[bool, np.ndarray]: return ret, frame_visible def get_frame(self) -> np.ndarray: + """Returns a frame with temperature values""" ret, frame = self.read() info, lut = self.info() lut_frame = lut[frame] return lut_frame - + + def convert_to_frame(self, frame_raw: np.ndarray, lut: np.ndarray) -> np.ndarray: + """Converts a raw frame to a frame with temperature values""" + return lut[frame_raw] def set_correction(self, correction: float) -> None: self.sendFloatCommand(position=SET_CORRECTION, value=correction) diff --git a/p.png b/p.png deleted file mode 100644 index bf8b62dcccb56cd5efa7dabf4317b42c25f6eea7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 151049 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 z zunfqUqb0@JB7rC(alzhz<5e$eJ&LE^grV~g;Wi~#La~(yCo%wBLjaUbA4U~e+O9TH zm@D3i6bH(g%O=2=&j=w@KE$WR5Rl+O6?zjIx|6ht5OTotR2}|u#(oYl@CqLUWMk}Y z6i74d;o@!x2$+I7=%z;qp|g>(@ebHvE=*y)l8O4~KjZ{#+dQF0s*pbXcScS!nPAyK z7Db$!kQpQZ8?2^B6uk-;oC~D@qhVXl`8~FM&<@yKD*+M+w5UREEX{!pd4E!*DOZs; zftxDCdIe@URTFsh_@K0jrU~HH80Om&b^%G3=yE(Km&^?U8x_sw=|O%UTerc)Hp{r! zSyKw#T;zxN9%~4dO7HOe&|YK!ienvc&9k8nErS3SOgSUs_JLRTVp)9SM>uoE#oCbGGFpca;b6+e3Q3bxZIF ztdI2fYiIyQ)hl8WWFHRXfs)ICo@v&d#x{ShAo$DB93>4wzQ*WeW5kir|0 z+(E`xM8aKUY|4GIjcN1Cc&n*Gs08o@d~HLaZH%k8u)q^Qiz4rRuZ1g+HVLpXK_Uku z{+k3nFA0k^j#kna(xuhNYJG=)30?fCT-h2*jPV0ycztzX>6kqg5B^#OkML%Mz#54~ z8A&?j42AgYOsgq~$-c#*aNG6b_Sm+Ay4g<(dhki5~bj#kT6`HRu^0=!Z12~L&zR6?fw$t-w<#ixF-kMki>!7 zAf#J0`j~#C16Y4v;Waiq4SWxV+x8l2hX;Br`;lSlG10Gtdk_9Dm;Htb&Cb_H`1{^h zDR0K%s&X#^2$-pDgb;)L2rem3>%ajFNp1(HC;XBN}_3}ah(i$xFGPf@hp7&h;%3&k=cYR65{X6dYx>))-tfVoS!0|koXVm*;FtvPNgqVeLcKzI_$uRj*2eA z06P~;v%yoe`5NGDYN2nKY;oA%2`-7C-I6#@T50GFP+k|Ktd)dbO-q+f?{u~cwJdqfUM~ z)|F_PfNa5L=rabEL&}cGz=YlnwZYVd~P+)a6nWDnA^_J=LsT;J@?Fg%3I3n;$OlofU zxVv=Vz&Zw?n_EHtFPG~dE>5wJ1 zz(Exx#P2vyT@ntfSJo}9qpdlZyp$6OS1iqL6J?3ktHd0a$JEwDI~WLEOPZ#y{078x z9$su8qum_Z<_!i=3IR;>4W_Wg*FX!fXrrM>gV#dKO~!G#V0N?m4pj;3ZiI)Bo}mrN z=I;Eu*-l>0J!HI7S6bUGJ96h(l^vO zKpCM&jj%SLq?pt)TUCvL)E;k|vXP9cb9c6FO1^hRFZKmQasM<2p{AEH_D;wy2moTwOK-1J%OCdpzguYjtUI*RJ1sk&18?f z{~>f|L6ezwjj+y}0cgU8#Jw?+EJRCe^KJ`h^%-pHfPV;>wh2sccM3Klh@~|~{x8zP z71R3x#0z9$UYr$K5$Kr9`vC(el4*7_6fYLZYU!K{Y9W?31ttijvzV`>lrRbz_kd9NK9nEecrz-_vyjtm@cpfb zV(2HM!0H}^H;Xf8NJXc@^f>0T*b;}s0Q6Q#m$)Z}2?^CRDTTS1(li3zc_hz8%3kkqGRz4EL$sFFTLm&|6s zNU?6-KVot>RqhJk@!6qfNNc<=Y_>>voCjLLvn>r{iWcdqh32I(pfrWZ_+V7t4dL&T zN+Sv_Vp~n$3kN+9XZ;&6Jie%X+i0Dk41SS*_t))U!}##fkYH-P=if{T$OzQ z%)+(B_Q=Ir{OJP1F=GtIal!ba$oy+s?dNH6yIWt`J5i^>8u%9x#`Mhcq=`%M3qyQ2 z%62FR5X@2n>3ib7W$3xLOcZubm^N1eWLS^^jl&K1z!MZ?tP`&#J~cN?l)azBlbJLFc&aBlA-4Az_X zlf!6(rx;k(^hpN5o;fLLjLI|2n-kQso7J3iG9r`VoeOP-cNkk=44zNA{gm_H2JT&1 zUmwjVY|b#cTDRy*=oZqML~N9Lk?S4_8tNFnc56csd#p{A!LMP-Uh%07afyRWxf;*{ z)@JPC>H^q}uBEep``7q^V1QV{Am-1dVHxlViWZaA@4(|Mp@3m!{E2vXhtY+P zoZ$3GS?!}O3H;uUHq6Y(mLqU|0btBkV;gNN!r~#Sau5K=*vdUis(pdga`pgLhW|jx zArl8SeH||b^vz{ogd-U=(Xv1^aDcDR3PcVQi{wGvFI&JvBpI0IV)P{!*`UDROiVTk zO)s(S2%c_@1G4efKhtViZ3o$IL-cCTg=XXALoKK~fwGl|E>NGFIbk2ML|2E=TGZc0gbhoYf5TPT}4_URjs2aAne z>Y~|Y%i>g|n%-u77aTwjvEA0|0(x7Yhr!m1Am(RLEHWc~JS5W8D&|FPQvkAH14W?} z`l!gPGp@QsrCOL9=O?J(HHJ5d**!%7kflXD0EqodHPR>OupvTTPb-%Ppcfq>yHjx` zz7s0_m1Lp~P#!k7xRc<7$pnOXz+i?~5C(MO7x`2UlK``57H(P}8NQD_M*04FRQ3lW z?U0{)hXopwE^^(FnH zyX9*a*Y31k0ewQrHeoLD-tAyTSiEO~a}AX!UlvkfWi%pj)&59!ZZoXzI_^AuY4;81 z&2#kbmERFP)6cXul#ETK>htK%x=75wr&a!uR+Z#>0nmE1$kv$Sq zs#y5cKjDwoQl?_=Z9lH4#dEHD-08N3t1*Ca(Zrl;Xjx?c5LuhJ%Ib@ckF0WxY*4ry zqdJZkAF(k{&=PVDVmSizMCBkYEr5G!b8?09`4IF0M+kzLmjWO^Oz~N$$>;;J=AX6K zgOkIZZpC51V?#YoHgmEW9Z}0xZHtgkV>}z*SK)id8-mT{#IC~b&DU>YYmzo~I-F2mN)9yD>p@T1;fql8KSW3!)(#*tXH zeF&I01id|sJ~5-O1ALfePf!)7+8LzwfqASdrn^X>79*nII}1YO1J)q+21Z(7A`neW zFKrdU2;aS>#nrJNg0V++=#sGHcQ!M~^BAEVF@{rM&t~Qd+u5U|`@Dh5^GS=+t%f4} zi)CPX*A4jxETa-2INkS#YreJ0mulBYYFNp|=5>)GCdQ)pwm|jBL=u(!u*jzj;#n7i znD%_bngT*4w?~EZQkokTPM^#80X#GC#0!zy<kzP=;G-iTOI=@89_%d#Ekp}*wX)*St6qm6@66m6w#i?*#M1Q6z(D`%Nq zL4c^_y{0yhlCOgGyBJ%RYwcDoH4JWH!j-r@?6S;uJy>ua9<6G>{{T}fYx5L#|G~}y z35`fVIQdCBjIeh|x z5FjEcmAg3ZB(}-{p%Rd8h#V8VJKrEgHzLRF*ft`O=CnWF3u`=t8lg(@^$yXWJ!X_D z3P?3T;|0LgA{T+j1~$}-n{YWlem|-VGskYiEERxj z_AEj?cBca#=tyk_f=6Ujj~#!~+h1;S9Fn#;u(P$cBHz;%9ezBg~~%np?C%DBEN~ z5wlLE4wKoI#ncOfFUC^KX6mzp<`&&~3chfQy#2&Zj5Zqr!#ec>KTA83YZ0P-!ougx zki>>JEj5pnK3~a--4s8q!@tBZG_*8$5#vlsh_uKX#hFXpG{0*guwG~DAA-%Pjk3a~ zYl6ZtpMWsfp>O1hZe|#f2N?PR$|}HG6wM%eR+8wNa)2I;1-3YVW z%|(-K*K%n~N5?^Uk>dtvR;-U4Lj3##209M)-a$EH1iuwgJ{DU%%Z)rpD4YVs3Y{vtl6%|dCVRDCZ( zs9p4J8fiGPIcoyMlBsWAD2gj42SSdHr0He1=drS%Y+8qF-T#B{Kcd_$qe9Kv2O+Q5 zWi16K*|lsQ?Ww8JYXW?@4GLUJH=`bD$J0)fWz{qAF-d6-)k0~OguJhh7#K|478Oh* zH8Q!2I~xfYSks$jf?%n~$ z?@d^I@U(nvS8BCn2YhK;VM&(=AdA7uaW!ra3o&d!5r@t<)D@UtTzeZVi!!VM-OH$ z689Oxp4@^vs8p?vzO!}(w{8(2X)pjcW#$vNhr-$ujScqLqQ?0J|DsV@Yd2pT!CyxV z?27$T(7-@i!df$fpI^gF4;t%Sh75JW>Pkg8$_|=a2)!lZK0ILy0)koW3@z#Q>ve87 zdCrKcl5_}RH#azPF7#QEZD-!-@D*fMw+=~dixWnF%c&b>AS4hDqxmIAu3{MXLy+F` z+Y?(qY)m&M7iY?d%o&dYS$^plEIt%Omh~pxL6Rc3W!O4w8v^(9$gnK~l-FE|^S+i9 z;T3cXQy?!N6Hl&bbb`QKqy!)CWdNOH1QUzUehTo7RD`&^+B!7%4mnSr9v&eLn~sZ% z_K6%tzFzI|YTPj{DRS2Y`9u*#z}E*)B_P_OX%0&WU^kB(n7<;qeye6j3KG49?jPvg z4No-b+gasG9e+6xIsGzyn4FNP`;Zp}ut3AXaODzs=Na=u7v^5ZJiNwCW#EDD7L2D9 zdDT-*HmksE=p1gXBE`|3W@{SCM>DpH%-@mNc$ouSQGuK0lJkqwFDb;?t_oaWU`G|& z-WIK)MfM-@sS(&uSqKna_vPTr#^kGMDY=q_Fo5%;h-%vFYosWG)L?7kji|#c*o4s% zz4SwcXlK2T0=K7!B>^+WY_F-gsQ|GMTk#&_b#C#n(*Bi>n1&;`vJ8dHuS1 zw@6N07qhx)q?L(MiGLoy&S-V0$^W+(KyVKrhvdr7yOXd*Da-firXZ>g8R)xM3|Scb zlywI!)QbhcI^bv-_!w*qSZtj^Xx)z%XRi*~!1Za)RzLjI2!_7Pn8enfV%3~TK2T*P zb68+`o8OHPDsdN^Ys1TQiJ9#zQCA6@qZk>O*LvGjCITi0y^U6PK?m;p=ln-C^>b-< zKWoABf)slu5^NV=p|=O#q-rkP(}ZHd_-TN9~`U zj7sTkE>Xh?UJ%N5Wj;35Gi%OINZTa%FqSOO695I6byh$+oo%WE_FPi`Py=|a^_V(4 zVgz^_v5Yp$eSodM|7xYV|DIO2sn9pVbw}tiC&m$P1BC+Ixr0{I3P(cIGiX#h)*%mc zaJHD+#@2Cc^dQWn?`MTOr$f>&z;N{7SbC&|Z#6bRi(q0})J8c8dMiQllnIVZM=H>vBYJ`?D zcagupgB`L~31=cwpCCef9cYdaxYSp+@IN+#lMGqv=k{%Kn(1+S#3vKSyhj4`;}s7~ zklXz2C43OR0G-4zKI5F^s52VJ^>4BbI%)z;@shZN#daBxBu}u2rc#u0h8@_jl(3$h zWCMIe@Ajy*#(4nl5NG7fi7LtZG?(^;93UG2$`4h{ROF_GdC?pnA6zq>99~9^0X?74 zK9q1wO}7TNNDHv%Ygs^K%%AYthp~pYKzt#wdT%O$(KLKF#JrI#kE-$j((ajGLIgWQ zN9~m>y%0y@#BM^xwey9c#xF>+e?|^Wivw_3^N6<&qRYMRi!C{%{0`7)Re{ccKaPID zxF~U#k>T^ZY6coRDLwR=JI=Ri=nUqwT%xj}u|Ik*V05Hu<+lv+Lw)=bE}w`GYK!3I z4!01W8Y46*9{w*apBXm`uYGQi^o#?~0yelxY@PCFq;=qjR4hY2oP zPFO8qm#GGlNer(*oRcF#4G|OAD^zCr$2sz=P}tq!+6)lJhE_XzQ!LB${idvVC<9}8 znb^%it;5$=#%7Z;RO-8TP#@Q+v7UqLl_lD!yP=q&-hm6Z5WSUeOL5Z^Me190m%Xz*Bi+1rtL2MOuO^ zgyeun7>TUkCgS8wSZN^s&EVr&V0Xx~-l0EFhvm;isWv*wTxRWaS-g!Fvsi)?30(so zO#(uo@hu}kFT54C;(_=HVF8J({qPN=u<0Y6*;H8N0V3@?2dswt=vGqYUIjgf8`uVC zG4zfC?oWglqXE#w93EO6+5eQmN*!j`iNUptF`bph%BK&(`f?t*;%!*DAoydeBLxTB z`p6hE(0j@o%TvzD$=89=+sqFOG>444DoQsJ5kLW*0Z>k5VbCDt<2$a%I$VOJmz+eD zI)Q%HlpN+s2=N=yk~(PQC=A-g0%r$Xy#!%?UU}bsh${wP5l*+4rO7iDon03gVW2;f z#5hSWQA?&SjC3I^7x8*I7{z$#iufT(=7M-QC$~4a2kTN)Y3brA+@wIYhj{xZ)eeC4>kz zh6)Q_U>3fb}riO)wXg6=S$C9f^_`%vV z#5v#!S1D+;kP^QQEG=M0Ie5!jw&6I@W1z~w%qE3K*{usp$#%7g{Dh-lY`_MhI|?iG;66P*fL2Xo*MaN zel#mkW_WJ5#w8<5Z&xDcz7s16heH~jiqrOEhZhM=c$tdh)9(NgC)LXMdfQAAwz2JZEsa3DqLsg;{VRP$D!=;#fO?DwWVc5M#I zfzOsC$q|7g+nntdWzTT;*LF+;$WOsZ%Z`&9W;Rkze0Kr9E|G8{5`m_XI{5**NI@hYh z`5Bu;wnWtgBz~3_bxHoTts8qjgTrn+qFuR1z^K_cVLX=!BV=Qo7#xxXR4w(XJGib# z&jz|w6g-XB%u6WeDOMl`_RJ_?_!R!7&p@CE;*Q}exPKz5qlkR@E-A9AJ+c*X;SIMM zPe%5T@a3|glMmF6Ht+XFmKmlnP#iN`JcK`1`3m6y;1DP5zaaQfK|Zl;ZIb;)pzug= z)e2MpOKD!X)1Eh6b%j%TV-yR?khJA84218y&~JG~nSq($!u>HruJ~?{d!<30AECu;B@@yzZER#K} zY(>(X)CcwsDg;~5+OGnIKD$)OT^?Tt4j*_Sb|(FlwhYCOi@KFP-A$fD5A zB>2k&{zu|uUJysu2$dZnV!Nre7(e#|P^ZCt%E%spW862G9@kw&5!sT)v5QlUTnVKl zwE@ZjTMRJs7+`H3rOObjEFM1Kvs>_2RtIGWDX#MKXhJR>50gte#4QjXgtBF_+XB<) zw4wa_zTD4w49E$`(|+DEydMXEb(vPlX71I~qi5!mLdkE2)Zx z2C+pMVAE|3HqA!DBJv7*msuV1EJdx$@_3@V8JS&yw*MNLs_1^$a^+M_RVGL#m#(_< zvxqD>O-|BMALE{~=vtcGe@!cJA+6tl%j^(GaIKW=SY9Wi! zee}b-Rz#wKp9?gU^$ea40%Krq|NPQ8tb+z4@OqH4US`$>)9fswGo4>^ysIUT7GZ?V zqxfrs=yzu!Ti;Y}OpUOCzegiJAEu^44Z4=X+4h9`0(||zZY{lbHrC*v_93A2PL6Tn z1HeR8%;oJ=!(&SY+(d+|=DJUc-SgNa2chM&`i^QnWha=s99+YtW8sKlAU+8ROV9D9 zL?o80A8kT#_KZt^45L5C8Yow{jSf;*hczgozJwHhLM*vDc1BHa2MjK6dP}>Sk@`fr z2!T$xwG)o*wBQgDsZ5sGnPj@Y`@GxfmPdMR!?8ZaXI*8#x-HXN2V8{?#NlKhTh%%kCvnk!@pErTK%7ll=qz3lA!6~(7!_#&n;z04Tu9Y;6qmT|9;M5? zkfDfOv^cE~JFwj&S5DRqucSpG8~16Ch*m5ef@^Xc%wYrWV+$U|!y0`oMAmwB+p<}G z&!*~8xW{eDtBJs;hjt>>dhS4h6yWkm)Q!86@wToY7Q#T$W){qpjeT zf?M5X1ADqOzMXKbrG^=-ams;X4(?9uJ+0U~V{{p%W3bp0J^-_sQ4Kb-@ggQ_8`hW_ ztdBatdMl&VL5k+j!J0+UPt5F$=IPD|1NeF_$@6LU6TnBmpr3Y`^FIbbyVPS`P8XVP zE*~HzX!I`8)+M9>&?QJNH;lpoE=7Swu7pMK@pb1+h+EKnLmH`09J?WQxfE-wr@tu` z4FljXsE+qJtQ7_EL^+Jq@2=13?!?;mYerB87 zC63t~Qw*!Rx;Hp%vH=|P#LT=(8m_o8Sfh_T0(6A_ZaKo|3}ADN{~5_+ShskspftBLX5G`}j0aB-RT9wa zF!MHy{>)7xA+H+gfJK6#cHDhb?hhp>IR?ZN82mmll1sO!6F$Z9*t0%T<$IRFe=DO8L`g8>ivq{0hKx%kwC?C&- zg76smAz@8OP#ME9`s15~oRgnlu;bNe?UVWzF!3jCeUk3_L3JhUrj4;=w1IO1xZeYr z`Lr0A53f&*g|iP#tp7}_Sz#ZP)zG#0yHtArUnnzrMx+JNLJcyUYf^XnddC3h@HqMC zxDX+|Q66z%od27M_CvbgS3U&arQB#Vm;qO2kalcvf9qQ_;+!v}54kbnf?R7?U{{>H zGr1x!K@OJ@x-3U3Zku>T@51XJ9Z5I{_YX5#?6yI6P<1;=v?hS=7kS28luF<-BHSr_ z9hqm9tig^CWNIc3g@Af#TZTasoXIvLGjw8LIqfn}iJ=~_F^a_a50+eK^0aBwCc=!& ziH>;FY6|HKh;baVP(FOZj0$Ao&_aR%Pm*?34LEUL&>w>3J%;C_j+4RF*4cQaeqj@2vckQkz2;Vfs$W zEm(>SNHP`r2P4Y+1K)40kbla*< zrrfqvt;{H z(5SV<7S}+AfSFhk#NMWu+oxHP>XHOuvOL#KfNLe0B#1k z+?-F(oy{rK>#U9mU(mIH>z1fZ#lmQJD%Fs4D2qM!m4uD6z9Yco#*r%m1KwEth@pPn zP5|WxQQ_VvK;j}7mB*)2f@Nq+ncg?Z%QJ#7V9If-EAE{$J?$~87E3b_9*i{`uM9Rn zfG{j2`!2&?`FNBz;R`@D<&;SJKJ%lvy17F{Abigx;Q(G4$$;_$4tI1Ov7S>HT#B9m z2xt$@-^NTF)#lLX%VXhiVZ_fDylVl6ckQmOir(&_fDR+ai%f)*>{Wfi%_4)>(R*)# zvr+_-?=p<}V$_CORtLIGBnP5px)^fnM`uCr9!#GcSb@P%5qgInF2||Oa8D_UT_g}U z^|`{`2+k|&-GE1;e}F&E>MHN*6i9f+(PK(kO#4HWl_SAQ<4_Qm-6YAdw+_&3^Bst@2Z-+mu(TF1U znWHc*Z>E7lZ;LTY5IjKkptNe6p_^pnJz}`~FfJ}E4XqA+f(HkhJ!;XJ05gkFYc-)! zpQeFrZ&J3Fp;b>gBz~~Q4O4`yk9j{eAKG<1bSp_(?X-zyukZ8=dK+Ak&2Y{Crd6;B zi%YbmShvMELWrPR9w2NGInDlCU3I}gIE5OZ5CC)8r~NGx)gd@@qaAl9K;Vq9 zF)Z>(Py8Dfm3SYB_7TXVB98I#6@}r{jI2#>@XG24(=Bp_>@wPuz?2dshG;>$cz{Jd zp59E^M3%rAd3Xyl7%zg|7v3j!)HDfSazZXjjB;8Z*Ykjk-ZJ}^R!gU+$EqPq3bBN+OlAmcs=l{>j(%Z(c?Wc>nZHrC7)Gx(ChY>r}dXp|yX zEHS~Qqit(aw!A(Yg+nj@;+5@}$j4sSNg@lmtQ#8r&06I>E-e&5&rVMgxa4;rf zF2OPkKzR+kR%;FY&Gh%!s>in8Ud)UJp7)~{wr$#%qGXuWEl``f#C{p4P>k7$*i_TPqIj60nYpqa;B!ZP-YA*dG9rcj4 z>DgE~7-UOMS2e@d*>oOi3>-9L^wkM&hK_OR0J4;=2yQ8qxhYPD^BY|9qOH-j{z+go zlnmq;u)f`KkXUh>nETpL_JI*=j7$)~21x@QtL=FO9YULxL;*M8B=j!jotr&i zzV=bH9E~U7+m8{e7!Ky1 z$VD^B$Zl!Gg}uo_5BVU2b!aNmc{_4WN#kT^EUv*y7maX-O2*i4l;UY1#b?>YKq2Up)s}=xZXTQs*`HAi zU}snyaI=+_Qk5W~o3)ISvz_f;wopcRh%5FfpaAoSTH8~hV5;4)hXS7G$BQf*H#TA6O7 zcTjy0ZN}Z!P8m01v~yGzvH)lXnf!vw-ioEkaiLQVNhS8gz#DNg!4Bl#aB<%tKA)j| zFKtX7#l^Ld_blm>Km^iIF$3@DP`fl2^f6$vy9XOVlOwb;nnzvUCGx}YkT<)+b6gA~ za=q`(KI9kbHd+wKXzF7+iSo*Oreh}=w`mhdjKfGS%L@t_`oR+0C|HMLrtS)O7xwv0|0;~=36Sz zqTyPETsfvNoT*g<2}akzU}c{$@Cw&e8;`xUw#B?;z^>6<-DM8c7e1i340xs307wKd z+)AHaI$jkGk4u35IhndAEb}Cp2TU8cz3f{ZLm1#BfWjpS zdY`qQkE+hn^NK_9u%Kb0#dYGwf$T2A*Rv6eO=InYfp$qUv$jv7g8KNcR+?MI$;UbK zG$!d6Lm;IvjcW^^#Pi-d6_hVQnOxV+x|kAAFIS9W=>Mek z*y3xD6TM3*X5y*E^&PFtnLQjNj}?LrSR_KDL!Tz)!x-mrHlCn!>_oLxc*rk3tgT7W z?3Lj7xT&Ck2$&EI!c{gaLH$~>wxLCj1V%9z#57!>P@j-LNjuoY)oTv;EOH|g$L6yc zF!4~x9_|j=U0Jfwge=x^>!qx{21TWIGSWPShoO$|MhjmarUV38vb99ng6zrWrN1W{ zD;T}skvVU#nda6$^MlKmDr11VtGttgB^z4fisQJ`(gA=#aLGr2(5DJ_o94@+cpzMl z8AusfTgP$n2SEXi%#8rd%|)Nk4a-BSm+Tvd*~du`o?&G$G6CF+)cTZnTH-#54O4z- zAiDoH?%7j;08LWQ;^45I_Lz0*W~{^dWnT4Cv>IJI#8SYNf8)7!Zn(jvdk(;byBWQ^ zK3r}aDSSb*3TJQx{V{NvUGf{E#t^=ZRg-Ahzo!*`ofe{r%NO`%Ew}L&+0c8hfYH9F z9NrHJj+Mv60xLhnNzOu7 zb@074+&ZI|dJCrXS<_sUaB88?+)Z`B*f6|t)$T~ji`A)G^3zDFA6SFh`Tfuo2hhFe zYj1F;&j>1DyxlbMvfk`r^FvK7P{j1%KDl#gi!P;Z!{78YGX@c1z}HJ`ZeN}hR%*JVAslh4tU@IJD)v0fgK%7PsliB_9yO~XQ1j&kA> z*~dZHXJQ>=LuBCS4!dxBncQ*@i#dLK$a0TQI-0;WBQqKkwF>B;8%=QXb8qQ58|NfG z`$Qyf)`RXhArB7-p+SP}79W8?iR7)!y*SQxcYtL$WC@2A=Hccn#!&{SxHt)3 zXPno~10Kmmk40CZsctqBusbq_3$2b+K9nX;U6;%{S}tpAj4(eu4UO@sv515^(jiwo zp{!DbK&6M6^0RU$rmJs7MB^E`0`l0m1L%v=gqa5^Jc+}&BIKtyJQ0cuz!5E70%wa1 zKV)R)_29*K<1v6^0aIZDTdi`QQ{`~?a#vS#H0($Pp*H;9;c<*l0a+Ntc{z*#S&ohY zUs31$EiGF$eUJ?~+$Z^cMHhdc?Yl1qERc-Hm8xZLZ zd)i_uYp$CdW_XAdD=m#J0DJ-}a$Gnqd{1_t}25r<}lCnZy@K+nTRWiMg zJ{M2v;kh8fi~01jXYW4yzBv9NLfPYch-03t2IE4m)>s!DJSmSIAmSU(5#mgbUqJIp zLsur)8ujsduyVgC{&1v4pBGfyE+=73xK2)z4!5q$XzL)p2i~G*(w7PP9XTd1yvS)g zB2FrqEs47Ih5;aOpA0Yp-^a|w6b6p@1MtrCvm$kpl}#TmXEw4E930%3s*n?ZIbV-*bTp`6PHow>ZgTRY9ezs=h3V28R84D+onqK+mXEnbhB*6oTJ`m`8Vbn(Vw8T*&)pOdKJ;r*=nCTDNN6}N2_gaw8_g2nJ`XK5i6NLGV($m_FT9D0Nn4SIce2ogJ7>bd7*9KCV@3BDGmMGS{ z2jZc+R%%5Z^ez6XsSM~4#<>JBm$Ngw%~Vh`eU>cBk-zYc#3#5qeHfRA-;E@h^<^0= zLX~Zg@+lrC3htfS44uO4Zf(yIWr9W1q=`14+T)OHA@}7|ahnZk)JI;(u z3q?YLoNAQx#|>ig>{5Bxb&?^mv8Rv1i8~WrC!UXwd{(~Am?M#twnhu9X@tiv4VWM5 z=_H#N0N7`$8H@yRkO&QoyG^NP;%7KnaT7I>W!m)C1yznKuQ&jyFjex)+MY=`c_Z&!2)M3$J$eO{$CK+H zLCdm|B~TjqBG&K>eL~qEuu`%mI^4`_r)vWAR)yGr4uyC~0_O7xptEl8c)X4vqH^&28_}oVVqwiNU@jx! zqQQxH&}ADXS70I9;CR1xIWL&-p@PTEV0K_QhL67)WHc@2@;NNa1Lf)lsrygRbf}yb0R$|+xEViOx!sjE1@g);@8_vkd=&h1*=i0y% zUiZ15Rcys#sgBm5KHq`M0oncP93e7Np=<#?1**u;NPNb`AiWNSYsV#kqZ)~ukJztR z5{1p0C~Xf1ug{2mazBVRVCt=dV3*+ePB!8dGL^>4+AI669->Og$hy@FGnwum{NHMJwpR@h{IY2)aGVw!u8AQTwXjCSR|!1kBaaj zXsDq=eM^{HjbMjeQDDI6$1u*z`FWRr-(s2CB^iwOU_6|RiHR_gaS?=FNomp@Zgjnm!bYi0K1*+faJ}yzPT2o!cet< z-0mpukA~6K#wBJ4scnq@&lJKq4{KyT#fRkJJzFp8zWEAxcK#_V@XLlslEln1@b(~J zL%9%9aL035&r6OqV8n&bn>c|PU%|qBSB7LUG)anf+L86_$`jFFasT;!s`o2K8bvux zGamj98ndalef~LP;I3#TcVmGBDcFc7(xy4owGPC$`1IT`!~Zoif0Y=<5X7U*Ke_L1pVL(y$S6P87OBj*^B;3TF1CxUA(;e4A{ zcTMvt$Vh~90GESnpx2HPCGKE>5|Z_Xt-tl715&)26uhzJsbUgPr!Au?7iq}qD=L1DzfZbYIy8s9(_|{WeJDU#^+CGJuPmj zgbV!KWe2zPvH{^u2SA-M9ONYT*-?aT#@Q%>tRXrID{uwBc`MEs?3n>W8V*G0HLG!A zgsQ}-WSSeLIM~nKPc0n@mvgmqbjUYs`-zf*R*f;fGF0Sh^E25Y^kDl7@Jy%=*M9|u7VH3``W zgn?b@dB9Dp_>SrHj(#Z~CzWzNS@l#XwD`(AdRc}6tUK`U}1Q6dyjj?R& zal*YuAXjH4(Y1LjyEJ6^Ih8Ek z;7P;o>lr{Kzu+?$CjgFkY)@lx@9`kxd?d-!f|x>1MZif&v-?FDZ63C$y3d8-H4-}6 ze$aX@TTSu|et|cx8W5-YFdEJmBCf_;xzN{vhLpb87L|(^*M(X<0wF$0wx@(9*eI&G z5R!pmtEZZQv->GNUBHEC-idb3VMoY5Wgh|FPx8WgetQlE=gc-Lt1&6pOxt-L^$XTp zqob*c`R7JyQXLan9o+$75s&awjI^-s^)^Gu=$pU>G>w;;(I_gWT5cBcscrWI4DaLk z21~xEg9hS)!rZuu;vgO@?>{G%K8&f^4@J1T0I)lV>C>ng-}U33VQn~_bm({q2rbuo~m>nE`-pBPtv>Y|30bBY^>d)V z0!DEfjAXRx$urzcvV$R@$y8mdeZ-F(3P_y~zFBVIxj(2ulw=KQJJqov8JGhrwbCaz zC*R6U8kbeuI+`F5)kkimEG7ioVYDg+|K*tV=T5hJ5{KE=zqf^rjkT3e@Jp?$4xvV&NckHed+iHl+8wSgf$M9N|!fh~9i zzP}Rb`-I@bN#G+JZ>vC_^pUR}qG~;hryq!|R(?;WpWo+DtlV0;Y~nb+zLm9=I+*w) zMpM~7ER%mzrX+m1!NUL>qs&&1ZI`H67&ZCyg6)dyi5*%;#>Gs{{2)0|`hUlCCa_in zb9aqM*p4=<236QG^LhG@(1D~*F)vTR1h3Fsh6o{*roehLXSmmz4Q^`@vBWRX$>iuC z9EJj4G8+sI?Cx_?ChpI)j|{XbuFHIv!b~+i$yL4L+&_$z{g!%0D!CHl8Ed`D;3*%l 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 RyNcU>`I}p&{QTc~{vUca;DrDH diff --git a/pyplot.py b/pyplot.py index 966d064..8733f92 100755 --- a/pyplot.py +++ b/pyplot.py @@ -12,6 +12,7 @@ import csv import math import serial +import threading import ht301_hacklib @@ -82,14 +83,61 @@ cmaps_idx = 1 cmaps = ['inferno', 'coolwarm', 'cividis', 'jet', 'nipy_spectral', 'binary', 'gray', 'tab10'] -matplotlib.rcParams['toolbar'] = 'None' +#matplotlib.rcParams['toolbar'] = 'None' # temporary fake frame frame = np.full((camera.height, camera.width), 25.) +quad_frame = np.full((camera.height, camera.width), 0.) +in_phase_frame = np.full((camera.height, camera.width), 0.) lut = None # will be defined later start_skips = 2 +is_capturing = False +lock = threading.Lock() +lock_in_thread = None + + +if lockin: + fig, axes = plt.subplots(nrows=2, ncols=2, layout='tight') + ax = axes[0][0] + im = axes[0][0].imshow(frame, cmap=cmaps[cmaps_idx]) + im_in_phase = axes[0][1].imshow(frame, cmap=cmaps[cmaps_idx]) + im_quadrature = axes[1][1].imshow(frame, cmap=cmaps[cmaps_idx]) + axes[0][0].set_title('Live') + axes[0][1].set_title('In-phase') + axes[1][1].set_title('Quadrature') + divider = make_axes_locatable(axes[0][0]) + divider_in_phase = make_axes_locatable(axes[0][1]) + divider_quadrature = make_axes_locatable(axes[1][1]) + cax = divider.append_axes("right", size="5%", pad=0.05) + cax_in_phase = divider_in_phase.append_axes("right", size="5%", pad=0.05) + cax_quadrature = divider_quadrature.append_axes("right", size="5%", pad=0.05) + cbar = plt.colorbar(im, cax=cax) + cbar_in_phase = plt.colorbar(im_in_phase, cax=cax_in_phase) + cbar_quadrature = plt.colorbar(im_quadrature, cax=cax_quadrature) + + axes[1][0].axis('off') + status_text = f""" +Frame: -, +Time: -/-, +Load: -, +Frequency: -Hz, +Integration Time: -s +Serial Port: - +""" + status_text_obj = axes[1][0].text(0.05, 0.95, status_text, + verticalalignment='top', + horizontalalignment='left', + transform=axes[1][0].transAxes, + fontsize=12, + color='black') -fig = plt.figure() +else: + fig = plt.figure() + ax = plt.gca() + im = ax.imshow(frame, cmap=cmaps[cmaps_idx]) + divider = make_axes_locatable(ax) + cax = divider.append_axes("right", size="5%", pad=0.05) + cbar = plt.colorbar(im, cax=cax) try: fig.canvas.set_window_title("Thermal Camera") @@ -97,12 +145,6 @@ # does not work on windows pass -ax = plt.gca() -im = ax.imshow(frame, cmap=cmaps[cmaps_idx]) -divider = make_axes_locatable(ax) -cax = divider.append_axes("right", size="5%", pad=0.05) -cbar = plt.colorbar(im, cax=cax) - annotations = utils.Annotations(ax, patches) temp_annotations = { 'std': { @@ -160,6 +202,8 @@ def get_lockin_frame(freq, port, integration): the in-phase and quadrature frames after the integration time is up, while controlling the load via serial communication based on the period of the signal.""" + global frame, is_capturing, status_text + try: ser = serial.Serial(port, 115200) # Open the serial port except serial.SerialException as e: @@ -179,15 +223,28 @@ def get_lockin_frame(freq, port, integration): while (time.time() - start_time) < integration: current_time = time.time() - start_time # Time since the loop started - ret, frame = camera.read() + ret, raw_frame = camera.read() + info, lut = camera.info() + + frame = camera.convert_to_frame(raw_frame, lut) + if not ret: print('Error: could not read frame from camera') sys.exit(1) total_frames += 1 - if(total_frames % 10 == 0): - print(f'Frame: {total_frames}, Time: {current_time:.2f}/{integration:.2f}') # Debugging statement + #if(total_frames % 10 == 0): + #print(f'Frame: {total_frames}, Time: {current_time:.2f}/{integration:.2f}') # Debugging statement + if True: + status_text = f""" +Frame: {total_frames}, +Time: {current_time:.2f}/{integration:.2f}, +Load: {load_on}, +Frequency: {freq:.2f}Hz, +Integration Time: {integration:.2f}s +Serial Port: {port} +""" # Check if a half period has passed (i.e., time to toggle the load) if current_time - (last_toggle_time - start_time) >= half_period: @@ -214,27 +271,58 @@ def get_lockin_frame(freq, port, integration): # print(f"time: {current_time}, phase: {phase}, sin: {sin_weight}, cos: {cos_weight} , load: {load_on}") # Multiply the frame by sin and cos to get in-phase and quadrature components - in_phase = frame * sin_weight - quadrature = frame * cos_weight + in_phase = raw_frame * sin_weight + quadrature = raw_frame * cos_weight # Accumulate the sums in_phase_sum += in_phase quadrature_sum += quadrature + if(is_capturing == False): + break + + ser.write(b'0\n') + ser.close() + # After integration time, normalize by the total frames (optional) in_phase_sum /= total_frames quadrature_sum /= total_frames + return in_phase_sum, quadrature_sum +def capture_lock_in(): + global is_capturing, quad_frame, in_phase_frame, lock, fequency, port, integration + + while is_capturing: + in_phase, quad = get_lockin_frame(fequency, port, integration) + if in_phase is not None and quad is not None: + with lock: + in_phase_frame = in_phase + quad_frame = quad + +def start_capture(): + global is_capturing + is_capturing = True + thread = threading.Thread(target=capture_lock_in) + thread.start() + return thread + +def stop_capture(thread): + global is_capturing + is_capturing = False + if thread is not None: + thread.join() def animate_func(i): - global frame, paused, update_colormap, exposure, im, diff, start_skips + global frame, in_phase_frame, quad_frame, paused, update_colormap, exposure, im, diff, start_skips, lock_in_thread if lockin and start_skips > 0: frame = camera.get_frame() start_skips -= 1 elif lockin: - frame, quad_frame = get_lockin_frame(fequency, port, integration) + if is_capturing == False: + lock_in_thread = start_capture() + #in_phase_frame, quad_frame = get_lockin_frame(fequency, port, integration) else: frame = camera.get_frame() @@ -251,12 +339,16 @@ def animate_func(i): annotation_frame = frame im.set_array(show_frame) + if lockin: + im_in_phase.set_array(in_phase_frame) + im_quadrature.set_array(quad_frame) annotations.update(temp_annotations, annotation_frame, draw_temp) if exposure['auto']: update_colormap = utils.autoExposure(update_colormap, exposure, show_frame) + # TODO deal with saving the lock in stuff to a file log_annotations_to_csv(annotation_frame) if update_colormap: @@ -265,6 +357,14 @@ def animate_func(i): update_colormap = False return [] + if lockin: + # adjust the color limits for the in-phase and quadrature frames + im_in_phase.set_clim(np.min(in_phase_frame), np.max(in_phase_frame)) + im_quadrature.set_clim(np.min(quad_frame), np.max(quad_frame)) + new_status_text = status_text + status_text_obj.set_text(new_status_text) + return [im, im_in_phase, im_quadrature, status_text_obj] + annotations.get() + return [im] + annotations.get() def print_help(): @@ -398,4 +498,5 @@ def onmotion(event): print_help() plt.show() +stop_capture(lock_in_thread) camera.release() diff --git a/registers_t2s.txt b/registers_t2s.txt deleted file mode 100644 index b0c6f7e..0000000 --- a/registers_t2s.txt +++ /dev/null @@ -1,170 +0,0 @@ -Registers of the 4 line params and what they mean for the T2S+ v2 -The values are specified from zero being the start of the 4 line params. - -Abbreviations: -FPA - Focal Plane Array - ---- LINE ZERO --- - -0: FPA average value -1: Temperate of the FPA? -2-15: ZERO -16: UNKNOWN (value: 15805) -17-255: ZERO - ---- LINE ONE --- - -256: cal_00? -257: Shutter Temperate -258: Core Temperate (reads 0 tho) -259-260: cal_01? -261-262: cal_02? -263-264: cal_03? -265-266: cal_04? -267-268: cal_05? -268-271: ZERO -272: UNKNOWN (value: 16840) -273: ZERO -274: UNKNOWN (value: 16840) -275: UNKNOWN (value: 26214) -276: UNKNOWN (value: 16102) -277: UNKNOWN (value: 57672) -278: UNKNOWN (value: 16250) -279: UNKNOWN (value: 1) -280-287: Software version string -288-289: ZERO -290-293: Serial Number? -294-295: ZERO -296: UNKNOWN (value: 12884) -297: UNKNOWN (value: 11091) -298: UNKNOWN (value: 13312) -299: UNKNOWN (value: 76) -300: UNKNOWN (value: 12371) -301: UNKNOWN (value: 57856) -302: UNKNOWN (value: 63430) -303-382: ZERO - ---- USER DATA --- - -383-384: Correction -385-386: Refltmp -387-388: Air temperate -389-390: Humidity -391-392: Emissivity -393-394: Distance -395-511: ZERO - ---- LINE TWO --- - -512: UNKNOWN (value: 17741) -513: UNKNOWN (value: 12849) -514: UNKNOWN (value: 14649) -515: UNKNOWN (value: 21504) -516: UNKNOWN (value: 21298) -517: UNKNOWN (value: 43) -518-519: ZERO -520: UNKNOWN (value: 12884) same as 296 -521: UNKNOWN (value: 11091) same as 297 -522: UNKNOWN (value: 13312) same as 298 -523: UNKNOWN (value: 76) same as 299 -524: UNKNOWN (value: 12371) same as 300 -525: UNKNOWN (value: 57856) same as 301 -526: UNKNOWN (value: 63430) same as 302 -527: ZERO -528: UNKNOWN (value: 48641) -529: UNKNOWN (value: 8965) -530: UNKNOWN (value: 256) -531: ZERO -532: UNKNOWN (value: 259) -533: UNKNOWN (value: 1) -534: UNKNOWN (value: 100) -535: UNKNOWN (value: 1) -536: UNKNOWN (value: 256) -537: UNKNOWN (value: 276) -538: UNKNOWN (value: 150) -539: ZERO -540: UNKNOWN (value: 258) -541: UNKNOWN (value: 1200) -542: UNKNOWN (value: 100) -543: UNKNOWN (value: 100) -544: UNKNOWN (value: 100) -545: UNKNOWN (value: 350) -546: UNKNOWN (value: 70) -547: UNKNOWN (value: 3072) -548: UNKNOWN (value: 768) -549: UNKNOWN (value: 65280) -550: UNKNOWN (value: 127) -551: ZERO -552: UNKNOWN (value: 513) -553: UNKNOWN (value: 3594) -554: UNKNOWN (value: 3331) -555: UNKNOWN (value: 20) -556-558: ZERO -559: UNKNOWN (value: 64000) -560: UNKNOWN (value: 21810) -561: UNKNOWN (value: 15984) -562: UNKNOWN (value: 28312) -563: UNKNOWN (value: 16889) -564: UNKNOWN (value: 50604) -565: UNKNOWN (value: 46887) -566: UNKNOWN (value: 22859) -567: UNKNOWN (value: 15366) -568: UNKNOWN (value: 47186) -569: UNKNOWN (value: 16190) -570-572: ZERO -573: UNKNOWN (value: 16840) -574: ZERO -575: UNKNOWN (value: 16840) -576: UNKNOWN (value: 26214) -577: UNKNOWN (value: 16102) -578: UNKNOWN (value: 57672) -579: UNKNOWN (value: 16250) -580: UNKNOWN (value: 1) -581: UNKNOWN (value: 12059) -582: UNKNOWN (value: 15581) -583: UNKNOWN (value: 33345) -584: UNKNOWN (value: 16314) -585: UNKNOWN (value: 50604) -586: UNKNOWN (value: 14375) -587: UNKNOWN (value: 65012) -588: UNKNOWN (value: 15316) -589: UNKNOWN (value: 65012) -590: UNKNOWN (value: 16132) -591: UNKNOWN (value: 17280) -592: UNKNOWN (value: 257) -593: UNKNOWN (value: 3156) -594: UNKNOWN (value: 8967) -595: UNKNOWN (value: 3875) -596: UNKNOWN (value: 8967) -597: UNKNOWN (value: 3137) -598: UNKNOWN (value: 7938) -599: UNKNOWN (value: 3875) -600: UNKNOWN (value: 7943) -601: UNKNOWN (value: 3137) -602: UNKNOWN (value: 7426) -603: UNKNOWN (value: 3875) -604: UNKNOWN (value: 7943) -605: UNKNOWN (value: 3393) -606: UNKNOWN (value: 7938) -607: UNKNOWN (value: 3875) -608: UNKNOWN (value: 7943) -609: UNKNOWN (value: 45442) -610: UNKNOWN (value: 59280) -611: UNKNOWN (value: 616) -612: UNKNOWN (value: 2113) -613: UNKNOWN (value: 45825) -614: UNKNOWN (value: 9955) -615: UNKNOWN (value: 24807) -616: UNKNOWN (value: 3968) -617: UNKNOWN (value: 14980) -618: UNKNOWN (value: 8132) -619: UNKNOWN (value: 2721) -620: ZERO -621-624: 65535 -624-767: ZERO - ---- LINE THREE --- -768-1023: ZERO - - - diff --git a/run.txt b/run.txt deleted file mode 100644 index 018bc7e49d538f2acc988241f76d64fbfdbd5ae0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 190306 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�LO%5s zGw0r&+AGI-rrw>}dgqyXcWUdMXX@Rlt#_WOcc-@Ad8Xc-+Ir`idUtB;ohRz&YaF4U b^GyAI*M9mgy7tpS*Uow7+`ChI Date: Sun, 29 Sep 2024 00:00:14 +0200 Subject: [PATCH 12/27] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index ec413a8..cbc09cf 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# ht301_hacklib +# IRPyThermal ### Thermal camera python library Supported thermal cameras: From 6ac435339f7c9e259ea55bb4eceb4111eb3e36a6 Mon Sep 17 00:00:00 2001 From: dimonDDL Date: Sun, 29 Sep 2024 00:03:15 +0200 Subject: [PATCH 13/27] renamed the library --- example_simple.py | 4 ++-- ht301_hacklib.py => irpythermal.py | 0 opencv.py | 4 ++-- pyplot.py | 8 ++++---- 4 files changed, 8 insertions(+), 8 deletions(-) rename ht301_hacklib.py => irpythermal.py (100%) diff --git a/example_simple.py b/example_simple.py index 5f3777e..7698f2d 100755 --- a/example_simple.py +++ b/example_simple.py @@ -1,11 +1,11 @@ #!/usr/bin/python3 import time import numpy as np -import ht301_hacklib +import irpythermal # create camera object and do a initial calibration -cap = ht301_hacklib.HT301() +cap = irpythermal.HT301() # read frame (raw ADC data) ret, frame = cap.read() diff --git a/ht301_hacklib.py b/irpythermal.py similarity index 100% rename from ht301_hacklib.py rename to irpythermal.py diff --git a/opencv.py b/opencv.py index bcf9ae6..92fb773 100755 --- a/opencv.py +++ b/opencv.py @@ -2,7 +2,7 @@ #!/usr/bin/python3 import numpy as np import cv2 -import ht301_hacklib +import irpythermal import utils import time from skimage.exposure import rescale_intensity, equalize_hist @@ -10,7 +10,7 @@ draw_temp = True # cap = ht301_hacklib.HT301() -camera = ht301_hacklib.Camera() +camera = irpythermal.Camera() window_name = str(type(camera).__name__) cv2.namedWindow(window_name, cv2.WINDOW_NORMAL) diff --git a/pyplot.py b/pyplot.py index 8733f92..8542c56 100755 --- a/pyplot.py +++ b/pyplot.py @@ -14,7 +14,7 @@ import serial import threading -import ht301_hacklib +import irpythermal from matplotlib.backend_bases import MouseButton from mpl_toolkits.axes_grid1 import make_axes_locatable @@ -48,12 +48,12 @@ args = parser.parse_args() # Choose the camera class -camera: ht301_hacklib.Camera +camera: irpythermal.Camera lockin = False if args.file and args.file.endswith('.npy'): - camera = ht301_hacklib.CameraEmulator(args.file) + camera = irpythermal.CameraEmulator(args.file) else: camera_kwargs = {} if args.rawcam: @@ -77,7 +77,7 @@ port = args.port integration = args.integration - camera = ht301_hacklib.Camera(**camera_kwargs) + camera = irpythermal.Camera(**camera_kwargs) #see https://matplotlib.org/tutorials/colors/colormaps.html cmaps_idx = 1 From 227199dd7a220ecd11ccc705b62cefb94898f91d Mon Sep 17 00:00:00 2001 From: dimonDDL Date: Sun, 29 Sep 2024 00:04:23 +0200 Subject: [PATCH 14/27] updated readme --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index cbc09cf..e42027a 100644 --- a/README.md +++ b/README.md @@ -83,6 +83,7 @@ The modulation frequency should ideally be at least set 10x lower than the camer - https://github.com/MCMH2000/OpenHD_HT301_Driver - https://github.com/sumpster/ht301_viewer - https://github.com/cmair/ht301_hacklib +- https://github.com/stawel/ht301_hacklib - https://github.com/mcguire-steve/ht301_ircam ## Related materials From 7791e3ec3df757a580eeb5405196e2d6bdc75f74 Mon Sep 17 00:00:00 2001 From: Dima Date: Mon, 30 Sep 2024 14:30:41 +0200 Subject: [PATCH 15/27] Update README.md --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index e42027a..856b96b 100644 --- a/README.md +++ b/README.md @@ -62,8 +62,8 @@ python ./pyplot.py 2022-09-11_18-49-07.npy This feature allows you to use the camera in a lock-in mode. This allows for very precise measurements of hotspots on anything that can be modulated in some way. Examples include silicon dies, circuit boards, people (lock in based on heart rate) and potentially many others. -As mentioned above the device under test needs to be stimulated on command from, the script sends commands into a provided serial port to do this. -A `1\n` indicates that we want to turn the modulation on, a `0\n` turns it off. The modulation frequency, serial port and integration time are all provided as command line arguments. +As mentioned above the device under test needs to be stimulated on command, the script sends commands into a provided serial port to do this. +A `1\n` indicates that we want to turn the supply/stimulant on, a `0\n` turns it off. The modulation frequency, serial port and integration time are all provided as command line arguments. For example, the below command will use a modulation frequency of 1Hz, an integration time of 10s and send the commands to `/dev/ttyACM0`: From ed1364d97e7e2cc20c8cd6959933823e68c09ec1 Mon Sep 17 00:00:00 2001 From: Dima Date: Sun, 10 Nov 2024 14:54:15 +0100 Subject: [PATCH 16/27] Update README.md --- README.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 856b96b..ebf6c4d 100644 --- a/README.md +++ b/README.md @@ -12,8 +12,8 @@ or pure `opencv` - much faster but without most features Upon startup the app automatically looks for supported cameras by matching the resolutions. +Running `python ./pyplot.py` will start the camera stream and show the controls below: ``` -python ./pyplot.py keys: 'h' - help 'q' - quit @@ -37,8 +37,10 @@ mouse: left button - add Region Of Interest (ROI) right button - add user temperature annotation ``` +While the program is running you can use these controls in the camera view to control how it looks and behaves. -Alternatively you can specify the video device directly with `-d` to skip the search routine. + +You can specify the video device directly with `-d` to the startup command to skip the search routine. Also for T2S+ V2 users (and potentially for others, where the camera sends raw data and doesn't do onboard processing resulting in the image looking like a pixelated mess) you can specify the `-r` option to tell the program to treat the camera stream as raw sensor data. This will perform a few calibration routines and present you with a usable image doing the sensor processing in python. There is also the `-o` parameter which adds an offset to the entire frames temperature values. This is useful for calibrating the camera since the raw mode sometimes ends up with a constant offset to the image, but this is specific to the camera and thus can be found once and then used for subsequent runs. From bc89a9152faabaacd1102b6bc51bce6dc78d3046 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Frans=20F=C3=BCrst?= Date: Sun, 10 Nov 2024 17:13:59 +0100 Subject: [PATCH 17/27] Adds pyproject.toml in order to create a venv and fix pyplot.py to properly search for interpreter --- .gitignore | 2 + poetry.lock | 606 +++++++++++++++++++++++++++++++++++++++++++++++++ pyplot.py | 2 +- pyproject.toml | 19 ++ 4 files changed, 628 insertions(+), 1 deletion(-) create mode 100644 poetry.lock create mode 100644 pyproject.toml diff --git a/.gitignore b/.gitignore index f53d18e..4c0245b 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,4 @@ __pycache__ .vscode +*.wpr +*.wpu diff --git a/poetry.lock b/poetry.lock new file mode 100644 index 0000000..67d03b1 --- /dev/null +++ b/poetry.lock @@ -0,0 +1,606 @@ +# This file is automatically @generated by Poetry 1.8.4 and should not be changed by hand. + +[[package]] +name = "contourpy" +version = "1.3.0" +description = "Python library for calculating contours of 2D quadrilateral grids" +optional = false +python-versions = ">=3.9" +files = [ + {file = "contourpy-1.3.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:880ea32e5c774634f9fcd46504bf9f080a41ad855f4fef54f5380f5133d343c7"}, + {file = "contourpy-1.3.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:76c905ef940a4474a6289c71d53122a4f77766eef23c03cd57016ce19d0f7b42"}, + {file = "contourpy-1.3.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:92f8557cbb07415a4d6fa191f20fd9d2d9eb9c0b61d1b2f52a8926e43c6e9af7"}, + {file = "contourpy-1.3.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:36f965570cff02b874773c49bfe85562b47030805d7d8360748f3eca570f4cab"}, + {file = "contourpy-1.3.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cacd81e2d4b6f89c9f8a5b69b86490152ff39afc58a95af002a398273e5ce589"}, + {file = "contourpy-1.3.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:69375194457ad0fad3a839b9e29aa0b0ed53bb54db1bfb6c3ae43d111c31ce41"}, + {file = "contourpy-1.3.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:7a52040312b1a858b5e31ef28c2e865376a386c60c0e248370bbea2d3f3b760d"}, + {file = "contourpy-1.3.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:3faeb2998e4fcb256542e8a926d08da08977f7f5e62cf733f3c211c2a5586223"}, + {file = "contourpy-1.3.0-cp310-cp310-win32.whl", hash = "sha256:36e0cff201bcb17a0a8ecc7f454fe078437fa6bda730e695a92f2d9932bd507f"}, + {file = "contourpy-1.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:87ddffef1dbe5e669b5c2440b643d3fdd8622a348fe1983fad7a0f0ccb1cd67b"}, + {file = "contourpy-1.3.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0fa4c02abe6c446ba70d96ece336e621efa4aecae43eaa9b030ae5fb92b309ad"}, + {file = "contourpy-1.3.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:834e0cfe17ba12f79963861e0f908556b2cedd52e1f75e6578801febcc6a9f49"}, + {file = "contourpy-1.3.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dbc4c3217eee163fa3984fd1567632b48d6dfd29216da3ded3d7b844a8014a66"}, + {file = "contourpy-1.3.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4865cd1d419e0c7a7bf6de1777b185eebdc51470800a9f42b9e9decf17762081"}, + {file = "contourpy-1.3.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:303c252947ab4b14c08afeb52375b26781ccd6a5ccd81abcdfc1fafd14cf93c1"}, + {file = "contourpy-1.3.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:637f674226be46f6ba372fd29d9523dd977a291f66ab2a74fbeb5530bb3f445d"}, + {file = "contourpy-1.3.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:76a896b2f195b57db25d6b44e7e03f221d32fe318d03ede41f8b4d9ba1bff53c"}, + {file = "contourpy-1.3.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:e1fd23e9d01591bab45546c089ae89d926917a66dceb3abcf01f6105d927e2cb"}, + {file = "contourpy-1.3.0-cp311-cp311-win32.whl", hash = "sha256:d402880b84df3bec6eab53cd0cf802cae6a2ef9537e70cf75e91618a3801c20c"}, + {file = "contourpy-1.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:6cb6cc968059db9c62cb35fbf70248f40994dfcd7aa10444bbf8b3faeb7c2d67"}, + {file = "contourpy-1.3.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:570ef7cf892f0afbe5b2ee410c507ce12e15a5fa91017a0009f79f7d93a1268f"}, + {file = "contourpy-1.3.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:da84c537cb8b97d153e9fb208c221c45605f73147bd4cadd23bdae915042aad6"}, + {file = "contourpy-1.3.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0be4d8425bfa755e0fd76ee1e019636ccc7c29f77a7c86b4328a9eb6a26d0639"}, + {file = "contourpy-1.3.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9c0da700bf58f6e0b65312d0a5e695179a71d0163957fa381bb3c1f72972537c"}, + {file = "contourpy-1.3.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:eb8b141bb00fa977d9122636b16aa67d37fd40a3d8b52dd837e536d64b9a4d06"}, + {file = "contourpy-1.3.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3634b5385c6716c258d0419c46d05c8aa7dc8cb70326c9a4fb66b69ad2b52e09"}, + {file = "contourpy-1.3.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:0dce35502151b6bd35027ac39ba6e5a44be13a68f55735c3612c568cac3805fd"}, + {file = "contourpy-1.3.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:aea348f053c645100612b333adc5983d87be69acdc6d77d3169c090d3b01dc35"}, + {file = "contourpy-1.3.0-cp312-cp312-win32.whl", hash = "sha256:90f73a5116ad1ba7174341ef3ea5c3150ddf20b024b98fb0c3b29034752c8aeb"}, + {file = "contourpy-1.3.0-cp312-cp312-win_amd64.whl", hash = "sha256:b11b39aea6be6764f84360fce6c82211a9db32a7c7de8fa6dd5397cf1d079c3b"}, + {file = "contourpy-1.3.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:3e1c7fa44aaae40a2247e2e8e0627f4bea3dd257014764aa644f319a5f8600e3"}, + {file = "contourpy-1.3.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:364174c2a76057feef647c802652f00953b575723062560498dc7930fc9b1cb7"}, + {file = "contourpy-1.3.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:32b238b3b3b649e09ce9aaf51f0c261d38644bdfa35cbaf7b263457850957a84"}, + {file = "contourpy-1.3.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d51fca85f9f7ad0b65b4b9fe800406d0d77017d7270d31ec3fb1cc07358fdea0"}, + {file = "contourpy-1.3.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:732896af21716b29ab3e988d4ce14bc5133733b85956316fb0c56355f398099b"}, + {file = "contourpy-1.3.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d73f659398a0904e125280836ae6f88ba9b178b2fed6884f3b1f95b989d2c8da"}, + {file = "contourpy-1.3.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:c6c7c2408b7048082932cf4e641fa3b8ca848259212f51c8c59c45aa7ac18f14"}, + {file = "contourpy-1.3.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:f317576606de89da6b7e0861cf6061f6146ead3528acabff9236458a6ba467f8"}, + {file = "contourpy-1.3.0-cp313-cp313-win32.whl", hash = "sha256:31cd3a85dbdf1fc002280c65caa7e2b5f65e4a973fcdf70dd2fdcb9868069294"}, + {file = "contourpy-1.3.0-cp313-cp313-win_amd64.whl", hash = "sha256:4553c421929ec95fb07b3aaca0fae668b2eb5a5203d1217ca7c34c063c53d087"}, + {file = "contourpy-1.3.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:345af746d7766821d05d72cb8f3845dfd08dd137101a2cb9b24de277d716def8"}, + {file = "contourpy-1.3.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:3bb3808858a9dc68f6f03d319acd5f1b8a337e6cdda197f02f4b8ff67ad2057b"}, + {file = "contourpy-1.3.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:420d39daa61aab1221567b42eecb01112908b2cab7f1b4106a52caaec8d36973"}, + {file = "contourpy-1.3.0-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4d63ee447261e963af02642ffcb864e5a2ee4cbfd78080657a9880b8b1868e18"}, + {file = "contourpy-1.3.0-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:167d6c890815e1dac9536dca00828b445d5d0df4d6a8c6adb4a7ec3166812fa8"}, + {file = "contourpy-1.3.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:710a26b3dc80c0e4febf04555de66f5fd17e9cf7170a7b08000601a10570bda6"}, + {file = "contourpy-1.3.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:75ee7cb1a14c617f34a51d11fa7524173e56551646828353c4af859c56b766e2"}, + {file = "contourpy-1.3.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:33c92cdae89ec5135d036e7218e69b0bb2851206077251f04a6c4e0e21f03927"}, + {file = "contourpy-1.3.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:a11077e395f67ffc2c44ec2418cfebed032cd6da3022a94fc227b6faf8e2acb8"}, + {file = "contourpy-1.3.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e8134301d7e204c88ed7ab50028ba06c683000040ede1d617298611f9dc6240c"}, + {file = "contourpy-1.3.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e12968fdfd5bb45ffdf6192a590bd8ddd3ba9e58360b29683c6bb71a7b41edca"}, + {file = "contourpy-1.3.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fd2a0fc506eccaaa7595b7e1418951f213cf8255be2600f1ea1b61e46a60c55f"}, + {file = "contourpy-1.3.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4cfb5c62ce023dfc410d6059c936dcf96442ba40814aefbfa575425a3a7f19dc"}, + {file = "contourpy-1.3.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:68a32389b06b82c2fdd68276148d7b9275b5f5cf13e5417e4252f6d1a34f72a2"}, + {file = "contourpy-1.3.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:94e848a6b83da10898cbf1311a815f770acc9b6a3f2d646f330d57eb4e87592e"}, + {file = "contourpy-1.3.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:d78ab28a03c854a873787a0a42254a0ccb3cb133c672f645c9f9c8f3ae9d0800"}, + {file = "contourpy-1.3.0-cp39-cp39-win32.whl", hash = "sha256:81cb5ed4952aae6014bc9d0421dec7c5835c9c8c31cdf51910b708f548cf58e5"}, + {file = "contourpy-1.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:14e262f67bd7e6eb6880bc564dcda30b15e351a594657e55b7eec94b6ef72843"}, + {file = "contourpy-1.3.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:fe41b41505a5a33aeaed2a613dccaeaa74e0e3ead6dd6fd3a118fb471644fd6c"}, + {file = "contourpy-1.3.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eca7e17a65f72a5133bdbec9ecf22401c62bcf4821361ef7811faee695799779"}, + {file = "contourpy-1.3.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:1ec4dc6bf570f5b22ed0d7efba0dfa9c5b9e0431aeea7581aa217542d9e809a4"}, + {file = "contourpy-1.3.0-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:00ccd0dbaad6d804ab259820fa7cb0b8036bda0686ef844d24125d8287178ce0"}, + {file = "contourpy-1.3.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8ca947601224119117f7c19c9cdf6b3ab54c5726ef1d906aa4a69dfb6dd58102"}, + {file = "contourpy-1.3.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:c6ec93afeb848a0845a18989da3beca3eec2c0f852322efe21af1931147d12cb"}, + {file = "contourpy-1.3.0.tar.gz", hash = "sha256:7ffa0db17717a8ffb127efd0c95a4362d996b892c2904db72428d5b52e1938a4"}, +] + +[package.dependencies] +numpy = ">=1.23" + +[package.extras] +bokeh = ["bokeh", "selenium"] +docs = ["furo", "sphinx (>=7.2)", "sphinx-copybutton"] +mypy = ["contourpy[bokeh,docs]", "docutils-stubs", "mypy (==1.11.1)", "types-Pillow"] +test = ["Pillow", "contourpy[test-no-images]", "matplotlib"] +test-no-images = ["pytest", "pytest-cov", "pytest-rerunfailures", "pytest-xdist", "wurlitzer"] + +[[package]] +name = "cycler" +version = "0.12.1" +description = "Composable style cycles" +optional = false +python-versions = ">=3.8" +files = [ + {file = "cycler-0.12.1-py3-none-any.whl", hash = "sha256:85cef7cff222d8644161529808465972e51340599459b8ac3ccbac5a854e0d30"}, + {file = "cycler-0.12.1.tar.gz", hash = "sha256:88bb128f02ba341da8ef447245a9e138fae777f6a23943da4540077d3601eb1c"}, +] + +[package.extras] +docs = ["ipython", "matplotlib", "numpydoc", "sphinx"] +tests = ["pytest", "pytest-cov", "pytest-xdist"] + +[[package]] +name = "fonttools" +version = "4.54.1" +description = "Tools to manipulate font files" +optional = false +python-versions = ">=3.8" +files = [ + {file = "fonttools-4.54.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7ed7ee041ff7b34cc62f07545e55e1468808691dddfd315d51dd82a6b37ddef2"}, + {file = "fonttools-4.54.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:41bb0b250c8132b2fcac148e2e9198e62ff06f3cc472065dff839327945c5882"}, + {file = "fonttools-4.54.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7965af9b67dd546e52afcf2e38641b5be956d68c425bef2158e95af11d229f10"}, + {file = "fonttools-4.54.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:278913a168f90d53378c20c23b80f4e599dca62fbffae4cc620c8eed476b723e"}, + {file = "fonttools-4.54.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:0e88e3018ac809b9662615072dcd6b84dca4c2d991c6d66e1970a112503bba7e"}, + {file = "fonttools-4.54.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:4aa4817f0031206e637d1e685251ac61be64d1adef111060df84fdcbc6ab6c44"}, + {file = "fonttools-4.54.1-cp310-cp310-win32.whl", hash = "sha256:7e3b7d44e18c085fd8c16dcc6f1ad6c61b71ff463636fcb13df7b1b818bd0c02"}, + {file = "fonttools-4.54.1-cp310-cp310-win_amd64.whl", hash = "sha256:dd9cc95b8d6e27d01e1e1f1fae8559ef3c02c76317da650a19047f249acd519d"}, + {file = "fonttools-4.54.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:5419771b64248484299fa77689d4f3aeed643ea6630b2ea750eeab219588ba20"}, + {file = "fonttools-4.54.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:301540e89cf4ce89d462eb23a89464fef50915255ece765d10eee8b2bf9d75b2"}, + {file = "fonttools-4.54.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:76ae5091547e74e7efecc3cbf8e75200bc92daaeb88e5433c5e3e95ea8ce5aa7"}, + {file = "fonttools-4.54.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:82834962b3d7c5ca98cb56001c33cf20eb110ecf442725dc5fdf36d16ed1ab07"}, + {file = "fonttools-4.54.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d26732ae002cc3d2ecab04897bb02ae3f11f06dd7575d1df46acd2f7c012a8d8"}, + {file = "fonttools-4.54.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:58974b4987b2a71ee08ade1e7f47f410c367cdfc5a94fabd599c88165f56213a"}, + {file = "fonttools-4.54.1-cp311-cp311-win32.whl", hash = "sha256:ab774fa225238986218a463f3fe151e04d8c25d7de09df7f0f5fce27b1243dbc"}, + {file = "fonttools-4.54.1-cp311-cp311-win_amd64.whl", hash = "sha256:07e005dc454eee1cc60105d6a29593459a06321c21897f769a281ff2d08939f6"}, + {file = "fonttools-4.54.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:54471032f7cb5fca694b5f1a0aaeba4af6e10ae989df408e0216f7fd6cdc405d"}, + {file = "fonttools-4.54.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8fa92cb248e573daab8d032919623cc309c005086d743afb014c836636166f08"}, + {file = "fonttools-4.54.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0a911591200114969befa7f2cb74ac148bce5a91df5645443371aba6d222e263"}, + {file = "fonttools-4.54.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:93d458c8a6a354dc8b48fc78d66d2a8a90b941f7fec30e94c7ad9982b1fa6bab"}, + {file = "fonttools-4.54.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:5eb2474a7c5be8a5331146758debb2669bf5635c021aee00fd7c353558fc659d"}, + {file = "fonttools-4.54.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c9c563351ddc230725c4bdf7d9e1e92cbe6ae8553942bd1fb2b2ff0884e8b714"}, + {file = "fonttools-4.54.1-cp312-cp312-win32.whl", hash = "sha256:fdb062893fd6d47b527d39346e0c5578b7957dcea6d6a3b6794569370013d9ac"}, + {file = "fonttools-4.54.1-cp312-cp312-win_amd64.whl", hash = "sha256:e4564cf40cebcb53f3dc825e85910bf54835e8a8b6880d59e5159f0f325e637e"}, + {file = "fonttools-4.54.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:6e37561751b017cf5c40fce0d90fd9e8274716de327ec4ffb0df957160be3bff"}, + {file = "fonttools-4.54.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:357cacb988a18aace66e5e55fe1247f2ee706e01debc4b1a20d77400354cddeb"}, + {file = "fonttools-4.54.1-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f8e953cc0bddc2beaf3a3c3b5dd9ab7554677da72dfaf46951e193c9653e515a"}, + {file = "fonttools-4.54.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:58d29b9a294573d8319f16f2f79e42428ba9b6480442fa1836e4eb89c4d9d61c"}, + {file = "fonttools-4.54.1-cp313-cp313-win32.whl", hash = "sha256:9ef1b167e22709b46bf8168368b7b5d3efeaaa746c6d39661c1b4405b6352e58"}, + {file = "fonttools-4.54.1-cp313-cp313-win_amd64.whl", hash = "sha256:262705b1663f18c04250bd1242b0515d3bbae177bee7752be67c979b7d47f43d"}, + {file = "fonttools-4.54.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:ed2f80ca07025551636c555dec2b755dd005e2ea8fbeb99fc5cdff319b70b23b"}, + {file = "fonttools-4.54.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:9dc080e5a1c3b2656caff2ac2633d009b3a9ff7b5e93d0452f40cd76d3da3b3c"}, + {file = "fonttools-4.54.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1d152d1be65652fc65e695e5619e0aa0982295a95a9b29b52b85775243c06556"}, + {file = "fonttools-4.54.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8583e563df41fdecef31b793b4dd3af8a9caa03397be648945ad32717a92885b"}, + {file = "fonttools-4.54.1-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:0d1d353ef198c422515a3e974a1e8d5b304cd54a4c2eebcae708e37cd9eeffb1"}, + {file = "fonttools-4.54.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:fda582236fee135d4daeca056c8c88ec5f6f6d88a004a79b84a02547c8f57386"}, + {file = "fonttools-4.54.1-cp38-cp38-win32.whl", hash = "sha256:e7d82b9e56716ed32574ee106cabca80992e6bbdcf25a88d97d21f73a0aae664"}, + {file = "fonttools-4.54.1-cp38-cp38-win_amd64.whl", hash = "sha256:ada215fd079e23e060157aab12eba0d66704316547f334eee9ff26f8c0d7b8ab"}, + {file = "fonttools-4.54.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:f5b8a096e649768c2f4233f947cf9737f8dbf8728b90e2771e2497c6e3d21d13"}, + {file = "fonttools-4.54.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4e10d2e0a12e18f4e2dd031e1bf7c3d7017be5c8dbe524d07706179f355c5dac"}, + {file = "fonttools-4.54.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:31c32d7d4b0958600eac75eaf524b7b7cb68d3a8c196635252b7a2c30d80e986"}, + {file = "fonttools-4.54.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c39287f5c8f4a0c5a55daf9eaf9ccd223ea59eed3f6d467133cc727d7b943a55"}, + {file = "fonttools-4.54.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:a7a310c6e0471602fe3bf8efaf193d396ea561486aeaa7adc1f132e02d30c4b9"}, + {file = "fonttools-4.54.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:d3b659d1029946f4ff9b6183984578041b520ce0f8fb7078bb37ec7445806b33"}, + {file = "fonttools-4.54.1-cp39-cp39-win32.whl", hash = "sha256:e96bc94c8cda58f577277d4a71f51c8e2129b8b36fd05adece6320dd3d57de8a"}, + {file = "fonttools-4.54.1-cp39-cp39-win_amd64.whl", hash = "sha256:e8a4b261c1ef91e7188a30571be6ad98d1c6d9fa2427244c545e2fa0a2494dd7"}, + {file = "fonttools-4.54.1-py3-none-any.whl", hash = "sha256:37cddd62d83dc4f72f7c3f3c2bcf2697e89a30efb152079896544a93907733bd"}, + {file = "fonttools-4.54.1.tar.gz", hash = "sha256:957f669d4922f92c171ba01bef7f29410668db09f6c02111e22b2bce446f3285"}, +] + +[package.extras] +all = ["brotli (>=1.0.1)", "brotlicffi (>=0.8.0)", "fs (>=2.2.0,<3)", "lxml (>=4.0)", "lz4 (>=1.7.4.2)", "matplotlib", "munkres", "pycairo", "scipy", "skia-pathops (>=0.5.0)", "sympy", "uharfbuzz (>=0.23.0)", "unicodedata2 (>=15.1.0)", "xattr", "zopfli (>=0.1.4)"] +graphite = ["lz4 (>=1.7.4.2)"] +interpolatable = ["munkres", "pycairo", "scipy"] +lxml = ["lxml (>=4.0)"] +pathops = ["skia-pathops (>=0.5.0)"] +plot = ["matplotlib"] +repacker = ["uharfbuzz (>=0.23.0)"] +symfont = ["sympy"] +type1 = ["xattr"] +ufo = ["fs (>=2.2.0,<3)"] +unicode = ["unicodedata2 (>=15.1.0)"] +woff = ["brotli (>=1.0.1)", "brotlicffi (>=0.8.0)", "zopfli (>=0.1.4)"] + +[[package]] +name = "kiwisolver" +version = "1.4.7" +description = "A fast implementation of the Cassowary constraint solver" +optional = false +python-versions = ">=3.8" +files = [ + {file = "kiwisolver-1.4.7-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:8a9c83f75223d5e48b0bc9cb1bf2776cf01563e00ade8775ffe13b0b6e1af3a6"}, + {file = "kiwisolver-1.4.7-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:58370b1ffbd35407444d57057b57da5d6549d2d854fa30249771775c63b5fe17"}, + {file = "kiwisolver-1.4.7-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:aa0abdf853e09aff551db11fce173e2177d00786c688203f52c87ad7fcd91ef9"}, + {file = "kiwisolver-1.4.7-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:8d53103597a252fb3ab8b5845af04c7a26d5e7ea8122303dd7a021176a87e8b9"}, + {file = "kiwisolver-1.4.7-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:88f17c5ffa8e9462fb79f62746428dd57b46eb931698e42e990ad63103f35e6c"}, + {file = "kiwisolver-1.4.7-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:88a9ca9c710d598fd75ee5de59d5bda2684d9db36a9f50b6125eaea3969c2599"}, + {file = "kiwisolver-1.4.7-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f4d742cb7af1c28303a51b7a27aaee540e71bb8e24f68c736f6f2ffc82f2bf05"}, + {file = "kiwisolver-1.4.7-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e28c7fea2196bf4c2f8d46a0415c77a1c480cc0724722f23d7410ffe9842c407"}, + {file = "kiwisolver-1.4.7-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:e968b84db54f9d42046cf154e02911e39c0435c9801681e3fc9ce8a3c4130278"}, + {file = "kiwisolver-1.4.7-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:0c18ec74c0472de033e1bebb2911c3c310eef5649133dd0bedf2a169a1b269e5"}, + {file = "kiwisolver-1.4.7-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:8f0ea6da6d393d8b2e187e6a5e3fb81f5862010a40c3945e2c6d12ae45cfb2ad"}, + {file = "kiwisolver-1.4.7-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:f106407dda69ae456dd1227966bf445b157ccc80ba0dff3802bb63f30b74e895"}, + {file = "kiwisolver-1.4.7-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:84ec80df401cfee1457063732d90022f93951944b5b58975d34ab56bb150dfb3"}, + {file = "kiwisolver-1.4.7-cp310-cp310-win32.whl", hash = "sha256:71bb308552200fb2c195e35ef05de12f0c878c07fc91c270eb3d6e41698c3bcc"}, + {file = "kiwisolver-1.4.7-cp310-cp310-win_amd64.whl", hash = "sha256:44756f9fd339de0fb6ee4f8c1696cfd19b2422e0d70b4cefc1cc7f1f64045a8c"}, + {file = "kiwisolver-1.4.7-cp310-cp310-win_arm64.whl", hash = "sha256:78a42513018c41c2ffd262eb676442315cbfe3c44eed82385c2ed043bc63210a"}, + {file = "kiwisolver-1.4.7-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:d2b0e12a42fb4e72d509fc994713d099cbb15ebf1103545e8a45f14da2dfca54"}, + {file = "kiwisolver-1.4.7-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2a8781ac3edc42ea4b90bc23e7d37b665d89423818e26eb6df90698aa2287c95"}, + {file = "kiwisolver-1.4.7-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:46707a10836894b559e04b0fd143e343945c97fd170d69a2d26d640b4e297935"}, + {file = "kiwisolver-1.4.7-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ef97b8df011141c9b0f6caf23b29379f87dd13183c978a30a3c546d2c47314cb"}, + {file = "kiwisolver-1.4.7-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3ab58c12a2cd0fc769089e6d38466c46d7f76aced0a1f54c77652446733d2d02"}, + {file = "kiwisolver-1.4.7-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:803b8e1459341c1bb56d1c5c010406d5edec8a0713a0945851290a7930679b51"}, + {file = "kiwisolver-1.4.7-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f9a9e8a507420fe35992ee9ecb302dab68550dedc0da9e2880dd88071c5fb052"}, + {file = "kiwisolver-1.4.7-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:18077b53dc3bb490e330669a99920c5e6a496889ae8c63b58fbc57c3d7f33a18"}, + {file = "kiwisolver-1.4.7-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:6af936f79086a89b3680a280c47ea90b4df7047b5bdf3aa5c524bbedddb9e545"}, + {file = "kiwisolver-1.4.7-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:3abc5b19d24af4b77d1598a585b8a719beb8569a71568b66f4ebe1fb0449460b"}, + {file = "kiwisolver-1.4.7-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:933d4de052939d90afbe6e9d5273ae05fb836cc86c15b686edd4b3560cc0ee36"}, + {file = "kiwisolver-1.4.7-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:65e720d2ab2b53f1f72fb5da5fb477455905ce2c88aaa671ff0a447c2c80e8e3"}, + {file = "kiwisolver-1.4.7-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:3bf1ed55088f214ba6427484c59553123fdd9b218a42bbc8c6496d6754b1e523"}, + {file = "kiwisolver-1.4.7-cp311-cp311-win32.whl", hash = "sha256:4c00336b9dd5ad96d0a558fd18a8b6f711b7449acce4c157e7343ba92dd0cf3d"}, + {file = "kiwisolver-1.4.7-cp311-cp311-win_amd64.whl", hash = "sha256:929e294c1ac1e9f615c62a4e4313ca1823ba37326c164ec720a803287c4c499b"}, + {file = "kiwisolver-1.4.7-cp311-cp311-win_arm64.whl", hash = "sha256:e33e8fbd440c917106b237ef1a2f1449dfbb9b6f6e1ce17c94cd6a1e0d438376"}, + {file = "kiwisolver-1.4.7-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:5360cc32706dab3931f738d3079652d20982511f7c0ac5711483e6eab08efff2"}, + {file = "kiwisolver-1.4.7-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:942216596dc64ddb25adb215c3c783215b23626f8d84e8eff8d6d45c3f29f75a"}, + {file = "kiwisolver-1.4.7-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:48b571ecd8bae15702e4f22d3ff6a0f13e54d3d00cd25216d5e7f658242065ee"}, + {file = "kiwisolver-1.4.7-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ad42ba922c67c5f219097b28fae965e10045ddf145d2928bfac2eb2e17673640"}, + {file = "kiwisolver-1.4.7-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:612a10bdae23404a72941a0fc8fa2660c6ea1217c4ce0dbcab8a8f6543ea9e7f"}, + {file = "kiwisolver-1.4.7-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9e838bba3a3bac0fe06d849d29772eb1afb9745a59710762e4ba3f4cb8424483"}, + {file = "kiwisolver-1.4.7-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:22f499f6157236c19f4bbbd472fa55b063db77a16cd74d49afe28992dff8c258"}, + {file = "kiwisolver-1.4.7-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:693902d433cf585133699972b6d7c42a8b9f8f826ebcaf0132ff55200afc599e"}, + {file = "kiwisolver-1.4.7-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:4e77f2126c3e0b0d055f44513ed349038ac180371ed9b52fe96a32aa071a5107"}, + {file = "kiwisolver-1.4.7-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:657a05857bda581c3656bfc3b20e353c232e9193eb167766ad2dc58b56504948"}, + {file = "kiwisolver-1.4.7-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:4bfa75a048c056a411f9705856abfc872558e33c055d80af6a380e3658766038"}, + {file = "kiwisolver-1.4.7-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:34ea1de54beef1c104422d210c47c7d2a4999bdecf42c7b5718fbe59a4cac383"}, + {file = "kiwisolver-1.4.7-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:90da3b5f694b85231cf93586dad5e90e2d71b9428f9aad96952c99055582f520"}, + {file = "kiwisolver-1.4.7-cp312-cp312-win32.whl", hash = "sha256:18e0cca3e008e17fe9b164b55735a325140a5a35faad8de92dd80265cd5eb80b"}, + {file = "kiwisolver-1.4.7-cp312-cp312-win_amd64.whl", hash = "sha256:58cb20602b18f86f83a5c87d3ee1c766a79c0d452f8def86d925e6c60fbf7bfb"}, + {file = "kiwisolver-1.4.7-cp312-cp312-win_arm64.whl", hash = "sha256:f5a8b53bdc0b3961f8b6125e198617c40aeed638b387913bf1ce78afb1b0be2a"}, + {file = "kiwisolver-1.4.7-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:2e6039dcbe79a8e0f044f1c39db1986a1b8071051efba3ee4d74f5b365f5226e"}, + {file = "kiwisolver-1.4.7-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:a1ecf0ac1c518487d9d23b1cd7139a6a65bc460cd101ab01f1be82ecf09794b6"}, + {file = "kiwisolver-1.4.7-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:7ab9ccab2b5bd5702ab0803676a580fffa2aa178c2badc5557a84cc943fcf750"}, + {file = "kiwisolver-1.4.7-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f816dd2277f8d63d79f9c8473a79fe54047bc0467754962840782c575522224d"}, + {file = "kiwisolver-1.4.7-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cf8bcc23ceb5a1b624572a1623b9f79d2c3b337c8c455405ef231933a10da379"}, + {file = "kiwisolver-1.4.7-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:dea0bf229319828467d7fca8c7c189780aa9ff679c94539eed7532ebe33ed37c"}, + {file = "kiwisolver-1.4.7-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7c06a4c7cf15ec739ce0e5971b26c93638730090add60e183530d70848ebdd34"}, + {file = "kiwisolver-1.4.7-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:913983ad2deb14e66d83c28b632fd35ba2b825031f2fa4ca29675e665dfecbe1"}, + {file = "kiwisolver-1.4.7-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:5337ec7809bcd0f424c6b705ecf97941c46279cf5ed92311782c7c9c2026f07f"}, + {file = "kiwisolver-1.4.7-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:4c26ed10c4f6fa6ddb329a5120ba3b6db349ca192ae211e882970bfc9d91420b"}, + {file = "kiwisolver-1.4.7-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:c619b101e6de2222c1fcb0531e1b17bbffbe54294bfba43ea0d411d428618c27"}, + {file = "kiwisolver-1.4.7-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:073a36c8273647592ea332e816e75ef8da5c303236ec0167196793eb1e34657a"}, + {file = "kiwisolver-1.4.7-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:3ce6b2b0231bda412463e152fc18335ba32faf4e8c23a754ad50ffa70e4091ee"}, + {file = "kiwisolver-1.4.7-cp313-cp313-win32.whl", hash = "sha256:f4c9aee212bc89d4e13f58be11a56cc8036cabad119259d12ace14b34476fd07"}, + {file = "kiwisolver-1.4.7-cp313-cp313-win_amd64.whl", hash = "sha256:8a3ec5aa8e38fc4c8af308917ce12c536f1c88452ce554027e55b22cbbfbff76"}, + {file = "kiwisolver-1.4.7-cp313-cp313-win_arm64.whl", hash = "sha256:76c8094ac20ec259471ac53e774623eb62e6e1f56cd8690c67ce6ce4fcb05650"}, + {file = "kiwisolver-1.4.7-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5d5abf8f8ec1f4e22882273c423e16cae834c36856cac348cfbfa68e01c40f3a"}, + {file = "kiwisolver-1.4.7-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:aeb3531b196ef6f11776c21674dba836aeea9d5bd1cf630f869e3d90b16cfade"}, + {file = "kiwisolver-1.4.7-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:b7d755065e4e866a8086c9bdada157133ff466476a2ad7861828e17b6026e22c"}, + {file = "kiwisolver-1.4.7-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:08471d4d86cbaec61f86b217dd938a83d85e03785f51121e791a6e6689a3be95"}, + {file = "kiwisolver-1.4.7-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7bbfcb7165ce3d54a3dfbe731e470f65739c4c1f85bb1018ee912bae139e263b"}, + {file = "kiwisolver-1.4.7-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5d34eb8494bea691a1a450141ebb5385e4b69d38bb8403b5146ad279f4b30fa3"}, + {file = "kiwisolver-1.4.7-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:9242795d174daa40105c1d86aba618e8eab7bf96ba8c3ee614da8302a9f95503"}, + {file = "kiwisolver-1.4.7-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:a0f64a48bb81af7450e641e3fe0b0394d7381e342805479178b3d335d60ca7cf"}, + {file = "kiwisolver-1.4.7-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:8e045731a5416357638d1700927529e2b8ab304811671f665b225f8bf8d8f933"}, + {file = "kiwisolver-1.4.7-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:4322872d5772cae7369f8351da1edf255a604ea7087fe295411397d0cfd9655e"}, + {file = "kiwisolver-1.4.7-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:e1631290ee9271dffe3062d2634c3ecac02c83890ada077d225e081aca8aab89"}, + {file = "kiwisolver-1.4.7-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:edcfc407e4eb17e037bca59be0e85a2031a2ac87e4fed26d3e9df88b4165f92d"}, + {file = "kiwisolver-1.4.7-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:4d05d81ecb47d11e7f8932bd8b61b720bf0b41199358f3f5e36d38e28f0532c5"}, + {file = "kiwisolver-1.4.7-cp38-cp38-win32.whl", hash = "sha256:b38ac83d5f04b15e515fd86f312479d950d05ce2368d5413d46c088dda7de90a"}, + {file = "kiwisolver-1.4.7-cp38-cp38-win_amd64.whl", hash = "sha256:d83db7cde68459fc803052a55ace60bea2bae361fc3b7a6d5da07e11954e4b09"}, + {file = "kiwisolver-1.4.7-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:3f9362ecfca44c863569d3d3c033dbe8ba452ff8eed6f6b5806382741a1334bd"}, + {file = "kiwisolver-1.4.7-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:e8df2eb9b2bac43ef8b082e06f750350fbbaf2887534a5be97f6cf07b19d9583"}, + {file = "kiwisolver-1.4.7-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f32d6edbc638cde7652bd690c3e728b25332acbadd7cad670cc4a02558d9c417"}, + {file = "kiwisolver-1.4.7-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:e2e6c39bd7b9372b0be21456caab138e8e69cc0fc1190a9dfa92bd45a1e6e904"}, + {file = "kiwisolver-1.4.7-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:dda56c24d869b1193fcc763f1284b9126550eaf84b88bbc7256e15028f19188a"}, + {file = "kiwisolver-1.4.7-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:79849239c39b5e1fd906556c474d9b0439ea6792b637511f3fe3a41158d89ca8"}, + {file = "kiwisolver-1.4.7-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5e3bc157fed2a4c02ec468de4ecd12a6e22818d4f09cde2c31ee3226ffbefab2"}, + {file = "kiwisolver-1.4.7-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3da53da805b71e41053dc670f9a820d1157aae77b6b944e08024d17bcd51ef88"}, + {file = "kiwisolver-1.4.7-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:8705f17dfeb43139a692298cb6637ee2e59c0194538153e83e9ee0c75c2eddde"}, + {file = "kiwisolver-1.4.7-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:82a5c2f4b87c26bb1a0ef3d16b5c4753434633b83d365cc0ddf2770c93829e3c"}, + {file = "kiwisolver-1.4.7-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:ce8be0466f4c0d585cdb6c1e2ed07232221df101a4c6f28821d2aa754ca2d9e2"}, + {file = "kiwisolver-1.4.7-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:409afdfe1e2e90e6ee7fc896f3df9a7fec8e793e58bfa0d052c8a82f99c37abb"}, + {file = "kiwisolver-1.4.7-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:5b9c3f4ee0b9a439d2415012bd1b1cc2df59e4d6a9939f4d669241d30b414327"}, + {file = "kiwisolver-1.4.7-cp39-cp39-win32.whl", hash = "sha256:a79ae34384df2b615eefca647a2873842ac3b596418032bef9a7283675962644"}, + {file = "kiwisolver-1.4.7-cp39-cp39-win_amd64.whl", hash = "sha256:cf0438b42121a66a3a667de17e779330fc0f20b0d97d59d2f2121e182b0505e4"}, + {file = "kiwisolver-1.4.7-cp39-cp39-win_arm64.whl", hash = "sha256:764202cc7e70f767dab49e8df52c7455e8de0df5d858fa801a11aa0d882ccf3f"}, + {file = "kiwisolver-1.4.7-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:94252291e3fe68001b1dd747b4c0b3be12582839b95ad4d1b641924d68fd4643"}, + {file = "kiwisolver-1.4.7-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:5b7dfa3b546da08a9f622bb6becdb14b3e24aaa30adba66749d38f3cc7ea9706"}, + {file = "kiwisolver-1.4.7-pp310-pypy310_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bd3de6481f4ed8b734da5df134cd5a6a64fe32124fe83dde1e5b5f29fe30b1e6"}, + {file = "kiwisolver-1.4.7-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a91b5f9f1205845d488c928e8570dcb62b893372f63b8b6e98b863ebd2368ff2"}, + {file = "kiwisolver-1.4.7-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:40fa14dbd66b8b8f470d5fc79c089a66185619d31645f9b0773b88b19f7223c4"}, + {file = "kiwisolver-1.4.7-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:eb542fe7933aa09d8d8f9d9097ef37532a7df6497819d16efe4359890a2f417a"}, + {file = "kiwisolver-1.4.7-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:bfa1acfa0c54932d5607e19a2c24646fb4c1ae2694437789129cf099789a3b00"}, + {file = "kiwisolver-1.4.7-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:eee3ea935c3d227d49b4eb85660ff631556841f6e567f0f7bda972df6c2c9935"}, + {file = "kiwisolver-1.4.7-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:f3160309af4396e0ed04db259c3ccbfdc3621b5559b5453075e5de555e1f3a1b"}, + {file = "kiwisolver-1.4.7-pp38-pypy38_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:a17f6a29cf8935e587cc8a4dbfc8368c55edc645283db0ce9801016f83526c2d"}, + {file = "kiwisolver-1.4.7-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:10849fb2c1ecbfae45a693c070e0320a91b35dd4bcf58172c023b994283a124d"}, + {file = "kiwisolver-1.4.7-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:ac542bf38a8a4be2dc6b15248d36315ccc65f0743f7b1a76688ffb6b5129a5c2"}, + {file = "kiwisolver-1.4.7-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:8b01aac285f91ca889c800042c35ad3b239e704b150cfd3382adfc9dcc780e39"}, + {file = "kiwisolver-1.4.7-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:48be928f59a1f5c8207154f935334d374e79f2b5d212826307d072595ad76a2e"}, + {file = "kiwisolver-1.4.7-pp39-pypy39_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f37cfe618a117e50d8c240555331160d73d0411422b59b5ee217843d7b693608"}, + {file = "kiwisolver-1.4.7-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:599b5c873c63a1f6ed7eead644a8a380cfbdf5db91dcb6f85707aaab213b1674"}, + {file = "kiwisolver-1.4.7-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:801fa7802e5cfabe3ab0c81a34c323a319b097dfb5004be950482d882f3d7225"}, + {file = "kiwisolver-1.4.7-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:0c6c43471bc764fad4bc99c5c2d6d16a676b1abf844ca7c8702bdae92df01ee0"}, + {file = "kiwisolver-1.4.7.tar.gz", hash = "sha256:9893ff81bd7107f7b685d3017cc6583daadb4fc26e4a888350df530e41980a60"}, +] + +[[package]] +name = "matplotlib" +version = "3.9.2" +description = "Python plotting package" +optional = false +python-versions = ">=3.9" +files = [ + {file = "matplotlib-3.9.2-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:9d78bbc0cbc891ad55b4f39a48c22182e9bdaea7fc0e5dbd364f49f729ca1bbb"}, + {file = "matplotlib-3.9.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c375cc72229614632c87355366bdf2570c2dac01ac66b8ad048d2dabadf2d0d4"}, + {file = "matplotlib-3.9.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1d94ff717eb2bd0b58fe66380bd8b14ac35f48a98e7c6765117fe67fb7684e64"}, + {file = "matplotlib-3.9.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ab68d50c06938ef28681073327795c5db99bb4666214d2d5f880ed11aeaded66"}, + {file = "matplotlib-3.9.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:65aacf95b62272d568044531e41de26285d54aec8cb859031f511f84bd8b495a"}, + {file = "matplotlib-3.9.2-cp310-cp310-win_amd64.whl", hash = "sha256:3fd595f34aa8a55b7fc8bf9ebea8aa665a84c82d275190a61118d33fbc82ccae"}, + {file = "matplotlib-3.9.2-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:d8dd059447824eec055e829258ab092b56bb0579fc3164fa09c64f3acd478772"}, + {file = "matplotlib-3.9.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c797dac8bb9c7a3fd3382b16fe8f215b4cf0f22adccea36f1545a6d7be310b41"}, + {file = "matplotlib-3.9.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d719465db13267bcef19ea8954a971db03b9f48b4647e3860e4bc8e6ed86610f"}, + {file = "matplotlib-3.9.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8912ef7c2362f7193b5819d17dae8629b34a95c58603d781329712ada83f9447"}, + {file = "matplotlib-3.9.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:7741f26a58a240f43bee74965c4882b6c93df3e7eb3de160126d8c8f53a6ae6e"}, + {file = "matplotlib-3.9.2-cp311-cp311-win_amd64.whl", hash = "sha256:ae82a14dab96fbfad7965403c643cafe6515e386de723e498cf3eeb1e0b70cc7"}, + {file = "matplotlib-3.9.2-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:ac43031375a65c3196bee99f6001e7fa5bdfb00ddf43379d3c0609bdca042df9"}, + {file = "matplotlib-3.9.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:be0fc24a5e4531ae4d8e858a1a548c1fe33b176bb13eff7f9d0d38ce5112a27d"}, + {file = "matplotlib-3.9.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bf81de2926c2db243c9b2cbc3917619a0fc85796c6ba4e58f541df814bbf83c7"}, + {file = "matplotlib-3.9.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f6ee45bc4245533111ced13f1f2cace1e7f89d1c793390392a80c139d6cf0e6c"}, + {file = "matplotlib-3.9.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:306c8dfc73239f0e72ac50e5a9cf19cc4e8e331dd0c54f5e69ca8758550f1e1e"}, + {file = "matplotlib-3.9.2-cp312-cp312-win_amd64.whl", hash = "sha256:5413401594cfaff0052f9d8b1aafc6d305b4bd7c4331dccd18f561ff7e1d3bd3"}, + {file = "matplotlib-3.9.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:18128cc08f0d3cfff10b76baa2f296fc28c4607368a8402de61bb3f2eb33c7d9"}, + {file = "matplotlib-3.9.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:4876d7d40219e8ae8bb70f9263bcbe5714415acfdf781086601211335e24f8aa"}, + {file = "matplotlib-3.9.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6d9f07a80deab4bb0b82858a9e9ad53d1382fd122be8cde11080f4e7dfedb38b"}, + {file = "matplotlib-3.9.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f7c0410f181a531ec4e93bbc27692f2c71a15c2da16766f5ba9761e7ae518413"}, + {file = "matplotlib-3.9.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:909645cce2dc28b735674ce0931a4ac94e12f5b13f6bb0b5a5e65e7cea2c192b"}, + {file = "matplotlib-3.9.2-cp313-cp313-win_amd64.whl", hash = "sha256:f32c7410c7f246838a77d6d1eff0c0f87f3cb0e7c4247aebea71a6d5a68cab49"}, + {file = "matplotlib-3.9.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:37e51dd1c2db16ede9cfd7b5cabdfc818b2c6397c83f8b10e0e797501c963a03"}, + {file = "matplotlib-3.9.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:b82c5045cebcecd8496a4d694d43f9cc84aeeb49fe2133e036b207abe73f4d30"}, + {file = "matplotlib-3.9.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f053c40f94bc51bc03832a41b4f153d83f2062d88c72b5e79997072594e97e51"}, + {file = "matplotlib-3.9.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dbe196377a8248972f5cede786d4c5508ed5f5ca4a1e09b44bda889958b33f8c"}, + {file = "matplotlib-3.9.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:5816b1e1fe8c192cbc013f8f3e3368ac56fbecf02fb41b8f8559303f24c5015e"}, + {file = "matplotlib-3.9.2-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:cef2a73d06601437be399908cf13aee74e86932a5ccc6ccdf173408ebc5f6bb2"}, + {file = "matplotlib-3.9.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e0830e188029c14e891fadd99702fd90d317df294c3298aad682739c5533721a"}, + {file = "matplotlib-3.9.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:03ba9c1299c920964e8d3857ba27173b4dbb51ca4bab47ffc2c2ba0eb5e2cbc5"}, + {file = "matplotlib-3.9.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1cd93b91ab47a3616b4d3c42b52f8363b88ca021e340804c6ab2536344fad9ca"}, + {file = "matplotlib-3.9.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:6d1ce5ed2aefcdce11904fc5bbea7d9c21fff3d5f543841edf3dea84451a09ea"}, + {file = "matplotlib-3.9.2-cp39-cp39-win_amd64.whl", hash = "sha256:b2696efdc08648536efd4e1601b5fd491fd47f4db97a5fbfd175549a7365c1b2"}, + {file = "matplotlib-3.9.2-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:d52a3b618cb1cbb769ce2ee1dcdb333c3ab6e823944e9a2d36e37253815f9556"}, + {file = "matplotlib-3.9.2-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:039082812cacd6c6bec8e17a9c1e6baca230d4116d522e81e1f63a74d01d2e21"}, + {file = "matplotlib-3.9.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6758baae2ed64f2331d4fd19be38b7b4eae3ecec210049a26b6a4f3ae1c85dcc"}, + {file = "matplotlib-3.9.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:050598c2b29e0b9832cde72bcf97627bf00262adbc4a54e2b856426bb2ef0697"}, + {file = "matplotlib-3.9.2.tar.gz", hash = "sha256:96ab43906269ca64a6366934106fa01534454a69e471b7bf3d79083981aaab92"}, +] + +[package.dependencies] +contourpy = ">=1.0.1" +cycler = ">=0.10" +fonttools = ">=4.22.0" +kiwisolver = ">=1.3.1" +numpy = ">=1.23" +packaging = ">=20.0" +pillow = ">=8" +pyparsing = ">=2.3.1" +python-dateutil = ">=2.7" + +[package.extras] +dev = ["meson-python (>=0.13.1)", "numpy (>=1.25)", "pybind11 (>=2.6)", "setuptools (>=64)", "setuptools_scm (>=7)"] + +[[package]] +name = "numpy" +version = "2.1.3" +description = "Fundamental package for array computing in Python" +optional = false +python-versions = ">=3.10" +files = [ + {file = "numpy-2.1.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c894b4305373b9c5576d7a12b473702afdf48ce5369c074ba304cc5ad8730dff"}, + {file = "numpy-2.1.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:b47fbb433d3260adcd51eb54f92a2ffbc90a4595f8970ee00e064c644ac788f5"}, + {file = "numpy-2.1.3-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:825656d0743699c529c5943554d223c021ff0494ff1442152ce887ef4f7561a1"}, + {file = "numpy-2.1.3-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:6a4825252fcc430a182ac4dee5a505053d262c807f8a924603d411f6718b88fd"}, + {file = "numpy-2.1.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e711e02f49e176a01d0349d82cb5f05ba4db7d5e7e0defd026328e5cfb3226d3"}, + {file = "numpy-2.1.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:78574ac2d1a4a02421f25da9559850d59457bac82f2b8d7a44fe83a64f770098"}, + {file = "numpy-2.1.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:c7662f0e3673fe4e832fe07b65c50342ea27d989f92c80355658c7f888fcc83c"}, + {file = "numpy-2.1.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:fa2d1337dc61c8dc417fbccf20f6d1e139896a30721b7f1e832b2bb6ef4eb6c4"}, + {file = "numpy-2.1.3-cp310-cp310-win32.whl", hash = "sha256:72dcc4a35a8515d83e76b58fdf8113a5c969ccd505c8a946759b24e3182d1f23"}, + {file = "numpy-2.1.3-cp310-cp310-win_amd64.whl", hash = "sha256:ecc76a9ba2911d8d37ac01de72834d8849e55473457558e12995f4cd53e778e0"}, + {file = "numpy-2.1.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4d1167c53b93f1f5d8a139a742b3c6f4d429b54e74e6b57d0eff40045187b15d"}, + {file = "numpy-2.1.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c80e4a09b3d95b4e1cac08643f1152fa71a0a821a2d4277334c88d54b2219a41"}, + {file = "numpy-2.1.3-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:576a1c1d25e9e02ed7fa5477f30a127fe56debd53b8d2c89d5578f9857d03ca9"}, + {file = "numpy-2.1.3-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:973faafebaae4c0aaa1a1ca1ce02434554d67e628b8d805e61f874b84e136b09"}, + {file = "numpy-2.1.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:762479be47a4863e261a840e8e01608d124ee1361e48b96916f38b119cfda04a"}, + {file = "numpy-2.1.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc6f24b3d1ecc1eebfbf5d6051faa49af40b03be1aaa781ebdadcbc090b4539b"}, + {file = "numpy-2.1.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:17ee83a1f4fef3c94d16dc1802b998668b5419362c8a4f4e8a491de1b41cc3ee"}, + {file = "numpy-2.1.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:15cb89f39fa6d0bdfb600ea24b250e5f1a3df23f901f51c8debaa6a5d122b2f0"}, + {file = "numpy-2.1.3-cp311-cp311-win32.whl", hash = "sha256:d9beb777a78c331580705326d2367488d5bc473b49a9bc3036c154832520aca9"}, + {file = "numpy-2.1.3-cp311-cp311-win_amd64.whl", hash = "sha256:d89dd2b6da69c4fff5e39c28a382199ddedc3a5be5390115608345dec660b9e2"}, + {file = "numpy-2.1.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:f55ba01150f52b1027829b50d70ef1dafd9821ea82905b63936668403c3b471e"}, + {file = "numpy-2.1.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:13138eadd4f4da03074851a698ffa7e405f41a0845a6b1ad135b81596e4e9958"}, + {file = "numpy-2.1.3-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:a6b46587b14b888e95e4a24d7b13ae91fa22386c199ee7b418f449032b2fa3b8"}, + {file = "numpy-2.1.3-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:0fa14563cc46422e99daef53d725d0c326e99e468a9320a240affffe87852564"}, + {file = "numpy-2.1.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8637dcd2caa676e475503d1f8fdb327bc495554e10838019651b76d17b98e512"}, + {file = "numpy-2.1.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2312b2aa89e1f43ecea6da6ea9a810d06aae08321609d8dc0d0eda6d946a541b"}, + {file = "numpy-2.1.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:a38c19106902bb19351b83802531fea19dee18e5b37b36454f27f11ff956f7fc"}, + {file = "numpy-2.1.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:02135ade8b8a84011cbb67dc44e07c58f28575cf9ecf8ab304e51c05528c19f0"}, + {file = "numpy-2.1.3-cp312-cp312-win32.whl", hash = "sha256:e6988e90fcf617da2b5c78902fe8e668361b43b4fe26dbf2d7b0f8034d4cafb9"}, + {file = "numpy-2.1.3-cp312-cp312-win_amd64.whl", hash = "sha256:0d30c543f02e84e92c4b1f415b7c6b5326cbe45ee7882b6b77db7195fb971e3a"}, + {file = "numpy-2.1.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:96fe52fcdb9345b7cd82ecd34547fca4321f7656d500eca497eb7ea5a926692f"}, + {file = "numpy-2.1.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f653490b33e9c3a4c1c01d41bc2aef08f9475af51146e4a7710c450cf9761598"}, + {file = "numpy-2.1.3-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:dc258a761a16daa791081d026f0ed4399b582712e6fc887a95af09df10c5ca57"}, + {file = "numpy-2.1.3-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:016d0f6f5e77b0f0d45d77387ffa4bb89816b57c835580c3ce8e099ef830befe"}, + {file = "numpy-2.1.3-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c181ba05ce8299c7aa3125c27b9c2167bca4a4445b7ce73d5febc411ca692e43"}, + {file = "numpy-2.1.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5641516794ca9e5f8a4d17bb45446998c6554704d888f86df9b200e66bdcce56"}, + {file = "numpy-2.1.3-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:ea4dedd6e394a9c180b33c2c872b92f7ce0f8e7ad93e9585312b0c5a04777a4a"}, + {file = "numpy-2.1.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:b0df3635b9c8ef48bd3be5f862cf71b0a4716fa0e702155c45067c6b711ddcef"}, + {file = "numpy-2.1.3-cp313-cp313-win32.whl", hash = "sha256:50ca6aba6e163363f132b5c101ba078b8cbd3fa92c7865fd7d4d62d9779ac29f"}, + {file = "numpy-2.1.3-cp313-cp313-win_amd64.whl", hash = "sha256:747641635d3d44bcb380d950679462fae44f54b131be347d5ec2bce47d3df9ed"}, + {file = "numpy-2.1.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:996bb9399059c5b82f76b53ff8bb686069c05acc94656bb259b1d63d04a9506f"}, + {file = "numpy-2.1.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:45966d859916ad02b779706bb43b954281db43e185015df6eb3323120188f9e4"}, + {file = "numpy-2.1.3-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:baed7e8d7481bfe0874b566850cb0b85243e982388b7b23348c6db2ee2b2ae8e"}, + {file = "numpy-2.1.3-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:a9f7f672a3388133335589cfca93ed468509cb7b93ba3105fce780d04a6576a0"}, + {file = "numpy-2.1.3-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d7aac50327da5d208db2eec22eb11e491e3fe13d22653dce51b0f4109101b408"}, + {file = "numpy-2.1.3-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4394bc0dbd074b7f9b52024832d16e019decebf86caf909d94f6b3f77a8ee3b6"}, + {file = "numpy-2.1.3-cp313-cp313t-musllinux_1_1_x86_64.whl", hash = "sha256:50d18c4358a0a8a53f12a8ba9d772ab2d460321e6a93d6064fc22443d189853f"}, + {file = "numpy-2.1.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:14e253bd43fc6b37af4921b10f6add6925878a42a0c5fe83daee390bca80bc17"}, + {file = "numpy-2.1.3-cp313-cp313t-win32.whl", hash = "sha256:08788d27a5fd867a663f6fc753fd7c3ad7e92747efc73c53bca2f19f8bc06f48"}, + {file = "numpy-2.1.3-cp313-cp313t-win_amd64.whl", hash = "sha256:2564fbdf2b99b3f815f2107c1bbc93e2de8ee655a69c261363a1172a79a257d4"}, + {file = "numpy-2.1.3-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:4f2015dfe437dfebbfce7c85c7b53d81ba49e71ba7eadbf1df40c915af75979f"}, + {file = "numpy-2.1.3-pp310-pypy310_pp73-macosx_14_0_x86_64.whl", hash = "sha256:3522b0dfe983a575e6a9ab3a4a4dfe156c3e428468ff08ce582b9bb6bd1d71d4"}, + {file = "numpy-2.1.3-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c006b607a865b07cd981ccb218a04fc86b600411d83d6fc261357f1c0966755d"}, + {file = "numpy-2.1.3-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:e14e26956e6f1696070788252dcdff11b4aca4c3e8bd166e0df1bb8f315a67cb"}, + {file = "numpy-2.1.3.tar.gz", hash = "sha256:aa08e04e08aaf974d4458def539dece0d28146d866a39da5639596f4921fd761"}, +] + +[[package]] +name = "opencv-python" +version = "4.10.0.84" +description = "Wrapper package for OpenCV python bindings." +optional = false +python-versions = ">=3.6" +files = [ + {file = "opencv-python-4.10.0.84.tar.gz", hash = "sha256:72d234e4582e9658ffea8e9cae5b63d488ad06994ef12d81dc303b17472f3526"}, + {file = "opencv_python-4.10.0.84-cp37-abi3-macosx_11_0_arm64.whl", hash = "sha256:fc182f8f4cda51b45f01c64e4cbedfc2f00aff799debebc305d8d0210c43f251"}, + {file = "opencv_python-4.10.0.84-cp37-abi3-macosx_12_0_x86_64.whl", hash = "sha256:71e575744f1d23f79741450254660442785f45a0797212852ee5199ef12eed98"}, + {file = "opencv_python-4.10.0.84-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:09a332b50488e2dda866a6c5573ee192fe3583239fb26ff2f7f9ceb0bc119ea6"}, + {file = "opencv_python-4.10.0.84-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9ace140fc6d647fbe1c692bcb2abce768973491222c067c131d80957c595b71f"}, + {file = "opencv_python-4.10.0.84-cp37-abi3-win32.whl", hash = "sha256:2db02bb7e50b703f0a2d50c50ced72e95c574e1e5a0bb35a8a86d0b35c98c236"}, + {file = "opencv_python-4.10.0.84-cp37-abi3-win_amd64.whl", hash = "sha256:32dbbd94c26f611dc5cc6979e6b7aa1f55a64d6b463cc1dcd3c95505a63e48fe"}, +] + +[package.dependencies] +numpy = [ + {version = ">=1.26.0", markers = "python_version >= \"3.12\""}, + {version = ">=1.23.5", markers = "python_version >= \"3.11\" and python_version < \"3.12\""}, + {version = ">=1.21.4", markers = "python_version >= \"3.10\" and platform_system == \"Darwin\" and python_version < \"3.11\""}, + {version = ">=1.21.2", markers = "platform_system != \"Darwin\" and python_version >= \"3.10\" and python_version < \"3.11\""}, +] + +[[package]] +name = "packaging" +version = "24.2" +description = "Core utilities for Python packages" +optional = false +python-versions = ">=3.8" +files = [ + {file = "packaging-24.2-py3-none-any.whl", hash = "sha256:09abb1bccd265c01f4a3aa3f7a7db064b36514d2cba19a2f694fe6150451a759"}, + {file = "packaging-24.2.tar.gz", hash = "sha256:c228a6dc5e932d346bc5739379109d49e8853dd8223571c7c5b55260edc0b97f"}, +] + +[[package]] +name = "pillow" +version = "11.0.0" +description = "Python Imaging Library (Fork)" +optional = false +python-versions = ">=3.9" +files = [ + {file = "pillow-11.0.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:6619654954dc4936fcff82db8eb6401d3159ec6be81e33c6000dfd76ae189947"}, + {file = "pillow-11.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:b3c5ac4bed7519088103d9450a1107f76308ecf91d6dabc8a33a2fcfb18d0fba"}, + {file = "pillow-11.0.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a65149d8ada1055029fcb665452b2814fe7d7082fcb0c5bed6db851cb69b2086"}, + {file = "pillow-11.0.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:88a58d8ac0cc0e7f3a014509f0455248a76629ca9b604eca7dc5927cc593c5e9"}, + {file = "pillow-11.0.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:c26845094b1af3c91852745ae78e3ea47abf3dbcd1cf962f16b9a5fbe3ee8488"}, + {file = "pillow-11.0.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:1a61b54f87ab5786b8479f81c4b11f4d61702830354520837f8cc791ebba0f5f"}, + {file = "pillow-11.0.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:674629ff60030d144b7bca2b8330225a9b11c482ed408813924619c6f302fdbb"}, + {file = "pillow-11.0.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:598b4e238f13276e0008299bd2482003f48158e2b11826862b1eb2ad7c768b97"}, + {file = "pillow-11.0.0-cp310-cp310-win32.whl", hash = "sha256:9a0f748eaa434a41fccf8e1ee7a3eed68af1b690e75328fd7a60af123c193b50"}, + {file = "pillow-11.0.0-cp310-cp310-win_amd64.whl", hash = "sha256:a5629742881bcbc1f42e840af185fd4d83a5edeb96475a575f4da50d6ede337c"}, + {file = "pillow-11.0.0-cp310-cp310-win_arm64.whl", hash = "sha256:ee217c198f2e41f184f3869f3e485557296d505b5195c513b2bfe0062dc537f1"}, + {file = "pillow-11.0.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:1c1d72714f429a521d8d2d018badc42414c3077eb187a59579f28e4270b4b0fc"}, + {file = "pillow-11.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:499c3a1b0d6fc8213519e193796eb1a86a1be4b1877d678b30f83fd979811d1a"}, + {file = "pillow-11.0.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c8b2351c85d855293a299038e1f89db92a2f35e8d2f783489c6f0b2b5f3fe8a3"}, + {file = "pillow-11.0.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6f4dba50cfa56f910241eb7f883c20f1e7b1d8f7d91c750cd0b318bad443f4d5"}, + {file = "pillow-11.0.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:5ddbfd761ee00c12ee1be86c9c0683ecf5bb14c9772ddbd782085779a63dd55b"}, + {file = "pillow-11.0.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:45c566eb10b8967d71bf1ab8e4a525e5a93519e29ea071459ce517f6b903d7fa"}, + {file = "pillow-11.0.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:b4fd7bd29610a83a8c9b564d457cf5bd92b4e11e79a4ee4716a63c959699b306"}, + {file = "pillow-11.0.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:cb929ca942d0ec4fac404cbf520ee6cac37bf35be479b970c4ffadf2b6a1cad9"}, + {file = "pillow-11.0.0-cp311-cp311-win32.whl", hash = "sha256:006bcdd307cc47ba43e924099a038cbf9591062e6c50e570819743f5607404f5"}, + {file = "pillow-11.0.0-cp311-cp311-win_amd64.whl", hash = "sha256:52a2d8323a465f84faaba5236567d212c3668f2ab53e1c74c15583cf507a0291"}, + {file = "pillow-11.0.0-cp311-cp311-win_arm64.whl", hash = "sha256:16095692a253047fe3ec028e951fa4221a1f3ed3d80c397e83541a3037ff67c9"}, + {file = "pillow-11.0.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:d2c0a187a92a1cb5ef2c8ed5412dd8d4334272617f532d4ad4de31e0495bd923"}, + {file = "pillow-11.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:084a07ef0821cfe4858fe86652fffac8e187b6ae677e9906e192aafcc1b69903"}, + {file = "pillow-11.0.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8069c5179902dcdce0be9bfc8235347fdbac249d23bd90514b7a47a72d9fecf4"}, + {file = "pillow-11.0.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f02541ef64077f22bf4924f225c0fd1248c168f86e4b7abdedd87d6ebaceab0f"}, + {file = "pillow-11.0.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:fcb4621042ac4b7865c179bb972ed0da0218a076dc1820ffc48b1d74c1e37fe9"}, + {file = "pillow-11.0.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:00177a63030d612148e659b55ba99527803288cea7c75fb05766ab7981a8c1b7"}, + {file = "pillow-11.0.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8853a3bf12afddfdf15f57c4b02d7ded92c7a75a5d7331d19f4f9572a89c17e6"}, + {file = "pillow-11.0.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:3107c66e43bda25359d5ef446f59c497de2b5ed4c7fdba0894f8d6cf3822dafc"}, + {file = "pillow-11.0.0-cp312-cp312-win32.whl", hash = "sha256:86510e3f5eca0ab87429dd77fafc04693195eec7fd6a137c389c3eeb4cfb77c6"}, + {file = "pillow-11.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:8ec4a89295cd6cd4d1058a5e6aec6bf51e0eaaf9714774e1bfac7cfc9051db47"}, + {file = "pillow-11.0.0-cp312-cp312-win_arm64.whl", hash = "sha256:27a7860107500d813fcd203b4ea19b04babe79448268403172782754870dac25"}, + {file = "pillow-11.0.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:bcd1fb5bb7b07f64c15618c89efcc2cfa3e95f0e3bcdbaf4642509de1942a699"}, + {file = "pillow-11.0.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:0e038b0745997c7dcaae350d35859c9715c71e92ffb7e0f4a8e8a16732150f38"}, + {file = "pillow-11.0.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0ae08bd8ffc41aebf578c2af2f9d8749d91f448b3bfd41d7d9ff573d74f2a6b2"}, + {file = "pillow-11.0.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d69bfd8ec3219ae71bcde1f942b728903cad25fafe3100ba2258b973bd2bc1b2"}, + {file = "pillow-11.0.0-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:61b887f9ddba63ddf62fd02a3ba7add935d053b6dd7d58998c630e6dbade8527"}, + {file = "pillow-11.0.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:c6a660307ca9d4867caa8d9ca2c2658ab685de83792d1876274991adec7b93fa"}, + {file = "pillow-11.0.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:73e3a0200cdda995c7e43dd47436c1548f87a30bb27fb871f352a22ab8dcf45f"}, + {file = "pillow-11.0.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:fba162b8872d30fea8c52b258a542c5dfd7b235fb5cb352240c8d63b414013eb"}, + {file = "pillow-11.0.0-cp313-cp313-win32.whl", hash = "sha256:f1b82c27e89fffc6da125d5eb0ca6e68017faf5efc078128cfaa42cf5cb38798"}, + {file = "pillow-11.0.0-cp313-cp313-win_amd64.whl", hash = "sha256:8ba470552b48e5835f1d23ecb936bb7f71d206f9dfeee64245f30c3270b994de"}, + {file = "pillow-11.0.0-cp313-cp313-win_arm64.whl", hash = "sha256:846e193e103b41e984ac921b335df59195356ce3f71dcfd155aa79c603873b84"}, + {file = "pillow-11.0.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:4ad70c4214f67d7466bea6a08061eba35c01b1b89eaa098040a35272a8efb22b"}, + {file = "pillow-11.0.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:6ec0d5af64f2e3d64a165f490d96368bb5dea8b8f9ad04487f9ab60dc4bb6003"}, + {file = "pillow-11.0.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c809a70e43c7977c4a42aefd62f0131823ebf7dd73556fa5d5950f5b354087e2"}, + {file = "pillow-11.0.0-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:4b60c9520f7207aaf2e1d94de026682fc227806c6e1f55bba7606d1c94dd623a"}, + {file = "pillow-11.0.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:1e2688958a840c822279fda0086fec1fdab2f95bf2b717b66871c4ad9859d7e8"}, + {file = "pillow-11.0.0-cp313-cp313t-win32.whl", hash = "sha256:607bbe123c74e272e381a8d1957083a9463401f7bd01287f50521ecb05a313f8"}, + {file = "pillow-11.0.0-cp313-cp313t-win_amd64.whl", hash = "sha256:5c39ed17edea3bc69c743a8dd3e9853b7509625c2462532e62baa0732163a904"}, + {file = "pillow-11.0.0-cp313-cp313t-win_arm64.whl", hash = "sha256:75acbbeb05b86bc53cbe7b7e6fe00fbcf82ad7c684b3ad82e3d711da9ba287d3"}, + {file = "pillow-11.0.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:2e46773dc9f35a1dd28bd6981332fd7f27bec001a918a72a79b4133cf5291dba"}, + {file = "pillow-11.0.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:2679d2258b7f1192b378e2893a8a0a0ca472234d4c2c0e6bdd3380e8dfa21b6a"}, + {file = "pillow-11.0.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eda2616eb2313cbb3eebbe51f19362eb434b18e3bb599466a1ffa76a033fb916"}, + {file = "pillow-11.0.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:20ec184af98a121fb2da42642dea8a29ec80fc3efbaefb86d8fdd2606619045d"}, + {file = "pillow-11.0.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:8594f42df584e5b4bb9281799698403f7af489fba84c34d53d1c4bfb71b7c4e7"}, + {file = "pillow-11.0.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:c12b5ae868897c7338519c03049a806af85b9b8c237b7d675b8c5e089e4a618e"}, + {file = "pillow-11.0.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:70fbbdacd1d271b77b7721fe3cdd2d537bbbd75d29e6300c672ec6bb38d9672f"}, + {file = "pillow-11.0.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:5178952973e588b3f1360868847334e9e3bf49d19e169bbbdfaf8398002419ae"}, + {file = "pillow-11.0.0-cp39-cp39-win32.whl", hash = "sha256:8c676b587da5673d3c75bd67dd2a8cdfeb282ca38a30f37950511766b26858c4"}, + {file = "pillow-11.0.0-cp39-cp39-win_amd64.whl", hash = "sha256:94f3e1780abb45062287b4614a5bc0874519c86a777d4a7ad34978e86428b8dd"}, + {file = "pillow-11.0.0-cp39-cp39-win_arm64.whl", hash = "sha256:290f2cc809f9da7d6d622550bbf4c1e57518212da51b6a30fe8e0a270a5b78bd"}, + {file = "pillow-11.0.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:1187739620f2b365de756ce086fdb3604573337cc28a0d3ac4a01ab6b2d2a6d2"}, + {file = "pillow-11.0.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:fbbcb7b57dc9c794843e3d1258c0fbf0f48656d46ffe9e09b63bbd6e8cd5d0a2"}, + {file = "pillow-11.0.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5d203af30149ae339ad1b4f710d9844ed8796e97fda23ffbc4cc472968a47d0b"}, + {file = "pillow-11.0.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:21a0d3b115009ebb8ac3d2ebec5c2982cc693da935f4ab7bb5c8ebe2f47d36f2"}, + {file = "pillow-11.0.0-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:73853108f56df97baf2bb8b522f3578221e56f646ba345a372c78326710d3830"}, + {file = "pillow-11.0.0-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:e58876c91f97b0952eb766123bfef372792ab3f4e3e1f1a2267834c2ab131734"}, + {file = "pillow-11.0.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:224aaa38177597bb179f3ec87eeefcce8e4f85e608025e9cfac60de237ba6316"}, + {file = "pillow-11.0.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:5bd2d3bdb846d757055910f0a59792d33b555800813c3b39ada1829c372ccb06"}, + {file = "pillow-11.0.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:375b8dd15a1f5d2feafff536d47e22f69625c1aa92f12b339ec0b2ca40263273"}, + {file = "pillow-11.0.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:daffdf51ee5db69a82dd127eabecce20729e21f7a3680cf7cbb23f0829189790"}, + {file = "pillow-11.0.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:7326a1787e3c7b0429659e0a944725e1b03eeaa10edd945a86dead1913383944"}, + {file = "pillow-11.0.0.tar.gz", hash = "sha256:72bacbaf24ac003fea9bff9837d1eedb6088758d41e100c1552930151f677739"}, +] + +[package.extras] +docs = ["furo", "olefile", "sphinx (>=8.1)", "sphinx-copybutton", "sphinx-inline-tabs", "sphinxext-opengraph"] +fpx = ["olefile"] +mic = ["olefile"] +tests = ["check-manifest", "coverage", "defusedxml", "markdown2", "olefile", "packaging", "pyroma", "pytest", "pytest-cov", "pytest-timeout"] +typing = ["typing-extensions"] +xmp = ["defusedxml"] + +[[package]] +name = "pyparsing" +version = "3.2.0" +description = "pyparsing module - Classes and methods to define and execute parsing grammars" +optional = false +python-versions = ">=3.9" +files = [ + {file = "pyparsing-3.2.0-py3-none-any.whl", hash = "sha256:93d9577b88da0bbea8cc8334ee8b918ed014968fd2ec383e868fb8afb1ccef84"}, + {file = "pyparsing-3.2.0.tar.gz", hash = "sha256:cbf74e27246d595d9a74b186b810f6fbb86726dbf3b9532efb343f6d7294fe9c"}, +] + +[package.extras] +diagrams = ["jinja2", "railroad-diagrams"] + +[[package]] +name = "pyserial" +version = "3.5" +description = "Python Serial Port Extension" +optional = false +python-versions = "*" +files = [ + {file = "pyserial-3.5-py2.py3-none-any.whl", hash = "sha256:c4451db6ba391ca6ca299fb3ec7bae67a5c55dde170964c7a14ceefec02f2cf0"}, + {file = "pyserial-3.5.tar.gz", hash = "sha256:3c77e014170dfffbd816e6ffc205e9842efb10be9f58ec16d3e8675b4925cddb"}, +] + +[package.extras] +cp2110 = ["hidapi"] + +[[package]] +name = "python-dateutil" +version = "2.9.0.post0" +description = "Extensions to the standard Python datetime module" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" +files = [ + {file = "python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3"}, + {file = "python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427"}, +] + +[package.dependencies] +six = ">=1.5" + +[[package]] +name = "six" +version = "1.16.0" +description = "Python 2 and 3 compatibility utilities" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" +files = [ + {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, + {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, +] + +[metadata] +lock-version = "2.0" +python-versions = "^3.10.4" +content-hash = "53b62c7b7d5603fa5b610c6e5d3551c6cd040c9dcf2f4385fc139d63138ef1ed" diff --git a/pyplot.py b/pyplot.py index 8542c56..4f7b1f7 100755 --- a/pyplot.py +++ b/pyplot.py @@ -1,4 +1,4 @@ -#!/usr/bin/python3 +#!/usr/bin/env python3 import argparse import cv2 import numpy as np diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..5e91180 --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,19 @@ +[tool.poetry] +name = "ir-py-thermal" +version = "0.1.0" +description = "ir-py-thermal" +authors = ["Dima "] +repository = "https://github.com/diminDDL/IR-Py-Thermal" +readme = "README.md" +package-mode = false + +[tool.poetry.dependencies] +python = "^3.10.4" +opencv-python = "^4.10.0.84" +matplotlib = "^3.9.2" +pyserial = "^3.5" + +[build-system] +requires = ["poetry-core>=1.0.0"] +build-backend = "poetry.core.masonry.api" + From ff9f440607d6b56117cbb6e7807defd301fae65a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Frans=20F=C3=BCrst?= Date: Sun, 10 Nov 2024 22:02:07 +0100 Subject: [PATCH 18/27] Auto-format using ruff, add ruff to project dependencies --- display.py | 47 +++-- example_simple.py | 54 ++++-- irpythermal.py | 434 +++++++++++++++++++++++++++---------------- opencv.py | 16 +- poetry.lock | 29 ++- pyplot.py | 455 ++++++++++++++++++++++++++++------------------ pyproject.toml | 3 + utils.py | 157 +++++++++------- 8 files changed, 748 insertions(+), 447 deletions(-) diff --git a/display.py b/display.py index 51d5f9b..3653650 100644 --- a/display.py +++ b/display.py @@ -1,9 +1,10 @@ -import numpy as np import matplotlib.pyplot as plt +import numpy as np from matplotlib.widgets import Button # Load the numpy file -data = np.load('./2024-06-21_23-02-55.npy') +data = np.load("./2024-06-21_23-02-55.npy") + # Function to get the pixel number def get_pixel_number(x, y, width, height, origin=(0, 0)): @@ -11,35 +12,42 @@ def get_pixel_number(x, y, width, height, origin=(0, 0)): pixel_number = (y - zero_y) * width + (x - zero_x) return pixel_number + # Click event handler def onclick(event): global arrow, rect x, y = int(event.xdata), int(event.ydata) height, width = data.shape - + if x >= 0 and y >= 0 and x < width and y < height: pixel_number = get_pixel_number(x, y, width, height, origin=(zero_x, zero_y)) pixel_value = data[y, x] - print(f'Pixel ({x}, {y}) has number: {pixel_number} and value: {pixel_value}') - + print(f"Pixel ({x}, {y}) has number: {pixel_number} and value: {pixel_value}") + # Clear the previous highlight if arrow: arrow.remove() if rect: rect.remove() - + # Draw an arrow pointing to the clicked pixel with detailed information - arrow = ax.annotate(f'({x}, {y})\nNumber: {pixel_number}\nValue: {pixel_value}', - xy=(x, y), xytext=(x+10, y+10), - arrowprops=dict(facecolor='red', shrink=0.05), - bbox=dict(boxstyle="round,pad=0.3", edgecolor='red', facecolor='white')) - + arrow = ax.annotate( + f"({x}, {y})\nNumber: {pixel_number}\nValue: {pixel_value}", + xy=(x, y), + xytext=(x + 10, y + 10), + arrowprops=dict(facecolor="red", shrink=0.05), + bbox=dict(boxstyle="round,pad=0.3", edgecolor="red", facecolor="white"), + ) + # Draw a rectangle around the clicked pixel - rect = plt.Rectangle((x-0.5, y-0.5), 1, 1, edgecolor='red', facecolor='none') + rect = plt.Rectangle( + (x - 0.5, y - 0.5), 1, 1, edgecolor="red", facecolor="none" + ) ax.add_patch(rect) - + fig.canvas.draw() + # Function to highlight all non-zero pixels def highlight_non_zero(event): global scatter @@ -49,14 +57,15 @@ def highlight_non_zero(event): else: non_zero_pixels = np.argwhere(data != 0) y, x = non_zero_pixels[:, 0], non_zero_pixels[:, 1] - scatter = ax.scatter(x, y, color='blue', s=10) - + scatter = ax.scatter(x, y, color="blue", s=10) + fig.canvas.draw() + # Load and display the image fig, ax = plt.subplots() plt.subplots_adjust(bottom=0.2) # Adjust to make space for the button -ax.imshow(data, cmap='gray') +ax.imshow(data, cmap="gray") # Define origin zero_x, zero_y = 0, 192 # Adjust these values to set a different origin @@ -67,13 +76,13 @@ def highlight_non_zero(event): scatter = None # Connect the click event -cid = fig.canvas.mpl_connect('button_press_event', onclick) +cid = fig.canvas.mpl_connect("button_press_event", onclick) # Add a button to highlight non-zero pixels ax_button = plt.axes([0.8, 0.05, 0.1, 0.075]) -btn = Button(ax_button, 'Toggle Non-Zero') +btn = Button(ax_button, "Toggle Non-Zero") btn.on_clicked(highlight_non_zero) # plt.tight_layout() -plt.show() \ No newline at end of file +plt.show() diff --git a/example_simple.py b/example_simple.py index 7698f2d..b62c8b1 100755 --- a/example_simple.py +++ b/example_simple.py @@ -1,8 +1,9 @@ #!/usr/bin/python3 import time + import numpy as np -import irpythermal +import irpythermal # create camera object and do a initial calibration cap = irpythermal.HT301() @@ -14,26 +15,49 @@ info, temperature_lookup_table = cap.info() point = (10, 20) -print('temperature at point:', point, 'is:', temperature_lookup_table[frame[point]], '°C', '[raw ADC value:', frame[point], ']') -#print('additional info:', info) - -time.sleep(5) # not needed -print('click, click') +print( + "temperature at point:", + point, + "is:", + temperature_lookup_table[frame[point]], + "°C", + "[raw ADC value:", + frame[point], + "]", +) +# print('additional info:', info) + +time.sleep(5) # not needed +print("click, click") cap.calibrate() -time.sleep(5) # not needed +time.sleep(5) # not needed # read next frame ret, frame = cap.read() info, temperature_lookup_table = cap.info() -print('temperature at point:', point, 'is:', temperature_lookup_table[frame[point]], '°C', '[raw ADC value:', frame[point], ']') -#print('additional info:', info) - -print('temperature at any point:', temperature_lookup_table[frame]) -print('frame shape:', frame.shape, 'data type:', frame.dtype) -#result: frame shape: (288, 384) data type: uint16 -print('T lut shape:', temperature_lookup_table.shape, 'data type:', temperature_lookup_table.dtype) -#result: T lut shape: (16384,) data type: float64 +print( + "temperature at point:", + point, + "is:", + temperature_lookup_table[frame[point]], + "°C", + "[raw ADC value:", + frame[point], + "]", +) +# print('additional info:', info) + +print("temperature at any point:", temperature_lookup_table[frame]) +print("frame shape:", frame.shape, "data type:", frame.dtype) +# result: frame shape: (288, 384) data type: uint16 +print( + "T lut shape:", + temperature_lookup_table.shape, + "data type:", + temperature_lookup_table.dtype, +) +# result: T lut shape: (16384,) data type: float64 # release camera object cap.release() diff --git a/irpythermal.py b/irpythermal.py index 4c37a13..2f6522a 100755 --- a/irpythermal.py +++ b/irpythermal.py @@ -1,35 +1,40 @@ #!/usr/bin/python3 import math -from sys import platform -from typing import Tuple import time +from sys import platform from time import sleep +from typing import Tuple import cv2 import numpy as np -SET_CORRECTION = 0 * 4 -SET_REFLECTION = 1 * 4 -SET_AMB = 2 * 4 -SET_HUMIDITY = 3 * 4 -SET_EMISSIVITY = 4 * 4 -SET_DISTANCE = 5 * 4 +SET_CORRECTION = 0 * 4 +SET_REFLECTION = 1 * 4 +SET_AMB = 2 * 4 +SET_HUMIDITY = 3 * 4 +SET_EMISSIVITY = 4 * 4 +SET_DISTANCE = 5 * 4 ROWS_SPECIAL_DATA = 4 + def read_u16(arr_u16, offset): - ''' arr: np.uint16 ''' + """arr: np.uint16""" return arr_u16[offset] + def read_f32(arr_u16, offset, step=2): - ''' arr: np.uint16 ''' - return arr_u16[offset:offset+step].view(np.float32)[0] + """arr: np.uint16""" + return arr_u16[offset : offset + step].view(np.float32)[0] + def read_u8(arr_u16, offset, step): - return arr_u16[offset:offset + step].view(np.uint8) + return arr_u16[offset : offset + step].view(np.uint8) + class Camera: """Class for reading data from the XTherm/HT301/InfiRay thermal cameras""" + supported_resolutions = {(240, 180), (256, 192), (384, 288), (640, 512)} ZEROC = 273.15 distance_multiplier = 1.0 @@ -39,37 +44,42 @@ class Camera: range = 120 cal_00_offset = 390.0 cal_00_fpamul = 7.05 - + correction_coefficient_m = 1 correction_coefficient_b = 0 - - height:int - width:int - frame_width:int - frame_height:int - frame:np.ndarray - frame_raw:np.ndarray - meta:np.ndarray - device_strings:Tuple[str, str, str, str, str, str] - userArea:int - amountPixels:int - fourLinePara:int - cap:cv2.VideoCapture - frame_raw_u16:np.ndarray + + height: int + width: int + frame_width: int + frame_height: int + frame: np.ndarray + frame_raw: np.ndarray + meta: np.ndarray + device_strings: Tuple[str, str, str, str, str, str] + userArea: int + amountPixels: int + fourLinePara: int + cap: cv2.VideoCapture + frame_raw_u16: np.ndarray camera_raw = False reference_frame = None offset_mean = 0.0 dead_pixels_mask = None - def __init__(self, video_dev:cv2.VideoCapture|None=None, camera_raw = False, fixed_offset : float = 0.0) -> None: + def __init__( + self, + video_dev: cv2.VideoCapture | None = None, + camera_raw=False, + fixed_offset: float = 0.0, + ) -> None: if video_dev is None: video_dev = self.find_device() if not video_dev: raise Exception("No video device found!") self.cap = video_dev self.camera_raw = camera_raw - self.height = int(self.cap.get(cv2.CAP_PROP_FRAME_HEIGHT))-ROWS_SPECIAL_DATA + self.height = int(self.cap.get(cv2.CAP_PROP_FRAME_HEIGHT)) - ROWS_SPECIAL_DATA self.width = int(self.cap.get(cv2.CAP_PROP_FRAME_WIDTH)) self.frame_rate = self.cap.get(cv2.CAP_PROP_FPS) @@ -78,14 +88,13 @@ def __init__(self, video_dev:cv2.VideoCapture|None=None, camera_raw = False, fix self.fourLinePara = self.width * self.height self.init_parameters() self.userArea = self.amountPixels + 127 - # Decide whether or not convert data to RGB self.cap.set(cv2.CAP_PROP_CONVERT_RGB, 0) - + # using Raw mode 16 bit data self.cap.set(cv2.CAP_PROP_ZOOM, 0x8004) - + # Wait for the camera to apply the temperature range change self.wait_for_range_application() @@ -97,125 +106,183 @@ def get_resolution(self) -> Tuple[int, int]: def find_device(cls) -> cv2.VideoCapture: """Find a supported thermal camera - - Optionally narrow down the resultion of the camera too look for.""" + + Optionally narrow down the resultion of the camera too look for.""" for i in range(10): try: - if platform.startswith('linux'): + if platform.startswith("linux"): cap = cv2.VideoCapture(i, cv2.CAP_V4L2) else: cap = cv2.VideoCapture(i) - + cap_width = cap.get(cv2.CAP_PROP_FRAME_WIDTH) cap_height = cap.get(cv2.CAP_PROP_FRAME_HEIGHT) - print(f"Found a camera {i} with resolution {int(cap_width)}x{int(cap_height)}") - - if (cap_width, cap_height-ROWS_SPECIAL_DATA) in cls.supported_resolutions: + print( + f"Found a camera {i} with resolution {int(cap_width)}x{int(cap_height)}" + ) + + if ( + cap_width, + cap_height - ROWS_SPECIAL_DATA, + ) in cls.supported_resolutions: return cap - except: pass - raise ValueError(f"Cannot find camera with a width of one of {cls.supported_resolutions} that also matches: {width=} and {height=}") + except: + pass + raise ValueError( + f"Cannot find camera with a width of one of {cls.supported_resolutions} that also matches: {width=} and {height=}" + ) def bin_to_twos_complement(self, binary: str) -> int: - if binary[0] == '1': - return int(binary, 2) - 2**len(binary) + if binary[0] == "1": + return int(binary, 2) - 2 ** len(binary) return int(binary, 2) def info(self) -> Tuple[dict, np.ndarray]: - shutTemper = read_u16(self.frame_raw_u16, self.fourLinePara + self.amountPixels + 1) # 257 + shutTemper = read_u16( + self.frame_raw_u16, self.fourLinePara + self.amountPixels + 1 + ) # 257 if self.camera_raw: if shutTemper < 2049: floatShutTemper = float(shutTemper) corrFactor = 0.625 else: - floatShutTemper = float(0xfff - shutTemper) + floatShutTemper = float(0xFFF - shutTemper) corrFactor = -0.625 - shutterFix = self.bin_to_twos_complement((bin(read_u16(self.frame_raw_u16, self.fourLinePara + self.amountPixels * 2 + 47))[2:].zfill(16))[:8]) / 10.0 # 559 + shutterFix = ( + self.bin_to_twos_complement( + ( + bin( + read_u16( + self.frame_raw_u16, + self.fourLinePara + self.amountPixels * 2 + 47, + ) + )[2:].zfill(16) + )[:8] + ) + / 10.0 + ) # 559 floatShutTemper = (floatShutTemper * corrFactor + 2731.5) / 10.0 + -273.15 floatShutTemper = floatShutTemper + shutterFix # TODO fix this readout for the T2S+ v2 # The temperature is indeed being red out, but the sensor is located in some weird place, # it gets hot super fast and causes the entire image to drift, I couldn't figure out how to deal with that # hard coding ~18C (room temp) works pretty good tho... - #floatShutTemper = 18.0 + # floatShutTemper = 18.0 else: floatShutTemper = shutTemper / 10.0 - self.ZEROC - coreTemper = read_u16(self.frame_raw_u16, self.fourLinePara + self.amountPixels + 2) # 258 + coreTemper = read_u16( + self.frame_raw_u16, self.fourLinePara + self.amountPixels + 2 + ) # 258 if self.camera_raw: # TODO fix this readout for the T2S+ v2 # I don't even think the v2 has a separate core and shutter temperature registers... - #floatCoreTemper = 18.0 + # floatCoreTemper = 18.0 floatCoreTemper = floatShutTemper - shutterFix - #floatShutTemper = 18.0 + # floatShutTemper = 18.0 else: floatCoreTemper = coreTemper / 10.0 - self.ZEROC # print(f"Shutter temperature: {floatShutTemper}°C, Core temperature: {coreTemper / 10.0 - self.ZEROC}°C") - + # TODO check all of these - cal_00 = float(read_u16(self.frame_raw_u16, self.fourLinePara + self.amountPixels)) # 256 - self.cal_01 = read_f32(self.frame_raw_u16, self.fourLinePara + self.amountPixels + 3) # 259 - cal_02 = read_f32(self.frame_raw_u16, self.fourLinePara + self.amountPixels + 5) # 261 - cal_03 = read_f32(self.frame_raw_u16, self.fourLinePara + self.amountPixels + 7) # 263 - cal_04 = read_f32(self.frame_raw_u16, self.fourLinePara + self.amountPixels + 9) # 265 - cal_05 = read_f32(self.frame_raw_u16, self.fourLinePara + self.amountPixels + 11) # 267 - - cameraSoftVersion: np.ndarray = read_u8(self.frame_raw_u16, self.fourLinePara + self.amountPixels + 24, step=8) # 280-287? + cal_00 = float( + read_u16(self.frame_raw_u16, self.fourLinePara + self.amountPixels) + ) # 256 + self.cal_01 = read_f32( + self.frame_raw_u16, self.fourLinePara + self.amountPixels + 3 + ) # 259 + cal_02 = read_f32( + self.frame_raw_u16, self.fourLinePara + self.amountPixels + 5 + ) # 261 + cal_03 = read_f32( + self.frame_raw_u16, self.fourLinePara + self.amountPixels + 7 + ) # 263 + cal_04 = read_f32( + self.frame_raw_u16, self.fourLinePara + self.amountPixels + 9 + ) # 265 + cal_05 = read_f32( + self.frame_raw_u16, self.fourLinePara + self.amountPixels + 11 + ) # 267 + + cameraSoftVersion: np.ndarray = read_u8( + self.frame_raw_u16, self.fourLinePara + self.amountPixels + 24, step=8 + ) # 280-287? cameraSoftVersion = cameraSoftVersion.tobytes().decode("ascii").rstrip("\x00") - + # this one is reading out incorrectly? - sn: np.ndarray = read_u8(self.frame_raw_u16, self.fourLinePara + self.amountPixels + 32, step=3) # 288-290? - sn = sn.tobytes().decode("ascii").rstrip("\x00") - - correction = read_f32(self.frame_raw_u16, self.fourLinePara + self.userArea) # 383 - Refltmp = read_f32(self.frame_raw_u16, self.fourLinePara + self.userArea + 2) # 385 - Airtmp = read_f32(self.frame_raw_u16, self.fourLinePara + self.userArea + 4) # 387 - humi = read_f32(self.frame_raw_u16, self.fourLinePara + self.userArea + 6) # 389 - emiss = read_f32(self.frame_raw_u16, self.fourLinePara + self.userArea + 8) # 391 - distance = read_u16(self.frame_raw_u16, self.fourLinePara + self.userArea + 10) # 393 - - fpa_avg = read_u16(self.frame_raw_u16, self.fourLinePara) # 0 - fpaTmp = read_u16(self.frame_raw_u16, self.fourLinePara + 1) # 1 - maxx1 = read_u16(self.frame_raw_u16, self.fourLinePara + 2) # 2 - maxy1 = read_u16(self.frame_raw_u16, self.fourLinePara + 3) # 3 - self.max_raw = read_u16(self.frame_raw_u16, self.fourLinePara + 4) # 4 - minx1 = read_u16(self.frame_raw_u16, self.fourLinePara + 5) # 5 - miny1 = read_u16(self.frame_raw_u16, self.fourLinePara + 6) # 6 - self.min_raw = read_u16(self.frame_raw_u16, self.fourLinePara + 7) # 7 - self.avg_raw = read_u16(self.frame_raw_u16, self.fourLinePara + 8) # 8 - + sn: np.ndarray = read_u8( + self.frame_raw_u16, self.fourLinePara + self.amountPixels + 32, step=3 + ) # 288-290? + sn = sn.tobytes().decode("ascii").rstrip("\x00") + + correction = read_f32( + self.frame_raw_u16, self.fourLinePara + self.userArea + ) # 383 + Refltmp = read_f32( + self.frame_raw_u16, self.fourLinePara + self.userArea + 2 + ) # 385 + Airtmp = read_f32( + self.frame_raw_u16, self.fourLinePara + self.userArea + 4 + ) # 387 + humi = read_f32( + self.frame_raw_u16, self.fourLinePara + self.userArea + 6 + ) # 389 + emiss = read_f32( + self.frame_raw_u16, self.fourLinePara + self.userArea + 8 + ) # 391 + distance = read_u16( + self.frame_raw_u16, self.fourLinePara + self.userArea + 10 + ) # 393 + + fpa_avg = read_u16(self.frame_raw_u16, self.fourLinePara) # 0 + fpaTmp = read_u16(self.frame_raw_u16, self.fourLinePara + 1) # 1 + maxx1 = read_u16(self.frame_raw_u16, self.fourLinePara + 2) # 2 + maxy1 = read_u16(self.frame_raw_u16, self.fourLinePara + 3) # 3 + self.max_raw = read_u16(self.frame_raw_u16, self.fourLinePara + 4) # 4 + minx1 = read_u16(self.frame_raw_u16, self.fourLinePara + 5) # 5 + miny1 = read_u16(self.frame_raw_u16, self.fourLinePara + 6) # 6 + self.min_raw = read_u16(self.frame_raw_u16, self.fourLinePara + 7) # 7 + self.avg_raw = read_u16(self.frame_raw_u16, self.fourLinePara + 8) # 8 + fpatmp_ = 20.0 - (float(fpaTmp) - self.fpa_off) / self.fpa_div - - center_raw = read_u16(self.frame_raw_u16, self.fourLinePara + 12) # 12 - user_raw00 = read_u16(self.frame_raw_u16, self.fourLinePara + 13) # 13 - user_raw01 = read_u16(self.frame_raw_u16, self.fourLinePara + 14) # 14 - user_raw02 = read_u16(self.frame_raw_u16, self.fourLinePara + 15) # 15 - - distance_adjusted = (20.0 if distance >= 20.0 else distance) * self.distance_multiplier + + center_raw = read_u16(self.frame_raw_u16, self.fourLinePara + 12) # 12 + user_raw00 = read_u16(self.frame_raw_u16, self.fourLinePara + 13) # 13 + user_raw01 = read_u16(self.frame_raw_u16, self.fourLinePara + 14) # 14 + user_raw02 = read_u16(self.frame_raw_u16, self.fourLinePara + 15) # 15 + + distance_adjusted = ( + 20.0 if distance >= 20.0 else distance + ) * self.distance_multiplier atm = self.atmt(humi, Airtmp, distance_adjusted) - self.numerator_sub = (1.0 - emiss) * atm * math.pow(Refltmp + self.ZEROC, 4) + (1.0 - atm) * math.pow(Airtmp + self.ZEROC, 4) + self.numerator_sub = (1.0 - emiss) * atm * math.pow(Refltmp + self.ZEROC, 4) + ( + 1.0 - atm + ) * math.pow(Airtmp + self.ZEROC, 4) self.denominator = emiss * atm - + ts = floatShutTemper + self.offset_temp_shutter tfpa = fpatmp_ + self.offset_temp_fpa - + self.cal_a = cal_02 / (self.cal_01 + self.cal_01) self.cal_b = cal_02 * cal_02 / (self.cal_01 * self.cal_01 * 4.0) self.cal_c = self.cal_01 * math.pow(ts, 2) + ts * cal_02 self.cal_d = cal_03 * math.pow(tfpa, 2) + cal_04 * tfpa + cal_05 cal_00_corr = 0 - + if self.range == 120: cal_00_corr = int(self.cal_00_offset - tfpa * self.cal_00_fpamul) - + table_offset = cal_00 - (cal_00_corr if cal_00_corr > 0 else 0) - - temperatureTable = self.get_temp_table(correction, Airtmp, table_offset, distance_adjusted) + + temperatureTable = self.get_temp_table( + correction, Airtmp, table_offset, distance_adjusted + ) temperatureTable = temperatureTable + self.userOffset - - ''' build infomation ''' + + """ build infomation """ info = { "temp_shutter": floatShutTemper, "temp_core": floatCoreTemper, @@ -245,7 +312,7 @@ def info(self) -> Tuple[dict, np.ndarray]: "temp_user_01": temperatureTable[user_raw01], "temp_user_02": temperatureTable[user_raw02], "Tmin_point": (minx1, miny1), - "Tmax_point": (maxx1, maxy1), + "Tmax_point": (maxx1, maxy1), "Tcenter_point": (self.width // 2, self.height // 2), "Tmin_C": temperatureTable[self.min_raw], "Tmax_C": temperatureTable[self.max_raw], @@ -253,13 +320,17 @@ def info(self) -> Tuple[dict, np.ndarray]: } return info, temperatureTable - + # read raw data from cam, seperate visible frame from metadata - def read(self, raw = False) -> Tuple[bool, np.ndarray]: + def read(self, raw=False) -> Tuple[bool, np.ndarray]: """Retunrs a raw frame from the camera""" ret, frame_raw = self.cap.read() self.frame_raw_u16: np.ndarray = frame_raw.view(np.uint16).ravel() - frame_visible = self.frame_raw_u16[:self.fourLinePara].copy().reshape(self.height, self.width) + frame_visible = ( + self.frame_raw_u16[: self.fourLinePara] + .copy() + .reshape(self.height, self.width) + ) if raw: return ret, frame_visible if self.reference_frame is not None: @@ -271,10 +342,15 @@ def read(self, raw = False) -> Tuple[bool, np.ndarray]: if self.dead_pixels_mask is not None: inpaint_radius = 3 - corrected_frame = cv2.inpaint(corrected_frame, self.dead_pixels_mask, inpaint_radius, cv2.INPAINT_TELEA) + corrected_frame = cv2.inpaint( + corrected_frame, + self.dead_pixels_mask, + inpaint_radius, + cv2.INPAINT_TELEA, + ) frame_visible = corrected_frame.astype(np.uint16) - + return ret, frame_visible def get_frame(self) -> np.ndarray: @@ -283,98 +359,103 @@ def get_frame(self) -> np.ndarray: info, lut = self.info() lut_frame = lut[frame] return lut_frame - + def convert_to_frame(self, frame_raw: np.ndarray, lut: np.ndarray) -> np.ndarray: """Converts a raw frame to a frame with temperature values""" - return lut[frame_raw] + return lut[frame_raw] def set_correction(self, correction: float) -> None: self.sendFloatCommand(position=SET_CORRECTION, value=correction) - + def set_reflection(self, reflection: float) -> None: self.sendFloatCommand(position=SET_REFLECTION, value=reflection) def set_amb(self, amb: float) -> None: self.sendFloatCommand(position=SET_AMB, value=amb) - + def set_humidity(self, humidity: float) -> None: self.sendFloatCommand(position=SET_HUMIDITY, value=humidity) - + def set_emissivity(self, emiss: float) -> None: self.sendFloatCommand(position=SET_EMISSIVITY, value=emiss) - + def set_distance(self, distance: int) -> None: self.sendUshortCommand(position=SET_DISTANCE, value=distance) - ''' Control methods''' + """ Control methods""" + # send command and a float value to camera def sendFloatCommand(self, position: int, value: float) -> None: # Split float to 4 bytes b0, b1, b2, b3 = np.array([value], dtype=np.float32).view(np.uint8) - - positionAndValue0 = (position << 8) | (0x000000ff & b0) + + positionAndValue0 = (position << 8) | (0x000000FF & b0) if not self.cap.set(cv2.CAP_PROP_ZOOM, positionAndValue0): print("Control fail {}".format(positionAndValue0)) - - positionAndValue1 = ((position + 1) << 8) | (0x000000ff & b1) + + positionAndValue1 = ((position + 1) << 8) | (0x000000FF & b1) if not self.cap.set(cv2.CAP_PROP_ZOOM, positionAndValue1): print("Control fail {}".format(positionAndValue1)) - - positionAndValue2 = ((position + 2) << 8) | (0x000000ff & b2) + + positionAndValue2 = ((position + 2) << 8) | (0x000000FF & b2) if not self.cap.set(cv2.CAP_PROP_ZOOM, positionAndValue2): print("Control fail {}".format(positionAndValue2)) - positionAndValue3 = ((position + 3) << 8) | (0x000000ff & b3) + positionAndValue3 = ((position + 3) << 8) | (0x000000FF & b3) if not self.cap.set(cv2.CAP_PROP_ZOOM, positionAndValue3): print("Control fail {}".format(positionAndValue3)) # send command and 16 bit value to camera def sendUshortCommand(self, position: int, value: int) -> None: value0, value1 = np.array([value], dtype=np.uint16).view(np.uint8) - positionAndValue0 = (position << 8) | (0x000000ff & value0) + positionAndValue0 = (position << 8) | (0x000000FF & value0) if not self.cap.set(cv2.CAP_PROP_ZOOM, positionAndValue0): print("Control fail {}".format(positionAndValue0)) - - positionAndValue1 = ((position + 1) << 8) | (0x000000ff & value1) + + positionAndValue1 = ((position + 1) << 8) | (0x000000FF & value1) if not self.cap.set(cv2.CAP_PROP_ZOOM, positionAndValue1): print("Control fail {}".format(positionAndValue1)) # send command and byte value to camera def sendByteCommand(self, position: int, value: int) -> None: value0 = np.array([value], dtype=np.uint8)[0] - psitionAndValue0 = (position << 8) | (0x000000ff & value0) + psitionAndValue0 = (position << 8) | (0x000000FF & value0) self.cap.set(cv2.CAP_PROP_ZOOM, psitionAndValue0) # save set parameters def save_parameters(self) -> None: - self.cap.set(cv2.CAP_PROP_ZOOM, 0x80ff) + self.cap.set(cv2.CAP_PROP_ZOOM, 0x80FF) # set custom point to measure temperature def set_point(self, x: int, y: int, index: int) -> None: match index: case 0: - x1 = 0xf000 + x - y1 = 0xf200 + y + x1 = 0xF000 + x + y1 = 0xF200 + y case 1: - x1 = 0xf400 + x - y1 = 0xf600 + y + x1 = 0xF400 + x + y1 = 0xF600 + y case 2: - x1 = 0xf800 + x - y1 = 0xfa00 + y + x1 = 0xF800 + x + y1 = 0xFA00 + y case _: - raise ValueError("Invalid index: {}.\nCan only set 3 custom points to measure temperature at indexes: {}, {}, {}".format(index, 0, 1, 2)) - + raise ValueError( + "Invalid index: {}.\nCan only set 3 custom points to measure temperature at indexes: {}, {}, {}".format( + index, 0, 1, 2 + ) + ) + self.cap.set(cv2.CAP_PROP_ZOOM, x1) self.cap.set(cv2.CAP_PROP_ZOOM, y1) def calibrate_raw(self, quiet=False) -> None: - '''Camera calibration for cameras that return raw data only''' + """Camera calibration for cameras that return raw data only""" self.reference_frame = None self.offset_mean = 0.0 self.dead_pixels_mask = None # uniformity correction sleep(0.5) - self.cap.set(cv2.CAP_PROP_ZOOM, 0x8000) # close shutter + self.cap.set(cv2.CAP_PROP_ZOOM, 0x8000) # close shutter sleep(0.3) # wait for the shutter to close self.flush_buffer() # by issuing this command faster than once per second, we can keep the shutter closed @@ -392,30 +473,34 @@ def calibrate_raw(self, quiet=False) -> None: min_val = np.min(frame_visible_float) max_val = np.max(frame_visible_float) print(f"Min: {min_val}, Max: {max_val}, Avg: {np.mean(frame_visible_float)}") - threshold_margin = (max_val - min_val) * 0.05 # Adjust the margin if not detected correctly + threshold_margin = ( + max_val - min_val + ) * 0.05 # Adjust the margin if not detected correctly threshold = min_val + threshold_margin # if there are no dead pixels, we skip the dead pixel correction if np.count_nonzero(frame_visible_float < threshold) != 0: - self.dead_pixels_mask = cv2.inRange(frame_visible_float, 0, threshold).astype(np.uint8) + self.dead_pixels_mask = cv2.inRange( + frame_visible_float, 0, threshold + ).astype(np.uint8) if not quiet: print(f"Found {np.count_nonzero(self.dead_pixels_mask)} dead pixels") print(f"At: {np.argwhere(self.dead_pixels_mask)}") def calibrate(self, quiet=False) -> None: - '''camera calibration''' + """camera calibration""" if self.camera_raw: self.calibrate_raw(quiet=quiet) else: self.cap.set(cv2.CAP_PROP_ZOOM, 0x8000) def release(self) -> None: - ''' Release cap opencv ''' + """Release cap opencv""" self.cap.release() def init_parameters(self) -> None: - ''' Initalize parameters based on thermal camera resolution ''' + """Initalize parameters based on thermal camera resolution""" match self.width: case 640: self.fpa_off = 6867 @@ -424,7 +509,7 @@ def init_parameters(self) -> None: case 384: self.fpa_off = 7800 self.fpa_div = 36.0 - self.amountPixels = self.width * 3 + self.amountPixels = self.width * 3 case 256: self.fpa_off = 8617 self.fpa_div = 37.682 @@ -435,45 +520,69 @@ def init_parameters(self) -> None: self.fpa_off = 7800 self.fpa_div = 36.0 self.amountPixels = self.width - case _: raise ValueError("{} does not match supported device".format(self.width)) - + case _: + raise ValueError( + "{} does not match supported device".format(self.width) + ) + + """ Temperature calculation """ - - ''' Temperature calculation ''' # Water vapor coefficient from humidity and ambient temperature def wvc(self, h: float, t_atm: float): h1 = 1.5587 h2 = 0.06939 h3 = -2.7816e-4 h4 = 6.8455e-7 - return h * math.exp(h1 + h2 * t_atm + h3 * math.pow(t_atm, 2) + h4 * math.pow(t_atm, 3)) + return h * math.exp( + h1 + h2 * t_atm + h3 * math.pow(t_atm, 2) + h4 * math.pow(t_atm, 3) + ) # Transmittance of the atmosphere from humitity, ambient temperature and distance. def atmt(self, h: float, t_atm: float, d: float): k_atm = 1.9 nsqd = -math.sqrt(d) sqw = math.sqrt(self.wvc(h, t_atm)) - - '''Athmospheric attenuation without water vapor''' + + """Athmospheric attenuation without water vapor""" a1 = 0.006569 a2 = 0.01262 - - '''Attenuation for water vapor.''' + + """Attenuation for water vapor.""" b1 = -0.002276 b2 = -0.00667 - return k_atm * math.exp(nsqd * (a1 + b1 * sqw)) + (1.0 - k_atm) * math.exp(nsqd * (a2 + b2 * sqw)) + return k_atm * math.exp(nsqd * (a1 + b1 * sqw)) + (1.0 - k_atm) * math.exp( + nsqd * (a2 + b2 * sqw) + ) - # calculate temperature table + # calculate temperature table # for each 16 bit value from frame data will return correspond temperture value def get_temp_table(self, correction, Airtmp, table_offset, distance_adjusted): - ''' x: uint16 ''' - n = np.sqrt(np.abs(((np.arange(16384, dtype=np.float32) - table_offset) * self.cal_d + self.cal_c) / self.cal_01 + self.cal_b)) - n[np.isnan(n)] = 0.0 + """x: uint16""" + n = np.sqrt( + np.abs( + ( + (np.arange(16384, dtype=np.float32) - table_offset) * self.cal_d + + self.cal_c + ) + / self.cal_01 + + self.cal_b + ) + ) + n[np.isnan(n)] = 0.0 wtot = np.power(n - self.cal_a + self.ZEROC, 4) - ttot = np.power((wtot - self.numerator_sub) / self.denominator, 0.25) - self.ZEROC + ttot = ( + np.power((wtot - self.numerator_sub) / self.denominator, 0.25) - self.ZEROC + ) # TODO, ttot is being directly read out according to the decomp, how is it calculated here exactly? (fVar7) offset ~269 - temperatureTable = ttot + (distance_adjusted * 0.85 - 1.125) * (ttot - Airtmp) / 100.0 + correction - return self.correction_coefficient_m * temperatureTable + self.correction_coefficient_b + temperatureTable = ( + ttot + + (distance_adjusted * 0.85 - 1.125) * (ttot - Airtmp) / 100.0 + + correction + ) + return ( + self.correction_coefficient_m * temperatureTable + + self.correction_coefficient_b + ) def temperature_range_normal(self): """Switch camera to the normal temperature range (-20°C to 120°C)""" @@ -525,16 +634,16 @@ def wait_for_range_application(self, timeout=20): if std > min_val and lowest - std < margin: print(f"Camera is stable with std: {std}") return True - + if std < lowest and std > min_val: lowest = std - - elif done: + + elif done: print("Camera is stable") return True return False - + def flush_buffer(self, num_reads=16): for i in range(num_reads): ret, frame_visible = self.read(raw=True) @@ -543,12 +652,12 @@ def flush_buffer(self, num_reads=16): class MockVidoCapture: def set(self, propId, value): setattr(self, str(propId), value) + def get(self, propId): return getattr(self, str(propId)) class CameraEmulator(Camera): - def __init__(self, filename): frame_raw_u16 = np.load(filename, allow_pickle=True) self.cap = MockVidoCapture() @@ -556,7 +665,12 @@ def __init__(self, filename): self.cap.set(cv2.CAP_PROP_FRAME_WIDTH, frame_raw_u16.shape[1]) self.frame_raw_u16 = frame_raw_u16.ravel() super().__init__(video_dev=self.cap) + def read(self) -> Tuple[bool, np.ndarray]: ret = True - frame_visible = self.frame_raw_u16[:self.fourLinePara].copy().reshape(self.height, self.width) + frame_visible = ( + self.frame_raw_u16[: self.fourLinePara] + .copy() + .reshape(self.height, self.width) + ) return ret, frame_visible diff --git a/opencv.py b/opencv.py index 92fb773..6fd5b6b 100755 --- a/opencv.py +++ b/opencv.py @@ -1,12 +1,14 @@ - #!/usr/bin/python3 -import numpy as np +import pickle +import time + import cv2 +import numpy as np +from skimage.exposure import equalize_hist, rescale_intensity + import irpythermal import utils -import time -from skimage.exposure import rescale_intensity, equalize_hist -import pickle + draw_temp = True # cap = ht301_hacklib.HT301() @@ -173,7 +175,7 @@ def get_fps(self): # some delay is needed before calibration for _ in range(50): camera.read() - camera.calibrate() + camera.calibrate() if key == ord("s"): cv2.imwrite(time.strftime("%Y-%m-%d_%H-%M-%S") + ".png", frame) if key == ord("o"): @@ -183,7 +185,7 @@ def get_fps(self): if key == ord("a"): # save to disk ret, frame = camera.cap.read() - data = (frame) + data = frame name = time.strftime("%Y-%m-%d_%H-%M-%S") + ".pkl" with open(name, "wb") as f: pickle.dump(data, f) diff --git a/poetry.lock b/poetry.lock index 67d03b1..a8cad58 100644 --- a/poetry.lock +++ b/poetry.lock @@ -589,6 +589,33 @@ files = [ [package.dependencies] six = ">=1.5" +[[package]] +name = "ruff" +version = "0.7.3" +description = "An extremely fast Python linter and code formatter, written in Rust." +optional = false +python-versions = ">=3.7" +files = [ + {file = "ruff-0.7.3-py3-none-linux_armv6l.whl", hash = "sha256:34f2339dc22687ec7e7002792d1f50712bf84a13d5152e75712ac08be565d344"}, + {file = "ruff-0.7.3-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:fb397332a1879b9764a3455a0bb1087bda876c2db8aca3a3cbb67b3dbce8cda0"}, + {file = "ruff-0.7.3-py3-none-macosx_11_0_arm64.whl", hash = "sha256:37d0b619546103274e7f62643d14e1adcbccb242efda4e4bdb9544d7764782e9"}, + {file = "ruff-0.7.3-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5d59f0c3ee4d1a6787614e7135b72e21024875266101142a09a61439cb6e38a5"}, + {file = "ruff-0.7.3-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:44eb93c2499a169d49fafd07bc62ac89b1bc800b197e50ff4633aed212569299"}, + {file = "ruff-0.7.3-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6d0242ce53f3a576c35ee32d907475a8d569944c0407f91d207c8af5be5dae4e"}, + {file = "ruff-0.7.3-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:6b6224af8b5e09772c2ecb8dc9f3f344c1aa48201c7f07e7315367f6dd90ac29"}, + {file = "ruff-0.7.3-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c50f95a82b94421c964fae4c27c0242890a20fe67d203d127e84fbb8013855f5"}, + {file = "ruff-0.7.3-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7f3eff9961b5d2644bcf1616c606e93baa2d6b349e8aa8b035f654df252c8c67"}, + {file = "ruff-0.7.3-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b8963cab06d130c4df2fd52c84e9f10d297826d2e8169ae0c798b6221be1d1d2"}, + {file = "ruff-0.7.3-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:61b46049d6edc0e4317fb14b33bd693245281a3007288b68a3f5b74a22a0746d"}, + {file = "ruff-0.7.3-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:10ebce7696afe4644e8c1a23b3cf8c0f2193a310c18387c06e583ae9ef284de2"}, + {file = "ruff-0.7.3-py3-none-musllinux_1_2_i686.whl", hash = "sha256:3f36d56326b3aef8eeee150b700e519880d1aab92f471eefdef656fd57492aa2"}, + {file = "ruff-0.7.3-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:5d024301109a0007b78d57ab0ba190087b43dce852e552734ebf0b0b85e4fb16"}, + {file = "ruff-0.7.3-py3-none-win32.whl", hash = "sha256:4ba81a5f0c5478aa61674c5a2194de8b02652f17addf8dfc40c8937e6e7d79fc"}, + {file = "ruff-0.7.3-py3-none-win_amd64.whl", hash = "sha256:588a9ff2fecf01025ed065fe28809cd5a53b43505f48b69a1ac7707b1b7e4088"}, + {file = "ruff-0.7.3-py3-none-win_arm64.whl", hash = "sha256:1713e2c5545863cdbfe2cbce21f69ffaf37b813bfd1fb3b90dc9a6f1963f5a8c"}, + {file = "ruff-0.7.3.tar.gz", hash = "sha256:e1d1ba2e40b6e71a61b063354d04be669ab0d39c352461f3d789cac68b54a313"}, +] + [[package]] name = "six" version = "1.16.0" @@ -603,4 +630,4 @@ files = [ [metadata] lock-version = "2.0" python-versions = "^3.10.4" -content-hash = "53b62c7b7d5603fa5b610c6e5d3551c6cd040c9dcf2f4385fc139d63138ef1ed" +content-hash = "0d9d5e276743933f60aa452b48009a492b31d7a40de088594e52c5ae1c774d6a" diff --git a/pyplot.py b/pyplot.py index 4f7b1f7..c3ab871 100755 --- a/pyplot.py +++ b/pyplot.py @@ -1,50 +1,67 @@ #!/usr/bin/env python3 + import argparse -import cv2 -import numpy as np -import matplotlib -import matplotlib.pyplot as plt -import matplotlib.animation as animation -import matplotlib.patches as patches -import utils -import time -import sys import csv import math -import serial +import sys import threading +import time +from datetime import datetime -import irpythermal - +import cv2 +import matplotlib.animation as animation +import matplotlib.patches as patches +import matplotlib.pyplot as plt +import numpy as np +import serial from matplotlib.backend_bases import MouseButton from mpl_toolkits.axes_grid1 import make_axes_locatable -from datetime import datetime - +import irpythermal +import utils fps = 40 -exposure = {'auto': True, - 'auto_type': 'ends', # 'center' or 'ends' - 'T_min': 0., - 'T_max': 50., - 'T_margin': 2.0, +exposure = { + "auto": True, + "auto_type": "ends", # 'center' or 'ends' + "T_min": 0.0, + "T_max": 50.0, + "T_margin": 2.0, } draw_temp = True # Argument parsing -parser = argparse.ArgumentParser(description='Thermal Camera Viewer') -parser.add_argument('-r', '--rawcam', action='store_true', help='use the raw camera') -parser.add_argument('-d', '--device', type=str, help='use the camera at camera_path') -parser.add_argument('-o', '--offset', type=float, help='set a fixed offset for the temperature data') +parser = argparse.ArgumentParser(description="Thermal Camera Viewer") +parser.add_argument("-r", "--rawcam", action="store_true", help="use the raw camera") +parser.add_argument("-d", "--device", type=str, help="use the camera at camera_path") +parser.add_argument( + "-o", "--offset", type=float, help="set a fixed offset for the temperature data" +) # lock in thermometry options (all of these are requred) -parser.add_argument('-l', '--lockin', type=float, help='enable lock-in thermometry with the given frequency (in Hz), ideally several times smaller than the camera fps') -parser.add_argument('-p', '--port', type=str, help='set the serial port for the power supply control (will send 1 to turn on the load, 0 to turn it off new line terminated) at 115200 baud') -parser.add_argument('-i', '--integration', type=float, help='set the integration time for the lock-in thermometry (in seconds)') - - - -parser.add_argument('file', nargs='?', type=str, help='use the emulator with the data in file.npy') +parser.add_argument( + "-l", + "--lockin", + type=float, + help="enable lock-in thermometry with the given frequency (in Hz), ideally several times smaller than the camera fps", +) +parser.add_argument( + "-p", + "--port", + type=str, + help="set the serial port for the power supply control (will send 1 to turn on the load, 0 to turn it off new line terminated) at 115200 baud", +) +parser.add_argument( + "-i", + "--integration", + type=float, + help="set the integration time for the lock-in thermometry (in seconds)", +) + + +parser.add_argument( + "file", nargs="?", type=str, help="use the emulator with the data in file.npy" +) args = parser.parse_args() # Choose the camera class @@ -52,25 +69,27 @@ lockin = False -if args.file and args.file.endswith('.npy'): +if args.file and args.file.endswith(".npy"): camera = irpythermal.CameraEmulator(args.file) else: camera_kwargs = {} if args.rawcam: - camera_kwargs['camera_raw'] = True + camera_kwargs["camera_raw"] = True if args.device: camera_path = args.device cv2_cam = cv2.VideoCapture(camera_path) - camera_kwargs['video_dev'] = cv2_cam + camera_kwargs["video_dev"] = cv2_cam if args.offset: - camera_kwargs['fixed_offset'] = args.offset + camera_kwargs["fixed_offset"] = args.offset if args.lockin: lockin = True draw_temp = False # check if all lock-in thermometry options are provided if not args.port or not args.integration: - print('Error: lock-in thermometry also requires --port and --integration options') + print( + "Error: lock-in thermometry also requires --port and --integration options" + ) sys.exit(1) fequency = args.lockin @@ -79,17 +98,26 @@ camera = irpythermal.Camera(**camera_kwargs) -#see https://matplotlib.org/tutorials/colors/colormaps.html +# see https://matplotlib.org/tutorials/colors/colormaps.html cmaps_idx = 1 -cmaps = ['inferno', 'coolwarm', 'cividis', 'jet', 'nipy_spectral', 'binary', 'gray', 'tab10'] - -#matplotlib.rcParams['toolbar'] = 'None' +cmaps = [ + "inferno", + "coolwarm", + "cividis", + "jet", + "nipy_spectral", + "binary", + "gray", + "tab10", +] + +# matplotlib.rcParams['toolbar'] = 'None' # temporary fake frame -frame = np.full((camera.height, camera.width), 25.) -quad_frame = np.full((camera.height, camera.width), 0.) -in_phase_frame = np.full((camera.height, camera.width), 0.) -lut = None # will be defined later +frame = np.full((camera.height, camera.width), 25.0) +quad_frame = np.full((camera.height, camera.width), 0.0) +in_phase_frame = np.full((camera.height, camera.width), 0.0) +lut = None # will be defined later start_skips = 2 is_capturing = False lock = threading.Lock() @@ -97,14 +125,14 @@ if lockin: - fig, axes = plt.subplots(nrows=2, ncols=2, layout='tight') + fig, axes = plt.subplots(nrows=2, ncols=2, layout="tight") ax = axes[0][0] - im = axes[0][0].imshow(frame, cmap=cmaps[cmaps_idx]) - im_in_phase = axes[0][1].imshow(frame, cmap=cmaps[cmaps_idx]) - im_quadrature = axes[1][1].imshow(frame, cmap=cmaps[cmaps_idx]) - axes[0][0].set_title('Live') - axes[0][1].set_title('In-phase') - axes[1][1].set_title('Quadrature') + im = axes[0][0].imshow(frame, cmap=cmaps[cmaps_idx]) + im_in_phase = axes[0][1].imshow(frame, cmap=cmaps[cmaps_idx]) + im_quadrature = axes[1][1].imshow(frame, cmap=cmaps[cmaps_idx]) + axes[0][0].set_title("Live") + axes[0][1].set_title("In-phase") + axes[1][1].set_title("Quadrature") divider = make_axes_locatable(axes[0][0]) divider_in_phase = make_axes_locatable(axes[0][1]) divider_quadrature = make_axes_locatable(axes[1][1]) @@ -115,7 +143,7 @@ cbar_in_phase = plt.colorbar(im_in_phase, cax=cax_in_phase) cbar_quadrature = plt.colorbar(im_quadrature, cax=cax_quadrature) - axes[1][0].axis('off') + axes[1][0].axis("off") status_text = f""" Frame: -, Time: -/-, @@ -124,12 +152,16 @@ Integration Time: -s Serial Port: - """ - status_text_obj = axes[1][0].text(0.05, 0.95, status_text, - verticalalignment='top', - horizontalalignment='left', - transform=axes[1][0].transAxes, - fontsize=12, - color='black') + status_text_obj = axes[1][0].text( + 0.05, + 0.95, + status_text, + verticalalignment="top", + horizontalalignment="left", + transform=axes[1][0].transAxes, + fontsize=12, + color="black", + ) else: fig = plt.figure() @@ -146,81 +178,79 @@ pass annotations = utils.Annotations(ax, patches) -temp_annotations = { - 'std': { - 'Tmin': 'lightblue', - 'Tmax': 'red', - 'Tcenter': 'yellow' - }, - 'user': {} +temp_annotations = { + "std": {"Tmin": "lightblue", "Tmax": "red", "Tcenter": "yellow"}, + "user": {}, } # Add the patch to the Axes -roi = ((0,0),(0,0)) +roi = ((0, 0), (0, 0)) paused = False update_colormap = True -diff = { 'enabled': False, - 'annotation_enabled': False, - 'frame': np.zeros(frame.shape) -} +diff = {"enabled": False, "annotation_enabled": False, "frame": np.zeros(frame.shape)} csv_filename = None + + def log_annotations_to_csv(annotation_frame): anns_data = [] - for type in ['std', 'user']: + for type in ["std", "user"]: for ann_name in temp_annotations[type]: pos = annotations.get_pos(ann_name) val = round(annotations.get_val(ann_name, annotation_frame), 2) anns_data += [pos[0], pos[1], val] # store each position and value if csv_filename is not None: - with open(csv_filename, 'a', newline='') as f: + with open(csv_filename, "a", newline="") as f: writer = csv.writer(f) writer.writerow([datetime.now()] + anns_data) + import csv -from datetime import datetime #to easily get miliseconds +from datetime import datetime # to easily get miliseconds + csv_filename = None + + def log_annotations_to_csv(annotation_frame): anns_data = [] - for type in ['std', 'user']: + for type in ["std", "user"]: for ann_name in temp_annotations[type]: pos = annotations.get_pos(ann_name) val = round(annotations.get_val(ann_name, annotation_frame), 2) anns_data += [pos[0], pos[1], val] # store each position and value if csv_filename is not None: - with open(csv_filename, 'a', newline='') as f: + with open(csv_filename, "a", newline="") as f: writer = csv.writer(f) writer.writerow([datetime.now()] + anns_data) - def get_lockin_frame(freq, port, integration): - """This function will perform all of the lock-in thermometry operations, and return - the in-phase and quadrature frames after the integration time is up, while controlling + """This function will perform all of the lock-in thermometry operations, and return + the in-phase and quadrature frames after the integration time is up, while controlling the load via serial communication based on the period of the signal.""" - + global frame, is_capturing, status_text try: ser = serial.Serial(port, 115200) # Open the serial port except serial.SerialException as e: - print(f'Error: could not open serial port {port}') + print(f"Error: could not open serial port {port}") sys.exit(1) start_time = time.time() in_phase_sum = np.zeros((camera.height, camera.width)) quadrature_sum = np.zeros((camera.height, camera.width)) total_frames = 0 - + # Calculate the period of the signal period = 1.0 / freq half_period = period / 2.0 # Toggle every half period load_on = True # Track whether the load is on or off last_toggle_time = start_time # Track the last time we toggled the load - + while (time.time() - start_time) < integration: current_time = time.time() - start_time # Time since the loop started ret, raw_frame = camera.read() @@ -229,13 +259,13 @@ def get_lockin_frame(freq, port, integration): frame = camera.convert_to_frame(raw_frame, lut) if not ret: - print('Error: could not read frame from camera') + print("Error: could not read frame from camera") sys.exit(1) - + total_frames += 1 - - #if(total_frames % 10 == 0): - #print(f'Frame: {total_frames}, Time: {current_time:.2f}/{integration:.2f}') # Debugging statement + + # if(total_frames % 10 == 0): + # print(f'Frame: {total_frames}, Time: {current_time:.2f}/{integration:.2f}') # Debugging statement if True: status_text = f""" Frame: {total_frames}, @@ -250,47 +280,47 @@ def get_lockin_frame(freq, port, integration): if current_time - (last_toggle_time - start_time) >= half_period: # Toggle the load state if load_on: - ser.write(b'0\n') # Send 0 to turn the load off + ser.write(b"0\n") # Send 0 to turn the load off load_on = False else: - ser.write(b'1\n') # Send 1 to turn the load on + ser.write(b"1\n") # Send 1 to turn the load on load_on = True - + # print(f'Load state: {load_on}, Time: {current_time}') # Debugging statement - + # Update the last toggle time last_toggle_time += half_period - + # Calculate the phase angle based on the current time and frequency phase = 2 * math.pi * freq * current_time - + # Calculate sine and cosine factors - sin_weight = 2*math.sin(phase) - cos_weight = -2*math.cos(phase) - + sin_weight = 2 * math.sin(phase) + cos_weight = -2 * math.cos(phase) + # print(f"time: {current_time}, phase: {phase}, sin: {sin_weight}, cos: {cos_weight} , load: {load_on}") # Multiply the frame by sin and cos to get in-phase and quadrature components in_phase = raw_frame * sin_weight quadrature = raw_frame * cos_weight - + # Accumulate the sums in_phase_sum += in_phase quadrature_sum += quadrature - if(is_capturing == False): + if is_capturing == False: break - ser.write(b'0\n') + ser.write(b"0\n") ser.close() # After integration time, normalize by the total frames (optional) in_phase_sum /= total_frames quadrature_sum /= total_frames - return in_phase_sum, quadrature_sum + def capture_lock_in(): global is_capturing, quad_frame, in_phase_frame, lock, fequency, port, integration @@ -301,6 +331,7 @@ def capture_lock_in(): in_phase_frame = in_phase quad_frame = quad + def start_capture(): global is_capturing is_capturing = True @@ -308,33 +339,44 @@ def start_capture(): thread.start() return thread + def stop_capture(thread): global is_capturing is_capturing = False if thread is not None: thread.join() + def animate_func(i): - global frame, in_phase_frame, quad_frame, paused, update_colormap, exposure, im, diff, start_skips, lock_in_thread + global \ + frame, \ + in_phase_frame, \ + quad_frame, \ + paused, \ + update_colormap, \ + exposure, \ + im, \ + diff, \ + start_skips, \ + lock_in_thread if lockin and start_skips > 0: frame = camera.get_frame() start_skips -= 1 elif lockin: if is_capturing == False: lock_in_thread = start_capture() - #in_phase_frame, quad_frame = get_lockin_frame(fequency, port, integration) + # in_phase_frame, quad_frame = get_lockin_frame(fequency, port, integration) else: frame = camera.get_frame() if not paused: - - if diff['enabled']: - show_frame = frame - diff['frame'] + if diff["enabled"]: + show_frame = frame - diff["frame"] else: show_frame = frame - if diff['annotation_enabled']: - annotation_frame = frame - diff['frame'] + if diff["annotation_enabled"]: + annotation_frame = frame - diff["frame"] else: annotation_frame = frame @@ -345,14 +387,14 @@ def animate_func(i): annotations.update(temp_annotations, annotation_frame, draw_temp) - if exposure['auto']: + if exposure["auto"]: update_colormap = utils.autoExposure(update_colormap, exposure, show_frame) # TODO deal with saving the lock in stuff to a file log_annotations_to_csv(annotation_frame) if update_colormap: - im.set_clim(exposure['T_min'], exposure['T_max']) + im.set_clim(exposure["T_min"], exposure["T_max"]) fig.canvas.draw_idle() # force update all, even with blit=True update_colormap = False return [] @@ -367,8 +409,9 @@ def animate_func(i): return [im] + annotations.get() + def print_help(): - print('''keys: + print("""keys: 'h' - help 'q' - quit ' ' - pause, resume @@ -383,118 +426,174 @@ def print_help(): 'v' - record annotations data to file date.csv ',', '.' - change color map 'a', 'z' - auto exposure on/off, auto exposure type - 'k', 'l' - set the thermal range to normal/high (supported by T2S+/T2L) + 'k', 'l' - set the thermal range to normal/high (supported by T2S+/T2L) left, right, up, down - set exposure limits mouse: left button - add Region Of Interest (ROI) right button - add user temperature annotation -''') +""") + FILE_NAME_FORMAT = "%Y-%m-%d_%H-%M-%S" -#keyboard + +# keyboard def press(event): - global paused, exposure, update_colormap, cmaps_idx, draw_temp, temp_extra_annotations, csv_filename + global \ + paused, \ + exposure, \ + update_colormap, \ + cmaps_idx, \ + draw_temp, \ + temp_extra_annotations, \ + csv_filename global lut, frame, diff, annotations, roi - if event.key == 'h': print_help() - if event.key == ' ': paused ^= True; print('paused:', paused) - if event.key == 'd': diff['frame'] = frame; diff['annotation_enabled'] = diff['enabled'] = True; print('set diff') - if event.key == 'x': diff['enabled'] ^= True; print('enable diff:', diff['enabled']) - if event.key == 'c': diff['annotation_enabled'] ^= True; print('enable annotation diff:', diff['annotation_enabled']) - if event.key == 't': draw_temp ^= True; print('draw temp:', draw_temp) - if event.key == 'e': - print('removing user annotations: ', len(temp_annotations['user'])) - annotations.remove(temp_annotations['user']) - if event.key == 'u': print('calibrate'); camera.calibrate() - if event.key == 'a': exposure['auto'] ^= True; print('auto exposure:', exposure['auto'], ', type:', exposure['auto_type']) - if event.key == 'z': - types = ['center', 'ends'] - exposure['auto_type'] = types[types.index(exposure['auto_type'])-1] - print('auto exposure:', exposure['auto'], ', type:', exposure['auto_type']) - if event.key == 'w': - filename = time.strftime(FILE_NAME_FORMAT) + '.png' + if event.key == "h": + print_help() + if event.key == " ": + paused ^= True + print("paused:", paused) + if event.key == "d": + diff["frame"] = frame + diff["annotation_enabled"] = diff["enabled"] = True + print("set diff") + if event.key == "x": + diff["enabled"] ^= True + print("enable diff:", diff["enabled"]) + if event.key == "c": + diff["annotation_enabled"] ^= True + print("enable annotation diff:", diff["annotation_enabled"]) + if event.key == "t": + draw_temp ^= True + print("draw temp:", draw_temp) + if event.key == "e": + print("removing user annotations: ", len(temp_annotations["user"])) + annotations.remove(temp_annotations["user"]) + if event.key == "u": + print("calibrate") + camera.calibrate() + if event.key == "a": + exposure["auto"] ^= True + print("auto exposure:", exposure["auto"], ", type:", exposure["auto_type"]) + if event.key == "z": + types = ["center", "ends"] + exposure["auto_type"] = types[types.index(exposure["auto_type"]) - 1] + print("auto exposure:", exposure["auto"], ", type:", exposure["auto_type"]) + if event.key == "w": + filename = time.strftime(FILE_NAME_FORMAT) + ".png" plt.savefig(filename) - print('saved to:', filename) - if event.key == 'r': - filename = time.strftime(FILE_NAME_FORMAT) + '.npy' - np.save(filename, camera.frame_raw_u16.reshape(camera.height+4, camera.width)) - print('saved to:', filename) - if event.key == 'v': + print("saved to:", filename) + if event.key == "r": + filename = time.strftime(FILE_NAME_FORMAT) + ".npy" + np.save(filename, camera.frame_raw_u16.reshape(camera.height + 4, camera.width)) + print("saved to:", filename) + if event.key == "v": if csv_filename is None: - csv_filename = time.strftime(FILE_NAME_FORMAT) + '.csv' - with open(csv_filename, 'w', newline='') as f: + csv_filename = time.strftime(FILE_NAME_FORMAT) + ".csv" + with open(csv_filename, "w", newline="") as f: header = ["time"] - header += [f'{a} {x}' for a in temp_annotations['std'].keys() for x in ['x', 'y', 'val']] #t, tmin x, tmin y, tmin val, etc - header += [f'Point{i} {x}' for i, key in enumerate(temp_annotations['user'].keys()) for x in ['x', 'y', 'val']] + header += [ + f"{a} {x}" + for a in temp_annotations["std"].keys() + for x in ["x", "y", "val"] + ] # t, tmin x, tmin y, tmin val, etc + header += [ + f"Point{i} {x}" + for i, key in enumerate(temp_annotations["user"].keys()) + for x in ["x", "y", "val"] + ] csv.writer(f).writerow(header) - print('Annotation recording started in:', csv_filename) + print("Annotation recording started in:", csv_filename) else: - print('Annotation recording saved in:', csv_filename) + print("Annotation recording saved in:", csv_filename) csv_filename = None - - if event.key in [',', '.']: - if event.key == '.': cmaps_idx= (cmaps_idx + 1) % len(cmaps) - else: cmaps_idx= (cmaps_idx - 1) % len(cmaps) - print('color map:', cmaps[cmaps_idx]) + + if event.key in [",", "."]: + if event.key == ".": + cmaps_idx = (cmaps_idx + 1) % len(cmaps) + else: + cmaps_idx = (cmaps_idx - 1) % len(cmaps) + print("color map:", cmaps[cmaps_idx]) im.set_cmap(cmaps[cmaps_idx]) update_colormap = True - if event.key in ['k', 'l']: - if event.key == 'k': + if event.key in ["k", "l"]: + if event.key == "k": camera.temperature_range_normal() else: camera.temperature_range_high() - camera.wait_for_range_application() # this takes care of calibration as well + camera.wait_for_range_application() # this takes care of calibration as well update_colormap = True - if event.key in ['left', 'right', 'up', 'down']: - exposure['auto'] = False - T_cent = int((exposure['T_min'] + exposure['T_max'])/2) - d = int(exposure['T_max'] - T_cent) - if event.key == 'up': T_cent += exposure['T_margin']/2 - if event.key == 'down': T_cent -= exposure['T_margin']/2 - if event.key == 'left': d -= exposure['T_margin']/2 - if event.key == 'right': d += exposure['T_margin']/2 - d = max(d, exposure['T_margin']) - exposure['T_min'] = T_cent - d - exposure['T_max'] = T_cent + d - print('auto exposure off, T_min:', exposure['T_min'], 'T_cent:', T_cent, 'T_max:', exposure['T_max']) + if event.key in ["left", "right", "up", "down"]: + exposure["auto"] = False + T_cent = int((exposure["T_min"] + exposure["T_max"]) / 2) + d = int(exposure["T_max"] - T_cent) + if event.key == "up": + T_cent += exposure["T_margin"] / 2 + if event.key == "down": + T_cent -= exposure["T_margin"] / 2 + if event.key == "left": + d -= exposure["T_margin"] / 2 + if event.key == "right": + d += exposure["T_margin"] / 2 + d = max(d, exposure["T_margin"]) + exposure["T_min"] = T_cent - d + exposure["T_max"] = T_cent + d + print( + "auto exposure off, T_min:", + exposure["T_min"], + "T_cent:", + T_cent, + "T_max:", + exposure["T_max"], + ) update_colormap = True -mouse_action_pos = (0,0) + +mouse_action_pos = (0, 0) mouse_action = None + + def onclick(event): global mouse_action, mouse_action_pos if event.inaxes == ax: pos = (int(event.xdata), int(event.ydata)) if event.button == MouseButton.RIGHT: - print('add user temperature annotation at pos:', pos) - temp_annotations['user'][pos] = 'white' + print("add user temperature annotation at pos:", pos) + temp_annotations["user"][pos] = "white" if event.button == MouseButton.LEFT: if utils.inRoi(annotations.roi, pos, frame.shape): - mouse_action = 'move_roi' - mouse_action_pos = (annotations.roi[0][0] - pos[0], annotations.roi[0][1] - pos[1]) + mouse_action = "move_roi" + mouse_action_pos = ( + annotations.roi[0][0] - pos[0], + annotations.roi[0][1] - pos[1], + ) else: - mouse_action = 'create_roi' + mouse_action = "create_roi" mouse_action_pos = pos - annotations.set_roi((pos, (0,0))) + annotations.set_roi((pos, (0, 0))) + def onmotion(event): global mouse_action, mouse_action_pos, roi if event.inaxes == ax and event.button == MouseButton.LEFT: pos = (int(event.xdata), int(event.ydata)) - if mouse_action == 'create_roi': - w,h = pos[0] - mouse_action_pos[0], pos[1] - mouse_action_pos[1] - roi = (mouse_action_pos, (w,h)) + if mouse_action == "create_roi": + w, h = pos[0] - mouse_action_pos[0], pos[1] - mouse_action_pos[1] + roi = (mouse_action_pos, (w, h)) annotations.set_roi(roi) - if mouse_action == 'move_roi': - roi = ((pos[0] + mouse_action_pos[0], pos[1] + mouse_action_pos[1]), annotations.roi[1]) + if mouse_action == "move_roi": + roi = ( + (pos[0] + mouse_action_pos[0], pos[1] + mouse_action_pos[1]), + annotations.roi[1], + ) annotations.set_roi(roi) -anim = animation.FuncAnimation(fig, animate_func, interval = 1000 / fps, blit=True) -fig.canvas.mpl_connect('button_press_event', onclick) -fig.canvas.mpl_connect('motion_notify_event', onmotion) -fig.canvas.mpl_connect('key_press_event', press) +anim = animation.FuncAnimation(fig, animate_func, interval=1000 / fps, blit=True) +fig.canvas.mpl_connect("button_press_event", onclick) +fig.canvas.mpl_connect("motion_notify_event", onmotion) +fig.canvas.mpl_connect("key_press_event", press) print_help() plt.show() diff --git a/pyproject.toml b/pyproject.toml index 5e91180..652de57 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -13,6 +13,9 @@ opencv-python = "^4.10.0.84" matplotlib = "^3.9.2" pyserial = "^3.5" +[tool.poetry.group.dev.dependencies] +ruff = "^0.7.3" + [build-system] requires = ["poetry-core>=1.0.0"] build-backend = "poetry.core.masonry.api" diff --git a/utils.py b/utils.py index 02d2ede..99defbc 100755 --- a/utils.py +++ b/utils.py @@ -1,110 +1,132 @@ -import numpy as np import cv2 +import numpy as np - - -def drawTemperature(img, point, T, color = (0,0,0)): +def drawTemperature(img, point, T, color=(0, 0, 0)): d1, d2 = 2, 5 dsize = 1 font = cv2.FONT_HERSHEY_PLAIN (x, y) = point - t = '%.2fC' % T - cv2.line(img,(x+d1, y),(x+d2,y),color, dsize) - cv2.line(img,(x-d1, y),(x-d2,y),color, dsize) - cv2.line(img,(x, y+d1),(x,y+d2),color, dsize) - cv2.line(img,(x, y-d1),(x,y-d2),color, dsize) + t = "%.2fC" % T + cv2.line(img, (x + d1, y), (x + d2, y), color, dsize) + cv2.line(img, (x - d1, y), (x - d2, y), color, dsize) + cv2.line(img, (x, y + d1), (x, y + d2), color, dsize) + cv2.line(img, (x, y - d1), (x, y - d2), color, dsize) text_size = cv2.getTextSize(t, font, 1, dsize)[0] - tx, ty = x+d1, y+d1+text_size[1] - if tx + text_size[0] > img.shape[1]: tx = x-d1-text_size[0] - if ty > img.shape[0]: ty = y-d1 + tx, ty = x + d1, y + d1 + text_size[1] + if tx + text_size[0] > img.shape[1]: + tx = x - d1 - text_size[0] + if ty > img.shape[0]: + ty = y - d1 + + cv2.putText(img, t, (tx, ty), font, 1, color, dsize, cv2.LINE_8) - cv2.putText(img, t, (tx,ty), font, 1, color, dsize, cv2.LINE_8) def autoExposure(update, exposure, frame): # Sketchy auto-exposure lmin, lmax = frame.min(), frame.max() - T_min, T_max, T_margin = exposure['T_min'], exposure['T_max'], exposure['T_margin'] - if exposure['auto_type'] == 'center': - T_cent = int((T_min+T_max)/2) - d = int(max(T_cent-lmin, lmax-T_cent, 0) + T_margin) - if lmin < T_min or T_max < lmax or (T_min + 2 * T_margin < lmin and T_max - 2 * T_margin > lmax): -# print('d:',d, 'lmin:', lmin, 'lmax:', lmax) + T_min, T_max, T_margin = exposure["T_min"], exposure["T_max"], exposure["T_margin"] + if exposure["auto_type"] == "center": + T_cent = int((T_min + T_max) / 2) + d = int(max(T_cent - lmin, lmax - T_cent, 0) + T_margin) + if ( + lmin < T_min + or T_max < lmax + or (T_min + 2 * T_margin < lmin and T_max - 2 * T_margin > lmax) + ): + # print('d:',d, 'lmin:', lmin, 'lmax:', lmax) update = True T_min, T_max = T_cent - d, T_cent + d -# print('T_min:', T_min, 'T_cent:', T_cent, 'T_max:', T_max) - if exposure['auto_type'] == 'ends': - if T_min > lmin: update, T_min = True, lmin-T_margin - if T_min + 2 * T_margin < lmin: update, T_min = True, lmin-T_margin - if T_max < lmax: update, T_max = True, lmax+T_margin - if T_max - 2 * T_margin > lmax: update, T_max = True, lmax+T_margin - - exposure['T_min'] = T_min - exposure['T_max'] = T_max + # print('T_min:', T_min, 'T_cent:', T_cent, 'T_max:', T_max) + if exposure["auto_type"] == "ends": + if T_min > lmin: + update, T_min = True, lmin - T_margin + if T_min + 2 * T_margin < lmin: + update, T_min = True, lmin - T_margin + if T_max < lmax: + update, T_max = True, lmax + T_margin + if T_max - 2 * T_margin > lmax: + update, T_max = True, lmax + T_margin + + exposure["T_min"] = T_min + exposure["T_max"] = T_max return update + def correctRoi(roi, shape): - ((x,y),(w,h)) = roi -# if w == 0 and h == 0: -# ((x,y),(w,h)) = ((0,0), shape) - x1,x2 = max(0, min(x,x+w)), max(0, x,x+w) - y1,y2 = max(0, min(y,y+h)), max(0, y,y+h) -# if x1 == x2: x2 += 1 -# if y1 == y2: y2 += 1 - return ((x1,y1),(x2,y2)) + ((x, y), (w, h)) = roi + # if w == 0 and h == 0: + # ((x,y),(w,h)) = ((0,0), shape) + x1, x2 = max(0, min(x, x + w)), max(0, x, x + w) + y1, y2 = max(0, min(y, y + h)), max(0, y, y + h) + # if x1 == x2: x2 += 1 + # if y1 == y2: y2 += 1 + return ((x1, y1), (x2, y2)) def inRoi(roi, point, shape): result = False - ((x1,y1),(x2,y2)) = correctRoi(roi, shape) + ((x1, y1), (x2, y2)) = correctRoi(roi, shape) if x1 < point[0] and point[0] < x2: if y1 < point[1] and point[1] < y2: result = True return result -def subdict(d, l): - return dict((k,d[k]) for k in l if k in d) - - +def subdict(d, l): + return dict((k, d[k]) for k in l if k in d) class Annotations: def __init__(self, ax, patches): self.ax = ax - self.astyle = dict(text='', xy=(0, 0), xytext=(0, 0), textcoords='offset pixels', arrowprops=dict(facecolor='black', arrowstyle="->")) + self.astyle = dict( + text="", + xy=(0, 0), + xytext=(0, 0), + textcoords="offset pixels", + arrowprops=dict(facecolor="black", arrowstyle="->"), + ) self.anns = {} - self.roi_patch = ax.add_patch(patches.Rectangle((0, 0), 0, 0, linewidth=1, edgecolor='black', facecolor='none')) - self.set_roi(((0,0),(0,0))) + self.roi_patch = ax.add_patch( + patches.Rectangle( + (0, 0), 0, 0, linewidth=1, edgecolor="black", facecolor="none" + ) + ) + self.set_roi(((0, 0), (0, 0))) def set_roi(self, roi): self.roi = roi - ((x,y), (w,h)) = roi - self.roi_patch.xy = (x,y) + ((x, y), (w, h)) = roi + self.roi_patch.xy = (x, y) self.roi_patch.set_width(w) self.roi_patch.set_height(h) - self.roi_patch.set_visible(w!=0 and h!=0) + self.roi_patch.set_visible(w != 0 and h != 0) def get_ann(self, name, color): if name not in self.anns: - self.anns[name] = self.ax.annotate(**self.astyle, bbox=dict(boxstyle='square', fc=color, alpha=0.3, lw=0)) + self.anns[name] = self.ax.annotate( + **self.astyle, bbox=dict(boxstyle="square", fc=color, alpha=0.3, lw=0) + ) return self.anns[name] def get_pos(self, name): pos = self.get_ann(name, "").xy return pos - + def get_val(self, name, annotation_frame): annotation_pos = self.get_pos(name) val = annotation_frame[annotation_pos[::-1]] return val def update(self, temp_annotations, annotation_frame, draw_temp): - l = temp_annotations['std'].items() | temp_annotations['user'].items() + l = temp_annotations["std"].items() | temp_annotations["user"].items() for name, color in l: pos = self._get_pos(name, annotation_frame, self.roi) - self._ann_set_temp(self.get_ann(name, color), pos, annotation_frame, draw_temp) + self._ann_set_temp( + self.get_ann(name, color), pos, annotation_frame, draw_temp + ) def get(self): return list(self.anns.values()) + [self.roi_patch] @@ -117,31 +139,32 @@ def remove(self, d): d.clear() def _ann_set_temp(self, ann, pos, annotation_frame, draw_temp): - (x,y) = pos - ann.xy = pos + (x, y) = pos + ann.xy = pos value = annotation_frame[pos[1], pos[0]] - ann.set_text('%.2f$^\circ$C' % value) + ann.set_text("%.2f$^\circ$C" % value) ann.set_visible(draw_temp) - tx,ty = 20, 15 - if x > annotation_frame.shape[1]-50: tx = -80 - if y < 30: ty = -15 + tx, ty = 20, 15 + if x > annotation_frame.shape[1] - 50: + tx = -80 + if y < 30: + ty = -15 ann.xyann = (tx, ty) - def _get_pos(self, name, annotation_frame, roi): - ((x1,y1),(x2,y2)) = correctRoi(roi, annotation_frame.shape) - roi_frame = annotation_frame[y1:y2,x1:x2] + ((x1, y1), (x2, y2)) = correctRoi(roi, annotation_frame.shape) + roi_frame = annotation_frame[y1:y2, x1:x2] if roi_frame.size <= 0: - x1,y1 = 0, 0 + x1, y1 = 0, 0 roi_frame = annotation_frame - if name == 'Tmin': + if name == "Tmin": pos = np.unravel_index(roi_frame.argmin(), roi_frame.shape) - pos = (pos[1]+x1, pos[0]+y1) - elif name == 'Tmax': + pos = (pos[1] + x1, pos[0] + y1) + elif name == "Tmax": pos = np.unravel_index(roi_frame.argmax(), roi_frame.shape) - pos = (pos[1]+x1, pos[0]+y1) - elif name == 'Tcenter': - pos = (annotation_frame.shape[1]//2, annotation_frame.shape[0]//2) + pos = (pos[1] + x1, pos[0] + y1) + elif name == "Tcenter": + pos = (annotation_frame.shape[1] // 2, annotation_frame.shape[0] // 2) else: pos = name return pos From 0d0fb370597beaf1b3432cf66f59b968df4ee814 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Frans=20F=C3=BCrst?= Date: Mon, 11 Nov 2024 04:28:29 +0100 Subject: [PATCH 19/27] fix variable names in f-strings --- irpythermal.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/irpythermal.py b/irpythermal.py index 2f6522a..ef1d100 100755 --- a/irpythermal.py +++ b/irpythermal.py @@ -129,7 +129,7 @@ def find_device(cls) -> cv2.VideoCapture: except: pass raise ValueError( - f"Cannot find camera with a width of one of {cls.supported_resolutions} that also matches: {width=} and {height=}" + f"Cannot find camera with a width of one of {cls.supported_resolutions} that also matches: {cap_width=} and {cap_height=}" ) def bin_to_twos_complement(self, binary: str) -> int: From 760a266e65ce72ce2f1f98bad5372dc12dd80c40 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Frans=20F=C3=BCrst?= Date: Mon, 11 Nov 2024 06:11:37 +0100 Subject: [PATCH 20/27] fix ruff findings --- .gitignore | 2 ++ README.md | 10 +++++----- display.py | 2 ++ example_simple.py | 6 ++---- irpythermal.py | 3 ++- opencv.py | 3 ++- pyplot.py | 29 +++++------------------------ utils.py | 11 +++++------ 8 files changed, 25 insertions(+), 41 deletions(-) diff --git a/.gitignore b/.gitignore index 4c0245b..a6da9e2 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,5 @@ __pycache__ .vscode *.wpr *.wpu +*.npy +*.csv diff --git a/README.md b/README.md index ebf6c4d..abc545f 100644 --- a/README.md +++ b/README.md @@ -6,8 +6,8 @@ Supported thermal cameras: - Xtherm T3S, thanks to Angel-1024 - Xtherm T2L, T2S+, thanks to Christoph Mair and DiminDDL -It's a very simple hacked together lib, might be useful for somebody, -uses `matplotlib` which is a little bit on the slow side, +It's a very simple hacked together lib, might be useful for somebody, +uses `matplotlib` which is a little bit on the slow side, or pure `opencv` - much faster but without most features Upon startup the app automatically looks for supported cameras by matching the resolutions. @@ -30,7 +30,7 @@ keys: 'a', 'z' - auto exposure on/off, auto exposure type 'k', 'l' - set the thermal range to normal/high (only for the TS2+) 'o' - change the camera orientation (rotate 90 degs CW). Only in OpenCV - + left, right, up, down - set exposure limits mouse: @@ -40,7 +40,7 @@ mouse: While the program is running you can use these controls in the camera view to control how it looks and behaves. -You can specify the video device directly with `-d` to the startup command to skip the search routine. +You can specify the video device directly with `-d` to the startup command to skip the search routine. Also for T2S+ V2 users (and potentially for others, where the camera sends raw data and doesn't do onboard processing resulting in the image looking like a pixelated mess) you can specify the `-r` option to tell the program to treat the camera stream as raw sensor data. This will perform a few calibration routines and present you with a usable image doing the sensor processing in python. There is also the `-o` parameter which adds an offset to the entire frames temperature values. This is useful for calibrating the camera since the raw mode sometimes ends up with a constant offset to the image, but this is specific to the camera and thus can be found once and then used for subsequent runs. @@ -62,7 +62,7 @@ python ./pyplot.py 2022-09-11_18-49-07.npy ### Lock In Thermography -This feature allows you to use the camera in a lock-in mode. This allows for very precise measurements of hotspots on anything that can be modulated in some way. Examples include silicon dies, circuit boards, people (lock in based on heart rate) and potentially many others. +This feature allows you to use the camera in a lock-in mode. This allows for very precise measurements of hotspots on anything that can be modulated in some way. Examples include silicon dies, circuit boards, people (lock in based on heart rate) and potentially many others. As mentioned above the device under test needs to be stimulated on command, the script sends commands into a provided serial port to do this. A `1\n` indicates that we want to turn the supply/stimulant on, a `0\n` turns it off. The modulation frequency, serial port and integration time are all provided as command line arguments. diff --git a/display.py b/display.py index 3653650..2fd4604 100644 --- a/display.py +++ b/display.py @@ -1,3 +1,5 @@ +#!/usr/bin/env python3 + import matplotlib.pyplot as plt import numpy as np from matplotlib.widgets import Button diff --git a/example_simple.py b/example_simple.py index b62c8b1..fcde291 100755 --- a/example_simple.py +++ b/example_simple.py @@ -1,8 +1,6 @@ -#!/usr/bin/python3 -import time - -import numpy as np +#!/usr/bin/env python3 +import time import irpythermal # create camera object and do a initial calibration diff --git a/irpythermal.py b/irpythermal.py index ef1d100..64013b9 100755 --- a/irpythermal.py +++ b/irpythermal.py @@ -1,4 +1,5 @@ -#!/usr/bin/python3 +#!/usr/bin/env python3 + import math import time from sys import platform diff --git a/opencv.py b/opencv.py index 6fd5b6b..da7c2bb 100755 --- a/opencv.py +++ b/opencv.py @@ -1,4 +1,5 @@ -#!/usr/bin/python3 +#!/usr/bin/env python3 + import pickle import time diff --git a/pyplot.py b/pyplot.py index c3ab871..8055672 100755 --- a/pyplot.py +++ b/pyplot.py @@ -144,7 +144,7 @@ cbar_quadrature = plt.colorbar(im_quadrature, cax=cax_quadrature) axes[1][0].axis("off") - status_text = f""" + status_text = """ Frame: -, Time: -/-, Load: -, @@ -195,25 +195,6 @@ csv_filename = None -def log_annotations_to_csv(annotation_frame): - anns_data = [] - for type in ["std", "user"]: - for ann_name in temp_annotations[type]: - pos = annotations.get_pos(ann_name) - val = round(annotations.get_val(ann_name, annotation_frame), 2) - anns_data += [pos[0], pos[1], val] # store each position and value - if csv_filename is not None: - with open(csv_filename, "a", newline="") as f: - writer = csv.writer(f) - writer.writerow([datetime.now()] + anns_data) - - -import csv -from datetime import datetime # to easily get miliseconds - -csv_filename = None - - def log_annotations_to_csv(annotation_frame): anns_data = [] for type in ["std", "user"]: @@ -236,8 +217,8 @@ def get_lockin_frame(freq, port, integration): try: ser = serial.Serial(port, 115200) # Open the serial port - except serial.SerialException as e: - print(f"Error: could not open serial port {port}") + except serial.SerialException as exc: + print(f"Error: could not open serial port {port} ({exc})") sys.exit(1) start_time = time.time() @@ -308,7 +289,7 @@ def get_lockin_frame(freq, port, integration): in_phase_sum += in_phase quadrature_sum += quadrature - if is_capturing == False: + if not is_capturing: break ser.write(b"0\n") @@ -363,7 +344,7 @@ def animate_func(i): frame = camera.get_frame() start_skips -= 1 elif lockin: - if is_capturing == False: + if not is_capturing: lock_in_thread = start_capture() # in_phase_frame, quad_frame = get_lockin_frame(fequency, port, integration) else: diff --git a/utils.py b/utils.py index 99defbc..7373b32 100755 --- a/utils.py +++ b/utils.py @@ -1,3 +1,5 @@ +#!/usr/bin/env python3 + import cv2 import numpy as np @@ -74,10 +76,6 @@ def inRoi(roi, point, shape): return result -def subdict(d, l): - return dict((k, d[k]) for k in l if k in d) - - class Annotations: def __init__(self, ax, patches): self.ax = ax @@ -121,8 +119,9 @@ def get_val(self, name, annotation_frame): return val def update(self, temp_annotations, annotation_frame, draw_temp): - l = temp_annotations["std"].items() | temp_annotations["user"].items() - for name, color in l: + for name, color in ( + temp_annotations["std"].items() | temp_annotations["user"].items() + ): pos = self._get_pos(name, annotation_frame, self.roi) self._ann_set_temp( self.get_ann(name, color), pos, annotation_frame, draw_temp From 206349b9b65a64449ef1961fffcb4d6044215899 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Frans=20F=C3=BCrst?= Date: Mon, 11 Nov 2024 06:12:20 +0100 Subject: [PATCH 21/27] fix OpenCV::inRange type error error was ``` cv2.error: OpenCV(4.10.0) :-1: error: (-5:Bad argument) in function 'inRange' > Overload resolution failed: > - upperb is not a numpy array, neither a scalar > - Expected Ptr for argument 'upperb' ``` --- irpythermal.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/irpythermal.py b/irpythermal.py index 64013b9..37ab115 100755 --- a/irpythermal.py +++ b/irpythermal.py @@ -482,7 +482,7 @@ def calibrate_raw(self, quiet=False) -> None: # if there are no dead pixels, we skip the dead pixel correction if np.count_nonzero(frame_visible_float < threshold) != 0: self.dead_pixels_mask = cv2.inRange( - frame_visible_float, 0, threshold + frame_visible_float, 0, float(threshold) ).astype(np.uint8) if not quiet: From eec01bfef39975bbb57a74ccfc8285976167a8a9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Frans=20F=C3=BCrst?= Date: Tue, 19 Nov 2024 07:22:53 +0100 Subject: [PATCH 22/27] Big non-functional refactoring: get rid of stray global variables + fix ruff findings Introduces an "AppState" as an intermediate solution for global variables. This makes access to global stuff more visible, but should vanish step by step (by more explicit dependency injection and data modelling) --- poetry.lock | 261 +++++++++--------- pyplot.py | 702 +++++++++++++++++++++++++++---------------------- pyproject.toml | 11 + 3 files changed, 520 insertions(+), 454 deletions(-) diff --git a/poetry.lock b/poetry.lock index a8cad58..4a2d62b 100644 --- a/poetry.lock +++ b/poetry.lock @@ -2,76 +2,65 @@ [[package]] name = "contourpy" -version = "1.3.0" +version = "1.3.1" description = "Python library for calculating contours of 2D quadrilateral grids" optional = false -python-versions = ">=3.9" +python-versions = ">=3.10" files = [ - {file = "contourpy-1.3.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:880ea32e5c774634f9fcd46504bf9f080a41ad855f4fef54f5380f5133d343c7"}, - {file = "contourpy-1.3.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:76c905ef940a4474a6289c71d53122a4f77766eef23c03cd57016ce19d0f7b42"}, - {file = "contourpy-1.3.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:92f8557cbb07415a4d6fa191f20fd9d2d9eb9c0b61d1b2f52a8926e43c6e9af7"}, - {file = "contourpy-1.3.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:36f965570cff02b874773c49bfe85562b47030805d7d8360748f3eca570f4cab"}, - {file = "contourpy-1.3.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cacd81e2d4b6f89c9f8a5b69b86490152ff39afc58a95af002a398273e5ce589"}, - {file = "contourpy-1.3.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:69375194457ad0fad3a839b9e29aa0b0ed53bb54db1bfb6c3ae43d111c31ce41"}, - {file = "contourpy-1.3.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:7a52040312b1a858b5e31ef28c2e865376a386c60c0e248370bbea2d3f3b760d"}, - {file = "contourpy-1.3.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:3faeb2998e4fcb256542e8a926d08da08977f7f5e62cf733f3c211c2a5586223"}, - {file = "contourpy-1.3.0-cp310-cp310-win32.whl", hash = "sha256:36e0cff201bcb17a0a8ecc7f454fe078437fa6bda730e695a92f2d9932bd507f"}, - {file = "contourpy-1.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:87ddffef1dbe5e669b5c2440b643d3fdd8622a348fe1983fad7a0f0ccb1cd67b"}, - {file = "contourpy-1.3.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0fa4c02abe6c446ba70d96ece336e621efa4aecae43eaa9b030ae5fb92b309ad"}, - {file = "contourpy-1.3.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:834e0cfe17ba12f79963861e0f908556b2cedd52e1f75e6578801febcc6a9f49"}, - {file = "contourpy-1.3.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dbc4c3217eee163fa3984fd1567632b48d6dfd29216da3ded3d7b844a8014a66"}, - {file = "contourpy-1.3.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4865cd1d419e0c7a7bf6de1777b185eebdc51470800a9f42b9e9decf17762081"}, - {file = "contourpy-1.3.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:303c252947ab4b14c08afeb52375b26781ccd6a5ccd81abcdfc1fafd14cf93c1"}, - {file = "contourpy-1.3.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:637f674226be46f6ba372fd29d9523dd977a291f66ab2a74fbeb5530bb3f445d"}, - {file = "contourpy-1.3.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:76a896b2f195b57db25d6b44e7e03f221d32fe318d03ede41f8b4d9ba1bff53c"}, - {file = "contourpy-1.3.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:e1fd23e9d01591bab45546c089ae89d926917a66dceb3abcf01f6105d927e2cb"}, - {file = "contourpy-1.3.0-cp311-cp311-win32.whl", hash = "sha256:d402880b84df3bec6eab53cd0cf802cae6a2ef9537e70cf75e91618a3801c20c"}, - {file = "contourpy-1.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:6cb6cc968059db9c62cb35fbf70248f40994dfcd7aa10444bbf8b3faeb7c2d67"}, - {file = "contourpy-1.3.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:570ef7cf892f0afbe5b2ee410c507ce12e15a5fa91017a0009f79f7d93a1268f"}, - {file = "contourpy-1.3.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:da84c537cb8b97d153e9fb208c221c45605f73147bd4cadd23bdae915042aad6"}, - {file = "contourpy-1.3.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0be4d8425bfa755e0fd76ee1e019636ccc7c29f77a7c86b4328a9eb6a26d0639"}, - {file = "contourpy-1.3.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9c0da700bf58f6e0b65312d0a5e695179a71d0163957fa381bb3c1f72972537c"}, - {file = "contourpy-1.3.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:eb8b141bb00fa977d9122636b16aa67d37fd40a3d8b52dd837e536d64b9a4d06"}, - {file = "contourpy-1.3.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3634b5385c6716c258d0419c46d05c8aa7dc8cb70326c9a4fb66b69ad2b52e09"}, - {file = "contourpy-1.3.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:0dce35502151b6bd35027ac39ba6e5a44be13a68f55735c3612c568cac3805fd"}, - {file = "contourpy-1.3.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:aea348f053c645100612b333adc5983d87be69acdc6d77d3169c090d3b01dc35"}, - {file = "contourpy-1.3.0-cp312-cp312-win32.whl", hash = "sha256:90f73a5116ad1ba7174341ef3ea5c3150ddf20b024b98fb0c3b29034752c8aeb"}, - {file = "contourpy-1.3.0-cp312-cp312-win_amd64.whl", hash = "sha256:b11b39aea6be6764f84360fce6c82211a9db32a7c7de8fa6dd5397cf1d079c3b"}, - {file = "contourpy-1.3.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:3e1c7fa44aaae40a2247e2e8e0627f4bea3dd257014764aa644f319a5f8600e3"}, - {file = "contourpy-1.3.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:364174c2a76057feef647c802652f00953b575723062560498dc7930fc9b1cb7"}, - {file = "contourpy-1.3.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:32b238b3b3b649e09ce9aaf51f0c261d38644bdfa35cbaf7b263457850957a84"}, - {file = "contourpy-1.3.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d51fca85f9f7ad0b65b4b9fe800406d0d77017d7270d31ec3fb1cc07358fdea0"}, - {file = "contourpy-1.3.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:732896af21716b29ab3e988d4ce14bc5133733b85956316fb0c56355f398099b"}, - {file = "contourpy-1.3.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d73f659398a0904e125280836ae6f88ba9b178b2fed6884f3b1f95b989d2c8da"}, - {file = "contourpy-1.3.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:c6c7c2408b7048082932cf4e641fa3b8ca848259212f51c8c59c45aa7ac18f14"}, - {file = "contourpy-1.3.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:f317576606de89da6b7e0861cf6061f6146ead3528acabff9236458a6ba467f8"}, - {file = "contourpy-1.3.0-cp313-cp313-win32.whl", hash = "sha256:31cd3a85dbdf1fc002280c65caa7e2b5f65e4a973fcdf70dd2fdcb9868069294"}, - {file = "contourpy-1.3.0-cp313-cp313-win_amd64.whl", hash = "sha256:4553c421929ec95fb07b3aaca0fae668b2eb5a5203d1217ca7c34c063c53d087"}, - {file = "contourpy-1.3.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:345af746d7766821d05d72cb8f3845dfd08dd137101a2cb9b24de277d716def8"}, - {file = "contourpy-1.3.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:3bb3808858a9dc68f6f03d319acd5f1b8a337e6cdda197f02f4b8ff67ad2057b"}, - {file = "contourpy-1.3.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:420d39daa61aab1221567b42eecb01112908b2cab7f1b4106a52caaec8d36973"}, - {file = "contourpy-1.3.0-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4d63ee447261e963af02642ffcb864e5a2ee4cbfd78080657a9880b8b1868e18"}, - {file = "contourpy-1.3.0-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:167d6c890815e1dac9536dca00828b445d5d0df4d6a8c6adb4a7ec3166812fa8"}, - {file = "contourpy-1.3.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:710a26b3dc80c0e4febf04555de66f5fd17e9cf7170a7b08000601a10570bda6"}, - {file = "contourpy-1.3.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:75ee7cb1a14c617f34a51d11fa7524173e56551646828353c4af859c56b766e2"}, - {file = "contourpy-1.3.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:33c92cdae89ec5135d036e7218e69b0bb2851206077251f04a6c4e0e21f03927"}, - {file = "contourpy-1.3.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:a11077e395f67ffc2c44ec2418cfebed032cd6da3022a94fc227b6faf8e2acb8"}, - {file = "contourpy-1.3.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e8134301d7e204c88ed7ab50028ba06c683000040ede1d617298611f9dc6240c"}, - {file = "contourpy-1.3.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e12968fdfd5bb45ffdf6192a590bd8ddd3ba9e58360b29683c6bb71a7b41edca"}, - {file = "contourpy-1.3.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fd2a0fc506eccaaa7595b7e1418951f213cf8255be2600f1ea1b61e46a60c55f"}, - {file = "contourpy-1.3.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4cfb5c62ce023dfc410d6059c936dcf96442ba40814aefbfa575425a3a7f19dc"}, - {file = "contourpy-1.3.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:68a32389b06b82c2fdd68276148d7b9275b5f5cf13e5417e4252f6d1a34f72a2"}, - {file = "contourpy-1.3.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:94e848a6b83da10898cbf1311a815f770acc9b6a3f2d646f330d57eb4e87592e"}, - {file = "contourpy-1.3.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:d78ab28a03c854a873787a0a42254a0ccb3cb133c672f645c9f9c8f3ae9d0800"}, - {file = "contourpy-1.3.0-cp39-cp39-win32.whl", hash = "sha256:81cb5ed4952aae6014bc9d0421dec7c5835c9c8c31cdf51910b708f548cf58e5"}, - {file = "contourpy-1.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:14e262f67bd7e6eb6880bc564dcda30b15e351a594657e55b7eec94b6ef72843"}, - {file = "contourpy-1.3.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:fe41b41505a5a33aeaed2a613dccaeaa74e0e3ead6dd6fd3a118fb471644fd6c"}, - {file = "contourpy-1.3.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eca7e17a65f72a5133bdbec9ecf22401c62bcf4821361ef7811faee695799779"}, - {file = "contourpy-1.3.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:1ec4dc6bf570f5b22ed0d7efba0dfa9c5b9e0431aeea7581aa217542d9e809a4"}, - {file = "contourpy-1.3.0-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:00ccd0dbaad6d804ab259820fa7cb0b8036bda0686ef844d24125d8287178ce0"}, - {file = "contourpy-1.3.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8ca947601224119117f7c19c9cdf6b3ab54c5726ef1d906aa4a69dfb6dd58102"}, - {file = "contourpy-1.3.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:c6ec93afeb848a0845a18989da3beca3eec2c0f852322efe21af1931147d12cb"}, - {file = "contourpy-1.3.0.tar.gz", hash = "sha256:7ffa0db17717a8ffb127efd0c95a4362d996b892c2904db72428d5b52e1938a4"}, + {file = "contourpy-1.3.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a045f341a77b77e1c5de31e74e966537bba9f3c4099b35bf4c2e3939dd54cdab"}, + {file = "contourpy-1.3.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:500360b77259914f7805af7462e41f9cb7ca92ad38e9f94d6c8641b089338124"}, + {file = "contourpy-1.3.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b2f926efda994cdf3c8d3fdb40b9962f86edbc4457e739277b961eced3d0b4c1"}, + {file = "contourpy-1.3.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:adce39d67c0edf383647a3a007de0a45fd1b08dedaa5318404f1a73059c2512b"}, + {file = "contourpy-1.3.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:abbb49fb7dac584e5abc6636b7b2a7227111c4f771005853e7d25176daaf8453"}, + {file = "contourpy-1.3.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a0cffcbede75c059f535725c1680dfb17b6ba8753f0c74b14e6a9c68c29d7ea3"}, + {file = "contourpy-1.3.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:ab29962927945d89d9b293eabd0d59aea28d887d4f3be6c22deaefbb938a7277"}, + {file = "contourpy-1.3.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:974d8145f8ca354498005b5b981165b74a195abfae9a8129df3e56771961d595"}, + {file = "contourpy-1.3.1-cp310-cp310-win32.whl", hash = "sha256:ac4578ac281983f63b400f7fe6c101bedc10651650eef012be1ccffcbacf3697"}, + {file = "contourpy-1.3.1-cp310-cp310-win_amd64.whl", hash = "sha256:174e758c66bbc1c8576992cec9599ce8b6672b741b5d336b5c74e35ac382b18e"}, + {file = "contourpy-1.3.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3e8b974d8db2c5610fb4e76307e265de0edb655ae8169e8b21f41807ccbeec4b"}, + {file = "contourpy-1.3.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:20914c8c973f41456337652a6eeca26d2148aa96dd7ac323b74516988bea89fc"}, + {file = "contourpy-1.3.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:19d40d37c1c3a4961b4619dd9d77b12124a453cc3d02bb31a07d58ef684d3d86"}, + {file = "contourpy-1.3.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:113231fe3825ebf6f15eaa8bc1f5b0ddc19d42b733345eae0934cb291beb88b6"}, + {file = "contourpy-1.3.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4dbbc03a40f916a8420e420d63e96a1258d3d1b58cbdfd8d1f07b49fcbd38e85"}, + {file = "contourpy-1.3.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a04ecd68acbd77fa2d39723ceca4c3197cb2969633836ced1bea14e219d077c"}, + {file = "contourpy-1.3.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:c414fc1ed8ee1dbd5da626cf3710c6013d3d27456651d156711fa24f24bd1291"}, + {file = "contourpy-1.3.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:31c1b55c1f34f80557d3830d3dd93ba722ce7e33a0b472cba0ec3b6535684d8f"}, + {file = "contourpy-1.3.1-cp311-cp311-win32.whl", hash = "sha256:f611e628ef06670df83fce17805c344710ca5cde01edfdc72751311da8585375"}, + {file = "contourpy-1.3.1-cp311-cp311-win_amd64.whl", hash = "sha256:b2bdca22a27e35f16794cf585832e542123296b4687f9fd96822db6bae17bfc9"}, + {file = "contourpy-1.3.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:0ffa84be8e0bd33410b17189f7164c3589c229ce5db85798076a3fa136d0e509"}, + {file = "contourpy-1.3.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:805617228ba7e2cbbfb6c503858e626ab528ac2a32a04a2fe88ffaf6b02c32bc"}, + {file = "contourpy-1.3.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ade08d343436a94e633db932e7e8407fe7de8083967962b46bdfc1b0ced39454"}, + {file = "contourpy-1.3.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:47734d7073fb4590b4a40122b35917cd77be5722d80683b249dac1de266aac80"}, + {file = "contourpy-1.3.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2ba94a401342fc0f8b948e57d977557fbf4d515f03c67682dd5c6191cb2d16ec"}, + {file = "contourpy-1.3.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:efa874e87e4a647fd2e4f514d5e91c7d493697127beb95e77d2f7561f6905bd9"}, + {file = "contourpy-1.3.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:1bf98051f1045b15c87868dbaea84f92408337d4f81d0e449ee41920ea121d3b"}, + {file = "contourpy-1.3.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:61332c87493b00091423e747ea78200659dc09bdf7fd69edd5e98cef5d3e9a8d"}, + {file = "contourpy-1.3.1-cp312-cp312-win32.whl", hash = "sha256:e914a8cb05ce5c809dd0fe350cfbb4e881bde5e2a38dc04e3afe1b3e58bd158e"}, + {file = "contourpy-1.3.1-cp312-cp312-win_amd64.whl", hash = "sha256:08d9d449a61cf53033612cb368f3a1b26cd7835d9b8cd326647efe43bca7568d"}, + {file = "contourpy-1.3.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:a761d9ccfc5e2ecd1bf05534eda382aa14c3e4f9205ba5b1684ecfe400716ef2"}, + {file = "contourpy-1.3.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:523a8ee12edfa36f6d2a49407f705a6ef4c5098de4f498619787e272de93f2d5"}, + {file = "contourpy-1.3.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ece6df05e2c41bd46776fbc712e0996f7c94e0d0543af1656956d150c4ca7c81"}, + {file = "contourpy-1.3.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:573abb30e0e05bf31ed067d2f82500ecfdaec15627a59d63ea2d95714790f5c2"}, + {file = "contourpy-1.3.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a9fa36448e6a3a1a9a2ba23c02012c43ed88905ec80163f2ffe2421c7192a5d7"}, + {file = "contourpy-1.3.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ea9924d28fc5586bf0b42d15f590b10c224117e74409dd7a0be3b62b74a501c"}, + {file = "contourpy-1.3.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:5b75aa69cb4d6f137b36f7eb2ace9280cfb60c55dc5f61c731fdf6f037f958a3"}, + {file = "contourpy-1.3.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:041b640d4ec01922083645a94bb3b2e777e6b626788f4095cf21abbe266413c1"}, + {file = "contourpy-1.3.1-cp313-cp313-win32.whl", hash = "sha256:36987a15e8ace5f58d4d5da9dca82d498c2bbb28dff6e5d04fbfcc35a9cb3a82"}, + {file = "contourpy-1.3.1-cp313-cp313-win_amd64.whl", hash = "sha256:a7895f46d47671fa7ceec40f31fae721da51ad34bdca0bee83e38870b1f47ffd"}, + {file = "contourpy-1.3.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:9ddeb796389dadcd884c7eb07bd14ef12408aaae358f0e2ae24114d797eede30"}, + {file = "contourpy-1.3.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:19c1555a6801c2f084c7ddc1c6e11f02eb6a6016ca1318dd5452ba3f613a1751"}, + {file = "contourpy-1.3.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:841ad858cff65c2c04bf93875e384ccb82b654574a6d7f30453a04f04af71342"}, + {file = "contourpy-1.3.1-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4318af1c925fb9a4fb190559ef3eec206845f63e80fb603d47f2d6d67683901c"}, + {file = "contourpy-1.3.1-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:14c102b0eab282427b662cb590f2e9340a9d91a1c297f48729431f2dcd16e14f"}, + {file = "contourpy-1.3.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:05e806338bfeaa006acbdeba0ad681a10be63b26e1b17317bfac3c5d98f36cda"}, + {file = "contourpy-1.3.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:4d76d5993a34ef3df5181ba3c92fabb93f1eaa5729504fb03423fcd9f3177242"}, + {file = "contourpy-1.3.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:89785bb2a1980c1bd87f0cb1517a71cde374776a5f150936b82580ae6ead44a1"}, + {file = "contourpy-1.3.1-cp313-cp313t-win32.whl", hash = "sha256:8eb96e79b9f3dcadbad2a3891672f81cdcab7f95b27f28f1c67d75f045b6b4f1"}, + {file = "contourpy-1.3.1-cp313-cp313t-win_amd64.whl", hash = "sha256:287ccc248c9e0d0566934e7d606201abd74761b5703d804ff3df8935f523d546"}, + {file = "contourpy-1.3.1-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:b457d6430833cee8e4b8e9b6f07aa1c161e5e0d52e118dc102c8f9bd7dd060d6"}, + {file = "contourpy-1.3.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cb76c1a154b83991a3cbbf0dfeb26ec2833ad56f95540b442c73950af2013750"}, + {file = "contourpy-1.3.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:44a29502ca9c7b5ba389e620d44f2fbe792b1fb5734e8b931ad307071ec58c53"}, + {file = "contourpy-1.3.1.tar.gz", hash = "sha256:dfd97abd83335045a913e3bcc4a09c0ceadbe66580cf573fe961f4a825efa699"}, ] [package.dependencies] @@ -101,59 +90,61 @@ tests = ["pytest", "pytest-cov", "pytest-xdist"] [[package]] name = "fonttools" -version = "4.54.1" +version = "4.55.0" description = "Tools to manipulate font files" optional = false python-versions = ">=3.8" files = [ - {file = "fonttools-4.54.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7ed7ee041ff7b34cc62f07545e55e1468808691dddfd315d51dd82a6b37ddef2"}, - {file = "fonttools-4.54.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:41bb0b250c8132b2fcac148e2e9198e62ff06f3cc472065dff839327945c5882"}, - {file = "fonttools-4.54.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7965af9b67dd546e52afcf2e38641b5be956d68c425bef2158e95af11d229f10"}, - {file = "fonttools-4.54.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:278913a168f90d53378c20c23b80f4e599dca62fbffae4cc620c8eed476b723e"}, - {file = "fonttools-4.54.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:0e88e3018ac809b9662615072dcd6b84dca4c2d991c6d66e1970a112503bba7e"}, - {file = "fonttools-4.54.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:4aa4817f0031206e637d1e685251ac61be64d1adef111060df84fdcbc6ab6c44"}, - {file = "fonttools-4.54.1-cp310-cp310-win32.whl", hash = "sha256:7e3b7d44e18c085fd8c16dcc6f1ad6c61b71ff463636fcb13df7b1b818bd0c02"}, - {file = "fonttools-4.54.1-cp310-cp310-win_amd64.whl", hash = "sha256:dd9cc95b8d6e27d01e1e1f1fae8559ef3c02c76317da650a19047f249acd519d"}, - {file = "fonttools-4.54.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:5419771b64248484299fa77689d4f3aeed643ea6630b2ea750eeab219588ba20"}, - {file = "fonttools-4.54.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:301540e89cf4ce89d462eb23a89464fef50915255ece765d10eee8b2bf9d75b2"}, - {file = "fonttools-4.54.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:76ae5091547e74e7efecc3cbf8e75200bc92daaeb88e5433c5e3e95ea8ce5aa7"}, - {file = "fonttools-4.54.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:82834962b3d7c5ca98cb56001c33cf20eb110ecf442725dc5fdf36d16ed1ab07"}, - {file = "fonttools-4.54.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d26732ae002cc3d2ecab04897bb02ae3f11f06dd7575d1df46acd2f7c012a8d8"}, - {file = "fonttools-4.54.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:58974b4987b2a71ee08ade1e7f47f410c367cdfc5a94fabd599c88165f56213a"}, - {file = "fonttools-4.54.1-cp311-cp311-win32.whl", hash = "sha256:ab774fa225238986218a463f3fe151e04d8c25d7de09df7f0f5fce27b1243dbc"}, - {file = "fonttools-4.54.1-cp311-cp311-win_amd64.whl", hash = "sha256:07e005dc454eee1cc60105d6a29593459a06321c21897f769a281ff2d08939f6"}, - {file = "fonttools-4.54.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:54471032f7cb5fca694b5f1a0aaeba4af6e10ae989df408e0216f7fd6cdc405d"}, - {file = "fonttools-4.54.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8fa92cb248e573daab8d032919623cc309c005086d743afb014c836636166f08"}, - {file = "fonttools-4.54.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0a911591200114969befa7f2cb74ac148bce5a91df5645443371aba6d222e263"}, - {file = "fonttools-4.54.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:93d458c8a6a354dc8b48fc78d66d2a8a90b941f7fec30e94c7ad9982b1fa6bab"}, - {file = "fonttools-4.54.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:5eb2474a7c5be8a5331146758debb2669bf5635c021aee00fd7c353558fc659d"}, - {file = "fonttools-4.54.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c9c563351ddc230725c4bdf7d9e1e92cbe6ae8553942bd1fb2b2ff0884e8b714"}, - {file = "fonttools-4.54.1-cp312-cp312-win32.whl", hash = "sha256:fdb062893fd6d47b527d39346e0c5578b7957dcea6d6a3b6794569370013d9ac"}, - {file = "fonttools-4.54.1-cp312-cp312-win_amd64.whl", hash = "sha256:e4564cf40cebcb53f3dc825e85910bf54835e8a8b6880d59e5159f0f325e637e"}, - {file = "fonttools-4.54.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:6e37561751b017cf5c40fce0d90fd9e8274716de327ec4ffb0df957160be3bff"}, - {file = "fonttools-4.54.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:357cacb988a18aace66e5e55fe1247f2ee706e01debc4b1a20d77400354cddeb"}, - {file = "fonttools-4.54.1-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f8e953cc0bddc2beaf3a3c3b5dd9ab7554677da72dfaf46951e193c9653e515a"}, - {file = "fonttools-4.54.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:58d29b9a294573d8319f16f2f79e42428ba9b6480442fa1836e4eb89c4d9d61c"}, - {file = "fonttools-4.54.1-cp313-cp313-win32.whl", hash = "sha256:9ef1b167e22709b46bf8168368b7b5d3efeaaa746c6d39661c1b4405b6352e58"}, - {file = "fonttools-4.54.1-cp313-cp313-win_amd64.whl", hash = "sha256:262705b1663f18c04250bd1242b0515d3bbae177bee7752be67c979b7d47f43d"}, - {file = "fonttools-4.54.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:ed2f80ca07025551636c555dec2b755dd005e2ea8fbeb99fc5cdff319b70b23b"}, - {file = "fonttools-4.54.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:9dc080e5a1c3b2656caff2ac2633d009b3a9ff7b5e93d0452f40cd76d3da3b3c"}, - {file = "fonttools-4.54.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1d152d1be65652fc65e695e5619e0aa0982295a95a9b29b52b85775243c06556"}, - {file = "fonttools-4.54.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8583e563df41fdecef31b793b4dd3af8a9caa03397be648945ad32717a92885b"}, - {file = "fonttools-4.54.1-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:0d1d353ef198c422515a3e974a1e8d5b304cd54a4c2eebcae708e37cd9eeffb1"}, - {file = "fonttools-4.54.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:fda582236fee135d4daeca056c8c88ec5f6f6d88a004a79b84a02547c8f57386"}, - {file = "fonttools-4.54.1-cp38-cp38-win32.whl", hash = "sha256:e7d82b9e56716ed32574ee106cabca80992e6bbdcf25a88d97d21f73a0aae664"}, - {file = "fonttools-4.54.1-cp38-cp38-win_amd64.whl", hash = "sha256:ada215fd079e23e060157aab12eba0d66704316547f334eee9ff26f8c0d7b8ab"}, - {file = "fonttools-4.54.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:f5b8a096e649768c2f4233f947cf9737f8dbf8728b90e2771e2497c6e3d21d13"}, - {file = "fonttools-4.54.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4e10d2e0a12e18f4e2dd031e1bf7c3d7017be5c8dbe524d07706179f355c5dac"}, - {file = "fonttools-4.54.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:31c32d7d4b0958600eac75eaf524b7b7cb68d3a8c196635252b7a2c30d80e986"}, - {file = "fonttools-4.54.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c39287f5c8f4a0c5a55daf9eaf9ccd223ea59eed3f6d467133cc727d7b943a55"}, - {file = "fonttools-4.54.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:a7a310c6e0471602fe3bf8efaf193d396ea561486aeaa7adc1f132e02d30c4b9"}, - {file = "fonttools-4.54.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:d3b659d1029946f4ff9b6183984578041b520ce0f8fb7078bb37ec7445806b33"}, - {file = "fonttools-4.54.1-cp39-cp39-win32.whl", hash = "sha256:e96bc94c8cda58f577277d4a71f51c8e2129b8b36fd05adece6320dd3d57de8a"}, - {file = "fonttools-4.54.1-cp39-cp39-win_amd64.whl", hash = "sha256:e8a4b261c1ef91e7188a30571be6ad98d1c6d9fa2427244c545e2fa0a2494dd7"}, - {file = "fonttools-4.54.1-py3-none-any.whl", hash = "sha256:37cddd62d83dc4f72f7c3f3c2bcf2697e89a30efb152079896544a93907733bd"}, - {file = "fonttools-4.54.1.tar.gz", hash = "sha256:957f669d4922f92c171ba01bef7f29410668db09f6c02111e22b2bce446f3285"}, + {file = "fonttools-4.55.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:51c029d4c0608a21a3d3d169dfc3fb776fde38f00b35ca11fdab63ba10a16f61"}, + {file = "fonttools-4.55.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:bca35b4e411362feab28e576ea10f11268b1aeed883b9f22ed05675b1e06ac69"}, + {file = "fonttools-4.55.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9ce4ba6981e10f7e0ccff6348e9775ce25ffadbee70c9fd1a3737e3e9f5fa74f"}, + {file = "fonttools-4.55.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:31d00f9852a6051dac23294a4cf2df80ced85d1d173a61ba90a3d8f5abc63c60"}, + {file = "fonttools-4.55.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:e198e494ca6e11f254bac37a680473a311a88cd40e58f9cc4dc4911dfb686ec6"}, + {file = "fonttools-4.55.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:7208856f61770895e79732e1dcbe49d77bd5783adf73ae35f87fcc267df9db81"}, + {file = "fonttools-4.55.0-cp310-cp310-win32.whl", hash = "sha256:e7e6a352ff9e46e8ef8a3b1fe2c4478f8a553e1b5a479f2e899f9dc5f2055880"}, + {file = "fonttools-4.55.0-cp310-cp310-win_amd64.whl", hash = "sha256:636caaeefe586d7c84b5ee0734c1a5ab2dae619dc21c5cf336f304ddb8f6001b"}, + {file = "fonttools-4.55.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:fa34aa175c91477485c44ddfbb51827d470011e558dfd5c7309eb31bef19ec51"}, + {file = "fonttools-4.55.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:37dbb3fdc2ef7302d3199fb12468481cbebaee849e4b04bc55b77c24e3c49189"}, + {file = "fonttools-4.55.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b5263d8e7ef3c0ae87fbce7f3ec2f546dc898d44a337e95695af2cd5ea21a967"}, + {file = "fonttools-4.55.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f307f6b5bf9e86891213b293e538d292cd1677e06d9faaa4bf9c086ad5f132f6"}, + {file = "fonttools-4.55.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:f0a4b52238e7b54f998d6a56b46a2c56b59c74d4f8a6747fb9d4042190f37cd3"}, + {file = "fonttools-4.55.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:3e569711464f777a5d4ef522e781dc33f8095ab5efd7548958b36079a9f2f88c"}, + {file = "fonttools-4.55.0-cp311-cp311-win32.whl", hash = "sha256:2b3ab90ec0f7b76c983950ac601b58949f47aca14c3f21eed858b38d7ec42b05"}, + {file = "fonttools-4.55.0-cp311-cp311-win_amd64.whl", hash = "sha256:aa046f6a63bb2ad521004b2769095d4c9480c02c1efa7d7796b37826508980b6"}, + {file = "fonttools-4.55.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:838d2d8870f84fc785528a692e724f2379d5abd3fc9dad4d32f91cf99b41e4a7"}, + {file = "fonttools-4.55.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:f46b863d74bab7bb0d395f3b68d3f52a03444964e67ce5c43ce43a75efce9246"}, + {file = "fonttools-4.55.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:33b52a9cfe4e658e21b1f669f7309b4067910321757fec53802ca8f6eae96a5a"}, + {file = "fonttools-4.55.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:732a9a63d6ea4a81b1b25a1f2e5e143761b40c2e1b79bb2b68e4893f45139a40"}, + {file = "fonttools-4.55.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:7dd91ac3fcb4c491bb4763b820bcab6c41c784111c24172616f02f4bc227c17d"}, + {file = "fonttools-4.55.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:1f0e115281a32ff532118aa851ef497a1b7cda617f4621c1cdf81ace3e36fb0c"}, + {file = "fonttools-4.55.0-cp312-cp312-win32.whl", hash = "sha256:6c99b5205844f48a05cb58d4a8110a44d3038c67ed1d79eb733c4953c628b0f6"}, + {file = "fonttools-4.55.0-cp312-cp312-win_amd64.whl", hash = "sha256:f8c8c76037d05652510ae45be1cd8fb5dd2fd9afec92a25374ac82255993d57c"}, + {file = "fonttools-4.55.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:8118dc571921dc9e4b288d9cb423ceaf886d195a2e5329cc427df82bba872cd9"}, + {file = "fonttools-4.55.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:01124f2ca6c29fad4132d930da69158d3f49b2350e4a779e1efbe0e82bd63f6c"}, + {file = "fonttools-4.55.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:81ffd58d2691f11f7c8438796e9f21c374828805d33e83ff4b76e4635633674c"}, + {file = "fonttools-4.55.0-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5435e5f1eb893c35c2bc2b9cd3c9596b0fcb0a59e7a14121562986dd4c47b8dd"}, + {file = "fonttools-4.55.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:d12081729280c39d001edd0f4f06d696014c26e6e9a0a55488fabc37c28945e4"}, + {file = "fonttools-4.55.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:a7ad1f1b98ab6cb927ab924a38a8649f1ffd7525c75fe5b594f5dab17af70e18"}, + {file = "fonttools-4.55.0-cp313-cp313-win32.whl", hash = "sha256:abe62987c37630dca69a104266277216de1023cf570c1643bb3a19a9509e7a1b"}, + {file = "fonttools-4.55.0-cp313-cp313-win_amd64.whl", hash = "sha256:2863555ba90b573e4201feaf87a7e71ca3b97c05aa4d63548a4b69ea16c9e998"}, + {file = "fonttools-4.55.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:00f7cf55ad58a57ba421b6a40945b85ac7cc73094fb4949c41171d3619a3a47e"}, + {file = "fonttools-4.55.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:f27526042efd6f67bfb0cc2f1610fa20364396f8b1fc5edb9f45bb815fb090b2"}, + {file = "fonttools-4.55.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e8e67974326af6a8879dc2a4ec63ab2910a1c1a9680ccd63e4a690950fceddbe"}, + {file = "fonttools-4.55.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:61dc0a13451143c5e987dec5254d9d428f3c2789a549a7cf4f815b63b310c1cc"}, + {file = "fonttools-4.55.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:b2e526b325a903868c62155a6a7e24df53f6ce4c5c3160214d8fe1be2c41b478"}, + {file = "fonttools-4.55.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:b7ef9068a1297714e6fefe5932c33b058aa1d45a2b8be32a4c6dee602ae22b5c"}, + {file = "fonttools-4.55.0-cp38-cp38-win32.whl", hash = "sha256:55718e8071be35dff098976bc249fc243b58efa263768c611be17fe55975d40a"}, + {file = "fonttools-4.55.0-cp38-cp38-win_amd64.whl", hash = "sha256:553bd4f8cc327f310c20158e345e8174c8eed49937fb047a8bda51daf2c353c8"}, + {file = "fonttools-4.55.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:3f901cef813f7c318b77d1c5c14cf7403bae5cb977cede023e22ba4316f0a8f6"}, + {file = "fonttools-4.55.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8c9679fc0dd7e8a5351d321d8d29a498255e69387590a86b596a45659a39eb0d"}, + {file = "fonttools-4.55.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dd2820a8b632f3307ebb0bf57948511c2208e34a4939cf978333bc0a3f11f838"}, + {file = "fonttools-4.55.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:23bbbb49bec613a32ed1b43df0f2b172313cee690c2509f1af8fdedcf0a17438"}, + {file = "fonttools-4.55.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:a656652e1f5d55b9728937a7e7d509b73d23109cddd4e89ee4f49bde03b736c6"}, + {file = "fonttools-4.55.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:f50a1f455902208486fbca47ce33054208a4e437b38da49d6721ce2fef732fcf"}, + {file = "fonttools-4.55.0-cp39-cp39-win32.whl", hash = "sha256:161d1ac54c73d82a3cded44202d0218ab007fde8cf194a23d3dd83f7177a2f03"}, + {file = "fonttools-4.55.0-cp39-cp39-win_amd64.whl", hash = "sha256:ca7fd6987c68414fece41c96836e945e1f320cda56fc96ffdc16e54a44ec57a2"}, + {file = "fonttools-4.55.0-py3-none-any.whl", hash = "sha256:12db5888cd4dd3fcc9f0ee60c6edd3c7e1fd44b7dd0f31381ea03df68f8a153f"}, + {file = "fonttools-4.55.0.tar.gz", hash = "sha256:7636acc6ab733572d5e7eec922b254ead611f1cdad17be3f0be7418e8bfaca71"}, ] [package.extras] @@ -591,29 +582,29 @@ six = ">=1.5" [[package]] name = "ruff" -version = "0.7.3" +version = "0.7.4" description = "An extremely fast Python linter and code formatter, written in Rust." optional = false python-versions = ">=3.7" files = [ - {file = "ruff-0.7.3-py3-none-linux_armv6l.whl", hash = "sha256:34f2339dc22687ec7e7002792d1f50712bf84a13d5152e75712ac08be565d344"}, - {file = "ruff-0.7.3-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:fb397332a1879b9764a3455a0bb1087bda876c2db8aca3a3cbb67b3dbce8cda0"}, - {file = "ruff-0.7.3-py3-none-macosx_11_0_arm64.whl", hash = "sha256:37d0b619546103274e7f62643d14e1adcbccb242efda4e4bdb9544d7764782e9"}, - {file = "ruff-0.7.3-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5d59f0c3ee4d1a6787614e7135b72e21024875266101142a09a61439cb6e38a5"}, - {file = "ruff-0.7.3-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:44eb93c2499a169d49fafd07bc62ac89b1bc800b197e50ff4633aed212569299"}, - {file = "ruff-0.7.3-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6d0242ce53f3a576c35ee32d907475a8d569944c0407f91d207c8af5be5dae4e"}, - {file = "ruff-0.7.3-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:6b6224af8b5e09772c2ecb8dc9f3f344c1aa48201c7f07e7315367f6dd90ac29"}, - {file = "ruff-0.7.3-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c50f95a82b94421c964fae4c27c0242890a20fe67d203d127e84fbb8013855f5"}, - {file = "ruff-0.7.3-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7f3eff9961b5d2644bcf1616c606e93baa2d6b349e8aa8b035f654df252c8c67"}, - {file = "ruff-0.7.3-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b8963cab06d130c4df2fd52c84e9f10d297826d2e8169ae0c798b6221be1d1d2"}, - {file = "ruff-0.7.3-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:61b46049d6edc0e4317fb14b33bd693245281a3007288b68a3f5b74a22a0746d"}, - {file = "ruff-0.7.3-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:10ebce7696afe4644e8c1a23b3cf8c0f2193a310c18387c06e583ae9ef284de2"}, - {file = "ruff-0.7.3-py3-none-musllinux_1_2_i686.whl", hash = "sha256:3f36d56326b3aef8eeee150b700e519880d1aab92f471eefdef656fd57492aa2"}, - {file = "ruff-0.7.3-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:5d024301109a0007b78d57ab0ba190087b43dce852e552734ebf0b0b85e4fb16"}, - {file = "ruff-0.7.3-py3-none-win32.whl", hash = "sha256:4ba81a5f0c5478aa61674c5a2194de8b02652f17addf8dfc40c8937e6e7d79fc"}, - {file = "ruff-0.7.3-py3-none-win_amd64.whl", hash = "sha256:588a9ff2fecf01025ed065fe28809cd5a53b43505f48b69a1ac7707b1b7e4088"}, - {file = "ruff-0.7.3-py3-none-win_arm64.whl", hash = "sha256:1713e2c5545863cdbfe2cbce21f69ffaf37b813bfd1fb3b90dc9a6f1963f5a8c"}, - {file = "ruff-0.7.3.tar.gz", hash = "sha256:e1d1ba2e40b6e71a61b063354d04be669ab0d39c352461f3d789cac68b54a313"}, + {file = "ruff-0.7.4-py3-none-linux_armv6l.whl", hash = "sha256:a4919925e7684a3f18e18243cd6bea7cfb8e968a6eaa8437971f681b7ec51478"}, + {file = "ruff-0.7.4-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:cfb365c135b830778dda8c04fb7d4280ed0b984e1aec27f574445231e20d6c63"}, + {file = "ruff-0.7.4-py3-none-macosx_11_0_arm64.whl", hash = "sha256:63a569b36bc66fbadec5beaa539dd81e0527cb258b94e29e0531ce41bacc1f20"}, + {file = "ruff-0.7.4-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0d06218747d361d06fd2fdac734e7fa92df36df93035db3dc2ad7aa9852cb109"}, + {file = "ruff-0.7.4-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e0cea28d0944f74ebc33e9f934238f15c758841f9f5edd180b5315c203293452"}, + {file = "ruff-0.7.4-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:80094ecd4793c68b2571b128f91754d60f692d64bc0d7272ec9197fdd09bf9ea"}, + {file = "ruff-0.7.4-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:997512325c6620d1c4c2b15db49ef59543ef9cd0f4aa8065ec2ae5103cedc7e7"}, + {file = "ruff-0.7.4-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:00b4cf3a6b5fad6d1a66e7574d78956bbd09abfd6c8a997798f01f5da3d46a05"}, + {file = "ruff-0.7.4-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7dbdc7d8274e1422722933d1edddfdc65b4336abf0b16dfcb9dedd6e6a517d06"}, + {file = "ruff-0.7.4-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0e92dfb5f00eaedb1501b2f906ccabfd67b2355bdf117fea9719fc99ac2145bc"}, + {file = "ruff-0.7.4-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:3bd726099f277d735dc38900b6a8d6cf070f80828877941983a57bca1cd92172"}, + {file = "ruff-0.7.4-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:2e32829c429dd081ee5ba39aef436603e5b22335c3d3fff013cd585806a6486a"}, + {file = "ruff-0.7.4-py3-none-musllinux_1_2_i686.whl", hash = "sha256:662a63b4971807623f6f90c1fb664613f67cc182dc4d991471c23c541fee62dd"}, + {file = "ruff-0.7.4-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:876f5e09eaae3eb76814c1d3b68879891d6fde4824c015d48e7a7da4cf066a3a"}, + {file = "ruff-0.7.4-py3-none-win32.whl", hash = "sha256:75c53f54904be42dd52a548728a5b572344b50d9b2873d13a3f8c5e3b91f5cac"}, + {file = "ruff-0.7.4-py3-none-win_amd64.whl", hash = "sha256:745775c7b39f914238ed1f1b0bebed0b9155a17cd8bc0b08d3c87e4703b990d6"}, + {file = "ruff-0.7.4-py3-none-win_arm64.whl", hash = "sha256:11bff065102c3ae9d3ea4dc9ecdfe5a5171349cdd0787c1fc64761212fc9cf1f"}, + {file = "ruff-0.7.4.tar.gz", hash = "sha256:cd12e35031f5af6b9b93715d8c4f40360070b2041f81273d0527683d5708fce2"}, ] [[package]] diff --git a/pyplot.py b/pyplot.py index 8055672..523db7f 100755 --- a/pyplot.py +++ b/pyplot.py @@ -9,99 +9,33 @@ from datetime import datetime import cv2 -import matplotlib.animation as animation -import matplotlib.patches as patches import matplotlib.pyplot as plt import numpy as np import serial +from matplotlib import animation, patches from matplotlib.backend_bases import MouseButton from mpl_toolkits.axes_grid1 import make_axes_locatable import irpythermal import utils -fps = 40 -exposure = { - "auto": True, - "auto_type": "ends", # 'center' or 'ends' - "T_min": 0.0, - "T_max": 50.0, - "T_margin": 2.0, -} -draw_temp = True - -# Argument parsing -parser = argparse.ArgumentParser(description="Thermal Camera Viewer") -parser.add_argument("-r", "--rawcam", action="store_true", help="use the raw camera") -parser.add_argument("-d", "--device", type=str, help="use the camera at camera_path") -parser.add_argument( - "-o", "--offset", type=float, help="set a fixed offset for the temperature data" -) - -# lock in thermometry options (all of these are requred) -parser.add_argument( - "-l", - "--lockin", - type=float, - help="enable lock-in thermometry with the given frequency (in Hz), ideally several times smaller than the camera fps", -) -parser.add_argument( - "-p", - "--port", - type=str, - help="set the serial port for the power supply control (will send 1 to turn on the load, 0 to turn it off new line terminated) at 115200 baud", -) -parser.add_argument( - "-i", - "--integration", - type=float, - help="set the integration time for the lock-in thermometry (in seconds)", -) - - -parser.add_argument( - "file", nargs="?", type=str, help="use the emulator with the data in file.npy" -) -args = parser.parse_args() - -# Choose the camera class -camera: irpythermal.Camera - -lockin = False - -if args.file and args.file.endswith(".npy"): - camera = irpythermal.CameraEmulator(args.file) -else: - camera_kwargs = {} - if args.rawcam: - camera_kwargs["camera_raw"] = True - if args.device: - camera_path = args.device - cv2_cam = cv2.VideoCapture(camera_path) - camera_kwargs["video_dev"] = cv2_cam - if args.offset: - camera_kwargs["fixed_offset"] = args.offset - - if args.lockin: - lockin = True - draw_temp = False - # check if all lock-in thermometry options are provided - if not args.port or not args.integration: - print( - "Error: lock-in thermometry also requires --port and --integration options" - ) - sys.exit(1) - - fequency = args.lockin - port = args.port - integration = args.integration - - camera = irpythermal.Camera(**camera_kwargs) +# TODO(frans): We should get rid of those +# ruff: noqa: PTH123 # use Path.open +# ruff: noqa: ANN201,ANN001 # type annotations +# ruff: noqa: DTZ005 # timezone missing +# ruff: noqa: RUF005 # tuple / list concatenation +# ruff: noqa: D100,D101,D103 # documentation missing +# ruff: noqa: PLR0915 # too many statements +# ruff: noqa: C901 # function too complex +# ruff: noqa: PLR0912 # too many branches +# ruff: noqa: FIX002 # fix instead of TODO +# ruff: noqa: ERA001 # commented out code +# ruff: noqa: SIM105,S110,E722 # exceptions # see https://matplotlib.org/tutorials/colors/colormaps.html -cmaps_idx = 1 -cmaps = [ +CMAP_NAMES = [ "inferno", + "plasma", "coolwarm", "cividis", "jet", @@ -111,110 +45,221 @@ "tab10", ] -# matplotlib.rcParams['toolbar'] = 'None' - -# temporary fake frame -frame = np.full((camera.height, camera.width), 25.0) -quad_frame = np.full((camera.height, camera.width), 0.0) -in_phase_frame = np.full((camera.height, camera.width), 0.0) -lut = None # will be defined later -start_skips = 2 -is_capturing = False -lock = threading.Lock() -lock_in_thread = None - - -if lockin: - fig, axes = plt.subplots(nrows=2, ncols=2, layout="tight") - ax = axes[0][0] - im = axes[0][0].imshow(frame, cmap=cmaps[cmaps_idx]) - im_in_phase = axes[0][1].imshow(frame, cmap=cmaps[cmaps_idx]) - im_quadrature = axes[1][1].imshow(frame, cmap=cmaps[cmaps_idx]) - axes[0][0].set_title("Live") - axes[0][1].set_title("In-phase") - axes[1][1].set_title("Quadrature") - divider = make_axes_locatable(axes[0][0]) - divider_in_phase = make_axes_locatable(axes[0][1]) - divider_quadrature = make_axes_locatable(axes[1][1]) - cax = divider.append_axes("right", size="5%", pad=0.05) - cax_in_phase = divider_in_phase.append_axes("right", size="5%", pad=0.05) - cax_quadrature = divider_quadrature.append_axes("right", size="5%", pad=0.05) - cbar = plt.colorbar(im, cax=cax) - cbar_in_phase = plt.colorbar(im_in_phase, cax=cax_in_phase) - cbar_quadrature = plt.colorbar(im_quadrature, cax=cax_quadrature) - - axes[1][0].axis("off") - status_text = """ -Frame: -, -Time: -/-, -Load: -, -Frequency: -Hz, -Integration Time: -s -Serial Port: - -""" - status_text_obj = axes[1][0].text( - 0.05, - 0.95, - status_text, - verticalalignment="top", - horizontalalignment="left", - transform=axes[1][0].transAxes, - fontsize=12, - color="black", + +def parse_arguments() -> argparse.Namespace: + """Parse command line arguments.""" + parser = argparse.ArgumentParser(description="Thermal Camera Viewer") + parser.add_argument( + "-r", "--rawcam", action="store_true", help="use the raw camera" + ) + parser.add_argument( + "-d", "--device", type=str, help="use the camera at camera_path" + ) + parser.add_argument( + "-o", + "--offset", + type=float, + help="set a fixed offset for the temperature data", + ) + + # lock in thermometry options (all of these are requred) + parser.add_argument( + "-l", + "--lockin", + type=float, + help=( + "enable lock-in thermometry with the given frequency (in Hz)," + " ideally several times smaller than the camera fps" + ), + ) + parser.add_argument( + "-p", + "--port", + type=str, + help=( + "set the serial port for the power supply control (will send 1 to turn on" + " the load, 0 to turn it off new line terminated) at 115200 baud" + ), ) + parser.add_argument( + "-i", + "--integration", + type=float, + help="set the integration time for the lock-in thermometry (in seconds)", + ) + parser.add_argument( + "file", nargs="?", type=str, help="use the emulator with the data in file.npy" + ) + return parser.parse_args() + -else: - fig = plt.figure() - ax = plt.gca() - im = ax.imshow(frame, cmap=cmaps[cmaps_idx]) - divider = make_axes_locatable(ax) - cax = divider.append_axes("right", size="5%", pad=0.05) - cbar = plt.colorbar(im, cax=cax) +args = parse_arguments() -try: - fig.canvas.set_window_title("Thermal Camera") -except: - # does not work on windows - pass -annotations = utils.Annotations(ax, patches) -temp_annotations = { - "std": {"Tmin": "lightblue", "Tmax": "red", "Tcenter": "yellow"}, - "user": {}, -} +class AppState: + def __init__(self, args: argparse.Namespace) -> None: + """Set up a default application state.""" + self.fps = 40 + self.exposure = { + "auto": True, + "auto_type": "ends", # 'center' or 'ends' + "T_min": 0.0, + "T_max": 50.0, + "T_margin": 2.0, + } + self.draw_temp = True + + # Choose the camera class + self.camera: irpythermal.Camera + self.lockin = False + + if args.file and args.file.endswith(".npy"): + self.camera = irpythermal.CameraEmulator(args.file) + else: + camera_kwargs = {} + if args.rawcam: + camera_kwargs["camera_raw"] = True + if args.device: + camera_path = args.device + cv2_cam = cv2.VideoCapture(camera_path) + camera_kwargs["video_dev"] = cv2_cam + if args.offset: + camera_kwargs["fixed_offset"] = args.offset + + if args.lockin: + self.lockin = True + self.draw_temp = False + # check if all lock-in thermometry options are provided + if not args.port or not args.integration: + print( + "Error: lock-in thermometry also requires --port and" + " --integration options" + ) + sys.exit(1) + + self.fequency = args.lockin + self.port = args.port + self.integration = args.integration + + self.camera = irpythermal.Camera(**camera_kwargs) + + self.cmaps_idx = 1 + + # matplotlib.rcParams['toolbar'] = 'None' + + # temporary fake frame + self.frame = np.full((self.camera.height, self.camera.width), 25.0) + self.quad_frame = np.full((self.camera.height, self.camera.width), 0.0) + self.in_phase_frame = np.full((self.camera.height, self.camera.width), 0.0) + self.lut = None # will be defined later + self.start_skips = 2 + self.is_capturing = False + self.lock = threading.Lock() + self.lock_in_thread = None + + if self.lockin: + self.fig, self.axes = plt.subplots(nrows=2, ncols=2, layout="tight") + axes = self.axes + self.ax = axes[0][0] + self.im = axes[0][0].imshow(self.frame, cmap=CMAP_NAMES[self.cmaps_idx]) + im_in_phase = axes[0][1].imshow(self.frame, cmap=CMAP_NAMES[self.cmaps_idx]) + im_quadrature = axes[1][1].imshow( + self.frame, cmap=CMAP_NAMES[self.cmaps_idx] + ) + axes[0][0].set_title("Live") + axes[0][1].set_title("In-phase") + axes[1][1].set_title("Quadrature") + divider = make_axes_locatable(axes[0][0]) + divider_in_phase = make_axes_locatable(axes[0][1]) + divider_quadrature = make_axes_locatable(axes[1][1]) + cax = divider.append_axes("right", size="5%", pad=0.05) + cax_in_phase = divider_in_phase.append_axes("right", size="5%", pad=0.05) + cax_quadrature = divider_quadrature.append_axes( + "right", size="5%", pad=0.05 + ) + plt.colorbar(self.im, cax=cax) + self.cbar_in_phase = plt.colorbar(im_in_phase, cax=cax_in_phase) + self.cbar_quadrature = plt.colorbar(im_quadrature, cax=cax_quadrature) + + axes[1][0].axis("off") + status_text = """ + Frame: -, + Time: -/-, + Load: -, + Frequency: -Hz, + Integration Time: -s + Serial Port: - + """ + self.status_text_obj = axes[1][0].text( + 0.05, + 0.95, + status_text, + verticalalignment="top", + horizontalalignment="left", + transform=axes[1][0].transAxes, + fontsize=12, + color="black", + ) + + else: + self.fig = plt.figure() + self.ax = plt.gca() + self.im = self.ax.imshow(self.frame, cmap=CMAP_NAMES[self.cmaps_idx]) + divider = make_axes_locatable(self.ax) + cax = divider.append_axes("right", size="5%", pad=0.05) + plt.colorbar(self.im, cax=cax) -# Add the patch to the Axes -roi = ((0, 0), (0, 0)) + try: + self.fig.canvas.set_window_title("Thermal Camera") + except: + # does not work on windows + pass + self.annotations = utils.Annotations(self.ax, patches) + self.temp_annotations = { + "std": {"Tmin": "lightblue", "Tmax": "red", "Tcenter": "yellow"}, + "user": {}, + } -paused = False -update_colormap = True -diff = {"enabled": False, "annotation_enabled": False, "frame": np.zeros(frame.shape)} + # Add the patch to the Axes + self.roi = ((0, 0), (0, 0)) + self.paused = False + self.update_colormap = True + self.diff = { + "enabled": False, + "annotation_enabled": False, + "frame": np.zeros(self.frame.shape), + } -csv_filename = None + self.csv_filename = None + self.mouse_action_pos = (0, 0) + self.mouse_action = None -def log_annotations_to_csv(annotation_frame): +app_state = AppState(args) + + +def log_annotations_to_csv(annotation_frame) -> None: anns_data = [] - for type in ["std", "user"]: - for ann_name in temp_annotations[type]: - pos = annotations.get_pos(ann_name) - val = round(annotations.get_val(ann_name, annotation_frame), 2) + for ann_type in ["std", "user"]: + for ann_name in app_state.temp_annotations[ann_type]: + pos = app_state.annotations.get_pos(ann_name) + val = round(app_state.annotations.get_val(ann_name, annotation_frame), 2) anns_data += [pos[0], pos[1], val] # store each position and value - if csv_filename is not None: - with open(csv_filename, "a", newline="") as f: + if app_state.csv_filename is not None: + with open(app_state.csv_filename, "a", newline="") as f: writer = csv.writer(f) writer.writerow([datetime.now()] + anns_data) def get_lockin_frame(freq, port, integration): - """This function will perform all of the lock-in thermometry operations, and return - the in-phase and quadrature frames after the integration time is up, while controlling - the load via serial communication based on the period of the signal.""" - - global frame, is_capturing, status_text + """ + Perform all of the lock-in thermometry operations. + Returns the in-phase and quadrature frames after the integration time is up, while + controlling the load via serial communication based on the period of the signal. + """ try: ser = serial.Serial(port, 115200) # Open the serial port except serial.SerialException as exc: @@ -222,8 +267,8 @@ def get_lockin_frame(freq, port, integration): sys.exit(1) start_time = time.time() - in_phase_sum = np.zeros((camera.height, camera.width)) - quadrature_sum = np.zeros((camera.height, camera.width)) + in_phase_sum = np.zeros((app_state.camera.height, app_state.camera.width)) + quadrature_sum = np.zeros((app_state.camera.height, app_state.camera.width)) total_frames = 0 # Calculate the period of the signal @@ -234,10 +279,10 @@ def get_lockin_frame(freq, port, integration): while (time.time() - start_time) < integration: current_time = time.time() - start_time # Time since the loop started - ret, raw_frame = camera.read() - info, lut = camera.info() + ret, raw_frame = app_state.camera.read() + info, lut = app_state.camera.info() - frame = camera.convert_to_frame(raw_frame, lut) + app_state.frame = app_state.camera.convert_to_frame(raw_frame, lut) if not ret: print("Error: could not read frame from camera") @@ -246,9 +291,9 @@ def get_lockin_frame(freq, port, integration): total_frames += 1 # if(total_frames % 10 == 0): - # print(f'Frame: {total_frames}, Time: {current_time:.2f}/{integration:.2f}') # Debugging statement + # print(f'Frame: {total_frames}, Time: {current_time:.2f}/{integration:.2f}') if True: - status_text = f""" + app_state.status_text = f""" Frame: {total_frames}, Time: {current_time:.2f}/{integration:.2f}, Load: {load_on}, @@ -267,7 +312,7 @@ def get_lockin_frame(freq, port, integration): ser.write(b"1\n") # Send 1 to turn the load on load_on = True - # print(f'Load state: {load_on}, Time: {current_time}') # Debugging statement + # print(f'Load state: {load_on}, Time: {current_time}') # debugging # Update the last toggle time last_toggle_time += half_period @@ -279,7 +324,8 @@ def get_lockin_frame(freq, port, integration): sin_weight = 2 * math.sin(phase) cos_weight = -2 * math.cos(phase) - # print(f"time: {current_time}, phase: {phase}, sin: {sin_weight}, cos: {cos_weight} , load: {load_on}") + # print(f"time: {current_time}, phase: {phase}" + # f", sin: {sin_weight}, cos: {cos_weight} , load: {load_on}") # Multiply the frame by sin and cos to get in-phase and quadrature components in_phase = raw_frame * sin_weight @@ -289,7 +335,7 @@ def get_lockin_frame(freq, port, integration): in_phase_sum += in_phase quadrature_sum += quadrature - if not is_capturing: + if not app_state.is_capturing: break ser.write(b"0\n") @@ -303,92 +349,94 @@ def get_lockin_frame(freq, port, integration): def capture_lock_in(): - global is_capturing, quad_frame, in_phase_frame, lock, fequency, port, integration - - while is_capturing: - in_phase, quad = get_lockin_frame(fequency, port, integration) + while app_state.is_capturing: + in_phase, quad = get_lockin_frame( + app_state.fequency, app_state.port, app_state.integration + ) if in_phase is not None and quad is not None: - with lock: - in_phase_frame = in_phase - quad_frame = quad + with app_state.lock: + app_state.in_phase_frame = in_phase + app_state.quad_frame = quad def start_capture(): - global is_capturing - is_capturing = True + app_state.is_capturing = True thread = threading.Thread(target=capture_lock_in) thread.start() return thread def stop_capture(thread): - global is_capturing - is_capturing = False + app_state.is_capturing = False if thread is not None: thread.join() -def animate_func(i): - global \ - frame, \ - in_phase_frame, \ - quad_frame, \ - paused, \ - update_colormap, \ - exposure, \ - im, \ - diff, \ - start_skips, \ - lock_in_thread - if lockin and start_skips > 0: - frame = camera.get_frame() - start_skips -= 1 - elif lockin: - if not is_capturing: - lock_in_thread = start_capture() +def animate_func(_frame: int) -> None: + if app_state.lockin and app_state.start_skips > 0: + app_state.frame = app_state.camera.get_frame() + app_state.start_skips -= 1 + elif app_state.lockin: + if not app_state.is_capturing: + app_state.lock_in_thread = start_capture() # in_phase_frame, quad_frame = get_lockin_frame(fequency, port, integration) else: - frame = camera.get_frame() + app_state.frame = app_state.camera.get_frame() - if not paused: - if diff["enabled"]: - show_frame = frame - diff["frame"] + if not app_state.paused: + if app_state.diff["enabled"]: + show_frame = app_state.frame - app_state.diff["frame"] else: - show_frame = frame + show_frame = app_state.frame - if diff["annotation_enabled"]: - annotation_frame = frame - diff["frame"] + if app_state.diff["annotation_enabled"]: + annotation_frame = app_state.frame - app_state.diff["frame"] else: - annotation_frame = frame + annotation_frame = app_state.frame - im.set_array(show_frame) - if lockin: - im_in_phase.set_array(in_phase_frame) - im_quadrature.set_array(quad_frame) + app_state.im.set_array(show_frame) + if app_state.lockin: + app_state.im_in_phase.set_array(app_state.in_phase_frame) + app_state.im_quadrature.set_array(app_state.quad_frame) - annotations.update(temp_annotations, annotation_frame, draw_temp) + app_state.annotations.update( + app_state.temp_annotations, annotation_frame, app_state.draw_temp + ) - if exposure["auto"]: - update_colormap = utils.autoExposure(update_colormap, exposure, show_frame) + if app_state.exposure["auto"]: + app_state.update_colormap = utils.autoExposure( + app_state.update_colormap, app_state.exposure, show_frame + ) - # TODO deal with saving the lock in stuff to a file + # TODO: deal with saving the lock in stuff to a file log_annotations_to_csv(annotation_frame) - if update_colormap: - im.set_clim(exposure["T_min"], exposure["T_max"]) - fig.canvas.draw_idle() # force update all, even with blit=True - update_colormap = False + if app_state.update_colormap: + app_state.im.set_clim( + app_state.exposure["T_min"], app_state.exposure["T_max"] + ) + app_state.fig.canvas.draw_idle() # force update all, even with blit=True + app_state.update_colormap = False return [] - if lockin: + if app_state.lockin: # adjust the color limits for the in-phase and quadrature frames - im_in_phase.set_clim(np.min(in_phase_frame), np.max(in_phase_frame)) - im_quadrature.set_clim(np.min(quad_frame), np.max(quad_frame)) - new_status_text = status_text - status_text_obj.set_text(new_status_text) - return [im, im_in_phase, im_quadrature, status_text_obj] + annotations.get() + app_state.im_in_phase.set_clim( + np.min(app_state.in_phase_frame), np.max(app_state.in_phase_frame) + ) + app_state.im_quadrature.set_clim( + np.min(app_state.quad_frame), np.max(app_state.quad_frame) + ) + new_status_text = app_state.status_text + app_state.status_text_obj.set_text(new_status_text) + return [ + app_state.im, + app_state.im_in_phase, + app_state.im_quadrature, + app_state.status_text_obj, + ] + app_state.annotations.get() - return [im] + annotations.get() + return [app_state.im] + app_state.annotations.get() def print_help(): @@ -421,67 +469,75 @@ def print_help(): # keyboard def press(event): - global \ - paused, \ - exposure, \ - update_colormap, \ - cmaps_idx, \ - draw_temp, \ - temp_extra_annotations, \ - csv_filename - global lut, frame, diff, annotations, roi if event.key == "h": print_help() if event.key == " ": - paused ^= True - print("paused:", paused) + app_state.paused ^= True + print("paused:", app_state.paused) if event.key == "d": - diff["frame"] = frame - diff["annotation_enabled"] = diff["enabled"] = True + app_state.diff["frame"] = app_state.frame + app_state.diff["annotation_enabled"] = app_state.diff["enabled"] = True print("set diff") if event.key == "x": - diff["enabled"] ^= True - print("enable diff:", diff["enabled"]) + app_state.diff["enabled"] ^= True + print("enable diff:", app_state.diff["enabled"]) if event.key == "c": - diff["annotation_enabled"] ^= True - print("enable annotation diff:", diff["annotation_enabled"]) + app_state.diff["annotation_enabled"] ^= True + print("enable annotation diff:", app_state.diff["annotation_enabled"]) if event.key == "t": - draw_temp ^= True - print("draw temp:", draw_temp) + app_state.draw_temp ^= True + print("draw temp:", app_state.draw_temp) if event.key == "e": - print("removing user annotations: ", len(temp_annotations["user"])) - annotations.remove(temp_annotations["user"]) + print("removing user annotations: ", len(app_state.temp_annotations["user"])) + app_state.annotations.remove(app_state.temp_annotations["user"]) if event.key == "u": print("calibrate") - camera.calibrate() + app_state.camera.calibrate() if event.key == "a": - exposure["auto"] ^= True - print("auto exposure:", exposure["auto"], ", type:", exposure["auto_type"]) + app_state.exposure["auto"] ^= True + print( + "auto exposure:", + app_state.exposure["auto"], + ", type:", + app_state.exposure["auto_type"], + ) if event.key == "z": types = ["center", "ends"] - exposure["auto_type"] = types[types.index(exposure["auto_type"]) - 1] - print("auto exposure:", exposure["auto"], ", type:", exposure["auto_type"]) + app_state.exposure["auto_type"] = types[ + types.index(app_state.exposure["auto_type"]) - 1 + ] + print( + "auto exposure:", + app_state.exposure["auto"], + ", type:", + app_state.exposure["auto_type"], + ) if event.key == "w": filename = time.strftime(FILE_NAME_FORMAT) + ".png" plt.savefig(filename) print("saved to:", filename) if event.key == "r": filename = time.strftime(FILE_NAME_FORMAT) + ".npy" - np.save(filename, camera.frame_raw_u16.reshape(camera.height + 4, camera.width)) + np.save( + filename, + app_state.camera.frame_raw_u16.reshape( + app_state.camera.height + 4, app_state.camera.width + ), + ) print("saved to:", filename) if event.key == "v": - if csv_filename is None: + if app_state.csv_filename is None: csv_filename = time.strftime(FILE_NAME_FORMAT) + ".csv" with open(csv_filename, "w", newline="") as f: header = ["time"] header += [ f"{a} {x}" - for a in temp_annotations["std"].keys() + for a in app_state.temp_annotations["std"] for x in ["x", "y", "val"] ] # t, tmin x, tmin y, tmin val, etc header += [ f"Point{i} {x}" - for i, key in enumerate(temp_annotations["user"].keys()) + for i, key in enumerate(app_state.temp_annotations["user"].keys()) for x in ["x", "y", "val"] ] csv.writer(f).writerow(header) @@ -492,91 +548,99 @@ def press(event): if event.key in [",", "."]: if event.key == ".": - cmaps_idx = (cmaps_idx + 1) % len(cmaps) + app_state.cmaps_idx = (app_state.cmaps_idx + 1) % len(CMAP_NAMES) else: - cmaps_idx = (cmaps_idx - 1) % len(cmaps) - print("color map:", cmaps[cmaps_idx]) - im.set_cmap(cmaps[cmaps_idx]) - update_colormap = True + app_state.cmaps_idx = (app_state.cmaps_idx - 1) % len(CMAP_NAMES) + print("color map:", CMAP_NAMES[app_state.cmaps_idx]) + app_state.im.set_cmap(CMAP_NAMES[app_state.cmaps_idx]) + app_state.update_colormap = True if event.key in ["k", "l"]: if event.key == "k": - camera.temperature_range_normal() + app_state.camera.temperature_range_normal() else: - camera.temperature_range_high() - camera.wait_for_range_application() # this takes care of calibration as well - update_colormap = True + app_state.camera.temperature_range_high() + # this takes care of calibration as well + app_state.camera.wait_for_range_application() + app_state.update_colormap = True if event.key in ["left", "right", "up", "down"]: - exposure["auto"] = False - T_cent = int((exposure["T_min"] + exposure["T_max"]) / 2) - d = int(exposure["T_max"] - T_cent) + app_state.exposure["auto"] = False + t_cent = int((app_state.exposure["T_min"] + app_state.exposure["T_max"]) / 2) + d = int(app_state.exposure["T_max"] - t_cent) if event.key == "up": - T_cent += exposure["T_margin"] / 2 + t_cent += app_state.exposure["T_margin"] / 2 if event.key == "down": - T_cent -= exposure["T_margin"] / 2 + t_cent -= app_state.exposure["T_margin"] / 2 if event.key == "left": - d -= exposure["T_margin"] / 2 + d -= app_state.exposure["T_margin"] / 2 if event.key == "right": - d += exposure["T_margin"] / 2 - d = max(d, exposure["T_margin"]) - exposure["T_min"] = T_cent - d - exposure["T_max"] = T_cent + d + d += app_state.exposure["T_margin"] / 2 + d = max(d, app_state.exposure["T_margin"]) + app_state.exposure["T_min"] = t_cent - d + app_state.exposure["T_max"] = t_cent + d print( "auto exposure off, T_min:", - exposure["T_min"], + app_state.exposure["T_min"], "T_cent:", - T_cent, + t_cent, "T_max:", - exposure["T_max"], + app_state.exposure["T_max"], ) - update_colormap = True - - -mouse_action_pos = (0, 0) -mouse_action = None + app_state.update_colormap = True def onclick(event): - global mouse_action, mouse_action_pos - if event.inaxes == ax: + if event.inaxes == app_state.ax: pos = (int(event.xdata), int(event.ydata)) if event.button == MouseButton.RIGHT: print("add user temperature annotation at pos:", pos) - temp_annotations["user"][pos] = "white" + app_state.temp_annotations["user"][pos] = "white" if event.button == MouseButton.LEFT: - if utils.inRoi(annotations.roi, pos, frame.shape): - mouse_action = "move_roi" - mouse_action_pos = ( - annotations.roi[0][0] - pos[0], - annotations.roi[0][1] - pos[1], + if utils.inRoi(app_state.annotations.roi, pos, app_state.frame.shape): + app_state.mouse_action = "move_roi" + app_state.mouse_action_pos = ( + app_state.annotations.roi[0][0] - pos[0], + app_state.annotations.roi[0][1] - pos[1], ) else: - mouse_action = "create_roi" - mouse_action_pos = pos - annotations.set_roi((pos, (0, 0))) + app_state.mouse_action = "create_roi" + app_state.mouse_action_pos = pos + app_state.annotations.set_roi((pos, (0, 0))) def onmotion(event): - global mouse_action, mouse_action_pos, roi - if event.inaxes == ax and event.button == MouseButton.LEFT: + if event.inaxes == app_state.ax and event.button == MouseButton.LEFT: pos = (int(event.xdata), int(event.ydata)) - if mouse_action == "create_roi": - w, h = pos[0] - mouse_action_pos[0], pos[1] - mouse_action_pos[1] - roi = (mouse_action_pos, (w, h)) - annotations.set_roi(roi) - if mouse_action == "move_roi": - roi = ( - (pos[0] + mouse_action_pos[0], pos[1] + mouse_action_pos[1]), - annotations.roi[1], + if app_state.mouse_action == "create_roi": + w, h = ( + pos[0] - app_state.mouse_action_pos[0], + pos[1] - app_state.mouse_action_pos[1], + ) + app_state.roi = (app_state.mouse_action_pos, (w, h)) + app_state.annotations.set_roi(app_state.roi) + if app_state.mouse_action == "move_roi": + app_state.roi = ( + ( + pos[0] + app_state.mouse_action_pos[0], + pos[1] + app_state.mouse_action_pos[1], + ), + app_state.annotations.roi[1], ) - annotations.set_roi(roi) + app_state.annotations.set_roi(app_state.roi) + + +def main() -> None: + _keep_me_anim = animation.FuncAnimation( + app_state.fig, animate_func, interval=1000 / app_state.fps, blit=True + ) + app_state.fig.canvas.mpl_connect("button_press_event", onclick) + app_state.fig.canvas.mpl_connect("motion_notify_event", onmotion) + app_state.fig.canvas.mpl_connect("key_press_event", press) + print_help() + plt.show() + stop_capture(app_state.lock_in_thread) + app_state.camera.release() -anim = animation.FuncAnimation(fig, animate_func, interval=1000 / fps, blit=True) -fig.canvas.mpl_connect("button_press_event", onclick) -fig.canvas.mpl_connect("motion_notify_event", onmotion) -fig.canvas.mpl_connect("key_press_event", press) -print_help() -plt.show() -stop_capture(lock_in_thread) -camera.release() +if __name__ == "__main__": + main() diff --git a/pyproject.toml b/pyproject.toml index 652de57..612132a 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -20,3 +20,14 @@ ruff = "^0.7.3" requires = ["poetry-core>=1.0.0"] build-backend = "poetry.core.masonry.api" +[tool.ruff.lint] +select = ["ALL"] +ignore = [ + "ISC001", + "COM812", # trailing comma missing + "D203", # one-blank-line-before-class + "D212", # multi-line-summary-first-line + "T201", # print-found + "TD002", # issue author missing + "TD003", # issue link missing + ] From edf7d5619f77c18c54d7c618fa9ea3f78bdf02d6 Mon Sep 17 00:00:00 2001 From: DiminDDL Date: Thu, 9 Oct 2025 21:45:10 +0200 Subject: [PATCH 23/27] added inverted output mode to lock in, and improved bugs where cv2 sometimes returns wrong values during startup --- irpythermal.py | 42 ++++++++++++++++++++++++++++++++++-------- pyplot.py | 44 ++++++++++++++++++++++++++++++++++---------- 2 files changed, 68 insertions(+), 18 deletions(-) diff --git a/irpythermal.py b/irpythermal.py index 37ab115..915e3f7 100755 --- a/irpythermal.py +++ b/irpythermal.py @@ -323,15 +323,41 @@ def info(self) -> Tuple[dict, np.ndarray]: return info, temperatureTable # read raw data from cam, seperate visible frame from metadata - def read(self, raw=False) -> Tuple[bool, np.ndarray]: - """Retunrs a raw frame from the camera""" - ret, frame_raw = self.cap.read() + def read(self, raw=False, max_retries=5, retry_delay=0.5) -> Tuple[bool, np.ndarray]: + """Returns a raw frame from the camera, retrying if the frame is incomplete.""" + for attempt in range(max_retries): + ret, frame_raw = self.cap.read() + if not ret or frame_raw is None: + time.sleep(retry_delay) + continue + + frame_data = frame_raw.view(np.uint16).ravel() + expected_size = self.height * self.width + if frame_data.size < expected_size: + # Incomplete frame, wait and retry + print( + f"[warn] Incomplete frame (got {frame_data.size}, expected {expected_size}), retrying {attempt+1}/{max_retries}" + ) + time.sleep(retry_delay) + continue + + try: + frame_visible = frame_data[: self.fourLinePara].copy().reshape( + self.height, self.width + ) + break + except ValueError: + print( + f"[warn] Reshape failed (array size {frame_data.size}), retrying {attempt+1}/{max_retries}" + ) + time.sleep(retry_delay) + continue + else: + # If we exit the loop without success + raise RuntimeError("Failed to read a complete frame from camera") + self.frame_raw_u16: np.ndarray = frame_raw.view(np.uint16).ravel() - frame_visible = ( - self.frame_raw_u16[: self.fourLinePara] - .copy() - .reshape(self.height, self.width) - ) + if raw: return ret, frame_visible if self.reference_frame is not None: diff --git a/pyplot.py b/pyplot.py index 523db7f..231dade 100755 --- a/pyplot.py +++ b/pyplot.py @@ -87,6 +87,12 @@ def parse_arguments() -> argparse.Namespace: type=float, help="set the integration time for the lock-in thermometry (in seconds)", ) + parser.add_argument( + "-n", + "--negate", + action='store_true', + help="negate the signal send to the switch device, (useful for NO switches, or N-FETs)", + ) parser.add_argument( "file", nargs="?", type=str, help="use the emulator with the data in file.npy" ) @@ -129,6 +135,7 @@ def __init__(self, args: argparse.Namespace) -> None: if args.lockin: self.lockin = True self.draw_temp = False + self.negate = False # check if all lock-in thermometry options are provided if not args.port or not args.integration: print( @@ -137,6 +144,9 @@ def __init__(self, args: argparse.Namespace) -> None: ) sys.exit(1) + if args.negate: + self.negate = True + self.fequency = args.lockin self.port = args.port self.integration = args.integration @@ -162,8 +172,8 @@ def __init__(self, args: argparse.Namespace) -> None: axes = self.axes self.ax = axes[0][0] self.im = axes[0][0].imshow(self.frame, cmap=CMAP_NAMES[self.cmaps_idx]) - im_in_phase = axes[0][1].imshow(self.frame, cmap=CMAP_NAMES[self.cmaps_idx]) - im_quadrature = axes[1][1].imshow( + self.im_in_phase = axes[0][1].imshow(self.frame, cmap=CMAP_NAMES[self.cmaps_idx]) + self.im_quadrature = axes[1][1].imshow( self.frame, cmap=CMAP_NAMES[self.cmaps_idx] ) axes[0][0].set_title("Live") @@ -178,8 +188,8 @@ def __init__(self, args: argparse.Namespace) -> None: "right", size="5%", pad=0.05 ) plt.colorbar(self.im, cax=cax) - self.cbar_in_phase = plt.colorbar(im_in_phase, cax=cax_in_phase) - self.cbar_quadrature = plt.colorbar(im_quadrature, cax=cax_quadrature) + self.cbar_in_phase = plt.colorbar(self.im_in_phase, cax=cax_in_phase) + self.cbar_quadrature = plt.colorbar(self.im_quadrature, cax=cax_quadrature) axes[1][0].axis("off") status_text = """ @@ -200,6 +210,14 @@ def __init__(self, args: argparse.Namespace) -> None: fontsize=12, color="black", ) + self.status_text = """ + Frame: -, + Time: -/-, + Load: -, + Frequency: -Hz, + Integration Time: -s + Serial Port: - + """ else: self.fig = plt.figure() @@ -253,7 +271,7 @@ def log_annotations_to_csv(annotation_frame) -> None: writer.writerow([datetime.now()] + anns_data) -def get_lockin_frame(freq, port, integration): +def get_lockin_frame(freq, port, integration, invert = False): """ Perform all of the lock-in thermometry operations. @@ -306,10 +324,16 @@ def get_lockin_frame(freq, port, integration): if current_time - (last_toggle_time - start_time) >= half_period: # Toggle the load state if load_on: - ser.write(b"0\n") # Send 0 to turn the load off + if invert: + ser.write(b"1\n") # Send 1 to turn the load on + else: + ser.write(b"0\n") # Send 0 to turn the load off load_on = False else: - ser.write(b"1\n") # Send 1 to turn the load on + if invert: + ser.write(b"0\n") # Send 0 to turn the load off + else: + ser.write(b"1\n") # Send 1 to turn the load on load_on = True # print(f'Load state: {load_on}, Time: {current_time}') # debugging @@ -351,7 +375,7 @@ def get_lockin_frame(freq, port, integration): def capture_lock_in(): while app_state.is_capturing: in_phase, quad = get_lockin_frame( - app_state.fequency, app_state.port, app_state.integration + app_state.fequency, app_state.port, app_state.integration, app_state.negate ) if in_phase is not None and quad is not None: with app_state.lock: @@ -427,7 +451,7 @@ def animate_func(_frame: int) -> None: app_state.im_quadrature.set_clim( np.min(app_state.quad_frame), np.max(app_state.quad_frame) ) - new_status_text = app_state.status_text + new_status_text = getattr(app_state, "status_text", "") app_state.status_text_obj.set_text(new_status_text) return [ app_state.im, @@ -630,7 +654,7 @@ def onmotion(event): def main() -> None: _keep_me_anim = animation.FuncAnimation( - app_state.fig, animate_func, interval=1000 / app_state.fps, blit=True + app_state.fig, animate_func, interval=1000 / app_state.fps, blit=True, cache_frame_data=False ) app_state.fig.canvas.mpl_connect("button_press_event", onclick) app_state.fig.canvas.mpl_connect("motion_notify_event", onmotion) From 30bc6aebc363fb820322eb132880e6f4e19e0199 Mon Sep 17 00:00:00 2001 From: Thijs Damsma Date: Tue, 24 Mar 2026 11:01:12 +0100 Subject: [PATCH 24/27] Add hot pixel detection and persistent calibration irpythermal.py changes: - calibrate_raw() now detects both cold AND hot stuck pixels using symmetric 5% threshold (previously only detected cold pixels) Source: diminDDL/IR-Py-Thermal PR #4 https://github.com/diminDDL/IR-Py-Thermal/pull/4 - Add save_calibration() and load_calibration() methods to persist reference frame and dead pixel mask as .npy files across restarts Source: MCMH2000/OpenHD_HT301_Driver noise_pattern_calibration.npy approach https://github.com/MCMH2000/OpenHD_HT301_Driver - Fix resource leak in find_device(): release cameras that don't match supported resolutions instead of leaving them open - Replace bare except with except Exception --- irpythermal.py | 66 ++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 51 insertions(+), 15 deletions(-) diff --git a/irpythermal.py b/irpythermal.py index 915e3f7..272a163 100755 --- a/irpythermal.py +++ b/irpythermal.py @@ -6,6 +6,8 @@ from time import sleep from typing import Tuple +import os + import cv2 import numpy as np @@ -67,6 +69,7 @@ class Camera: reference_frame = None offset_mean = 0.0 dead_pixels_mask = None + calibration_path = None def __init__( self, @@ -127,7 +130,8 @@ def find_device(cls) -> cv2.VideoCapture: cap_height - ROWS_SPECIAL_DATA, ) in cls.supported_resolutions: return cap - except: + cap.release() + except Exception: pass raise ValueError( f"Cannot find camera with a width of one of {cls.supported_resolutions} that also matches: {cap_width=} and {cap_height=}" @@ -495,25 +499,37 @@ def calibrate_raw(self, quiet=False) -> None: else: raise RuntimeError("Failed to capture reference frame") - # dead pixel correction + # dead/hot pixel correction using symmetric threshold frame_visible_float = frame_visible.astype(np.float32) min_val = np.min(frame_visible_float) max_val = np.max(frame_visible_float) - print(f"Min: {min_val}, Max: {max_val}, Avg: {np.mean(frame_visible_float)}") - threshold_margin = ( - max_val - min_val - ) * 0.05 # Adjust the margin if not detected correctly - threshold = min_val + threshold_margin - - # if there are no dead pixels, we skip the dead pixel correction - if np.count_nonzero(frame_visible_float < threshold) != 0: - self.dead_pixels_mask = cv2.inRange( - frame_visible_float, 0, float(threshold) - ).astype(np.uint8) + val_range = max_val - min_val + if not quiet: + print(f"Min: {min_val}, Max: {max_val}, Avg: {np.mean(frame_visible_float)}") + threshold_margin = val_range * 0.05 + + low_threshold = min_val + threshold_margin + high_threshold = max_val - threshold_margin + + # detect cold/dead pixels AND hot/stuck pixels + cold_mask = cv2.inRange( + frame_visible_float, 0, float(low_threshold) + ).astype(np.uint8) + hot_mask = cv2.inRange( + frame_visible_float, float(high_threshold), float(max_val + 1) + ).astype(np.uint8) + combined_mask = cold_mask | hot_mask + + if np.count_nonzero(combined_mask) > 0: + self.dead_pixels_mask = combined_mask if not quiet: - print(f"Found {np.count_nonzero(self.dead_pixels_mask)} dead pixels") - print(f"At: {np.argwhere(self.dead_pixels_mask)}") + n_cold = np.count_nonzero(cold_mask) + n_hot = np.count_nonzero(hot_mask) + print(f"Found {n_cold} dead pixels, {n_hot} hot pixels") + + if self.calibration_path: + self.save_calibration(self.calibration_path) def calibrate(self, quiet=False) -> None: """camera calibration""" @@ -675,6 +691,26 @@ def flush_buffer(self, num_reads=16): for i in range(num_reads): ret, frame_visible = self.read(raw=True) + def save_calibration(self, path) -> None: + """Save calibration data (reference frame + dead pixel mask) to disk.""" + np.save(f"{path}_reference.npy", self.reference_frame) + if self.dead_pixels_mask is not None: + np.save(f"{path}_deadpixels.npy", self.dead_pixels_mask) + print(f"Calibration saved to {path}_*.npy") + + def load_calibration(self, path) -> bool: + """Load calibration data from disk. Returns True if successful.""" + ref_file = f"{path}_reference.npy" + if not os.path.exists(ref_file): + return False + self.reference_frame = np.load(ref_file) + self.offset_mean = float(np.mean(self.reference_frame)) + dp_file = f"{path}_deadpixels.npy" + if os.path.exists(dp_file): + self.dead_pixels_mask = np.load(dp_file) + print(f"Calibration loaded from {path}_*.npy") + return True + class MockVidoCapture: def set(self, propId, value): From 0d0d10152a9f8fcfd0b7386ed2dec54fc6bc8244 Mon Sep 17 00:00:00 2001 From: Thijs Damsma Date: Tue, 24 Mar 2026 11:01:18 +0100 Subject: [PATCH 25/27] Fix OpenCV int cast errors in drawTemperature Cast x, y, tx, ty coordinates to int() before passing to cv2.line() and cv2.putText(). OpenCV requires integer coordinates and fails with float values from numpy operations. Source: uncommitted fix found on remote machine /home/daniel/git/t2s/ --- utils.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/utils.py b/utils.py index 7373b32..ee67aea 100755 --- a/utils.py +++ b/utils.py @@ -8,7 +8,7 @@ def drawTemperature(img, point, T, color=(0, 0, 0)): d1, d2 = 2, 5 dsize = 1 font = cv2.FONT_HERSHEY_PLAIN - (x, y) = point + (x, y) = int(point[0]), int(point[1]) t = "%.2fC" % T cv2.line(img, (x + d1, y), (x + d2, y), color, dsize) cv2.line(img, (x - d1, y), (x - d2, y), color, dsize) @@ -16,11 +16,11 @@ def drawTemperature(img, point, T, color=(0, 0, 0)): cv2.line(img, (x, y - d1), (x, y - d2), color, dsize) text_size = cv2.getTextSize(t, font, 1, dsize)[0] - tx, ty = x + d1, y + d1 + text_size[1] + tx, ty = int(x + d1), int(y + d1 + text_size[1]) if tx + text_size[0] > img.shape[1]: - tx = x - d1 - text_size[0] + tx = int(x - d1 - text_size[0]) if ty > img.shape[0]: - ty = y - d1 + ty = int(y - d1) cv2.putText(img, t, (tx, ty), font, 1, color, dsize, cv2.LINE_8) From f3fa5b0fd33e8138df8aadbbec1feb550c2a16ca Mon Sep 17 00:00:00 2001 From: Thijs Damsma Date: Tue, 24 Mar 2026 11:01:23 +0100 Subject: [PATCH 26/27] Replace skimage with cv2 for auto-exposure in opencv.py Replace skimage.exposure.equalize_hist + rescale_intensity with cv2.normalize + cv2.equalizeHist. Same visual result, eliminates the scikit-image dependency (and its transitive deps) making deployment on headless Linux machines simpler. --- opencv.py | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/opencv.py b/opencv.py index da7c2bb..b820153 100755 --- a/opencv.py +++ b/opencv.py @@ -5,7 +5,6 @@ import cv2 import numpy as np -from skimage.exposure import equalize_hist, rescale_intensity import irpythermal import utils @@ -100,10 +99,9 @@ def get_fps(self): info, lut = camera.info() frame = frame.astype(np.float32) - # Sketchy auto-exposure - frame = rescale_intensity( - equalize_hist(frame), in_range="image", out_range=(0, 255) - ).astype(np.uint8) + # Auto-exposure: normalize + histogram equalization + frame = cv2.normalize(frame, None, 0, 255, cv2.NORM_MINMAX).astype(np.uint8) + frame = cv2.equalizeHist(frame) frame = cv2.applyColorMap(frame, cv2.COLORMAP_INFERNO) From da0c35a0e32425c12a79c5f336328cc07a078179 Mon Sep 17 00:00:00 2001 From: Thijs Damsma Date: Tue, 24 Mar 2026 11:01:28 +0100 Subject: [PATCH 27/27] Migrate pyproject.toml from poetry to uv format Convert build system from poetry-core to uv/PEP 621 project format. Add missing runtime dependencies (av, opencv-python, pyusb, imageio). --- pyproject.toml | 35 +++++++++++++++++++++-------------- 1 file changed, 21 insertions(+), 14 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 612132a..42b8689 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,24 +1,31 @@ -[tool.poetry] +[project] name = "ir-py-thermal" version = "0.1.0" description = "ir-py-thermal" -authors = ["Dima "] -repository = "https://github.com/diminDDL/IR-Py-Thermal" +authors = [{name = "Dima", email = "me@dmytroengineering.com"}] readme = "README.md" -package-mode = false +requires-python = ">=3.10.4" +dependencies = [ + "matplotlib>=3.9.2", + "pyserial>=3.5", + "scikit-image>=0.25.2", + "imageio-ffmpeg>=0.6.0", + "imageio>=2.37.2", + "pyusb>=1.3.1", + "av>=16.0.1", + "opencv-python>=4.12.0.88", +] -[tool.poetry.dependencies] -python = "^3.10.4" -opencv-python = "^4.10.0.84" -matplotlib = "^3.9.2" -pyserial = "^3.5" +[project.urls] +repository = "https://github.com/diminDDL/IR-Py-Thermal" -[tool.poetry.group.dev.dependencies] -ruff = "^0.7.3" +[dependency-groups] +dev = [ + "ruff>=0.7.3", +] -[build-system] -requires = ["poetry-core>=1.0.0"] -build-backend = "poetry.core.masonry.api" +[tool.uv] +package = false [tool.ruff.lint] select = ["ALL"]