diff --git a/.github/workflows/pytest.yml b/.github/workflows/pytest.yml index 66aa75c..083bb1e 100644 --- a/.github/workflows/pytest.yml +++ b/.github/workflows/pytest.yml @@ -26,11 +26,11 @@ jobs: with: python-version: ${{ matrix.python-version }} - - name: Install dependencies - run: | - python -m pip install --upgrade pip - pip install . - pip install pytest + - name: Install Poetry + uses: snok/install-poetry@v1 + + - name: Install dependencies with floris + run: poetry install --with floris - name: Run pytest - run: python -m pytest \ No newline at end of file + run: poetry run pytest \ No newline at end of file diff --git a/.gitignore b/.gitignore index e56a54c..e4e4eff 100644 --- a/.gitignore +++ b/.gitignore @@ -15,6 +15,12 @@ fig* *.tar *.whl +# Allow these CSVs needed for the floris interface +!MITRotor/FlorisInterface/IEA_15mw_rotor.csv +!examples/examples_in/* + +Validation/ + ### Python ### # Byte-compiled / optimized / DLL files __pycache__/ @@ -188,4 +194,10 @@ poetry.toml # LSP config files pyrightconfig.json -# End of https://www.toptal.com/developers/gitignore/api/python \ No newline at end of file +# End of https://www.toptal.com/developers/gitignore/api/python + +.DS_Store +examples/Tune_Cases/ +*dbg* +DISCON.IN +*txt \ No newline at end of file diff --git a/MITRotor/Aerodynamics.py b/MITRotor/Aerodynamics.py index 265872c..6a501e4 100644 --- a/MITRotor/Aerodynamics.py +++ b/MITRotor/Aerodynamics.py @@ -7,7 +7,7 @@ from numpy.typing import ArrayLike from .RotorDefinition import RotorDefinition -from .Geometry import BEMGeometry +from .Geometry import BEMGeometry, expand_to_Nr_Ntheta from UnifiedMomentumModel.Utilities.Geometry import calc_eff_yaw __all__ = [ @@ -194,7 +194,7 @@ def __call__( AerodynamicProperties: Calculated aerodynamic properties stored in AerodynamicProperties object. """ - if tilt != 0: + if np.any(tilt != 0): raise ValueError("Tilt not supported by the KraghAerodynamics model. Use DefaultAerodynamics.") local_yaw = wdir - yaw @@ -269,13 +269,16 @@ def __call__( AerodynamicProperties: Calculated aerodynamic properties stored in AerodynamicProperties object. """ + tsr = expand_to_Nr_Ntheta(tsr) + pitch = expand_to_Nr_Ntheta(pitch) # calculate values in "yaw-only" frame local_yaw = -self.eff_yaw Vax = U * ((1 - an) * np.cos(local_yaw)) + theta_eff = geom.theta_mesh + self.delta_theta Vtan = ( (1 + aprime) * tsr * geom.mu_mesh - U * (1 - an) - * np.cos(self.eff_theta_mesh) + * np.cos(theta_eff) * np.sin(local_yaw) ) @@ -291,8 +294,8 @@ def __call__( an = an, aprime = aprime, solidity = solidity, - U = U * np.ones(geom.shape), - wdir = wdir * np.ones(geom.shape), + U = U * np.ones_like(geom.mu_mesh), + wdir = wdir * np.ones_like(geom.mu_mesh), Vax = Vax, Vtan = Vtan, aoa = aoa, diff --git a/MITRotor/BEMSolver.py b/MITRotor/BEMSolver.py index 559e657..87f64d6 100644 --- a/MITRotor/BEMSolver.py +++ b/MITRotor/BEMSolver.py @@ -7,12 +7,13 @@ from . import Momentum, TipLoss from .Aerodynamics import AerodynamicModel, AerodynamicProperties, DefaultAerodynamics -from .Geometry import BEMGeometry +from .Geometry import BEMGeometry, expand_to_Np, expand_to_Nr_Ntheta from .RotorDefinition import RotorDefinition from .TangentialInduction import DefaultTangentialInduction, TangentialInductionModel from UnifiedMomentumModel.Utilities.Geometry import calc_eff_yaw + def average(geometry: BEMGeometry, value: ArrayLike, grid: Literal["sector", "annulus", "rotor"] = "rotor"): # Assuming the function returns a 2D grid of values @@ -58,13 +59,13 @@ def solidity(self, grid: Literal["sector ", "annulus", "rotor"] = "rotor"): def U(self, grid: Literal["sector", "annulus", "rotor"] = "rotor"): return average(self.geom, self.aero_props.U, grid) - def wdir(self, grid: Literal["sector ", "annulus", "rotor"] = "rotor"): + def wdir(self, grid: Literal["sector", "annulus", "rotor"] = "rotor"): return average(self.geom, self.aero_props.wdir, grid) def Vax(self, grid: Literal["sector", "annulus", "rotor"] = "rotor"): return average(self.geom, self.aero_props.Vax, grid) - def Vtan(self, grid: Literal["sector ", "annulus", "rotor"] = "rotor"): + def Vtan(self, grid: Literal["sector", "annulus", "rotor"] = "rotor"): return average(self.geom, self.aero_props.Vtan, grid) def W(self, grid: Literal["sector", "annulus", "rotor"] = "rotor"): @@ -91,29 +92,27 @@ def Ctan(self, grid: Literal["sector", "annulus", "rotor"] = "rotor"): def Cx(self, grid: Literal["sector", "annulus", "rotor"] = "rotor"): return average(self.geom, self.aero_props.C_x_corr, grid) - def Ctau(self, grid: Literal["sector ", "annulus", "rotor"] = "rotor"): + def Ctau(self, grid: Literal["sector", "annulus", "rotor"] = "rotor"): return average(self.geom, self.aero_props.C_tau_corr, grid) - def Ctau_uncorr(self, grid: Literal["sector ", "annulus", "rotor"] = "rotor"): + def Ctau_uncorr(self, grid: Literal["sector", "annulus", "rotor"] = "rotor"): return average(self.geom, self.aero_props.C_tau, grid) def F(self, grid: Literal["sector", "annulus", "rotor"] = "rotor"): return average(self.geom, self.aero_props.F, grid) def Cp(self, grid: Literal["sector", "annulus", "rotor"] = "rotor"): - dCp = ( - self.tsr - * self.geom.mu_mesh - * self.Ctau_uncorr(grid="sector") - ) + tsr = np.asarray(self.tsr) + if tsr.ndim == 1: + tsr = expand_to_Nr_Ntheta(tsr) + dCp = (tsr * self.geom.mu_mesh * self.Ctau_uncorr(grid="sector")) return average(self.geom, dCp, grid=grid) def Cp_corr(self, grid: Literal["sector", "annulus", "rotor"] = "rotor"): - dCp = ( - self.tsr - * self.geom.mu_mesh - * self.Ctau(grid="sector") - ) + tsr = np.asarray(self.tsr) + if tsr.ndim == 1: + tsr = expand_to_Nr_Ntheta(tsr) + dCp = (tsr * self.geom.mu_mesh * self.Ctau(grid="sector")) return average(self.geom, dCp, grid=grid) def Ct(self, grid: Literal["sector", "annulus", "rotor"] = "rotor"): @@ -128,6 +127,10 @@ def Ctprime(self, grid: Literal["sector", "annulus", "rotor"] = "rotor"): eff_yaw = calc_eff_yaw(self.yaw, self.tilt) Ctprime = self.Ct(grid="sector") / ((1 - self.a(grid="sector")) ** 2 * np.cos(eff_yaw) ** 2) return average(self.geom, Ctprime, grid=grid) + + def Cq(self, grid: Literal["sector", "annulus", "rotor"] = "rotor"): + dCq = (self.geom.mu_mesh * self.Ctau_uncorr(grid="sector")) + return average(self.geom, dCq, grid=grid) @adaptivefixedpointiteration(max_iter=1000, relaxations=[0.25, 0.5, 0.96]) @@ -169,21 +172,37 @@ def sample_points(self, yaw: float = 0.0, tilt: float = 0.0) -> tuple[ArrayLike, return X, Y, Z def pre_process(self, pitch, tsr, yaw = 0, tilt = 0, **kwargs): + pitch, tsr = np.asarray(pitch), np.asarray(tsr) + yaw, tilt = np.asarray(yaw), np.asarray(tilt) + self.scalar_inputs = (pitch.ndim == 0) & (tsr.ndim == 0) & (yaw.ndim == 0) & (tilt.ndim == 0) + if not self.scalar_inputs: + assert len(pitch) == len(tsr) == len(yaw) == len(tilt), "Setpoint arrays should be the same lenght" # switch reference frame to a "yaw-only" frame where y' is aligned with the lateral wake - self.aerodynamic_model.eff_yaw = calc_eff_yaw(yaw, tilt) - if tilt == 0: - dtheta = 0 - elif yaw == 0: - dtheta = np.pi / 2 - else: # non-zero yaw and tilt - sin_eff = np.sin(self.aerodynamic_model.eff_yaw) - dtheta = np.arccos(np.sin(yaw) / sin_eff) - self.aerodynamic_model.eff_theta_mesh = self.geometry.theta_mesh + dtheta + yaw, tilt = np.broadcast_arrays(yaw, tilt) + eff_yaw = calc_eff_yaw(yaw, tilt) + # initialize dtheta + dtheta = np.zeros_like(eff_yaw, dtype=float) + # masks + yaw_zero = (yaw == 0) + not_tilt_zero = np.logical_not(tilt == 0) + # case1: yaw == 0 and tilt != 0 + case1 = yaw_zero & not_tilt_zero + dtheta[case1] = np.pi / 2 + # case2: yaw != 0 and tilt != 0 + case2 = np.logical_not(yaw_zero) & not_tilt_zero + dtheta[case2] = np.arccos( + np.sin(yaw[case2]) / np.sin(eff_yaw[case2]) + ) + # expand everything to the correct dimensions to ensure broadcasting + self.aerodynamic_model.eff_yaw = expand_to_Nr_Ntheta(eff_yaw) + self.aerodynamic_model.delta_theta = expand_to_Nr_Ntheta(dtheta) + self.geometry.mu_mesh = expand_to_Np(self.geometry.mu_mesh) + self.geometry.theta_mesh = expand_to_Np(self.geometry.theta_mesh) return def initial_guess(self, *args, **kwargs) -> Tuple[ArrayLike, ...]: - a = (1 / 3) * np.ones(self.geometry.shape) - aprime = np.zeros(self.geometry.shape) + a = (1 / 3) * np.ones_like(self.geometry.mu_mesh) + aprime = np.zeros_like(self.geometry.mu_mesh) return a, aprime @@ -198,8 +217,8 @@ def residual( tilt: ArrayLike = 0.0, ) -> Tuple[ArrayLike, ...]: an, aprime = x - U = np.ones(self.geometry.shape) if U is None else U - wdir = np.zeros(self.geometry.shape) if wdir is None else wdir + U = np.ones_like(self.geometry.mu_mesh) if U is None else U + wdir = np.zeros_like(self.geometry.mu_mesh) if wdir is None else wdir aero_props = self.aerodynamic_model( an = an, @@ -221,12 +240,25 @@ def residual( return e_an, e_aprime def post_process(self, result: FixedPointIterationResult, pitch, tsr, yaw = 0, U=None, wdir=None, tilt = 0.0) -> BEMSolution: - U = np.ones(self.geometry.shape) if U is None else U - wdir = np.zeros(self.geometry.shape) if wdir is None else wdir + U = np.ones_like(self.geometry.mu_mesh) if U is None else U + wdir = np.zeros_like(self.geometry.mu_mesh) if wdir is None else wdir an, aprime = result.x aero_props = self.aerodynamic_model(an, aprime, pitch, tsr, yaw, self.rotor, self.geometry, U, wdir, tilt = tilt) aero_props.F = self.tiploss_model(aero_props, pitch, tsr, yaw, self.rotor, self.geometry, tilt = tilt) avg_Ct = average(self.geometry, aero_props.C_x) u4,v4,w4 = self.momentum_model.compute_initial_wake_velocities(avg_Ct, yaw, tilt = tilt) + if self.scalar_inputs: # if all setpoints were scalars + # return single values as scalars + pitch, tsr, yaw, tilt = [np.asarray(x).item() for x in (pitch, tsr, yaw, tilt)] + u4, v4, w4 = [np.asarray(x).item() for x in (u4, v4, w4)] + # remove unneeded extra axis from Ntheta x Nr arrays + an = np.squeeze(an) + aprime = np.squeeze(aprime) + self.geometry.theta_mesh = np.squeeze(self.geometry.theta_mesh) + self.geometry.mu_mesh = np.squeeze(self.geometry.mu_mesh) + for key, value in vars(aero_props).items(): + if isinstance(value, np.ndarray): + setattr(aero_props, key, np.squeeze(value)) + return BEMSolution(pitch, tsr, yaw, aero_props, self.geometry, result.converged, result.niter, u4, v4, tilt = tilt, w4 = w4) diff --git a/MITRotor/FlorisInterface/FlorisInterface.py b/MITRotor/FlorisInterface/FlorisInterface.py new file mode 100644 index 0000000..e8066cc --- /dev/null +++ b/MITRotor/FlorisInterface/FlorisInterface.py @@ -0,0 +1,209 @@ +import os +import numpy as np +import polars as pl +from attrs import define, field +from typing import Optional, Callable, Union +from scipy.interpolate import interp1d, RegularGridInterpolator +# FLORIS Imports +from floris.type_dec import floris_float_type, NDArrayFloat +from floris.core.turbine.operation_models import BaseOperationModel +from floris.core.rotor_velocity import average_velocity +from floris.utilities import cosd +# MITRotor / UMM Imports +from MITRotor.ReferenceTurbines import IEA15MW +from MITRotor.Momentum import UnifiedMomentum +from MITRotor.Geometry import BEMGeometry +from MITRotor.TipLoss import NoTipLoss +from MITRotor.BEMSolver import BEM +from MITRotor.FlorisInterface.InterfaceUtilities import query_controls +from UnifiedMomentumModel.Utilities.Geometry import calc_eff_yaw + +InterpLike = Union[interp1d, RegularGridInterpolator, Callable] + +# default rotor if none provided by user (IEA 15MW) +def default_bem_factory(): + return BEM( + rotor=IEA15MW(), + momentum_model=UnifiedMomentum(averaging="rotor"), + geometry=BEMGeometry(Nr=10, Ntheta=20), + tiploss_model=NoTipLoss() + ) +# default 1D pitch vs windspeed interpolater if none provided by user +# for IEA 15MW from figure 2 (https://docs.nrel.gov/docs/fy22osti/82134.pdf) +def default_pitch_interp(): + module_dir = os.path.dirname(__file__) + pitch_file = os.path.join(module_dir, "IEA_15mw_rotor.csv") + df = pl.read_csv(pitch_file) + wind_table = df["Wind [m/s]"].to_numpy() + pitch_table = np.deg2rad(df["Pitch [deg]"]) # interpolator takes in radians! + return interp1d(wind_table, pitch_table, kind="linear", fill_value="extrapolate", bounds_error=False) + +# default 1D tsr vs windspeed interpolater if none provided by user +# for IEA 15MW from figure 2 (https://docs.nrel.gov/docs/fy22osti/82134.pdf) +def default_tsr_interp(): + module_dir = os.path.dirname(__file__) + tsr_file = os.path.join(module_dir, "IEA_15mw_rotor.csv") + df = pl.read_csv(tsr_file) + wind_table = df["Wind [m/s]"].to_numpy() + tip_speed_table = df["Tip Speed [m/s]"].to_numpy() + tsr_table = tip_speed_table / wind_table + return interp1d(wind_table, tsr_table, kind="linear", fill_value="extrapolate", bounds_error=False) + +@define +class MITRotorTurbine(BaseOperationModel): + """ + Turbine operation model as described by Liew et al. (2024). + + Args: + bem_model (BEM, optional): BEM model as defined in MITRotor. Defaults to the + IEA15MW rotor with the UMM momentum model. + + gen_eff (float, optional): Generator efficiency in percent [%]. + Defaults to 95.756. + + eff_ratio (float, optional): Optional efficiency ratio override (unitless). + If provided, this is used directly instead of deriving efficiency from + `gen_eff`. Defaults to None. + + pitch_interp (InterpLike, optional): 1D or 2D interpolator for pitch trajectory. + - 1D: function of wind speed only (yaw not accounted for) + - 2D: function of wind speed and yaw + Defaults to the 1D IEA15MW Figure 2 trajectory + (https://docs.nrel.gov/docs/fy22osti/82134.pdf). + See `ROSCOInterface.py` for generating a 2D control-scheme interpolator. + + pitch_rad (bool, optional): Whether the pitch interpolator uses radians (True) + or degrees (False). Defaults to True. + + tsr_interp (InterpLike, optional): 1D or 2D interpolator for TSR trajectory. + - 1D: function of wind speed only (yaw not accounted for) + - 2D: function of wind speed and yaw + Defaults to the IEA15MW Figure 2 trajectory + (https://docs.nrel.gov/docs/fy22osti/82134.pdf). + See `ROSCOInterface.py` for generating a 2D control-scheme interpolator. + + rated_rotor_speed (float, optional): Rated rotor speed [rad/s]. + Defaults to None. + + Methods: + power + thrust_coefficient + axial_induction + near_wake_velocities + """ + # user can define a BEM model if they want a different rotor, momentum model, or geometry + bem_model = field(init = True, factory = default_bem_factory, type = BEM) + gen_eff = field(init = True, default = 95.756, type=Optional[float]) # [%] + eff_ratio = field(init=True, default=None, type=Optional[float]) # allow override + + # create interp objects based on pitch and tsr csvs + pitch_interp = field(init = True, factory = default_pitch_interp, type = Optional[InterpLike], repr = False) + pitch_rad = field(init = True, default = True, type = bool) # set if interpolater takes in radians (True) or degrees (False) + tsr_interp = field(init = True, factory = default_tsr_interp, type = Optional[InterpLike], repr=False) + rated_rotor_speed = field(init = True, default = None, type = Optional[float]) # [rad/s] + + # save most recent solution by unique floris arguments + _last_key = field(init=False, default=None, type = bytes) + _a = field(init=False, default=None, type = NDArrayFloat) + _Ct = field(init=False, default=None, type = NDArrayFloat) + _u4 = field(init=False, default=None, type = NDArrayFloat) + _v4 = field(init=False, default=None, type = NDArrayFloat) + _w4 = field(init=False, default=None, type = NDArrayFloat) + _power = field(init=False, default=None, type = NDArrayFloat) + + # calculate a few needed fields post-initialization + def __attrs_post_init__(self): + if self.eff_ratio is None: + gearbox_eff = self.bem_model.rotor.rosco_values[1] + self.eff_ratio = (self.gen_eff / 100.0) * (gearbox_eff / 100.0) + if self.pitch_interp is None: + self.pitch_interp = default_pitch_interp() # 1D legacy default + if self.tsr_interp is None: + self.tsr_interp = default_tsr_interp() # 1D legacy default + super().__attrs_post_init__() + + def _get_state_key(self, velocities: np.ndarray, yaw_angles: np.ndarray, tilt_angles: np.ndarray) -> tuple: + # saves key to uniquely identify farm state -> avoids re-solving for calls to power, thrust, and induction for same state + return velocities.tobytes(), yaw_angles.tobytes(), tilt_angles.tobytes() + + def _update_solution(self, + velocities: NDArrayFloat, + air_density: float, + yaw_angles: NDArrayFloat, # input in degrees + tilt_angles: NDArrayFloat, # input in degrees + average_method: str = "cubic-mean", + cubature_weights: Optional[NDArrayFloat] = None, + **_, + ): + # create cache key for current inputs + key = self._get_state_key(velocities, yaw_angles, tilt_angles) + # update solution if conditions are different + if key != self._last_key: + n_findex, n_turbines = yaw_angles.shape + + # save new key and clear fields + self._last_key = key + self._a = np.empty((n_findex, n_turbines), dtype=floris_float_type) + self._Ct = np.empty((n_findex, n_turbines), dtype=floris_float_type) + self._u4 = np.empty((n_findex, n_turbines), dtype=floris_float_type) + self._v4 = np.empty((n_findex, n_turbines), dtype=floris_float_type) + self._w4 = np.empty((n_findex, n_turbines), dtype=floris_float_type) + self._power = np.empty((n_findex, n_turbines), dtype=floris_float_type) + + # compute the power-effective wind speed across the rotor + rotor_average_velocities = average_velocity( # NOT adjusted for yaw + velocities=velocities, + method=average_method, + cubature_weights=cubature_weights, + ) + # calculate rotor area + rotor_area = np.pi * self.bem_model.rotor.R**2 + + # get setpoints + yaw, tilt = np.deg2rad(yaw_angles), np.deg2rad(tilt_angles) + eff_yaw = calc_eff_yaw(yaw, tilt) + + pitch = query_controls( + self.pitch_interp, rotor_average_velocities, eff_yaw, kind = "pitch" + ) + tsr = query_controls( + self.tsr_interp, rotor_average_velocities, eff_yaw, kind = "tsr", + rated_rotor_speed = self.rated_rotor_speed, rotor_radius = self.bem_model.rotor.R, + ) + if not self.pitch_rad: # make sure input to MITRotor BEM in in radians + pitch = np.deg2rad(pitch) + + # solve BEM for setpoints from control curves + for tindex in range(n_turbines): + # solve BEM - NOTE: could add in additional keywords U and wdir + bem_sol = self.bem_model(pitch[:, tindex], tsr[:, tindex], yaw = yaw[:, tindex], tilt = tilt[:, tindex]) + # get induction and thrust coeff + self._a[:, tindex] = bem_sol.a() + self._Ct[:, tindex] = bem_sol.Ct() + # get near wake velocities + self._u4[:, tindex] = bem_sol.u4 + self._v4[:, tindex] = bem_sol.v4 + self._w4[:, tindex] = bem_sol.w4 + # compute power + self._power[:, tindex] = ( + 0.5 * bem_sol.Cp() * air_density * rotor_area + * (rotor_average_velocities[:, tindex])**3 + * self.eff_ratio + ) + return + + def power(self, **kwargs) -> NDArrayFloat: + self._update_solution(**kwargs) + return self._power + + def thrust_coefficient(self, **kwargs) -> NDArrayFloat: + self._update_solution(**kwargs) + return self._Ct + + def axial_induction(self, **kwargs) -> NDArrayFloat: + self._update_solution(**kwargs) + return self._a + + def near_wake_velocities(self, **kwargs) -> NDArrayFloat: + self._update_solution(**kwargs) + return (self._u4, self._v4, self._w4) \ No newline at end of file diff --git a/MITRotor/FlorisInterface/IEA_15mw_rotor.csv b/MITRotor/FlorisInterface/IEA_15mw_rotor.csv new file mode 100644 index 0000000..c5ce68c --- /dev/null +++ b/MITRotor/FlorisInterface/IEA_15mw_rotor.csv @@ -0,0 +1,51 @@ +Wind [m/s],Pitch [deg],Power [MW],Power Coefficient [-],Aero Power Coefficient [-],Rotor Speed [rpm],Tip Speed [m/s],Thrust [MN],Thrust Coefficient [-],Torque [MNm],Torque Coefficient [-],Blade Moment [MNm],Blade Moment Coefficient [-] +3,3.920293066,0.042500121,0.056434434,0.05897929,5,63.33974388,0.202909425,0.808309128,0.0848295,0.002806784,5.980185544,0.197868559 +3.54953237,3.913016973,0.292273273,0.234311418,0.244877465,5,63.33974388,0.275784048,0.784774049,0.583372359,0.01378822,7.854972515,0.185655162 +4.067900771,3.709535473,0.607683429,0.323656337,0.338251306,5,63.33974388,0.360568653,0.781205046,1.212925534,0.021827203,10.04565323,0.180776562 +4.553906848,3.347852063,0.980824467,0.372354525,0.389145491,5,63.33974388,0.454006762,0.784895445,1.957708542,0.028111524,12.46569389,0.178999911 +5.006427063,2.905271743,1.401604341,0.400460354,0.418518725,5,63.33974388,0.550743112,0.787791082,2.797577836,0.033237705,14.97412576,0.177905892 +5.424415288,2.410742282,1.858097567,0.41737602,0.436197187,5,63.33974388,0.648091847,0.789675144,3.708730359,0.03753393,17.50236286,0.177131362 +5.806905228,1.897891096,2.33681832,0.42786672,0.447160954,5,63.33974388,0.743097627,0.790085645,4.66424864,0.041190481,19.97338486,0.176387107 +6.153012649,1.38709008,2.823250666,0.434514015,0.454108003,5,63.33974388,0.833653636,0.789455775,5.635159124,0.044323619,22.33283369,0.175659992 +6.461937428,0.891713024,3.302257138,0.438773526,0.458559593,5,63.33974388,0.918175231,0.78834778,6.591247694,0.047005295,24.54016065,0.175007454 +6.732965398,0.425207394,3.758708724,0.441506699,0.461416015,5,63.33974388,0.995161603,0.787043287,7.502317104,0.049281883,26.55670159,0.174448007 +6.965470002,0.000469162,4.17814357,0.443251132,0.463239112,5,63.33974388,1.063280746,0.785714686,8.339501745,0.05118514,28.34690587,0.173984056 +7.158913742,0,4.546959581,0.444321653,0.46363055,5.086081797,64.43022368,1.11334287,0.778847528,8.908071675,0.051759978,29.65857718,0.172329924 +7.312849418,0,4.855095716,0.445098035,0.46363055,5.195446076,65.81564476,1.161737302,0.778847528,9.295284892,0.051759978,30.94776674,0.172329924 +7.426921164,0,5.091278414,0.445572294,0.46363055,5.27648885,66.84229047,1.198263417,0.778847528,9.587537406,0.051759978,31.92079369,0.172329924 +7.500865272,0,5.248186603,0.445854287,0.46363055,5.329022767,67.50778745,1.22224256,0.778847528,9.779399169,0.051759978,32.55957918,0.172329924 +7.534510799,0,5.320523056,0.445971313,0.46363055,5.35292638,67.81059719,1.233232019,0.778847528,9.867327955,0.051759978,32.8523297,0.172329924 +7.541241633,0,5.335074621,0.445994704,0.46363055,5.357708331,67.8711747,1.23543638,0.778847528,9.884965469,0.051759978,32.91105213,0.172329924 +7.58833327,0,5.437629628,0.44615751,0.46363055,5.391164791,68.29499943,1.250914035,0.778847528,10.00880519,0.051759978,33.32336468,0.172329924 +7.675676842,0,5.630967375,0.446427293,0.46363055,5.453218417,69.08109158,1.279876417,0.778847528,10.2405388,0.051759978,34.09489971,0.172329924 +7.803070431,0,5.920680499,0.446779068,0.46363055,5.543725753,70.22763388,1.322713319,0.778847528,10.58328514,0.051759978,35.23604104,0.172329924 +7.970219531,0,6.314795749,0.44716338,0.46363055,5.662477568,71.73197578,1.379987779,0.778847528,11.04154918,0.051759978,36.76178755,0.172329924 +8.176737731,0,6.824124693,0.447532442,0.46363055,5.809199332,73.59063957,1.452428655,0.778847528,11.62116264,0.051759978,38.69155545,0.172329924 +8.422147605,0,7.462468983,0.447849163,0.46363055,5.983551858,75.79932844,1.540920985,0.778847528,12.3292069,0.051759978,41.04892142,0.172329924 +8.70588182,0,8.237943086,0.447608431,0.46363055,6.185132081,78.35293638,1.646494209,0.778847528,13.17391868,0.051759978,43.86130896,0.172329924 +9.027284445,0,9.167503057,0.446783839,0.46363055,6.413473991,81.24556,1.770308387,0.778847528,14.16457987,0.051759978,47.15962114,0.172329924 +9.385612468,0,10.28468981,0.445985887,0.46363055,6.668049714,84.47051221,1.913638541,0.778847528,15.31139216,0.051759978,50.97782356,0.172329924 +9.780037514,0,11.61664761,0.44522242,0.46363055,6.948270725,88.02033763,2.077857279,0.778847528,16.62533805,0.051759978,55.3524814,0.172329924 +10.20964776,0,13.19374497,0.444481389,0.46363055,7.253489215,91.88682983,2.264415873,0.778847528,18.11802945,0.051759978,60.3222554,0.172329924 +10.65843263,0,15,0.444149321,0.463833394,7.499240933,95,2.447339849,0.772369945,19.94703495,0.05228731,65.14869599,0.170774759 +10.67345004,0.511974392,15.00000265,0.442277294,0.461878402,7.499240933,95,2.374311052,0.74721528,19.9470383,0.052140287,63.06741054,0.164854194 +11.17037214,3.723733263,14.99997215,0.385838268,0.402938078,7.499240933,95,1.956901748,0.562278542,19.94699774,0.047604378,50.90543244,0.12148803 +11.6992653,5.396486368,15.00000888,0.33584085,0.350724844,7.499240933,95,1.769139016,0.463406962,19.94704659,0.043397635,45.21424327,0.098370013 +12.25890683,6.766694447,15.00000059,0.291913256,0.304850441,7.499240933,95,1.630599159,0.389010657,19.94703557,0.039525695,40.89463241,0.081034035 +12.84800295,7.989590009,15.0000001,0.2535725,0.264810476,7.499240933,95,1.518234459,0.329750424,19.94703492,0.03598419,37.29572857,0.067281007 +13.46519181,9.124292675,14.99994632,0.220277351,0.230039733,7.499240933,95,1.423067352,0.281396143,19.9469634,0.032760939,34.16497221,0.05611263 +14.10904661,10.20005088,15.00008104,0.191477776,0.199963801,7.499240933,95,1.340503102,0.241429458,19.94714255,0.029839394,31.37410139,0.046933247 +14.77807889,11.23370987,15.00005146,0.166631299,0.174016164,7.499240933,95,1.267744754,0.208119912,19.94710322,0.027198723,28.84591141,0.039332626 +15.470742,12.23548853,15.00003481,0.145236779,0.151673469,7.499240933,95,1.20299036,0.180201181,19.94708107,0.02481771,26.53102258,0.033009302 +16.18543466,13.21207233,15.00002476,0.12683428,0.132455397,7.499240933,95,1.144953313,0.156695606,19.94706771,0.022674357,24.39444366,0.027729806 +16.92050464,14.16785471,15.00001806,0.111011922,0.115931814,7.499240933,95,1.092675034,0.136830266,19.9470588,0.020747076,22.41059375,0.023309415 +17.67425264,15.10569973,15.00001315,0.097406118,0.101723021,7.499240933,95,1.045410488,0.119983771,19.94705227,0.019015215,20.56016302,0.019599684 +18.44493615,16.02744622,15.00000923,0.08569941,0.089497487,7.499240933,95,1.002561347,0.105651196,19.94704705,0.017459385,18.82803369,0.016479927 +19.23077353,16.93422766,15.000006,0.075616913,0.078968149,7.499240933,95,0.963634907,0.093419339,19.94704276,0.016061631,17.20197892,0.013851268 +20.02994808,17.82668205,15.00000341,0.066922115,0.069888009,7.499240933,95,0.928217511,0.082948375,19.94703931,0.014805512,15.6718209,0.011632269 +20.8406123,18.70508213,15.00000149,0.059412476,0.062045553,7.499240933,95,0.895956018,0.07395772,19.94703676,0.013676094,14.22892793,0.009755642 +21.66089211,19.56943768,15.00000033,0.052915149,0.055260274,7.499240933,95,0.866544894,0.066214966,19.94703522,0.012659901,12.8658372,0.008165636 +22.4888912,20.41950905,15.00018216,0.047283561,0.049379102,7.499240933,95,0.839725354,0.059527679,19.94727702,0.011744977,11.57634071,0.006816161 +23.32269542,21.25504455,15.00000054,0.042390918,0.044269624,7.499240933,95,0.815233262,0.053733135,19.9470355,0.010920072,10.35411323,0.005668395 +24.1603772,22.07544699,15.00000177,0.038132735,0.039822724,7.499240933,95,0.79288419,0.048699008,19.94703713,0.010175965,9.195130033,0.004690888 +25,22.88018135,15.0000035,0.034418276,0.035943645,7.499240933,95,0.772480289,0.044312389,19.94703943,0.009503927,8.095078123,0.003856965 \ No newline at end of file diff --git a/MITRotor/FlorisInterface/InterfaceUtilities.py b/MITRotor/FlorisInterface/InterfaceUtilities.py new file mode 100644 index 0000000..8a976fe --- /dev/null +++ b/MITRotor/FlorisInterface/InterfaceUtilities.py @@ -0,0 +1,524 @@ +from collections import deque +from contextlib import contextmanager +from ctypes import cdll, POINTER, c_float, c_int32, c_char_p, create_string_buffer +from dataclasses import dataclass +import numpy as np +import sys +from scipy.interpolate import RegularGridInterpolator +import os +import warnings +from joblib import Parallel, delayed +from tqdm.auto import tqdm +from tqdm_joblib import tqdm_joblib +from pathlib import Path + +# ROSCO imports +from rosco.toolbox import control_interface as ROSCO_ci + +# ----------------------------- +# Control Interpolator Helpers +# ----------------------------- +def query_controls( + interp, + ws, + yaw_rad, + *, + kind="generic", # "pitch" or "tsr" + rated_rotor_speed=None, # rad/s (for 1D tsr scheme) + rotor_radius=None, # m (required if rated_rotor_speed is set) +): + """ + Gets TRS or pitch values for given wind speeds and yaw from interpolator + + Supports: + - 2D RegularGridInterpolator: interp(ws, yaw) + - 1D interp1d/callable: interp(ws), yaw ignored (warn if |yaw| > 0) + + For 1D TSR and rated_rotor_speed provided: + applies simple above-rated cap via omega = tsr*ws/R. + """ + ws_arr = np.asarray(ws, dtype=float) + yaw_arr = np.asarray(yaw_rad, dtype=float) + ws_b, yaw_b = np.broadcast_arrays(ws_arr, yaw_arr) + + # 2D LUT path + if isinstance(interp, RegularGridInterpolator) and len(interp.grid) == 2: + pts = np.column_stack((ws_b.ravel(), yaw_b.ravel())) + vals = np.asarray(interp(pts)).reshape(ws_b.shape) + else: # 1D legacy path + vals = np.asarray(interp(ws_b)).reshape(ws_b.shape) + # warning if non-zero yaw values + if np.any(np.abs(yaw_b) > 0): + warnings.warn( + "Using 1D control curve with nonzero yaw/tilt; yaw/tilt is ignored for lookup.", + UserWarning, + ) + # basic rated rotor speed tracking for above rated conditions + if kind == "tsr": + if rated_rotor_speed is not None: + if rotor_radius is None: + raise ValueError("rotor_radius is required when rated_rotor_speed is set.") + omega_lookup = vals * ws_b / np.maximum(rotor_radius, 1e-12) + tsr_from_rated = rated_rotor_speed * rotor_radius / np.maximum(ws_b, 1e-6) + vals = np.where(omega_lookup <= rated_rotor_speed, vals, tsr_from_rated) + vals = np.maximum(vals, 0.0) + + return float(vals) if vals.shape == () else vals + +def load_control_interps_from_csv(csv_path): + """ + Load wind/yaw control LUT CSV and return 2D interpolators. + + Expected CSV columns: + wind_speed_mps, yaw_rad, pitch_rad, tsr, gen_power + """ + data = np.genfromtxt(csv_path, delimiter=",", names=True) + + ws = np.asarray(data["wind_speed_mps"], dtype=float) + yaw = np.asarray(data["yaw_rad"], dtype=float) + pitch = np.asarray(data["pitch_rad"], dtype=float) + tsr = np.asarray(data["tsr"], dtype=float) + + v_grid = np.unique(ws) + yaw_grid = np.unique(yaw) + + # sort cols by (ws, yaw), then reshape into [n_ws, n_yaw] + order = np.lexsort((yaw, ws)) + n_ws, n_yaw = len(v_grid), len(yaw_grid) + + pitch_tbl = pitch[order].reshape(n_ws, n_yaw) + tsr_tbl = tsr[order].reshape(n_ws, n_yaw) + + pitch_interp = RegularGridInterpolator( + (v_grid, yaw_grid), pitch_tbl, + method="linear", bounds_error=False, fill_value=None + ) + tsr_interp = RegularGridInterpolator( + (v_grid, yaw_grid), tsr_tbl, + method="linear", bounds_error=False, fill_value=None + ) + + return pitch_interp, tsr_interp + +def save_control_interps_to_csv(save_control_file, v_grid, yaw_grid_rad, pitch_tbl, tsr_tbl, power_tbl): + if save_control_file is not None: + save_control_file = Path(save_control_file) + save_control_file.parent.mkdir(parents=True, exist_ok=True) + + vv, yy = np.meshgrid(v_grid, yaw_grid_rad, indexing="ij") + data = np.column_stack([ + vv.ravel(), # wind_speed_mps + yy.ravel(), # yaw_rad + pitch_tbl.ravel(), # pitch_rad + tsr_tbl.ravel(), # tsr + power_tbl.ravel(), # generated power + ]) + + header = "wind_speed_mps,yaw_rad,pitch_rad,tsr,gen_power" + np.savetxt(save_control_file, data, delimiter=",", header=header, comments="") + +# ----------------------------- +# Parallelization Helpers +# ----------------------------- +def get_num_jobs(n_jobs, n_wind): +# Determine effective n_jobs + if n_jobs is None: + n_jobs_eff = 1 + elif n_jobs == -1: + n_jobs_eff = min(os.cpu_count() or 1, n_wind) + else: + n_jobs_eff = max(1, min(int(n_jobs), n_wind)) + return n_jobs_eff + +def run_yaw_row_sim(v_grid, yaw_grid_rad, yaw_row_func, n_jobs): + # Calculate total number of cases + n_wind = len(v_grid) + n_yaw = len(yaw_grid_rad) + total_cases = n_wind * n_yaw + + # Determine effective n_jobs + n_jobs_eff = get_num_jobs(n_jobs, n_wind) + + # Run parallel (fallback to serial on failure, e.g., pickling issue) + print( + f"Starting control LUT sweep: {n_yaw} yaw tasks " + f"({total_cases} wind-yaw cases), using {n_jobs_eff} worker process(es)." + ) + + def _run_serial(desc): + out = [] + for i, yaw_rad in enumerate(tqdm(yaw_grid_rad, total=n_yaw, desc=desc, dynamic_ncols=True)): + out.append(yaw_row_func(i, yaw_rad)) + return out + + cols = None + if n_jobs_eff > 1: + bar = tqdm(total=n_yaw, desc="Control LUT sweep (wind cols)", dynamic_ncols=True) + try: + with tqdm_joblib(bar): + cols = Parallel(n_jobs=n_jobs_eff, backend="loky", verbose=0, batch_size=1)( + delayed(yaw_row_func)(i, yaw_rad) + for i, yaw_rad in enumerate(yaw_grid_rad) + ) + except Exception as e: + warnings.warn( + f"Parallel execution failed ({type(e).__name__}: {e}). " + "Falling back to serial execution.", + RuntimeWarning, + ) + finally: + bar.close() + if cols is None: + desc = "Control LUT sweep (serial fallback)" if n_jobs_eff > 1 else "Control LUT sweep (serial)" + cols = _run_serial(desc) + + return cols + +# ----------------------------- +# Controller Interface -> child of ROSCOS's ControllerInterface +# ----------------------------- +class WarmStartControllerInterface(ROSCO_ci.ControllerInterface): + """ + ROSCO controller interface with configurable warm-start initial conditions. + + This subclass overrides the default `ControllerInterface` initialization so + the first DISCON call (`iStatus=0`) is seeded with user-provided initial + wind speed, rotor/generator speeds, pitch, torque, and nacelle IMU angle, + instead of hard-coded defaults. + + Notes + ----- + - This is useful for steady-state sweeps, where reducing startup transients + improves convergence speed and robustness. + - Units are expected to match ROSCO avrSWAP channel conventions. + """ + + def __init__( + self, + lib_name, + param_filename="DISCON.IN", + init_ws=10.0, # m/s + init_rot_speed=1.0, # rad/s + init_gen_speed=1.0, # rad/s + init_pitch_deg=0.0, # deg + init_torque=0.0, # Nm + init_yaw_rad=0.0, # rad + **kwargs + ): + """ + Initialize warm-start settings and construct the ROSCO controller interface. + + Parameters + ---------- + lib_name : str + Path to the ROSCO dynamic library (.dll/.so/.dylib). + param_filename : str, optional + Path to DISCON input file, by default "DISCON.IN". + init_ws : float, optional + Initial wind speed used during DISCON init, in m/s. + init_rot_speed : float, optional + Initial low-speed shaft rotor speed, in rad/s. + init_gen_speed : float, optional + Initial generator speed (high-speed shaft), in rad/s. + init_pitch_deg : float, optional + Initial collective blade pitch, in degrees. + init_torque : float, optional + Initial generator torque, in Nm. + init_yaw_rad : float, optional + Initial yaw angle/state, in radians. + **kwargs + Additional keyword arguments forwarded to + `ROSCO_ci.ControllerInterface` (e.g., `DT`, `sim_name`, etc.). + """ + # Set starting conditions + self.init_ws = float(init_ws) + self.init_rot_speed = float(init_rot_speed) + self.init_gen_speed = float(init_gen_speed) + self.init_torque = float(init_torque) + self.init_yaw_rad = float(init_yaw_rad) + + # Parent uses self.pitch for initial blade pitch + super().__init__( + lib_name, + param_filename=param_filename, + pitch=init_pitch_deg, + **kwargs + ) + + def init_discon(self): + """ + Initialize DISCON with warm-start avrSWAP values. + + This method allocates and populates the avrSWAP array, sets the first-call + status (`iStatus=0`), invokes DISCON once to initialize internal ROSCO states, + then switches to normal run mode (`iStatus=1`) for subsequent calls. + + Raises + ------ + ValueError + If ROSCO returns a negative `aviFAIL` error code during initialization. + """ + self.torque = self.init_torque + + # Load library + allocate swap + self.discon = cdll.LoadLibrary(self.lib_name) + self.avrSWAP = np.zeros(self.avr_size) + + # Required channels + self.avrSWAP[2] = self.DT + self.avrSWAP[60] = self.num_blade + + # --- warm-start initial states (replaces hard-coded values) --- + self.avrSWAP[19] = self.init_gen_speed # gen speed [rad/s] + self.avrSWAP[20] = self.init_rot_speed # rot speed [rad/s] + self.avrSWAP[82] = 0 # HARD CODE initial nacIMU = 0 + self.avrSWAP[26] = self.init_ws # wind speed [m/s] + self.avrSWAP[22] = self.init_torque # gen torque [Nm] + + # Initial blade pitch (all blades) + # passing in deg to swap to rad with standard ControllerInterface behavior + pitch_rad = np.deg2rad(self.pitch) + self.avrSWAP[3] = pitch_rad + self.avrSWAP[32] = pitch_rad + self.avrSWAP[33] = pitch_rad + + # Initial yaw + self.avrSWAP[23] = self.init_yaw_rad + self.avrSWAP[36] = self.init_yaw_rad + + self.avrSWAP[27] = 1 # IPC flag + + # First-call init + self.avrSWAP[0] = 0 + + self.aviFAIL = c_int32() + self.accINFILE = self.param_name.encode("utf-8") + self.avcOUTNAME = self.sim_name.encode("utf-8") + self.avcMSG = create_string_buffer(1000) + + self.discon.DISCON.argtypes = [ + POINTER(c_float), + POINTER(c_int32), + c_char_p, + c_char_p, + c_char_p, + ] + + self.avrSWAP[48] = self.char_buffer + self.avrSWAP[49] = len(self.param_name) + self.avrSWAP[50] = len(self.avcOUTNAME) + self.avrSWAP[51] = self.char_buffer + + with suppress_fortran_output(): + self.call_discon() # iStatus=0 init call + + self.avrSWAP[0] = 1 # subsequent calls are normal + + if self.aviFAIL.value < 0: + raise ValueError("ROSCO dynamic library has returned an error") + + def kill_discon(self): + """ + Silent DISCON shutdown (suppresses ROSCO shutdown print spam). + Removes ROSCO FORTRAN output clean up terminal so MITRotor interface + outputs are visible. + """ + try: + with suppress_fortran_output(): # context manager + super().kill_discon() + except Exception: + pass + + +@contextmanager +def suppress_fortran_output(): + """Suppress Fortran prints (stdout/stderr) in this process.""" + sys.stdout.flush() + sys.stderr.flush() + + devnull = os.open(os.devnull, os.O_WRONLY) + old_stdout = os.dup(1) + old_stderr = os.dup(2) + try: + os.dup2(devnull, 1) + os.dup2(devnull, 2) + yield + finally: + os.dup2(old_stdout, 1) + os.dup2(old_stderr, 2) + os.close(old_stdout) + os.close(old_stderr) + os.close(devnull) + +# ----------------------------- +# ROSCO Convergence helper structures +# ----------------------------- +@dataclass +class ConvergenceSettings: + """ + Tunable parameters for steady-state convergence detection. + + Attributes + ---------- + warmup_time : float + Time to ignore before evaluating convergence, in seconds. + window_time : float + Length of rolling analysis window, in seconds. + hold_time : float + Duration for which all criteria must remain satisfied, in seconds. + tol_rel_power_std : float + Threshold on relative power variability: std(P)/|mean(P)|. + tol_domega_dt : float + Threshold on max rotor acceleration magnitude, in rad/s^2. + tol_dpitch_dt : float + Threshold on max pitch-rate magnitude, in rad/s. + """ + warmup_time: float = 60.0 + window_time: float = 20.0 + hold_time: float = 5.0 + tol_rel_power_std: float = 1e-3 + tol_domega_dt: float = 1e-3 + tol_dpitch_dt: float = np.deg2rad(1e-3) + + +def init_convergence_tracker(dt: float, settings: ConvergenceSettings): + """ + Create and initialize rolling-window state for convergence checks. + + Parameters + ---------- + dt : float + Simulation timestep in seconds. + settings : ConvergenceSettings + Convergence timing and tolerance settings. + + Returns + ------- + dict + Tracker containing step counts, rolling histories, and stable counter. + Keys include: `warmup_steps`, `window_steps`, `hold_steps`, + `stable_count`, `p_hist`, `omega_hist`, `pitch_hist`. + """ + warmup_steps = int(np.ceil(settings.warmup_time / dt)) + window_steps = int(np.ceil(settings.window_time / dt)) + hold_steps = int(np.ceil(settings.hold_time / dt)) + + tracker = { + "warmup_steps": warmup_steps, + "window_steps": window_steps, + "hold_steps": hold_steps, + "stable_count": 0, + "p_hist": deque(maxlen=window_steps), # W + "omega_hist": deque(maxlen=window_steps), # rad/s + "pitch_hist": deque(maxlen=window_steps), # rad + } + return tracker + + +def update_convergence_tracker(tracker, gen_power, rot_speed, bld_pitch): + """ + Append latest simulation values to rolling convergence histories. + + Parameters + ---------- + tracker : dict + Tracker dictionary created by `init_convergence_tracker`. + gen_power : float + Generator electrical power, in W. + rot_speed : float + Rotor speed, in rad/s. + bld_pitch : float + Collective blade pitch, in rad. + """ + tracker["p_hist"].append(float(gen_power)) + tracker["omega_hist"].append(float(rot_speed)) + tracker["pitch_hist"].append(float(bld_pitch)) + + +def compute_window_metrics(tracker, dt): + """ + Compute window-based convergence metrics from rolling histories. + + Parameters + ---------- + tracker : dict + Convergence tracker containing `p_hist`, `omega_hist`, `pitch_hist`. + dt : float + Simulation timestep in seconds. + + Returns + ------- + dict + Dictionary with: + - `p_mean` : mean power over window [W] + - `rel_p_std` : relative power std, std(P)/max(|mean(P)|, 1) + - `max_domega_dt` : max |d(omega)/dt| over window [rad/s^2] + - `max_dpitch_dt` : max |d(pitch)/dt| over window [rad/s] + """ + p = np.asarray(tracker["p_hist"]) + om = np.asarray(tracker["omega_hist"]) + th = np.asarray(tracker["pitch_hist"]) + + p_mean = float(np.mean(p)) + rel_p_std = float(np.std(p) / max(abs(p_mean), 1.0)) + max_domega_dt = float(np.max(np.abs(np.diff(om))) / dt) + max_dpitch_dt = float(np.max(np.abs(np.diff(th))) / dt) + + return { + "p_mean": p_mean, + "rel_p_std": rel_p_std, + "max_domega_dt": max_domega_dt, + "max_dpitch_dt": max_dpitch_dt, + } + + +def check_convergence(n_iter, dt, tracker, settings: ConvergenceSettings): + """ + Evaluate steady-state convergence criteria. + + Criteria + -------- + After warmup and once the rolling window is full, convergence is considered + satisfied at a given step if: + 1) relative power std < `tol_rel_power_std` + 2) max rotor acceleration < `tol_domega_dt` + 3) max pitch rate < `tol_dpitch_dt` + + These conditions must hold for `hold_steps` consecutive evaluations. + + Parameters + ---------- + n_iter : int + Current simulation iteration index. + dt : float + Simulation timestep in seconds. + tracker : dict + Convergence tracker dictionary. + settings : ConvergenceSettings + Convergence timing and tolerance settings. + + Returns + ------- + tuple[bool, dict | None] + `(converged, metrics)` where: + - `converged` is True if hold condition is met. + - `metrics` is None until checks become active; otherwise window metrics + from `compute_window_metrics`. + """ + if n_iter < tracker["warmup_steps"]: + return False, None + if len(tracker["p_hist"]) < tracker["window_steps"]: + return False, None + + metrics = compute_window_metrics(tracker, dt) + ok_power = metrics["rel_p_std"] < settings.tol_rel_power_std + ok_omega = metrics["max_domega_dt"] < settings.tol_domega_dt + ok_pitch = metrics["max_dpitch_dt"] < settings.tol_dpitch_dt + + if ok_power and ok_omega and ok_pitch: + tracker["stable_count"] += 1 + else: + tracker["stable_count"] = 0 + + converged = tracker["stable_count"] >= tracker["hold_steps"] + return converged, metrics \ No newline at end of file diff --git a/MITRotor/FlorisInterface/ROSCOInterface.py b/MITRotor/FlorisInterface/ROSCOInterface.py new file mode 100644 index 0000000..8a6a479 --- /dev/null +++ b/MITRotor/FlorisInterface/ROSCOInterface.py @@ -0,0 +1,459 @@ +# Python modules +import os +import numpy as np +from scipy.interpolate import RegularGridInterpolator +import warnings +# Parallelization modules +from types import SimpleNamespace +# ROSCO toolbox modules +from rosco import discon_lib_path as lib_name +from rosco.toolbox import controller as ROSCO_controller +from rosco.toolbox import turbine as ROSCO_turbine +from rosco.toolbox.utilities import write_rotor_performance, write_DISCON +from rosco.toolbox.inputs.validation import load_rosco_yaml +# MITRotor Imports +import MITRotor.FlorisInterface.InterfaceUtilities as iu + +# ----------------------------- +# Create Ct/Cp surfaces +# ----------------------------- +def load_from_mitrotor( + turbine, bem, + refine_cp_surface=False, + TurbineName = "IEA15MW", + rotor_performance_filename = 'Cp_Ct_Cq.txt', + GenEff = 95.756, + generator_inertia = 1836784, + yaw = 0.0, + tilt = 0.0, +): + ''' + Loads rotor performance information by running MITRotor aerodynamic analysis. + + Based on ROSCO function load_from_ccblade: + https://github.com/NatLabRockies/ROSCO/blob/main/rosco/toolbox/turbine.py#L272 + + Args: + turbine (rosco.toolbox.turbine.Turbine): ROSCO turbine object + bem (MITRotor.BEM): MITRotor BEM object + refine_cp_surface (boolean): if true then smooth cp surface, else false + TurbineName (string): string turbine name; default to "IEA15MW" + GenEff (float): generator efficiency (0-100); defaults to IEA15MW value 95.756 + generator_inertia (float): generator_inertia; defaults to IEA15MW value 1836784 [kg m^2] + yaw (float): yaw with which to make Cp/Ct surface [deg] + tilt (float): tilt with which to make Cp/Ct surface [deg] + rotor_performance_filename (string): file name (including path) for saved Cp/Ct/Cq surface + + Returns: turbine with new fields needed for ROSCO controller, including Ct, Cp, and Cq surfaces + ''' + # Set turbine parameters + turbine.TurbineName = TurbineName + turbine.rotor_performance_filename = rotor_performance_filename + + # Save needed paramters that are read into MITRotor turbine definition through ReferenceTurbines files + (tower_height, gearbox_efficiency, gearbox_ratio, air_density) = bem.rotor.rosco_values + turbine.TowerHt = tower_height + turbine.GBoxEff = gearbox_efficiency + turbine.Ng = gearbox_ratio + turbine.rho = air_density + + # Save remaining two needed generator parameters --> user needs to pass in! + turbine.GenEff = GenEff + turbine.generator_inertia = generator_inertia + + # yaw and tilt for turbine/controller default Cp/Ct surface + turbine.yaw = yaw + turbine.tilt = tilt + + # Calculate remining needed values + turbine.rotor_radius = bem.rotor.R + turbine.J = turbine.rotor_inertia + turbine.generator_inertia * turbine.Ng**2 + turbine.rated_torque = turbine.rated_power/(turbine.GenEff/100*turbine.rated_rotor_speed*turbine.Ng) + + # Generate the look-up tables; mesh the grid and flatten the arrays for aerodynamic analysis + TSR_initial = np.arange(0.5, 25., 0.5) + pitch_initial = np.arange(0.0, 31., 1.0) + pitch_initial_rad = np.deg2rad(pitch_initial) + + tsr_mesh, pitch_rad_mesh = np.meshgrid(TSR_initial, pitch_initial_rad) + tsr_flat = tsr_mesh.ravel() + pitch_rad_flat = pitch_rad_mesh.ravel() + + # Get values from MITRotor + print('Running MITRotor aerodynamic analysis, this may take a minute...') + + mit_sols = bem( + pitch_rad_flat, + tsr_flat, + yaw=np.ones_like(tsr_flat) * turbine.yaw, + tilt=np.ones_like(tsr_flat) * turbine.tilt, + ) + + print('MITRotor aerodynamic analysis run successfully.') + + # Reshape directly into lookup tables + n_pitch = len(pitch_initial_rad) + n_tsr = len(TSR_initial) + + Cp_table = mit_sols.Cp().reshape(n_pitch, n_tsr).T + Ct_table = mit_sols.Ct().reshape(n_pitch, n_tsr).T + Cq_table = mit_sols.Cq().reshape(n_pitch, n_tsr).T + + # Store necessary metrics for analysis + turbine.pitch_initial_rad = pitch_initial_rad + turbine.TSR_initial = TSR_initial + + turbine.Cp_table = Cp_table + turbine.Ct_table = Ct_table + turbine.Cq_table = Cq_table + + turbine.Cp = ROSCO_turbine.RotorPerformance(turbine.Cp_table,turbine.pitch_initial_rad,turbine.TSR_initial, refine=refine_cp_surface) + turbine.Ct = ROSCO_turbine.RotorPerformance(turbine.Ct_table,turbine.pitch_initial_rad,turbine.TSR_initial, refine=refine_cp_surface) + turbine.Cq = ROSCO_turbine.RotorPerformance(turbine.Cq_table,turbine.pitch_initial_rad,turbine.TSR_initial, refine=refine_cp_surface) + + # if TSR_operational is not reccomended, find max Cp TSR from Cp surface + if not turbine.TSR_operational: + turbine.TSR_operational = turbine.Cp.TSR_opt + + return turbine + +# ----------------------------- +# Generate control scheme +# ----------------------------- +def get_rosco_control_interps( + rosco_yaml, bem, + TurbineName="IEA15MW", + rotor_performance_filename='Cp_Ct_Cq.txt', + SimName="Sim1", + GenEff=95.756, + generator_inertia=1836784, + regenerate=False, + save_control_file=None, + save_dir=".", + dt=0.05, + yaw_grid_deg=np.arange(-25.0, 25.0, 1.0), # degrees + n_jobs=-1, # parallel workers across wind speeds +): + """ + Creates pitch and tsr 2D interpolators using ROSCO controller tuning. + Parallelized over yaws; wind speeds for each yaw are solved sequentially. + + Args: + rosco_yaml (str): Path to ROSCO controller YAML configuration file. + bem (MITRotor.BEM): MITRotor BEM object used to generate rotor performance surfaces. + TurbineName (str): Turbine name. Defaults to "IEA15MW". + rotor_performance_filename (str): File name (including path) for saved Cp/Ct/Cq surface. Defaults to "Cp_Ct_Cq.txt". + SimName (str): Simulation name used in ROSCO configuration. Defaults to "Sim1". + GenEff (float): Generator efficiency (0-100%). Defaults to IEA15MW value of 95.756. + generator_inertia (float): Generator inertia [kg m^2]. Defaults to IEA15MW value of 1836784. + regenerate (bool): If True, regenerate the rotor performance file even if one exists. Defaults to False. + save_control_file (str): Optional file name for saving the generated ROSCO control file. Defaults to None. + save_dir (str): Directory in which to save generated files. Defaults to ".". + dt (float): Controller timestep [s]. Defaults to 0.05. + yaw_grid_deg (array-like): Yaw angles [deg] used when generating Cp/Ct/Cq performance surfaces. Defaults to np.arange(0.0, 25.0, 1.0). + n_jobs (int): Number of parallel workers used when generating rotor performance surfaces across wind speeds. Defaults to -1 (all available workers). + + Returns: pitch_rad_interp, tsr_interp, turbine.rated_rotor_speed + """ + + # Load ROSCO inputs and make basic turbine + inps = load_rosco_yaml(rosco_yaml) + turbine_params = inps['turbine_params'] + turbine = ROSCO_turbine.Turbine(turbine_params) + + # If control csv exists and do not want to regenerate, load old csv + if not regenerate and save_control_file is not None: + pitch_rad_interp, tsr_interp = iu.load_control_interps_from_csv(save_control_file) + return pitch_rad_interp, tsr_interp, turbine.rated_rotor_speed + + # Load and check control parameters + controller_params = inps['controller_params'] + if (controller_params["WE_Mode"] != 0) and (controller_params["WE_Mode"] != 2): + warnings.warn( + "We suggest using WE_Mode = 0 or WE_Mode = 2 within the control parameter file.", + UserWarning, + ) + if (controller_params["VS_ControlMode"] == 2): + warnings.warn( + "We suggest NOT using VS_ControlMode = 2 within the control parameter file. Mismatched TSR definitions between MITRotor and" \ + "ROSCO lead to biased optimization.", + UserWarning, + ) + + if (controller_params["Y_ControlMode"] != 0): + warnings.warn( + "We suggest ONLY using Y_ControlMode = 0 within the control parameter file. This turns off yaw control," \ + "which is vital for keeping a steady yaw to determine yawed control setpoints.", + UserWarning, + ) + + # Generate turbine Cp/Ct surfaces + turbine = load_from_mitrotor( + turbine, bem, + TurbineName=TurbineName, rotor_performance_filename=rotor_performance_filename, + generator_inertia=generator_inertia, GenEff=GenEff, + yaw=0.0, # Cp/Ct surface generated with yaw = 0 + ) + + # Save turbine Cp/Ct surface + cp_filename = turbine.rotor_performance_filename + write_rotor_performance(turbine, txt_filename=cp_filename) + + # Make and tune controller + controller = ROSCO_controller.Controller(controller_params) + controller.tune_controller(turbine) + + # Write parameter input file + param_filename = os.path.join(save_dir, 'DISCON.IN') + write_DISCON( + turbine, controller, + param_file=param_filename, + txt_filename=cp_filename + ) + + # Tuned initial setpoints + init_pitch_rad_list = np.maximum(controller.pitch_op, controller.ps_min_bld_pitch) + init_tsr_list = controller.TSR_op + + # Create parameter tables + v_grid = controller.v.copy() + yaw_grid_deg = np.sort(np.asarray(yaw_grid_deg, dtype=float)) + yaw_grid_rad = np.deg2rad(yaw_grid_deg) + + pitch_tbl = np.full((len(v_grid), len(yaw_grid_rad)), np.nan, dtype=float) + tsr_tbl = np.full_like(pitch_tbl, np.nan) + power_tbl = np.full_like(pitch_tbl, np.nan) + + # Lightweight turbine object for worker pickling + turbine_sim = SimpleNamespace( + rotor_radius=float(turbine.rotor_radius), + rho=float(turbine.rho), + Ng=float(turbine.Ng), + J=float(turbine.J), + GBoxEff=float(turbine.GBoxEff), + GenEff=float(turbine.GenEff), + ) + + # run simulations in parallel or serial depending on n_jobs + def yaw_row_func(i, yaw_rad): + return _run_one_yaw_row( + i, v_grid, yaw_rad, init_pitch_rad_list, init_tsr_list, + turbine_sim, bem, param_filename, dt, SimName + ) + cols = iu.run_yaw_row_sim(v_grid, yaw_grid_rad, yaw_row_func, n_jobs) + + # Collect setpoints + for i, pitch_col, tsr_col, power_col in cols: + pitch_tbl[:, i] = pitch_col + tsr_tbl[:, i] = tsr_col + power_tbl[:, i] = power_col + + # Optional CSV save + iu.save_control_interps_to_csv(save_control_file, v_grid, yaw_grid_rad, pitch_tbl, tsr_tbl, power_tbl) + + # Make interpolators + pitch_rad_interp = RegularGridInterpolator( + (v_grid, yaw_grid_rad), pitch_tbl, + method="linear", bounds_error=False, fill_value=None + ) + tsr_interp = RegularGridInterpolator( + (v_grid, yaw_grid_rad), tsr_tbl, + method="linear", bounds_error=False, fill_value=None + ) + return pitch_rad_interp, tsr_interp, turbine.rated_rotor_speed + +def _run_one_yaw_row( + i, v_grid, yaw_rad, init_pitch_rad_list, init_tsr_list, + turbine_sim, bem, param_filename, dt, SimName +): + """ + Worker: solve all yaw points for a single wind speed index i. + Uses sequential warm-start across yaw in this row. + Returns row arrays (pitch/tsr/power), with NaN on fail/non-convergence. + """ + print(f"Starting ROSCO simulation for yaw = {yaw_rad}") + nv = len(v_grid) + pitch_col = np.full(nv, np.nan, dtype=float) + tsr_col = np.full(nv, np.nan, dtype=float) + power_col = np.full(nv, np.nan, dtype=float) + + for j, v in enumerate(v_grid): + init_pitch_rad = init_pitch_rad_list[j] + init_pitch_deg = np.rad2deg(init_pitch_rad) + init_tsr = init_tsr_list[j] + init_rot_speed = init_tsr * v / turbine_sim.rotor_radius + init_gen_speed = init_rot_speed * turbine_sim.Ng + + controller_int = iu.WarmStartControllerInterface( + lib_name, + param_filename=param_filename, + sim_name=f"{SimName}_{i}_{j}", + DT=dt, + init_ws=v, + init_rot_speed=init_rot_speed, + init_gen_speed=init_gen_speed, + init_pitch_deg=init_pitch_deg, # deg + init_torque=0.0, + init_yaw_rad=yaw_rad, # rad + ) + # lightweight sim object compatible with sim_ws_mitrotor + sim = SimpleNamespace(turbine=turbine_sim, controller_int=controller_int) + + try: + converged = sim_ws_mitrotor( + sim=sim, bem=bem, ws=v, dt=dt, + init_tsr=init_tsr_list[j], + init_pitch_rad=init_pitch_rad_list[j], # rad + init_yaw_rad=yaw_rad, # rad + wd=0.0, # rad + verbose=False, + ) + + # Save only converged points; else remain NaN + if converged: + pitch_col[j] = sim.bld_pitch # rad + tsr_col[j] = sim.tsr + power_col[j] = sim.gen_power + + except Exception: + continue + + + finally: + # Kill controller - runs no matter what (success, failure, exception) + sim.controller_int.kill_discon() + + return i, pitch_col, tsr_col, power_col + +# ----------------------------- +# Steady-state simulation +# ----------------------------- +def sim_ws_mitrotor( + sim, bem, ws, dt, init_tsr, init_pitch_rad, + wd=0.0, init_yaw_rad=0.0, + max_iter=20000, + conv_settings=None, + verbose=True, +): + """ + Steady-state single-wind-speed simulation (no time history storage), + with rolling-window convergence checks. + + ws: wind speed, (m/s) + init_tsr: tip speed ratio, (-) + init_pitch: initial blade pitch angle, (rad) + wd: wind direction, (rad) + yaw_init: initial "north" (or constant) yaw angle, (rad) + max_iter: maximum number of iterations to try for convergence (int), + conv_settings: settings that define convergence to steady state, (ConvergenceSettings) + verbose: print extra information if True, (bool) + + """ + if conv_settings is None: + conv_settings = iu.ConvergenceSettings() + + # Turbine constants + R = sim.turbine.rotor_radius + rho = sim.turbine.rho + Ng = sim.turbine.Ng + J = sim.turbine.J + gbox_eff = sim.turbine.GBoxEff / 100.0 + gen_eff = sim.turbine.GenEff / 100.0 + + # States + bld_pitch = init_pitch_rad # rad + rot_speed = (init_tsr * ws / R) # rad/s + gen_speed = rot_speed * Ng # rad/s + gen_torque = 0.0 # Nm + gen_power = 0.0 # W + nac_yaw = init_yaw_rad # rad + nac_yawrate = 0.0 # rad/s + + # Convergence tracker + tracker = iu.init_convergence_tracker(dt, conv_settings) + + n_iter = 0 + t = 0.0 + converged = False + last_metrics = None + # Begin iteration + t = 0.0 + while n_iter < max_iter: + t += dt + + tsr = rot_speed * R / max(ws, 1e-6) + yaw_err = wd - nac_yaw + + # BEM call + sol = bem( + bld_pitch, tsr, + yaw = yaw_err, + tilt = 0.0 # yaw here is "effective yaw" or total y-z plane offset + ) + cp = float(np.ravel(sol.Cp())[0]) + + # Rotor dynamics calculations (same as used in ROSCO's sim_ws_series function) + aero_torque = 0.5 * rho * (np.pi * R**3) * (cp / max(tsr, 1e-6)) * ws**2 + rot_speed = rot_speed + (dt / J) * (aero_torque - Ng * gen_torque / gbox_eff) + gen_speed = rot_speed * Ng + + # Controller input state + turbine_state = { + "iStatus": 1, + "t": t, + "dt": dt, + "ws": ws, + "bld_pitch": bld_pitch, # rad + "gen_torque": gen_torque, + "gen_speed": gen_speed, + "gen_eff": gen_eff, + "rot_speed": rot_speed, + "Yaw_fromNorth": nac_yaw, # rad + "Y_MeasErr": yaw_err, # rad + } + + # Controller call; torque, blade pitch, and yaw rate outputs + gen_torque, bld_pitch, nac_yawrate = sim.controller_int.call_controller(turbine_state) + + # Calculate power + gen_power = gen_speed * gen_torque * gen_eff # W + + # Yaw dynamics update for if yaw-control is on + nac_yaw += nac_yawrate * dt + + # Convergence tracking + iu.update_convergence_tracker(tracker, gen_power, rot_speed, bld_pitch) + converged, metrics = iu.check_convergence(n_iter, dt, tracker, conv_settings) + if metrics is not None: + last_metrics = metrics + + # Check if converged + if converged: + if verbose and last_metrics is not None: + print( + f"Converged after {n_iter} steps " + f"(t={n_iter*dt:.1f}s): " + f"P={last_metrics['p_mean']/1000:.1f} kW, " + f"std(P)/mean(P)={last_metrics['rel_p_std']:.2e}, " + f"max|dω/dt|={last_metrics['max_domega_dt']:.2e} rad/s², " + f"max|dθ/dt|={np.rad2deg(last_metrics['max_dpitch_dt']):.2e} deg/s" + ) + break + + n_iter += 1 + + if not converged and verbose: + print(f"WARNING: hit max_iter={max_iter} without convergence") + + # Save outputs + sim.bld_pitch = bld_pitch # rad + sim.tsr = rot_speed * R / max(ws, 1e-6) # TSR w.r.t. freestream + sim.rot_speed = rot_speed # rad/s + sim.gen_speed = gen_speed # rad/s + sim.gen_torque = gen_torque # Nm + sim.gen_power = gen_power # W + sim.nac_yaw = nac_yaw # rad + sim.n_iter = n_iter + sim.converged = converged + + return converged \ No newline at end of file diff --git a/MITRotor/Geometry.py b/MITRotor/Geometry.py index 8a00144..7f0ae3f 100644 --- a/MITRotor/Geometry.py +++ b/MITRotor/Geometry.py @@ -40,14 +40,53 @@ def cartesian(self, yaw: float, tilt: float) -> Tuple[ArrayLike, ...]: Z = self.mu_mesh * np.cos(self.theta_mesh) # vertical return X, Y, Z + +# ---------- Function for averaging over the rotor ---------- # - def annulus_average(self, X: ArrayLike): - X_azim = 1 / (2 * np.pi) * np.trapezoid(X, self.theta_mesh, axis=-1) + def annulus_average(self, X): + X = np.asarray(X) + theta = np.asarray(self.theta).reshape(-1) + #Ensure last axis is Nθ + if X.shape[-1] != theta.shape[0]: + raise ValueError(f"Mismatch: X.shape={X.shape}, theta.shape={theta.shape}") + # Integrate over Nθ (last axis) + return (1 / (2 * np.pi)) * np.trapezoid(X, theta, axis=-1) - return X_azim + def rotor_average(self, X): + X = np.asarray(X) + mu = np.asarray(self.mu).reshape(-1) # (Nr,) + # Ensure last axis is Nr + if X.shape[-1] != mu.shape[0]: + raise ValueError(f"Mismatch: X.shape={X.shape}, mu.shape={mu.shape}") + # Integrate over Nr (last axis) + return 2 * np.trapezoid(X * mu, mu, axis=-1) + +# ---------- Function for adjusting axes for vectorization ---------- # - def rotor_average(self, X: ArrayLike): - # Takes annulus average quantities and performs rotor average +def expand_to_Np(x): # add setpoint axis + x = np.atleast_1d(x) + if x.ndim < 3: + return x[None, ...] + else: + return x - X_rotor = 2 * np.trapezoid(X * self.mu, self.mu) - return X_rotor +def expand_to_Nr_Ntheta(x): # add Nr and Nθ axis + x = np.atleast_1d(x) + if x.ndim < 3: + return x[:, None, None] + else: + return x + +def expand_to_Nr(x): # add Nr axis + x = np.atleast_1d(x) + if x.ndim < 2: + return x[:, None] + else: + return x + +def expand_to_Ntheta(x): # add Nθ axis + x = np.atleast_1d(x) + if x.ndim < 3: + return x[:, :, None] + else: + return x diff --git a/MITRotor/Momentum.py b/MITRotor/Momentum.py index 519eea4..fe3d41c 100644 --- a/MITRotor/Momentum.py +++ b/MITRotor/Momentum.py @@ -8,6 +8,7 @@ from pathlib import Path from UnifiedMomentumModel import Momentum as UMM from UnifiedMomentumModel.Utilities.Geometry import calc_eff_yaw, eff_yaw_inv_rotation +from .Geometry import expand_to_Nr_Ntheta, expand_to_Nr, expand_to_Ntheta if TYPE_CHECKING: from .Geometry import BEMGeometry @@ -45,7 +46,6 @@ def compute_induction(self, Cx: ArrayLike, yaw: float = 0, tilt:float = 0) -> Ar @abstractmethod def compute_initial_wake_velocities(self, Ct: float, yaw: float = 0, tilt: float = 0.0) -> ArrayLike: ... - def _func_rotor( self, @@ -62,13 +62,11 @@ def _func_rotor( geom.rotor_average( geom.annulus_average( np.clip(aero_props.C_x_corr, 0, 1.69) - ) - ) + ) + ) ) - - return self.compute_induction(rotor_avg_axial_force, yaw = yaw, tilt = tilt) - - + an = self.compute_induction(rotor_avg_axial_force, yaw = yaw, tilt = tilt) + return expand_to_Nr_Ntheta(an) def _func_annulus( self, @@ -81,15 +79,12 @@ def _func_annulus( tilt: float = 0.0, ) -> ArrayLike: - annulus_avg_axial_force = ( - - geom.annulus_average( - np.clip(aero_props.C_x_corr, -10, 10) - ) - )[:, None] * np.ones(geom.shape) - - - return self.compute_induction(annulus_avg_axial_force, yaw = yaw, tilt = tilt) + annulus_avg_axial_force = geom.annulus_average( + np.clip(aero_props.C_x_corr, 0, 1.69) + ) + yaw, tilt = expand_to_Nr(yaw), expand_to_Nr(tilt) + an = self.compute_induction(annulus_avg_axial_force, yaw = yaw, tilt = tilt) + return expand_to_Ntheta(an) def _func_sector( self, @@ -102,7 +97,7 @@ def _func_sector( tilt: float = 0.0, ) -> ArrayLike: axial_force = np.clip(aero_props.C_x_corr, -10, 10) - + yaw, tilt = expand_to_Nr_Ntheta(yaw), expand_to_Nr_Ntheta(tilt) return self.compute_induction(axial_force, yaw = yaw, tilt = tilt) def __call__( @@ -125,12 +120,12 @@ def __init__(self, a = 1/3): self._func = self._func_rotor def compute_induction(self, Cx, yaw, tilt = 0) -> ArrayLike: - if tilt != 0: + if np.any(tilt != 0): raise ValueError("Tilt not supported by the ConstantInduction momentum model. Use UMM.") return self.a * np.ones_like(yaw) def compute_initial_wake_velocities(self, Ct: float, yaw: float, tilt: float = 0.0) -> ArrayLike: - if tilt != 0: + if np.any(tilt != 0): raise ValueError("Tilt not supported by the ConstantInduction momentum model. Use UMM.") u4 = 1 - 2 * self.a v4 = - (1/4) * Ct * np.sin(yaw) @@ -151,22 +146,20 @@ def __init__(self, averaging: Literal["sector", "annulus", "rotor"] = "rotor"): self.averaging = averaging def compute_induction(self, Cx, yaw, tilt = 0): - if tilt != 0: + if np.any(tilt != 0): raise ValueError("Tilt not supported by the ClassicalMomentum momentum model. Use UMM.") Cx = np.asarray(Cx) sqrt_term = np.sqrt(np.where(Cx < 1, 1 - Cx, np.nan)) return 0.5 * (1 - sqrt_term) def compute_initial_wake_velocities(self, Ct: float, yaw: float, tilt: float = 0.0) -> ArrayLike: - if tilt != 0: + if np.any(tilt != 0): raise ValueError("Tilt not supported by the ClassicalMomentum momentum model. Use UMM.") u4 = np.sqrt(1 - Ct) v4 = - (1/4) * Ct * np.sin(yaw) w4 = 0.0 return u4, v4, w4 - - class MadsenMomentum(MomentumModel): """ Madsen Momentum model based on 2020 paper: @@ -188,7 +181,7 @@ def __init__(self, def compute_induction(self, Cx: ArrayLike, yaw: float, tilt: float = 0.0) -> ArrayLike: - if tilt != 0: + if np.any(tilt != 0): raise ValueError("Tilt not supported by the Madsen momentum model. Use UMM.") if self.cosine_exponent: Ct = Cx / (np.cos(yaw)**2) @@ -199,7 +192,7 @@ def compute_induction(self, Cx: ArrayLike, yaw: float, tilt: float = 0.0) -> Arr return an def compute_initial_wake_velocities(self, Ct: float, yaw: float, tilt: float = 0.0) -> ArrayLike: - if tilt != 0: + if np.any(tilt != 0): raise ValueError("Tilt not supported by the Madsen momentum model. Use UMM.") u4 = np.sqrt(np.maximum(1 - Ct, 0)) v4 = - (1/4) * Ct * np.sin(yaw) @@ -231,7 +224,7 @@ def __init__( self.averaging = averaging def compute_induction(self, Cx: ArrayLike, yaw: float, tilt: float = 0.0) -> ArrayLike: - if tilt != 0: + if np.any(tilt != 0): raise ValueError("Tilt not supported by the HeckMomentum model for BEM. Use UMM.") Ctc = 4 * self.ac * (1 - self.ac) / (1 + 0.25 * (1 - self.ac) ** 2 * np.sin(yaw) ** 2) slope = (16 * (1 - self.ac) ** 2 * np.sin(yaw) ** 2 - 128 * self.ac + 64) / ( @@ -254,7 +247,7 @@ def compute_induction(self, Cx: ArrayLike, yaw: float, tilt: float = 0.0) -> Arr return a def compute_initial_wake_velocities(self, Ct: float, yaw: float, tilt: float = 0.0) -> ArrayLike: - if tilt != 0: + if np.any(tilt != 0): raise ValueError("Tilt not supported by the HeckMomentum model for BEM. Use UMM.") a = self.compute_induction(Ct, yaw) u4 = 1 - Ct /(2 * (1 - a)) @@ -334,7 +327,7 @@ class ThrustBasedUnifiedLUT(CachedLUT, UMM.MomentumBase): as described in UMM documentation, yaw and tilt can be combined into an "effective yaw" the cache uses effective yaw, so these values should cover the range of effective yaws you want. You can use UnifiedMomentumModel.Utilities.Geometry.calc_eff_yaw to find - - beta (float, optional) - used in UMM + - beta_s (float, optional) - used in UMM - cached (boolean, optional) - cache nonlinear pressure in UMM """ def __init__(self, cache_fn: Path = CACHE_FN_CT, regenerate=False, s=0.025, diff --git a/MITRotor/ReferenceTurbines/ROSCO_IEA15MW.yaml b/MITRotor/ReferenceTurbines/ROSCO_IEA15MW.yaml new file mode 100644 index 0000000..2a65efd --- /dev/null +++ b/MITRotor/ReferenceTurbines/ROSCO_IEA15MW.yaml @@ -0,0 +1,62 @@ +# --------------------- ROSCO controller tuning input file ------------------- + # Written for use with ROSCO_Toolbox tuning procedures + # Turbine: IEA 15MW Reference Wind Turbine + # NOTE: The comments describing inputs in this file are not maintained. + # The most up-to-date descriptions can be found in the ROSCO documentation: https://rosco.readthedocs.io/en/latest/source/toolbox_input.html +# ------------------------------ OpenFAST PATH DEFINITIONS ------------------------------ +path_params: + FAST_InputFile: 'IEA-15-240-RWT-UMaineSemi.fst' # Name of *.fst file + FAST_directory: '../Test_Cases/IEA-15-240-RWT/IEA-15-240-RWT-UMaineSemi' # Main OpenFAST model directory, where the *.fst lives + # Optional (but suggested...) + rotor_performance_filename: '../Test_Cases/IEA-15-240-RWT/IEA-15-240-RWT/Cp_Ct_Cq.IEA15MW.txt' + +# -------------------------------- TURBINE PARAMETERS ----------------------------------- +turbine_params: + rotor_inertia: 310619488. # Rotor inertia [kg m^2], {Available in Elastodyn .sum file} + rated_rotor_speed: 0.7916813478 # Rated rotor speed [rad/s] + v_min: 3. # Cut-in wind speed [m/s] + v_rated: 10.74 # Rated wind speed [m/s] + v_max: 25.0 # Cut-out wind speed [m/s], -- Does not need to be exact (JUST ASSUME FOR NOW) + max_pitch_rate: 0.0349 # Maximum blade pitch rate [rad/s] + max_torque_rate: 4500000. # Maximum torque rate [Nm/s], {~1/4 VS_RtTq/s} + rated_power: 15000000. # Rated Power [W] + bld_edgewise_freq: 4.0324 # Blade edgewise first natural frequency [rad/s] + bld_flapwise_freq: 3.4872 # Blade flapwise first natural frequency [rad/s] + TSR_operational: 9.0 + +#------------------------------- CONTROLLER PARAMETERS ---------------------------------- +controller_params: + # Controller flags + LoggingLevel: 0 # {0: write no debug files, 1: write standard output .dbg-file, 2: write standard output .dbg-file and complete avrSWAP-array .dbg2-file + F_LPFType: 2 # {1: first-order low-pass filter, 2: second-order low-pass filter}, [rad/s] (currently filters generator speed and pitch control signals) + F_NotchType: 0 # Notch on the measured generator speed {0: disable, 1: enable} + IPC_ControlMode: 0 # Turn Individual Pitch Control (IPC) for fatigue load reductions (pitch contribution) {0: off, 1: 1P reductions, 2: 1P+2P reductions} + VS_ControlMode: 1 # Generator torque control mode in above rated conditions {0: constant torque, 1: constant power, 2: TSR tracking PI control} + PC_ControlMode: 1 # Blade pitch control mode {0: No pitch, fix to fine pitch, 1: active PI blade pitch control} + Y_ControlMode: 0 # Yaw control mode {0: no yaw control, 1: yaw rate control, 2: yaw-by-IPC} + SS_Mode: 1 # Setpoint Smoother mode {0: no setpoint smoothing, 1: introduce setpoint smoothing} + WE_Mode: 0 # Wind speed estimator mode {0: One-second low pass filtered hub height wind speed, 1: Immersion and Invariance Estimator (Ortega et al.)} + PS_Mode: 3 # Pitch saturation mode {0: no pitch saturation, 1: peak shaving, 2: Cp-maximizing pitch saturation, 3: peak shaving and Cp-maximizing pitch saturation} + SD_Mode: 0 # Shutdown mode {0: no shutdown procedure, 1: pitch to max pitch at shutdown} + Fl_Mode: 2 # Floating specific feedback mode {0: no nacelle velocity feedback, 1: nacelle velocity feedback} + Flp_Mode: 0 # Flap control mode {0: no flap control, 1: steady state flap angle, 2: Proportional flap control} + PA_Mode: 2 # Pitch actuator mode {0 - not used, 1 - first order filter, 2 - second order filter} + # Controller parameters + # U_pc: [14] + zeta_pc: 1.0 # Pitch controller desired damping ratio [-] + omega_pc: 0.2 # Pitch controller desired natural frequency [rad/s] + zeta_vs: 0.85 # Torque controller desired damping ratio [-] + omega_vs: 0.12 # Torque controller desired natural frequency [rad/s] + twr_freq: 3.355 # for semi only! + ptfm_freq: 0.213 # for semi only! + # Optional - these can be defined, but do not need to be + min_pitch: 0.0 # Minimum pitch angle [rad], {default = 0 degrees} + vs_minspd: 0.523598775 # Minimum rotor speed [rad/s], {default = 0 rad/s} + ps_percent: 0.8 # Percent peak shaving [%, <= 1 ], {default = 80%} + PA_CornerFreq: 1.5708 # Pitch actuator natural frequency [rad/s] + PA_Damping: 0.707 # Pitch actuator natural frequency [rad/s] + rgn2k_factor: 0.85926 + + DISCON: + IPC_KI: [1.2e-11, 0] + diff --git a/MITRotor/RotorDefinition.py b/MITRotor/RotorDefinition.py index 4e8d487..e036705 100644 --- a/MITRotor/RotorDefinition.py +++ b/MITRotor/RotorDefinition.py @@ -105,6 +105,13 @@ def from_windio(cls, windio: dict): airfoil_func = BladeAirfoils.from_windio(windio, hub_radius, R) + # Needed for ROSCO Control + tower_height = np.max(windio["components"]["tower"]["outer_shape_bem"]["reference_axis"]["z"]["values"]) + gearbox_efficiency = windio["components"]["nacelle"]["drivetrain"]["gearbox_efficiency"] * 100 + gearbox_ratio = windio["components"]["nacelle"]["drivetrain"]["gear_ratio"] + air_density = windio["environment"]["air_density"] + rosco_values = (tower_height, gearbox_efficiency, gearbox_ratio, air_density) + return cls( twist_func, solidity_func, @@ -117,6 +124,7 @@ def from_windio(cls, windio: dict): tsr_target, hub_radius, name=name, + rosco_values = rosco_values ) def __init__( @@ -132,6 +140,7 @@ def __init__( tsr_target, hub_radius, name=None, + rosco_values = None, ): self.name = name self.N_blades = N_blades @@ -147,6 +156,8 @@ def __init__( self.solidity_func = solidity_func self.airfoil_func = airfoil_func + self.rosco_values = rosco_values + def twist(self, mu): return self.twist_func(mu) diff --git a/MITRotor/TangentialInduction.py b/MITRotor/TangentialInduction.py index d44369c..eed531e 100644 --- a/MITRotor/TangentialInduction.py +++ b/MITRotor/TangentialInduction.py @@ -3,7 +3,7 @@ from numpy.typing import ArrayLike from .Aerodynamics import AerodynamicProperties -from .Geometry import BEMGeometry +from .Geometry import BEMGeometry, expand_to_Nr_Ntheta from .RotorDefinition import RotorDefinition from UnifiedMomentumModel.Utilities.Geometry import calc_eff_yaw @@ -54,7 +54,8 @@ def __call__( geom: BEMGeometry, tilt: float = 0.0, ) -> ArrayLike: - eff_yaw = calc_eff_yaw(yaw, tilt) + eff_yaw = expand_to_Nr_Ntheta(calc_eff_yaw(yaw, tilt)) + tsr = expand_to_Nr_Ntheta(tsr) aprime = ( np.clip(aero_props.C_tau_corr, -2, 2) / (4 * np.maximum(geom.mu_mesh, 0.1) * tsr * (1 - aero_props.an) * np.cos(eff_yaw)) diff --git a/examples/MITRotor_quickstart.ipynb b/examples/MITRotor_quickstart.ipynb index fc669fd..b97cec5 100644 --- a/examples/MITRotor_quickstart.ipynb +++ b/examples/MITRotor_quickstart.ipynb @@ -240,7 +240,7 @@ " tiploss_model = prandtl_tip_loss,\n", " momentum_model = unified_momentum_model,\n", " tangential_induction_model = tangential_induction_model,\n", - " aerodynamic_model = kragh_aerodynamic_model\n", + " aerodynamic_model = default_aerodynamic_model\n", ")" ] }, @@ -267,14 +267,14 @@ "name": "stdout", "output_type": "stream", "text": [ - "BEM solution converged in 18 iterations.\n", + "BEM solution converged in 11 iterations.\n", "Control setpoints: sol.pitch=0.00, sol.tsr=7.00, sol.yaw=0.35\n", "Power coefficient: 0.39\n", - "Thrust coefficient: 0.60\n", - "Local thrust coefficient: 1.17\n", - "Axial induction: 0.24\n", + "Thrust coefficient: 0.58\n", + "Local thrust coefficient: 1.12\n", + "Axial induction: 0.23\n", "Rotor-effective windspeed: 1.00\n", - "Far-wake streamwise velocity: 0.64\n", + "Far-wake streamwise velocity: 0.65\n", "Far-wake lateral velocity: -0.05\n" ] } @@ -317,7 +317,7 @@ "text": [ "<>:7: SyntaxWarning: invalid escape sequence '\\m'\n", "<>:7: SyntaxWarning: invalid escape sequence '\\m'\n", - "/var/folders/dt/wzb0_01j5yz8q2y9bz5sfjm00000gn/T/ipykernel_16176/2546713841.py:7: SyntaxWarning: invalid escape sequence '\\m'\n", + "/var/folders/dt/wzb0_01j5yz8q2y9bz5sfjm00000gn/T/ipykernel_88069/2546713841.py:7: SyntaxWarning: invalid escape sequence '\\m'\n", " axes[-1].set_xlabel(\"Radial position, $\\mu$ [-]\")\n" ] }, @@ -333,7 +333,7 @@ }, { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAjcAAAG0CAYAAADO5AZFAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjcsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvTLEjVAAAAAlwSFlzAAAPYQAAD2EBqD+naQAAW11JREFUeJzt3Qd4U/X6B/C3K90tHXTS0tIyZJVdpoBwqRucyBUZTkDwKi5wAIJepopCBUVR7t8BDlCvegFlyRKwCDILLS0t0F26d5P/8/7SE5LSkZSkSU6+n+c5Jjk5SU/Pkeab9zeOnUqlUhEAAACATNibewcAAAAAjAnhBgAAAGQF4QYAAABkBeEGAAAAZAXhBgAAAGQF4QYAAABkBeEGAAAAZMWRZECpVNKVK1fI09OT7OzszL07AAAAoAeeaq+4uJhCQkLI3t549RZZhBsONmFhYebeDQAAAGiB9PR0ateuHRmLLMINV2ykg+Pl5WXu3QEAAAA9FBUVieKE9DluLLIIN1JTFAcbhBsAAADrYuwuJehQDAAAALIii8oNgKV1kCuvrqWSyhoqrayl0sqauvs1Da4rreL79dZVXltXq1SRs6M9KRztNbfq+w4669S3DqRwsCdnJ3vNrbNDY9urH0vrXJ0cyMPFkTydHcnTxYlcnOzRQR8ArBLCDYCeiiqq6VxmMZ3JLKazGUWUXVypFUSuhRYOK0qVcQ9rVa2SqLJ1T5WDvR15ujiSh7N68XJxUoefunUcgDzrPVbfSov6MYcnAIDWhHADUE9NrZJS88robGYRnc0oFrdnMorpckG5QceKm5DdFY7k7uxA7nUBQf2Y72utc762zk2hvc5B3Hd0sKeqGiVV1tSKW/V96bZW6/71z4nta5VUWV13W7eu8rrta6miWknFFdUiqHE444pRQVm1WG4EV4XqByAvV+1w5EReLurwpHms87yjqDIBAOgL4QZsWl5JJZ3lakxGESVyRSazmM5lFYsP/IYEe7tQlyBP6hLsRe18XOsFlmuBhB9zM4+9vZ1VNquVVdVScQVXpKqpiG8rajSPizX3azRhSFonPebtS6tqxfuJIFVSRbklVTcYkNQhiMOOl2td8HF20n1cF4iuBaVr65wcUEECsBUIN2ATuGKRnF2qrsbUhRm+zSluuK2Hg0nnIE+6KdiTugR5qQNNkBd5uzmRLYxakKpJRC4tfh+u/NQPQBx6uHmvWOu2WHpcfi04Sc/x664FpErKLak0SkCSmtc4HF27fy0IqddJAerafTeFA/ohAVgBhBuQFa46ZBZViOakM1rNShdySqmmkY4w7f3cNOFFCjPhvm5WWXWxJNxnx9vVSSw3GpCuBR91JUkKRNqP+VZ7OykoceduYwUk/l+iof5GXDmSqkVSFYkf695X33LIwkzqAKaFcAOywB15vzqcRuv3pdCVwooGt+Fv7NycdFNdsxIHmk6BnnUVCpBrQOI+VA01nWlCkFZVSROKKq9vhuOgxflYhKgKdUWpJXgUm9SnSN3Mdi34NBSKpMCkDlDqZlAEb4Cm4a86WLX80ir67EAqbTiQSoXl1ZoPxKi27qICo920xP1l8I3Z9nCH7DZuCrHcSEVQ6nDdUBgq0q4glUvNatr31c9xOOKO3bk30AeJO6p7alWLrgWja/elIKQdkjggSiPe+N8IgJwh3IBVulJQTuv2XqCNh9M1zQ6R/u701M0daFzvUHJxwugaMB4Oxa4KB7EEtPA9lEqVmCZAu08RN6Pp3tcNSOJx3Xp+noORSqd6ZNgIPol6aH9DAUm9jv/98MJNaGLRvu/ooJ4/SbrvaK/etm4dV6bwJQLMDeEGrEpSdgl9uCeZvj92mapr1X1ouoV40YwR0XRr9yB8IwWLxU1J6r46ThRCri16j4rq2uvCkBSQGqoYaW+j3f9IjGirrGm0CfdGNReKpODEk046OdhpQhGPaJMmluT7mkkr6z2nqHdfeo63130PO4QtG4VwA1bheHoBrdmdTNtOZ4pvrmxgB18RaoZ19Mc3RbAJUkUloIXXGOR5jbQ7X0uhSL3uWijiECU6YFcrqYLnUqq+NqeSepHWqe9zk502aTu6gb5JxuTrrhADByL83MVggQh/N2rv5y4e+7g54e+HDJks3MTHx9Py5cspMzOTYmJiaNWqVTRgwIBmX7dx40aaMGECjR07lr7//ntT7R5YAe7nsD8pj9bsSRK3kn90DaTpI6KoT7iPWfcPwNpwNcPPw1ksxv63ypVUKQBphyOdUCStr9uGw1Z1rXoyyar6t9JzdY8r621bXaNq9Dnu/F2/bx4vf6UVXLfv3H+pvSbsqG/biwDkTgGezgg+Vsok4WbTpk00e/ZsWrt2LcXGxtLKlSspLi6OEhMTKSCg8Rbr1NRUeuGFF2jYsGGm2C2wEtw3YfvpTPpgdzL9falQrOMOkGNjQmjaiCgxwgkALAf3sVE48mJPlvCvk8MNhx1pFu7s4gq6mFdGqXmldDG3jC7ml4rHGYUVooP4yctFYmloviuu+KirPe6a6g/fBnu7ohncgtmpOHIbGQea/v370+rVq8VjpVJJYWFhNGvWLJozZ06Dr6mtraWbb76ZHn30Udq7dy8VFBToXbkpKioib29vKiwsJC8vL6P+LtB6+I8Q96VZuydZzEvDuA39of5h9MTNHaidjxtOBwAYDVeP0vLLKDW3VH3L4acuBF2+Wt7kNeK4r087X1dN2OFqz03BXtSnvQ9mwzaAqT6/jV65qaqqooSEBJo7d65mnb29PY0ePZoOHjzY6OsWLlwoqjqPPfaYCDdNqaysFIv2wQHrVVbFc9Sk08d7L4hvUoxHbUweFEFThkSQv5FL6AAAjPsvcSW4oWowf9ni68mpqz2ldDG/TBN80vPLRPMXfwmTvohpj0QbHOVHwzu3peGd2uJLmZkYPdzk5uaKKkxgYKDOen589uzZBl+zb98++uSTT+jYsWN6/YzFixfTG2+8YZT9BfMpKFPPUcOLdHHGtp7O9PjQSPpnbLgYVQIAYA7cxMbTS/BCna9v9sooLL/W1JVXRim5pXT04lXKK62i7aezxMJ4zq3hnQJE2ImN9MU0FbYyWqq4uJgeeeQRWrduHfn7++v1Gq4KcZ8e7coNN3uBdeA/Cp/sTaEvD6eJCzQyLus+dXMU3dsHc9QAgGXjPoDcTM7LkGh/nf6Cp64U0Z5z2bTnXA4dTSug5JxSSs5JofX7U0Qz+8AOfqKiw2Gng787OixbS7jhgOLg4EBZWerUKuHHQUFB122fnJwsOhLfddddmnXcR0fsnKOj6IQcFRWl8xpnZ2exgHW5kMNz1FygzX9d0sxRw23UM0ZE0W3dg8RMsgAA1jyXUY923mKZeUtHMWv6gaRcEXR44WZ36T79RNTOx1UddDq1pcHR/qJJCyy8QzEP++bh31JYCQ8Pp5kzZ17XobiiooKSkpJ01r322muiovPee+9Rp06dSKFoetp0dCi2/Os+zd18gv779xXNHDUDInmOmijxjxqzmQKA3PFH7fnsEvq9LtwcupAv+u1IHO3tqG97H01fna7BXjbxt7HIWjoUM24ymjx5MvXr10+EHB4KXlpaSlOnThXPT5o0iUJDQ0XfGRcXF+revbvO69u0aSNu668H6/wH/cqWE/Tj8Svi8aguATRjZBT1be9r7l0DAGg1HFSkzsuPD+sgBlJwwJEqOdxn51BKvliWbU0U/Q9v7qhuvhoW7U8+7i2/NpotMkm4GT9+POXk5NC8efPEJH69evWirVu3ajoZp6WliRFUIH88CuqHY1dEG/V/Hh2g0z4NAGCr3BSONLJLgFjYxbxSTVXnQHIe5RRX0ndHL4mFCzgx7dpo+urwfVz81AzNUq0NzVKW6dSVQrrngwNiSOWc27rQtOG6facAAOB6PKtzQupVTVXnbGbxdZeTuL1HEI3tFUp9w31EXx9rVWSiZimEGzAJvlbNXav2UWpeGd3SJYA+ntTPqv8BAgCYS2Zhhaaqs/d8Tt0V4dVC27jSXTEhdHdMCN0U7Gl1/XSKEG5a/+BAy3AxcOZXf9HPf2dQiLcL/fzMMLQXAwAYQU2tUjRbcXP/tlOZ4uruko4BHjS2FwedUAr3s44Z3RFuzHBwoGX+72Aqvf7DKdH7/+tpg3CBSwAAE10+YtfZbBF0dp7N1hl91Tu8jajm3NEzmAI8XSz2+CPcmOHggOFOXCqk+9YcEP/IXrvjJjEqAAAATIvn1OFKzo/HrtCB5FzNdbG4NwAP5OCgE9c9iLwsbOZ3hBszHBww/B/Xnav2Unp+OY3pGkgfPtLX6tp/AQCsXXZxhegWwBWdY+kFOpeU4Ok4OOjwKC2+tpa5IdyY4eCAYf1spn2eQNtOZYlZN3+eNYy83SzrGwIAgK25mFcqqjk/HL9CSdklmvWezo6iksN9dAZ18DPbDPEIN2Y4OKC/9ftSaOFPp8nJwY6+nTaYYsLUEzECAIBlfAE9k1FMPxy/TP89doWuFFZonvP3UNCdPUPo7l4h1DusTatW3BFuzHBwQD9c9nxg7QFxvagFd3WlKUMicegAACyUUqmiPy9epR+OXaZfTmTQ1bJqzXNhvq40NiZUBB2eTdnUEG7McHCgeQVlVXTH+/vockG5mFQq/p990M8GAMBKVNcqad/5XBF0tp/OorKqWs1zfcLb0MeT+4tJA03Fqq4tBbZT5nzhm+Mi2LT3c6Ml9/VEsAEAsCJODvaay0Dw9a5+O5NNPx67LCYMPJpWQO/vOE8L7u5G1gYXeIIWW7f3gviHwD3wuWJjaUMMAQDAsOtd8UgqrtZ8OmWAWPfFoYt06WoZWRuEG2iRhIv5tHRrorg/786u1D3UG0cSAEAmhnb0p8FRfqIv5Xu/nSdrg3ADBssvraKZX/5FtUqVuKbJw7HhOIoAADLzQlxncctXJtceRm4NEG7A4F72s78+RhmFFdTB350W39sD/WwAAGSoT7gPjb4pUMx2/O6v58iaINyAQdb+nky7E3PImfvZPNyHPJzRJx0AQK5eiOtEPO3Nzycy6OTlQrIWCDegt8Mp+fT2dnV6f+PubnRTMIbdAwDIWZcgLxobEyLur9iu7mdpDRBuQC+5JZU066ujop/NPb1DaXz/MBw5AAAb8OzoTuRobyeq9vwl1xog3ECzONA8t+kYZRVVUlRbd3pzXHf0swEAsBER/u70YN0X2uXbzoo5ziwdwg00K35XEu09n0suTva0ZmJfckc/GwAAm/LMLR3FnGZHUq+KCf4sHcINNOlAci6t/E3dz+bNcT1a5VojAABgWYK8XWjyoPbi/vJtiWLkrCVDuIFGZRdX0DNfHRPDAB/o247u79sORwsAwEZNHxFN7goHOnWliP53MpMsGcINNNrP5l9fHRMdiTsHetLCsd1xpAAAbJivu4IeH9ZB3H/710SqqVWSpUK4gQa9t+M8HbyQR24KBzGfjavCAUcKAMDGPT4sktq4OdGFnFLa/NdlslQIN3CdvedzaNVO9bVE/n1PD4oO8MBRAgAA8nRxohkjosSR4GtOVdbUWuRRQbgBHVlFFfTsxmPEI/0mDAijcb1DcYQAAEBj0qAICvRypssF5fTVoTSyRAg3oMHtp7O+/IvySqvE7MPz7+qGowMAADpcnBxo1i0dxf3Vu5KorKqGLA3CDWi88+s5OpyaL64X9cHDfcT/wAAAAPXxLPXhvm6UW1JFn+5PJUuDcAPCrsRs+mB3sri/5L4eFOnvjiMDAAANcnKwp9n/6CTuf7gnmQrLqsmSINwAXSkop9mbjokj8cjA9nRnT/VF0gAAABpzV0yImCqkqKKGPtqr/nJsKRBubFw197P56i+6WlZN3UO96LU7bzL3LgEAgBVwsLej58eoqzfr96VSTnElWQqEGxu3YlsiJVy8Sp7OjhT/zz7k7Ih+NgAAoJ9/dA2kmLA2VF5dK65DKPtwEx8fTxEREeTi4kKxsbF0+PDhRrddt24dDRs2jHx8fMQyevToJrcH49idmE0f/n5B3F92f09q74d+NgAAoD87Ozt6Ka6zuP/loTS6dLWMZBtuNm3aRLNnz6b58+fT0aNHKSYmhuLi4ig7O7vB7Xfv3k0TJkygXbt20cGDByksLIzGjBlDly9b7uyH1q6wvJrmfHdC3OeLod3WI9jcuwQAAFZoSLQ/DY7yo6paJb2/Qz0BrLnZqVQ8XZtxcaWmf//+tHr1avFYqVSKwDJr1iyaM2dOs6+vra0VFRx+/aRJk657vrKyUiySoqIi8f6FhYXk5eVl5N9Gnl785jh9k3BJjIr65ZlhuLwCAAC02NG0q3TvBwfI3o5o+3PD9Z7Znj+/vb29jf75bfTKTVVVFSUkJIimJc0PsbcXj7kqo4+ysjKqrq4mX1/fBp9fvHixOBjSwsEGDBv2zcHGzk7dHIXrRgEAwI3oE+5Do28KJKWK6N1fz5G5GT3c5ObmispLYGCgznp+nJmp3yXSX375ZQoJCdEJSNrmzp0rUp60pKenG2XfbaU5am5dc9TUwZHUP6LhAAkAAGAIHjnFX5p/PpFBJy8XkjlZ3GipJUuW0MaNG2nLli2iM3JDnJ2dRflKewH9vPnTacosqhDNUS/WdQIDAAC4UXzZnrtj1POkrdieSLIKN/7+/uTg4EBZWVk66/lxUFBQk69dsWKFCDfbt2+nnj17GnvXbN6us2iOAgAA03ludCcx/83uxBw6nJJPsgk3CoWC+vbtSzt27NCs4w7F/HjQoEGNvm7ZsmW0aNEi2rp1K/Xr18/Yu2XzRHPUZjRHAQCA6UT4u9OD/dT9YJdvO0smGLNkvmYpHgbOc9ds2LCBzpw5Q9OnT6fS0lKaOnWqeJ5HQHG/GcnSpUvp9ddfp/Xr14u5cbhvDi8lJSWm2D2bhOYoAABoDf8a1ZEUjvZ0JPUq7TmXQ7IJN+PHjxdNTPPmzaNevXrRsWPHREVG6mSclpZGGRkZmu3XrFkjRlndf//9FBwcrFn4PcC4zVHLMToKAABMKMjbRcyfxpZvSyQlD6GSwzw3rc1U4+Tl0hw15t09lFVUSY8NjaTX7+xq7l0CAACZyy+tomFLd1JpVS198HAfur2RiWKtZp4bsLzmKA42PDrqhTEYHQUAAKbn666gx4d1EPff3p5INbVKak0INzKG5igAADCXx4dFUhs3J0rOKaUtf7Xu5ZQQbuR87ajNf4v7jw6JpH6YrA8AAFqRp4sTzRgRJe6v/O08VdbUttrPRriRqUVojgIAADObNCiCAr2c6XJBOW083HpXE0C4kWlz1LcYHQUAAGbm4uRAs27pKO6v2plEZVU1rfJzHVvlp0CrQXMUmAJPxMnTNdgqJycnMfM6ABiOJ/X76PcLlJZfRp/uT6WnR0aTqSHcyAyao8DYONSkpKSIgGPL2rRpIy4hY8cTRgGA3nhCv+f+0ZGe23ScPtyTTBNj25O3mxOZEsKNjOw8m4XmKDAqngaLJ9zkqkVYWBjZ29vb5DEoKyuj7Oxs8ZgnGAUAw9wdE0prdifTuawS+mhvMr0Y14VMCeFGhteOwugoMJaamhrxwR4SEkJubm42e2BdXV3FLQecgIAANFEBGIgvpvn8mM701P8l0Pp9qTRlcCS19XQmU7G9r2EyheYoMIXa2lrNBXFtnRTuqqurzb0rAFZpTNdAiglrQ+XVtRS/K8mkPwvhRgbQHAWmhn4mOAYAxvg78lKceqb8Lw+l0aWrZWQqCDdWrrAMzVEAAGAdhkT70+AoP6qqVdL7O86b7Ocg3Fi5RT/j2lEAAGA9Xqir3vB8bBdyS0zyMxBurBiaowAAwNr0Cfeh0TcFklJFFL/TNH1vEG6sFJqjAPSTkJBADz30kBjx5eLiQtHR0TRx4kQ6deoUDiGAmTw/phPxlFHbTmWZ5P0RbqzUQlw7CqBZ69ato9jYWPL29qbNmzdTYmIiffjhh1RcXExffvkljiCAmdwU7EV3x4SY7P0xz42VNkd9d/SSSL3L7+9JrgpMCw9Q3759+2jatGm0evVqmj59umZ9+/btadSoUZSfn4+DBmBGz43uRD8eSTbJeyPcWHFz1GNDIqlfhK+5dwlsbLZenqPCHFydHAwakj579mwaPny4TrDR5uuLfzsA5hTh70739A6ld03w3gg3VtwcxbM9ArQmDjZd520zy0E/vTCO3BT6/ck6c+YMHTlyhL799tsmt3vnnXfo7bffJn9/fzETc3x8PI0ZM8ZIewwAzXl6RJRJwg363FgRNEcB6Ofo0aPitm/fvk1ud/LkSRFujh8/TsuXL6cFCxbgEAO0orZeLiZ5X1RurASao8AScNMQV1DM9bP1xVUY5uHh0Wy4eeaZZ8T90NBQzeUmAMC6IdxYCTRHgSXgPi/6Ng2ZU/fu3cXt3r176Z577rnu+fLycjEs/OzZs9S5c2cRatasWUO33367GfYWAIzN8v9KAZqjAAw0aNAg0XdmxowZVFJSIh4rlUrRD4dDzEcffSTCTWVlpXiOLww6evRomjNnDo41gAwg3FhBc9Sc7zA6CsBQP/zwA7377ru0bNkyunDhgmYCv7vuuou6dOlCP/30k7jfXKdjALA+CDdW0ByVXVxJHfzdNdfjAIDmcZiZO3euWBrrb9OjRw8cSgAZwmgpKxkdtez+nuRiQIdKAGgawg2AfKFyY6HQHAVgWrj8AoB8oXJjodAcBQAA0DKo3FgIpVJFiVnFdCA5j/Yn5dLOs9lojgIAAGgBhBszXqPnYl6ZOswk59IfyXmUV1qls83TI6Jx7SgAAABLCTd8jRaezjwzM5NiYmJo1apVNGDAgEa3/+abb+j111+n1NRU6tixIy1dulR2E2plFVXQgeRc2p+URweT8+hyQfl1M7D2j/SlIVF+NCTan7qHepttXwEAAKyVScLNpk2bxBV5165dS7GxsbRy5UqKi4ujxMRECggIuG77AwcO0IQJE2jx4sV05513io5+48aNE9eHkWYatUYFZVUixHB1hkNNck6pzvNODnbUO8yHBkf70eAof+oV1oYUjugGBZZZabR1OAYA1sNOZYJ/sRxo+vfvT6tXrxaPeWbQsLAwmjVrVoMzgI4fP55KS0vFpFqSgQMHUq9evURAak5RURF5e3vTuh0nKTzQj/w9namthzP5eziTq6L1hk+XVtbQ4dR8EWi438zpjCLSPro8pLt7iLcmzPSP8LGKqezBdlVXV1NSUhKFhISIf2O2LC8vj7Kzs6lTp07k4IBpGQCMQfr8LiwsJC8vLzIWo3+yVlVVUUJCgs7EWfb29mJq84MHDzb4Gl7PlR5tXOn5/vvvG9yep0znRfvgsIX/PU32zm4627orHETY4aDj76Gou9W6r/Wch7OjuHaOvipraumvtAJ1ZSYpl46lF1CNUjcrdgzwoMFRfjQ42p8GRvqRt5uT3u8PYG6Ojo7k5uZGOTk55OTkJP4t2xr+/scX4uRg06ZNGwQbACtg9HCTm5srLkIXGBios54f80XqGsL9chrantc3hJuv3njjjevWD+/kT0W1TpRbUkU5JZVUVaOk0qpaKs0rE513m+PsaK8JPG21gpCf1n1uSjqSelU0Mx1JzaeKaqXOe4S2caUh0eo+M4M6+FGAiS7nDtAaOOwHBwdTSkoKXbx40aYPOgeboKAgc+8GAOjBKttEuCqkXenhyg03e8U/3FdT1uJvW8WVNZRbXCnCTm4J31aqH5dW1a2/9lxZVS1V1ihFJ9/6HX2bwhWfQVH+ohMwNzWF++lWjgCsHV9Ukjv5c1XWVnHVCk1RADYcbvz9/cUfgaysLJ31/Lixbz283pDtnZ2dxdLcN04vFyexdGjb/H6XVXEQUld8rgUhdfDJK712v7SqhnqEthHVGQ4znQI9DGrKArBG3BzF12oCALDJcMPf8vr27Us7duwQI56kDsX8eObMmQ2+ZtCgQeL5Z599VrPu119/FetbC3fsDffjBZUXAAAAa2aSZiluMpo8eTL169dPzG3DQ8F5NNTUqVPF85MmTaLQ0FDRd4b961//ouHDh9Pbb79Nd9xxB23cuJH+/PNP+uijj0yxewAAACBjJgk3PLSbR1fMmzdPdArmId1bt27VdBpOS0vTGXUxePBgMbfNa6+9Rq+88opo3+eRUtY8xw0AAADIaJ6b1sbj43kkQ3p6ulHHyQMAAIDpSAOCCgoKjDqXllWOlmpoci3GBwgAAACs73Mc4aYeX19fTXOXrc+iaklJHJU088O5sBw4F5YD58KyWl7Cw8M1n+PGIovKjdR/h4MNmqUsB58LnA/LgHNhOXAuLAfOheUw9uzntjeXOgAAAMgawg0AAADIiizCDc9WPH/+/GZnLYbWgfNhOXAuLAfOheXAuZD/uZDFUHAAAAAAWVVuAAAAACQINwAAACArCDcAAAAgKwg3AAAAICsINwAAACArCDcAAAAgKwg3AAAAICsINwAAACArCDcAAAAgKwg3AAAAICsINwAAACArCDcAAAAgKwg3AAAAICsINwAAACArjiQDSqWSrly5Qp6enmRnZ2fu3QEAAAA9qFQqKi4uppCQELK3N169RRbhhoNNWFiYuXcDAAAAWiA9PZ3atWtHxiKLcMMVG+ngeHl5mXt3AAAAQA9FRUWiOCF9jps13MTHx9Py5cspMzOTYmJiaNWqVTRgwIAGtx0xYgTt2bPnuvW33347/fzzz+L+lClTaMOGDTrPx8XF0datW/XaH6kpioMNwg0AAIB1MXaXEoPDzaZNm2j27Nm0du1aio2NpZUrV4ogkpiYSAEBAddtv3nzZqqqqtI8zsvLE4HogQce0Nnu1ltvpU8//VTz2NnZ2fDfBmTbJltVq6TSyloqrayh0qoazf2yqhoq0VpfVllLCkd78nFXkI+bE/m6Keru860TOTs6mPvXAQAAEzM43Lzzzjv0xBNP0NSpU8VjDjlcgVm/fj3NmTPnuu19fX11Hm/cuJHc3NyuCzccZoKCggz/DcAqpOaW0oXcEq2Aoh1UahoJLrVUIp6roRqlyij74a5woDZuCvLlwFMXgHykx3xfCkJ169q4OZGLEwIRAIBsww1XYBISEmju3Lmaddy7efTo0XTw4EG93uOTTz6hhx56iNzd3XXW7969W1R+fHx86JZbbqE333yT/Pz8GnyPyspKsWi32YHl+i7hEr3w7XFSGSGfODvak4ezI7k7O5KbwkHcd3N2JA9nB3JTOIrwwlWe/NIqulpaTVfLquqWaqpVqtShqqqcLheU6/0z+edIlZ9rQUh96+/hTP4eCvLzcKa2fN9TIfYDAADMx6C/wrm5uVRbW0uBgYE66/nx2bNnm3394cOH6eTJkyLg1G+SuvfeeykyMpKSk5PplVdeodtuu00EJgeH6781L168mN544w1Ddh3MZN/5XHr5u79FsOkU6CECgTuHEBFQHHTv8630WOGgs14KLo4OLRsqqFSqqLiyhq5y6KkLPPml1VQgbtXhh5/LL6uqW6cORhyIuIJUZkAg4jDEocfPQwo/HHzUAUgKQ/6e6vteLo6YvgAAwMha9Ssmh5oePXpc1/mYKzkSfr5nz54UFRUlqjmjRo267n24csT9fur3tgbLciajiKZ9niCalO6OCaGV43uRvb155iHin+vt6iSWCNKtGjY5/0JdIOIAVFBWXReE1I95yS2ppNwS6baSKqqVIgyl5ZeJpTkKB3utEKQbgNrWBSC+DfJ2IU9nBCEAAKOHG39/f1FJycrK0lnPj5vrL1NaWir62yxcuLDZn9OhQwfxs5KSkhoMN9w/Bx2OLVtGYTlN/fSI6DMTG+lLyx/oabZgcyO9971cnMTS3s9drzDEzV65xZXXhR6xFFdRXmnd+uJKEZy4CS2jsEIszeHKFYecYG/XuluXa7deruKW+whhIksAsHUGhRuFQkF9+/alHTt20Lhx4zSzA/PjmTNnNvnab775RvSTmThxYrM/59KlS2JUVXBwsCG7BxaiqKJaBJvMogrqGOBBHz3SzyZGKXGo4D5AvET4Nx+GKqprRejJ0wlBVZRTXEl5XBWqC0nZxZVUWF4tglNyTqlYmuqTdC30aIUgr2uP/dwVVhc0AQBM2izFzUGTJ0+mfv36ieYlHgrOVRlp9NSkSZMoNDRU9Iup3yTFgah+J+GSkhLRf+a+++4T1R/uc/PSSy9RdHS0GGIO1qW6VkkzPj9KZzOLRXPKp1P7k7ebk7l3yyLxKKx2Pm5iaQ4Pec8srBALV3k4OHJ1TPO4sEIEosoaJaXmlYmlMU4OdhTgWa/yw8HHi2+dKdDLRTzPQ+oBAGwi3IwfP55ycnJo3rx5YhK/Xr16icn2pE7GaWlp110fgufA2bdvH23fvv269+Nmrr///ltM4ldQUCCuLzFmzBhatGgRmp6sDDfLzPnuBO1LyhWdaj+d0l+vD25oHneo7tDWQyxNVYKyiyrVoUeEHykMXQtBOSWVVF2rEp2jm+sgzRUeDjqBXuo+P+r76iqQtJ47iKMZDAAsjZ2KP5GsHHco9vb2psLCQsxQbEbv/nqO3ttxnhzs7ejjyf1oZOfrJ3UE81fWuJkrUwSeymvBp0gdhHjJLq4QAUgf3CE6wMtZE3r4vroCpK7+8C0/dlXIv1kSACzn8xsTcoBRfH0kXQQb9ua47gg2FsrJwZ5C27iKpalh8zwijKs/XAni26y6hcNPVlGluM/NYNwh+tLVcrE0xdPFUVPx4QDEo8C46qOeK4hvnUWliB9z1Q/VIAC4EQg3cMP2nMuhuVtOiPszR0bThAHhOKpWjDsb85B0XrqFNL5dVQ1XgaTgw9WgCsrix3V9gqRgxEPjiytqqLiihM5nlzT7812c7MnPXR1+eJi8uBXBRz13kBSC/OoeIwwBQH0IN3BDTl0ppBmfJ4jJ7u7pHUrPj+mEI2ojuMNxcx2ipbmCskXVR13x4QCUX6KeJ4irP+KWR43VdYjmuYL06ROkPUKMAw+HsWtBSEG+Hgpq46q+hIY0x5F0n0e0oToEIF8IN9Bi/OHDQ755iPKgDn609L6e+MCARucKig7wbPLocBDiKo80OWJD4UeaPJGHz/OcQRyEOBBdKawQi764X5gIOxx66gKPuC8ecyjSDUN86yW2UWAUGYAVQLiBFuF5V6Z+elh0TuXLKqx9pC/+6MMNByH1JTccKcxXv1F2PESeg446CKnnDNIEoNIq8f9pYVk1FZSr7/NlNrg5jSuN0naG4mYwqRIkBR8OPZqQJD3WCkf8HGaYBmg9CDdgMP5wmPZ/CXQuq0QMB/5s6gDxBxzAHEPk3Xz1D0PSkHkOOnw5DfVtFRWUV1NR3Tp1EKoR68W6uvU8OSWPLVVfa6xWr1mlG6oW6YaihqtF15rS1CEJcw4BGAbhBgzCTQd8IcyDF/LE5QDWT+lPIU2MvAGwxMkTeeGRWwZffLWiRlMF0g5HokKkCUfV11WMuPnsRqpF/G+NQ45X3SLuc3Ofq6PmvvS8+tZRsw4drsEWIdyAQd7efo62/HVZfAv9YGJf6hbijSMINkFcfJUrKi2YcduQapH2dlK1iPu18WJIvyKJo72dOhS5ONYLRroh6NpzjiL88bQBPI+Rk6OduM8Ld97mW/73D2DJEG5Ab18dTqPVu5LE/cX39KDhndri6AGYsFrE1Z7iimtVIQ47IvSU12jCj/ox31evK5YqR+XVVKNUiaWlFaPGcLa5Fn448Nhde8y32uvqAlH9bTg0Odrbk50dkYOdnQhM3O/KwZ7f306ziMf2dffteBt1E5943l69jvdHs43W69XbkWjeC/dzE3MtIZjZBoQb0MuuxGx67fuT4v4zozrSg/3DcOQATIw/iNtwfxw3BbXXvSyfXk3I5dW1Ighph6D6YUizTmxTIx7zCDSezfraojtjtVJFYhteqJKsBgcs9fQFrhTu66ZZwuoW9B2UD4QbaNbJy4X09BdHxbfI+/q0o+dGd8RRA7BwXAURHa4VjuIyGDeCgxIHHCns8MzU4nGN+j4PMpBCkOb5mnqP69ZJr5VGrSlVKqpVqUTzm/SY+zfxOg5RSmkbpXo/eD1vp7N93bbaj9X31et4KgGeuoJ/bkpuqVgawuFGN/BcC0Hct5ArTmAdEG6gSZeultHUz46I0SFDo/1p8b09MJcNgA0GJYUjL9b74c4hh2fMTssro/T8MkrLL6P0q3W3+WWUW6Lu73TicqFY6uPmLQ44YT51FR+/ugBUVwXCRWQtCy6cCY3i0R73rT1ASdkl1CXIk76eNkh0PgQAkJvSyhpxjTQOO1Lg0b4VTXDNjGjrEuxFIzq1pZFdAqhbiBe+CJrxwpkIN9CgyppamvTJYTqUki864W15ejAFe2PINwDYHm4OyymuvFbtySvXCT5cEaovwNNZXECYg87Qjv7ikh9wPYQbMxwcW8Vt3M9uOkY/Hr8i/kF+M20Q3RSM4woA0NhQf676HEnNp51ns2l/Uq5oytfuyDwg0lcTdjr4u6OqUwfhpgkIN8a1dOtZWrM7WcyP8enU/jSsI4Z8AwAYUvk+nJJPu87miJGm9Tswcx+dW7oE0IjObWlgBz8xTYCtKkKzVOsfHFv0+R8XNUO+VzwQQ/f3bWfuXQIAsGocbnadzRZB59CFfDFiTOLq5EBDov1oRF1VJ9TGZnwvQrhp/YNja3acyaIn/vOnGD753OhO9C8M+QYAMHrHZW622pWYIwJP/f46nQM9RcgZ2bkt9W3vQ44yH35ehHDT+gfHlhxPL6CHPvpDTPr1YL92tPS+nmgTBgAwcUfls5nFop/O7sRsSrh4VXy5lPClMIZ1aku3dFY3Yfl5OMvufBQh3LT+wbEV3OP/ng/2i3kehnX0FxfDxGRVAACti68ttudcDu1O5CWbrpZVa57jy070bNdGBJ1RN8lnqHkRwk3rHxxbwP+Y7l1zgC7klIoRUV8/NZA8MZcNAIDZJx08fqlA01fn5OUinec7BXqIPpHjeoVSgIHXLLMkCDdmODi20KN/4seH6EjqVQr2dqEtM4bc8DTtAABgfFlFFaKao27CytFMKsgzJ9/cqa0IOqNvCrS6kVdFqNy0/sGRu7V7kmnJ/86Sp7MjfTt9MHUO8jT3LgEAQDP4MhE//51B3x29JPrpaPfRuTMmRASd3mFtrKLZCuHGDAdH7pNODVu2S8y6uey+nrjKNwCAFbqQU0Kbj16mzUcv0ZXCayOvOvi7031929E9vUPFNbEsFcKNGQ6OLcxnE+LtQrtfHGnVF8QDALB1PLP8wQt59F3CJfrfyUwx8pVx8WZIlD/d1zeUbu0WTK4KB5v4/G7RJ1p8fDxFRESQi4sLxcbG0uHDhxvd9rPPPhOlMe2FX1d/ONy8efMoODiYXF1dafTo0XT+/PmW7BrooaZWSR/+nizuP3FzBwQbAAArZ29vR0Oi/emd8b3oyGujadn9PSk20pdUKqJ9Sbn03Kbj1P+t3+ilb4/ToQt54nNXzgwON5s2baLZs2fT/Pnz6ejRoxQTE0NxcXGUnZ3d6Gs4jWVkZGiWixcv6jy/bNkyev/992nt2rV06NAhcnd3F+9ZUXH9xcjgxv18IoPS88vJ111BD/UPxyEFAJARD2dHerBfGG16ahDtfWmkmJSVL/lQUllDX/95icZ/9AcNX76bVv52TkwFIkcGXxWcKzX9+/en1atXi8dKpZLCwsJo1qxZNGfOnAYrN88++ywVFBQ0+H7840NCQuj555+nF154Qazj8lRgYKB47UMPPdTsPqFZSn98vG97b6+YOOr5f3SiWaM6GvBqAACw1r/9R1Kv0rcJ6fTLiUwRdCRc4eH+Obf3CG71q5dbRLNUVVUVJSQkiGYjzRvY24vHBw8ebPR1JSUl1L59exGCxo4dS6dOndI8l5KSQpmZmTrvyb8oh6jG3rOyslIcEO0F9MPDCDnYuCscaNKgCBw2AAAbYGenvjL5svtj6Miro2nl+F40NNpf9Mk5lJJPL337N/V/8zeavemYuDwE9+GxZgaFm9zcXKqtrRVVFW38mANKQzp37kzr16+nH374gT7//HNR6Rk8eDBdunRJPC+9zpD3XLx4sQhA0sKhCfRL7h/sVve1mTiwPXm7OeGwAQDYGFeFA43rHUqfPx5L+1++hV6M6yxGV3En5M1/XaaHPz5EQ5fupPhdSVYbckw+RGbQoEE0adIk6tWrFw0fPpw2b95Mbdu2pQ8//LDF7zl37lxRwpKW9PR0o+6zXB1OyRdzIvDIqMeGRpp7dwAAwMxC2rjS0yOjacfzw2nzjMH0cGw4ebo4imHly7cl0ldH0kj24cbf358cHBwoKytLZz0/DgoK0us9nJycqHfv3pSUlCQeS68z5D2dnZ1F25z2As2TqjY8wZM1T9cNAADGb7bqE+5Db93TQzRbPT0ySqz/YFcyVdXNhizbcKNQKKhv3760Y8cOzTpuZuLHXKHRBzdrnThxQgz7ZpGRkSLEaL8n96HhUVP6vic07+TlQnFBNp6q+6mbO+CQAQBAg/gSDrNu6UhtPZ3pckG5mAlZ9s1SPAx83bp1tGHDBjpz5gxNnz6dSktLaerUqeJ5boLiZiPJwoULafv27XThwgUxdHzixIliKPjjjz+uSYs8murNN9+kH3/8UQQffg8eQTVu3Dhj/q42bc0eddXmzp4h1N7P3dy7AwAAFh5wpg9XV29W70yyuuqNwWO+xo8fTzk5OWLSPe7wy31ptm7dqukQnJaWJkZQSa5evUpPPPGE2NbHx0dUfg4cOEBdu3bVbPPSSy+JgPTkk0+KIeNDhw4V71l/sj9omZTcUvrfiQxxf/oI9f+sAAAATflnbLj4YixVbyYMCJfvPDeWCPPcNG3Od3/TxiPpdEuXAFo/pX8rnRUAALB2n+xLoUU/naZ2Pq608/kRRp/R3iLmuQHrk1lYoWkvnYGqDQAAGIBHT3Hfm0tXy8XFOa0Fwo3Mfbz3AlXXqmhAhC/1i/A19+4AAICV9b15qm4QyupdSVRdax19bxBuZOxqaRV9eVg9R8H0umF9AAAAhng4tj35e1hX9QbhRsY2HEylsqpa6hrsRSM6tTX37gAAgJXOaDxtuLp6s2qndVRvEG5kqrSyhj47kKoZIcVD7gEAAG60erPl6GWydAg3MvXV4TQqKKumCD83caVXAAAAo1Rvdp23+OoNwo0MVdbU0sd7U8T9p4ZHkQNPSwwAAHDD1RsFpedbfvUG4UaGvv/rMmUWVVCglzPd2yfU3LsDAAAyqd48dXOUVYycQriRmVqlitbuuSDuPz60Azk7Oph7lwAAQCYeHhguqjdp+WW05S/Lrd4g3MjM1pOZ4nIL3q5ONCHWeqbKBgAAy+emcKQnpXlvLHjkFMKNjPCVND7YnSTuTx4cQR7OBl86DAAAoEkTB7YnP3d19Ya7QVgihBsZ+f18Lp26UkSuTg40dXCEuXcHAABkWr15qm7kFPe9qbHA6g3CjYx8sEtdteErt/q4K8y9OwAAIPPqzcU8y+x7g3AjEwkXr9KhlHxycrCjJ26ONPfuAACArfS92WV51RuEG5lYU9fX5p7eoRTs7Wru3QEAAJl7ZFB78q2r3nx/7ApZEoQbGUjMLKbfzmQTX2GBJ+0DAABo3ZFT5y2qeoNwI6OqzW3dgyiqrYe5dwcAAGzEIwPV1ZvUvDL6wYKqNwg3Vi49v4z++3eGuD9jRLS5dwcAAGyIu7MjPTFMumK45VRvEG6s3Ie/J4tZiYd19Kfuod7m3h0AALAxkwa1Jx83J1G9+fG4ZVRvEG6sWHZxBX395yVxH1UbAAAwV/XmybprTq3aaRkjpxBurNj6falUVaOk3uFtaGAHX3PvDgAA2Hj1JiW31CKqNwg3VqqwvJo+/+Oipmpjx0OlAAAAzNX3RuuaU+au3iDcWCkONiWVNdQp0INGdQkw9+4AAICNmzQoQlRvLuSW0n//Nm/1BuHGCpVX1dL6fSni/vQRUWRvj6oNAACYl4ezIz0ujZzakSQGu5gLLhtthb7+M53ySquonY8r3dUzxNy7AzagtraWqquryZYpFAqyt8f3QYCmTB4cQev2XlBXb45foXG9Q8kcEG6sTHWtkj76/YK4/9TNHcjRAX9swXRUKhVlZmZSQUGBzR9mDjaRkZEi5ABA49Ubnvdm+bZEen/neborJoQczNC60KJwEx8fT8uXLxd/9GJiYmjVqlU0YMCABrddt24d/ec//6GTJ0+Kx3379qV///vfOttPmTKFNmzYoPO6uLg42rp1a0t2T9Z+PHaFLheUk7+Hgh7oF2bu3QGZk4JNQEAAubm52WzHdaVSSVeuXKGMjAwKDw+32eMAoO/IKVG9ySmln/6+QmN7hVp+uNm0aRPNnj2b1q5dS7GxsbRy5UoRRBITE8UfwPp2795NEyZMoMGDB5OLiwstXbqUxowZQ6dOnaLQ0Gu/8K233kqffvqp5rGzs/ON/F6ypFSqaM2eZHH/0aGR5OLkYO5dApk3RUnBxs/Pz9y7Y3Zt27YVAaempoacnJzMvTsAFsvTxUlTvXlvx3m6s2frV28MbtN455136IknnqCpU6dS165dRcjhb3Tr169vcPsvvviCZsyYQb169aIuXbrQxx9/LL4F7dixQ2c7DjNBQUGaxcfHp9F9qKyspKKiIp3FFvx6JouSskvI09mRJg5sb+7dAZmT+tjwv29Q97mRQh8ANF+98XZ10lRvWptB4aaqqooSEhJo9OjR197A3l48PnjwoF7vUVZWJv5o+vr6Xlfh4W+InTt3punTp1NeXl6j77F48WLy9vbWLGFhYTbR9+GD3cmay8x7ueCbI7QONMHgOAC0rHoTKe6/v+N8q4+cMijc5Obmim8tgYGBOuv5MbfN6+Pll1+mkJAQnYDETVLcL4erOdxstWfPHrrtttsa/YY0d+5cKiws1Czp6ekkdweT8+h4egE5O9qLJikAAABLHznl7epEyWao3rTqaKklS5bQxo0bRZWG+99IHnroIc39Hj16UM+ePSkqKkpsN2rUqOveh5uwbK1PjlS1Gd8/jPw9bOt3BwAA66zePD40kt7+9Zyo3rRm3xuDKjf+/v7k4OBAWVlZOuv5MfeTacqKFStEuNm+fbsIL03p0KGD+FlJSUmG7J5s/X2pgPYl5Yr/KaRLywMAAFi6yUOuVW9+PpHRaj/X3tAOdTyUW7szsNQ5eNCgQY2+btmyZbRo0SIxtLtfv37N/pxLly6JPjfBwcGG7J5sfbBLXbUZGxNCYb7o3AlgCO4nyNVhbg7ninF0dDRNnDhRjNgEANPi/qGPDW39vjcGj5biYeA8dw3PS3PmzBnR+be0tFSMnmKTJk0SfWIk3Ifm9ddfF6OpIiIiRN8cXkpKSsTzfPviiy/SH3/8QampqSIojR07VvwB4iHmto5HR207re7PNG2E+pLyAKAf/lvFU1bwwIPNmzeLKSs+/PBDKi4upi+//BKHEaAVTBkSQV4ujuLzrLWqNwb3uRk/fjzl5OTQvHnzREjhId5ckZE6GaelpelMUb5mzRoxyur+++/XeZ/58+fTggULRDPX33//LcISz6nB3654Hhyu9Nhav5qGrN2TTCoV0T+6BlKnQE9z7w6A1di3bx9NmzaNVq9eLb6ESdq3by/68uXn55t1/wBsqXrz+LAO9M6v52jVjvN0R49gk/e9sVPxGGMrx/Pc8DczHjnl5eVFcsEzEQ9ftotqlCraMmMw9Q5vfO4fAGOrqKiglJQUcckBaQAA/7korzbPPC+uTg4GDUvnWdA9PDxo586dJjseAKCfoopqGrpkJxVV1NCqCb3FZRlM+fktq2tLVVTXknyiDdG63y+IYDOogx+CDVgEDjZd520zy88+vTCO3BT6/cniJvMjR47Qt99+2+g2PAEpLzzlBDdX8aSkjCcpffrpp4223wBAdX1vOtC7v6lHTnH1xt6E1RtZXXVxXPx+2nlWdySXtcorqaSNR9LE/Rkj0dcGwBBHjx4VtzwAojHcZHXs2DExi3rv3r3FfV4QbABM1/fG08WRzmeX0C8nTdv3RlaVm0tXy+nRz/4U/VPm3dnVqkcWfXYglSqqldQj1JuGRvube3cANE1DXEEx18/WF8+EzrhZqjk8aqpbt243tG8A0DweEs4jp1b+dl5Ub27vbroR0bKq3EwdEkGO9nb06+ksGv3OHtFxiZuqrE1xRTVtOJAq7s8YEYXp78FicJ8Xbhoyx2JIf5vu3buL27179zb4fHl5ueb+yZMnEW4AWsnUIZGienMuq4T+d1K/KxuQrYeb58d0pv/9a5joo1JZoxSzIt668nfanZhN1qC6VknfJlyisfH7RaerDm3dKa5b05MjAsD1eN4tHnXJF+39v//7PzEh6Llz50QT1NChQ0XHYO3KjRSGAMC0uHrz6BD1vDfv7ThHShPNeyOrZinWMdCTvnwilv77dwa9+dNpSs0roymfHqG4boH0+p1dqZ2P5TVVcXXpmz/Tae2eC2KElPQ/wKKx3U3a4QpAzn744Qd69913xSSiFy5c0Ezgd9ddd1GXLl0026FyA9C6+PqI6/eniOoNt7SYgqyHgpdU1tB7v52j9ftTxayILk72NOuWjvT4sEhydtS//d5USitr6ItDF2nd3hTKKa4U6/w9FGI+gIkD25OHs+yyJ1gRWxj6zM1T7dq1EzOiN8cWjgdAa3n313P03o7zFOVtTztfuR1DwQ3B4eDVO7rS/X3DaN4PJ+lQSj4t35Yomn4W3N2NhndqS+ZQWFYtOgx/eiCFCsqqxboQbxd6aniUuDCmiwEdJwGg5XjIuHYVBwBaBzdNrd+XQuezi0zy/jZRGugc5EkbnxxIPx6/Qm/+fIZScktp8vrDdFv3IHrtzq4U2sa1VfaDqzOf7Euhz/+4KKpKLNLfnaYPj6JxvUNJ4SirLlAAFq9Pnz60f/9+c+8GgM3xdnOiqTxy6pfjJnl/mwg3jEdajO0VSrd0CRDD0Lhywj21dyfm0KxR0fT40A4mCxfcj+ajPcm08Ui66OjMugR50oyR0a0yDTUAAICleWxIJH2846RJ3ttmwo3E08VJdCx+oF87mvf9KTqcmk/Ltqqbqt64uxsN62i8piquEK3ZnURb/rpM1bXqrk29wtrQzJHRNOqmAAzxBgAAm67eTIxtT6+a4L1l3aG4Ofyrf3/sMr3181nKLVF36OVKymt33kTB3i1vqjqbWUTxu5Lp57+vkDTKjYenz7wlmgZH+SHUgFVAB1ocDwBTy8jJp5AAP3QoNnZT1T2929GomwJFz22eOI8vx74rMZueGdVRdHgypKnqWHoBrd6ZRL+duTa0jZvBnh4ZTX3b46KXAAAA2txNNCrY5pqlGrug1/y7utEDdaOq/rx4lZb876yYe2bh2O40pInLH3D1548L+RS/K4n2JeWKdTyRKk8rzdeE6hbi3Yq/CYDxKZXqfmK2TgZFbgCbYdPNUg3hw7H56GVa/L8zlFtSJdbd0TOYXr+jKwV5u+hsx52RV+9KooSLV8U67hg8rlcoTR8RRdEBzV/TBsDSQ8358+fJwcGB2rZtSwqFwmabVPnfe05OjrhmVceOHcUxAQDL+vzWhnDTiMLyatFU9Z+DqaLfjJvCgf41qiNNHhxBO89mi0rNqSvq8fncdPVgv3b01M1RVn2xToD6qqqqKCMjQ3MhSlvGwY4n/NPnYpwAoB+EGzMcHHbqSiHN++GUpjrDVyYur7sYJwcenkn48aGRFOCFGUtBvlWLmpoaqq21vovQGpOTkxMqNgBGhnBjhoMj4Qt7fXf0kuiHk1daRV4ujjRlSCRNHRxBPu4Ko/88AAAAW1Bkos9vdCjWA1+88oF+YTSmaxD9kZInhnPzfDkAAABgeRBuDJxwKK5bkOnOBgAAANwwXMwIAAAAZEUWlRtpNDu33QEAAIB1kD63jT0rjSzCTV5enrgNCwsz964AAABACz7HuWOxscgi3Pj6+orbtLQ0ox4caHkS56CZnp5uktFrgHNhjfDvwnLgXFgOHiUVHh6u+Rw3FlmEG3t7ddchDjb4MLUcfC5wPiwDzoXlwLmwHDgXlvc5brT3M+q7AQAAAJgZwg0AAADIiizCjbOzM82fP1/cgvnhfFgOnAvLgXNhOXAu5H8uZHHhTAAAAABZVW4AAAAAJAg3AAAAICsINwAAACArCDcAAAAgKwg3AAAAICsINwAAACArCDcAAAAgKwg3AAAAICsINwAAACArCDcAAAAgKwg3AAAAICsINwAAACArCDcAAAAgKwg3AAAAICuOJANKpZKuXLlCnp6eZGdnZ+7dAQAAAD2oVCoqLi6mkJAQsrc3Xr1FFuGGg01YWJi5dwMAAABaID09ndq1a0fGIotwwxUb6eB4eXmZe3cAAABAD0VFRaI4IX2OG4sswo3UFMXBBuEGAADAuhi7Swk6FAMAAICsINwAAACArCDcAAAAgKy0KNzEx8dTREQEubi4UGxsLB0+fLjRbdetW0fDhg0jHx8fsYwePfq67adMmSLa27SXW2+9tSW7BgAAADbO4HCzadMmmj17Ns2fP5+OHj1KMTExFBcXR9nZ2Q1uv3v3bpowYQLt2rWLDh48KHpFjxkzhi5fvqyzHYeZjIwMzfLVV1+1/LcCAAAAm2Wn4hl0DMCVmv79+9Pq1as1E+hxYJk1axbNmTOn2dfX1taKCg6/ftKkSZrKTUFBAX3//fctHkrm7e1NhYWFGC0FAABgJUz1+W1Q5aaqqooSEhJE05LmDeztxWOuyuijrKyMqqurydfX97oKT0BAAHXu3JmmT59OeXl5jb5HZWWlOCDaCwAAAIDIJoYchtzcXFF5CQwM1FnPjzMzM/V6j5dffllMs6wdkLhJ6j//+Q/t2LGDli5dSnv27KHbbrtN/KyGLF68WCQ9acHsxAAAAGCWSfyWLFlCGzduFFUa7owseeihhzT3e/ToQT179qSoqCix3ahRo657n7lz54p+P/VnOAQAAAAwqHLj7+9PDg4OlJWVpbOeHwcFBTX52hUrVohws337dhFemtKhQwfxs5KSkhp83tnZWTMbMWYlBgAAgBaHG4VCQX379hXNRxLuUMyPBw0a1Ojrli1bRosWLaKtW7dSv379mv05ly5dEn1ugoODDdk9AAAAAMOHgnNzEM9ds2HDBjpz5ozo/FtaWkpTp04Vz/MIKG42knAfmtdff53Wr18v5sbhvjm8lJSUiOf59sUXX6Q//viDUlNTRVAaO3YsRUdHiyHmAAAAACbtczN+/HjKycmhefPmiZDSq1cvUZGROhmnpaWJEVSSNWvWiFFW999/v8778Dw5CxYsEM1cf//9twhLPBycOxvzPDhc6eHmJwAAAACTznNjiTDPDQAAgPUpsoR5bgAAAAAsHcINAAAAyArCDQAAAMgKwg0AAADICsINAAAAyArCDQAAAMgKwg0AAADICsINAAAAyArCDQAAAMgKwg0AAADICsINAAAAyArCDQAAAMgKwg0AAADICsINAAAAyArCDQAAAMgKwg0AAADICsINAAAAyArCDQAAAMgKwg0AAADICsINAAAAyArCDQAAAMgKwg0AAADICsINAAAAyArCDQAAAMgKwg0AAADICsINAAAAyArCDQAAAMgKwg0AAADICsINAAAAyArCDQAAAMgKwg0AAADISovCTXx8PEVERJCLiwvFxsbS4cOHG9123bp1NGzYMPLx8RHL6NGjm9x+2rRpZGdnRytXrmzJrgEAAICNMzjcbNq0iWbPnk3z58+no0ePUkxMDMXFxVF2dnaD2+/evZsmTJhAu3btooMHD1JYWBiNGTOGLl++fN22W7ZsoT/++INCQkJa9tsAAACAzbNTqVQqQ44CV2r69+9Pq1evFo+VSqUILLNmzaI5c+Y0+/ra2lpRweHXT5o0SbOeww6/97Zt2+iOO+6gZ599ViwNqaysFIukqKhI7ENhYSF5eXnZ/EkFAACwBvz57e3tbfTPb4MqN1VVVZSQkCCaljRvYG8vHnNVRh9lZWVUXV1Nvr6+mnUckB555BF68cUXqVu3bs2+x+LFi8XBkBYONgAAAADM0ZDDkJubKyovgYGBOuv58dmzZ/V6j5df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", + "image/png": "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po9qbTJhZUmJDlvizuHPXQlYvCcRKVn5hudkROGr24ZjZLsI9GgazJGFyW6dOXMG6enpCA0Nhbe3t8NVn0qJjQSb5ORkBAYGIiIiwtq7RKQpmTVoVlIRhpvL9GiavewwPimbtkECy4ujWqNhPW/VKHjx7jNIzLwwq6lUX13dJlw1DL6iaTBcbXSAQKKqXtwTExNVwHFkEmxksk1HC3dEtY3hpo4Pjp4M9Dd1wU4cSLx02gY/T1cMaV0aaHo3C4G7KwMNaVNxcTEKCy+0H3MkUhXl4mKdcbCItC6zFq7fbHNjhnYNA/D7pD6Yu/Io3vv3iAow0gZHejr1bRECD1d+6ZH2ycWdF3gisgeslqrGWDU66BhoiIiILIAlNzaA1U5ERES2jQ1EiIiISFNctTbAlhRvERERkX3QX7ctOVCmZsJNWlqauo2KirL2rhAREVE1ruPSa8oSNBNugoJKZ/M+efKkxQ4OVT+FS8iMj4+3eLd84rmwV/y9sC08H7ZDuoBHR0cbruOWoJlw4+xc2nxIgg0vqLZBzgPPhW3gubAdPBe2hefD9q7jFnkvi70TERERkQ1guCEiIiJN0Uy48fDwwIsvvqhuieeC+Htha/gdZVt4PrR9LjQzQjERERGRpkpuiIiIiATDDREREWkKww0RERFpCsMNERERaQrDDREREWkKww0RERFpCsMNERERaQrDDREREWkKww0RERFpCsMNERERaQrDDREREWkKww0RERFpCsMNERERaQrDDREREWmKKzSipKQECQkJ8PPzg5OTk7V3h4iIiMyg0+mQlZWFyMhIODtbpsxFM+FGgk1UVJS1d4OIiIiqIT4+Hg0bNoQlaCbcSImN/uD4+/tbe3eIiIjIDJmZmapwQn8dtwTNhBt9VZQEG4YbIiIi+2LJJiVsUExERESawnBDREREmsJwQ0RERJrCcENERESawnBDREREmsJwQ0RERJrCcENERESawnBDREREmsJwQ0RERJrCcENERESawnBDREREmsJwQ0RERJrCcENERESawnBDREREmsJwQ0RERJpSrXBz+vRprF+/HsnJyWZtX1xcjAMHDmD37t3Izc2tdFt5fsWKFdi7d291do2IiIgcXJXCTUlJCe655x40b94c999/P6Kjo/HUU09V+pr33nsPjRs3xpgxYzBu3DhERkbis88+q3D7SZMm4aqrrsKLL75YlV0jIiIiUlxRBe+//z5++eUX7Ny5Ey1atMDGjRvRt29fdOvWDTfccEO5r8nMzMTmzZsRHh6uHs+bNw8TJkxA165d0aFDB5Ntf/jhB/XegwYNqspuEREREVWv5EaCyY033qiCjejRowcGDx6s1lfkmWeeMQQbceedd8LV1VUFI2PHjh3D448/jm+//RZubm5V2S0iIiKiqocbaTcjbWa6dOlisl4eb9++3dy3wY4dO1BQUICYmBjDusLCQlVlNX36dMTGxpr1Pvn5+apUyHghIiIiMjvcZGVloaioCEFBQSbrQ0JCcO7cObPeIzs7G3fddRf69euH/v37G9ZPmzYNERERuO+++8w+IzNnzkRAQIBhiYqK4tkkIiIi88ONu7u7ur24t1NOTo7hucrk5eWpRsVSajN//nw4OTmp9dIeRxod33rrraqXlCxpaWlISUlR9+V15ZFAlJGRYVji4+N5OomIiMj8BsXe3t6qlEa6gRuTx40aNbpsFZIEGwkgElhCQ0NNnuvZs6dqrKx36NAhODs7q2oqaWRs3GZHz8PDQy1ERERExpx0Op0OZho/fjyOHz+uxrgRUk0lbWeuu+46zJo1S607ceIETp06hT59+pgEG3ndf//9p6qfLmfkyJHw9PTEggULzN011eZGqqekFMff39/s1xEREZH11Mb1u0pdwV944QXV7VvGupEA8s0336hqqSeeeMKwzRdffIHZs2cjPT1dPb7pppuwZs0afPLJJzh48KBahIx9IwsRERGRJVUp3LRs2VJ14X777bcxd+5cVWojj41LYySw6Ett9G10pEeVbG9MuoTLUp527dqZ1Y6HiIiIqEbVUraM1VJERET2pzau35w4k4iIiDSF4YaIiIg0heGGiIiINIXhhoiIiDSF4YaIiIg0heGGiIiINIXhhoiIiDSF4YaIiIg0heGGiIiINIXhhoiIiDSF4YaIiIg0heGGiIiINIXhhoiIiDSF4YaIiIg0heGGiIiINIXhhoiIiDSF4YaIiIg0heGGiIiINIXhhoiIiDSF4YaIiIg0heGGiIiINIXhhoiIiDTFFRqTU1AE14Iia+8GERERmXndtjTNhZvuryyHs4e3tXeDiIiIzFCSnwNLY7UUERERaYqTTqfTQQMyMzMREBCAMylp8Pf3t/buEBERkZnX74j6wcjIyLDY9Vtz1VLe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", "text/plain": [ "
" ] @@ -357,7 +357,148 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "If you're looking for a more exploratory script, see `example_03_pitch_tsr_contour.py`. If you're looking to run a simulation with multiple turbines in a wind farm configuration, see the quick start guide for `MITWindfarm`." + "If you're looking for a more exploratory script, see `example_03_pitch_tsr_contour.py`. If you're looking to run a simulation with multiple turbines in a wind farm configuration, see the quick start guide for `MITWindfarm`.\n", + "\n", + "Note that vectors of setpoints can also be passed in to solve multiple solutions, as long as the vectors are all the same length." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Use with FLORIS\n", + "\n", + "MITRotor has a FLORIS interface so that MITRotor models can be used within FLORIS runs. A basic example of this is in the example `example_06_floris_integration.py`. \n", + "\n", + "The user can create a `MITRotorTurbine`, which is a child class of the FLORIS class, `BaseOperationModel`. The model is parameterized by an optional `bem_model` together with efficiency settings `gen_eff` (in %) which will be combined with the gearbox ratio to get the total efficiency ratio, `eff_ratio`. Control trajectories are provided through `pitch_interp` and `tsr_interp`, each of which may be either 1D in wind speed (no yaw dependence) or 2D in wind speed and yaw. The flag `pitch_rad` determines whether pitch interpolation inputs are interpreted in radians (otherwise degrees), and `rated_rotor_speed` optionally specifies the rated rotor speed in `rad/s`.\n", + "\n", + "An example of this is as follows:" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "DeprecationWarning: /Users/sky/Library/Caches/pypoetry/virtualenvs/mitrotor-l4Gn_-ln-py3.12/lib/python3.12/site-packages/scipy/interpolate/_interpolate.py:324\n", + "__array__ implementation doesn't accept a copy keyword, so passing copy=False failed. __array__ must implement 'dtype' and 'copy' keyword arguments. To learn more, see the migration guide https://numpy.org/devdocs/numpy_2_0_migration_guide.html#adapting-to-changes-in-the-copy-keywordUserWarning: /Users/sky/src/HowlandLab/MITRotor/MITRotor/FlorisInterface/InterfaceUtilities.py:52\n", + "Using 1D control curve with nonzero yaw/tilt; yaw/tilt is ignored for lookup." + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Powers [W]:\n", + " [[ 6459808.16959411 1286595.70487608]\n", + " [12616812.83118355 2756681.50823379]\n", + " [14976393.19316245 15070208.06388656]] \n", + "\n", + "Thrust coefficients [-]:\n", + " [[0.77745948 0.7792296 ]\n", + " [0.77745948 0.78725775]\n", + " [0.42307743 0.49466813]] \n", + "\n", + "Axial induction factors [-]:\n", + " [[0.32727575 0.31936816]\n", + " [0.32727575 0.32933065]\n", + " [0.15925286 0.18696097]] \n", + "\n" + ] + } + ], + "source": [ + "from floris import FlorisModel, TimeSeries\n", + "from MITRotor.FlorisInterface.FlorisInterface import MITRotorTurbine\n", + "from MITRotor.FlorisInterface.InterfaceUtilities import query_controls\n", + "\n", + "fmodel = FlorisModel(\"defaults\")\n", + "time_series = TimeSeries(\n", + " wind_directions=np.array([270.0, 270.0, 280.0]),\n", + " wind_speeds=np.array([8.0, 10.0, 12.0]),\n", + " turbulence_intensities=np.array([0.06, 0.06, 0.06]),\n", + ")\n", + "yaw_angles = np.array([\n", + " [0.0, 0.0], # condition 1\n", + " [0.0, 0.0], # condition 2\n", + " [0.0, 0.0], # condition 3\n", + "])\n", + "\n", + "fmodel.set(\n", + " layout_x = [0.0, 500.0],\n", + " layout_y = [0.0, 0.0],\n", + " wind_data = time_series,\n", + " yaw_angles = yaw_angles\n", + ")\n", + "\n", + "mit_rotor_turbine = MITRotorTurbine(bem_model = bem_model)\n", + "fmodel.set_operation_model(mit_rotor_turbine)\n", + "\n", + "fmodel.run()\n", + "print(\"Powers [W]:\\n\", fmodel.get_turbine_powers(), \"\\n\")\n", + "print(\"Thrust coefficients [-]:\\n\", fmodel.get_turbine_thrust_coefficients(), \"\\n\")\n", + "print(\"Axial induction factors [-]:\\n\", fmodel.get_turbine_axial_induction_factors(), \"\\n\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In this case, the blade pitch and TSR curves are the default curves, which can be seen here:" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "wind_speed_vals = np.linspace(3, 25, 50)\n", + "mit_rotor_turbine.pitch_interp\n", + "blade_pitch_vals = query_controls(mit_rotor_turbine.pitch_interp, wind_speed_vals, yaw_rad = 0)\n", + "tsr_vals = query_controls(mit_rotor_turbine.tsr_interp, wind_speed_vals, yaw_rad = 0)\n", + "\n", + "fig, ax = plt.subplots()\n", + "ax.plot(wind_speed_vals, np.rad2deg(blade_pitch_vals), label = \"Pitch [deg]\")\n", + "ax.plot(wind_speed_vals, tsr_vals, label = \"Tip-Speed Ratio [-]\")\n", + "ax.set_title(\"IEA 15MW: Fixed Bottom Trajectories\", size = 18)\n", + "ax.set_xlabel(\"Wind Speed [m/s]\", size = 16)\n", + "ax.tick_params(labelsize=14)\n", + "ax.legend(fontsize = 14)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The user can also provide their own blade pitch and TSR interpolators. These can either be 1D and just take in wind speeds, or 2D and take in wind speeds and yaw (or effective yaw, which is the combination of yaw and tilt). \n", + "\n", + "MITRotor also provides a ROSCO interface, which aids in the creation of these 2D interpolators using existing control strategies. `example_08_floris_rosco.py` gives an example of how to generate new control scheme interpolators using the function `get_rosco_control_interps`.\n" ] } ], diff --git a/examples/example_02_rotor_distributions.py b/examples/example_02_rotor_distributions.py index 517ea21..98e976f 100644 --- a/examples/example_02_rotor_distributions.py +++ b/examples/example_02_rotor_distributions.py @@ -17,7 +17,7 @@ def plot_radial_distributions(sol: BEMSolution, save_to: Path): [ax.legend(loc="lower center") for ax in axes] - axes[-1].set_xlabel("Radial position, $\mu$ [-]") + axes[-1].set_xlabel("Radial position, $\\mu$ [-]") plt.xlim(0, 1) plt.savefig(save_to, dpi=300, bbox_inches="tight") diff --git a/examples/example_04_yaw_tilt_rotor_comparison.py b/examples/example_04_yaw_tilt_rotor_comparison.py index 5b39520..9a809bf 100644 --- a/examples/example_04_yaw_tilt_rotor_comparison.py +++ b/examples/example_04_yaw_tilt_rotor_comparison.py @@ -41,7 +41,7 @@ axes[i, j].set_title(f"r/R ={np.round(r_mesh[0], decimals=2)}") fig.legend( - [f"Yaw ${rounded_deg_misalignment}^\circ$", f"Tilt ${rounded_deg_misalignment}^\circ$", f"Yaw ${np.rad2deg(yaw)}^\circ$ and Tilt ${np.rad2deg(yaw)}^\circ$"], # labels + [f"Yaw ${rounded_deg_misalignment}^\\circ$", f"Tilt ${rounded_deg_misalignment}^\\circ$", f"Yaw ${np.rad2deg(yaw)}^\\circ$ and Tilt ${np.rad2deg(yaw)}^\\circ$"], # labels loc='lower center', ncol=3, bbox_to_anchor=(0.5, 0.05) diff --git a/examples/example_06_floris_integration.py b/examples/example_06_floris_integration.py new file mode 100644 index 0000000..9df7e71 --- /dev/null +++ b/examples/example_06_floris_integration.py @@ -0,0 +1,360 @@ +import os +import numpy as np +import polars as pl +from pathlib import Path +import time +import matplotlib.pyplot as plt + +# Floris imports +from floris import FlorisModel, TimeSeries + +# MITRotor / UMM Imports +from MITRotor.FlorisInterface.FlorisInterface import MITRotorTurbine, default_bem_factory, default_pitch_interp, default_tsr_interp +from MITRotor.ReferenceTurbines import IEA15MW +from MITRotor.Momentum import UnifiedMomentum, UnifiedMomentumLUT +from MITRotor.Geometry import BEMGeometry +from MITRotor.TipLoss import NoTipLoss +from MITRotor.BEMSolver import BEM + +# Example shows that MITRotor rotor values are equivalent to FLORIS rotor values when MITRotor is +# set as the rotor model using the `set_operation_model` function. + +figdir = Path("fig") +floris_air_density = 1.225 +# ------------------ run basic case -------------------------------------------------------- +fmodel = FlorisModel("defaults") +time_series = TimeSeries( + wind_directions=np.array([270.0, 270.0, 280.0]), + wind_speeds=np.array([8.0, 10.0, 12.0]), + turbulence_intensities=np.array([0.06, 0.06, 0.06]), +) +yaw_angles = np.array([ + [0.0, 0.0], # condition 1 + [0.0, 0.0], # condition 2 + [0.0, 0.0], # condition 3 +]) + +fmodel.set( + layout_x = [0.0, 500.0], + layout_y = [0.0, 0.0], + wind_data = time_series, + yaw_angles = yaw_angles +) +fmodel.set_operation_model(MITRotorTurbine()) +fmodel.run() +print("Powers [W]:\n", fmodel.get_turbine_powers(), "\n") +print("Thrust coefficients [-]:\n", fmodel.get_turbine_thrust_coefficients(), "\n") +print("Axial induction factors [-]:\n", fmodel.get_turbine_axial_induction_factors(), "\n") + +# -------------------- plot pitch and tsr control curves, as well as CT for IEA15MW ------------------ +# Credit to Ilan Upfal for initial validation of MITRotor vs IEA15MW and much of the script below. +# Floris Interface written and tested by Skylar Gering. +module_dir = os.path.dirname(__file__) # examples/ +csv_file = os.path.join(module_dir, "..", "MITRotor", "FlorisInterface", "IEA_15mw_rotor.csv") +df = pl.read_csv(csv_file) + +wind_table = df["Wind [m/s]"].to_numpy() +wind_speeds = np.linspace(5, 25, 20) +wind_dirs = np.full_like(wind_speeds, 270.0) +turbulence_intensity = np.zeros_like(wind_speeds) + +# ------- plot pitch and tsr control curves for IEA15MW from figure 2 (https://docs.nrel.gov/docs/fy22osti/82134.pdf) -------- +pitch_interp = default_pitch_interp() +tsr_interp = default_tsr_interp() +tsrs = [tsr_interp(u) for u in wind_speeds] +pitches = [pitch_interp(u) for u in wind_speeds] + +# plot interpolated pitch and tsr data +fig, ax = plt.subplots(figsize=(8, 6)) +ax.scatter( + wind_speeds, + np.rad2deg(pitches), + s=40, + edgecolors="k", + label = "Interpolated Pitch [deg]" +) +ax.scatter( + wind_speeds, + tsrs, + s=40, + edgecolors="k", + label = "Interpolated Tip-Speed Ratio [-]" +) +# load and plot raw CSV data +ax.plot( + wind_table, + df["Pitch [deg]"].to_numpy(), + label = "Pitch [deg]" +) +ax.plot( + wind_table, + df["Tip Speed [m/s]"].to_numpy() / wind_table, + label = "Tip-Speed Ratio [-]" +) +ax.set_title("IEA 15MW: Fixed Bottom Trajectories", size = 18) +ax.set_xlabel("Wind Speed [m/s]", size = 16) +ax.tick_params(labelsize=14) +ax.legend(fontsize = 14) +plt.savefig(figdir / "example_6_pitch_tsr_interpolation.png", dpi=300) + +# -------- plot CT and CP values against one another and against IEA15MW from figure 3.1-C (https://docs.nrel.gov/docs/fy20osti/75698.pdf) ------- +# solve UMM-BEM though MITRotor - rotor averaged +bem_rotor_umm = default_bem_factory() +mit_rotor_umm_start = time.time() +pitches_rad = pitch_interp(wind_speeds) +tsrs = tsr_interp(wind_speeds) +yaws, tilts = np.zeros_like(pitches_rad), np.zeros_like(pitches_rad) +mit_sols_rotor_umm = bem_rotor_umm(pitch=pitches_rad, tsr=tsrs, yaw=yaws, tilt=tilts) +mit_rotor_umm_end = time.time() +mit_Ct_rotor_umm = mit_sols_rotor_umm.Ct() +mit_Cp_rotor_umm = mit_sols_rotor_umm.Cp() +print("MITRotor UMM-BEM Rotor-Averaged: " + str(mit_rotor_umm_end - mit_rotor_umm_start) + " seconds") + +# solve UMM-BEM though MITRotor - annulus averaged +bem_annulus_umm = BEM( + rotor=IEA15MW(), + momentum_model=UnifiedMomentum(averaging="annulus"), + geometry=BEMGeometry(Nr=10, Ntheta=20), + tiploss_model=NoTipLoss(), + ) +mit_annulus_umm_start = time.time() +mit_sols_annulus_umm = bem_annulus_umm(pitch=pitches, tsr=tsrs, yaw=yaws, tilt=tilts) +mit_annulus_umm_end = time.time() +mit_Ct_annulus_umm = mit_sols_annulus_umm.Ct() +mit_Cp_annulus_umm = mit_sols_annulus_umm.Cp() +print("MITRotor UMM-BEM Annulus-Averaged: " + str(mit_annulus_umm_end - mit_annulus_umm_start) + " seconds") + +# solve UMM-BEM with LUT though MITRotor - annulus averaged +print("Making LUT!") +bem_annulus_umm_LUT = BEM( + rotor=IEA15MW(), + momentum_model=UnifiedMomentumLUT(averaging="annulus", cache_fn = Path("cache")/ "lut.csv"), + geometry=BEMGeometry(Nr=10, Ntheta=20), + tiploss_model=NoTipLoss(), +) +mit_annulus_umm_LUT_start = time.time() +mit_sols_annulus_umm_LUT = bem_annulus_umm_LUT(pitch=pitches, tsr=tsrs, yaw=yaws, tilt=tilts) +mit_annulus_umm_LUT_end = time.time() +mit_Ct_annulus_umm_LUT = mit_sols_annulus_umm_LUT.Ct() +mit_Cp_annulus_umm_LUT = mit_sols_annulus_umm_LUT.Cp() +print("MITRotor UMM-BEM LUT Annulus-Averaged: " + str(mit_annulus_umm_LUT_end - mit_annulus_umm_LUT_start) + " seconds") + +# solve FLORIS with UMM-BEM though MITRotor - rotor averaged +time_series = TimeSeries( + wind_speeds=wind_speeds, + wind_directions=wind_dirs, + turbulence_intensities=turbulence_intensity, +) +floris_rotor_model = MITRotorTurbine() +rotor_area = np.pi * bem_rotor_umm.rotor.R**2 +cp_calc_denominator = (0.5 * floris_air_density * rotor_area * (wind_speeds)**3 * floris_rotor_model.eff_ratio) + +fmodel_rotor_umm = FlorisModel("defaults") +fmodel_rotor_umm.set(layout_x = [0.0], layout_y = [0.0], wind_data = time_series) +fmodel_rotor_umm.set_operation_model(floris_rotor_model) # default bem_model uses rotor-averaging +floris_rotor_umm_start = time.time() +fmodel_rotor_umm.run() +floris_rotor_umm_end = time.time() +floris_Ct_rotor_umm = fmodel_rotor_umm.get_turbine_thrust_coefficients() +floris_power_rotor_umm = np.squeeze(fmodel_rotor_umm.get_turbine_powers()) +floris_Cp_rotor_umm = floris_power_rotor_umm / cp_calc_denominator +print("FLORIS UMM-BEM Rotor-Averaged: " + str(floris_rotor_umm_end - floris_rotor_umm_start) + " seconds") + +# solve FLORIS with UMM-BEM though MITRotor - annulus averaged +fmodel_annulus_umm = FlorisModel("defaults") +fmodel_annulus_umm.set(layout_x = [0.0], layout_y = [0.0], wind_data = time_series) +fmodel_annulus_umm.set_operation_model(MITRotorTurbine(bem_model = bem_annulus_umm)) # default bem_model uses rotor-averaging +floris_annulus_umm_start = time.time() +fmodel_annulus_umm.run() +floris_annulus_umm_end = time.time() +floris_Ct_annulus_umm = fmodel_annulus_umm.get_turbine_thrust_coefficients() +floris_power_annulus_umm = np.squeeze(fmodel_annulus_umm.get_turbine_powers()) +floris_Cp_annulus_umm = floris_power_annulus_umm / cp_calc_denominator +print("FLORIS UMM-BEM Annulus-Averaged: " + str(floris_annulus_umm_end - floris_annulus_umm_start) + " seconds") + +# solve FLORIS with UMM-BEM with LUT though MITRotor - annulus averaged +fmodel_annulus_umm_LUT = FlorisModel("defaults") +fmodel_annulus_umm_LUT.set(layout_x = [0.0], layout_y = [0.0], wind_data = time_series) +fmodel_annulus_umm_LUT.set_operation_model(MITRotorTurbine(bem_model = bem_annulus_umm_LUT)) # default bem_model uses rotor-averaging +floris_annulus_umm_LUT_start = time.time() +fmodel_annulus_umm_LUT.run() +floris_annulus_umm_LUT_end = time.time() +floris_Ct_annulus_umm_LUT = fmodel_annulus_umm_LUT.get_turbine_thrust_coefficients() +floris_power_annulus_umm_LUT = np.squeeze(fmodel_annulus_umm_LUT.get_turbine_powers()) +floris_Cp_annulus_umm_LUT = floris_power_annulus_umm_LUT / cp_calc_denominator +print("FLORIS UMM-BEM LUT Annulus-Averaged: " + str(floris_annulus_umm_LUT_end - floris_annulus_umm_LUT_start) + " seconds") + +# Presentation-friendly typography +plt.rcParams.update({ + "font.size": 20, + "axes.titlesize": 20, + "axes.labelsize": 22, + "xtick.labelsize": 20, + "ytick.labelsize": 20, +}) + +# plot CT values against one another and against IEA15MW from figure 3.1-C (https://docs.nrel.gov/docs/fy20osti/75698.pdf) +fig, (ax0, ax1) = plt.subplots(figsize=(17, 9), ncols = 2, sharex = True, sharey = True) +fig.suptitle("IEA 15 MW FLORIS Interface Validation") +alpha = 0.6 +ax0.plot( + wind_table, + df["Thrust Coefficient [-]"].to_list(), + linewidth=6, + label="IEA15MW", + color='tab:orange', + linestyle = "solid", + alpha = alpha, + zorder = 1, +) + +ax0.plot( + wind_speeds, + mit_Ct_rotor_umm, + label="MITRotor UMM Rotor-Averaged", + linewidth=6, + color='tab:blue', + linestyle = "solid", + alpha = alpha, + zorder = 1, +) +ax0.plot( + wind_speeds, + mit_Ct_annulus_umm_LUT, + label="MITRotor UMM LUT Annulus-Averaged", + linewidth=6, + color='tab:red', + linestyle = "solid", + alpha = alpha, + zorder = 1, +) + +ax0.plot( + wind_speeds, + mit_Ct_annulus_umm, + label="MITRotor UMM Annulus-Averaged", + linewidth=6, + color='tab:green', + linestyle = "solid", + alpha = alpha, + zorder = 1, +) + +ax0.scatter( + wind_speeds, + floris_Ct_rotor_umm, + label="FLORIS-MITRotor UMM Rotor-Averaged", + color='tab:blue', + alpha = alpha, + marker = "o", + zorder = 2, + s = 80, +) +ax0.scatter( + wind_speeds, + floris_Ct_annulus_umm, + label="FLORIS-MITRotor UMM Annulus-Averaged", + color='tab:green', + alpha = alpha, + zorder = 2, + s = 80, + marker = "s" +) +ax0.scatter( + wind_speeds, + floris_Ct_annulus_umm_LUT, + label="FLORIS-MITRotor UMM LUT Annulus-Averaged", + color='tab:red', + alpha = alpha, + zorder = 2, + s = 80, + marker = "v" +) + +ax0.set_xlabel("Wind Speed [m/s]") +ax0.set_ylabel("$C_T$") +ax0.tick_params() +ax0.set_title("$C_T$") + +# plot Cp values against one another and against IEA15MW from figure 3.1-C (https://docs.nrel.gov/docs/fy20osti/75698.pdf) +ax1.plot( + wind_table, + df["Aero Power Coefficient [-]"].to_list(), + label="IEA15MW", + linewidth=6, + color='tab:orange', + linestyle = "solid", + alpha = alpha, + zorder = 1 +) +ax1.plot( + wind_speeds, + mit_Cp_rotor_umm, + label="MITRotor UMM Rotor-Averaged", + linewidth=6, + color='tab:blue', + linestyle = "solid", + alpha = alpha, + zorder = 1 +) +ax1.plot( + wind_speeds, + mit_Cp_annulus_umm_LUT, + label="MITRotor UMM LUT Annulus-Averaged", + linewidth=6, + color='tab:red', + linestyle = "solid", + alpha = alpha, + zorder = 1 +) +ax1.plot( + wind_speeds, + mit_Cp_annulus_umm, + label="MITRotor UMM Annulus-Averaged", + linewidth=6, + color='tab:green', + linestyle = "solid", + alpha = alpha, + zorder = 1 +) + +ax1.scatter( + wind_speeds, + floris_Cp_rotor_umm, + label="FLORIS-MITRotor UMM Rotor-Averaged", + color='tab:blue', + marker = "o", + alpha = alpha, + s = 80, + zorder = 2 +) +ax1.scatter( + wind_speeds, + floris_Cp_annulus_umm, + label="FLORIS-MITRotor UMM Annulus-Averaged", + color='tab:green', + marker = "s", + alpha = alpha, + s = 80, + zorder = 2 +) +ax1.scatter( + wind_speeds, + floris_Cp_annulus_umm_LUT, + label="FLORIS-MITRotor UMM LUT Annulus-Averaged", + color='tab:red', + marker = "v", + alpha = alpha, + s = 80, + zorder = 2 +) + +ax1.set_xlabel("Wind Speed [m/s]") +ax1.set_ylabel("$C_P$") +ax1.set_title("$C_P$") +ax1.legend( + fontsize=16, + loc="upper right", +) + +plt.savefig(figdir / "example_6_IEA15mw_CT_CP.png", dpi=300) diff --git a/examples/example_07_LUT_timing.py b/examples/example_07_LUT_timing.py new file mode 100644 index 0000000..19c0428 --- /dev/null +++ b/examples/example_07_LUT_timing.py @@ -0,0 +1,213 @@ +import numpy as np +from pathlib import Path +from MITRotor.Momentum import UnifiedMomentumLUT, UnifiedMomentum +from MITRotor.TipLoss import NoTipLoss +from MITRotor import BEM, IEA15MW, BEMGeometry +import pandas as pd +import time +import matplotlib.pyplot as plt + +# Floris imports +from floris import FlorisModel, TimeSeries +from MITRotor.FlorisInterface.FlorisInterface import MITRotorTurbine, default_bem_factory + +figdir = Path("fig") +floris_air_density = 1.225 + +bem_rotor_umm = default_bem_factory() +bem_rotor_umm_LUT = BEM( + rotor=IEA15MW(), + momentum_model=UnifiedMomentumLUT(averaging="rotor", cache_fn = Path("cache")/ "rotor_lut.csv"), + geometry=BEMGeometry(Nr=10, Ntheta=20), + tiploss_model=NoTipLoss(), +) +bem_annulus_umm_LUT = BEM( + rotor=IEA15MW(), + momentum_model=UnifiedMomentumLUT(averaging="annulus", cache_fn = Path("cache")/ "annulus_lut.csv"), + geometry=BEMGeometry(Nr=10, Ntheta=20), + tiploss_model=NoTipLoss(), +) +rotor_area = np.pi * bem_rotor_umm.rotor.R**2 + +bem_rotor_times = [] +bem_rotor_LUT_times = [] +bem_annulus_LUT_times = [] +wind_speeds_all = [] +bem_rotor_values = [] +bem_rotor_LUT_values = [] +bem_annulus_LUT_values = [] +ns = [5 * i for i in range(1, 21)] +for n in ns: + print(f"{n} wind speeds") + wind_speeds = np.linspace(5, 20, n) + wind_dirs = np.full_like(wind_speeds, 270.0) + turbulence_intensity = np.zeros_like(wind_speeds) + wind_speeds_all.extend( + np.squeeze(wind_speeds) + ) + + time_series = TimeSeries( + wind_speeds=wind_speeds, + wind_directions=wind_dirs, + turbulence_intensities=turbulence_intensity, + ) + # solve FLORIS with UMM-BEM though MITRotor - rotor averaged + fmodel_rotor_umm = FlorisModel("defaults") + fmodel_rotor_umm.set(layout_x = [0.0], layout_y = [0.0], wind_data = time_series) + floris_rotor_model = MITRotorTurbine(bem_model = bem_rotor_umm) + fmodel_rotor_umm.set_operation_model(floris_rotor_model) # default bem_model uses rotor-averaging + floris_rotor_umm_start = time.time() + fmodel_rotor_umm.run() + floris_rotor_umm_end = time.time() + dt_rotor = floris_rotor_umm_end - floris_rotor_umm_start + print("FLORIS UMM-BEM Rotor-Averaged: " + str(dt_rotor) + " seconds") + bem_rotor_times.append(dt_rotor) + cp_calc_denominator = (0.5 * floris_air_density * rotor_area * (wind_speeds)**3 * floris_rotor_model.eff_ratio) + floris_Cp_rotor_umm = np.squeeze(fmodel_rotor_umm.get_turbine_powers()) / cp_calc_denominator + bem_rotor_values.extend(np.squeeze(floris_Cp_rotor_umm)) + + # solve FLORIS with UMM-BEM with LUT though MITRotor - rotor averaged + fmodel_rotor_umm_LUT = FlorisModel("defaults") + fmodel_rotor_umm_LUT.set(layout_x = [0.0], layout_y = [0.0], wind_data = time_series) + fmodel_rotor_umm_LUT.set_operation_model(MITRotorTurbine(bem_model = bem_rotor_umm_LUT)) + floris_rotor_umm_LUT_start = time.time() + fmodel_rotor_umm_LUT.run() + floris_rotor_umm_LUT_end = time.time() + dt_rotor_LUT = floris_rotor_umm_LUT_end - floris_rotor_umm_LUT_start + print("FLORIS UMM-BEM LUT Rotor-Averaged: " + str(dt_rotor_LUT) + " seconds") + bem_rotor_LUT_times.append(dt_rotor_LUT) + floris_Cp_rotor_umm_LUT = np.squeeze(fmodel_rotor_umm_LUT.get_turbine_powers()) / cp_calc_denominator + bem_rotor_LUT_values.extend( + np.squeeze(floris_Cp_rotor_umm_LUT) + ) + + # solve FLORIS with UMM-BEM with LUT though MITRotor - annulus averaged + fmodel_annulus_umm_LUT = FlorisModel("defaults") + fmodel_annulus_umm_LUT.set(layout_x = [0.0], layout_y = [0.0], wind_data = time_series) + fmodel_annulus_umm_LUT.set_operation_model(MITRotorTurbine(bem_model = bem_annulus_umm_LUT)) + floris_annulus_umm_LUT_start = time.time() + fmodel_annulus_umm_LUT.run() + floris_annulus_umm_LUT_end = time.time() + dt_annulus_LUT = floris_annulus_umm_LUT_end - floris_annulus_umm_LUT_start + print("FLORIS UMM-BEM LUT Annulus-Averaged: " + str(dt_annulus_LUT) + " seconds") + bem_annulus_LUT_times.append(dt_annulus_LUT) + floris_Cp_annulus_umm_LUT = np.squeeze(fmodel_annulus_umm_LUT.get_turbine_powers()) / cp_calc_denominator + bem_annulus_LUT_values.extend( + np.squeeze(floris_Cp_annulus_umm_LUT) + ) + +# make timing CSV +vectorized = True +rows = [] + +for n, dt in zip(ns, bem_rotor_times): + rows.append({ + "n_wind_speeds": n, + "runtime_seconds": dt, + "model": "rotor_umm", + "vectorized": vectorized + }) + +for n, dt in zip(ns, bem_rotor_LUT_times): + rows.append({ + "n_wind_speeds": n, + "runtime_seconds": dt, + "model": "rotor_lut", + "vectorized": vectorized + }) + +for n, dt in zip(ns, bem_annulus_LUT_times): + rows.append({ + "n_wind_speeds": n, + "runtime_seconds": dt, + "model": "annulus_lut", + "vectorized": vectorized + }) + +df = pd.DataFrame(rows) + +csv_path = Path("cache")/ "timing_results.csv" + +if csv_path.exists(): + df.to_csv(csv_path, mode="a", header=False, index=False) +else: + df.to_csv(csv_path, index=False) + +# ------------------------------------------------------------------ +# Plot timings +# ------------------------------------------------------------------ +plt.figure() +plt.plot(ns, bem_rotor_times, "o-", label="Rotor-averaged UMM") +plt.plot(ns,bem_rotor_LUT_times, "v-",label="Rotor-averaged UMM with LUT") +plt.plot(ns,bem_annulus_LUT_times, "s-",label="Annulus-averaged UMM with LUT") +plt.xlabel("Number of wind speeds") +plt.ylabel("Runtime (s)") +plt.yscale("log") +plt.title("FLORIS Runtime Comparison") +plt.legend() +plt.savefig(figdir / "example_7_floris_runtimes.png", dpi=300) + +# make values CSV +rows = [] +# Rotor +for wind, val in zip(wind_speeds_all, bem_rotor_values): + rows.append({ + "wind_speed": wind, + "power": val, + "model": "rotor_umm", + "vectorized": vectorized + }) + +# Rotor LUT +for wind, val in zip(wind_speeds_all, bem_rotor_LUT_values): + rows.append({ + "wind_speed": wind, + "power": val, + "model": "rotor_lut", + "vectorized": vectorized + }) + +# Annulus LUT +for wind, val in zip(wind_speeds_all, bem_annulus_LUT_values): + rows.append({ + "wind_speed": wind, + "power": val, + "model": "annulus_lut", + "vectorized": vectorized + }) + +df = pd.DataFrame(rows) + +csv_path = Path("cache") / "value_results.csv" + +if csv_path.exists(): + df.to_csv(csv_path, mode="a", header=False, index=False) +else: + df.to_csv(csv_path, index=False) + +import matplotlib.pyplot as plt + +# ------------------------------------------------------------------ +# Plot results +# ------------------------------------------------------------------ +# Sort by wind speed for plotting +sort_idx = np.argsort(wind_speeds_all) + +wind_speeds_plot = np.array(wind_speeds_all)[sort_idx] +bem_rotor_plot = np.array(bem_rotor_values)[sort_idx] +bem_rotor_LUT_plot = np.array(bem_rotor_LUT_values)[sort_idx] +bem_annulus_LUT_plot = np.array(bem_annulus_LUT_values)[sort_idx] + +plt.figure() + +plt.plot(wind_speeds_plot, bem_rotor_plot, label="Rotor-averaged UMM", linestyle="-", linewidth=3) +plt.plot(wind_speeds_plot, bem_rotor_LUT_plot, label="Rotor-averaged UMM with LUT", linestyle="--", linewidth=3) +plt.plot(wind_speeds_plot, bem_annulus_LUT_plot, label="Annulus-averaged UMM with LUT", linestyle=":", linewidth=3) + +plt.xlabel("Wind speed (m/s)") +plt.ylabel(r"$C_P$") +plt.title("Power Coefficient Comparison") +plt.grid(True) +plt.legend() +plt.tight_layout() +plt.savefig(figdir / "example_7_floris_cp_vals.png", dpi=300) diff --git a/examples/example_08_floris_rosco.py b/examples/example_08_floris_rosco.py new file mode 100644 index 0000000..1694c1a --- /dev/null +++ b/examples/example_08_floris_rosco.py @@ -0,0 +1,309 @@ +# Python modules +import os +import matplotlib.pyplot as plt +import tempfile +from pathlib import Path +from ruamel.yaml import YAML +import numpy as np +import pandas as pd +import polars as pl +from scipy.interpolate import interp1d +import time + +# FLORIS modules +from floris import FlorisModel, TimeSeries + +# MITRotor modules +from MITRotor.Momentum import UnifiedMomentumLUT +from MITRotor import BEM, BEMGeometry, IEA15MW +from MITRotor.FlorisInterface.FlorisInterface import MITRotorTurbine +from MITRotor.FlorisInterface.ROSCOInterface import get_rosco_control_interps +from MITRotor.FlorisInterface.InterfaceUtilities import query_controls + +figdir = Path("fig") + +def change_control_param( + param_key, param_value, template_yaml, bem, + regenerate = False, save_control_file = "control.csv", yaw_grid_deg = np.linspace(-25.0,25.0,50), +): + yaml = YAML() + with tempfile.TemporaryDirectory() as tmpdir: + temp_yaml = Path(tmpdir) / "rosco_temp.yaml" + + with open(template_yaml) as f: + data = yaml.load(f) + + data["controller_params"][param_key] = param_value + + with open(temp_yaml, "w") as f: + yaml.dump(data, f) + + pitch_interp, tsr_interp, rated_rotor_speed = get_rosco_control_interps( + temp_yaml, bem, + regenerate = regenerate, save_control_file = save_control_file, yaw_grid_deg = yaw_grid_deg + ) + return pitch_interp, tsr_interp, rated_rotor_speed + +def get_turbine_power_coefficent(fturbine, fmodel, wind_speeds): + rotor_area = np.pi * fturbine.bem_model.rotor.R**2 + floris_power = np.squeeze(fmodel.get_turbine_powers()) + floris_Cp = floris_power / (0.5 * 1.225 * rotor_area * (wind_speeds)**3 * fturbine.eff_ratio) + return floris_Cp, floris_power / 1e6 # MW + +def main(): + # wind condtions + wind_speeds = np.linspace(3, 25, 25) + wind_dirs = np.full_like(wind_speeds, 270.0) + yaws_degs = np.linspace(-25.0,25.0,50) + turbulence_intensity = np.zeros_like(wind_speeds) + time_series = TimeSeries( + wind_speeds=wind_speeds, + wind_directions=wind_dirs, + turbulence_intensities=turbulence_intensity, + ) + + # load example trajectories from ROSCO Paper Figure 2: + # Abbas, N. J., Zalkind, D. S., Pao, L., & Wright, A. (2022). + # A reference open-source controller for fixed and floating offshore wind turbines. + # Wind Energy Science, 7(1), 53-73. + abbas_pitch = pd.read_csv("examples/examples_in/IEA15_pitch.csv") # note that this is in degrees + abbas_tsr = pd.read_csv("examples/examples_in/IEA15_TSR.csv") + abbas_pitch_interp = interp1d(abbas_pitch["x"], abbas_pitch["y"], kind="linear", fill_value="extrapolate", bounds_error=False) + abbas_tsr_interp = interp1d(abbas_tsr["x"], abbas_tsr["y"], kind="linear", fill_value="extrapolate", bounds_error=False) + + # create new MITRotor BEM model with a LUT for UMM + print("Generating new LUT for BEM.") + cache_dir = Path("cache") + cache_dir.mkdir(exist_ok=True, parents=True) + cache_file = cache_dir / "lut.csv" + lut_model = UnifiedMomentumLUT( + cache_fn=cache_file, + regenerate=False, + LUT_Cts=np.linspace(-0.5,1.5,40), + LUT_yaws=yaws_degs, # Note here that we are only allowing for yaws <25 degrees! Update if needed! + ) + print("LUT for BEM done generating. ") + bem = BEM(rotor = IEA15MW(), momentum_model = lut_model, geometry = BEMGeometry(Nr=10, Ntheta=20)) + + # Load IEA15MW ROSCO parameters to make controllers + start = time.time() + rosco_yaml_VS_1 = "MITRotor/ReferenceTurbines/ROSCO_IEA15MW.yaml" + # takes ~25min with 8 workers + rosco_VS_1_pitch_interp, rosco_VS_1_tsr_interp, rosco_VS_1_rated_rotorspeed = get_rosco_control_interps( + rosco_yaml_VS_1, bem, + regenerate = False, save_control_file = "control_vs_1.csv", + yaw_grid_deg=yaws_degs + ) + + end = time.time() + print(f"Time to make control CSV: {end - start}") + # takes ~25min with 8 workers + rosco_VS_3_pitch_interp, rosco_VS_3_tsr_interp, rosco_VS_3_rated_rotorspeed = change_control_param( + "VS_ControlMode", 3, rosco_yaml_VS_1, bem, + regenerate = True, save_control_file = "control_vs_3.csv", + yaw_grid_deg=yaws_degs + ) + + # Plot IEA15MW control from ROSCO paper, ROSOC control with VS_Control_Mode = 1, and ROSOC control withVS_Control_Mode = 3 + pitch_abbas = abbas_pitch_interp(wind_speeds) + pitch_ps0 = np.rad2deg(query_controls(rosco_VS_3_pitch_interp, wind_speeds, 0.0)) + pitch_ps3 = np.rad2deg(query_controls(rosco_VS_1_pitch_interp, wind_speeds, 0.0)) + + tsr_abbas = abbas_tsr_interp(wind_speeds) + tsr_ps0 = query_controls(rosco_VS_3_tsr_interp, wind_speeds, 0.0) + tsr_ps3 = query_controls(rosco_VS_1_tsr_interp, wind_speeds, 0.0) + + # Create figure + fig, ax = plt.subplots(1, 2, figsize = (10,4), sharey = True, constrained_layout=True) + fig.suptitle(fr"Setpoint Trajectories") + # Plot pitch + ax[0].plot(wind_speeds, pitch_ps0, label="ROSCO:VS_Control_Mode = 3", lw=3) + ax[0].plot(wind_speeds, pitch_ps3, label="ROSCO: VS_Control_Mode = 1", lw=3, linestyle = "dashed") + ax[0].plot(wind_speeds, pitch_abbas, label="Abbas et al. Fig 2", lw=3, linestyle = "dotted") + + ax[0].set_xlabel("Wind Speed [m/s]") + ax[0].set_ylabel("Pitch [deg]") + ax[0].set_title("Pitch Schedule") + ax[0].grid(True) + + # Plot TSR + ax[1].plot(wind_speeds, tsr_ps0, label="MITRotor+FLORIS+ROSCO:VS_Control_Mode = 3", lw=3) + ax[1].plot(wind_speeds, tsr_ps3, label="MITRotor+FLORIS+ROSCO: VS_Control_Mode = 1", lw=3, linestyle = "dashed") + ax[1].plot(wind_speeds, tsr_abbas, label="Abbas et al. ROSCO Control", lw=3, linestyle = "dotted") + + ax[1].set_xlabel("Wind Speed [m/s]") + ax[1].set_ylabel("TSR [-]") + ax[1].set_title("Tip-Speed Ratio (TSR) Schedule") + ax[1].grid(True) + ax[1].legend() + + plt.savefig(figdir / "example_8_IEA15mw_controls.png", dpi=300) + + # make FLORIS turbines + floris_default_turbine = MITRotorTurbine( + bem_model = bem, + ) + + floris_abbas_turbine = MITRotorTurbine( + bem_model = bem, + pitch_interp = abbas_pitch_interp, + pitch_rad = False, + tsr_interp = abbas_tsr_interp, + ) + + floris_VS_3_turbine = MITRotorTurbine( + bem_model = bem, + pitch_interp = rosco_VS_3_pitch_interp, + pitch_rad = True, + tsr_interp = rosco_VS_3_tsr_interp, + rated_rotor_speed = rosco_VS_3_rated_rotorspeed, + ) + + floris_VS_1_turbine = MITRotorTurbine( + bem_model = bem, + pitch_interp = rosco_VS_1_pitch_interp, + pitch_rad = True, + tsr_interp = rosco_VS_1_tsr_interp, + rated_rotor_speed = rosco_VS_1_rated_rotorspeed, + ) + yaw = 0.0 # degrees + yaw_angles = [[yaw] for _ in np.arange(len(wind_speeds))] + fmodel_default = FlorisModel("defaults") + fmodel_default.set(layout_x = [0.0], layout_y = [0.0], wind_data = time_series, yaw_angles = yaw_angles) + fmodel_default.set_operation_model(floris_default_turbine) + fmodel_default.run() + Ct_default = fmodel_default.get_turbine_thrust_coefficients() + Cp_default, P_default = get_turbine_power_coefficent(floris_default_turbine, fmodel_default, wind_speeds) + + fmodel_abbas = FlorisModel("defaults") + fmodel_abbas.set(layout_x = [0.0], layout_y = [0.0], wind_data = time_series, yaw_angles = yaw_angles) + fmodel_abbas.set_operation_model(floris_abbas_turbine) + fmodel_abbas.run() + Ct_abbas = fmodel_abbas.get_turbine_thrust_coefficients() + Cp_abbas, P_abbas = get_turbine_power_coefficent(floris_abbas_turbine, fmodel_abbas, wind_speeds) + + fmodel_VS_3 = FlorisModel("defaults") + fmodel_VS_3.set(layout_x = [0.0], layout_y = [0.0], wind_data = time_series, yaw_angles = yaw_angles) + fmodel_VS_3.set_operation_model(floris_VS_3_turbine) + fmodel_VS_3.run() + Ct_VS_3 = fmodel_VS_3.get_turbine_thrust_coefficients() + Cp_VS_3, P_VS_3 = get_turbine_power_coefficent(floris_VS_3_turbine, fmodel_VS_3, wind_speeds) + + fmodel_VS_1 = FlorisModel("defaults") + fmodel_VS_1.set(layout_x = [0.0], layout_y = [0.0], wind_data = time_series, yaw_angles = yaw_angles) + fmodel_VS_1.set_operation_model(floris_VS_1_turbine) + fmodel_VS_1.run() + Ct_VS_1 = fmodel_VS_1.get_turbine_thrust_coefficients() + Cp_VS_1, P_VS_1 = get_turbine_power_coefficent(floris_VS_1_turbine, fmodel_VS_1, wind_speeds) + + # plot CT values against one another and against IEA15MW from figure 3.1-C (https://docs.nlr.gov/docs/fy20osti/75698.pdf) + fig, (ax1, ax2, ax3) = plt.subplots(ncols = 3, sharey = False, figsize = (16,4), constrained_layout=True) + fig.suptitle(fr"$C_T$ and $C_P$ with Yaw = {yaw} for Different Control Strategies") + ax1.plot( + wind_speeds, Ct_default, label="FLORIS+MITROTOR + Gaertner et al. Control", + lw=3, linestyle = "solid", zorder = 1, + ) + ax1.plot( + wind_speeds, Ct_abbas, label="FLORIS+MITROTOR Abbas et al. Control", + lw=3, linestyle = "solid", zorder = 1, + ) + ax1.plot( + wind_speeds, Ct_VS_3, label="FLORIS+MITROTOR+ROSCO:VS_Control_Mode = 3", + lw=3, linestyle = "dashed", zorder = 1, + ) + ax1.plot(wind_speeds, Ct_VS_1, label="FLORIS+MITROTOR+ROSCO: VS_Control_Mode = 1", + lw=3, linestyle = "dotted", zorder = 1, + ) + ax1.set_xlabel("Wind Speed [m/s]") + ax1.set_ylabel("$C_T [-]$") + ax1.set_title("$C_T$") + ax1.grid(True) + + ax2.plot( + wind_speeds, Cp_default, label="Gaertner et al. IEA15MW Ref", + lw=3, linestyle = "solid", zorder = 1, + ) + ax2.plot( + wind_speeds, Cp_abbas, label="Abbas et al. ROSCO Control", + lw=3, linestyle = "solid", zorder = 1, + ) + ax2.plot( + wind_speeds, Cp_VS_3, label="FLORIS + MITROTOR + ROSCO:VS_Control_Mode = 3", + lw=3, linestyle = "dashed", zorder = 1, + ) + ax2.plot(wind_speeds, Cp_VS_1, label="FLORIS + MITROTOR + ROSCO: VS_Control_Mode = 1", + lw=3, linestyle = "dotted", zorder = 1, + ) + ax2.set_xlabel("Wind Speed [m/s]") + ax2.set_ylabel("$C_P [-]$") + ax2.set_title("$C_P$") + ax2.grid(True) + + ax3.plot( + wind_speeds, P_default, label="Gaertner et al. IEA15MW Ref", + lw=3, linestyle = "solid", zorder = 1, + ) + ax3.plot( + wind_speeds, P_abbas, label="Abbas et al. ROSCO Control", + lw=3, linestyle = "solid", zorder = 1, + ) + ax3.plot( + wind_speeds, P_VS_3, label="FLORIS + MITROTOR + ROSCO:VS_Control_Mode = 3", + lw=3, linestyle = "dashed", zorder = 1, + ) + ax3.plot(wind_speeds, P_VS_1, label="FLORIS + MITROTOR + ROSCO: VS_Control_Mode = 1", + lw=3, linestyle = "dotted", zorder = 1, + ) + ax3.axhline(y = 15, lw=3, linestyle = "dotted", zorder = 0, color = "k", label = "15MW") + ax3.set_xlabel("Wind Speed [m/s]") + ax3.set_ylabel("$Power [MW]$") + ax3.set_title("$Power$") + ax3.grid(True) + ax3.legend(loc = 'lower right') + + plt.savefig(figdir / "example_8_IEA15mw_CT_CP.png", dpi=300) + + # plot the difference in CT/CP curves for different yaw values + yaw_list = [0.0, 10.0, 20.0] # degrees + fig, (ax1, ax2, ax3) = plt.subplots(ncols = 3, sharey = False, figsize = (10,4), constrained_layout=True) + fig.suptitle(fr"$C_T$ and $C_P$ under Yaw for FLORIS + MITROTOR + ROSCO: VS_Control_Mode = 1") + for (i, yaw) in enumerate(yaw_list): + yaw_angles = [[yaw] for _ in np.arange(len(wind_speeds))] + fmodel_VS_1 = FlorisModel("defaults") + fmodel_VS_1.set(layout_x = [0.0], layout_y = [0.0], wind_data = time_series, yaw_angles = yaw_angles) + fmodel_VS_1.set_operation_model(floris_VS_1_turbine) + fmodel_VS_1.run() + ct = fmodel_VS_1.get_turbine_thrust_coefficients() + cp, p = get_turbine_power_coefficent(floris_VS_1_turbine, fmodel_VS_1, wind_speeds) + + ax1.plot(wind_speeds, ct, label=fr"Yaw = ${yaw}^\circ$", + lw=3, linestyle = "solid", zorder = 1, + ) + ax2.plot(wind_speeds, cp, label=fr"Yaw = ${yaw}^\circ$", + lw=3, linestyle = "solid", zorder = 1, + ) + ax3.plot(wind_speeds, p, label=fr"Yaw = ${yaw}^\circ$", + lw=3, linestyle = "solid", zorder = 1, + ) + + ax1.set_xlabel("Wind Speed [m/s]") + ax1.set_ylabel("$C_T [-]$") + ax1.set_title("$C_T$") + ax1.grid(True) + + ax2.set_xlabel("Wind Speed [m/s]") + ax2.set_ylabel("$C_P [-]$") + ax2.set_title("$C_P$") + ax2.grid(True) + + ax3.axhline(y = 15, lw=3, linestyle = "dotted", zorder = 0, color = "k", label = "15MW") + ax3.set_xlabel("Wind Speed [m/s]") + ax3.set_ylabel("$Power [MW]$") + ax3.set_title("$Power$") + ax3.grid(True) + ax3.legend() + plt.savefig(figdir / "example_8_IEA15mw_CT_CP_yawed.png", dpi=300) + + +if __name__ == "__main__": + main() \ No newline at end of file diff --git a/examples/examples_in/IEA15_TSR.csv b/examples/examples_in/IEA15_TSR.csv new file mode 100644 index 0000000..0c9e459 --- /dev/null +++ b/examples/examples_in/IEA15_TSR.csv @@ -0,0 +1,17 @@ +x,y +3.0474198047419803, 20.782122905027933 +3.7726638772663876, 16.75977653631285 +4.609483960948396, 13.743016759776536 +5.557880055788005, 11.396648044692737 +6.95258019525802, 9.050279329608937 +8.737796373779638, 8.938547486033519 +10.132496513249652, 8.938547486033519 +11.192468619246862, 8.491620111731843 +12.838214783821478, 7.374301675977653 +15.0139470013947, 6.256983240223463 +16.715481171548117, 5.58659217877095 +18.11018131101813, 5.251396648044692 +19.393305439330543, 4.804469273743017 +21.15062761506276, 4.4692737430167595 +22.517433751743376, 4.134078212290502 +25.0278940027894, 3.6871508379888267 \ No newline at end of file diff --git a/examples/examples_in/IEA15_pitch.csv b/examples/examples_in/IEA15_pitch.csv new file mode 100644 index 0000000..920d988 --- /dev/null +++ b/examples/examples_in/IEA15_pitch.csv @@ -0,0 +1,19 @@ +x,y +2.99163179916318, 4.022346368715084 +4.191073919107392, 3.4636871508379885 +5.306834030683403, 2.346368715083799 +6.199442119944212, 1.1173184357541899 +7.00836820083682, 0.11173184357541899 +8.235704323570433, -0.11173184357541899 +9.435146443514643, -0.11173184357541899 +10.076708507670851, 1.5642458100558658 +10.774058577405857, 3.0167597765363126 +11.248256624825663, 3.5754189944134076 +12.168758716875871, 6.033519553072625 +13.312412831241284, 8.491620111731843 +15.0418410041841, 11.396648044692737 +16.743375174337515, 13.631284916201116 +18.668061366806135, 16.089385474860336 +20.955369595536958, 18.65921787709497 +23.13110181311018, 21.11731843575419 +25.0836820083682, 23.01675977653631 \ No newline at end of file diff --git a/poetry.lock b/poetry.lock index 90b6fe8..ca33940 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,15 +1,15 @@ -# This file is automatically @generated by Poetry 2.4.1 and should not be changed by hand. +# This file is automatically @generated by Poetry 2.1.3 and should not be changed by hand. [[package]] name = "anyio" -version = "4.12.1" +version = "4.14.2" description = "High-level concurrency and networking framework on top of asyncio or Trio" optional = false -python-versions = ">=3.9" +python-versions = ">=3.10" groups = ["dev"] files = [ - {file = "anyio-4.12.1-py3-none-any.whl", hash = "sha256:d405828884fc140aa80a3c667b8beed277f1dfedec42ba031bd6ac3db606ab6c"}, - {file = "anyio-4.12.1.tar.gz", hash = "sha256:41cfcc3a4c85d3f05c932da7c26d0201ac36f72abd4435ba90d0464a3ffed703"}, + {file = "anyio-4.14.2-py3-none-any.whl", hash = "sha256:9f505dda5ac9f0c8309b5e8bd445a8c2bf7246f3ce950121e45ea15bc41d1494"}, + {file = "anyio-4.14.2.tar.gz", hash = "sha256:cfa139f3ed1a23ee8f88a145ddb5ac7605b8bbfd8592baacd7ce3d8bb4313c7f"}, ] [package.dependencies] @@ -18,7 +18,7 @@ idna = ">=2.8" typing_extensions = {version = ">=4.5", markers = "python_version < \"3.13\""} [package.extras] -trio = ["trio (>=0.31.0) ; python_version < \"3.10\"", "trio (>=0.32.0) ; python_version >= \"3.10\""] +trio = ["trio (>=0.32.0)"] [[package]] name = "appnope" @@ -112,14 +112,14 @@ test = ["dateparser (==1.*)", "pre-commit", "pytest", "pytest-cov", "pytest-mock [[package]] name = "asttokens" -version = "3.0.1" +version = "3.0.2" description = "Annotate AST trees with source code positions" optional = false python-versions = ">=3.8" groups = ["dev"] files = [ - {file = "asttokens-3.0.1-py3-none-any.whl", hash = "sha256:15a3ebc0f43c2d0a50eeafea25e19046c68398e487b9f1f5b517f7c0f40f976a"}, - {file = "asttokens-3.0.1.tar.gz", hash = "sha256:71a4ee5de0bde6a31d64f6b13f2293ac190344478f081c3d1bccfcf5eacb0cb7"}, + {file = "asttokens-3.0.2-py3-none-any.whl", hash = "sha256:9da13157f5b28becde0bd374fc677dcd3c290614264eff096f167c469cd9f933"}, + {file = "asttokens-3.0.2.tar.gz", hash = "sha256:3ecdbd8f2cc195f53ccada3a613538bb5f9ef6f6869129f13e03c30a677b8fe2"}, ] [package.extras] @@ -128,14 +128,14 @@ test = ["astroid (>=2,<5)", "pytest (<9.0)", "pytest-cov", "pytest-xdist"] [[package]] name = "async-lru" -version = "2.2.0" +version = "2.3.0" description = "Simple LRU cache for asyncio" optional = false python-versions = ">=3.10" groups = ["dev"] files = [ - {file = "async_lru-2.2.0-py3-none-any.whl", hash = "sha256:e2c1cf731eba202b59c5feedaef14ffd9d02ad0037fcda64938699f2c380eafe"}, - {file = "async_lru-2.2.0.tar.gz", hash = "sha256:80abae2a237dbc6c60861d621619af39f0d920aea306de34cb992c879e01370c"}, + {file = "async_lru-2.3.0-py3-none-any.whl", hash = "sha256:eea27b01841909316f2cc739807acea1c623df2be8c5cfad7583286397bb8315"}, + {file = "async_lru-2.3.0.tar.gz", hash = "sha256:89bdb258a0140d7313cf8f4031d816a042202faa61d0ab310a0a538baa1c24b6"}, ] [package.dependencies] @@ -143,14 +143,14 @@ typing_extensions = {version = ">=4.0.0", markers = "python_version < \"3.11\""} [[package]] name = "attrs" -version = "25.4.0" +version = "26.1.0" description = "Classes Without Boilerplate" optional = false python-versions = ">=3.9" -groups = ["dev"] +groups = ["dev", "floris"] files = [ - {file = "attrs-25.4.0-py3-none-any.whl", hash = "sha256:adcf7e2a1fb3b36ac48d97835bb6d8ade15b8dcce26aba8bf1d14847b57a3373"}, - {file = "attrs-25.4.0.tar.gz", hash = "sha256:16d5969b87f0859ef33a48b35d55ac1be6e42ae49d5e853b597db70c35c57e11"}, + {file = "attrs-26.1.0-py3-none-any.whl", hash = "sha256:c647aa4a12dfbad9333ca4e71fe62ddc36f4e63b2d260a37a8b83d2f043ac309"}, + {file = "attrs-26.1.0.tar.gz", hash = "sha256:d03ceb89cb322a8fd706d4fb91940737b6642aa36998fe130a9bc96c985eff32"}, ] [[package]] @@ -170,14 +170,14 @@ dev = ["backports.zoneinfo ; python_version < \"3.9\"", "freezegun (>=1.0,<2.0)" [[package]] name = "beautifulsoup4" -version = "4.14.3" +version = "4.15.0" description = "Screen-scraping library" optional = false python-versions = ">=3.7.0" groups = ["dev"] files = [ - {file = "beautifulsoup4-4.14.3-py3-none-any.whl", hash = "sha256:0918bfe44902e6ad8d57732ba310582e98da931428d231a5ecb9e7c703a735bb"}, - {file = "beautifulsoup4-4.14.3.tar.gz", hash = "sha256:6292b1c5186d356bba669ef9f7f051757099565ad9ada5dd630bd9de5fa7fb86"}, + {file = "beautifulsoup4-4.15.0-py3-none-any.whl", hash = "sha256:d6f88de62e1d4e38ecb1077eb9724cd0eff29d2a08ca16a401e9b9e93f117cf9"}, + {file = "beautifulsoup4-4.15.0.tar.gz", hash = "sha256:288e3ca7d54b06f2ac191970bc275c1939cb46d450b255bf6718b04aa37ab4f7"}, ] [package.dependencies] @@ -242,265 +242,438 @@ uvloop = ["uvloop (>=0.15.2)"] [[package]] name = "bleach" -version = "6.3.0" +version = "6.4.0" description = "An easy safelist-based HTML-sanitizing tool." optional = false python-versions = ">=3.10" groups = ["dev"] files = [ - {file = "bleach-6.3.0-py3-none-any.whl", hash = "sha256:fe10ec77c93ddf3d13a73b035abaac7a9f5e436513864ccdad516693213c65d6"}, - {file = "bleach-6.3.0.tar.gz", hash = "sha256:6f3b91b1c0a02bb9a78b5a454c92506aa0fdf197e1d5e114d2e00c6f64306d22"}, + {file = "bleach-6.4.0-py3-none-any.whl", hash = "sha256:4b6b6a54fff2e69a3dde9d21cc6301220bee3c3cb792187d11403fd795031081"}, + {file = "bleach-6.4.0.tar.gz", hash = "sha256:4202482733d85cedd04e59fcb2f89f4e4c7c385a78d3c3c23c30446843a37452"}, ] [package.dependencies] -tinycss2 = {version = ">=1.1.0,<1.5", optional = true, markers = "extra == \"css\""} +tinycss2 = {version = ">=1.1.0", optional = true, markers = "extra == \"css\""} webencodings = "*" [package.extras] -css = ["tinycss2 (>=1.1.0,<1.5)"] +css = ["tinycss2 (>=1.1.0)"] + +[[package]] +name = "cachebox" +version = "5.2.3" +description = "The fastest memoizing and caching Python library written in Rust" +optional = false +python-versions = ">=3.9" +groups = ["floris"] +files = [ + {file = "cachebox-5.2.3-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:c2c89720547271d36e10cad2c7302bbe11f46eb39eead0a2c321c2d371b8f8b6"}, + {file = "cachebox-5.2.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e7f33d24e90dc8aa26762e25898c91a1223b66685420a28a3628fa2e006924f5"}, + {file = "cachebox-5.2.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:56cb03ec6289a2ac5daf7422d755683324f02d821bfa796087100df2a7ebd5de"}, + {file = "cachebox-5.2.3-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:a71a71df463ba4c86bc843fa01c3a2a721033adefad888af28c6b65e1915a75c"}, + {file = "cachebox-5.2.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bbe4655371d19fc9f4f5874312bcb6e5b5b6182989979ac33d93c34c8d10c012"}, + {file = "cachebox-5.2.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4974476d1779961df89d6e6f79e6103a1659289d3ee11c92adcb52e236a8aaeb"}, + {file = "cachebox-5.2.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ad16d733219f4cab3eec6533af30ab7b9c919c6e3e22ad1ef4eb82629a62edef"}, + {file = "cachebox-5.2.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:12a9e0a93774ca2b3a9fe8a2a0d0812e399fac4af0fce6246a5bca1e7009b8fc"}, + {file = "cachebox-5.2.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:be89497a011eb7a638d13cc520244d77579c0f515b95bf759b3de0b90a015203"}, + {file = "cachebox-5.2.3-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:dd01fc0c1934cccb76493eb4b149a9232d299e5e0275f557adf875c3d25cec81"}, + {file = "cachebox-5.2.3-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:a0dfd97b0968f8bd48c33098a03d10f797964559c3a437c84bf97a9973545714"}, + {file = "cachebox-5.2.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:223ccf7ac60f595def258e7bc74c0b1d6f43991c9cae6d06749c803d22786d99"}, + {file = "cachebox-5.2.3-cp310-cp310-win32.whl", hash = "sha256:745b805fdd99931c3ce1d87d2ee21ca3fb62cba6b4e1f674907af87aad73dce4"}, + {file = "cachebox-5.2.3-cp310-cp310-win_amd64.whl", hash = "sha256:a87b19c0a3d8d665a9805b5b4afd64b40082395b70ebe2756131ed1edb0c8f02"}, + {file = "cachebox-5.2.3-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:996f49d04b234082530afcc650bdd00556afbebc19c6c0daaafb85950340cb3c"}, + {file = "cachebox-5.2.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:23a3300ebbb526fa12ce6fa53699002f5fba6da23b4bbbaf8ba8b18a3f03e6b3"}, + {file = "cachebox-5.2.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:79c63ee1589364caa04c018405e625d2e44e0bf9994f2715b2f322075d8c45b6"}, + {file = "cachebox-5.2.3-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ebd0f8d4ebc3943c1ddcbbdc54f1a8ddf95505c862ed5731319cebd1eb98ae41"}, + {file = "cachebox-5.2.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:569966efcc6309aa7d774443e3513cdbb8671efae0158138ba2ebb7d8cc9d8ed"}, + {file = "cachebox-5.2.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5774d06f0da37dd566239a4376d6ca8cf983d3e4c3228712ec22b4130f662f21"}, + {file = "cachebox-5.2.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ae5bf8755bc66bcf42e7ca5c42d703a041a7aaad58f9a0c3be54d5b1cefd2641"}, + {file = "cachebox-5.2.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:63f061cc6a5ca70bbce2e6be0588fe2fee00a93a1b0581b1086d54b10288cdb6"}, + {file = "cachebox-5.2.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:577c781f18b559f4dc9eea176c6aed008843ef4b8e045cf61bb519e09dccc9ef"}, + {file = "cachebox-5.2.3-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:7f691e25572a3ddbb018e19d796f774713bd6b0f7ce9be2e71f6e18572de264a"}, + {file = "cachebox-5.2.3-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:33368adf86669c29b936fbae5d6219cf90aacd4b1db71dae2e23d584a8219cd6"}, + {file = "cachebox-5.2.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:38ce67b7b45713e49459a09411d07f82de04022c04aecde6202cd32f934c2b1f"}, + {file = "cachebox-5.2.3-cp311-cp311-win32.whl", hash = "sha256:a7cd2c81347063ab6c512d0f569aeb5f75fc2dfe686c8486258ffd08052324f4"}, + {file = "cachebox-5.2.3-cp311-cp311-win_amd64.whl", hash = "sha256:7e45798d6b969794840bb302857946d710ecb32af78dfcb3ab40f4e68ee7fdaf"}, + {file = "cachebox-5.2.3-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:09c0340e9daa7b4530801e5a570cb0c1a1ad941a85d245d360020d3986d0e787"}, + {file = "cachebox-5.2.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f3162758792626685ec34950eedd565d015b115d0ff0d751d2716031fc32d51b"}, + {file = "cachebox-5.2.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a189a780c3ccd7b9d157074ba6bf3e191e522b39abbdb590075111851f02d50d"}, + {file = "cachebox-5.2.3-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:410b67baa99d433644199b11289627f7ebba4ee5786f95ca9858f238afcee157"}, + {file = "cachebox-5.2.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f81474dc19d3865fa5e57263f834bc6bbc00e471a594fb9d934ed552732c02fd"}, + {file = "cachebox-5.2.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:85ccd827193b3e3e887a88a16b88ef7ed174e7e65be515b5253322aa75e665c3"}, + {file = "cachebox-5.2.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2a1e7d3cb8a5e7e68996a8619e3ef8771a124d14568c251f9e586eba88d759c1"}, + {file = "cachebox-5.2.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:adcedfcfcb933b21e7fdcfe560c79887bc8287abceab0586aa3730417dd0277d"}, + {file = "cachebox-5.2.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:c7f0c72c51a3a9e7049ea6ff2a43cd3877ab7fee966eb65771a59621563b75e3"}, + {file = "cachebox-5.2.3-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:c48c10e498d573511aafbd545570e7f43b40a7428dc282183bf5adc334d9e1a8"}, + {file = "cachebox-5.2.3-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:2f1e086ab5ffd082a68bb63699d517655a59b06414927bfc84e01df91b81e34d"}, + {file = "cachebox-5.2.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:649d18399f13735bb82daa33800196f815529c49e967767c40ca221723e68afa"}, + {file = "cachebox-5.2.3-cp312-cp312-win32.whl", hash = "sha256:0a17aeb4e5b1c6ef1c3db8fc5186f9986e215ba5ea5a5d08baa45bcf55f261b2"}, + {file = "cachebox-5.2.3-cp312-cp312-win_amd64.whl", hash = "sha256:cfd69114141ab362acaa2099e425a1b965cf7b021a539a4e953143d593930b74"}, + {file = "cachebox-5.2.3-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:9527c5c70f8735f2d696331d8bcf77254f03b4dc8542046807823bd36ed4e8ba"}, + {file = "cachebox-5.2.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:40ac878af00d5969862c1f6bc076de1e34ca248662fce6aecca1761f52e33e32"}, + {file = "cachebox-5.2.3-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b5ff26bfd8f7e95b3becf6d5f65c25edaca50fa68078868648b70d79bcccc260"}, + {file = "cachebox-5.2.3-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:82e7002dd343afeeba2fcf0e483131b342a27ec3bc34b2214dc617691bda40d6"}, + {file = "cachebox-5.2.3-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ccbdc54a6c4b5758408c1083bdfa217bd382894a8331c7d0a54b84ba0cf51e5b"}, + {file = "cachebox-5.2.3-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:df5135a168f143d186b1cc3be0ca16b66446897ab5cedc03bd80bcc926fcd403"}, + {file = "cachebox-5.2.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10bedf96db8f9766cc956f9adcc623e604264e5d6fa2e255432f8c2ed7519143"}, + {file = "cachebox-5.2.3-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f22732d0d69bb84ad2dca7480bffdfd0430c647152d488936e152ecbbfee52fb"}, + {file = "cachebox-5.2.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:26ae0b68979204d360327f4c0725cfdc95cfc34ab73ab1a8f528e3bd2f6d023c"}, + {file = "cachebox-5.2.3-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:f3d628b816e28a6e7661d460e02dd5b421247cc2cd275814f80ea79621245fc4"}, + {file = "cachebox-5.2.3-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:64057caa6b741320655cd3c5997fe642dae5dbff571eb530e6f53e58272bb43b"}, + {file = "cachebox-5.2.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:fa325306084aa2dc0b21e07723d7700f4d43dece3732c7fdaf7a269dc5e35aa7"}, + {file = "cachebox-5.2.3-cp313-cp313-win32.whl", hash = "sha256:55003089d21c2f5515089c307be063b45558e884a4a1cc9593944374c89975c4"}, + {file = "cachebox-5.2.3-cp313-cp313-win_amd64.whl", hash = "sha256:dcc5edb6ecf2b516e90b773d232360c5e4ed8fdcda038b19441da2ed9cf208ab"}, + {file = "cachebox-5.2.3-cp313-cp313t-macosx_10_12_x86_64.whl", hash = "sha256:a4b7559fa4994c4032dd07466c2041d57e055feb814762e1f73f4e8beef188d0"}, + {file = "cachebox-5.2.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:f57afada3d9327adf87f3b5cf0094348c6fd49354ab2e9bd20b044648eb094ae"}, + {file = "cachebox-5.2.3-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8342ff350ce86f062492752d612e9f056ac5dc56375713d75c3bf6e83b4d18db"}, + {file = "cachebox-5.2.3-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:405f9cc8492fc9d953b5a6b9e2b661e99583755c6639ab8d09a287fdf336503c"}, + {file = "cachebox-5.2.3-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:94aae393ec1d9b26565d346445bb6afa3963d2a0d3eb5e4188d0e510fab871a0"}, + {file = "cachebox-5.2.3-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a8b0b575066fc09f6fae0d4bd30d6ff56584a6870cbe7d202916c5e0d725cfd4"}, + {file = "cachebox-5.2.3-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:41e99c1240106d39b63ce7868a6cd8c9da9243fef08848b85d428164e0769fd2"}, + {file = "cachebox-5.2.3-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:432ca62b99f7eafc21af669d76c88c1b7377db179b89fb6fca3ea93b8f9fff19"}, + {file = "cachebox-5.2.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:e51d9c59006b53447f806145406eb37a7fc3c25553d4fd24c3887f3b268d214e"}, + {file = "cachebox-5.2.3-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:5e48a405f699fb001b8af120a6e0b4a981277f84eb5dd66a1faa21e4b6fe9485"}, + {file = "cachebox-5.2.3-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:8cbfc007ea78af61d75d7d26e5854df53dc5da6877d074afd4b4696c074f4ee7"}, + {file = "cachebox-5.2.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:6a94d0da8133b3a0707ae11c9ea321f8fc37e3b5a14517019a05d632218b0f56"}, + {file = "cachebox-5.2.3-cp313-cp313t-win32.whl", hash = "sha256:5fee33549877c03c2494ec5359a57a7667f872fe8e296a7f39d3dfe08dd3914c"}, + {file = "cachebox-5.2.3-cp313-cp313t-win_amd64.whl", hash = "sha256:67548a05cd41fcc4f7af80a2f97f742fef3d436537ac2e1a1dce0fcba5d41190"}, + {file = "cachebox-5.2.3-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:37fa0891f0defee053c09f5f43f802f731e36e6e6ca055d7d174af07f77232ca"}, + {file = "cachebox-5.2.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:dc6315902f2ef4afbf10bc8e08c54ff34de5ce124546b8e0016c9b0d327be21e"}, + {file = "cachebox-5.2.3-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7df1735ca778480d51b8232fed397ffe3935158f20d34fb1c5ed171b53d5a6e2"}, + {file = "cachebox-5.2.3-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e22451cde8f884051e941b21870e4fc91fcf58d0d8c285bb8964107e1f02445c"}, + {file = "cachebox-5.2.3-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:dcbccf3015d9a42bcf41260fa5cc048a5bdb75aa10997d514d6c976117f30ee2"}, + {file = "cachebox-5.2.3-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:311eae5079e256cbbfafdc3dcff1714b6598a767f9c1ef8c3709e74ea0cc12b0"}, + {file = "cachebox-5.2.3-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1f4d2a80a5cd3380739c67f7d89e596634f5897b8d5a4a3dc1598312cb077535"}, + {file = "cachebox-5.2.3-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:3977515b727a5203f494c44c4566fb936c4b940351c01d3d8e7b5d104dff4f53"}, + {file = "cachebox-5.2.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:c5be17dd5c4fabcfecd5bcf6d54f9c6fb719daed3ef01ac1c03a14af0e2b26c1"}, + {file = "cachebox-5.2.3-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:6d37334fc218fdaee31db8a4f938938716e7c3b1b4059e25de27c8447fc95fde"}, + {file = "cachebox-5.2.3-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:1e5f1b7e23411b748d919348c3b65db1f9f8927ab8f6f3acae19bd617543df2d"}, + {file = "cachebox-5.2.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:e7b06a75a898b31fd73c4d8bf727a9b9f8b5b7738cccd0ab5e6fd2a9cf659d3c"}, + {file = "cachebox-5.2.3-cp314-cp314-win32.whl", hash = "sha256:3b798052719f09a2ce7bf9fa9452dc0a7d4dc53b50a2d3aba6ce6ebc12d39df7"}, + {file = "cachebox-5.2.3-cp314-cp314-win_amd64.whl", hash = "sha256:4afc8b8575e3228a42ad8d819de5fbbecc6bd0b521295966b00244be37ae3b9b"}, + {file = "cachebox-5.2.3-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:0e8a34b82be30d3d9fb7dfaf9a86ec2b3ab9bc264715909ef27fc3d3587324d2"}, + {file = "cachebox-5.2.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:4d4e336aebf866463878ccd28a4d0ef4003ea216708cf4a02a7f198481b3af81"}, + {file = "cachebox-5.2.3-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8b102fcdd97b0602bf5d6ba1a571bba3e3d6fa912b89fd768b0da5427408eab8"}, + {file = "cachebox-5.2.3-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:245a79fb2c5d3bff252f4263f76210ef3ad7c2ff9b0234859b26974830a80491"}, + {file = "cachebox-5.2.3-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:dd0e8dbd8fd4cf664c645c08f9e10508e133353756705c4a738e90a5406224b5"}, + {file = "cachebox-5.2.3-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fdb74294bdc33e39e26606919a9b2229038d5fac0edb80c9056683c08584d4a9"}, + {file = "cachebox-5.2.3-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bba3e9a7f52fa196b434522f39675f3b32a076976ef2373ded6f1065e99f4d20"}, + {file = "cachebox-5.2.3-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:abb21f0f937fb66528f1b9f1a04874d6aa503e78bbb26f4cf33bf67faddbdd68"}, + {file = "cachebox-5.2.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:dab6fd3189b0c746fb03e1915fd947aaca9112cedf26ef3a0c39383acf87d2e5"}, + {file = "cachebox-5.2.3-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:b4e7d2935b9df11d3717f99c7237b6780f1f8c70e6a99b69b8430d89929ec825"}, + {file = "cachebox-5.2.3-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:611aa260fe1b2506330ff72f415e2cb4053c9c4e3776ac68fe2eedee0e1b91b1"}, + {file = "cachebox-5.2.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:a424ffb8514a9cb49bacff7995b7c767625cb2239692bd6524245e8579e375cc"}, + {file = "cachebox-5.2.3-cp314-cp314t-win32.whl", hash = "sha256:83988dd8e9075ee837e8407e26db49a9944ae74924d5db57b477444d7d98622c"}, + {file = "cachebox-5.2.3-cp314-cp314t-win_amd64.whl", hash = "sha256:dbda6390fa5070a19157ae35ab8066d3fe468634e0e9e21452c68ce7999c7d0c"}, + {file = "cachebox-5.2.3-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:c798cddfb780156db09d3d96ed5da4c2d5fc01dad4bc7b54db5b20c34f221926"}, + {file = "cachebox-5.2.3-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:c8f3de4afeb3fd721620be3d02f2338bcbc3fdbd464ca14e1c474088c9669db0"}, + {file = "cachebox-5.2.3-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b39022c258872185327acffa9ad42d6bdf42f37d006d35c825a684eb5fa98d40"}, + {file = "cachebox-5.2.3-pp311-pypy311_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5a0599fb85dcb6df9a86502435643fe90c793bbcd50b5d85217c70f2bc2e38fc"}, + {file = "cachebox-5.2.3-pp311-pypy311_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3cdbe8f1b7716a44dc82ef3a6830a612260c7379478cfa80804632e2e6252b8e"}, + {file = "cachebox-5.2.3-pp311-pypy311_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:783d1b9a0b3c77c43e7ae331b9d6561ad75827e16b2484e2a6cc289ec4d392ee"}, + {file = "cachebox-5.2.3-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5c6476a2a842906fee782d92f8fbcb03ecfd22eecc39adb7fb5b047d7e1cf020"}, + {file = "cachebox-5.2.3-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:184bbcfa1370415b6d1f09e4fb74ab697dac8df09f522aa217a2fac65f973744"}, + {file = "cachebox-5.2.3-pp311-pypy311_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:f89df36b46f8f5e11c0c49701ec3cebddf51191f96afb7bb75c394faf3c1cbc8"}, + {file = "cachebox-5.2.3-pp311-pypy311_pp73-musllinux_1_2_armv7l.whl", hash = "sha256:fb0bdcd9e28686e3b91d5210c843542858f0f10de151181aee27a7978fe4992e"}, + {file = "cachebox-5.2.3-pp311-pypy311_pp73-musllinux_1_2_i686.whl", hash = "sha256:5196f0d2c2f99c92ddf0d2c37803ff90509d14a5df211b7754feb8b61ffd8740"}, + {file = "cachebox-5.2.3-pp311-pypy311_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:73671850d8c3634ab217398c83715d3feb52589ec97bd8e2f4d22e472741ea48"}, + {file = "cachebox-5.2.3-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:70c718f6bb77e6ba142b9a055b81ce85412a0c0e5e82a154489b45e6f91d09ec"}, + {file = "cachebox-5.2.3.tar.gz", hash = "sha256:b1f68246685aa739bbbd2734befb1465363a1e1042407c154feadb065f17a099"}, +] [[package]] name = "certifi" -version = "2026.2.25" +version = "2026.7.22" description = "Python package for providing Mozilla's CA Bundle." optional = false python-versions = ">=3.7" -groups = ["dev"] +groups = ["dev", "floris"] files = [ - {file = "certifi-2026.2.25-py3-none-any.whl", hash = "sha256:027692e4402ad994f1c42e52a4997a9763c646b73e4096e4d5d6db8af1d6f0fa"}, - {file = "certifi-2026.2.25.tar.gz", hash = "sha256:e887ab5cee78ea814d3472169153c2d12cd43b14bd03329a39a9c6e2e80bfba7"}, + {file = "certifi-2026.7.22-py3-none-any.whl", hash = "sha256:62f22742b58a1a33014a2b6b706588a8d7e2a88ae7bd1a6ebe8c992928483775"}, + {file = "certifi-2026.7.22.tar.gz", hash = "sha256:741e2c3b351ddf169a738da9f2c048608ff7f2c5cc02f1ebc6b118bb090d5d55"}, ] [[package]] name = "cffi" -version = "2.0.0" +version = "2.1.1" description = "Foreign Function Interface for Python calling C code." optional = false -python-versions = ">=3.9" -groups = ["dev"] -files = [ - {file = "cffi-2.0.0-cp310-cp310-macosx_10_13_x86_64.whl", hash = "sha256:0cf2d91ecc3fcc0625c2c530fe004f82c110405f101548512cce44322fa8ac44"}, - {file = "cffi-2.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f73b96c41e3b2adedc34a7356e64c8eb96e03a3782b535e043a986276ce12a49"}, - {file = "cffi-2.0.0-cp310-cp310-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:53f77cbe57044e88bbd5ed26ac1d0514d2acf0591dd6bb02a3ae37f76811b80c"}, - {file = "cffi-2.0.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:3e837e369566884707ddaf85fc1744b47575005c0a229de3327f8f9a20f4efeb"}, - {file = "cffi-2.0.0-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:5eda85d6d1879e692d546a078b44251cdd08dd1cfb98dfb77b670c97cee49ea0"}, - {file = "cffi-2.0.0-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:9332088d75dc3241c702d852d4671613136d90fa6881da7d770a483fd05248b4"}, - {file = "cffi-2.0.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:fc7de24befaeae77ba923797c7c87834c73648a05a4bde34b3b7e5588973a453"}, - {file = "cffi-2.0.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:cf364028c016c03078a23b503f02058f1814320a56ad535686f90565636a9495"}, - {file = "cffi-2.0.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:e11e82b744887154b182fd3e7e8512418446501191994dbf9c9fc1f32cc8efd5"}, - {file = "cffi-2.0.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:8ea985900c5c95ce9db1745f7933eeef5d314f0565b27625d9a10ec9881e1bfb"}, - {file = "cffi-2.0.0-cp310-cp310-win32.whl", hash = "sha256:1f72fb8906754ac8a2cc3f9f5aaa298070652a0ffae577e0ea9bd480dc3c931a"}, - {file = "cffi-2.0.0-cp310-cp310-win_amd64.whl", hash = "sha256:b18a3ed7d5b3bd8d9ef7a8cb226502c6bf8308df1525e1cc676c3680e7176739"}, - {file = "cffi-2.0.0-cp311-cp311-macosx_10_13_x86_64.whl", hash = "sha256:b4c854ef3adc177950a8dfc81a86f5115d2abd545751a304c5bcf2c2c7283cfe"}, - {file = "cffi-2.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2de9a304e27f7596cd03d16f1b7c72219bd944e99cc52b84d0145aefb07cbd3c"}, - {file = "cffi-2.0.0-cp311-cp311-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:baf5215e0ab74c16e2dd324e8ec067ef59e41125d3eade2b863d294fd5035c92"}, - {file = "cffi-2.0.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:730cacb21e1bdff3ce90babf007d0a0917cc3e6492f336c2f0134101e0944f93"}, - {file = "cffi-2.0.0-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:6824f87845e3396029f3820c206e459ccc91760e8fa24422f8b0c3d1731cbec5"}, - {file = "cffi-2.0.0-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:9de40a7b0323d889cf8d23d1ef214f565ab154443c42737dfe52ff82cf857664"}, - {file = "cffi-2.0.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:8941aaadaf67246224cee8c3803777eed332a19d909b47e29c9842ef1e79ac26"}, - {file = "cffi-2.0.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:a05d0c237b3349096d3981b727493e22147f934b20f6f125a3eba8f994bec4a9"}, - {file = "cffi-2.0.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:94698a9c5f91f9d138526b48fe26a199609544591f859c870d477351dc7b2414"}, - {file = "cffi-2.0.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:5fed36fccc0612a53f1d4d9a816b50a36702c28a2aa880cb8a122b3466638743"}, - {file = "cffi-2.0.0-cp311-cp311-win32.whl", hash = "sha256:c649e3a33450ec82378822b3dad03cc228b8f5963c0c12fc3b1e0ab940f768a5"}, - {file = "cffi-2.0.0-cp311-cp311-win_amd64.whl", hash = "sha256:66f011380d0e49ed280c789fbd08ff0d40968ee7b665575489afa95c98196ab5"}, - {file = "cffi-2.0.0-cp311-cp311-win_arm64.whl", hash = "sha256:c6638687455baf640e37344fe26d37c404db8b80d037c3d29f58fe8d1c3b194d"}, - {file = "cffi-2.0.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:6d02d6655b0e54f54c4ef0b94eb6be0607b70853c45ce98bd278dc7de718be5d"}, - {file = "cffi-2.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8eca2a813c1cb7ad4fb74d368c2ffbbb4789d377ee5bb8df98373c2cc0dee76c"}, - {file = "cffi-2.0.0-cp312-cp312-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:21d1152871b019407d8ac3985f6775c079416c282e431a4da6afe7aefd2bccbe"}, - {file = "cffi-2.0.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:b21e08af67b8a103c71a250401c78d5e0893beff75e28c53c98f4de42f774062"}, - {file = "cffi-2.0.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:1e3a615586f05fc4065a8b22b8152f0c1b00cdbc60596d187c2a74f9e3036e4e"}, - {file = "cffi-2.0.0-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:81afed14892743bbe14dacb9e36d9e0e504cd204e0b165062c488942b9718037"}, - {file = "cffi-2.0.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:3e17ed538242334bf70832644a32a7aae3d83b57567f9fd60a26257e992b79ba"}, - {file = "cffi-2.0.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:3925dd22fa2b7699ed2617149842d2e6adde22b262fcbfada50e3d195e4b3a94"}, - {file = "cffi-2.0.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:2c8f814d84194c9ea681642fd164267891702542f028a15fc97d4674b6206187"}, - {file = "cffi-2.0.0-cp312-cp312-win32.whl", hash = "sha256:da902562c3e9c550df360bfa53c035b2f241fed6d9aef119048073680ace4a18"}, - {file = "cffi-2.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:da68248800ad6320861f129cd9c1bf96ca849a2771a59e0344e88681905916f5"}, - {file = "cffi-2.0.0-cp312-cp312-win_arm64.whl", hash = "sha256:4671d9dd5ec934cb9a73e7ee9676f9362aba54f7f34910956b84d727b0d73fb6"}, - {file = "cffi-2.0.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:00bdf7acc5f795150faa6957054fbbca2439db2f775ce831222b66f192f03beb"}, - {file = "cffi-2.0.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:45d5e886156860dc35862657e1494b9bae8dfa63bf56796f2fb56e1679fc0bca"}, - {file = "cffi-2.0.0-cp313-cp313-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:07b271772c100085dd28b74fa0cd81c8fb1a3ba18b21e03d7c27f3436a10606b"}, - {file = "cffi-2.0.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:d48a880098c96020b02d5a1f7d9251308510ce8858940e6fa99ece33f610838b"}, - {file = "cffi-2.0.0-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:f93fd8e5c8c0a4aa1f424d6173f14a892044054871c771f8566e4008eaa359d2"}, - {file = "cffi-2.0.0-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:dd4f05f54a52fb558f1ba9f528228066954fee3ebe629fc1660d874d040ae5a3"}, - {file = "cffi-2.0.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:c8d3b5532fc71b7a77c09192b4a5a200ea992702734a2e9279a37f2478236f26"}, - {file = "cffi-2.0.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:d9b29c1f0ae438d5ee9acb31cadee00a58c46cc9c0b2f9038c6b0b3470877a8c"}, - {file = "cffi-2.0.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6d50360be4546678fc1b79ffe7a66265e28667840010348dd69a314145807a1b"}, - {file = "cffi-2.0.0-cp313-cp313-win32.whl", hash = "sha256:74a03b9698e198d47562765773b4a8309919089150a0bb17d829ad7b44b60d27"}, - {file = "cffi-2.0.0-cp313-cp313-win_amd64.whl", hash = "sha256:19f705ada2530c1167abacb171925dd886168931e0a7b78f5bffcae5c6b5be75"}, - {file = "cffi-2.0.0-cp313-cp313-win_arm64.whl", hash = "sha256:256f80b80ca3853f90c21b23ee78cd008713787b1b1e93eae9f3d6a7134abd91"}, - {file = "cffi-2.0.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:fc33c5141b55ed366cfaad382df24fe7dcbc686de5be719b207bb248e3053dc5"}, - {file = "cffi-2.0.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:c654de545946e0db659b3400168c9ad31b5d29593291482c43e3564effbcee13"}, - {file = "cffi-2.0.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:24b6f81f1983e6df8db3adc38562c83f7d4a0c36162885ec7f7b77c7dcbec97b"}, - {file = "cffi-2.0.0-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:12873ca6cb9b0f0d3a0da705d6086fe911591737a59f28b7936bdfed27c0d47c"}, - {file = "cffi-2.0.0-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:d9b97165e8aed9272a6bb17c01e3cc5871a594a446ebedc996e2397a1c1ea8ef"}, - {file = "cffi-2.0.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:afb8db5439b81cf9c9d0c80404b60c3cc9c3add93e114dcae767f1477cb53775"}, - {file = "cffi-2.0.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:737fe7d37e1a1bffe70bd5754ea763a62a066dc5913ca57e957824b72a85e205"}, - {file = "cffi-2.0.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:38100abb9d1b1435bc4cc340bb4489635dc2f0da7456590877030c9b3d40b0c1"}, - {file = "cffi-2.0.0-cp314-cp314-win32.whl", hash = "sha256:087067fa8953339c723661eda6b54bc98c5625757ea62e95eb4898ad5e776e9f"}, - {file = "cffi-2.0.0-cp314-cp314-win_amd64.whl", hash = "sha256:203a48d1fb583fc7d78a4c6655692963b860a417c0528492a6bc21f1aaefab25"}, - {file = "cffi-2.0.0-cp314-cp314-win_arm64.whl", hash = "sha256:dbd5c7a25a7cb98f5ca55d258b103a2054f859a46ae11aaf23134f9cc0d356ad"}, - {file = "cffi-2.0.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:9a67fc9e8eb39039280526379fb3a70023d77caec1852002b4da7e8b270c4dd9"}, - {file = "cffi-2.0.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:7a66c7204d8869299919db4d5069a82f1561581af12b11b3c9f48c584eb8743d"}, - {file = "cffi-2.0.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:7cc09976e8b56f8cebd752f7113ad07752461f48a58cbba644139015ac24954c"}, - {file = "cffi-2.0.0-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:92b68146a71df78564e4ef48af17551a5ddd142e5190cdf2c5624d0c3ff5b2e8"}, - {file = "cffi-2.0.0-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:b1e74d11748e7e98e2f426ab176d4ed720a64412b6a15054378afdb71e0f37dc"}, - {file = "cffi-2.0.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:28a3a209b96630bca57cce802da70c266eb08c6e97e5afd61a75611ee6c64592"}, - {file = "cffi-2.0.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:7553fb2090d71822f02c629afe6042c299edf91ba1bf94951165613553984512"}, - {file = "cffi-2.0.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:6c6c373cfc5c83a975506110d17457138c8c63016b563cc9ed6e056a82f13ce4"}, - {file = "cffi-2.0.0-cp314-cp314t-win32.whl", hash = "sha256:1fc9ea04857caf665289b7a75923f2c6ed559b8298a1b8c49e59f7dd95c8481e"}, - {file = "cffi-2.0.0-cp314-cp314t-win_amd64.whl", hash = "sha256:d68b6cef7827e8641e8ef16f4494edda8b36104d79773a334beaa1e3521430f6"}, - {file = "cffi-2.0.0-cp314-cp314t-win_arm64.whl", hash = "sha256:0a1527a803f0a659de1af2e1fd700213caba79377e27e4693648c2923da066f9"}, - {file = "cffi-2.0.0-cp39-cp39-macosx_10_13_x86_64.whl", hash = "sha256:fe562eb1a64e67dd297ccc4f5addea2501664954f2692b69a76449ec7913ecbf"}, - {file = "cffi-2.0.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:de8dad4425a6ca6e4e5e297b27b5c824ecc7581910bf9aee86cb6835e6812aa7"}, - {file = "cffi-2.0.0-cp39-cp39-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:4647afc2f90d1ddd33441e5b0e85b16b12ddec4fca55f0d9671fef036ecca27c"}, - {file = "cffi-2.0.0-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:3f4d46d8b35698056ec29bca21546e1551a205058ae1a181d871e278b0b28165"}, - {file = "cffi-2.0.0-cp39-cp39-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:e6e73b9e02893c764e7e8d5bb5ce277f1a009cd5243f8228f75f842bf937c534"}, - {file = "cffi-2.0.0-cp39-cp39-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:cb527a79772e5ef98fb1d700678fe031e353e765d1ca2d409c92263c6d43e09f"}, - {file = "cffi-2.0.0-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:61d028e90346df14fedc3d1e5441df818d095f3b87d286825dfcbd6459b7ef63"}, - {file = "cffi-2.0.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:0f6084a0ea23d05d20c3edcda20c3d006f9b6f3fefeac38f59262e10cef47ee2"}, - {file = "cffi-2.0.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:1cd13c99ce269b3ed80b417dcd591415d3372bcac067009b6e0f59c7d4015e65"}, - {file = "cffi-2.0.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:89472c9762729b5ae1ad974b777416bfda4ac5642423fa93bd57a09204712322"}, - {file = "cffi-2.0.0-cp39-cp39-win32.whl", hash = "sha256:2081580ebb843f759b9f617314a24ed5738c51d2aee65d31e02f6f7a2b97707a"}, - {file = "cffi-2.0.0-cp39-cp39-win_amd64.whl", hash = "sha256:b882b3df248017dba09d6b16defe9b5c407fe32fc7c65a9c69798e6175601be9"}, - {file = "cffi-2.0.0.tar.gz", hash = "sha256:44d1b5909021139fe36001ae048dbdde8214afa20200eda0f64c068cac5d5529"}, -] +python-versions = ">=3.10" +groups = ["dev", "floris"] +files = [ + {file = "cffi-2.1.1-cp310-cp310-macosx_10_15_x86_64.whl", hash = "sha256:baed1e86cc735622097354b9d1281406caf42ff42a886d29faa8e8d1630333be"}, + {file = "cffi-2.1.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ca82be1a1d406ecfe1d25dc16cb33488e5a16bf4438c9fb590484ea29d92478b"}, + {file = "cffi-2.1.1-cp310-cp310-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:42e2f76b9455f5a9a844f770bf3e200ed3da0e15f5df3db9c31fe80b04b3d004"}, + {file = "cffi-2.1.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:5a59cc1c4442bc3d5c703bf720b51138d0bfc173618807c9ee2490a7541dd3d9"}, + {file = "cffi-2.1.1-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:9f8d177621de5cb38ee3e731eda45d421db093ec0739f46a5594babda7987a98"}, + {file = "cffi-2.1.1-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:75f80557d1389eddbd0de2681f6a390a0c5338c31ddaa821381c203fc3fd50d9"}, + {file = "cffi-2.1.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:194cffa889098ced9976c3fc6340305e43f6303657d298da55366907c05c22d6"}, + {file = "cffi-2.1.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:5bb4e7ea95dcd6a014a6fef62e62467d67d8e582326443f3d68e71d6320a9fcf"}, + {file = "cffi-2.1.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:3d22a20b1fb1632cc72c22f95f7b0d2961c3e1c235f245ba4c606c4771035659"}, + {file = "cffi-2.1.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:1dea0e4d7d4f11f619fe8c1d76caf49e24405b4b5743c0e3be16a500ecd930c9"}, + {file = "cffi-2.1.1-cp310-cp310-win32.whl", hash = "sha256:7ce713ace7c0e4520535b42b77eaa742c16dab813978064913e5a3cf82973b41"}, + {file = "cffi-2.1.1-cp310-cp310-win_amd64.whl", hash = "sha256:a48d62ab9d6f4f98c983223a547af44be6ca3691074c31cecced6facd3ba2dc1"}, + {file = "cffi-2.1.1-cp311-cp311-macosx_10_15_x86_64.whl", hash = "sha256:c8d2c9fd1f2d16f780d15127abb050d13d1a76c03a4bd87d7e4980e45e511e12"}, + {file = "cffi-2.1.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:398aff33cee2767e3e781d2554c54bd0dff386bb437581e0d8011fde1a942ec1"}, + {file = "cffi-2.1.1-cp311-cp311-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:154852545011f779917b11c78db2358d095da62a9a172b78ad0a583ee5adc0d0"}, + {file = "cffi-2.1.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:3311ed60d36f83378794e1009ac6258bafbf81f7888b4caa7b35a521e3f95813"}, + {file = "cffi-2.1.1-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:6e192623c49c94421616a5778fba35cf0d5a8d000650c1967ef4448ee5cdd990"}, + {file = "cffi-2.1.1-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:a6e721d4b0e45d5b65e87534470e67b18dcd092c83f68fba09f152b9cbc061af"}, + {file = "cffi-2.1.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:34e261f78cb6ceaaa36f42f2613f4380d94d9c759a9c73c769ee6e0247364632"}, + {file = "cffi-2.1.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:7225e4514edb64eb6740324353e0da0711954fd8d7da4576755b1c6e09b697cd"}, + {file = "cffi-2.1.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:df913725b79db7bcf03448f36b7bf8815363417d5b58deecf9305e3e30f0f21a"}, + {file = "cffi-2.1.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f5cfbc5fe74540d335175b656c725d74d90e3730c626d92575eea35029d9afaa"}, + {file = "cffi-2.1.1-cp311-cp311-win32.whl", hash = "sha256:f8ec5e643a9a937f64e1999eb9f75d072263751912dc5cd06d3c85f8f44be7c3"}, + {file = "cffi-2.1.1-cp311-cp311-win_amd64.whl", hash = "sha256:42f6930c31dc7f50732c9ae793c2786c7b6b044195967bbdde40bb9be81c4cc0"}, + {file = "cffi-2.1.1-cp311-cp311-win_arm64.whl", hash = "sha256:c7659f22557c5a0bc4855cd635f55edec690cc008a40768527762cb9fb263455"}, + {file = "cffi-2.1.1-cp312-cp312-macosx_10_15_x86_64.whl", hash = "sha256:c8c69575568085ba0b1b10c0249d779a214aea6f6522e949a0fc9fb0fcb449d0"}, + {file = "cffi-2.1.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f81b3b8f3d4e343550fa4baa0e479bba9f2d29ce9c2e9b51d1ce1718d7442fcf"}, + {file = "cffi-2.1.1-cp312-cp312-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:811bd1e21d32de12efca32393a0ab3f5133b54fce9bd44b8bd77ab07da14bf6a"}, + {file = "cffi-2.1.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:68e62fe11f30d5ca8289242866f0a5291402d8529ca2178ab8afc5c9694ae890"}, + {file = "cffi-2.1.1-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:4a7c934f7360e8cd64fe9efadcbd10c7c6364f531e432b9a4bf5ccbc9e0e8b50"}, + {file = "cffi-2.1.1-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:3143d81e29e1e20a9ce10901ec369012947876596f75a222235965f2b7ae832e"}, + {file = "cffi-2.1.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:c1453022f490d2459a11819d83ad1d586e9ff65a12ac3e705ffebd46d3685dcf"}, + {file = "cffi-2.1.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:208f941bb9d18e768138677f0a6d2ce01f590df56043dda1df1535ac57c88517"}, + {file = "cffi-2.1.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:210019b6c7cf07f081b4c54635c8cf744377001350e29cc0f81c4377b4797735"}, + {file = "cffi-2.1.1-cp312-cp312-win32.whl", hash = "sha256:046bfc24911b37851ee1b51aab8bffe713d89c68c6a057b09484ce9fd5f69b4e"}, + {file = "cffi-2.1.1-cp312-cp312-win_amd64.whl", hash = "sha256:f53e442b08449d42821fa4a4fba000095af9f62742a500f978a9f557ec44339a"}, + {file = "cffi-2.1.1-cp312-cp312-win_arm64.whl", hash = "sha256:7bde5e4cc5c10140859842b9d383af292b22639a4dffb725314baf45968cef80"}, + {file = "cffi-2.1.1-cp313-cp313-ios_13_0_arm64_iphoneos.whl", hash = "sha256:b5bdfd1c873d4e093aabc0ca84c4ca6dbc4f752afb5c86f146d9742580c9da2e"}, + {file = "cffi-2.1.1-cp313-cp313-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:31348097ff5bbe827ccc41795d4dd099d9f0625e7def00ee653c137a490c2a6c"}, + {file = "cffi-2.1.1-cp313-cp313-macosx_10_15_x86_64.whl", hash = "sha256:9d2055050ea716bd38b7f7f1579c275386646b4894c155a3e2f3cd62ed41b7c6"}, + {file = "cffi-2.1.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:19ee6127ee34de7d83ce3d371ebc5ed91addbdcc39f9ab15ce4eb35a4e534971"}, + {file = "cffi-2.1.1-cp313-cp313-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:6a8dddef476fab96d066d578fc88526767b836ab5ab21754e1d5bf3879c31c7c"}, + {file = "cffi-2.1.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:f16c709686a78c727bbbf059f92b0bf41c6fc60deec706d2dc19f529175a6125"}, + {file = "cffi-2.1.1-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:fcd22650c908d7b7da162bbfaab594a1227a15d1643a98c68b122ac642fa2264"}, + {file = "cffi-2.1.1-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:aa9511c62d14da7aacc9b4bf51f3f697a621e83b2d6919008243c3aad168eea3"}, + {file = "cffi-2.1.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:a931079504ecc49efed7744c476a5c343a92fabf66dec2db95edb1b2fdc770e2"}, + {file = "cffi-2.1.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a2d7755bef5a12ed488f4ef1f1b69ee9191d7396083b755a5d2295f6edb4768b"}, + {file = "cffi-2.1.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:e0bcb7e0f677f543555d2adff3bf19c05f66cdb4796e5ff602442ab2fe3c4ef7"}, + {file = "cffi-2.1.1-cp313-cp313-win32.whl", hash = "sha256:334644fbac4eff73d985a17a91226df55d0f394160c4cfb880e084c8f7161cac"}, + {file = "cffi-2.1.1-cp313-cp313-win_amd64.whl", hash = "sha256:1aa5645c30469b09530c4ebca77ebf8f17618293c58f8549cb1a543a50236e7d"}, + {file = "cffi-2.1.1-cp313-cp313-win_arm64.whl", hash = "sha256:63bbfd5ded17c4840ac07cd8f1c21ba9d9708141f840b324f422f41b207e3973"}, + {file = "cffi-2.1.1-cp314-cp314-ios_13_0_arm64_iphoneos.whl", hash = "sha256:7dbb61fe3a7699468030f71bbe5f8a0e326a151daa91beb11a6fc1f980c55e1c"}, + {file = "cffi-2.1.1-cp314-cp314-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:f24fb43132a4c6b4cb4eb029492919b2db645be6808d738f244fd146c03c32cb"}, + {file = "cffi-2.1.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:d28630f5854ab07ab1fd4aba756de52326c82e6be15d414b12793f1975048b54"}, + {file = "cffi-2.1.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:661c298b4821edebead0c91edd2b00374d67ad7c5a1f7a91d4442633b79d6a72"}, + {file = "cffi-2.1.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:58acb8ab8e295e6c5ea12f888cbb13cf21511ef2a3303a23f4325c29d17fe5c1"}, + {file = "cffi-2.1.1-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:456a61fa52d579ebf9df2e9552ead5129855dbaff6c1e5a9b1bc408809bdc062"}, + {file = "cffi-2.1.1-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:a4f00aa42f75d6e4595e8866e748cc1705adc0cddfeb2ca86d0d03993d63ba03"}, + {file = "cffi-2.1.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:b0431303acaea1089ad4b3e9ce4e6518193def1118d4073ca848635ee4ea2e96"}, + {file = "cffi-2.1.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:64faea20f4e2613363a1a9b9c7dd73058f3ecd00133a511e72ad7c511658f527"}, + {file = "cffi-2.1.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:5c58fe613dc5e5336357eff555824a314d8e43282600435c8d1cb6a7a2fedd13"}, + {file = "cffi-2.1.1-cp314-cp314-win32.whl", hash = "sha256:1a18a57b58cfb21fc28d72e876acf10eaed67a1ed96226f92af4df681d571c4c"}, + {file = "cffi-2.1.1-cp314-cp314-win_amd64.whl", hash = "sha256:3222ba5d678f80a030e6afbcc33dc1ae5cb45facabb61cee2c7016b8432fde48"}, + {file = "cffi-2.1.1-cp314-cp314-win_arm64.whl", hash = "sha256:ab36d55f9ed2d067327667c2fea18dda018eb628dd6347aa01dda6cf1f5d3836"}, + {file = "cffi-2.1.1-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:7750c6449dff7864bb9bb27ddfb0267756189201a3afc911d82b3caacd70dfc3"}, + {file = "cffi-2.1.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:0beceaabe56af686895136a2de78db54ecd8e4046b236b8fd6d6cb61389e9bf2"}, + {file = "cffi-2.1.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:49cbc70e6542d4ccccb936558d1064a8012541e78f821f955cff24e357776c94"}, + {file = "cffi-2.1.1-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:e2d65b31f36619cda3999b78b2aa9632e76b78448e7a56fc4240824200e7c4fc"}, + {file = "cffi-2.1.1-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:28907ab9bfb6aa13184cfc17c6b8e1023c5ab6fd7076d8c20a35e59fe04f8f29"}, + {file = "cffi-2.1.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:51b31d1c98274844cfd7838ce00bfc27c7423a4dc00fc0772fc3331c2cc90676"}, + {file = "cffi-2.1.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:5e7cecbaadb83884793e05828cee59b210b24583b9c7425d0ba6a754fe22eb4e"}, + {file = "cffi-2.1.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:25792eac27877609e7bb06d42ff88278a6624fff2ba9bbb523c09616b117e80f"}, + {file = "cffi-2.1.1-cp314-cp314t-win32.whl", hash = "sha256:8ef53b2de9bcb9197d31854256575d59dbac0cba72ac627bb291ef5eceb74be4"}, + {file = "cffi-2.1.1-cp314-cp314t-win_amd64.whl", hash = "sha256:616f097f2fe415bc92a247f02e11f634e1f9e9a83d327e3c915c15089c87869e"}, + {file = "cffi-2.1.1-cp314-cp314t-win_arm64.whl", hash = "sha256:ad2c86c495b899d862ea0f4b42891b8713a3bd45dd4105c7fd51c2a72f39f3a5"}, + {file = "cffi-2.1.1-cp315-cp315-ios_13_0_arm64_iphoneos.whl", hash = "sha256:dddad92b554513a31f272570678ba307fb9f618f05e3d4a5eacafff9eae03e1d"}, + {file = "cffi-2.1.1-cp315-cp315-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:da0e573f9f97159390c89d9f1a9e41908b66d408cc5b58d08cf3847d844c531b"}, + {file = "cffi-2.1.1-cp315-cp315-macosx_10_15_x86_64.whl", hash = "sha256:fb92203a88b3d3053034db775110081c49d28be6551923805e039924093761e4"}, + {file = "cffi-2.1.1-cp315-cp315-macosx_11_0_arm64.whl", hash = "sha256:2ae64be792b8966f2c69538199728b290e34726562896df1e5dc8ffd8d8188e8"}, + {file = "cffi-2.1.1-cp315-cp315-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:507a24c282e0f42f8ed737cf048572cbf580468da5555764a8331735e9c736b6"}, + {file = "cffi-2.1.1-cp315-cp315-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:246fa40ce8645a614ff682e0b70f37134e460eaf93a775e0cbe3cca585a67a80"}, + {file = "cffi-2.1.1-cp315-cp315-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:471cee653ae88de62096552e6d24ccb4a5adb8c8c9f10b5054d0122c15bf2779"}, + {file = "cffi-2.1.1-cp315-cp315-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:aeae0e330c9f6acd681f647d46cefd30c29f93e3392882e792e82080c9691399"}, + {file = "cffi-2.1.1-cp315-cp315-musllinux_1_2_aarch64.whl", hash = "sha256:42a494cee34437f05546455144f2b5d9ac09b1face62bcfce597d2e521066688"}, + {file = "cffi-2.1.1-cp315-cp315-musllinux_1_2_x86_64.whl", hash = "sha256:cc572dace3f60ef98d7b12ff411d20f5362feb31a0439eab0085bbfd349982d7"}, + {file = "cffi-2.1.1-cp315-cp315-win32.whl", hash = "sha256:4f42141fc14250de6dde5ee7ea4432be017252d91f19c5ad043c084cea629cac"}, + {file = "cffi-2.1.1-cp315-cp315-win_amd64.whl", hash = "sha256:e6e8cff14d6fb0be70a09c0bdc58096f501952d04624ebf867e0e56da2df8960"}, + {file = "cffi-2.1.1-cp315-cp315-win_arm64.whl", hash = "sha256:27350daa11d4f10c540e6e89dada4c54feb7256ad03e9a4dc075ebad7ba360d1"}, + {file = "cffi-2.1.1-cp315-cp315t-macosx_10_15_x86_64.whl", hash = "sha256:c26608d2222fb1e94487e4a387d85f13eb55d5ed725cb25a0c589ac4ee60e7bc"}, + {file = "cffi-2.1.1-cp315-cp315t-macosx_11_0_arm64.whl", hash = "sha256:4be96343e422f2dfcd12ab5c9f5aebe03f82f737c6bffeca6830b3875cb44aab"}, + {file = "cffi-2.1.1-cp315-cp315t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:937c0052c05a31ca1daf18de3158eed4dbfcb9cc107adbea227728d647be701e"}, + {file = "cffi-2.1.1-cp315-cp315t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:df423d40ee8654634421812bc3b196da3f9bd7d32929da813f8394c4348a5358"}, + {file = "cffi-2.1.1-cp315-cp315t-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:a730a083190634c65cca36ba5f489531576ebd79bcd5c8e172130f6453127231"}, + {file = "cffi-2.1.1-cp315-cp315t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:363e05fa78e15116c3c32c210ee36884fd6b9afa6d440e47112c3bd511d64cb6"}, + {file = "cffi-2.1.1-cp315-cp315t-musllinux_1_2_aarch64.whl", hash = "sha256:770de9db11e84213beec501cfcaa013b019820ca881e03344dea5844f7876d94"}, + {file = "cffi-2.1.1-cp315-cp315t-musllinux_1_2_x86_64.whl", hash = "sha256:7da0c5eff80f0197f3b3d1232ec5a682a9325f4ae9016a78f5f5ca35f9ced1f5"}, + {file = "cffi-2.1.1-cp315-cp315t-win32.whl", hash = "sha256:06c72bb76605a4b0cd0aad6930b69d4baf7dd5d806cfc409b824191099700e66"}, + {file = "cffi-2.1.1-cp315-cp315t-win_amd64.whl", hash = "sha256:d9c275eaacd24aa73f94ffd6de08fc3f932424d8b6c376f4bed7cde376fe7bc3"}, + {file = "cffi-2.1.1-cp315-cp315t-win_arm64.whl", hash = "sha256:d18e5ac0f2f03f4f518d3e23db0f0cad7faa1da8620e9c09461d443bbf6e6692"}, + {file = "cffi-2.1.1.tar.gz", hash = "sha256:dd31f52ea1086513bb9df30f8fcee9b8918323ae067a3d5b78bc826a000712be"}, +] +markers = {floris = "implementation_name == \"pypy\""} [package.dependencies] pycparser = {version = "*", markers = "implementation_name != \"PyPy\""} +[[package]] +name = "cftime" +version = "1.6.5" +description = "Time-handling functionality from netcdf4-python" +optional = false +python-versions = ">=3.10" +groups = ["floris"] +files = [ + {file = "cftime-1.6.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:8ad81e8cb0eb873b33c3d1e22c6168163fdc64daa8f7aeb4da8092f272575f4d"}, + {file = "cftime-1.6.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:12d95c6af852114a13301c5a61e41afdbd1542e72939c1083796f8418b9b8b0e"}, + {file = "cftime-1.6.5-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:2659b7df700e27d9e3671f686ce474dfb5fc274966961edf996acc148dfa094a"}, + {file = "cftime-1.6.5-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:94cebdfcda6a985b8e69aed22d00d6b8aa1f421495adbdcff1d59b3e896d81e2"}, + {file = "cftime-1.6.5-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:179681b023349a2fe277ceccc89d4fc52c0dd105cb59b7187b5bc5d442875133"}, + {file = "cftime-1.6.5-cp310-cp310-win_amd64.whl", hash = "sha256:d8b9fdecb466879cfe8ca4472b229b6f8d0bb65e4ffd44266ae17484bac2cf38"}, + {file = "cftime-1.6.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:474e728f5a387299418f8d7cb9c52248dcd5d977b2a01de7ec06bba572e26b02"}, + {file = "cftime-1.6.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ab9e80d4de815cac2e2d88a2335231254980e545d0196eb34ee8f7ed612645f1"}, + {file = "cftime-1.6.5-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:ad24a563784e4795cb3d04bd985895b5db49ace2cbb71fcf1321fd80141f9a52"}, + {file = "cftime-1.6.5-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:a3cda6fd12c7fb25eff40a6a857a2bf4d03e8cc71f80485d8ddc65ccbd80f16a"}, + {file = "cftime-1.6.5-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:28cda78d685397ba23d06273b9c916c3938d8d9e6872a537e76b8408a321369b"}, + {file = "cftime-1.6.5-cp311-cp311-win_amd64.whl", hash = "sha256:93ead088e3a216bdeb9368733a0ef89a7451dfc1d2de310c1c0366a56ad60dc8"}, + {file = "cftime-1.6.5-cp311-cp311-win_arm64.whl", hash = "sha256:3384d69a0a7f3d45bded21a8cbcce66c8ba06c13498eac26c2de41b1b9b6e890"}, + {file = "cftime-1.6.5-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:eef25caed5ebd003a38719bd3ff8847cd52ef2ea56c3ebdb2c9345ba131fc7c5"}, + {file = "cftime-1.6.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:c87d2f3b949e45463e559233c69e6a9cf691b2b378c1f7556166adfabbd1c6b0"}, + {file = "cftime-1.6.5-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:82cb413973cc51b55642b3a1ca5b28db5b93a294edbef7dc049c074b478b4647"}, + {file = "cftime-1.6.5-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:85ba8e7356d239cfe56ef7707ac30feaf67964642ac760a82e507ee3c5db4ac4"}, + {file = "cftime-1.6.5-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:456039af7907a3146689bb80bfd8edabd074c7f3b4eca61f91b9c2670addd7ad"}, + {file = "cftime-1.6.5-cp312-cp312-win_amd64.whl", hash = "sha256:da84534c43699960dc980a9a765c33433c5de1a719a4916748c2d0e97a071e44"}, + {file = "cftime-1.6.5-cp312-cp312-win_arm64.whl", hash = "sha256:c62cd8db9ea40131eea7d4523691c5d806d3265d31279e4a58574a42c28acd77"}, + {file = "cftime-1.6.5-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:4aba66fd6497711a47c656f3a732c2d1755ad15f80e323c44a8716ebde39ddd5"}, + {file = "cftime-1.6.5-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:89e7cba699242366e67d6fb5aee579440e791063f92a93853610c91647167c0d"}, + {file = "cftime-1.6.5-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:2f1eb43d7a7b919ec99aee709fb62ef87ef1cf0679829ef93d37cc1c725781e9"}, + {file = "cftime-1.6.5-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:e02a1d80ffc33fe469c7db68aa24c4a87f01da0c0c621373e5edadc92964900b"}, + {file = "cftime-1.6.5-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:18ab754805233cdd889614b2b3b86a642f6d51a57a1ec327c48053f3414f87d8"}, + {file = "cftime-1.6.5-cp313-cp313-win_amd64.whl", hash = "sha256:6c27add8f907f4a4cd400e89438f2ea33e2eb5072541a157a4d013b7dbe93f9c"}, + {file = "cftime-1.6.5-cp313-cp313-win_arm64.whl", hash = "sha256:31d1ff8f6bbd4ca209099d24459ec16dea4fb4c9ab740fbb66dd057ccbd9b1b9"}, + {file = "cftime-1.6.5-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:c69ce3bdae6a322cbb44e9ebc20770d47748002fb9d68846a1e934f1bd5daf0b"}, + {file = "cftime-1.6.5-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:e62e9f2943e014c5ef583245bf2e878398af131c97e64f8cd47c1d7baef5c4e2"}, + {file = "cftime-1.6.5-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:7da5fdaa4360d8cb89b71b8ded9314f2246aa34581e8105c94ad58d6102d9e4f"}, + {file = "cftime-1.6.5-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:bff865b4ea4304f2744a1ad2b8149b8328b321dd7a2b9746ef926d229bd7cd49"}, + {file = "cftime-1.6.5-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:e552c5d1c8a58f25af7521e49237db7ca52ed2953e974fe9f7c4491e95fdd36c"}, + {file = "cftime-1.6.5-cp314-cp314-win_amd64.whl", hash = "sha256:e645b095dc50a38ac454b7e7f0742f639e7d7f6b108ad329358544a6ff8c9ba2"}, + {file = "cftime-1.6.5-cp314-cp314-win_arm64.whl", hash = "sha256:b9044d7ac82d3d8af189df1032fdc871bbd3f3dd41a6ec79edceb5029b71e6e0"}, + {file = "cftime-1.6.5-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:9ef56460cb0576e1a9161e1428c9e1a633f809a23fa9d598f313748c1ae5064e"}, + {file = "cftime-1.6.5-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:4f4873d38b10032f9f3111c547a1d485519ae64eee6a7a2d091f1f8b08e1ba50"}, + {file = "cftime-1.6.5-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:ccce0f4c9d3f38dd948a117e578b50d0e0db11e2ca9435fb358fd524813e4b61"}, + {file = "cftime-1.6.5-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:19cbfc5152fb0b34ce03acf9668229af388d7baa63a78f936239cb011ccbe6b1"}, + {file = "cftime-1.6.5-cp314-cp314t-win_amd64.whl", hash = "sha256:4470cd5ef3c2514566f53efbcbb64dd924fa0584637d90285b2f983bd4ee7d97"}, + {file = "cftime-1.6.5-cp314-cp314t-win_arm64.whl", hash = "sha256:034c15a67144a0a5590ef150c99f844897618b148b87131ed34fda7072614662"}, + {file = "cftime-1.6.5.tar.gz", hash = "sha256:8225fed6b9b43fb87683ebab52130450fc1730011150d3092096a90e54d1e81e"}, +] + +[package.dependencies] +numpy = ">=1.21.2" + [[package]] name = "charset-normalizer" -version = "3.4.4" +version = "3.4.9" description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." optional = false python-versions = ">=3.7" -groups = ["dev"] -files = [ - {file = "charset_normalizer-3.4.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:e824f1492727fa856dd6eda4f7cee25f8518a12f3c4a56a74e8095695089cf6d"}, - {file = "charset_normalizer-3.4.4-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4bd5d4137d500351a30687c2d3971758aac9a19208fc110ccb9d7188fbe709e8"}, - {file = "charset_normalizer-3.4.4-cp310-cp310-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:027f6de494925c0ab2a55eab46ae5129951638a49a34d87f4c3eda90f696b4ad"}, - {file = "charset_normalizer-3.4.4-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f820802628d2694cb7e56db99213f930856014862f3fd943d290ea8438d07ca8"}, - {file = "charset_normalizer-3.4.4-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:798d75d81754988d2565bff1b97ba5a44411867c0cf32b77a7e8f8d84796b10d"}, - {file = "charset_normalizer-3.4.4-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9d1bb833febdff5c8927f922386db610b49db6e0d4f4ee29601d71e7c2694313"}, - {file = "charset_normalizer-3.4.4-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:9cd98cdc06614a2f768d2b7286d66805f94c48cde050acdbbb7db2600ab3197e"}, - {file = "charset_normalizer-3.4.4-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:077fbb858e903c73f6c9db43374fd213b0b6a778106bc7032446a8e8b5b38b93"}, - {file = "charset_normalizer-3.4.4-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:244bfb999c71b35de57821b8ea746b24e863398194a4014e4c76adc2bbdfeff0"}, - {file = "charset_normalizer-3.4.4-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:64b55f9dce520635f018f907ff1b0df1fdc31f2795a922fb49dd14fbcdf48c84"}, - {file = "charset_normalizer-3.4.4-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:faa3a41b2b66b6e50f84ae4a68c64fcd0c44355741c6374813a800cd6695db9e"}, - {file = "charset_normalizer-3.4.4-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:6515f3182dbe4ea06ced2d9e8666d97b46ef4c75e326b79bb624110f122551db"}, - {file = "charset_normalizer-3.4.4-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:cc00f04ed596e9dc0da42ed17ac5e596c6ccba999ba6bd92b0e0aef2f170f2d6"}, - {file = "charset_normalizer-3.4.4-cp310-cp310-win32.whl", hash = "sha256:f34be2938726fc13801220747472850852fe6b1ea75869a048d6f896838c896f"}, - {file = "charset_normalizer-3.4.4-cp310-cp310-win_amd64.whl", hash = "sha256:a61900df84c667873b292c3de315a786dd8dac506704dea57bc957bd31e22c7d"}, - {file = "charset_normalizer-3.4.4-cp310-cp310-win_arm64.whl", hash = "sha256:cead0978fc57397645f12578bfd2d5ea9138ea0fac82b2f63f7f7c6877986a69"}, - {file = "charset_normalizer-3.4.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:6e1fcf0720908f200cd21aa4e6750a48ff6ce4afe7ff5a79a90d5ed8a08296f8"}, - {file = "charset_normalizer-3.4.4-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5f819d5fe9234f9f82d75bdfa9aef3a3d72c4d24a6e57aeaebba32a704553aa0"}, - {file = "charset_normalizer-3.4.4-cp311-cp311-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:a59cb51917aa591b1c4e6a43c132f0cdc3c76dbad6155df4e28ee626cc77a0a3"}, - {file = "charset_normalizer-3.4.4-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:8ef3c867360f88ac904fd3f5e1f902f13307af9052646963ee08ff4f131adafc"}, - {file = "charset_normalizer-3.4.4-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d9e45d7faa48ee908174d8fe84854479ef838fc6a705c9315372eacbc2f02897"}, - {file = "charset_normalizer-3.4.4-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:840c25fb618a231545cbab0564a799f101b63b9901f2569faecd6b222ac72381"}, - {file = "charset_normalizer-3.4.4-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:ca5862d5b3928c4940729dacc329aa9102900382fea192fc5e52eb69d6093815"}, - {file = "charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d9c7f57c3d666a53421049053eaacdd14bbd0a528e2186fcb2e672effd053bb0"}, - {file = "charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:277e970e750505ed74c832b4bf75dac7476262ee2a013f5574dd49075879e161"}, - {file = "charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:31fd66405eaf47bb62e8cd575dc621c56c668f27d46a61d975a249930dd5e2a4"}, - {file = "charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:0d3d8f15c07f86e9ff82319b3d9ef6f4bf907608f53fe9d92b28ea9ae3d1fd89"}, - {file = "charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:9f7fcd74d410a36883701fafa2482a6af2ff5ba96b9a620e9e0721e28ead5569"}, - {file = "charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ebf3e58c7ec8a8bed6d66a75d7fb37b55e5015b03ceae72a8e7c74495551e224"}, - {file = "charset_normalizer-3.4.4-cp311-cp311-win32.whl", hash = "sha256:eecbc200c7fd5ddb9a7f16c7decb07b566c29fa2161a16cf67b8d068bd21690a"}, - {file = "charset_normalizer-3.4.4-cp311-cp311-win_amd64.whl", hash = "sha256:5ae497466c7901d54b639cf42d5b8c1b6a4fead55215500d2f486d34db48d016"}, - {file = "charset_normalizer-3.4.4-cp311-cp311-win_arm64.whl", hash = "sha256:65e2befcd84bc6f37095f5961e68a6f077bf44946771354a28ad434c2cce0ae1"}, - {file = "charset_normalizer-3.4.4-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:0a98e6759f854bd25a58a73fa88833fba3b7c491169f86ce1180c948ab3fd394"}, - {file = "charset_normalizer-3.4.4-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b5b290ccc2a263e8d185130284f8501e3e36c5e02750fc6b6bdeb2e9e96f1e25"}, - {file = "charset_normalizer-3.4.4-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:74bb723680f9f7a6234dcf67aea57e708ec1fbdf5699fb91dfd6f511b0a320ef"}, - {file = "charset_normalizer-3.4.4-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f1e34719c6ed0b92f418c7c780480b26b5d9c50349e9a9af7d76bf757530350d"}, - {file = "charset_normalizer-3.4.4-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:2437418e20515acec67d86e12bf70056a33abdacb5cb1655042f6538d6b085a8"}, - {file = "charset_normalizer-3.4.4-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:11d694519d7f29d6cd09f6ac70028dba10f92f6cdd059096db198c283794ac86"}, - {file = "charset_normalizer-3.4.4-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:ac1c4a689edcc530fc9d9aa11f5774b9e2f33f9a0c6a57864e90908f5208d30a"}, - {file = "charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:21d142cc6c0ec30d2efee5068ca36c128a30b0f2c53c1c07bd78cb6bc1d3be5f"}, - {file = "charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:5dbe56a36425d26d6cfb40ce79c314a2e4dd6211d51d6d2191c00bed34f354cc"}, - {file = "charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:5bfbb1b9acf3334612667b61bd3002196fe2a1eb4dd74d247e0f2a4d50ec9bbf"}, - {file = "charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:d055ec1e26e441f6187acf818b73564e6e6282709e9bcb5b63f5b23068356a15"}, - {file = "charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:af2d8c67d8e573d6de5bc30cdb27e9b95e49115cd9baad5ddbd1a6207aaa82a9"}, - {file = "charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:780236ac706e66881f3b7f2f32dfe90507a09e67d1d454c762cf642e6e1586e0"}, - {file = "charset_normalizer-3.4.4-cp312-cp312-win32.whl", hash = "sha256:5833d2c39d8896e4e19b689ffc198f08ea58116bee26dea51e362ecc7cd3ed26"}, - {file = "charset_normalizer-3.4.4-cp312-cp312-win_amd64.whl", hash = "sha256:a79cfe37875f822425b89a82333404539ae63dbdddf97f84dcbc3d339aae9525"}, - {file = "charset_normalizer-3.4.4-cp312-cp312-win_arm64.whl", hash = "sha256:376bec83a63b8021bb5c8ea75e21c4ccb86e7e45ca4eb81146091b56599b80c3"}, - {file = "charset_normalizer-3.4.4-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:e1f185f86a6f3403aa2420e815904c67b2f9ebc443f045edd0de921108345794"}, - {file = "charset_normalizer-3.4.4-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6b39f987ae8ccdf0d2642338faf2abb1862340facc796048b604ef14919e55ed"}, - {file = "charset_normalizer-3.4.4-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:3162d5d8ce1bb98dd51af660f2121c55d0fa541b46dff7bb9b9f86ea1d87de72"}, - {file = "charset_normalizer-3.4.4-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:81d5eb2a312700f4ecaa977a8235b634ce853200e828fbadf3a9c50bab278328"}, - {file = "charset_normalizer-3.4.4-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5bd2293095d766545ec1a8f612559f6b40abc0eb18bb2f5d1171872d34036ede"}, - {file = "charset_normalizer-3.4.4-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a8a8b89589086a25749f471e6a900d3f662d1d3b6e2e59dcecf787b1cc3a1894"}, - {file = "charset_normalizer-3.4.4-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:bc7637e2f80d8530ee4a78e878bce464f70087ce73cf7c1caf142416923b98f1"}, - {file = "charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f8bf04158c6b607d747e93949aa60618b61312fe647a6369f88ce2ff16043490"}, - {file = "charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:554af85e960429cf30784dd47447d5125aaa3b99a6f0683589dbd27e2f45da44"}, - {file = "charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:74018750915ee7ad843a774364e13a3db91682f26142baddf775342c3f5b1133"}, - {file = "charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:c0463276121fdee9c49b98908b3a89c39be45d86d1dbaa22957e38f6321d4ce3"}, - {file = "charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:362d61fd13843997c1c446760ef36f240cf81d3ebf74ac62652aebaf7838561e"}, - {file = "charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:9a26f18905b8dd5d685d6d07b0cdf98a79f3c7a918906af7cc143ea2e164c8bc"}, - {file = "charset_normalizer-3.4.4-cp313-cp313-win32.whl", hash = "sha256:9b35f4c90079ff2e2edc5b26c0c77925e5d2d255c42c74fdb70fb49b172726ac"}, - {file = "charset_normalizer-3.4.4-cp313-cp313-win_amd64.whl", hash = "sha256:b435cba5f4f750aa6c0a0d92c541fb79f69a387c91e61f1795227e4ed9cece14"}, - {file = "charset_normalizer-3.4.4-cp313-cp313-win_arm64.whl", hash = "sha256:542d2cee80be6f80247095cc36c418f7bddd14f4a6de45af91dfad36d817bba2"}, - {file = "charset_normalizer-3.4.4-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:da3326d9e65ef63a817ecbcc0df6e94463713b754fe293eaa03da99befb9a5bd"}, - {file = "charset_normalizer-3.4.4-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8af65f14dc14a79b924524b1e7fffe304517b2bff5a58bf64f30b98bbc5079eb"}, - {file = "charset_normalizer-3.4.4-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:74664978bb272435107de04e36db5a9735e78232b85b77d45cfb38f758efd33e"}, - {file = "charset_normalizer-3.4.4-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:752944c7ffbfdd10c074dc58ec2d5a8a4cd9493b314d367c14d24c17684ddd14"}, - {file = "charset_normalizer-3.4.4-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d1f13550535ad8cff21b8d757a3257963e951d96e20ec82ab44bc64aeb62a191"}, - {file = "charset_normalizer-3.4.4-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ecaae4149d99b1c9e7b88bb03e3221956f68fd6d50be2ef061b2381b61d20838"}, - {file = "charset_normalizer-3.4.4-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:cb6254dc36b47a990e59e1068afacdcd02958bdcce30bb50cc1700a8b9d624a6"}, - {file = "charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:c8ae8a0f02f57a6e61203a31428fa1d677cbe50c93622b4149d5c0f319c1d19e"}, - {file = "charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:47cc91b2f4dd2833fddaedd2893006b0106129d4b94fdb6af1f4ce5a9965577c"}, - {file = "charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:82004af6c302b5d3ab2cfc4cc5f29db16123b1a8417f2e25f9066f91d4411090"}, - {file = "charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:2b7d8f6c26245217bd2ad053761201e9f9680f8ce52f0fcd8d0755aeae5b2152"}, - {file = "charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:799a7a5e4fb2d5898c60b640fd4981d6a25f1c11790935a44ce38c54e985f828"}, - {file = "charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:99ae2cffebb06e6c22bdc25801d7b30f503cc87dbd283479e7b606f70aff57ec"}, - {file = "charset_normalizer-3.4.4-cp314-cp314-win32.whl", hash = "sha256:f9d332f8c2a2fcbffe1378594431458ddbef721c1769d78e2cbc06280d8155f9"}, - {file = "charset_normalizer-3.4.4-cp314-cp314-win_amd64.whl", hash = "sha256:8a6562c3700cce886c5be75ade4a5db4214fda19fede41d9792d100288d8f94c"}, - {file = "charset_normalizer-3.4.4-cp314-cp314-win_arm64.whl", hash = "sha256:de00632ca48df9daf77a2c65a484531649261ec9f25489917f09e455cb09ddb2"}, - {file = "charset_normalizer-3.4.4-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:ce8a0633f41a967713a59c4139d29110c07e826d131a316b50ce11b1d79b4f84"}, - {file = "charset_normalizer-3.4.4-cp38-cp38-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:eaabd426fe94daf8fd157c32e571c85cb12e66692f15516a83a03264b08d06c3"}, - {file = "charset_normalizer-3.4.4-cp38-cp38-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:c4ef880e27901b6cc782f1b95f82da9313c0eb95c3af699103088fa0ac3ce9ac"}, - {file = "charset_normalizer-3.4.4-cp38-cp38-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:2aaba3b0819274cc41757a1da876f810a3e4d7b6eb25699253a4effef9e8e4af"}, - {file = "charset_normalizer-3.4.4-cp38-cp38-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:778d2e08eda00f4256d7f672ca9fef386071c9202f5e4607920b86d7803387f2"}, - {file = "charset_normalizer-3.4.4-cp38-cp38-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f155a433c2ec037d4e8df17d18922c3a0d9b3232a396690f17175d2946f0218d"}, - {file = "charset_normalizer-3.4.4-cp38-cp38-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:a8bf8d0f749c5757af2142fe7903a9df1d2e8aa3841559b2bad34b08d0e2bcf3"}, - {file = "charset_normalizer-3.4.4-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:194f08cbb32dc406d6e1aea671a68be0823673db2832b38405deba2fb0d88f63"}, - {file = "charset_normalizer-3.4.4-cp38-cp38-musllinux_1_2_armv7l.whl", hash = "sha256:6aee717dcfead04c6eb1ce3bd29ac1e22663cdea57f943c87d1eab9a025438d7"}, - {file = "charset_normalizer-3.4.4-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:cd4b7ca9984e5e7985c12bc60a6f173f3c958eae74f3ef6624bb6b26e2abbae4"}, - {file = "charset_normalizer-3.4.4-cp38-cp38-musllinux_1_2_riscv64.whl", hash = "sha256:b7cf1017d601aa35e6bb650b6ad28652c9cd78ee6caff19f3c28d03e1c80acbf"}, - {file = "charset_normalizer-3.4.4-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:e912091979546adf63357d7e2ccff9b44f026c075aeaf25a52d0e95ad2281074"}, - {file = "charset_normalizer-3.4.4-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:5cb4d72eea50c8868f5288b7f7f33ed276118325c1dfd3957089f6b519e1382a"}, - {file = "charset_normalizer-3.4.4-cp38-cp38-win32.whl", hash = "sha256:837c2ce8c5a65a2035be9b3569c684358dfbf109fd3b6969630a87535495ceaa"}, - {file = "charset_normalizer-3.4.4-cp38-cp38-win_amd64.whl", hash = "sha256:44c2a8734b333e0578090c4cd6b16f275e07aa6614ca8715e6c038e865e70576"}, - {file = "charset_normalizer-3.4.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:a9768c477b9d7bd54bc0c86dbaebdec6f03306675526c9927c0e8a04e8f94af9"}, - {file = "charset_normalizer-3.4.4-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1bee1e43c28aa63cb16e5c14e582580546b08e535299b8b6158a7c9c768a1f3d"}, - {file = "charset_normalizer-3.4.4-cp39-cp39-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:fd44c878ea55ba351104cb93cc85e74916eb8fa440ca7903e57575e97394f608"}, - {file = "charset_normalizer-3.4.4-cp39-cp39-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:0f04b14ffe5fdc8c4933862d8306109a2c51e0704acfa35d51598eb45a1e89fc"}, - {file = "charset_normalizer-3.4.4-cp39-cp39-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:cd09d08005f958f370f539f186d10aec3377d55b9eeb0d796025d4886119d76e"}, - {file = "charset_normalizer-3.4.4-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4fe7859a4e3e8457458e2ff592f15ccb02f3da787fcd31e0183879c3ad4692a1"}, - {file = "charset_normalizer-3.4.4-cp39-cp39-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:fa09f53c465e532f4d3db095e0c55b615f010ad81803d383195b6b5ca6cbf5f3"}, - {file = "charset_normalizer-3.4.4-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:7fa17817dc5625de8a027cb8b26d9fefa3ea28c8253929b8d6649e705d2835b6"}, - {file = "charset_normalizer-3.4.4-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:5947809c8a2417be3267efc979c47d76a079758166f7d43ef5ae8e9f92751f88"}, - {file = "charset_normalizer-3.4.4-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:4902828217069c3c5c71094537a8e623f5d097858ac6ca8252f7b4d10b7560f1"}, - {file = "charset_normalizer-3.4.4-cp39-cp39-musllinux_1_2_riscv64.whl", hash = "sha256:7c308f7e26e4363d79df40ca5b2be1c6ba9f02bdbccfed5abddb7859a6ce72cf"}, - {file = "charset_normalizer-3.4.4-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:2c9d3c380143a1fedbff95a312aa798578371eb29da42106a29019368a475318"}, - {file = "charset_normalizer-3.4.4-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:cb01158d8b88ee68f15949894ccc6712278243d95f344770fa7593fa2d94410c"}, - {file = "charset_normalizer-3.4.4-cp39-cp39-win32.whl", hash = "sha256:2677acec1a2f8ef614c6888b5b4ae4060cc184174a938ed4e8ef690e15d3e505"}, - {file = "charset_normalizer-3.4.4-cp39-cp39-win_amd64.whl", hash = "sha256:f8e160feb2aed042cd657a72acc0b481212ed28b1b9a95c0cee1621b524e1966"}, - {file = "charset_normalizer-3.4.4-cp39-cp39-win_arm64.whl", hash = "sha256:b5d84d37db046c5ca74ee7bb47dd6cbc13f80665fdde3e8040bdd3fb015ecb50"}, - {file = "charset_normalizer-3.4.4-py3-none-any.whl", hash = "sha256:7a32c560861a02ff789ad905a2fe94e3f840803362c84fecf1851cb4cf3dc37f"}, - {file = "charset_normalizer-3.4.4.tar.gz", hash = "sha256:94537985111c35f28720e43603b8e7b43a6ecfb2ce1d3058bbe955b73404e21a"}, +groups = ["dev", "floris"] +files = [ + {file = "charset_normalizer-3.4.9-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:cd6280cf040f233bd7d3407b743b4b4c74f70e8e1c4199cb112a62c941c0772a"}, + {file = "charset_normalizer-3.4.9-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:aa99adc8f081b475a12843953db36831eaf83ec33eb46a90629ca6a5de45a616"}, + {file = "charset_normalizer-3.4.9-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c1225416b463483160e4af85d5fc3a9690ccb53fd4b1865a6437825f5ede3209"}, + {file = "charset_normalizer-3.4.9-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:16d10d789dd9bcca1173c95af82c58433122564b7bc39385124be735a35cbe99"}, + {file = "charset_normalizer-3.4.9-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9bb41182d93ea91f60b4bc8fbf4c820c69ef8a12ab2d917f3f1834f1acad07e8"}, + {file = "charset_normalizer-3.4.9-cp310-cp310-manylinux_2_31_armv7l.whl", hash = "sha256:bcf74c1df76758a395bf0af608c04c82257523f55c9868b334f06270d0f2112b"}, + {file = "charset_normalizer-3.4.9-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:b5314963fce9b0b12743891de876e724997864ee22aa496f903f426c7e2fa5b2"}, + {file = "charset_normalizer-3.4.9-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:e9701d0049d92c16703a42771b98d560b95248949f23f8cf7b4eddd201814fb9"}, + {file = "charset_normalizer-3.4.9-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:65a7ff3f705e57d392f7261b6d0550fe137c3019477431f1c355e0db0a7d3e15"}, + {file = "charset_normalizer-3.4.9-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:79580094b00d1789d1f93ea55bc43cb2f611910c72235b7657f3482ddcc1b22d"}, + {file = "charset_normalizer-3.4.9-cp310-cp310-win32.whl", hash = "sha256:432786d3561e69aeeae6c7e8648964ce0ad05736120135601f87ac26b9c83381"}, + {file = "charset_normalizer-3.4.9-cp310-cp310-win_amd64.whl", hash = "sha256:8c041122946b7ba21bb32c45b1aa57b1be35527690aeb3c5c234521085632eee"}, + {file = "charset_normalizer-3.4.9-cp310-cp310-win_arm64.whl", hash = "sha256:375b83ed0aecfce76c16d198fbc21f3b11b337d68662bea0a995046682a11419"}, + {file = "charset_normalizer-3.4.9-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:0e94703ec9684807f20cfb5eed95c70f67f2a8f21ad620146d7b5a13677b93e5"}, + {file = "charset_normalizer-3.4.9-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2a441ea71902098ffe78c5abe6c494f44160b4af614ed16c3d9a3b1d17fd8ee2"}, + {file = "charset_normalizer-3.4.9-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:304b13570067b2547562e308af560b3963857b1fa90bd6afd978130130fe2d6a"}, + {file = "charset_normalizer-3.4.9-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:4773092f8019072343a7447203308b176e10199920eb02d6195e81bbb3274c29"}, + {file = "charset_normalizer-3.4.9-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:04ce310cb89c15df659582aee80a0603788732a5e017d5bd5c81158106ce249c"}, + {file = "charset_normalizer-3.4.9-cp311-cp311-manylinux_2_31_armv7l.whl", hash = "sha256:c0323c9daef75ef2e5083624b4585018a0c9d5e3b40f607eed81a311270b934b"}, + {file = "charset_normalizer-3.4.9-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:871ff67ea1aad4dfd91736464934d56b32dac49f9fbe16cddba36198a7b3a0db"}, + {file = "charset_normalizer-3.4.9-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:67830fc78e67501f47bb950471b2dcb9b35b140084429318e862895a8e89c993"}, + {file = "charset_normalizer-3.4.9-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:3d92613ec25e43b05f042302531ec0f00b8445190e43325880cbd6ab7c2581da"}, + {file = "charset_normalizer-3.4.9-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:280081916dc341820640489a66e4696049401ef1cf6dd672f672e70ad915aca3"}, + {file = "charset_normalizer-3.4.9-cp311-cp311-win32.whl", hash = "sha256:ac351b3b8014eead140e77e9717e2992c6bbe30b63bc3422422eb84865412e3d"}, + {file = "charset_normalizer-3.4.9-cp311-cp311-win_amd64.whl", hash = "sha256:6366a16e1a25018694d6a5d784d09b046edc9eac40ea2b54065c3052672516a1"}, + {file = "charset_normalizer-3.4.9-cp311-cp311-win_arm64.whl", hash = "sha256:1d22856ffbe153a602df38e4a5464f0b748a54002e0d69ac6d2ad0a197cc99ec"}, + {file = "charset_normalizer-3.4.9-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:45b0cc4e3556cd875e09102988d1ab8356c998b596c9fced84547c8138b487a0"}, + {file = "charset_normalizer-3.4.9-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9b2aff1c7b3884512b9512c3eaadd9bab39fb45042ffaaa1dd08ff2b9f8109d9"}, + {file = "charset_normalizer-3.4.9-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:9104ed0bd76a429d46f9ec0dbc9b08ad1d2dcdf2b00a5a0daa1c145329b35b44"}, + {file = "charset_normalizer-3.4.9-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:7b86a2b16095d250c6f58b3d9b2eee6f4147754344f3dab0922f7c9bf7d226c9"}, + {file = "charset_normalizer-3.4.9-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5e226f6218febc71f6c1fc2fafb91c226f75bdc1d8fb12d66823716e891608fd"}, + {file = "charset_normalizer-3.4.9-cp312-cp312-manylinux_2_31_armv7l.whl", hash = "sha256:90c44bc373b7687f6948b693cceaea1348ae0975d7474746559494468e3c1d84"}, + {file = "charset_normalizer-3.4.9-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:9cdef90ae47919cae358d8ab15797a800ed41da7aba5d72419fb510729e2ed4b"}, + {file = "charset_normalizer-3.4.9-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:60f44ade2cf573dad7a277e6f8ca9a51a21dda572b13bd7d8539bb3cd5dbedde"}, + {file = "charset_normalizer-3.4.9-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:a1786910334ed46ab1dd73222f2cd1e05c2c3bb39f6dddb4f8b36fc382058a39"}, + {file = "charset_normalizer-3.4.9-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:03d07803992c6c7bbc976327f34b18b6160327fc81cb82c9d504720ac0be3b62"}, + {file = "charset_normalizer-3.4.9-cp312-cp312-win32.whl", hash = "sha256:78841cccf1af7b40f6f716338d50c0902dbe88d9f800b3c973b7a9a0a693a642"}, + {file = "charset_normalizer-3.4.9-cp312-cp312-win_amd64.whl", hash = "sha256:4b3dac63058cc36820b0dd072f89898604e2d39686fe05321729d00d8ac185a0"}, + {file = "charset_normalizer-3.4.9-cp312-cp312-win_arm64.whl", hash = "sha256:78fa18e436a1a0e58dbd7e02fc4473f3f32cceb12df9dfca542d075961c307d2"}, + {file = "charset_normalizer-3.4.9-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:440eede837960000d74978f0eba527be106b5b9aee0daf779d395276ed0b0614"}, + {file = "charset_normalizer-3.4.9-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:21e764fd1e70b6a3e205a0e46f3051701f98a8cb3fad66eeb80e48bb502f8698"}, + {file = "charset_normalizer-3.4.9-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:e4fd89cc178bced6ad29cb3e6dd4aa63fa5017c3524dbd0b25998fb64a87cc8b"}, + {file = "charset_normalizer-3.4.9-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:bd47ba7fc3ca94896759ea0109775132d3e7ab921fbf54038e1bab2e46c313c9"}, + {file = "charset_normalizer-3.4.9-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:84fd18bcc17526fc2b3c1af7d2b9217d32c9c04448c16ec693b9b4f1985c3d33"}, + {file = "charset_normalizer-3.4.9-cp313-cp313-manylinux_2_31_armv7l.whl", hash = "sha256:5b10cd92fc5c498b35a8635df6d5a100207f88b63a4dc1de7ef9a548e1e2cd63"}, + {file = "charset_normalizer-3.4.9-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:a4fbdde9dd4a9ce5fd52c2b3a347bb50cc89483ef783f1cb00d408c13f7a96c0"}, + {file = "charset_normalizer-3.4.9-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:416c229f77e5ea25b3dfd4b582f8d73d7e43c22320302b9ab128a2d3a0b38efe"}, + {file = "charset_normalizer-3.4.9-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:75286256590a6320cf106a0d28970d3560aad9ee09aa7b34fb40524792436d35"}, + {file = "charset_normalizer-3.4.9-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:69b157c5d3292bcd443faca052f3096f637f1e074b98212a933c074ae23dc3b8"}, + {file = "charset_normalizer-3.4.9-cp313-cp313-win32.whl", hash = "sha256:51307f5c71007673a2bf8232ad973483d281e74cb99c8c5a990af1eefa6277d9"}, + {file = "charset_normalizer-3.4.9-cp313-cp313-win_amd64.whl", hash = "sha256:fe2c7201c642b7c308f1675355ad7ff7b66acfe3541625efe5a3ad38f29d6115"}, + {file = "charset_normalizer-3.4.9-cp313-cp313-win_arm64.whl", hash = "sha256:611057cc5d5c0afc743ba8be6bd828c17e0aaa8643f9d0a9b9bb7dea80eb8012"}, + {file = "charset_normalizer-3.4.9-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:0327fcd59a935777d83410750c50600ee9571af2846f71ce40f25b13da1ef380"}, + {file = "charset_normalizer-3.4.9-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8a79d9f4d8001473a30c163556b3c3bfebec837495a412dde78b51672f6134f9"}, + {file = "charset_normalizer-3.4.9-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:33bdcc2a32c0a0e861f60841a512c8acc658c87c2ac59d89e3a46dacf7d866e4"}, + {file = "charset_normalizer-3.4.9-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:f840ed6d8ecba8255df8c42b87fadeda98ddfc6eeec05e2dc66e26d46dd6f58a"}, + {file = "charset_normalizer-3.4.9-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c25fe15c70c59eb7c5ce8c06a1f3fa1da0ecc5ea1e7a5922c40fd2fa9b0d5046"}, + {file = "charset_normalizer-3.4.9-cp314-cp314-manylinux_2_31_armv7l.whl", hash = "sha256:f7fb7d750cfa0a070d2c24e831fd3481019a60dd317ea2b39acbcebc08b6ed81"}, + {file = "charset_normalizer-3.4.9-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:4d1c96a7a18b9690a4d46df09e3e3382406ae3213727cd1019ebade1c4a81917"}, + {file = "charset_normalizer-3.4.9-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:a4cfde78a9f2880208d16a93b795726a3017d5977e08d1e162a7a31322479c41"}, + {file = "charset_normalizer-3.4.9-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:d4d6fcde76f94f5cb9e43e9e9a61f16dacefd228cbbf6f1a09bd9b219a92f1a1"}, + {file = "charset_normalizer-3.4.9-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:898f0e9068ca27d37f8e83a5b962821df851532e6c4a7d615c1c033f9da6eedf"}, + {file = "charset_normalizer-3.4.9-cp314-cp314-win32.whl", hash = "sha256:c1c948747b03be832dceed96ca815cef7360de9aa19d37c730f8e3f6101aca48"}, + {file = "charset_normalizer-3.4.9-cp314-cp314-win_amd64.whl", hash = "sha256:16b65ea0f2465b6fb52aa22de5eca612aa964ddfec00a912e26f4656cbef890b"}, + {file = "charset_normalizer-3.4.9-cp314-cp314-win_arm64.whl", hash = "sha256:40a126142a56b2dfc0aacbad1de8310cbf60da7656db0e6b16eebd48e3e93519"}, + {file = "charset_normalizer-3.4.9-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:609b3ba8fcc0fb5ab7af00719d0fb6ad0cb518e48e7712d12fd68f1327951198"}, + {file = "charset_normalizer-3.4.9-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:51447e9aa2684679af07ca5021c3db526e0284347ebf4ffcec1154c3350cfe32"}, + {file = "charset_normalizer-3.4.9-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:cc1b0fff8ead343dae06305f954eb8468ba0ec1a97881f42489d198e4ce3c632"}, + {file = "charset_normalizer-3.4.9-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:fa36ec09ef71d158186bc79e359ff5fdd6e7996fe8ab638f00d6b93139ba4fcf"}, + {file = "charset_normalizer-3.4.9-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:df115d4d83168fdf2cae48ef1ff6d1cb4c466364e30861b37121de0f3bf1b990"}, + {file = "charset_normalizer-3.4.9-cp314-cp314t-manylinux_2_31_armv7l.whl", hash = "sha256:f86c6358749bd4fda175388691e3ba8c46e24c5347d0afd20f9b7edfc9faf07d"}, + {file = "charset_normalizer-3.4.9-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:32286a2c8d167e897177b673176c1e3e00d4057caf5d2b64eef9a3666b03018e"}, + {file = "charset_normalizer-3.4.9-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:83aed2c10721ddd90f68140685391b50811a880af20654c59af6b6c66c40513c"}, + {file = "charset_normalizer-3.4.9-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:cd6c3d4b783c556fa00bf540854e42f135e2f256abd29669fcd0da0f2dec79c2"}, + {file = "charset_normalizer-3.4.9-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:ee2f2a527e3c1a6e6411eb4209642e138b544a2d72fe5d0d76daf77b24063534"}, + {file = "charset_normalizer-3.4.9-cp314-cp314t-win32.whl", hash = "sha256:0d861473f743244d349b50f850d10eb87aeb22bbdcc8e64f79273c94af5a8226"}, + {file = "charset_normalizer-3.4.9-cp314-cp314t-win_amd64.whl", hash = "sha256:9b8e0f3107e2200b76f6054de99016eac3ee6762713587b36baaa7e4bd2ae177"}, + {file = "charset_normalizer-3.4.9-cp314-cp314t-win_arm64.whl", hash = "sha256:19ac87f93086ce37b86e098888555c4b4bc48102279bae3350098c0ed664b501"}, + {file = "charset_normalizer-3.4.9-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:253a4a220747e8b5faf57ec320c4f5efb0cef05f647420bf267143ec15dba10a"}, + {file = "charset_normalizer-3.4.9-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:68ce9f4d6b26d5ccbf7fd4459bf75f74a0a146677ebba80597df60cbdb20e6f4"}, + {file = "charset_normalizer-3.4.9-cp39-cp39-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:58150c9f9b9a552505912d182ccdf26f6396fb6094816ceebcbb20eecabaed94"}, + {file = "charset_normalizer-3.4.9-cp39-cp39-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:df7276909358e5635ae203673ab7e509ddd224225a8d6b0790bf13eb2bde1cc5"}, + {file = "charset_normalizer-3.4.9-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:3c09a49d6cde137258beb3d551994a2927fd35ad5cf96aed573f61bbd67c5f84"}, + {file = "charset_normalizer-3.4.9-cp39-cp39-manylinux_2_31_armv7l.whl", hash = "sha256:231ddcbb35e2ff8973e1365db41fe0572662893b99a05deb183b68ad4c0c8bd4"}, + {file = "charset_normalizer-3.4.9-cp39-cp39-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:920079c3f7456fa213e0829ed2073aaa727fd39d889ead5b4f35d0de5460d04f"}, + {file = "charset_normalizer-3.4.9-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:0fa1aec2d32bcc03c8fa0f6f1712caad1adc38509f31142112e5c9daf5b9c833"}, + {file = "charset_normalizer-3.4.9-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:ad41ba96094304aa090f5a30cb6e4fb3b3f1c264c523394b4c39bbacc4dc92ba"}, + {file = "charset_normalizer-3.4.9-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:43b9e366a31fdd1c87d0eb08f579b4a82b723ea54338f040d6b4e518a026ea29"}, + {file = "charset_normalizer-3.4.9-cp39-cp39-win32.whl", hash = "sha256:93d59d504b230e83c7a843251681959a0b6a9cd76f6e146ce1b8a80eb8739af9"}, + {file = "charset_normalizer-3.4.9-cp39-cp39-win_amd64.whl", hash = "sha256:ddf4af30b417d9fe16481e9b81c27ab2a7cde1ff7ba3e85653b02db7d145dc7b"}, + {file = "charset_normalizer-3.4.9-cp39-cp39-win_arm64.whl", hash = "sha256:476743fe6dfe14a2da12e3ac79125dc84a3b2cf8094369a47a1529b0cd8549fe"}, + {file = "charset_normalizer-3.4.9-py3-none-any.whl", hash = "sha256:68e5f26a1ad57ded6d1cfb85331d1c1a195314756471d97758c48498bb4dcdf5"}, + {file = "charset_normalizer-3.4.9.tar.gz", hash = "sha256:673611bbd43f0810bec0b0f028ddeaaa501190339cac411f347ac76917c3ae7b"}, ] [[package]] name = "click" -version = "8.3.1" +version = "8.4.2" description = "Composable command line interface toolkit" optional = false python-versions = ">=3.10" groups = ["dev"] files = [ - {file = "click-8.3.1-py3-none-any.whl", hash = "sha256:981153a64e25f12d547d3426c367a4857371575ee7ad18df2a6183ab0545b2a6"}, - {file = "click-8.3.1.tar.gz", hash = "sha256:12ff4785d337a1bb490bb7e9c2b1ee5da3112e94a8622f26a6c77f5d2fc6842a"}, + {file = "click-8.4.2-py3-none-any.whl", hash = "sha256:e6f9f66136c816745b9d65817da91d61d957fb16e02e4dcd0552553c5a197b76"}, + {file = "click-8.4.2.tar.gz", hash = "sha256:9a6cea6e60b17ebe0a44c5cc636d94f09bd66142c1cd7d8b4cd731c4917a15f6"}, ] [package.dependencies] @@ -512,12 +685,30 @@ version = "0.4.6" description = "Cross-platform colored terminal text." optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" -groups = ["main", "dev", "examples"] +groups = ["main", "dev", "examples", "floris"] files = [ {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, ] -markers = {main = "platform_system == \"Windows\"", dev = "platform_system == \"Windows\" or sys_platform == \"win32\"", examples = "platform_system == \"Windows\""} +markers = {main = "platform_system == \"Windows\"", dev = "platform_system == \"Windows\" or sys_platform == \"win32\"", examples = "platform_system == \"Windows\"", floris = "platform_system == \"Windows\""} + +[[package]] +name = "coloredlogs" +version = "15.0.1" +description = "Colored terminal output for Python's logging module" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +groups = ["floris"] +files = [ + {file = "coloredlogs-15.0.1-py2.py3-none-any.whl", hash = "sha256:612ee75c546f53e92e70049c9dbfcc18c935a2b9a53b66085ce9ef6a6e5c0934"}, + {file = "coloredlogs-15.0.1.tar.gz", hash = "sha256:7c991aa71a4577af2f82600d8f8f3a89f936baeaf9b50a9c197da014e5bf16b0"}, +] + +[package.dependencies] +humanfriendly = ">=9.1" + +[package.extras] +cron = ["capturer (>=2.4)"] [[package]] name = "comm" @@ -540,8 +731,8 @@ version = "1.3.2" description = "Python library for calculating contours of 2D quadrilateral grids" optional = false python-versions = ">=3.10" -groups = ["examples"] -markers = "python_version < \"3.14\"" +groups = ["examples", "floris"] +markers = "python_version < \"3.11\"" files = [ {file = "contourpy-1.3.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ba38e3f9f330af820c4b27ceb4b9c7feee5fe0493ea53a8720f4792667465934"}, {file = "contourpy-1.3.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:dc41ba0714aa2968d1f8674ec97504a8f7e334f48eeacebcaa6256213acb0989"}, @@ -618,8 +809,8 @@ version = "1.3.3" description = "Python library for calculating contours of 2D quadrilateral grids" optional = false python-versions = ">=3.11" -groups = ["examples"] -markers = "python_version >= \"3.14\"" +groups = ["examples", "floris"] +markers = "python_version >= \"3.11\"" files = [ {file = "contourpy-1.3.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:709a48ef9a690e1343202916450bc48b9e51c049b089c7f79a267b46cffcdaa1"}, {file = "contourpy-1.3.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:23416f38bfd74d5d28ab8429cc4d63fa67d5068bd711a85edb1c3fb0c3e2f381"}, @@ -705,13 +896,35 @@ mypy = ["bokeh", "contourpy[bokeh,docs]", "docutils-stubs", "mypy (==1.17.0)", " test = ["Pillow", "contourpy[test-no-images]", "matplotlib"] test-no-images = ["pytest", "pytest-cov", "pytest-rerunfailures", "pytest-xdist", "wurlitzer"] +[[package]] +name = "control" +version = "0.10.2" +description = "Python Control Systems Library" +optional = false +python-versions = ">=3.10" +groups = ["floris"] +files = [ + {file = "control-0.10.2-py3-none-any.whl", hash = "sha256:8f7b5c58f5ccd761a6c070e3dedceca4c53c7a9cf105fcc22caba7a67f99025a"}, + {file = "control-0.10.2.tar.gz", hash = "sha256:d0cf63f6cfb68a4c8e827c26c3744d129e9777fedc9a5d86ca4740548f23a98b"}, +] + +[package.dependencies] +matplotlib = ">=3.6" +numpy = ">=1.23" +scipy = ">=1.8" + +[package.extras] +cvxopt = ["cvxopt (>=1.2.0)"] +slycot = ["slycot (>=0.4.0)"] +test = ["numpydoc", "pytest", "pytest-timeout", "ruff"] + [[package]] name = "cycler" version = "0.12.1" description = "Composable style cycles" optional = false python-versions = ">=3.8" -groups = ["examples"] +groups = ["examples", "floris"] files = [ {file = "cycler-0.12.1-py3-none-any.whl", hash = "sha256:85cef7cff222d8644161529808465972e51340599459b8ac3ccbac5a854e0d30"}, {file = "cycler-0.12.1.tar.gz", hash = "sha256:88bb128f02ba341da8ef447245a9e138fae777f6a23943da4540077d3601eb1c"}, @@ -723,56 +936,81 @@ tests = ["pytest", "pytest-cov", "pytest-xdist"] [[package]] name = "debugpy" -version = "1.8.20" +version = "1.8.21" description = "An implementation of the Debug Adapter Protocol for Python" optional = false python-versions = ">=3.8" groups = ["dev"] files = [ - {file = "debugpy-1.8.20-cp310-cp310-macosx_15_0_x86_64.whl", hash = "sha256:157e96ffb7f80b3ad36d808646198c90acb46fdcfd8bb1999838f0b6f2b59c64"}, - {file = "debugpy-1.8.20-cp310-cp310-manylinux_2_34_x86_64.whl", hash = "sha256:c1178ae571aff42e61801a38b007af504ec8e05fde1c5c12e5a7efef21009642"}, - {file = "debugpy-1.8.20-cp310-cp310-win32.whl", hash = "sha256:c29dd9d656c0fbd77906a6e6a82ae4881514aa3294b94c903ff99303e789b4a2"}, - {file = "debugpy-1.8.20-cp310-cp310-win_amd64.whl", hash = "sha256:3ca85463f63b5dd0aa7aaa933d97cbc47c174896dcae8431695872969f981893"}, - {file = "debugpy-1.8.20-cp311-cp311-macosx_15_0_universal2.whl", hash = "sha256:eada6042ad88fa1571b74bd5402ee8b86eded7a8f7b827849761700aff171f1b"}, - {file = "debugpy-1.8.20-cp311-cp311-manylinux_2_34_x86_64.whl", hash = "sha256:7de0b7dfeedc504421032afba845ae2a7bcc32ddfb07dae2c3ca5442f821c344"}, - {file = "debugpy-1.8.20-cp311-cp311-win32.whl", hash = "sha256:773e839380cf459caf73cc533ea45ec2737a5cc184cf1b3b796cd4fd98504fec"}, - {file = "debugpy-1.8.20-cp311-cp311-win_amd64.whl", hash = "sha256:1f7650546e0eded1902d0f6af28f787fa1f1dbdbc97ddabaf1cd963a405930cb"}, - {file = "debugpy-1.8.20-cp312-cp312-macosx_15_0_universal2.whl", hash = "sha256:4ae3135e2089905a916909ef31922b2d733d756f66d87345b3e5e52b7a55f13d"}, - {file = "debugpy-1.8.20-cp312-cp312-manylinux_2_34_x86_64.whl", hash = "sha256:88f47850a4284b88bd2bfee1f26132147d5d504e4e86c22485dfa44b97e19b4b"}, - {file = "debugpy-1.8.20-cp312-cp312-win32.whl", hash = "sha256:4057ac68f892064e5f98209ab582abfee3b543fb55d2e87610ddc133a954d390"}, - {file = "debugpy-1.8.20-cp312-cp312-win_amd64.whl", hash = "sha256:a1a8f851e7cf171330679ef6997e9c579ef6dd33c9098458bd9986a0f4ca52e3"}, - {file = "debugpy-1.8.20-cp313-cp313-macosx_15_0_universal2.whl", hash = "sha256:5dff4bb27027821fdfcc9e8f87309a28988231165147c31730128b1c983e282a"}, - {file = "debugpy-1.8.20-cp313-cp313-manylinux_2_34_x86_64.whl", hash = "sha256:84562982dd7cf5ebebfdea667ca20a064e096099997b175fe204e86817f64eaf"}, - {file = "debugpy-1.8.20-cp313-cp313-win32.whl", hash = "sha256:da11dea6447b2cadbf8ce2bec59ecea87cc18d2c574980f643f2d2dfe4862393"}, - {file = "debugpy-1.8.20-cp313-cp313-win_amd64.whl", hash = "sha256:eb506e45943cab2efb7c6eafdd65b842f3ae779f020c82221f55aca9de135ed7"}, - {file = "debugpy-1.8.20-cp314-cp314-macosx_15_0_universal2.whl", hash = "sha256:9c74df62fc064cd5e5eaca1353a3ef5a5d50da5eb8058fcef63106f7bebe6173"}, - {file = "debugpy-1.8.20-cp314-cp314-manylinux_2_34_x86_64.whl", hash = "sha256:077a7447589ee9bc1ff0cdf443566d0ecf540ac8aa7333b775ebcb8ce9f4ecad"}, - {file = "debugpy-1.8.20-cp314-cp314-win32.whl", hash = "sha256:352036a99dd35053b37b7803f748efc456076f929c6a895556932eaf2d23b07f"}, - {file = "debugpy-1.8.20-cp314-cp314-win_amd64.whl", hash = "sha256:a98eec61135465b062846112e5ecf2eebb855305acc1dfbae43b72903b8ab5be"}, - {file = "debugpy-1.8.20-cp38-cp38-macosx_15_0_x86_64.whl", hash = "sha256:b773eb026a043e4d9c76265742bc846f2f347da7e27edf7fe97716ea19d6bfc5"}, - {file = "debugpy-1.8.20-cp38-cp38-manylinux_2_34_x86_64.whl", hash = "sha256:20d6e64ea177ab6732bffd3ce8fc6fb8879c60484ce14c3b3fe183b1761459ca"}, - {file = "debugpy-1.8.20-cp38-cp38-win32.whl", hash = "sha256:0dfd9adb4b3c7005e9c33df430bcdd4e4ebba70be533e0066e3a34d210041b66"}, - {file = "debugpy-1.8.20-cp38-cp38-win_amd64.whl", hash = "sha256:60f89411a6c6afb89f18e72e9091c3dfbcfe3edc1066b2043a1f80a3bbb3e11f"}, - {file = "debugpy-1.8.20-cp39-cp39-macosx_15_0_x86_64.whl", hash = "sha256:bff8990f040dacb4c314864da95f7168c5a58a30a66e0eea0fb85e2586a92cd6"}, - {file = "debugpy-1.8.20-cp39-cp39-manylinux_2_34_x86_64.whl", hash = "sha256:70ad9ae09b98ac307b82c16c151d27ee9d68ae007a2e7843ba621b5ce65333b5"}, - {file = "debugpy-1.8.20-cp39-cp39-win32.whl", hash = "sha256:9eeed9f953f9a23850c85d440bf51e3c56ed5d25f8560eeb29add815bd32f7ee"}, - {file = "debugpy-1.8.20-cp39-cp39-win_amd64.whl", hash = "sha256:760813b4fff517c75bfe7923033c107104e76acfef7bda011ffea8736e9a66f8"}, - {file = "debugpy-1.8.20-py2.py3-none-any.whl", hash = "sha256:5be9bed9ae3be00665a06acaa48f8329d2b9632f15fd09f6a9a8c8d9907e54d7"}, - {file = "debugpy-1.8.20.tar.gz", hash = "sha256:55bc8701714969f1ab89a6d5f2f3d40c36f91b2cbe2f65d98bf8196f6a6a2c33"}, + {file = "debugpy-1.8.21-cp310-cp310-macosx_15_0_x86_64.whl", hash = "sha256:8eeab7b5462f683452c57c0126aaa5ec4e974ddb705f39ba87dff8818c8e08f9"}, + {file = "debugpy-1.8.21-cp310-cp310-manylinux_2_34_x86_64.whl", hash = "sha256:0fddfdc130ac6d8bfc0415b0409822fa901c8f310e5c945ac5653a0352532344"}, + {file = "debugpy-1.8.21-cp310-cp310-win32.whl", hash = "sha256:72b5d676c4cbfac3bac5bb01c138a4656e843f93f03ce2a5f4e394ad49fbee73"}, + {file = "debugpy-1.8.21-cp310-cp310-win_amd64.whl", hash = "sha256:a7fe47fd23da57b9e0bec3f4a8ee65a2dc55782455ed7f2141d75ab5d2eaeef5"}, + {file = "debugpy-1.8.21-cp311-cp311-macosx_15_0_universal2.whl", hash = "sha256:da456226c7b4c69e35dbe35dcee6623d912000a77816db7856a41af1c72a0264"}, + {file = "debugpy-1.8.21-cp311-cp311-manylinux_2_34_x86_64.whl", hash = "sha256:f68b891688e61bdc08b8d364d919ff0051e0b94657b39dcd027bc3173edb7cdc"}, + {file = "debugpy-1.8.21-cp311-cp311-win32.whl", hash = "sha256:f843a8b08c2edeaf9b1582eed4f25441af21a297c22ff16bf76a662557aa9c9e"}, + {file = "debugpy-1.8.21-cp311-cp311-win_amd64.whl", hash = "sha256:84c564d8cc701d41843b29a92814c1f1bef6798724ca9d675c284ad9f6a547d7"}, + {file = "debugpy-1.8.21-cp312-cp312-macosx_15_0_universal2.whl", hash = "sha256:9f96713896f39c3dff0ee841f47320c3f2983d33c341e009361bb0ebc79adc4e"}, + {file = "debugpy-1.8.21-cp312-cp312-manylinux_2_34_x86_64.whl", hash = "sha256:c193d474f0a211191f2b4449d2d06157c689013035bd952f3b617e0ef422b176"}, + {file = "debugpy-1.8.21-cp312-cp312-win32.whl", hash = "sha256:4743373c1cac7f9e74a1b9915bf1dbe0e900eca657ffb170ae07ac8363205ae9"}, + {file = "debugpy-1.8.21-cp312-cp312-win_amd64.whl", hash = "sha256:bd7ba9dd3daa7c2f942c6ca8d4695a16bf9ac16b63615261c7982bc74f7ed20c"}, + {file = "debugpy-1.8.21-cp313-cp313-macosx_15_0_universal2.whl", hash = "sha256:13678151fc401e2d68c9880b91e28714f797d40422994572b24560ef80910a88"}, + {file = "debugpy-1.8.21-cp313-cp313-manylinux_2_34_x86_64.whl", hash = "sha256:ecbd158386c31ffe71d46f72d44d56e66331ab9b16cad649156d514368f23ab2"}, + {file = "debugpy-1.8.21-cp313-cp313-win32.whl", hash = "sha256:2c2ae706dec41d99a9ca1f7ebc987a83e65578363be6f6b3ac9067504917fae1"}, + {file = "debugpy-1.8.21-cp313-cp313-win_amd64.whl", hash = "sha256:aa648733047443eb1d07682c4ef287d36a54507b643ffdf38b09a3ef002c72a0"}, + {file = "debugpy-1.8.21-cp314-cp314-macosx_15_0_universal2.whl", hash = "sha256:9bb2a685287a2ac9b181cde89edcec64845cb51de7faaa75badb9a698bc24782"}, + {file = "debugpy-1.8.21-cp314-cp314-manylinux_2_34_x86_64.whl", hash = "sha256:3d6922439bf33fd38a3e2c447869ebc7b97da5cd3d329ff1ef9bc06c4903437e"}, + {file = "debugpy-1.8.21-cp314-cp314-win32.whl", hash = "sha256:15d4963bd5ffa48f0da0947fd06757fa7621945048a14ad7705431566d3c0e7c"}, + {file = "debugpy-1.8.21-cp314-cp314-win_amd64.whl", hash = "sha256:fe0744a12353406de0ae8ccff0d0a4a666f00801a3db8fd04e7a5f761cd520e8"}, + {file = "debugpy-1.8.21-cp38-cp38-macosx_15_0_x86_64.whl", hash = "sha256:0042da0ecd0a8b50dc4a54395ecd870d258d73fa18776f50c91fdcabdcad2675"}, + {file = "debugpy-1.8.21-cp38-cp38-manylinux_2_34_x86_64.whl", hash = "sha256:ffd932c6796afadab6993ec96745918a8cb2444dbd392074f769db5ea40ab440"}, + {file = "debugpy-1.8.21-cp38-cp38-win32.whl", hash = "sha256:4e7c2d784d78ad4b71a5f8cd7b59c167719ec8a7a0211dbb3eb1bfeda78bc4e2"}, + {file = "debugpy-1.8.21-cp38-cp38-win_amd64.whl", hash = "sha256:aa9d941d6dfe3d0407e4b3ca0b9ec466030e260fbf1174094f68785680f66db6"}, + {file = "debugpy-1.8.21-cp39-cp39-macosx_15_0_x86_64.whl", hash = "sha256:9f5171176a0084b95d2ebe55a4d1f7b2a75b74c5dbec577ebd3a85c740551c36"}, + {file = "debugpy-1.8.21-cp39-cp39-manylinux_2_34_x86_64.whl", hash = "sha256:f15c10084f9861b5e8414a48f18f8e4aadf51a98a59e72c16aa28281ca994672"}, + {file = "debugpy-1.8.21-cp39-cp39-win32.whl", hash = "sha256:4e70cc8b5079f885cb43910924ee0aab73b8b6b2a14eff23afdd9895d86e79eb"}, + {file = "debugpy-1.8.21-cp39-cp39-win_amd64.whl", hash = "sha256:e935f9dc0501be523c8a8e1853c39432e1354e9ece717ae5998fd2371c4542c3"}, + {file = "debugpy-1.8.21-py2.py3-none-any.whl", hash = "sha256:b1e37d333663c8851516a47364ef473da127f9caebe4417e6df6f5825a7e9a92"}, + {file = "debugpy-1.8.21.tar.gz", hash = "sha256:a3c53278e84c94e11bd87c53970ec391d1a67396c8b22609fcac576520e611a6"}, ] [[package]] name = "decorator" -version = "5.2.1" +version = "5.3.1" description = "Decorators for Humans" optional = false python-versions = ">=3.8" groups = ["dev"] files = [ - {file = "decorator-5.2.1-py3-none-any.whl", hash = "sha256:d316bb415a2d9e2d2b3abcc4084c6502fc09240e292cd76a76afc106a1c8e04a"}, - {file = "decorator-5.2.1.tar.gz", hash = "sha256:65f266143752f734b0a7cc83c46f4618af75b8c5911b00ccb61d0ac9b6da0360"}, + {file = "decorator-5.3.1-py3-none-any.whl", hash = "sha256:f47fe6fdbd2edd623ecfe36875d37aba411624e2670dd395dddae1358689bb3c"}, + {file = "decorator-5.3.1.tar.gz", hash = "sha256:4cbcdd55a6efadb9dbea26b858f4fb3264567b52d69ca0d25b721b553f60ea82"}, +] + +[[package]] +name = "deepdiff" +version = "9.1.0" +description = "Deep Difference and Search of any Python object/data. Recreate objects by adding adding deltas to each other." +optional = false +python-versions = ">=3.10" +groups = ["floris"] +files = [ + {file = "deepdiff-9.1.0-py3-none-any.whl", hash = "sha256:80c0460e1993b04f6f0ca79abf25548b129fd218478c4ebb08f80560f5d10610"}, + {file = "deepdiff-9.1.0.tar.gz", hash = "sha256:07e9e366fab4297755153c4eab795ad4ef3cbd0d51660e847f5751c6bd727687"}, ] +[package.dependencies] +cachebox = ">=5.2,<6" +orderly-set = ">=5.5.0,<6" + +[package.extras] +cli = ["click (>=8.3.1,<8.4.0)", "pyyaml (>=6.0.3,<6.1.0)"] +coverage = ["coverage (>=7.13.5,<7.14.0)"] +dev = ["bump2version (>=1.0.1,<1.1.0)", "flit-core (==3.12.0)", "ipdb (>=0.13.13,<0.14.0)", "jsonpickle (>=4.1.1,<4.2.0)", "nox (==2026.2.9)", "numpy (>=2.2.0,<2.3.0) ; python_version < \"3.14\"", "numpy (>=2.4.3,<2.5.0) ; python_version >= \"3.14\"", "orjson (>=3.11.7,<3.12.0)", "pandas (>=2.2.0,<2.3.0) ; python_version < \"3.11\"", "pandas (>=3.0.1,<3.1.0) ; python_version >= \"3.11\"", "polars (>=1.39.3,<1.40.0)", "python-dateutil (>=2.9.0.post0,<2.10.0)", "pytz", "tomli (>=2.4.0,<2.5.0)", "tomli-w (>=1.2.0,<1.3.0)", "uuid6 (==2025.0.1)"] +docs = ["Sphinx (>=8.1.3,<8.2.0)", "furo (>=2024.8.6)", "sphinx-sitemap (>=2.9.0,<2.10.0)", "sphinxemoji (>=0.3.2,<0.4.0)"] +optimize = ["orjson"] +static = ["flake8 (>=7.3.0,<7.4.0)", "flake8-pyproject (>=1.2.4,<1.3.0)", "pydantic (>=2.12.5,<2.13.0)"] +test = ["pytest (>=9.0.3,<9.1.0)", "pytest-benchmark (>=5.2.3,<5.3.0)", "pytest-cov (>=7.1.0,<7.2.0)", "python-dotenv (>=1.2.2,<1.3.0)"] + [[package]] name = "defusedxml" version = "0.7.1" @@ -785,6 +1023,34 @@ files = [ {file = "defusedxml-0.7.1.tar.gz", hash = "sha256:1bb3032db185915b62d7c6209c5a8792be6a32ab2fedacc84e01b52c51aa3e69"}, ] +[[package]] +name = "dill" +version = "0.4.1" +description = "serialize all of Python" +optional = false +python-versions = ">=3.9" +groups = ["floris"] +files = [ + {file = "dill-0.4.1-py3-none-any.whl", hash = "sha256:1e1ce33e978ae97fcfcff5638477032b801c46c7c65cf717f95fbc2248f79a9d"}, + {file = "dill-0.4.1.tar.gz", hash = "sha256:423092df4182177d4d8ba8290c8a5b640c66ab35ec7da59ccfa00f6fa3eea5fa"}, +] + +[package.extras] +graph = ["objgraph (>=1.7.2)"] +profile = ["gprof2dot (>=2022.7.29)"] + +[[package]] +name = "et-xmlfile" +version = "2.0.0" +description = "An implementation of lxml.xmlfile for the standard library" +optional = false +python-versions = ">=3.8" +groups = ["floris"] +files = [ + {file = "et_xmlfile-2.0.0-py3-none-any.whl", hash = "sha256:7a91720bc756843502c3b7504c77b8fe44217c85c537d85037f0f536151b2caa"}, + {file = "et_xmlfile-2.0.0.tar.gz", hash = "sha256:dab3f4764309081ce75662649be815c4c9081e88f0837825f90fd28317d4da54"}, +] + [[package]] name = "exceptiongroup" version = "1.3.1" @@ -792,7 +1058,7 @@ description = "Backport of PEP 654 (exception groups)" optional = false python-versions = ">=3.7" groups = ["dev"] -markers = "python_version == \"3.10\"" +markers = "python_version < \"3.11\"" files = [ {file = "exceptiongroup-1.3.1-py3-none-any.whl", hash = "sha256:a7a39a3bd276781e98394987d3a5701d0c4edffb633bb7a5144577f82c773598"}, {file = "exceptiongroup-1.3.1.tar.gz", hash = "sha256:8b412432c6055b0b7d14c310000ae93352ed6754f70fa8f7c34141f91c4e3219"}, @@ -821,77 +1087,109 @@ tests = ["asttokens (>=2.1.0)", "coverage", "coverage-enable-subprocess", "ipyth [[package]] name = "fastjsonschema" -version = "2.21.2" +version = "2.22.1" description = "Fastest Python implementation of JSON schema" optional = false -python-versions = "*" +python-versions = ">=3.10" groups = ["dev"] files = [ - {file = "fastjsonschema-2.21.2-py3-none-any.whl", hash = "sha256:1c797122d0a86c5cace2e54bf4e819c36223b552017172f32c5c024a6b77e463"}, - {file = "fastjsonschema-2.21.2.tar.gz", hash = "sha256:b1eb43748041c880796cd077f1a07c3d94e93ae84bba5ed36800a33554ae05de"}, + {file = "fastjsonschema-2.22.1-py3-none-any.whl", hash = "sha256:cf377ff5c9a6f4f3125fb35f75a2c5767bd824ffbcf62c209a93cd48d1453999"}, + {file = "fastjsonschema-2.22.1.tar.gz", hash = "sha256:0b83d1ce8d7845b959dcb20e1a5c3c8883b6541d9c52ab02cce5166b75ec805f"}, ] [package.extras] devel = ["colorama", "json-spec", "jsonschema", "pylint", "pytest", "pytest-benchmark", "pytest-cache", "validictory"] +[[package]] +name = "floris" +version = "4.6.6" +description = "A controls-oriented engineering wake model." +optional = false +python-versions = ">=3.10, <3.15" +groups = ["floris"] +files = [] +develop = false + +[package.dependencies] +attrs = "*" +coloredlogs = ">=15.0,<16.0" +matplotlib = ">=3.0,<4.0" +numexpr = ">=2.0,<3.0" +numpy = ">=2.0,<3.0" +pandas = ">=2.0,<4" +pathos = ">=0.3,<1.0" +pyyaml = ">=6.0,<7.0" +scipy = ">=1.1,<2.0" +shapely = ">=2.0,<3.0" + +[package.extras] +develop = ["isort (>=5,<9)", "pre-commit (>=4.0,<5.0)", "pytest (>=8,<10)", "pytest-benchmark (>=5.1,<6.0)", "ruff (>=0.9,<1.0)"] +docs = ["bokeh (>=3.7,<4.0)", "jupyter-book (>=1.0,<2.0)", "ruamel.yaml (>=0.18.0,<0.19.0)", "sphinx-autodoc-typehints (>=2,<4)", "sphinx-book-theme (>=1.0,<2.0)", "sphinxcontrib-autoyaml (>=1.0,<2.0)", "sphinxcontrib.mermaid (>=1,<3)"] + +[package.source] +type = "git" +url = "https://github.com/NatLabRockies/floris.git" +reference = "dev/v5-beta" +resolved_reference = "1f417ea73e27149fb5f67dec74c35e03e317f459" + [[package]] name = "fonttools" -version = "4.61.1" +version = "4.63.0" description = "Tools to manipulate font files" optional = false python-versions = ">=3.10" -groups = ["examples"] -files = [ - {file = "fonttools-4.61.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7c7db70d57e5e1089a274cbb2b1fd635c9a24de809a231b154965d415d6c6d24"}, - {file = "fonttools-4.61.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5fe9fd43882620017add5eabb781ebfbc6998ee49b35bd7f8f79af1f9f99a958"}, - {file = "fonttools-4.61.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d8db08051fc9e7d8bc622f2112511b8107d8f27cd89e2f64ec45e9825e8288da"}, - {file = "fonttools-4.61.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:a76d4cb80f41ba94a6691264be76435e5f72f2cb3cab0b092a6212855f71c2f6"}, - {file = "fonttools-4.61.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:a13fc8aeb24bad755eea8f7f9d409438eb94e82cf86b08fe77a03fbc8f6a96b1"}, - {file = "fonttools-4.61.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:b846a1fcf8beadeb9ea4f44ec5bdde393e2f1569e17d700bfc49cd69bde75881"}, - {file = "fonttools-4.61.1-cp310-cp310-win32.whl", hash = "sha256:78a7d3ab09dc47ac1a363a493e6112d8cabed7ba7caad5f54dbe2f08676d1b47"}, - {file = "fonttools-4.61.1-cp310-cp310-win_amd64.whl", hash = "sha256:eff1ac3cc66c2ac7cda1e64b4e2f3ffef474b7335f92fc3833fc632d595fcee6"}, - {file = "fonttools-4.61.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:c6604b735bb12fef8e0efd5578c9fb5d3d8532d5001ea13a19cddf295673ee09"}, - {file = "fonttools-4.61.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5ce02f38a754f207f2f06557523cd39a06438ba3aafc0639c477ac409fc64e37"}, - {file = "fonttools-4.61.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:77efb033d8d7ff233385f30c62c7c79271c8885d5c9657d967ede124671bbdfb"}, - {file = "fonttools-4.61.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:75c1a6dfac6abd407634420c93864a1e274ebc1c7531346d9254c0d8f6ca00f9"}, - {file = "fonttools-4.61.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:0de30bfe7745c0d1ffa2b0b7048fb7123ad0d71107e10ee090fa0b16b9452e87"}, - {file = "fonttools-4.61.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:58b0ee0ab5b1fc9921eccfe11d1435added19d6494dde14e323f25ad2bc30c56"}, - {file = "fonttools-4.61.1-cp311-cp311-win32.whl", hash = "sha256:f79b168428351d11e10c5aeb61a74e1851ec221081299f4cf56036a95431c43a"}, - {file = "fonttools-4.61.1-cp311-cp311-win_amd64.whl", hash = "sha256:fe2efccb324948a11dd09d22136fe2ac8a97d6c1347cf0b58a911dcd529f66b7"}, - {file = "fonttools-4.61.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:f3cb4a569029b9f291f88aafc927dd53683757e640081ca8c412781ea144565e"}, - {file = "fonttools-4.61.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:41a7170d042e8c0024703ed13b71893519a1a6d6e18e933e3ec7507a2c26a4b2"}, - {file = "fonttools-4.61.1-cp312-cp312-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:10d88e55330e092940584774ee5e8a6971b01fc2f4d3466a1d6c158230880796"}, - {file = "fonttools-4.61.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:15acc09befd16a0fb8a8f62bc147e1a82817542d72184acca9ce6e0aeda9fa6d"}, - {file = "fonttools-4.61.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e6bcdf33aec38d16508ce61fd81838f24c83c90a1d1b8c68982857038673d6b8"}, - {file = "fonttools-4.61.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:5fade934607a523614726119164ff621e8c30e8fa1ffffbbd358662056ba69f0"}, - {file = "fonttools-4.61.1-cp312-cp312-win32.whl", hash = "sha256:75da8f28eff26defba42c52986de97b22106cb8f26515b7c22443ebc9c2d3261"}, - {file = "fonttools-4.61.1-cp312-cp312-win_amd64.whl", hash = "sha256:497c31ce314219888c0e2fce5ad9178ca83fe5230b01a5006726cdf3ac9f24d9"}, - {file = "fonttools-4.61.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:8c56c488ab471628ff3bfa80964372fc13504ece601e0d97a78ee74126b2045c"}, - {file = "fonttools-4.61.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:dc492779501fa723b04d0ab1f5be046797fee17d27700476edc7ee9ae535a61e"}, - {file = "fonttools-4.61.1-cp313-cp313-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:64102ca87e84261419c3747a0d20f396eb024bdbeb04c2bfb37e2891f5fadcb5"}, - {file = "fonttools-4.61.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4c1b526c8d3f615a7b1867f38a9410849c8f4aef078535742198e942fba0e9bd"}, - {file = "fonttools-4.61.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:41ed4b5ec103bd306bb68f81dc166e77409e5209443e5773cb4ed837bcc9b0d3"}, - {file = "fonttools-4.61.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:b501c862d4901792adaec7c25b1ecc749e2662543f68bb194c42ba18d6eec98d"}, - {file = "fonttools-4.61.1-cp313-cp313-win32.whl", hash = "sha256:4d7092bb38c53bbc78e9255a59158b150bcdc115a1e3b3ce0b5f267dc35dd63c"}, - {file = "fonttools-4.61.1-cp313-cp313-win_amd64.whl", hash = "sha256:21e7c8d76f62ab13c9472ccf74515ca5b9a761d1bde3265152a6dc58700d895b"}, - {file = "fonttools-4.61.1-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:fff4f534200a04b4a36e7ae3cb74493afe807b517a09e99cb4faa89a34ed6ecd"}, - {file = "fonttools-4.61.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:d9203500f7c63545b4ce3799319fe4d9feb1a1b89b28d3cb5abd11b9dd64147e"}, - {file = "fonttools-4.61.1-cp314-cp314-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:fa646ecec9528bef693415c79a86e733c70a4965dd938e9a226b0fc64c9d2e6c"}, - {file = "fonttools-4.61.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:11f35ad7805edba3aac1a3710d104592df59f4b957e30108ae0ba6c10b11dd75"}, - {file = "fonttools-4.61.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:b931ae8f62db78861b0ff1ac017851764602288575d65b8e8ff1963fed419063"}, - {file = "fonttools-4.61.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:b148b56f5de675ee16d45e769e69f87623a4944f7443850bf9a9376e628a89d2"}, - {file = "fonttools-4.61.1-cp314-cp314-win32.whl", hash = "sha256:9b666a475a65f4e839d3d10473fad6d47e0a9db14a2f4a224029c5bfde58ad2c"}, - {file = "fonttools-4.61.1-cp314-cp314-win_amd64.whl", hash = "sha256:4f5686e1fe5fce75d82d93c47a438a25bf0d1319d2843a926f741140b2b16e0c"}, - {file = "fonttools-4.61.1-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:e76ce097e3c57c4bcb67c5aa24a0ecdbd9f74ea9219997a707a4061fbe2707aa"}, - {file = "fonttools-4.61.1-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:9cfef3ab326780c04d6646f68d4b4742aae222e8b8ea1d627c74e38afcbc9d91"}, - {file = "fonttools-4.61.1-cp314-cp314t-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:a75c301f96db737e1c5ed5fd7d77d9c34466de16095a266509e13da09751bd19"}, - {file = "fonttools-4.61.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:91669ccac46bbc1d09e9273546181919064e8df73488ea087dcac3e2968df9ba"}, - {file = "fonttools-4.61.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:c33ab3ca9d3ccd581d58e989d67554e42d8d4ded94ab3ade3508455fe70e65f7"}, - {file = "fonttools-4.61.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:664c5a68ec406f6b1547946683008576ef8b38275608e1cee6c061828171c118"}, - {file = "fonttools-4.61.1-cp314-cp314t-win32.whl", hash = "sha256:aed04cabe26f30c1647ef0e8fbb207516fd40fe9472e9439695f5c6998e60ac5"}, - {file = "fonttools-4.61.1-cp314-cp314t-win_amd64.whl", hash = "sha256:2180f14c141d2f0f3da43f3a81bc8aa4684860f6b0e6f9e165a4831f24e6a23b"}, - {file = "fonttools-4.61.1-py3-none-any.whl", hash = "sha256:17d2bf5d541add43822bcf0c43d7d847b160c9bb01d15d5007d84e2217aaa371"}, - {file = "fonttools-4.61.1.tar.gz", hash = "sha256:6675329885c44657f826ef01d9e4fb33b9158e9d93c537d84ad8399539bc6f69"}, +groups = ["examples", "floris"] +files = [ + {file = "fonttools-4.63.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:e3297a6a4059b4acc3a1e9a8b04741f240a80044eef08ebd32e8b5bcdddce75b"}, + {file = "fonttools-4.63.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b1cd75a03ad8cb5bc40c90bfde68c0c47de423aa19e5c0f362b43520645eea94"}, + {file = "fonttools-4.63.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c0425b277a59cff3d80ca42162a8de360f318438a2ac83570842a678d826d579"}, + {file = "fonttools-4.63.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:d7e5c9973aa04c95650c96e5f5ad865fbf42d62079163ecfab1e01cbc2504c22"}, + {file = "fonttools-4.63.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:cb014d58140a38135f16064c74c652ed57aa0b75cbf8bb59cac821f7edb5334e"}, + {file = "fonttools-4.63.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:032038247a96c1690f9f31e377c389383c902531b085aa4e4dabd6f57f870e69"}, + {file = "fonttools-4.63.0-cp310-cp310-win32.whl", hash = "sha256:a8b33a82979e0a6a34ff435cc81317be1f95ec1ebb7a3a2d1c8a6a54f02ae44e"}, + {file = "fonttools-4.63.0-cp310-cp310-win_amd64.whl", hash = "sha256:0c18358a155d75034911c5ee397a5b44cd19dd325dbb8b35fb60bf421d6a72ac"}, + {file = "fonttools-4.63.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:2b8ae05d9eacf6081414d759c0a352769ac28ce31280d6bb8e77b03f9e3c449f"}, + {file = "fonttools-4.63.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:79cdc9f567aec74a72918fd060283911406750cbc9fd28c1316023deb6ce31a9"}, + {file = "fonttools-4.63.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2c14b4fd138c4bafcca294765c547914e1aa431ae1ca94ab99d8db08c958bd3b"}, + {file = "fonttools-4.63.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:d76ac49f929aecaf82d83250b8347e099d7aecba0f4726c1d9b6df3b8bb5fe18"}, + {file = "fonttools-4.63.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:dcf076a4474fe0d7367e5bbf5b052c7284fa1feca729c04176ce513521afd8a0"}, + {file = "fonttools-4.63.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:7dd683fef0663e9f0f45cf541d788d24caa3ec9db50796b588e1757d8b3bc007"}, + {file = "fonttools-4.63.0-cp311-cp311-win32.whl", hash = "sha256:afefc1ed0a59785a7fb06ea7e1678e849c193e1e387db783579bc7b3056fcfcb"}, + {file = "fonttools-4.63.0-cp311-cp311-win_amd64.whl", hash = "sha256:063e08bd17bd5a90127a14123de0d6a952dbc847695fd98b63c043d58057f90c"}, + {file = "fonttools-4.63.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:37dd23e621e3b0aef1baa70a303b80aaf38449632cfc8fd2a55fb285bbccfc02"}, + {file = "fonttools-4.63.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:a9faff9e0c1f76f9fd55899d2ce785832efebab37eb8ae13995853aef178bef0"}, + {file = "fonttools-4.63.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ef3048ef05dbb552b89817713d9cac912e00d0fde4a3105c00d29e52e10c89af"}, + {file = "fonttools-4.63.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:58dc6bb86a78d782f00f9190ca02c119cf5bbe2807536e361e18d42019f877d8"}, + {file = "fonttools-4.63.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:ee08ebfa58f6e1aeff5697ab9582105bb620008c1caafb681e4c557e7483027b"}, + {file = "fonttools-4.63.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:27fdc65af8da6f88b9c6121c47a464cbe359fcfff7ff6fc2d37a1f395d755b78"}, + {file = "fonttools-4.63.0-cp312-cp312-win32.whl", hash = "sha256:af2fd1664d00a397d75f806985ddb36282091c2131a73a6485c23b4a34722263"}, + {file = "fonttools-4.63.0-cp312-cp312-win_amd64.whl", hash = "sha256:59ac449f8cca9b4ffa08d2e7bbadad87ce710d69d1eda5c3c1ce579baa987272"}, + {file = "fonttools-4.63.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:cd7e9857e5e63738b9d9fd707bc1f59c8b09e5177726d23664db393c59bb08bd"}, + {file = "fonttools-4.63.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:c2a2a42198b696a6f48fad91709afb55176e66a5e566131219dba372fb7f8c59"}, + {file = "fonttools-4.63.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1e874792a8212b44583ea02189d9e693906b2f78b261f372f95d6c563210ac1d"}, + {file = "fonttools-4.63.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:22135da48a348785c5e2d5d2d9d6bec5ed44adacbaeb9db12d9493bf6c6bfa68"}, + {file = "fonttools-4.63.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:ccf41f2efdf56994d22d73bef4ced1052161958169428d06ba9724ea9e9a64be"}, + {file = "fonttools-4.63.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:9ced0bd02ac751dd6319b0da88aaef24414e3b0dbc32bb4f24944821a3741a27"}, + {file = "fonttools-4.63.0-cp313-cp313-win32.whl", hash = "sha256:85be818f5506e8a7753153def2c9550178f0ecae6a47b5e0e8dbb23f7cc90380"}, + {file = "fonttools-4.63.0-cp313-cp313-win_amd64.whl", hash = "sha256:ba04cb5891d4c0c21b6da95eda8d7b090021508a294fff33464fc7d241e0856b"}, + {file = "fonttools-4.63.0-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:fd1e3094f42d806d3d7c79162fc59e5910fcbe3a7360c385b8da969bc4493745"}, + {file = "fonttools-4.63.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:6e528da43bc3791085f8cb6141b1d13e459226790240340fcbb4625649238b03"}, + {file = "fonttools-4.63.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6b2248c5decb223562f7902ff6325077a073f608ee8e33e88ad88db734eb9f49"}, + {file = "fonttools-4.63.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:308f957cdeaf8abe4e5f2f124902ef405448af92c90f80e302a3b771c2e6116b"}, + {file = "fonttools-4.63.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:bf00f21eb5fb721dbaf73d1e9da6d02a1af7768f2ebcf9798be98beab8ba90f6"}, + {file = "fonttools-4.63.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:c1aaa4b9c75798400ac043ce04d74e7830376c85095a5a6ed7cba2f17a266bf4"}, + {file = "fonttools-4.63.0-cp314-cp314-win32.whl", hash = "sha256:22693918177bd9ceabec4736d338045f357769416fc6b0b2508eefef75b08616"}, + {file = "fonttools-4.63.0-cp314-cp314-win_amd64.whl", hash = "sha256:7d782fac32985914c351556f68ac0855391572bcd87de50e05970d3cd4c96fc5"}, + {file = "fonttools-4.63.0-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:6db5140a60a5d731d21ec076745b40a310607731b0a565b50776393188649001"}, + {file = "fonttools-4.63.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:7d76edbff9014094dbf03bd2d074709dfa6ec7aba13d838c937a2b33d2d6a86e"}, + {file = "fonttools-4.63.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0eac00b9118c3c2f87d272e45341871c5b3066baa3c86897fa634a7c3fb59096"}, + {file = "fonttools-4.63.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:51394295f1a51de8b5f30bdb1e1b9a4231536c7064ef5c6e211eec19fa36036f"}, + {file = "fonttools-4.63.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:9e12f105d2b6342c559c298afb674006bb2893afc7102dcf8a1b55b0486b4e40"}, + {file = "fonttools-4.63.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:796f27556dbe094c4824f75ca85267e4df776c79036c8441469a4df37038c196"}, + {file = "fonttools-4.63.0-cp314-cp314t-win32.whl", hash = "sha256:948428a275741f0b64b113c955425a953314f4b9ab9997f73a72c83e68e569c8"}, + {file = "fonttools-4.63.0-cp314-cp314t-win_amd64.whl", hash = "sha256:6d4741eb179121cab9eea4cb2393d24492373a260d7945006358c08cfbf45419"}, + {file = "fonttools-4.63.0-py3-none-any.whl", hash = "sha256:445af2eab030a16b9171ea8bdda7ebf7d96bda2df88ee182a464252f6e05e20d"}, + {file = "fonttools-4.63.0.tar.gz", hash = "sha256:caeb583deeb5168e694b65cda8b4ee62abedfa66cf88488734466f2366b9c4e0"}, ] [package.extras] @@ -993,20 +1291,35 @@ http2 = ["h2 (>=3,<5)"] socks = ["socksio (==1.*)"] zstd = ["zstandard (>=0.18.0)"] +[[package]] +name = "humanfriendly" +version = "10.0" +description = "Human friendly output for text interfaces using Python" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +groups = ["floris"] +files = [ + {file = "humanfriendly-10.0-py2.py3-none-any.whl", hash = "sha256:1697e1a8a8f550fd43c2865cd84542fc175a61dcb779b6fee18cf6b6ccba1477"}, + {file = "humanfriendly-10.0.tar.gz", hash = "sha256:6b0b831ce8f15f7300721aa49829fc4e83921a9a301cc7f606be6686a2288ddc"}, +] + +[package.dependencies] +pyreadline3 = {version = "*", markers = "sys_platform == \"win32\" and python_version >= \"3.8\""} + [[package]] name = "idna" -version = "3.11" +version = "3.18" description = "Internationalized Domain Names in Applications (IDNA)" optional = false -python-versions = ">=3.8" -groups = ["dev"] +python-versions = ">=3.9" +groups = ["dev", "floris"] files = [ - {file = "idna-3.11-py3-none-any.whl", hash = "sha256:771a87f49d9defaf64091e6e6fe9c18d4833f140bd19464795bc32d966ca37ea"}, - {file = "idna-3.11.tar.gz", hash = "sha256:795dafcc9c04ed0c1fb032c2aa73654d8e8c5023a7df64a53f39190ada629902"}, + {file = "idna-3.18-py3-none-any.whl", hash = "sha256:7f952cbe720b688055e3f87de14f5c3e5fdaa8bc3928985c4077ca689de849a2"}, + {file = "idna-3.18.tar.gz", hash = "sha256:ffb385a7e039654cef1ab9ef32c6fafe283c0c0467bba1d9029738ce4a14a848"}, ] [package.extras] -all = ["flake8 (>=7.1.1)", "mypy (>=1.11.2)", "pytest (>=8.3.2)", "ruff (>=0.6.2)"] +all = ["mypy (>=1.11.2)", "pytest (>=8.3.2)", "ruff (>=0.6.2)"] [[package]] name = "iniconfig" @@ -1056,14 +1369,14 @@ test = ["flaky", "ipyparallel", "pre-commit", "pytest (>=7.0,<9)", "pytest-async [[package]] name = "ipython" -version = "8.38.0" +version = "8.39.0" description = "IPython: Productive Interactive Computing" optional = false python-versions = ">=3.10" groups = ["dev"] files = [ - {file = "ipython-8.38.0-py3-none-any.whl", hash = "sha256:750162629d800ac65bb3b543a14e7a74b0e88063eac9b92124d4b2aa3f6d8e86"}, - {file = "ipython-8.38.0.tar.gz", hash = "sha256:9cfea8c903ce0867cc2f23199ed8545eb741f3a69420bfcf3743ad1cec856d39"}, + {file = "ipython-8.39.0-py3-none-any.whl", hash = "sha256:bb3c51c4fa8148ab1dea07a79584d1c854e234ea44aa1283bcb37bc75054651f"}, + {file = "ipython-8.39.0.tar.gz", hash = "sha256:4110ae96012c379b8b6db898a07e186c40a2a1ef5d57a7fa83166047d9da7624"}, ] [package.dependencies] @@ -1132,23 +1445,22 @@ arrow = ">=0.15.0" [[package]] name = "jedi" -version = "0.19.2" +version = "0.20.0" description = "An autocompletion tool for Python that can be used for text editors." optional = false -python-versions = ">=3.6" +python-versions = ">=3.10" groups = ["dev"] files = [ - {file = "jedi-0.19.2-py2.py3-none-any.whl", hash = "sha256:a8ef22bde8490f57fe5c7681a3c83cb58874daf72b4784de3cce5b6ef6edb5b9"}, - {file = "jedi-0.19.2.tar.gz", hash = "sha256:4770dc3de41bde3966b02eb84fbcf557fb33cce26ad23da12c742fb50ecb11f0"}, + {file = "jedi-0.20.0-py2.py3-none-any.whl", hash = "sha256:7bdd9c2634f56713299976f4cbd59cb3fa92165cc5e05ea811fb253480728b67"}, + {file = "jedi-0.20.0.tar.gz", hash = "sha256:c3f4ccbd276696f4b19c54618d4fb18f9fc24b0aef02acf704b23f487daa1011"}, ] [package.dependencies] -parso = ">=0.8.4,<0.9.0" +parso = ">=0.8.6,<0.9.0" [package.extras] -docs = ["Jinja2 (==2.11.3)", "MarkupSafe (==1.1.1)", "Pygments (==2.8.1)", "alabaster (==0.7.12)", "babel (==2.9.1)", "chardet (==4.0.0)", "commonmark (==0.8.1)", "docutils (==0.17.1)", "future (==0.18.2)", "idna (==2.10)", "imagesize (==1.2.0)", "mock (==1.0.1)", "packaging (==20.9)", "pyparsing (==2.4.7)", "pytz (==2021.1)", "readthedocs-sphinx-ext (==2.1.4)", "recommonmark (==0.5.0)", "requests (==2.25.1)", "six (==1.15.0)", "snowballstemmer (==2.1.0)", "sphinx (==1.8.5)", "sphinx-rtd-theme (==0.4.3)", "sphinxcontrib-serializinghtml (==1.1.4)", "sphinxcontrib-websupport (==1.2.4)", "urllib3 (==1.26.4)"] -qa = ["flake8 (==5.0.4)", "mypy (==0.971)", "types-setuptools (==67.2.0.1)"] -testing = ["Django", "attrs", "colorama", "docopt", "pytest (<9.0.0)"] +dev = ["Django", "attrs", "colorama", "docopt", "flake8 (==7.1.2)", "pytest (<9.0.0)", "types-setuptools (==80.9.0.20250529)", "typing-extensions", "zuban (==0.7.0)"] +docs = ["Jinja2 (==3.1.6)", "MarkupSafe (==3.0.3)", "Pygments (==2.20.0)", "Sphinx (==9.1.0)", "alabaster (==1.0.0)", "babel (==2.18.0)", "certifi (==2026.4.22)", "charset-normalizer (==3.4.7)", "docutils (==0.22.4)", "idna (==3.13)", "imagesize (==2.0.0)", "iniconfig (==2.3.0)", "packaging (==26.2)", "pluggy (==1.6.0)", "pytest (==9.0.3)", "requests (==2.33.1)", "roman-numerals (==4.1.0)", "snowballstemmer (==3.0.1)", "sphinx-rtd-theme (==3.1.0)", "sphinxcontrib-applehelp (==2.0.0)", "sphinxcontrib-devhelp (==2.0.0)", "sphinxcontrib-htmlhelp (==2.1.0)", "sphinxcontrib-jquery (==4.1)", "sphinxcontrib-jsmath (==1.0.1)", "sphinxcontrib-qthelp (==2.0.0)", "sphinxcontrib-serializinghtml (==2.0.0)", "urllib3 (==2.6.3)"] [[package]] name = "jinja2" @@ -1168,28 +1480,55 @@ MarkupSafe = ">=2.0" [package.extras] i18n = ["Babel (>=2.7)"] +[[package]] +name = "joblib" +version = "1.5.3" +description = "Lightweight pipelining with Python functions" +optional = false +python-versions = ">=3.9" +groups = ["floris"] +files = [ + {file = "joblib-1.5.3-py3-none-any.whl", hash = "sha256:5fc3c5039fc5ca8c0276333a188bbd59d6b7ab37fe6632daa76bc7f9ec18e713"}, + {file = "joblib-1.5.3.tar.gz", hash = "sha256:8561a3269e6801106863fd0d6d84bb737be9e7631e33aaed3fb9ce5953688da3"}, +] + [[package]] name = "json5" -version = "0.13.0" +version = "0.15.0" description = "A Python implementation of the JSON5 data format." optional = false python-versions = ">=3.8.0" groups = ["dev"] files = [ - {file = "json5-0.13.0-py3-none-any.whl", hash = "sha256:9a08e1dd65f6a4d4c6fa82d216cf2477349ec2346a38fd70cc11d2557499fbcc"}, - {file = "json5-0.13.0.tar.gz", hash = "sha256:b1edf8d487721c0bf64d83c28e91280781f6e21f4a797d3261c7c828d4c165bf"}, + {file = "json5-0.15.0-py3-none-any.whl", hash = "sha256:56636a30c0e8a4665fe2179c0212f32eae3796dea89ea6f649b9436ecdb39618"}, + {file = "json5-0.15.0.tar.gz", hash = "sha256:7424d1f1eb1d56da6e3d70643f53619862b4ce81440bdb8ecfd6f875e5ba4a71"}, +] + +[[package]] +name = "jsonmerge" +version = "1.9.2" +description = "Merge a series of JSON documents." +optional = false +python-versions = "*" +groups = ["floris"] +files = [ + {file = "jsonmerge-1.9.2-py3-none-any.whl", hash = "sha256:cab93ee7763fb51a4a09bbdab2eacf499ffb208ab94247ae86acea3e0e823b05"}, + {file = "jsonmerge-1.9.2.tar.gz", hash = "sha256:c43757e0180b0e19b7ae4c130ad42a07cc580c31912f61f4823e8eaf2fa394a3"}, ] +[package.dependencies] +jsonschema = ">2.4.0" + [[package]] name = "jsonpointer" -version = "3.0.0" -description = "Identify specific nodes in a JSON document (RFC 6901)" +version = "3.1.1" +description = "Identify specific nodes in a JSON document (RFC 6901) " optional = false -python-versions = ">=3.7" +python-versions = ">=3.10" groups = ["dev"] files = [ - {file = "jsonpointer-3.0.0-py2.py3-none-any.whl", hash = "sha256:13e088adc14fca8b6aa8177c044e12701e6ad4b28ff10e65f2267a90109c9942"}, - {file = "jsonpointer-3.0.0.tar.gz", hash = "sha256:2b2d729f2091522d61c3b31f82e11870f60b68f43fbc705cb76bf4b832af59ef"}, + {file = "jsonpointer-3.1.1-py3-none-any.whl", hash = "sha256:8ff8b95779d071ba472cf5bc913028df06031797532f08a7d5b602d8b2a488ca"}, + {file = "jsonpointer-3.1.1.tar.gz", hash = "sha256:0b801c7db33a904024f6004d526dcc53bbb8a4a0f4e32bfd10beadf60adf1900"}, ] [[package]] @@ -1198,7 +1537,7 @@ version = "4.26.0" description = "An implementation of JSON Schema validation for Python" optional = false python-versions = ">=3.10" -groups = ["dev"] +groups = ["dev", "floris"] files = [ {file = "jsonschema-4.26.0-py3-none-any.whl", hash = "sha256:d489f15263b8d200f8387e64b4c3a75f06629559fb73deb8fdfb525f2dab50ce"}, {file = "jsonschema-4.26.0.tar.gz", hash = "sha256:0c26707e2efad8aa1bfc5b7ce170f3fccc2e4918ff85989ba9ffa9facb2be326"}, @@ -1210,7 +1549,7 @@ fqdn = {version = "*", optional = true, markers = "extra == \"format-nongpl\""} idna = {version = "*", optional = true, markers = "extra == \"format-nongpl\""} isoduration = {version = "*", optional = true, markers = "extra == \"format-nongpl\""} jsonpointer = {version = ">1.13", optional = true, markers = "extra == \"format-nongpl\""} -jsonschema-specifications = ">=2023.3.6" +jsonschema-specifications = ">=2023.03.6" referencing = ">=0.28.4" rfc3339-validator = {version = "*", optional = true, markers = "extra == \"format-nongpl\""} rfc3986-validator = {version = ">0.1.0", optional = true, markers = "extra == \"format-nongpl\""} @@ -1229,7 +1568,7 @@ version = "2025.9.1" description = "The JSON Schema meta-schemas and vocabularies, exposed as a Registry" optional = false python-versions = ">=3.9" -groups = ["dev"] +groups = ["dev", "floris"] files = [ {file = "jsonschema_specifications-2025.9.1-py3-none-any.whl", hash = "sha256:98802fee3a11ee76ecaca44429fda8a41bff98b00a0f2838151b113f210cc6fe"}, {file = "jsonschema_specifications-2025.9.1.tar.gz", hash = "sha256:b540987f239e745613c7a9176f3edb72b832a4ac465cf02712288397832b5e8d"}, @@ -1258,16 +1597,37 @@ jupyterlab = "*" nbconvert = "*" notebook = "*" +[[package]] +name = "jupyter-builder" +version = "1.2.2" +description = "JupyterLab build tools" +optional = false +python-versions = ">=3.10" +groups = ["dev"] +files = [ + {file = "jupyter_builder-1.2.2-py3-none-any.whl", hash = "sha256:6ebcd4c49daf5df6a18068a74a48010406700ed90a76c189fac43eaf85c60c63"}, + {file = "jupyter_builder-1.2.2.tar.gz", hash = "sha256:b6cea88f58e44b2c5eba96f28d2e0d16fd453d3ca6dc9c4492ff8a1f2e97f601"}, +] + +[package.dependencies] +jupyter-core = "*" +tomli = {version = "*", markers = "python_version < \"3.11\""} +traitlets = "*" + +[package.extras] +dev = ["build", "hatch", "mypy", "pre-commit", "ruff (==0.16.0)"] +test = ["copier (>=9.3,<10)", "coverage[toml] (>=7.10.6)", "deptry", "jinja2-time", "pytest (>=7.0)", "pytest-check-links (>=0.7)", "pytest-cov (>=7)"] + [[package]] name = "jupyter-client" -version = "8.8.0" +version = "8.9.1" description = "Jupyter protocol implementation and client libraries" optional = false python-versions = ">=3.10" groups = ["dev"] files = [ - {file = "jupyter_client-8.8.0-py3-none-any.whl", hash = "sha256:f93a5b99c5e23a507b773d3a1136bd6e16c67883ccdbd9a829b0bbdb98cd7d7a"}, - {file = "jupyter_client-8.8.0.tar.gz", hash = "sha256:d556811419a4f2d96c869af34e854e3f059b7cc2d6d01a9cd9c85c267691be3e"}, + {file = "jupyter_client-8.9.1-py3-none-any.whl", hash = "sha256:0b7a295bc46e8751e9adae84781f726c851c1d911bd793edc4a3bde942e3da81"}, + {file = "jupyter_client-8.9.1.tar.gz", hash = "sha256:a58f730dd9e728ba16ba1d62ebccf7ffe1ebbdbce4e95cfae941b7321ae1f4fa"}, ] [package.dependencies] @@ -1276,6 +1636,7 @@ python-dateutil = ">=2.8.2" pyzmq = ">=25.0" tornado = ">=6.4.1" traitlets = ">=5.3" +typing-extensions = ">=4.13.0" [package.extras] docs = ["ipykernel", "myst-parser", "pydata-sphinx-theme", "sphinx (>=4)", "sphinx-autodoc-typehints", "sphinxcontrib-github-alt", "sphinxcontrib-spelling"] @@ -1329,14 +1690,14 @@ test = ["ipykernel", "pre-commit", "pytest (<9)", "pytest-cov", "pytest-timeout" [[package]] name = "jupyter-events" -version = "0.12.0" +version = "0.12.1" description = "Jupyter Event System library" optional = false python-versions = ">=3.9" groups = ["dev"] files = [ - {file = "jupyter_events-0.12.0-py3-none-any.whl", hash = "sha256:6464b2fa5ad10451c3d35fabc75eab39556ae1e2853ad0c0cc31b656731a97fb"}, - {file = "jupyter_events-0.12.0.tar.gz", hash = "sha256:fc3fce98865f6784c9cd0a56a20644fc6098f21c8c33834a8d9fe383c17e554b"}, + {file = "jupyter_events-0.12.1-py3-none-any.whl", hash = "sha256:c366585253f537a627da52fa7ca7410c5b5301fe893f511e7b077c2d93ec8bcf"}, + {file = "jupyter_events-0.12.1.tar.gz", hash = "sha256:faff25f77218335752f35f23c5fe6e4a392a7bd99a5939ccb9b8fbf594636cf3"}, ] [package.dependencies] @@ -1356,14 +1717,14 @@ test = ["click", "pre-commit", "pytest (>=7.0)", "pytest-asyncio (>=0.19.0)", "p [[package]] name = "jupyter-lsp" -version = "2.3.0" +version = "2.3.1" description = "Multi-Language Server WebSocket proxy for Jupyter Notebook/Lab server" optional = false python-versions = ">=3.8" groups = ["dev"] files = [ - {file = "jupyter_lsp-2.3.0-py3-none-any.whl", hash = "sha256:e914a3cb2addf48b1c7710914771aaf1819d46b2e5a79b0f917b5478ec93f34f"}, - {file = "jupyter_lsp-2.3.0.tar.gz", hash = "sha256:458aa59339dc868fb784d73364f17dbce8836e906cd75fd471a325cba02e0245"}, + {file = "jupyter_lsp-2.3.1-py3-none-any.whl", hash = "sha256:71b954d834e85ff3096400554f2eefaf7fe37053036f9a782b0f7c5e42dadb81"}, + {file = "jupyter_lsp-2.3.1.tar.gz", hash = "sha256:fdf8a4aa7d85813976d6e29e95e6a2c8f752701f926f2715305249a3829805a6"}, ] [package.dependencies] @@ -1371,14 +1732,14 @@ jupyter_server = ">=1.1.2" [[package]] name = "jupyter-server" -version = "2.17.0" +version = "2.20.0" description = "The backend—i.e. core services, APIs, and REST endpoints—to Jupyter web applications." optional = false -python-versions = ">=3.9" +python-versions = ">=3.10" groups = ["dev"] files = [ - {file = "jupyter_server-2.17.0-py3-none-any.whl", hash = "sha256:e8cb9c7db4251f51ed307e329b81b72ccf2056ff82d50524debde1ee1870e13f"}, - {file = "jupyter_server-2.17.0.tar.gz", hash = "sha256:c38ea898566964c888b4772ae1ed58eca84592e88251d2cfc4d171f81f7e99d5"}, + {file = "jupyter_server-2.20.0-py3-none-any.whl", hash = "sha256:c3b67c93c471e947c18b5026f04f21614218adb706df8f48227d3ee8e0a7cdcc"}, + {file = "jupyter_server-2.20.0.tar.gz", hash = "sha256:b5778ba337d8015a3dc2b80803ecdd5ac18d3797fddf61a50ea5fb472b4ebe14"}, ] [package.dependencies] @@ -1394,7 +1755,7 @@ nbformat = ">=5.3.0" overrides = {version = ">=5.0", markers = "python_version < \"3.12\""} packaging = ">=22.0" prometheus-client = ">=0.9" -pywinpty = {version = ">=2.0.1", markers = "os_name == \"nt\""} +pywinpty = {version = ">=2.0.1,<3.0.4 || >3.0.4", markers = "os_name == \"nt\""} pyzmq = ">=24" send2trash = ">=1.8.2" terminado = ">=0.8.3" @@ -1403,8 +1764,8 @@ traitlets = ">=5.6.0" websocket-client = ">=1.7" [package.extras] -docs = ["ipykernel", "jinja2", "jupyter-client", "myst-parser", "nbformat", "prometheus-client", "pydata-sphinx-theme", "send2trash", "sphinx-autodoc-typehints", "sphinxcontrib-github-alt", "sphinxcontrib-openapi (>=0.8.0)", "sphinxcontrib-spelling", "sphinxemoji", "tornado", "typing-extensions"] -test = ["flaky", "ipykernel", "pre-commit", "pytest (>=7.0,<9)", "pytest-console-scripts", "pytest-jupyter[server] (>=0.7)", "pytest-timeout", "requests"] +docs = ["ipykernel", "jinja2", "jupyter-client", "myst-parser", "nbformat", "prometheus-client", "pydata-sphinx-theme", "send2trash", "sphinx (<9.0)", "sphinx-autodoc-typehints", "sphinxcontrib-github-alt", "sphinxcontrib-openapi (>=0.8.0)", "sphinxcontrib-spelling", "sphinxemoji", "tornado", "typing-extensions"] +test = ["flaky", "ipykernel", "pre-commit", "pytest (>=7.0,<10)", "pytest-console-scripts", "pytest-jupyter[server] (>=0.7)", "pytest-timeout", "requests"] [[package]] name = "jupyter-server-terminals" @@ -1428,14 +1789,14 @@ test = ["jupyter-server (>=2.0.0)", "pytest (>=7.0)", "pytest-jupyter[server] (> [[package]] name = "jupyterlab" -version = "4.5.5" +version = "4.6.3" description = "JupyterLab computational environment" optional = false -python-versions = ">=3.9" +python-versions = ">=3.10" groups = ["dev"] files = [ - {file = "jupyterlab-4.5.5-py3-none-any.whl", hash = "sha256:a35694a40a8e7f2e82f387472af24e61b22adcce87b5a8ab97a5d9c486202a6d"}, - {file = "jupyterlab-4.5.5.tar.gz", hash = "sha256:eac620698c59eb810e1729909be418d9373d18137cac66637141abba613b3fda"}, + {file = "jupyterlab-4.6.3-py3-none-any.whl", hash = "sha256:0a1ebc6567186f1eabd99536e94df7ed9e96d1e7c5ddf3e4406ae16e88abacb7"}, + {file = "jupyterlab-4.6.3.tar.gz", hash = "sha256:2e3db6e3a12495ebd188276e985bf5ac502fbde3d1e8628819920210008de498"}, ] [package.dependencies] @@ -1443,22 +1804,22 @@ async-lru = ">=1.0.0" httpx = ">=0.25.0,<1" ipykernel = ">=6.5.0,<6.30.0 || >6.30.0" jinja2 = ">=3.0.3" +jupyter-builder = ">=1.0.2" jupyter-core = "*" jupyter-lsp = ">=2.0.0" -jupyter-server = ">=2.4.0,<3" +jupyter-server = ">=2.19.0,<3" jupyterlab-server = ">=2.28.0,<3" notebook-shim = ">=0.2" -packaging = "*" -setuptools = ">=41.1.0" +packaging = ">=23.2" tomli = {version = ">=1.2.2", markers = "python_version < \"3.11\""} tornado = ">=6.2.0" traitlets = "*" +typing-extensions = {version = ">=4.4.0", markers = "python_version < \"3.12\""} [package.extras] -dev = ["build", "bump2version", "coverage", "hatch", "pre-commit", "pytest-cov", "ruff (==0.11.12)"] -docs = ["jsx-lexer", "myst-parser", "pydata-sphinx-theme (>=0.13.0)", "pytest", "pytest-check-links", "pytest-jupyter", "sphinx (>=1.8,<8.2.0)", "sphinx-copybutton"] -docs-screenshots = ["altair (==6.0.0)", "ipython (==8.16.1)", "ipywidgets (==8.1.5)", "jupyterlab-geojson (==3.4.0)", "jupyterlab-language-pack-zh-cn (==4.3.post1)", "matplotlib (==3.10.0)", "nbconvert (>=7.0.0)", "pandas (==2.2.3)", "scipy (==1.15.1)"] -test = ["coverage", "pytest (>=7.0)", "pytest-check-links (>=0.7)", "pytest-console-scripts", "pytest-cov", "pytest-jupyter (>=0.5.3)", "pytest-timeout", "pytest-tornasync", "requests", "requests-cache", "virtualenv"] +dev = ["build", "bump2version", "coverage", "hatch", "pre-commit", "pytest-cov", "ruff (==0.15.15)", "shellcheck-py"] +docs-screenshots = ["altair (==6.0.0)", "ipykernel (<7.0)", "ipython (==8.16.1)", "ipywidgets (==8.1.5)", "jupyterlab-geojson (==3.4.0)", "jupyterlab-language-pack-zh-cn (==4.3.post1)", "matplotlib (==3.10.0)", "nbconvert (>=7.0.0)", "pandas (==2.2.3)", "scipy (==1.15.1)"] +test = ["coverage", "pytest (>=7.0)", "pytest-check-links (>=0.7)", "pytest-console-scripts", "pytest-cov", "pytest-jupyter (>=0.5.3)", "pytest-timeout", "pytest-tornasync", "pytest-xdist", "requests", "requests-cache", "virtualenv"] upgrade-extension = ["copier (>=9,<10)", "jinja2-time (<0.3)", "pydantic (<3.0)", "pyyaml-include (<3.0)", "tomli-w (<2.0)"] [[package]] @@ -1513,113 +1874,129 @@ files = [ [[package]] name = "kiwisolver" -version = "1.4.9" +version = "1.5.0" description = "A fast implementation of the Cassowary constraint solver" optional = false python-versions = ">=3.10" -groups = ["examples"] -files = [ - {file = "kiwisolver-1.4.9-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:b4b4d74bda2b8ebf4da5bd42af11d02d04428b2c32846e4c2c93219df8a7987b"}, - {file = "kiwisolver-1.4.9-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:fb3b8132019ea572f4611d770991000d7f58127560c4889729248eb5852a102f"}, - {file = "kiwisolver-1.4.9-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:84fd60810829c27ae375114cd379da1fa65e6918e1da405f356a775d49a62bcf"}, - {file = "kiwisolver-1.4.9-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:b78efa4c6e804ecdf727e580dbb9cba85624d2e1c6b5cb059c66290063bd99a9"}, - {file = "kiwisolver-1.4.9-cp310-cp310-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d4efec7bcf21671db6a3294ff301d2fc861c31faa3c8740d1a94689234d1b415"}, - {file = "kiwisolver-1.4.9-cp310-cp310-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:90f47e70293fc3688b71271100a1a5453aa9944a81d27ff779c108372cf5567b"}, - {file = "kiwisolver-1.4.9-cp310-cp310-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:8fdca1def57a2e88ef339de1737a1449d6dbf5fab184c54a1fca01d541317154"}, - {file = "kiwisolver-1.4.9-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:9cf554f21be770f5111a1690d42313e140355e687e05cf82cb23d0a721a64a48"}, - {file = "kiwisolver-1.4.9-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:fc1795ac5cd0510207482c3d1d3ed781143383b8cfd36f5c645f3897ce066220"}, - {file = "kiwisolver-1.4.9-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:ccd09f20ccdbbd341b21a67ab50a119b64a403b09288c27481575105283c1586"}, - {file = "kiwisolver-1.4.9-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:540c7c72324d864406a009d72f5d6856f49693db95d1fbb46cf86febef873634"}, - {file = "kiwisolver-1.4.9-cp310-cp310-win_amd64.whl", hash = "sha256:ede8c6d533bc6601a47ad4046080d36b8fc99f81e6f1c17b0ac3c2dc91ac7611"}, - {file = "kiwisolver-1.4.9-cp310-cp310-win_arm64.whl", hash = "sha256:7b4da0d01ac866a57dd61ac258c5607b4cd677f63abaec7b148354d2b2cdd536"}, - {file = "kiwisolver-1.4.9-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:eb14a5da6dc7642b0f3a18f13654847cd8b7a2550e2645a5bda677862b03ba16"}, - {file = "kiwisolver-1.4.9-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:39a219e1c81ae3b103643d2aedb90f1ef22650deb266ff12a19e7773f3e5f089"}, - {file = "kiwisolver-1.4.9-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2405a7d98604b87f3fc28b1716783534b1b4b8510d8142adca34ee0bc3c87543"}, - {file = "kiwisolver-1.4.9-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:dc1ae486f9abcef254b5618dfb4113dd49f94c68e3e027d03cf0143f3f772b61"}, - {file = "kiwisolver-1.4.9-cp311-cp311-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8a1f570ce4d62d718dce3f179ee78dac3b545ac16c0c04bb363b7607a949c0d1"}, - {file = "kiwisolver-1.4.9-cp311-cp311-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:cb27e7b78d716c591e88e0a09a2139c6577865d7f2e152488c2cc6257f460872"}, - {file = "kiwisolver-1.4.9-cp311-cp311-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:15163165efc2f627eb9687ea5f3a28137217d217ac4024893d753f46bce9de26"}, - {file = "kiwisolver-1.4.9-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:bdee92c56a71d2b24c33a7d4c2856bd6419d017e08caa7802d2963870e315028"}, - {file = "kiwisolver-1.4.9-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:412f287c55a6f54b0650bd9b6dce5aceddb95864a1a90c87af16979d37c89771"}, - {file = "kiwisolver-1.4.9-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:2c93f00dcba2eea70af2be5f11a830a742fe6b579a1d4e00f47760ef13be247a"}, - {file = "kiwisolver-1.4.9-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f117e1a089d9411663a3207ba874f31be9ac8eaa5b533787024dc07aeb74f464"}, - {file = "kiwisolver-1.4.9-cp311-cp311-win_amd64.whl", hash = "sha256:be6a04e6c79819c9a8c2373317d19a96048e5a3f90bec587787e86a1153883c2"}, - {file = "kiwisolver-1.4.9-cp311-cp311-win_arm64.whl", hash = "sha256:0ae37737256ba2de764ddc12aed4956460277f00c4996d51a197e72f62f5eec7"}, - {file = "kiwisolver-1.4.9-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:ac5a486ac389dddcc5bef4f365b6ae3ffff2c433324fb38dd35e3fab7c957999"}, - {file = "kiwisolver-1.4.9-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:f2ba92255faa7309d06fe44c3a4a97efe1c8d640c2a79a5ef728b685762a6fd2"}, - {file = "kiwisolver-1.4.9-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4a2899935e724dd1074cb568ce7ac0dce28b2cd6ab539c8e001a8578eb106d14"}, - {file = "kiwisolver-1.4.9-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f6008a4919fdbc0b0097089f67a1eb55d950ed7e90ce2cc3e640abadd2757a04"}, - {file = "kiwisolver-1.4.9-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:67bb8b474b4181770f926f7b7d2f8c0248cbcb78b660fdd41a47054b28d2a752"}, - {file = "kiwisolver-1.4.9-cp312-cp312-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:2327a4a30d3ee07d2fbe2e7933e8a37c591663b96ce42a00bc67461a87d7df77"}, - {file = "kiwisolver-1.4.9-cp312-cp312-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:7a08b491ec91b1d5053ac177afe5290adacf1f0f6307d771ccac5de30592d198"}, - {file = "kiwisolver-1.4.9-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:d8fc5c867c22b828001b6a38d2eaeb88160bf5783c6cb4a5e440efc981ce286d"}, - {file = "kiwisolver-1.4.9-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:3b3115b2581ea35bb6d1f24a4c90af37e5d9b49dcff267eeed14c3893c5b86ab"}, - {file = "kiwisolver-1.4.9-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:858e4c22fb075920b96a291928cb7dea5644e94c0ee4fcd5af7e865655e4ccf2"}, - {file = "kiwisolver-1.4.9-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ed0fecd28cc62c54b262e3736f8bb2512d8dcfdc2bcf08be5f47f96bf405b145"}, - {file = "kiwisolver-1.4.9-cp312-cp312-win_amd64.whl", hash = "sha256:f68208a520c3d86ea51acf688a3e3002615a7f0238002cccc17affecc86a8a54"}, - {file = "kiwisolver-1.4.9-cp312-cp312-win_arm64.whl", hash = "sha256:2c1a4f57df73965f3f14df20b80ee29e6a7930a57d2d9e8491a25f676e197c60"}, - {file = "kiwisolver-1.4.9-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:a5d0432ccf1c7ab14f9949eec60c5d1f924f17c037e9f8b33352fa05799359b8"}, - {file = "kiwisolver-1.4.9-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:efb3a45b35622bb6c16dbfab491a8f5a391fe0e9d45ef32f4df85658232ca0e2"}, - {file = "kiwisolver-1.4.9-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:1a12cf6398e8a0a001a059747a1cbf24705e18fe413bc22de7b3d15c67cffe3f"}, - {file = "kiwisolver-1.4.9-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:b67e6efbf68e077dd71d1a6b37e43e1a99d0bff1a3d51867d45ee8908b931098"}, - {file = "kiwisolver-1.4.9-cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5656aa670507437af0207645273ccdfee4f14bacd7f7c67a4306d0dcaeaf6eed"}, - {file = "kiwisolver-1.4.9-cp313-cp313-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:bfc08add558155345129c7803b3671cf195e6a56e7a12f3dde7c57d9b417f525"}, - {file = "kiwisolver-1.4.9-cp313-cp313-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:40092754720b174e6ccf9e845d0d8c7d8e12c3d71e7fc35f55f3813e96376f78"}, - {file = "kiwisolver-1.4.9-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:497d05f29a1300d14e02e6441cf0f5ee81c1ff5a304b0d9fb77423974684e08b"}, - {file = "kiwisolver-1.4.9-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:bdd1a81a1860476eb41ac4bc1e07b3f07259e6d55bbf739b79c8aaedcf512799"}, - {file = "kiwisolver-1.4.9-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:e6b93f13371d341afee3be9f7c5964e3fe61d5fa30f6a30eb49856935dfe4fc3"}, - {file = "kiwisolver-1.4.9-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:d75aa530ccfaa593da12834b86a0724f58bff12706659baa9227c2ccaa06264c"}, - {file = "kiwisolver-1.4.9-cp313-cp313-win_amd64.whl", hash = "sha256:dd0a578400839256df88c16abddf9ba14813ec5f21362e1fe65022e00c883d4d"}, - {file = "kiwisolver-1.4.9-cp313-cp313-win_arm64.whl", hash = "sha256:d4188e73af84ca82468f09cadc5ac4db578109e52acb4518d8154698d3a87ca2"}, - {file = "kiwisolver-1.4.9-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:5a0f2724dfd4e3b3ac5a82436a8e6fd16baa7d507117e4279b660fe8ca38a3a1"}, - {file = "kiwisolver-1.4.9-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:1b11d6a633e4ed84fc0ddafd4ebfd8ea49b3f25082c04ad12b8315c11d504dc1"}, - {file = "kiwisolver-1.4.9-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:61874cdb0a36016354853593cffc38e56fc9ca5aa97d2c05d3dcf6922cd55a11"}, - {file = "kiwisolver-1.4.9-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:60c439763a969a6af93b4881db0eed8fadf93ee98e18cbc35bc8da868d0c4f0c"}, - {file = "kiwisolver-1.4.9-cp313-cp313t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:92a2f997387a1b79a75e7803aa7ded2cfbe2823852ccf1ba3bcf613b62ae3197"}, - {file = "kiwisolver-1.4.9-cp313-cp313t-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a31d512c812daea6d8b3be3b2bfcbeb091dbb09177706569bcfc6240dcf8b41c"}, - {file = "kiwisolver-1.4.9-cp313-cp313t-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:52a15b0f35dad39862d376df10c5230155243a2c1a436e39eb55623ccbd68185"}, - {file = "kiwisolver-1.4.9-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:a30fd6fdef1430fd9e1ba7b3398b5ee4e2887783917a687d86ba69985fb08748"}, - {file = "kiwisolver-1.4.9-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:cc9617b46837c6468197b5945e196ee9ca43057bb7d9d1ae688101e4e1dddf64"}, - {file = "kiwisolver-1.4.9-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:0ab74e19f6a2b027ea4f845a78827969af45ce790e6cb3e1ebab71bdf9f215ff"}, - {file = "kiwisolver-1.4.9-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:dba5ee5d3981160c28d5490f0d1b7ed730c22470ff7f6cc26cfcfaacb9896a07"}, - {file = "kiwisolver-1.4.9-cp313-cp313t-win_arm64.whl", hash = "sha256:0749fd8f4218ad2e851e11cc4dc05c7cbc0cbc4267bdfdb31782e65aace4ee9c"}, - {file = "kiwisolver-1.4.9-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:9928fe1eb816d11ae170885a74d074f57af3a0d65777ca47e9aeb854a1fba386"}, - {file = "kiwisolver-1.4.9-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:d0005b053977e7b43388ddec89fa567f43d4f6d5c2c0affe57de5ebf290dc552"}, - {file = "kiwisolver-1.4.9-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:2635d352d67458b66fd0667c14cb1d4145e9560d503219034a18a87e971ce4f3"}, - {file = "kiwisolver-1.4.9-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:767c23ad1c58c9e827b649a9ab7809fd5fd9db266a9cf02b0e926ddc2c680d58"}, - {file = "kiwisolver-1.4.9-cp314-cp314-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:72d0eb9fba308b8311685c2268cf7d0a0639a6cd027d8128659f72bdd8a024b4"}, - {file = "kiwisolver-1.4.9-cp314-cp314-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f68e4f3eeca8fb22cc3d731f9715a13b652795ef657a13df1ad0c7dc0e9731df"}, - {file = "kiwisolver-1.4.9-cp314-cp314-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d84cd4061ae292d8ac367b2c3fa3aad11cb8625a95d135fe93f286f914f3f5a6"}, - {file = "kiwisolver-1.4.9-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:a60ea74330b91bd22a29638940d115df9dc00af5035a9a2a6ad9399ffb4ceca5"}, - {file = "kiwisolver-1.4.9-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:ce6a3a4e106cf35c2d9c4fa17c05ce0b180db622736845d4315519397a77beaf"}, - {file = "kiwisolver-1.4.9-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:77937e5e2a38a7b48eef0585114fe7930346993a88060d0bf886086d2aa49ef5"}, - {file = "kiwisolver-1.4.9-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:24c175051354f4a28c5d6a31c93906dc653e2bf234e8a4bbfb964892078898ce"}, - {file = "kiwisolver-1.4.9-cp314-cp314-win_amd64.whl", hash = "sha256:0763515d4df10edf6d06a3c19734e2566368980d21ebec439f33f9eb936c07b7"}, - {file = "kiwisolver-1.4.9-cp314-cp314-win_arm64.whl", hash = "sha256:0e4e2bf29574a6a7b7f6cb5fa69293b9f96c928949ac4a53ba3f525dffb87f9c"}, - {file = "kiwisolver-1.4.9-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:d976bbb382b202f71c67f77b0ac11244021cfa3f7dfd9e562eefcea2df711548"}, - {file = "kiwisolver-1.4.9-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:2489e4e5d7ef9a1c300a5e0196e43d9c739f066ef23270607d45aba368b91f2d"}, - {file = "kiwisolver-1.4.9-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:e2ea9f7ab7fbf18fffb1b5434ce7c69a07582f7acc7717720f1d69f3e806f90c"}, - {file = "kiwisolver-1.4.9-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:b34e51affded8faee0dfdb705416153819d8ea9250bbbf7ea1b249bdeb5f1122"}, - {file = "kiwisolver-1.4.9-cp314-cp314t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d8aacd3d4b33b772542b2e01beb50187536967b514b00003bdda7589722d2a64"}, - {file = "kiwisolver-1.4.9-cp314-cp314t-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:7cf974dd4e35fa315563ac99d6287a1024e4dc2077b8a7d7cd3d2fb65d283134"}, - {file = "kiwisolver-1.4.9-cp314-cp314t-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:85bd218b5ecfbee8c8a82e121802dcb519a86044c9c3b2e4aef02fa05c6da370"}, - {file = "kiwisolver-1.4.9-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:0856e241c2d3df4efef7c04a1e46b1936b6120c9bcf36dd216e3acd84bc4fb21"}, - {file = "kiwisolver-1.4.9-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:9af39d6551f97d31a4deebeac6f45b156f9755ddc59c07b402c148f5dbb6482a"}, - {file = "kiwisolver-1.4.9-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:bb4ae2b57fc1d8cbd1cf7b1d9913803681ffa903e7488012be5b76dedf49297f"}, - {file = "kiwisolver-1.4.9-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:aedff62918805fb62d43a4aa2ecd4482c380dc76cd31bd7c8878588a61bd0369"}, - {file = "kiwisolver-1.4.9-cp314-cp314t-win_amd64.whl", hash = "sha256:1fa333e8b2ce4d9660f2cda9c0e1b6bafcfb2457a9d259faa82289e73ec24891"}, - {file = "kiwisolver-1.4.9-cp314-cp314t-win_arm64.whl", hash = "sha256:4a48a2ce79d65d363597ef7b567ce3d14d68783d2b2263d98db3d9477805ba32"}, - {file = "kiwisolver-1.4.9-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:4d1d9e582ad4d63062d34077a9a1e9f3c34088a2ec5135b1f7190c07cf366527"}, - {file = "kiwisolver-1.4.9-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:deed0c7258ceb4c44ad5ec7d9918f9f14fd05b2be86378d86cf50e63d1e7b771"}, - {file = "kiwisolver-1.4.9-pp310-pypy310_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:0a590506f303f512dff6b7f75fd2fd18e16943efee932008fe7140e5fa91d80e"}, - {file = "kiwisolver-1.4.9-pp310-pypy310_pp73-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e09c2279a4d01f099f52d5c4b3d9e208e91edcbd1a175c9662a8b16e000fece9"}, - {file = "kiwisolver-1.4.9-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:c9e7cdf45d594ee04d5be1b24dd9d49f3d1590959b2271fb30b5ca2b262c00fb"}, - {file = "kiwisolver-1.4.9-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:720e05574713db64c356e86732c0f3c5252818d05f9df320f0ad8380641acea5"}, - {file = "kiwisolver-1.4.9-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:17680d737d5335b552994a2008fab4c851bcd7de33094a82067ef3a576ff02fa"}, - {file = "kiwisolver-1.4.9-pp311-pypy311_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:85b5352f94e490c028926ea567fc569c52ec79ce131dadb968d3853e809518c2"}, - {file = "kiwisolver-1.4.9-pp311-pypy311_pp73-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:464415881e4801295659462c49461a24fb107c140de781d55518c4b80cb6790f"}, - {file = "kiwisolver-1.4.9-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:fb940820c63a9590d31d88b815e7a3aa5915cad3ce735ab45f0c730b39547de1"}, - {file = "kiwisolver-1.4.9.tar.gz", hash = "sha256:c3b22c26c6fd6811b0ae8363b95ca8ce4ea3c202d3d0975b2914310ceb1bcc4d"}, +groups = ["examples", "floris"] +files = [ + {file = "kiwisolver-1.5.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:32cc0a5365239a6ea0c6ed461e8838d053b57e397443c0ca894dcc8e388d4374"}, + {file = "kiwisolver-1.5.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:cc0b66c1eec9021353a4b4483afb12dfd50e3669ffbb9152d6842eb34c7e29fd"}, + {file = "kiwisolver-1.5.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:86e0287879f75621ae85197b0877ed2f8b7aa57b511c7331dce2eb6f4de7d476"}, + {file = "kiwisolver-1.5.0-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:62f59da443c4f4849f73a51a193b1d9d258dcad0c41bc4d1b8fb2bcc04bfeb22"}, + {file = "kiwisolver-1.5.0-cp310-cp310-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9190426b7aa26c5229501fa297b8d0653cfd3f5a36f7990c264e157cbf886b3b"}, + {file = "kiwisolver-1.5.0-cp310-cp310-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c8277104ded0a51e699c8c3aff63ce2c56d4ed5519a5f73e0fd7057f959a2b9e"}, + {file = "kiwisolver-1.5.0-cp310-cp310-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:8f9baf6f0a6e7571c45c8863010b45e837c3ee1c2c77fcd6ef423be91b21fedb"}, + {file = "kiwisolver-1.5.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:cff8e5383db4989311f99e814feeb90c4723eb4edca425b9d5d9c3fefcdd9537"}, + {file = "kiwisolver-1.5.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:ebae99ed6764f2b5771c522477b311be313e8841d2e0376db2b10922daebbba4"}, + {file = "kiwisolver-1.5.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:d5cd5189fc2b6a538b75ae45433140c4823463918f7b1617c31e68b085c0022c"}, + {file = "kiwisolver-1.5.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:f42c23db5d1521218a3276bb08666dcb662896a0be7347cba864eca45ff64ede"}, + {file = "kiwisolver-1.5.0-cp310-cp310-win_amd64.whl", hash = "sha256:94eff26096eb5395136634622515b234ecb6c9979824c1f5004c6e3c3c85ccd2"}, + {file = "kiwisolver-1.5.0-cp310-cp310-win_arm64.whl", hash = "sha256:dd952e03bfbb096cfe2dd35cd9e00f269969b67536cb4370994afc20ff2d0875"}, + {file = "kiwisolver-1.5.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9eed0f7edbb274413b6ee781cca50541c8c0facd3d6fd289779e494340a2b85c"}, + {file = "kiwisolver-1.5.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3c4923e404d6bcd91b6779c009542e5647fef32e4a5d75e115e3bbac6f2335eb"}, + {file = "kiwisolver-1.5.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:0df54df7e686afa55e6f21fb86195224a6d9beb71d637e8d7920c95cf0f89aac"}, + {file = "kiwisolver-1.5.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:2517e24d7315eb51c10664cdb865195df38ab74456c677df67bb47f12d088a27"}, + {file = "kiwisolver-1.5.0-cp311-cp311-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ff710414307fefa903e0d9bdf300972f892c23477829f49504e59834f4195398"}, + {file = "kiwisolver-1.5.0-cp311-cp311-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:6176c1811d9d5a04fa391c490cc44f451e240697a16977f11c6f722efb9041db"}, + {file = "kiwisolver-1.5.0-cp311-cp311-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:50847dca5d197fcbd389c805aa1a1cf32f25d2e7273dc47ab181a517666b68cc"}, + {file = "kiwisolver-1.5.0-cp311-cp311-manylinux_2_39_riscv64.whl", hash = "sha256:01808c6d15f4c3e8559595d6d1fe6411c68e4a3822b4b9972b44473b24f4e679"}, + {file = "kiwisolver-1.5.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:f1f9f4121ec58628c96baa3de1a55a4e3a333c5102c8e94b64e23bf7b2083309"}, + {file = "kiwisolver-1.5.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:b7d335370ae48a780c6e6a6bbfa97342f563744c39c35562f3f367665f5c1de2"}, + {file = "kiwisolver-1.5.0-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:800ee55980c18545af444d93fdd60c56b580db5cc54867d8cbf8a1dc0829938c"}, + {file = "kiwisolver-1.5.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:c438f6ca858697c9ab67eb28246c92508af972e114cac34e57a6d4ba17a3ac08"}, + {file = "kiwisolver-1.5.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:8c63c91f95173f9c2a67c7c526b2cea976828a0e7fced9cdcead2802dc10f8a4"}, + {file = "kiwisolver-1.5.0-cp311-cp311-win_amd64.whl", hash = "sha256:beb7f344487cdcb9e1efe4b7a29681b74d34c08f0043a327a74da852a6749e7b"}, + {file = "kiwisolver-1.5.0-cp311-cp311-win_arm64.whl", hash = "sha256:ad4ae4ffd1ee9cd11357b4c66b612da9888f4f4daf2f36995eda64bd45370cac"}, + {file = "kiwisolver-1.5.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:4e9750bc21b886308024f8a54ccb9a2cc38ac9fa813bf4348434e3d54f337ff9"}, + {file = "kiwisolver-1.5.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:72ec46b7eba5b395e0a7b63025490d3214c11013f4aacb4f5e8d6c3041829588"}, + {file = "kiwisolver-1.5.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ed3a984b31da7481b103f68776f7128a89ef26ed40f4dc41a2223cda7fb24819"}, + {file = "kiwisolver-1.5.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:bb5136fb5352d3f422df33f0c879a1b0c204004324150cc3b5e3c4f310c9049f"}, + {file = "kiwisolver-1.5.0-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b2af221f268f5af85e776a73d62b0845fc8baf8ef0abfae79d29c77d0e776aaf"}, + {file = "kiwisolver-1.5.0-cp312-cp312-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:b0f172dc8ffaccb8522d7c5d899de00133f2f1ca7b0a49b7da98e901de87bf2d"}, + {file = "kiwisolver-1.5.0-cp312-cp312-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:6ab8ba9152203feec73758dad83af9a0bbe05001eb4639e547207c40cfb52083"}, + {file = "kiwisolver-1.5.0-cp312-cp312-manylinux_2_39_riscv64.whl", hash = "sha256:cdee07c4d7f6d72008d3f73b9bf027f4e11550224c7c50d8df1ae4a37c1402a6"}, + {file = "kiwisolver-1.5.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:7c60d3c9b06fb23bd9c6139281ccbdc384297579ae037f08ae90c69f6845c0b1"}, + {file = "kiwisolver-1.5.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:e315e5ec90d88e140f57696ff85b484ff68bb311e36f2c414aa4286293e6dee0"}, + {file = "kiwisolver-1.5.0-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:1465387ac63576c3e125e5337a6892b9e99e0627d52317f3ca79e6930d889d15"}, + {file = "kiwisolver-1.5.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:530a3fd64c87cffa844d4b6b9768774763d9caa299e9b75d8eca6a4423b31314"}, + {file = "kiwisolver-1.5.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:1d9daea4ea6b9be74fe2f01f7fbade8d6ffab263e781274cffca0dba9be9eec9"}, + {file = "kiwisolver-1.5.0-cp312-cp312-win_amd64.whl", hash = "sha256:f18c2d9782259a6dc132fdc7a63c168cbc74b35284b6d75c673958982a378384"}, + {file = "kiwisolver-1.5.0-cp312-cp312-win_arm64.whl", hash = "sha256:f7c7553b13f69c1b29a5bde08ddc6d9d0c8bfb84f9ed01c30db25944aeb852a7"}, + {file = "kiwisolver-1.5.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:fd40bb9cd0891c4c3cb1ddf83f8bbfa15731a248fdc8162669405451e2724b09"}, + {file = "kiwisolver-1.5.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:c0e1403fd7c26d77c1f03e096dc58a5c726503fa0db0456678b8668f76f521e3"}, + {file = "kiwisolver-1.5.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:dda366d548e89a90d88a86c692377d18d8bd64b39c1fb2b92cb31370e2896bbd"}, + {file = "kiwisolver-1.5.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:332b4f0145c30b5f5ad9374881133e5aa64320428a57c2c2b61e9d891a51c2f3"}, + {file = "kiwisolver-1.5.0-cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0c50b89ffd3e1a911c69a1dd3de7173c0cd10b130f56222e57898683841e4f96"}, + {file = "kiwisolver-1.5.0-cp313-cp313-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:4db576bb8c3ef9365f8b40fe0f671644de6736ae2c27a2c62d7d8a1b4329f099"}, + {file = "kiwisolver-1.5.0-cp313-cp313-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:0b85aad90cea8ac6797a53b5d5f2e967334fa4d1149f031c4537569972596cb8"}, + {file = "kiwisolver-1.5.0-cp313-cp313-manylinux_2_39_riscv64.whl", hash = "sha256:d36ca54cb4c6c4686f7cbb7b817f66f5911c12ddb519450bbe86707155028f87"}, + {file = "kiwisolver-1.5.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:38f4a703656f493b0ad185211ccfca7f0386120f022066b018eb5296d8613e23"}, + {file = "kiwisolver-1.5.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:3ac2360e93cb41be81121755c6462cff3beaa9967188c866e5fce5cf13170859"}, + {file = "kiwisolver-1.5.0-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:c95cab08d1965db3d84a121f1c7ce7479bdd4072c9b3dafd8fecce48a2e6b902"}, + {file = "kiwisolver-1.5.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:fc20894c3d21194d8041a28b65622d5b86db786da6e3cfe73f0c762951a61167"}, + {file = "kiwisolver-1.5.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:7a32f72973f0f950c1920475d5c5ea3d971b81b6f0ec53b8d0a956cc965f22e0"}, + {file = "kiwisolver-1.5.0-cp313-cp313-win_amd64.whl", hash = "sha256:0bf3acf1419fa93064a4c2189ac0b58e3be7872bf6ee6177b0d4c63dc4cea276"}, + {file = "kiwisolver-1.5.0-cp313-cp313-win_arm64.whl", hash = "sha256:fa8eb9ecdb7efb0b226acec134e0d709e87a909fa4971a54c0c4f6e88635484c"}, + {file = "kiwisolver-1.5.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:db485b3847d182b908b483b2ed133c66d88d49cacf98fd278fadafe11b4478d1"}, + {file = "kiwisolver-1.5.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:be12f931839a3bdfe28b584db0e640a65a8bcbc24560ae3fdb025a449b3d754e"}, + {file = "kiwisolver-1.5.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:16b85d37c2cbb3253226d26e64663f755d88a03439a9c47df6246b35defbdfb7"}, + {file = "kiwisolver-1.5.0-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:4432b835675f0ea7414aab3d37d119f7226d24869b7a829caeab49ebda407b0c"}, + {file = "kiwisolver-1.5.0-cp313-cp313t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1b0feb50971481a2cc44d94e88bdb02cdd497618252ae226b8eb1201b957e368"}, + {file = "kiwisolver-1.5.0-cp313-cp313t-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:56fa888f10d0f367155e76ce849fa1166fc9730d13bd2d65a2aa13b6f5424489"}, + {file = "kiwisolver-1.5.0-cp313-cp313t-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:940dda65d5e764406b9fb92761cbf462e4e63f712ab60ed98f70552e496f3bf1"}, + {file = "kiwisolver-1.5.0-cp313-cp313t-manylinux_2_39_riscv64.whl", hash = "sha256:89fc958c702ee9a745e4700378f5d23fddbc46ff89e8fdbf5395c24d5c1452a3"}, + {file = "kiwisolver-1.5.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:9027d773c4ff81487181a925945743413f6069634d0b122d0b37684ccf4f1e18"}, + {file = "kiwisolver-1.5.0-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:5b233ea3e165e43e35dba1d2b8ecc21cf070b45b65ae17dd2747d2713d942021"}, + {file = "kiwisolver-1.5.0-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:ce9bf03dad3b46408c08649c6fbd6ca28a9fce0eb32fdfffa6775a13103b5310"}, + {file = "kiwisolver-1.5.0-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:fc4d3f1fb9ca0ae9f97b095963bc6326f1dbfd3779d6679a1e016b9baaa153d3"}, + {file = "kiwisolver-1.5.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:f443b4825c50a51ee68585522ab4a1d1257fac65896f282b4c6763337ac9f5d2"}, + {file = "kiwisolver-1.5.0-cp313-cp313t-win_arm64.whl", hash = "sha256:893ff3a711d1b515ba9da14ee090519bad4610ed1962fbe298a434e8c5f8db53"}, + {file = "kiwisolver-1.5.0-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:8df31fe574b8b3993cc61764f40941111b25c2d9fea13d3ce24a49907cd2d615"}, + {file = "kiwisolver-1.5.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:1d49a49ac4cbfb7c1375301cd1ec90169dfeae55ff84710d782260ce77a75a02"}, + {file = "kiwisolver-1.5.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:0cbe94b69b819209a62cb27bdfa5dc2a8977d8de2f89dfd97ba4f53ed3af754e"}, + {file = "kiwisolver-1.5.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:80aa065ffd378ff784822a6d7c3212f2d5f5e9c3589614b5c228b311fd3063ac"}, + {file = "kiwisolver-1.5.0-cp314-cp314-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4e7f886f47ab881692f278ae901039a234e4025a68e6dfab514263a0b1c4ae05"}, + {file = "kiwisolver-1.5.0-cp314-cp314-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:5060731cc3ed12ca3a8b57acd4aeca5bbc2f49216dd0bec1650a1acd89486bcd"}, + {file = "kiwisolver-1.5.0-cp314-cp314-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:7a4aa69609f40fce3cbc3f87b2061f042eee32f94b8f11db707b66a26461591a"}, + {file = "kiwisolver-1.5.0-cp314-cp314-manylinux_2_39_riscv64.whl", hash = "sha256:d168fda2dbff7b9b5f38e693182d792a938c31db4dac3a80a4888de603c99554"}, + {file = "kiwisolver-1.5.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:413b820229730d358efd838ecbab79902fe97094565fdc80ddb6b0a18c18a581"}, + {file = "kiwisolver-1.5.0-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:5124d1ea754509b09e53738ec185584cc609aae4a3b510aaf4ed6aa047ef9303"}, + {file = "kiwisolver-1.5.0-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:e4415a8db000bf49a6dd1c478bf70062eaacff0f462b92b0ba68791a905861f9"}, + {file = "kiwisolver-1.5.0-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:d618fd27420381a4f6044faa71f46d8bfd911bd077c555f7138ed88729bfbe79"}, + {file = "kiwisolver-1.5.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:5092eb5b1172947f57d6ea7d89b2f29650414e4293c47707eb499ec07a0ac796"}, + {file = "kiwisolver-1.5.0-cp314-cp314-win_amd64.whl", hash = "sha256:d76e2d8c75051d58177e762164d2e9ab92886534e3a12e795f103524f221dd8e"}, + {file = "kiwisolver-1.5.0-cp314-cp314-win_arm64.whl", hash = "sha256:fa6248cd194edff41d7ea9425ced8ca3a6f838bfb295f6f1d6e6bb694a8518df"}, + {file = "kiwisolver-1.5.0-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:d1ffeb80b5676463d7a7d56acbe8e37a20ce725570e09549fe738e02ca6b7e1e"}, + {file = "kiwisolver-1.5.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:bc4d8e252f532ab46a1de9349e2d27b91fce46736a9eedaa37beaca66f574ed4"}, + {file = "kiwisolver-1.5.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:6783e069732715ad0c3ce96dbf21dbc2235ab0593f2baf6338101f70371f4028"}, + {file = "kiwisolver-1.5.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:e7c4c09a490dc4d4a7f8cbee56c606a320f9dc28cf92a7157a39d1ce7676a657"}, + {file = "kiwisolver-1.5.0-cp314-cp314t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2a075bd7bd19c70cf67c8badfa36cf7c5d8de3c9ddb8420c51e10d9c50e94920"}, + {file = "kiwisolver-1.5.0-cp314-cp314t-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:bdd3e53429ff02aa319ba59dfe4ceeec345bf46cf180ec2cf6fd5b942e7975e9"}, + {file = "kiwisolver-1.5.0-cp314-cp314t-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:3cdcb35dc9d807259c981a85531048ede628eabcffb3239adf3d17463518992d"}, + {file = "kiwisolver-1.5.0-cp314-cp314t-manylinux_2_39_riscv64.whl", hash = "sha256:70d593af6a6ca332d1df73d519fddb5148edb15cd90d5f0155e3746a6d4fcc65"}, + {file = "kiwisolver-1.5.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:377815a8616074cabbf3f53354e1d040c35815a134e01d7614b7692e4bf8acfa"}, + {file = "kiwisolver-1.5.0-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:0255a027391d52944eae1dbb5d4cc5903f57092f3674e8e544cdd2622826b3f0"}, + {file = "kiwisolver-1.5.0-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:012b1eb16e28718fa782b5e61dc6f2da1f0792ca73bd05d54de6cb9561665fc9"}, + {file = "kiwisolver-1.5.0-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:0e3aafb33aed7479377e5e9a82e9d4bf87063741fc99fc7ae48b0f16e32bdd6f"}, + {file = "kiwisolver-1.5.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:e7a116ae737f0000343218c4edf5bd45893bfeaff0993c0b215d7124c9f77646"}, + {file = "kiwisolver-1.5.0-cp314-cp314t-win_amd64.whl", hash = "sha256:1dd9b0b119a350976a6d781e7278ec7aca0b201e1a9e2d23d9804afecb6ca681"}, + {file = "kiwisolver-1.5.0-cp314-cp314t-win_arm64.whl", hash = "sha256:58f812017cd2985c21fbffb4864d59174d4903dd66fa23815e74bbc7a0e2dd57"}, + {file = "kiwisolver-1.5.0-graalpy312-graalpy250_312_native-macosx_10_13_x86_64.whl", hash = "sha256:5ae8e62c147495b01a0f4765c878e9bfdf843412446a247e28df59936e99e797"}, + {file = "kiwisolver-1.5.0-graalpy312-graalpy250_312_native-macosx_11_0_arm64.whl", hash = "sha256:f6764a4ccab3078db14a632420930f6186058750df066b8ea2a7106df91d3203"}, + {file = "kiwisolver-1.5.0-graalpy312-graalpy250_312_native-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c31c13da98624f957b0fb1b5bae5383b2333c2c3f6793d9825dd5ce79b525cb7"}, + {file = "kiwisolver-1.5.0-graalpy312-graalpy250_312_native-win_amd64.whl", hash = "sha256:1f1489f769582498610e015a8ef2d36f28f505ab3096d0e16b4858a9ec214f57"}, + {file = "kiwisolver-1.5.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:295d9ffe712caa9f8a3081de8d32fc60191b4b51c76f02f951fd8407253528f4"}, + {file = "kiwisolver-1.5.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:51e8c4084897de9f05898c2c2a39af6318044ae969d46ff7a34ed3f96274adca"}, + {file = "kiwisolver-1.5.0-pp310-pypy310_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:b83af57bdddef03c01a9138034c6ff03181a3028d9a1003b301eb1a55e161a3f"}, + {file = "kiwisolver-1.5.0-pp310-pypy310_pp73-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:bf4679a3d71012a7c2bf360e5cd878fbd5e4fcac0896b56393dec239d81529ed"}, + {file = "kiwisolver-1.5.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:41024ed50e44ab1a60d3fe0a9d15a4ccc9f5f2b1d814ff283c8d01134d5b81bc"}, + {file = "kiwisolver-1.5.0-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:ec4c85dc4b687c7f7f15f553ff26a98bfe8c58f5f7f0ac8905f0ba4c7be60232"}, + {file = "kiwisolver-1.5.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:12e91c215a96e39f57989c8912ae761286ac5a9584d04030ceb3368a357f017a"}, + {file = "kiwisolver-1.5.0-pp311-pypy311_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:be4a51a55833dc29ab5d7503e7bcb3b3af3402d266018137127450005cdfe737"}, + {file = "kiwisolver-1.5.0-pp311-pypy311_pp73-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:daae526907e262de627d8f70058a0f64acc9e2641c164c99c8f594b34a799a16"}, + {file = "kiwisolver-1.5.0-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:59cd8683f575d96df5bb48f6add94afc055012c29e28124fcae2b63661b9efb1"}, + {file = "kiwisolver-1.5.0.tar.gz", hash = "sha256:d4193f3d9dc3f6f79aaed0e5637f45d98850ebf01f7ca20e69457f3e8946b66a"}, ] [[package]] @@ -1642,103 +2019,150 @@ regex = ["regex"] [[package]] name = "librt" -version = "0.8.1" +version = "0.15.0" description = "Mypyc runtime library" optional = false python-versions = ">=3.9" groups = ["dev"] markers = "platform_python_implementation != \"PyPy\"" files = [ - {file = "librt-0.8.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:81fd938344fecb9373ba1b155968c8a329491d2ce38e7ddb76f30ffb938f12dc"}, - {file = "librt-0.8.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:5db05697c82b3a2ec53f6e72b2ed373132b0c2e05135f0696784e97d7f5d48e7"}, - {file = "librt-0.8.1-cp310-cp310-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:d56bc4011975f7460bea7b33e1ff425d2f1adf419935ff6707273c77f8a4ada6"}, - {file = "librt-0.8.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5cdc0f588ff4b663ea96c26d2a230c525c6fc62b28314edaaaca8ed5af931ad0"}, - {file = "librt-0.8.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:97c2b54ff6717a7a563b72627990bec60d8029df17df423f0ed37d56a17a176b"}, - {file = "librt-0.8.1-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:8f1125e6bbf2f1657d9a2f3ccc4a2c9b0c8b176965bb565dd4d86be67eddb4b6"}, - {file = "librt-0.8.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:8f4bb453f408137d7581be309b2fbc6868a80e7ef60c88e689078ee3a296ae71"}, - {file = "librt-0.8.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:c336d61d2fe74a3195edc1646d53ff1cddd3a9600b09fa6ab75e5514ba4862a7"}, - {file = "librt-0.8.1-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:eb5656019db7c4deacf0c1a55a898c5bb8f989be904597fcb5232a2f4828fa05"}, - {file = "librt-0.8.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:c25d9e338d5bed46c1632f851babf3d13c78f49a225462017cf5e11e845c5891"}, - {file = "librt-0.8.1-cp310-cp310-win32.whl", hash = "sha256:aaab0e307e344cb28d800957ef3ec16605146ef0e59e059a60a176d19543d1b7"}, - {file = "librt-0.8.1-cp310-cp310-win_amd64.whl", hash = "sha256:56e04c14b696300d47b3bc5f1d10a00e86ae978886d0cee14e5714fafb5df5d2"}, - {file = "librt-0.8.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:681dc2451d6d846794a828c16c22dc452d924e9f700a485b7ecb887a30aad1fd"}, - {file = "librt-0.8.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a3b4350b13cc0e6f5bec8fa7caf29a8fb8cdc051a3bae45cfbfd7ce64f009965"}, - {file = "librt-0.8.1-cp311-cp311-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:ac1e7817fd0ed3d14fd7c5df91daed84c48e4c2a11ee99c0547f9f62fdae13da"}, - {file = "librt-0.8.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:747328be0c5b7075cde86a0e09d7a9196029800ba75a1689332348e998fb85c0"}, - {file = "librt-0.8.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f0af2bd2bc204fa27f3d6711d0f360e6b8c684a035206257a81673ab924aa11e"}, - {file = "librt-0.8.1-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:d480de377f5b687b6b1bc0c0407426da556e2a757633cc7e4d2e1a057aa688f3"}, - {file = "librt-0.8.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d0ee06b5b5291f609ddb37b9750985b27bc567791bc87c76a569b3feed8481ac"}, - {file = "librt-0.8.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:9e2c6f77b9ad48ce5603b83b7da9ee3e36b3ab425353f695cba13200c5d96596"}, - {file = "librt-0.8.1-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:439352ba9373f11cb8e1933da194dcc6206daf779ff8df0ed69c5e39113e6a99"}, - {file = "librt-0.8.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:82210adabbc331dbb65d7868b105185464ef13f56f7f76688565ad79f648b0fe"}, - {file = "librt-0.8.1-cp311-cp311-win32.whl", hash = "sha256:52c224e14614b750c0a6d97368e16804a98c684657c7518752c356834fff83bb"}, - {file = "librt-0.8.1-cp311-cp311-win_amd64.whl", hash = "sha256:c00e5c884f528c9932d278d5c9cbbea38a6b81eb62c02e06ae53751a83a4d52b"}, - {file = "librt-0.8.1-cp311-cp311-win_arm64.whl", hash = "sha256:f7cdf7f26c2286ffb02e46d7bac56c94655540b26347673bea15fa52a6af17e9"}, - {file = "librt-0.8.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:a28f2612ab566b17f3698b0da021ff9960610301607c9a5e8eaca62f5e1c350a"}, - {file = "librt-0.8.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:60a78b694c9aee2a0f1aaeaa7d101cf713e92e8423a941d2897f4fa37908dab9"}, - {file = "librt-0.8.1-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:758509ea3f1eba2a57558e7e98f4659d0ea7670bff49673b0dde18a3c7e6c0eb"}, - {file = "librt-0.8.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:039b9f2c506bd0ab0f8725aa5ba339c6f0cd19d3b514b50d134789809c24285d"}, - {file = "librt-0.8.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5bb54f1205a3a6ab41a6fd71dfcdcbd278670d3a90ca502a30d9da583105b6f7"}, - {file = "librt-0.8.1-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:05bd41cdee35b0c59c259f870f6da532a2c5ca57db95b5f23689fcb5c9e42440"}, - {file = "librt-0.8.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:adfab487facf03f0d0857b8710cf82d0704a309d8ffc33b03d9302b4c64e91a9"}, - {file = "librt-0.8.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:153188fe98a72f206042be10a2c6026139852805215ed9539186312d50a8e972"}, - {file = "librt-0.8.1-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:dd3c41254ee98604b08bd5b3af5bf0a89740d4ee0711de95b65166bf44091921"}, - {file = "librt-0.8.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e0d138c7ae532908cbb342162b2611dbd4d90c941cd25ab82084aaf71d2c0bd0"}, - {file = "librt-0.8.1-cp312-cp312-win32.whl", hash = "sha256:43353b943613c5d9c49a25aaffdba46f888ec354e71e3529a00cca3f04d66a7a"}, - {file = "librt-0.8.1-cp312-cp312-win_amd64.whl", hash = "sha256:ff8baf1f8d3f4b6b7257fcb75a501f2a5499d0dda57645baa09d4d0d34b19444"}, - {file = "librt-0.8.1-cp312-cp312-win_arm64.whl", hash = "sha256:0f2ae3725904f7377e11cc37722d5d401e8b3d5851fb9273d7f4fe04f6b3d37d"}, - {file = "librt-0.8.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:7e6bad1cd94f6764e1e21950542f818a09316645337fd5ab9a7acc45d99a8f35"}, - {file = "librt-0.8.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:cf450f498c30af55551ba4f66b9123b7185362ec8b625a773b3d39aa1a717583"}, - {file = "librt-0.8.1-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:eca45e982fa074090057132e30585a7e8674e9e885d402eae85633e9f449ce6c"}, - {file = "librt-0.8.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0c3811485fccfda840861905b8c70bba5ec094e02825598bb9d4ca3936857a04"}, - {file = "librt-0.8.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5e4af413908f77294605e28cfd98063f54b2c790561383971d2f52d113d9c363"}, - {file = "librt-0.8.1-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:5212a5bd7fae98dae95710032902edcd2ec4dc994e883294f75c857b83f9aba0"}, - {file = "librt-0.8.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:e692aa2d1d604e6ca12d35e51fdc36f4cda6345e28e36374579f7ef3611b3012"}, - {file = "librt-0.8.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:4be2a5c926b9770c9e08e717f05737a269b9d0ebc5d2f0060f0fe3fe9ce47acb"}, - {file = "librt-0.8.1-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:fd1a720332ea335ceb544cf0a03f81df92abd4bb887679fd1e460976b0e6214b"}, - {file = "librt-0.8.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:93c2af9e01e0ef80d95ae3c720be101227edae5f2fe7e3dc63d8857fadfc5a1d"}, - {file = "librt-0.8.1-cp313-cp313-win32.whl", hash = "sha256:086a32dbb71336627e78cc1d6ee305a68d038ef7d4c39aaff41ae8c9aa46e91a"}, - {file = "librt-0.8.1-cp313-cp313-win_amd64.whl", hash = "sha256:e11769a1dbda4da7b00a76cfffa67aa47cfa66921d2724539eee4b9ede780b79"}, - {file = "librt-0.8.1-cp313-cp313-win_arm64.whl", hash = "sha256:924817ab3141aca17893386ee13261f1d100d1ef410d70afe4389f2359fea4f0"}, - {file = "librt-0.8.1-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:6cfa7fe54fd4d1f47130017351a959fe5804bda7a0bc7e07a2cdbc3fdd28d34f"}, - {file = "librt-0.8.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:228c2409c079f8c11fb2e5d7b277077f694cb93443eb760e00b3b83cb8b3176c"}, - {file = "librt-0.8.1-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:7aae78ab5e3206181780e56912d1b9bb9f90a7249ce12f0e8bf531d0462dd0fc"}, - {file = "librt-0.8.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:172d57ec04346b047ca6af181e1ea4858086c80bdf455f61994c4aa6fc3f866c"}, - {file = "librt-0.8.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6b1977c4ea97ce5eb7755a78fae68d87e4102e4aaf54985e8b56806849cc06a3"}, - {file = "librt-0.8.1-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:10c42e1f6fd06733ef65ae7bebce2872bcafd8d6e6b0a08fe0a05a23b044fb14"}, - {file = "librt-0.8.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:4c8dfa264b9193c4ee19113c985c95f876fae5e51f731494fc4e0cf594990ba7"}, - {file = "librt-0.8.1-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:01170b6729a438f0dedc4a26ed342e3dc4f02d1000b4b19f980e1877f0c297e6"}, - {file = "librt-0.8.1-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:7b02679a0d783bdae30d443025b94465d8c3dc512f32f5b5031f93f57ac32071"}, - {file = "librt-0.8.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:190b109bb69592a3401fe1ffdea41a2e73370ace2ffdc4a0e8e2b39cdea81b78"}, - {file = "librt-0.8.1-cp314-cp314-win32.whl", hash = "sha256:e70a57ecf89a0f64c24e37f38d3fe217a58169d2fe6ed6d70554964042474023"}, - {file = "librt-0.8.1-cp314-cp314-win_amd64.whl", hash = "sha256:7e2f3edca35664499fbb36e4770650c4bd4a08abc1f4458eab9df4ec56389730"}, - {file = "librt-0.8.1-cp314-cp314-win_arm64.whl", hash = "sha256:0d2f82168e55ddefd27c01c654ce52379c0750ddc31ee86b4b266bcf4d65f2a3"}, - {file = "librt-0.8.1-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:2c74a2da57a094bd48d03fa5d196da83d2815678385d2978657499063709abe1"}, - {file = "librt-0.8.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:a355d99c4c0d8e5b770313b8b247411ed40949ca44e33e46a4789b9293a907ee"}, - {file = "librt-0.8.1-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:2eb345e8b33fb748227409c9f1233d4df354d6e54091f0e8fc53acdb2ffedeb7"}, - {file = "librt-0.8.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9be2f15e53ce4e83cc08adc29b26fb5978db62ef2a366fbdf716c8a6c8901040"}, - {file = "librt-0.8.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:785ae29c1f5c6e7c2cde2c7c0e148147f4503da3abc5d44d482068da5322fd9e"}, - {file = "librt-0.8.1-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:1d3a7da44baf692f0c6aeb5b2a09c5e6fc7a703bca9ffa337ddd2e2da53f7732"}, - {file = "librt-0.8.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:5fc48998000cbc39ec0d5311312dda93ecf92b39aaf184c5e817d5d440b29624"}, - {file = "librt-0.8.1-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:e96baa6820280077a78244b2e06e416480ed859bbd8e5d641cf5742919d8beb4"}, - {file = "librt-0.8.1-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:31362dbfe297b23590530007062c32c6f6176f6099646bb2c95ab1b00a57c382"}, - {file = "librt-0.8.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:cc3656283d11540ab0ea01978378e73e10002145117055e03722417aeab30994"}, - {file = "librt-0.8.1-cp314-cp314t-win32.whl", hash = "sha256:738f08021b3142c2918c03692608baed43bc51144c29e35807682f8070ee2a3a"}, - {file = "librt-0.8.1-cp314-cp314t-win_amd64.whl", hash = "sha256:89815a22daf9c51884fb5dbe4f1ef65ee6a146e0b6a8df05f753e2e4a9359bf4"}, - {file = "librt-0.8.1-cp314-cp314t-win_arm64.whl", hash = "sha256:bf512a71a23504ed08103a13c941f763db13fb11177beb3d9244c98c29fb4a61"}, - {file = "librt-0.8.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3dff3d3ca8db20e783b1bc7de49c0a2ab0b8387f31236d6a026597d07fcd68ac"}, - {file = "librt-0.8.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:08eec3a1fc435f0d09c87b6bf1ec798986a3544f446b864e4099633a56fcd9ed"}, - {file = "librt-0.8.1-cp39-cp39-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:e3f0a41487fd5fad7e760b9e8a90e251e27c2816fbc2cff36a22a0e6bcbbd9dd"}, - {file = "librt-0.8.1-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:bacdb58d9939d95cc557b4dbaa86527c9db2ac1ed76a18bc8d26f6dc8647d851"}, - {file = "librt-0.8.1-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b6d7ab1f01aa753188605b09a51faa44a3327400b00b8cce424c71910fc0a128"}, - {file = "librt-0.8.1-cp39-cp39-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:4998009e7cb9e896569f4be7004f09d0ed70d386fa99d42b6d363f6d200501ac"}, - {file = "librt-0.8.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:2cc68eeeef5e906839c7bb0815748b5b0a974ec27125beefc0f942715785b551"}, - {file = "librt-0.8.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:0bf69d79a23f4f40b8673a947a234baeeb133b5078b483b7297c5916539cf5d5"}, - {file = "librt-0.8.1-cp39-cp39-musllinux_1_2_riscv64.whl", hash = "sha256:22b46eabd76c1986ee7d231b0765ad387d7673bbd996aa0d0d054b38ac65d8f6"}, - {file = "librt-0.8.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:237796479f4d0637d6b9cbcb926ff424a97735e68ade6facf402df4ec93375ed"}, - {file = "librt-0.8.1-cp39-cp39-win32.whl", hash = "sha256:4beb04b8c66c6ae62f8c1e0b2f097c1ebad9295c929a8d5286c05eae7c2fc7dc"}, - {file = "librt-0.8.1-cp39-cp39-win_amd64.whl", hash = "sha256:64548cde61b692dc0dc379f4b5f59a2f582c2ebe7890d09c1ae3b9e66fa015b7"}, - {file = "librt-0.8.1.tar.gz", hash = "sha256:be46a14693955b3bd96014ccbdb8339ee8c9346fbe11c1b78901b55125f14c73"}, + {file = "librt-0.15.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e1a49adf16a7c9d9646816c2946135527197b6fcf4347c7b8b761cf1bfbf4489"}, + {file = "librt-0.15.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:81a398f45b45a59200e13cd5ad1ae1d3f44334de98b148331afe2cdfee701c52"}, + {file = "librt-0.15.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4eafbaff06b9563f8b1c850621ce51605de05208e09d4d71ce490bc972b7b9e8"}, + {file = "librt-0.15.0-cp310-cp310-manylinux2014_i686.manylinux_2_17_i686.manylinux_2_28_i686.whl", hash = "sha256:b0411b4066db926b80258c60dcb0e6db4c9cee312eab45b7e8866b17ddf9ada1"}, + {file = "librt-0.15.0-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:febb1ce6cac545a54e6b769982824e955a700fdd9fbf3a08a3d82c990968b57d"}, + {file = "librt-0.15.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b230acc1c3bfe2d6f2627ba2b95dc92e58aa494600e9722d0e6ccbc931e59702"}, + {file = "librt-0.15.0-cp310-cp310-manylinux_2_34_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:6da110e5f314c19ab8478464d02ae18808ae73d522c15260fa4918acdcd64da9"}, + {file = "librt-0.15.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:eab9208b00ca55bf75983ec99f7bf13acc746a36102e98953addaad7f7ea1e1b"}, + {file = "librt-0.15.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:6c013cd3a1721e69e14380ada97eaa4b7b0cdf1c6b96fa765d4ea47c875088db"}, + {file = "librt-0.15.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:567b1c430f8bd560e689421468278ac5941bab4a05303b5d95b6ae10db03f451"}, + {file = "librt-0.15.0-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:29c4cab9df457b19672c39be7f384ebb2bc925c4e2684b8780c222b43eb36389"}, + {file = "librt-0.15.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:bccbd8e5b0bffb7106cf18eb1baa3d7194b1cebb3b4b1cdbd4bdb19382a6ee6c"}, + {file = "librt-0.15.0-cp310-cp310-win32.whl", hash = "sha256:8ae493ed5f659a7761c43d42f183db514536073ded9bcf671d2d1df47e29a07e"}, + {file = "librt-0.15.0-cp310-cp310-win_amd64.whl", hash = "sha256:bc25fb356d0c7810bb49ff3df908ad1fda6995d660ab099ded69244ed7ab6053"}, + {file = "librt-0.15.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:823b92cf3c18ecd08afc70c42473888b41b6e8ef5046f3b82c05c154a2fa3d22"}, + {file = "librt-0.15.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c70bc1b602cf59917e8f0c7a2cbc8bcc6fbc14d5486136b00707a79619121d63"}, + {file = "librt-0.15.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:814ff83a25b5fce8b9c80c4dd803153fb5c5599fc74db9e022466938368957ef"}, + {file = "librt-0.15.0-cp311-cp311-manylinux2014_i686.manylinux_2_17_i686.manylinux_2_28_i686.whl", hash = "sha256:57f5eeb6ad4c180de583b1038e61fe5fbd9796bb69a8a1c1a0c7ddbec4c8c60f"}, + {file = "librt-0.15.0-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:82909c8f7eb9952656b65d3147afde4cf8e6d5a991eebc86418b5e65843b0ab8"}, + {file = "librt-0.15.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f779070399f991400fc451719e0ea388eb7de313388bada2c127a35de05f798a"}, + {file = "librt-0.15.0-cp311-cp311-manylinux_2_34_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:bac89069bc496ebdf4f79ebb57bbd10d0b214c8454225deb672d91002bd17e18"}, + {file = "librt-0.15.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:e0d00c708fb2f5822b152429b1ac80a58dbbbc3f6c232c4d13a3f7fcf2ea5b4c"}, + {file = "librt-0.15.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:6c6624fe268625869485553dd7cc1daf30d22558215bb2a4ff16f67a9801a31a"}, + {file = "librt-0.15.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:f56b397858a23dacf35ede366ed2212fdc03a6a57a1ad36468ad6e9dc5fac091"}, + {file = "librt-0.15.0-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:4388184646efe2054911c5b00a1077d6d1ee86a95b7e8ba96dc7850a809f3f40"}, + {file = "librt-0.15.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:97335f59082f9fe2ce6c2a9cc6433a0114bbb6cd4d5c09dd76c95c68b9f9a8b0"}, + {file = "librt-0.15.0-cp311-cp311-win32.whl", hash = "sha256:83380ffde38062a2e9bb55d83e74474f6614665528b98a6928720fc006dfffbb"}, + {file = "librt-0.15.0-cp311-cp311-win_amd64.whl", hash = "sha256:f75720477ee05d509a310e856cacc8d909adc182f7b91193c207bcc26d7ee6db"}, + {file = "librt-0.15.0-cp311-cp311-win_arm64.whl", hash = "sha256:256237037a3ab001ae8d9803b2d43562a4c3aa38739843694349e4d5ebb0fd56"}, + {file = "librt-0.15.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:e87bc679f86a99aa3b26e3c78eeb821a247c9a28eae48eaafcc32c3bf4c3bb9e"}, + {file = "librt-0.15.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:71599e011ac880e8e45d46047d714871894c7d4ab6f25626f8d4f89da21f368d"}, + {file = "librt-0.15.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c802434092b769b1d613ed2e13fac15fbfce1934a74bd10283b03c0fae231cd1"}, + {file = "librt-0.15.0-cp312-cp312-manylinux2014_i686.manylinux_2_17_i686.manylinux_2_28_i686.whl", hash = "sha256:5500eeae393a184d14e1f35645962c27129d20c81afa4069e6ef826ebc2b3aaa"}, + {file = "librt-0.15.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:6ecfc32dfb46fb7b565bcd6abf9412acf978775a998273d22888a6d7953730dd"}, + {file = "librt-0.15.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:89cc46cfd15022e35084355478c9ac809d90b1152222706ac9a7655ec21df6fa"}, + {file = "librt-0.15.0-cp312-cp312-manylinux_2_34_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:d5f51401d102c885b9ca509e62c79b1dbff286e1b9b047fde6f763780789356d"}, + {file = "librt-0.15.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:cc30523e3f1a23fb7511cc659834a0d01a1042bb9de359bc1c131cc4ec6c9656"}, + {file = "librt-0.15.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:59fe030d8ae4a57e3fb7756bf35a858de74e04066fc8555c53d0af979132af81"}, + {file = "librt-0.15.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:5a6526a2a956bbb1e4ae3568c82e650fc99119c66bb011ea60715744955a2b4d"}, + {file = "librt-0.15.0-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:85ea21ec6730194d67156b0e0b5430ccb1d61f8b8b907e39b37f9812b74a13f0"}, + {file = "librt-0.15.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:1e47b8ba865d7ede071a91a7163073bbaeb72541f1ef8a07d512c45c7b5007f2"}, + {file = "librt-0.15.0-cp312-cp312-win32.whl", hash = "sha256:a5207ec414d1c4a2a7231b2086970dc036f94293cdf338190984958a013a42f1"}, + {file = "librt-0.15.0-cp312-cp312-win_amd64.whl", hash = "sha256:73b30cfa976659b3917c8f6153bdb0591c6a9ec6583599fd24a689b690622022"}, + {file = "librt-0.15.0-cp312-cp312-win_arm64.whl", hash = "sha256:a54cf9e0ef47b96af580849db5471142200568ce1e02cbf416addab551369570"}, + {file = "librt-0.15.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:db13ca398005abcbe538deda87b686d9bd08b7001cf40c4c06b444960ae10a26"}, + {file = "librt-0.15.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:aa1f1995789dca3698bc550aaceb09a51bd5df0a057ff84ff15296cd1975b801"}, + {file = "librt-0.15.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:55456ea87d8df21808446d03817be2f65e20391c1c615d9187440dff28cd08dc"}, + {file = "librt-0.15.0-cp313-cp313-manylinux2014_i686.manylinux_2_17_i686.manylinux_2_28_i686.whl", hash = "sha256:5a86a5a08c2235316bdb359d5dbb6ce0abfca7fac06363103e2c5af571d92f95"}, + {file = "librt-0.15.0-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:e56b6a368529bed262da40ce13f8fef590db0479819cca84f16a1f01ac356d0b"}, + {file = "librt-0.15.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:234d8d394721fa0d786af15ebf1f3fb7f3ed82fd1cd0cde45c2f247b5d4281d2"}, + {file = "librt-0.15.0-cp313-cp313-manylinux_2_34_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:d8363d7accb0286ac3a0e633f396e93800dafb8150494505daf9515bbda591f3"}, + {file = "librt-0.15.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:0f0ee3644d951f31055ad07d77d92520e84505dd7a432cc4cd501dd70ee06785"}, + {file = "librt-0.15.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:2cfd1a81a648806e6a7717be4cc4d1bb392fa229752bf8444ba365e381e984d6"}, + {file = "librt-0.15.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:a6cd22c9da0d866558e46a041f1cc0c2bbb26b61b137b2347fa834c332e1d101"}, + {file = "librt-0.15.0-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:6d5225ef8801e4ea5e482fa9b5dfb891dd9ef6f6d870f1f25d449ca2c70ac218"}, + {file = "librt-0.15.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6d28a05796b99f749bf8794f17ba9ba1612d0076b802e9cfc62c554634e9ce3b"}, + {file = "librt-0.15.0-cp313-cp313-pyemscripten_2025_0_wasm32.whl", hash = "sha256:2067ff438048cead9d223ca5675bae2a25e520a7c3e6c1498bf9c6892d22caab"}, + {file = "librt-0.15.0-cp313-cp313-win32.whl", hash = "sha256:1cd3b721f24c206398b9e26da3c3a9c011e6e89d06f318ba8ebefc30f1003890"}, + {file = "librt-0.15.0-cp313-cp313-win_amd64.whl", hash = "sha256:f395a4a9a03ac062dbe9a9f82e0c720502e590a38feee6a757bc82e9c63afbd8"}, + {file = "librt-0.15.0-cp313-cp313-win_arm64.whl", hash = "sha256:0a15cb554761247d84a3ec0cbdf4078d70725384f0e4662c0fa3b26266eb60ad"}, + {file = "librt-0.15.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:f5de7feedc56337a088eb15cd9fafa9938367362221d8cc62c642b7f94821993"}, + {file = "librt-0.15.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:6c0eb900c0e91f4aebe680845242e614f1864edfd44106380d0752ac29522bf8"}, + {file = "librt-0.15.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e8c9a650a188e38bac005048cbe6342e81407782944d01934540ab75e417df21"}, + {file = "librt-0.15.0-cp314-cp314-manylinux2014_i686.manylinux_2_17_i686.manylinux_2_28_i686.whl", hash = "sha256:92bfed8deec93df30286b9fe9e3b1dd17329cc076a192b4ee5ec223841d54953"}, + {file = "librt-0.15.0-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:ec4b19788f835711a2072f9dbe6b03b3bf32ed1f0fb30cf399bdd59d9f0c33fa"}, + {file = "librt-0.15.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d4c7bacb70930f3d0a56f4ecf1be474a1f0d941b01dd73b756f3c256d42cb879"}, + {file = "librt-0.15.0-cp314-cp314-manylinux_2_34_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:3e79f05e4a08b4d880342673312bbc895b56df7765605796f15902eb5367d3ae"}, + {file = "librt-0.15.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:a417149c0cba4d50b61e992e5a15e69eaf96746609b461cc4ed168aeef6b79dd"}, + {file = "librt-0.15.0-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:da7a94d6a3411f579d72aa3e3bc5fbca7ed4549f3dbd7e5de3aa567333374285"}, + {file = "librt-0.15.0-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:856f743ae607f2c1380eccb566c0038a9fb3eabf0fc2be2704d76d9f73557239"}, + {file = "librt-0.15.0-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:779a6e7c894737e5983e7790a9c78c4000c30e23c9aada08081bdbea53b0fa60"}, + {file = "librt-0.15.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:96bb17dbe8bab3c0954fbebfc69ed395599de75b6bbc35e3270a878e15d4dd65"}, + {file = "librt-0.15.0-cp314-cp314-pyemscripten_2026_0_wasm32.whl", hash = "sha256:7220697efaa6e5348fc3d18ee7f8563d4bfecd9872b37ffb915bfc1d08840622"}, + {file = "librt-0.15.0-cp314-cp314-win32.whl", hash = "sha256:f54598964d357b1c5ab77cf5d92f21e598fe0e23cdbe9618480807f81b4eba15"}, + {file = "librt-0.15.0-cp314-cp314-win_amd64.whl", hash = "sha256:3ff5893a2c23d886aa9ce786de5ac6ddc74aeeaf90743682b74d920e117d2e28"}, + {file = "librt-0.15.0-cp314-cp314-win_arm64.whl", hash = "sha256:3722a099730704c9a3d70c879fc0f51daec25fe5f1555672d97bc595abeafb95"}, + {file = "librt-0.15.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:38c0c7d4b6fc06c3324b3f9162c8391bfc4fd9dde53afe1033ce7edb48d5a714"}, + {file = "librt-0.15.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:8b2fdd7ead3c995c37940a790690660d0ca006c302db26cc51933f6766866fc3"}, + {file = "librt-0.15.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2fde98cf1fc4bac144ce23c2c4c017b924ba714509ea9334977b0b27050c837d"}, + {file = "librt-0.15.0-cp314-cp314t-manylinux2014_i686.manylinux_2_17_i686.manylinux_2_28_i686.whl", hash = "sha256:e3b461183c5fa7681b48560f91515f53a953122fb30c71e07abc67d7ddf58c38"}, + {file = "librt-0.15.0-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:4bbcc257e3babea20a91715c361b24554ec4e8f51aa578568afc230799fe1a19"}, + {file = "librt-0.15.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b845b8d48088fad0cadc84be4b8fda63203be7e9237b71015b3925443c1f35ab"}, + {file = "librt-0.15.0-cp314-cp314t-manylinux_2_34_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:b30e600e8f337b9bd7f39b86d9fdfedc73cc46e3d0f745931a23a234220bb7e2"}, + {file = "librt-0.15.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:64b0c8c35aa4c4ed79896359f3e0b285cbe4e610042106500da4811c322cc108"}, + {file = "librt-0.15.0-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:0da0d94cb802f32a0524653e7201f2cef72d5f700a5407678f5290483d4fcd08"}, + {file = "librt-0.15.0-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:4a6369168d371207339b1e50d4532b06a7121586141f82599505a3f315751d47"}, + {file = "librt-0.15.0-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:c434e072557ade9cbc642d052c89d031efe47d5c9614523619d0d74a02378e81"}, + {file = "librt-0.15.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:c7eec6a42018bc1d45763b1c162d3d2bf7c3b9a1b0ed30d3e91dcba390efefcc"}, + {file = "librt-0.15.0-cp314-cp314t-win32.whl", hash = "sha256:6912fa5e635d74529ac7cdb1bdf6ca3af4453da8d1edbe0110ee1cb4ad407ebf"}, + {file = "librt-0.15.0-cp314-cp314t-win_amd64.whl", hash = "sha256:8e11699ed745931c395acd3621b07062e0f840efa6935aad87a64ed0995f0915"}, + {file = "librt-0.15.0-cp314-cp314t-win_arm64.whl", hash = "sha256:5d2a91724463bfed4f573cd7a9fdc856d2e230d0c0e5a61416a93481dccd8605"}, + {file = "librt-0.15.0-cp315-cp315-macosx_10_15_x86_64.whl", hash = "sha256:8443e38dcfcfdbcf5add5118c623efd788d65ac2e25756d6251a54a06a4d0aca"}, + {file = "librt-0.15.0-cp315-cp315-macosx_11_0_arm64.whl", hash = "sha256:6d15a29033c57490cfe2069097c6fc4049e4e65ffbb749be7dc453b7c4c68965"}, + {file = "librt-0.15.0-cp315-cp315-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d2c05c729b589e734c09578bf5964be48a911765484840d017bbc84f49d4c4ad"}, + {file = "librt-0.15.0-cp315-cp315-manylinux2014_i686.manylinux_2_17_i686.manylinux_2_28_i686.whl", hash = "sha256:fa60887537e1d0cd2d9982269d33a709bf54b195cd2b9364fc0a758022af5bd9"}, + {file = "librt-0.15.0-cp315-cp315-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:d8bc24219b24c0af375718942ab75e3544b2763085f40f965be4326734ae8328"}, + {file = "librt-0.15.0-cp315-cp315-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:86a21a7bd3fe3a419512ef424cc1c020f6771d0b29cfddff36d1635a855e63f0"}, + {file = "librt-0.15.0-cp315-cp315-manylinux_2_34_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:dbab647e88d90b3167b91efe7091e248653688ed4337e4f90907a722c7361bb9"}, + {file = "librt-0.15.0-cp315-cp315-musllinux_1_2_aarch64.whl", hash = "sha256:d8edcf6f550e918dca779c069b9e156385c60b406f99fc7641f32c52f7193659"}, + {file = "librt-0.15.0-cp315-cp315-musllinux_1_2_i686.whl", hash = "sha256:8b62076030baa2d8b1501a46bf0e19c27a489aa90671c55665bff7887f7660b0"}, + {file = "librt-0.15.0-cp315-cp315-musllinux_1_2_ppc64le.whl", hash = "sha256:d00d20d1818e82a07a0ee0aa89a98b17ed7916b92441090b683719cb20a59b6d"}, + {file = "librt-0.15.0-cp315-cp315-musllinux_1_2_riscv64.whl", hash = "sha256:4e6ee93fc3cf848dcbf0cce2eca73d8e7dcd0cc2b6df3a529d57750b30a4c55c"}, + {file = "librt-0.15.0-cp315-cp315-musllinux_1_2_x86_64.whl", hash = "sha256:32896a0af72508ea979e0acb4e4c04cbeeae04938167950d535c83c45597167d"}, + {file = "librt-0.15.0-cp315-cp315-pyemscripten_2026_5_wasm32.whl", hash = "sha256:ec3ba415afaf951f6951b1dd16d3c8e4f540065fc382d7e70b823a79567ca374"}, + {file = "librt-0.15.0-cp315-cp315-win32.whl", hash = "sha256:d2813ba2503764f0450680c533d13df7cff9b49df1411062eded5f67db4195b9"}, + {file = "librt-0.15.0-cp315-cp315-win_amd64.whl", hash = "sha256:b87d67e33afaf265262f2a66db578284b88ee2e6fcd224579cb5c15518677ad8"}, + {file = "librt-0.15.0-cp315-cp315-win_arm64.whl", hash = "sha256:713bd7df21170b982e729e46870f31d6b437bd1a9b4648cffb529bd3c2ec5c4b"}, + {file = "librt-0.15.0-cp315-cp315t-macosx_10_15_x86_64.whl", hash = "sha256:3de789c82752730f94782a5ee518baf9c05edf85733aeaf73bb6e518755cdf54"}, + {file = "librt-0.15.0-cp315-cp315t-macosx_11_0_arm64.whl", hash = "sha256:e0b5deec9a8664eb722c797241970fd4aa1894d25fda36a1ddac0f7407606bd6"}, + {file = "librt-0.15.0-cp315-cp315t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5563302a8359bc2295bb7084d1a8ed1519df96afb30eb2aa4e0bff7b54228988"}, + {file = "librt-0.15.0-cp315-cp315t-manylinux2014_i686.manylinux_2_17_i686.manylinux_2_28_i686.whl", hash = "sha256:22d6263b9d39d7bbb286fa791945646e3218f1be2d693e36fb630f1d0e59cd13"}, + {file = "librt-0.15.0-cp315-cp315t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:39ffd14646190c454f0d86e0d256b33f00a87a26ab410e619773b841d0e41416"}, + {file = "librt-0.15.0-cp315-cp315t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c47318cd3a61401452de11282242937e3e057c4fd3dbaf601e269d0928a06c0a"}, + {file = "librt-0.15.0-cp315-cp315t-manylinux_2_34_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:a56a1d4f859a82ca5b99fc4b82c9b027b15e3c455c5cd99e7d0719f27bb20b6c"}, + {file = "librt-0.15.0-cp315-cp315t-musllinux_1_2_aarch64.whl", hash = "sha256:077471b3182db4e17c36ae91555f36a4d2c00080b267f749bcad34a478a9a302"}, + {file = "librt-0.15.0-cp315-cp315t-musllinux_1_2_i686.whl", hash = "sha256:411ca4d1b905b860ceba7570dd6717a71dedaddcc4b0f77ece710aa41ee11f8d"}, + {file = "librt-0.15.0-cp315-cp315t-musllinux_1_2_ppc64le.whl", hash = "sha256:1256589e0b0adb31751d685a68bce29d73407ddf4ef05d4188f49d5dcf9566d9"}, + {file = "librt-0.15.0-cp315-cp315t-musllinux_1_2_riscv64.whl", hash = "sha256:f42b74a53e5f26a0ba0007411a7455b66c67ce4022a39cc1f56fc4efd65bcbab"}, + {file = "librt-0.15.0-cp315-cp315t-musllinux_1_2_x86_64.whl", hash = "sha256:291bf73caf78b9e88d6fae9bfd693207ff7d832e2fdbe2cf8e746bc13f5f892b"}, + {file = "librt-0.15.0-cp315-cp315t-win32.whl", hash = "sha256:c16d15ee371643ab48dc8248a3e680ebbeca573a13af2c3dd0c985b142d77162"}, + {file = "librt-0.15.0-cp315-cp315t-win_amd64.whl", hash = "sha256:dbd605739f228912dc49027cb764456b9757750bdc2b6b7773164db7096c6fd1"}, + {file = "librt-0.15.0-cp315-cp315t-win_arm64.whl", hash = "sha256:84d244b00604d17df3fc7736c327892d6bba66181254aa4087be807b6c342bdc"}, + {file = "librt-0.15.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:0e2d0c0acf5b0ada7d045912b7cf787c21315c95b38b1fa939ef72d45d366b3d"}, + {file = "librt-0.15.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f9ca190fe9edc0eb08eec558a509a16d28d91c35667b8f043cba40ed5e77a959"}, + {file = "librt-0.15.0-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:80811e1c42386ea95c6fb30571d3250ad43d7863f883f787f70517f441150e59"}, + {file = "librt-0.15.0-cp39-cp39-manylinux2014_i686.manylinux_2_17_i686.manylinux_2_28_i686.whl", hash = "sha256:88c2a17815c266e6d8180204ff62cb739ab869ada4a746d4c505331526ac58f1"}, + {file = "librt-0.15.0-cp39-cp39-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a5fa8f1f916988d0bf1afea005bda37f56ac41a18016e813ccf0097a8d460ca4"}, + {file = "librt-0.15.0-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:355e3a4c725225a14262004fc1872a552b9d3634b4f791a0dfc80804aafbfd55"}, + {file = "librt-0.15.0-cp39-cp39-manylinux_2_34_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:fc1ed11c4ad0b91af24def2050f2840ea4567828e3dd058fbe608d982f6e5465"}, + {file = "librt-0.15.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:1f4ef2e71db33df4309167ed7f1520c4fae5e611226e159fa9cf33f93e6ddb3d"}, + {file = "librt-0.15.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:1a1a8cd430c7dd0c083f455cb1b328d7fc682b05c31b940906f7845bdff80881"}, + {file = "librt-0.15.0-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:04d5387b908676c0b8d5d2f5fb58373b4ea382d81f7a6f0fab8ea2a462bb4738"}, + {file = "librt-0.15.0-cp39-cp39-musllinux_1_2_riscv64.whl", hash = "sha256:1172c6ad2a88b646e7fe3b480e3fac4ab4418b3443fd8a4061fdd531e0622fc7"}, + {file = "librt-0.15.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:52e8db01f603f5da0ca30987479acff98769382efc8e142fa3962395dcf3ffdb"}, + {file = "librt-0.15.0-cp39-cp39-win32.whl", hash = "sha256:e4c911f15a1652ca94ae9f1abd92e74cbb1b3597d2d92fdd556202f94e8cd455"}, + {file = "librt-0.15.0-cp39-cp39-win_amd64.whl", hash = "sha256:68242379c9b65a582b6e97318a1e9fbd6d445e58954f2d437991c4804ab11578"}, + {file = "librt-0.15.0.tar.gz", hash = "sha256:4e66cbe84437497d951b799d3e1551291b6fb3d643820a7014b3655d57a59162"}, ] [[package]] @@ -1840,69 +2264,85 @@ files = [ {file = "markupsafe-3.0.3.tar.gz", hash = "sha256:722695808f4b6457b320fdc131280796bdceb04ab50fe1795cd540799ebe1698"}, ] +[[package]] +name = "marmot-agents" +version = "0.2.5" +description = "Agent based processs modeling." +optional = false +python-versions = "*" +groups = ["floris"] +files = [ + {file = "marmot-agents-0.2.5.tar.gz", hash = "sha256:d0038c28928681b74352397a357f290da00c86a10c9626219b3ae36899faa915"}, + {file = "marmot_agents-0.2.5-py3-none-any.whl", hash = "sha256:f7678a830593222436396163fb0788d9d113bf84afb956b8854aad465830c2a6"}, +] + +[package.dependencies] +numpy = "*" + [[package]] name = "matplotlib" -version = "3.10.8" +version = "3.10.9" description = "Python plotting package" optional = false python-versions = ">=3.10" -groups = ["examples"] -files = [ - {file = "matplotlib-3.10.8-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:00270d217d6b20d14b584c521f810d60c5c78406dc289859776550df837dcda7"}, - {file = "matplotlib-3.10.8-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:37b3c1cc42aa184b3f738cfa18c1c1d72fd496d85467a6cf7b807936d39aa656"}, - {file = "matplotlib-3.10.8-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:ee40c27c795bda6a5292e9cff9890189d32f7e3a0bf04e0e3c9430c4a00c37df"}, - {file = "matplotlib-3.10.8-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a48f2b74020919552ea25d222d5cc6af9ca3f4eb43a93e14d068457f545c2a17"}, - {file = "matplotlib-3.10.8-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:f254d118d14a7f99d616271d6c3c27922c092dac11112670b157798b89bf4933"}, - {file = "matplotlib-3.10.8-cp310-cp310-win_amd64.whl", hash = "sha256:f9b587c9c7274c1613a30afabf65a272114cd6cdbe67b3406f818c79d7ab2e2a"}, - {file = "matplotlib-3.10.8-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:6be43b667360fef5c754dda5d25a32e6307a03c204f3c0fc5468b78fa87b4160"}, - {file = "matplotlib-3.10.8-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a2b336e2d91a3d7006864e0990c83b216fcdca64b5a6484912902cef87313d78"}, - {file = "matplotlib-3.10.8-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:efb30e3baaea72ce5928e32bab719ab4770099079d66726a62b11b1ef7273be4"}, - {file = "matplotlib-3.10.8-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d56a1efd5bfd61486c8bc968fa18734464556f0fb8e51690f4ac25d85cbbbbc2"}, - {file = "matplotlib-3.10.8-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:238b7ce5717600615c895050239ec955d91f321c209dd110db988500558e70d6"}, - {file = "matplotlib-3.10.8-cp311-cp311-win_amd64.whl", hash = "sha256:18821ace09c763ec93aef5eeff087ee493a24051936d7b9ebcad9662f66501f9"}, - {file = "matplotlib-3.10.8-cp311-cp311-win_arm64.whl", hash = "sha256:bab485bcf8b1c7d2060b4fcb6fc368a9e6f4cd754c9c2fea281f4be21df394a2"}, - {file = "matplotlib-3.10.8-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:64fcc24778ca0404ce0cb7b6b77ae1f4c7231cdd60e6778f999ee05cbd581b9a"}, - {file = "matplotlib-3.10.8-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b9a5ca4ac220a0cdd1ba6bcba3608547117d30468fefce49bb26f55c1a3d5c58"}, - {file = "matplotlib-3.10.8-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:3ab4aabc72de4ff77b3ec33a6d78a68227bf1123465887f9905ba79184a1cc04"}, - {file = "matplotlib-3.10.8-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:24d50994d8c5816ddc35411e50a86ab05f575e2530c02752e02538122613371f"}, - {file = "matplotlib-3.10.8-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:99eefd13c0dc3b3c1b4d561c1169e65fe47aab7b8158754d7c084088e2329466"}, - {file = "matplotlib-3.10.8-cp312-cp312-win_amd64.whl", hash = "sha256:dd80ecb295460a5d9d260df63c43f4afbdd832d725a531f008dad1664f458adf"}, - {file = "matplotlib-3.10.8-cp312-cp312-win_arm64.whl", hash = "sha256:3c624e43ed56313651bc18a47f838b60d7b8032ed348911c54906b130b20071b"}, - {file = "matplotlib-3.10.8-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:3f2e409836d7f5ac2f1c013110a4d50b9f7edc26328c108915f9075d7d7a91b6"}, - {file = "matplotlib-3.10.8-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:56271f3dac49a88d7fca5060f004d9d22b865f743a12a23b1e937a0be4818ee1"}, - {file = "matplotlib-3.10.8-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:a0a7f52498f72f13d4a25ea70f35f4cb60642b466cbb0a9be951b5bc3f45a486"}, - {file = "matplotlib-3.10.8-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:646d95230efb9ca614a7a594d4fcacde0ac61d25e37dd51710b36477594963ce"}, - {file = "matplotlib-3.10.8-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:f89c151aab2e2e23cb3fe0acad1e8b82841fd265379c4cecd0f3fcb34c15e0f6"}, - {file = "matplotlib-3.10.8-cp313-cp313-win_amd64.whl", hash = "sha256:e8ea3e2d4066083e264e75c829078f9e149fa119d27e19acd503de65e0b13149"}, - {file = "matplotlib-3.10.8-cp313-cp313-win_arm64.whl", hash = "sha256:c108a1d6fa78a50646029cb6d49808ff0fc1330fda87fa6f6250c6b5369b6645"}, - {file = "matplotlib-3.10.8-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:ad3d9833a64cf48cc4300f2b406c3d0f4f4724a91c0bd5640678a6ba7c102077"}, - {file = "matplotlib-3.10.8-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:eb3823f11823deade26ce3b9f40dcb4a213da7a670013929f31d5f5ed1055b22"}, - {file = "matplotlib-3.10.8-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:d9050fee89a89ed57b4fb2c1bfac9a3d0c57a0d55aed95949eedbc42070fea39"}, - {file = "matplotlib-3.10.8-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b44d07310e404ba95f8c25aa5536f154c0a8ec473303535949e52eb71d0a1565"}, - {file = "matplotlib-3.10.8-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:0a33deb84c15ede243aead39f77e990469fff93ad1521163305095b77b72ce4a"}, - {file = "matplotlib-3.10.8-cp313-cp313t-win_amd64.whl", hash = "sha256:3a48a78d2786784cc2413e57397981fb45c79e968d99656706018d6e62e57958"}, - {file = "matplotlib-3.10.8-cp313-cp313t-win_arm64.whl", hash = "sha256:15d30132718972c2c074cd14638c7f4592bd98719e2308bccea40e0538bc0cb5"}, - {file = "matplotlib-3.10.8-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:b53285e65d4fa4c86399979e956235deb900be5baa7fc1218ea67fbfaeaadd6f"}, - {file = "matplotlib-3.10.8-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:32f8dce744be5569bebe789e46727946041199030db8aeb2954d26013a0eb26b"}, - {file = "matplotlib-3.10.8-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4cf267add95b1c88300d96ca837833d4112756045364f5c734a2276038dae27d"}, - {file = "matplotlib-3.10.8-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2cf5bd12cecf46908f286d7838b2abc6c91cda506c0445b8223a7c19a00df008"}, - {file = "matplotlib-3.10.8-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:41703cc95688f2516b480f7f339d8851a6035f18e100ee6a32bc0b8536a12a9c"}, - {file = "matplotlib-3.10.8-cp314-cp314-win_amd64.whl", hash = "sha256:83d282364ea9f3e52363da262ce32a09dfe241e4080dcedda3c0db059d3c1f11"}, - {file = "matplotlib-3.10.8-cp314-cp314-win_arm64.whl", hash = "sha256:2c1998e92cd5999e295a731bcb2911c75f597d937341f3030cc24ef2733d78a8"}, - {file = "matplotlib-3.10.8-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:b5a2b97dbdc7d4f353ebf343744f1d1f1cca8aa8bfddb4262fcf4306c3761d50"}, - {file = "matplotlib-3.10.8-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:3f5c3e4da343bba819f0234186b9004faba952cc420fbc522dc4e103c1985908"}, - {file = "matplotlib-3.10.8-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5f62550b9a30afde8c1c3ae450e5eb547d579dd69b25c2fc7a1c67f934c1717a"}, - {file = "matplotlib-3.10.8-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:495672de149445ec1b772ff2c9ede9b769e3cb4f0d0aa7fa730d7f59e2d4e1c1"}, - {file = "matplotlib-3.10.8-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:595ba4d8fe983b88f0eec8c26a241e16d6376fe1979086232f481f8f3f67494c"}, - {file = "matplotlib-3.10.8-cp314-cp314t-win_amd64.whl", hash = "sha256:25d380fe8b1dc32cf8f0b1b448470a77afb195438bafdf1d858bfb876f3edf7b"}, - {file = "matplotlib-3.10.8-cp314-cp314t-win_arm64.whl", hash = "sha256:113bb52413ea508ce954a02c10ffd0d565f9c3bc7f2eddc27dfe1731e71c7b5f"}, - {file = "matplotlib-3.10.8-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:f97aeb209c3d2511443f8797e3e5a569aebb040d4f8bc79aa3ee78a8fb9e3dd8"}, - {file = "matplotlib-3.10.8-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:fb061f596dad3a0f52b60dc6a5dec4a0c300dec41e058a7efe09256188d170b7"}, - {file = "matplotlib-3.10.8-pp310-pypy310_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:12d90df9183093fcd479f4172ac26b322b1248b15729cb57f42f71f24c7e37a3"}, - {file = "matplotlib-3.10.8-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:6da7c2ce169267d0d066adcf63758f0604aa6c3eebf67458930f9d9b79ad1db1"}, - {file = "matplotlib-3.10.8-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:9153c3292705be9f9c64498a8872118540c3f4123d1a1c840172edf262c8be4a"}, - {file = "matplotlib-3.10.8-pp311-pypy311_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:1ae029229a57cd1e8fe542485f27e7ca7b23aa9e8944ddb4985d0bc444f1eca2"}, - {file = "matplotlib-3.10.8.tar.gz", hash = "sha256:2299372c19d56bcd35cf05a2738308758d32b9eaed2371898d8f5bd33f084aa3"}, +groups = ["examples", "floris"] +markers = "python_version < \"3.11\"" +files = [ + {file = "matplotlib-3.10.9-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:77210dce9cb8153dffc967efaae990543392563d5a376d4dd8539bebcb0ed217"}, + {file = "matplotlib-3.10.9-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:1e7698ac9868428e84d2c967424803b2472ff7167d9d6590d4204ed775343c3b"}, + {file = "matplotlib-3.10.9-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:1aa972116abb4c9d201bf245620b433726cb6856f3bef6a78f776a00f5c92d37"}, + {file = "matplotlib-3.10.9-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ae2f11957b27ce53497dd4d7b235c4d4f1faf383dfb39d0c5beb833bff883294"}, + {file = "matplotlib-3.10.9-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:b049278ddce116aaa1c1377ebf58adea909132dfce0281cf7e3a1ea9fc2e2c65"}, + {file = "matplotlib-3.10.9-cp310-cp310-win_amd64.whl", hash = "sha256:82834c3c292d24d3a8aae77cd2d20019de69d692a34a970e4fdb8d33e2ea3dda"}, + {file = "matplotlib-3.10.9-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:68cfdcede415f7c8f5577b03303dd94526cdb6d11036cecdc205e08733b2d2bb"}, + {file = "matplotlib-3.10.9-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:dfca0129678bd56379db26c52b5d77ed7de314c047492fbdc763aa7501710cfb"}, + {file = "matplotlib-3.10.9-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:8e436d155fa8a3399dc62683f8f5d0e2e50d25d0144a73edd73f82eec8f4abfb"}, + {file = "matplotlib-3.10.9-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:56fc0bd271b00025c6edfdc7c2dcd247372c8e1544971d62e1dc7c17367e8bf9"}, + {file = "matplotlib-3.10.9-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:a5a6104ed666402ba5106d7f36e0e0cdca4e8d7fa4d39708ca88019e2835a2eb"}, + {file = "matplotlib-3.10.9-cp311-cp311-win_amd64.whl", hash = "sha256:d730e984eddf56974c3e72b6129c7ca462ac38dc624338f4b0b23eb23ecba00f"}, + {file = "matplotlib-3.10.9-cp311-cp311-win_arm64.whl", hash = "sha256:51bf0ddbdc598e060d46c16b5590708f81a1624cefbaaf62f6a81bf9285b8c80"}, + {file = "matplotlib-3.10.9-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:f0c3c28d9fbcc1fe7a03be236d73430cf6409c41fb2383a7ac52fe932b072cb1"}, + {file = "matplotlib-3.10.9-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:41cb28c2bd769aa3e98322c6ab09854cbcc52ab69d2759d681bba3e327b2b320"}, + {file = "matplotlib-3.10.9-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:ae20801130378b82d647ff5047c07316295b68dc054ca6b3c13519d0ea624285"}, + {file = "matplotlib-3.10.9-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6c63ebcd8b4b169eb2f5c200552ae6b8be8999a005b6b507ed76fb8d7d674fe2"}, + {file = "matplotlib-3.10.9-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:d75d11c949914165976c621b2324f9ef162af7ebf4b057ddf95dd1dba7e5edcf"}, + {file = "matplotlib-3.10.9-cp312-cp312-win_amd64.whl", hash = "sha256:d091f9d758b34aaaaa6331d13574bf01891d903b3dec59bfff458ef7551de5d6"}, + {file = "matplotlib-3.10.9-cp312-cp312-win_arm64.whl", hash = "sha256:10cc5ce06d10231c36f40e875f3c7e8050362a4ee8f0ee5d29a6b3277d57bb42"}, + {file = "matplotlib-3.10.9-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:b580440f1ff81a0e34122051a3dfabb7e4b7f9e380629929bde0eff9af72165f"}, + {file = "matplotlib-3.10.9-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:b1b745c489cd1a77a0dc1120a05dc87af9798faebc913601feb8c73d89bf2d1e"}, + {file = "matplotlib-3.10.9-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:8f3bcac1ca5ed000a6f4337d47ba67dfddf37ed6a46c15fd7f014997f7bf865f"}, + {file = "matplotlib-3.10.9-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7a8d66a55def891c33147ba3ba9bfcabf0b526a43764c818acbb4525e5ed0838"}, + {file = "matplotlib-3.10.9-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:d843374407c4017a6403b59c6c81606773d136f3259d5b6da3131bc814542cc2"}, + {file = "matplotlib-3.10.9-cp313-cp313-win_amd64.whl", hash = "sha256:f4399f64b3e94cd500195490972ae1ee81170df1636fa15364d157d5bdd7b921"}, + {file = "matplotlib-3.10.9-cp313-cp313-win_arm64.whl", hash = "sha256:ba7b3b8ef09eab7df0e86e9ae086faa433efbfbdb46afcb3aa16aabf779469a8"}, + {file = "matplotlib-3.10.9-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:09218df8a93712bd6ea133e83a153c755448cf7868316c531cffcc43f69d1cc9"}, + {file = "matplotlib-3.10.9-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:82368699727bfb7b0182e1aa13082e3c08e092fa1a25d3e1fd92405bff96f6d4"}, + {file = "matplotlib-3.10.9-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:3225f4e1edcb8c86c884ddf79ebe20ecd0a67d30188f279897554ccd8fded4dc"}, + {file = "matplotlib-3.10.9-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:de2445a0c6690d21b7eb6ce071cebad6d40a2e9bdf10d039074a96ba19797b99"}, + {file = "matplotlib-3.10.9-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:b2b9516251cb89ff618d757daec0e2ed1bf21248013844a853d87ef85ab3081d"}, + {file = "matplotlib-3.10.9-cp313-cp313t-win_amd64.whl", hash = "sha256:e9fae004b941b23ff2edcf1567a857ed77bafc8086ffa258190462328434faf8"}, + {file = "matplotlib-3.10.9-cp313-cp313t-win_arm64.whl", hash = "sha256:6b63d9c7c769b88ab81e10dc86e4e0607cf56817b9f9e6cf24b2a5f1693b8e38"}, + {file = "matplotlib-3.10.9-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:172db52c9e683f5d12eaf57f0f54834190e12581fe1cc2a19595a8f5acb4e77d"}, + {file = "matplotlib-3.10.9-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:97e35e8d39ccc85859095e01a53847432ba9a53ddf7986f7a54a11b73d0e143f"}, + {file = "matplotlib-3.10.9-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:aba1615dabe83188e19d4f75a253c6a08423e04c1425e64039f800050a69de6b"}, + {file = "matplotlib-3.10.9-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:34cf8167e023ad956c15f36302911d5406bd99a9862c1a8499ea6f7c0e015dc2"}, + {file = "matplotlib-3.10.9-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:59476c6d29d612b8e9bb6ce8c5b631be6ba8f9e3a2421f22a02b192c7dd28716"}, + {file = "matplotlib-3.10.9-cp314-cp314-win_amd64.whl", hash = "sha256:336b9acc64d309063126edcdaca00db9373af3c476bb94388fe9c5a53ad13e6f"}, + {file = "matplotlib-3.10.9-cp314-cp314-win_arm64.whl", hash = "sha256:2dc9477819ffd78ad12a20df1d9d6a6bd4fec6aaa9072681465fddca052f1456"}, + {file = "matplotlib-3.10.9-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:da4e09638420548f31c354032a6250e473c68e5a4e96899b4844cf39ddea23fe"}, + {file = "matplotlib-3.10.9-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:345f6f68ecc8da0ca56fad2ea08fde1a115eda530079eca185d50a7bc3e146c6"}, + {file = "matplotlib-3.10.9-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4edcfbd8565339aa62f1cd4012f7180926fdbe71850f7b0d3c379c175cd6b66c"}, + {file = "matplotlib-3.10.9-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6be157fe17fc37cb95ac1d7374cf717ce9259616edec911a78d9d26dae8522d4"}, + {file = "matplotlib-3.10.9-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:4e42042d54db34fda4e95a7bd3e5789c2a995d2dad3eb8850232ee534092fbbf"}, + {file = "matplotlib-3.10.9-cp314-cp314t-win_amd64.whl", hash = "sha256:c27df8b3848f32a83d1767566595e43cfaa4460380974da06f4279a7ec143c39"}, + {file = "matplotlib-3.10.9-cp314-cp314t-win_arm64.whl", hash = "sha256:a49f1eadc84ca85fd72fa4e89e70e61bf86452df6f971af04b12c60761a0772c"}, + {file = "matplotlib-3.10.9-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:1872fb212a05b729e649754a72d5da61d03e0554d76e80303b6f83d1d2c0552b"}, + {file = "matplotlib-3.10.9-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:985f2238880e2e69093f588f5fe2e46771747febf0649f3cf7f7b7480875317f"}, + {file = "matplotlib-3.10.9-pp310-pypy310_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:6640f75af2c6148293caa0a2b39dd806a492dd66c8a8b04035813e33d0fd2585"}, + {file = "matplotlib-3.10.9-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:42fb814efabe95c06c1994d8ab5a8385f43a249e23badd3ba931d4308e5bca20"}, + {file = "matplotlib-3.10.9-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:f76e640a5268850bfda54b5131b1b1941cc685e42c5fa98ed9f2d64038308cba"}, + {file = "matplotlib-3.10.9-pp311-pypy311_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:3fc0364dfbe1d07f6d15c5ebd0c5bf89e126916e5a8667dd4a7a6e84c36653d4"}, + {file = "matplotlib-3.10.9.tar.gz", hash = "sha256:fd66508e8c6877d98e586654b608a0456db8d7e8a546eb1e2600efd957302358"}, ] [package.dependencies] @@ -1917,101 +2357,228 @@ pyparsing = ">=3" python-dateutil = ">=2.7" [package.extras] -dev = ["meson-python (>=0.13.1,<0.17.0)", "pybind11 (>=2.13.2,!=2.13.3)", "setuptools (>=64)", "setuptools_scm (>=7)"] +dev = ["meson-python (>=0.13.1,<0.17.0)", "pybind11 (>=2.13.2,!=2.13.3)", "setuptools (>=64)", "setuptools_scm (>=7,<10)"] + +[[package]] +name = "matplotlib" +version = "3.11.1" +description = "Python plotting package" +optional = false +python-versions = ">=3.11" +groups = ["examples", "floris"] +markers = "python_version >= \"3.11\"" +files = [ + {file = "matplotlib-3.11.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:b7cf158e7add54a8d51ac9b5a84abd6d4e13ed4951b4f25f1c5139f41c2addb2"}, + {file = "matplotlib-3.11.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d2ace7273b9a5061a3b420918a16fae1f2dc5dfee1abcc13aba71b5d94b1820c"}, + {file = "matplotlib-3.11.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:aee55e9041211bf84302ab55ec3965df18dd90ae19f8b58332a7feaf208bfe83"}, + {file = "matplotlib-3.11.1-cp311-cp311-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:96f4bdeea33a8d15a071dbfe6d119451b1d719c733ac666d65357082901a9099"}, + {file = "matplotlib-3.11.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:b4c78ceb2f11bcac7389d305cda17aeb1f4586a857854ab5780bd3dd8dbfc407"}, + {file = "matplotlib-3.11.1-cp311-cp311-win_amd64.whl", hash = "sha256:7f33a781e12b1e53b278deb2f5373c2e55ec4f10727be3440c0cfb5cda9f944f"}, + {file = "matplotlib-3.11.1-cp311-cp311-win_arm64.whl", hash = "sha256:67e4c3cd578c65ebd81bdc09a1b6592ceafee6dfafe116dc85dfcb647b5bbb18"}, + {file = "matplotlib-3.11.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:e15ef41507f3d525f46154ac9e3ae785dacde9f20e593a25de8986267892ef74"}, + {file = "matplotlib-3.11.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:21a67b961a6d597bca54fae826cd20695ba4a6e4d05424a08da6e13e3176fd6b"}, + {file = "matplotlib-3.11.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:ba8f811b8ddfac493734d6af0b2dff96919d0c28ca0d641858dab4262777c6ea"}, + {file = "matplotlib-3.11.1-cp312-cp312-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c52f7ad20ef476806ed212380b1d54d20310c8b86bdc2c9a68b51f0024a44472"}, + {file = "matplotlib-3.11.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:8b14eb22961fe865efb0e4ff167e333e428908b00115a8d800ccb65ee108e481"}, + {file = "matplotlib-3.11.1-cp312-cp312-win_amd64.whl", hash = "sha256:88a2a27dd9691ae448dfae4b26f59036be90c3c28757edd3553a29559d00859f"}, + {file = "matplotlib-3.11.1-cp312-cp312-win_arm64.whl", hash = "sha256:480194afceca4df2f137c2721227d3cba67121fbf4397b69cee7f83714b0a58a"}, + {file = "matplotlib-3.11.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:6771b0cd7838c6a857a7209814158c0ad09bfef878db3033dd82d70ad101f191"}, + {file = "matplotlib-3.11.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:2abdee5ffa2fe11b2d19f7a5c63b785fb7c28cc46c7bc1814156341d9d1a33e1"}, + {file = "matplotlib-3.11.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:b0a19dcf73406d3746d25a5ed42d713604c9a3e024d129b102852b0d941cb9f3"}, + {file = "matplotlib-3.11.1-cp313-cp313-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7389b77ed2ab0552f46d9a90b81b7b8e6dfcdc42adc36c37a0865799843e0e3e"}, + {file = "matplotlib-3.11.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:c90be0b73568da4f662afac580956a76e308437e641b4a45aa08925eeb67d95f"}, + {file = "matplotlib-3.11.1-cp313-cp313-win_amd64.whl", hash = "sha256:68408341f2312836fbbdf6b3c78047f65b2d8752f5fd221c3e72d348f5b34f8b"}, + {file = "matplotlib-3.11.1-cp313-cp313-win_arm64.whl", hash = "sha256:0c1f44890d435c1b4ef52f701ad5828cb450ea97bcc83918fda6be74965d6cd2"}, + {file = "matplotlib-3.11.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:5e510088c27a89d53580a752f959146893563e63c330e161d159b0fee652af6f"}, + {file = "matplotlib-3.11.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:1524e2bdd48a93557aa47ddcfe9c225dfdd57d5a01a5c49128c20f0632980ee1"}, + {file = "matplotlib-3.11.1-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:11664c551345553db92e61cae6cf1376f138f8c47cafdf13b64b18f3e3e9e464"}, + {file = "matplotlib-3.11.1-cp313-cp313t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5e1f8922ba31959cf6a9dfb51be64b7f7bc582801a3957dc0c2f3afcd3537adf"}, + {file = "matplotlib-3.11.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:83235693abde86e5e0129998f80ee39fc7f58e6d56a88fafb28a9278833e9d5f"}, + {file = "matplotlib-3.11.1-cp313-cp313t-win_amd64.whl", hash = "sha256:9a076f4fc5cdc43fdf510f5981418d25c2db4973418d9f22d8bb3dc8045ada78"}, + {file = "matplotlib-3.11.1-cp313-cp313t-win_arm64.whl", hash = "sha256:216fbb93a74add02ddb4cb38ef5348f59ac00b3e84567eaf16598772d40e150a"}, + {file = "matplotlib-3.11.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:30c492d4ba9448595b6fd8708c6725963f8148e25c0d8842948da5b05f0ee8d3"}, + {file = "matplotlib-3.11.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:ac104be2768ffdd8655db9e71b768cbb45f2b9aa7b450cf1595e8f65d3822319"}, + {file = "matplotlib-3.11.1-cp314-cp314-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6be943cb68bc6660ead58c55b3aa6366cba2ef7feb06460fbcce32360376f19f"}, + {file = "matplotlib-3.11.1-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5af0dcda57d471440a7b5b623e70e0a61003518443d9098f211a96ecfbbc25be"}, + {file = "matplotlib-3.11.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:3d3fd84082b1afbd9398466c81309e20045be20d48fe0fb18c43504d164cbbb2"}, + {file = "matplotlib-3.11.1-cp314-cp314-win_amd64.whl", hash = "sha256:9601a1e90be21e4884c53b4f3dc3ee0544654946f9975258d691f1c2e2f119c6"}, + {file = "matplotlib-3.11.1-cp314-cp314-win_arm64.whl", hash = "sha256:ae30c6109848ac0f9fa36c5d6270938487614c47ba31860bd5361266dabc5685"}, + {file = "matplotlib-3.11.1-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:dadfe80797174e2984aae3be0b77594a3c72d2c0a40fbd4a0de48d2728caf3ae"}, + {file = "matplotlib-3.11.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:89b193b255f4f6f7948dbcee3691f4f341ab05d9a8874a67b45ddb4182922eda"}, + {file = "matplotlib-3.11.1-cp314-cp314t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:191163532cdefcb1571ca38a6d7e6474baccde64495783e6ba47aa07ec4b9bbb"}, + {file = "matplotlib-3.11.1-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9fdf1c818ab05d0e74002091ddaf414478a3a449ec9d51c8976d45be7e3a01e2"}, + {file = "matplotlib-3.11.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:b937b9dba5f5f6c1e31c47abe2186c865c0914fd18f2ce0dfc39c9adcef5951d"}, + {file = "matplotlib-3.11.1-cp314-cp314t-win_amd64.whl", hash = "sha256:f2912f647f3fbe1ccf085f91e213936f9101bead81a5e670565b1f1b3712f4fb"}, + {file = "matplotlib-3.11.1-cp314-cp314t-win_arm64.whl", hash = "sha256:54d47b8ae8b579633a3902ca5b4ad6c1e132a5626d64447b2e22a66394e79987"}, + {file = "matplotlib-3.11.1-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:427258425f9a3fc4ed79a91f9e9b9aaf5a82cb6571e85dc14063cc6fbb993741"}, + {file = "matplotlib-3.11.1-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:1ac697e591c11b6ad04679a73c2d2f9980fe9d9f0311fb414a2e329706343dfb"}, + {file = "matplotlib-3.11.1-pp311-pypy311_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:e4b9ac2f1f607ecda2af90a5232beee2af7582fce1cc30c4b6a1b012dc21ee99"}, + {file = "matplotlib-3.11.1.tar.gz", hash = "sha256:69647db5746941c793d6e445a4cd349323ffb87d9cc958c2ad84a659b4832d30"}, +] + +[package.dependencies] +contourpy = ">=1.0.1" +cycler = ">=0.10" +fonttools = ">=4.28.2" +kiwisolver = ">=1.3.1" +numpy = ">=1.25" +packaging = ">=20.0" +pillow = ">=9" +pyparsing = ">=3" +python-dateutil = ">=2.7" [[package]] name = "matplotlib-inline" -version = "0.2.1" +version = "0.2.2" description = "Inline Matplotlib backend for Jupyter" optional = false python-versions = ">=3.9" groups = ["dev"] files = [ - {file = "matplotlib_inline-0.2.1-py3-none-any.whl", hash = "sha256:d56ce5156ba6085e00a9d54fead6ed29a9c47e215cd1bba2e976ef39f5710a76"}, - {file = "matplotlib_inline-0.2.1.tar.gz", hash = "sha256:e1ee949c340d771fc39e241ea75683deb94762c8fa5f2927ec57c83c4dffa9fe"}, + {file = "matplotlib_inline-0.2.2-py3-none-any.whl", hash = "sha256:3c821cf1c209f59fb2d2d64abbf5b23b67bcb2210d663f9918dd851c6da1fcf6"}, + {file = "matplotlib_inline-0.2.2.tar.gz", hash = "sha256:72f3fe8fce36b70d4a5b612f899090cd0401deddc4ea90e1572b9f4bfb058c79"}, ] [package.dependencies] traitlets = "*" [package.extras] -test = ["flake8", "nbdime", "nbval", "notebook", "pytest"] +test = ["flake8", "matplotlib", "nbdime", "nbval", "notebook", "pytest"] [[package]] name = "mistune" -version = "3.2.0" +version = "3.3.4" description = "A sane and fast Markdown parser with useful plugins and renderers" optional = false python-versions = ">=3.8" groups = ["dev"] files = [ - {file = "mistune-3.2.0-py3-none-any.whl", hash = "sha256:febdc629a3c78616b94393c6580551e0e34cc289987ec6c35ed3f4be42d0eee1"}, - {file = "mistune-3.2.0.tar.gz", hash = "sha256:708487c8a8cdd99c9d90eb3ed4c3ed961246ff78ac82f03418f5183ab70e398a"}, + {file = "mistune-3.3.4-py3-none-any.whl", hash = "sha256:ee015381e955e370962968befe1d729ab60fafb6a715ac6751763fbce38c8d4a"}, + {file = "mistune-3.3.4.tar.gz", hash = "sha256:58b5c96d6fcb61190dfe5fae498d2b2065f99cf61e9649418fd54cf1ada86dfe"}, ] [package.dependencies] typing-extensions = {version = "*", markers = "python_version < \"3.11\""} +[[package]] +name = "moorpy" +version = "1.3.0" +description = "A design-oriented mooring system library for Python" +optional = false +python-versions = ">=3.8" +groups = ["floris"] +files = [ + {file = "moorpy-1.3.0-py3-none-any.whl", hash = "sha256:2a6bf0f9db32fd49624471aeb152925ede383c0414db853c47069d5b3cd55b12"}, + {file = "moorpy-1.3.0.tar.gz", hash = "sha256:ccef5e65a8a0f65be48e0fc39275918c318390937bf426c26a96d5fda0692256"}, +] + +[package.dependencies] +matplotlib = "*" +numpy = "*" +pyyaml = "*" +scipy = "*" + +[package.extras] +dev = ["pre-commit"] +docs = ["sphinx", "sphinx-rtd-theme"] +test = ["pytest", "pytest-cov", "pytest-xdist"] + +[[package]] +name = "multiprocess" +version = "0.70.19" +description = "better multiprocessing and multithreading in Python" +optional = false +python-versions = ">=3.9" +groups = ["floris"] +files = [ + {file = "multiprocess-0.70.19-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:02e5c35d7d6cd2bdc89c1858867f7bde4012837411023a4696c148c1bdd7c80e"}, + {file = "multiprocess-0.70.19-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:79576c02d1207ec405b00cabf2c643c36070800cca433860e14539df7818b2aa"}, + {file = "multiprocess-0.70.19-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:c6b6d78d43a03b68014ca1f0b7937d965393a670c5de7c29026beb2258f2f896"}, + {file = "multiprocess-0.70.19-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:1bbf1b69af1cf64cd05f65337d9215b88079ec819cd0ea7bac4dab84e162efe7"}, + {file = "multiprocess-0.70.19-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:5be9ec7f0c1c49a4f4a6fd20d5dda4aeabc2d39a50f4ad53720f1cd02b3a7c2e"}, + {file = "multiprocess-0.70.19-pp311-pypy311_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:1c3dce098845a0db43b32a0b76a228ca059a668071cfeaa0f40c36c0b1585d45"}, + {file = "multiprocess-0.70.19-pp39-pypy39_pp73-macosx_10_13_arm64.whl", hash = "sha256:e5e7dc3e3e1732e88c07aaec17eeb9917f9ed1107d9e60d5ab985cdc14bac43a"}, + {file = "multiprocess-0.70.19-pp39-pypy39_pp73-macosx_10_13_x86_64.whl", hash = "sha256:e6c0674d34b8adac22533f6786576b3de4e396aaeda9e0c15378af9b8ada2702"}, + {file = "multiprocess-0.70.19-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:d6db91ca6391eebc139c352f34578cea382df6bfa03d3b4146ed12b18b01cc14"}, + {file = "multiprocess-0.70.19-py310-none-any.whl", hash = "sha256:97404393419dcb2a8385910864eedf47a3cadf82c66345b44f036420eb0b5d87"}, + {file = "multiprocess-0.70.19-py311-none-any.whl", hash = "sha256:928851ae7973aea4ce0eaf330bbdafb2e01398a91518d5c8818802845564f45c"}, + {file = "multiprocess-0.70.19-py312-none-any.whl", hash = "sha256:3a56c0e85dd5025161bac5ce138dcac1e49174c7d8e74596537e729fd5c53c28"}, + {file = "multiprocess-0.70.19-py313-none-any.whl", hash = "sha256:8d5eb4ec5017ba2fab4e34a747c6d2c2b6fecfe9e7236e77988db91580ada952"}, + {file = "multiprocess-0.70.19-py314-none-any.whl", hash = "sha256:e8cc7fbdff15c0613f0a1f1f8744bef961b0a164c0ca29bdff53e9d2d93c5e5f"}, + {file = "multiprocess-0.70.19-py39-none-any.whl", hash = "sha256:0d4b4397ed669d371c81dcd1ef33fd384a44d6c3de1bd0ca7ac06d837720d3c5"}, + {file = "multiprocess-0.70.19.tar.gz", hash = "sha256:952021e0e6c55a4a9fe4cd787895b86e239a40e76802a789d6305398d3975897"}, +] + +[package.dependencies] +dill = ">=0.4.1" + [[package]] name = "mypy" -version = "1.19.1" +version = "1.20.2" description = "Optional static typing for Python" optional = false -python-versions = ">=3.9" +python-versions = ">=3.10" groups = ["dev"] files = [ - {file = "mypy-1.19.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5f05aa3d375b385734388e844bc01733bd33c644ab48e9684faa54e5389775ec"}, - {file = "mypy-1.19.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:022ea7279374af1a5d78dfcab853fe6a536eebfda4b59deab53cd21f6cd9f00b"}, - {file = "mypy-1.19.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ee4c11e460685c3e0c64a4c5de82ae143622410950d6be863303a1c4ba0e36d6"}, - {file = "mypy-1.19.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:de759aafbae8763283b2ee5869c7255391fbc4de3ff171f8f030b5ec48381b74"}, - {file = "mypy-1.19.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:ab43590f9cd5108f41aacf9fca31841142c786827a74ab7cc8a2eacb634e09a1"}, - {file = "mypy-1.19.1-cp310-cp310-win_amd64.whl", hash = "sha256:2899753e2f61e571b3971747e302d5f420c3fd09650e1951e99f823bc3089dac"}, - {file = "mypy-1.19.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d8dfc6ab58ca7dda47d9237349157500468e404b17213d44fc1cb77bce532288"}, - {file = "mypy-1.19.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e3f276d8493c3c97930e354b2595a44a21348b320d859fb4a2b9f66da9ed27ab"}, - {file = "mypy-1.19.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2abb24cf3f17864770d18d673c85235ba52456b36a06b6afc1e07c1fdcd3d0e6"}, - {file = "mypy-1.19.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a009ffa5a621762d0c926a078c2d639104becab69e79538a494bcccb62cc0331"}, - {file = "mypy-1.19.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f7cee03c9a2e2ee26ec07479f38ea9c884e301d42c6d43a19d20fb014e3ba925"}, - {file = "mypy-1.19.1-cp311-cp311-win_amd64.whl", hash = "sha256:4b84a7a18f41e167f7995200a1d07a4a6810e89d29859df936f1c3923d263042"}, - {file = "mypy-1.19.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:a8174a03289288c1f6c46d55cef02379b478bfbc8e358e02047487cad44c6ca1"}, - {file = "mypy-1.19.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ffcebe56eb09ff0c0885e750036a095e23793ba6c2e894e7e63f6d89ad51f22e"}, - {file = "mypy-1.19.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b64d987153888790bcdb03a6473d321820597ab8dd9243b27a92153c4fa50fd2"}, - {file = "mypy-1.19.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c35d298c2c4bba75feb2195655dfea8124d855dfd7343bf8b8c055421eaf0cf8"}, - {file = "mypy-1.19.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:34c81968774648ab5ac09c29a375fdede03ba253f8f8287847bd480782f73a6a"}, - {file = "mypy-1.19.1-cp312-cp312-win_amd64.whl", hash = "sha256:b10e7c2cd7870ba4ad9b2d8a6102eb5ffc1f16ca35e3de6bfa390c1113029d13"}, - {file = "mypy-1.19.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:e3157c7594ff2ef1634ee058aafc56a82db665c9438fd41b390f3bde1ab12250"}, - {file = "mypy-1.19.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:bdb12f69bcc02700c2b47e070238f42cb87f18c0bc1fc4cdb4fb2bc5fd7a3b8b"}, - {file = "mypy-1.19.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f859fb09d9583a985be9a493d5cfc5515b56b08f7447759a0c5deaf68d80506e"}, - {file = "mypy-1.19.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c9a6538e0415310aad77cb94004ca6482330fece18036b5f360b62c45814c4ef"}, - {file = "mypy-1.19.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:da4869fc5e7f62a88f3fe0b5c919d1d9f7ea3cef92d3689de2823fd27e40aa75"}, - {file = "mypy-1.19.1-cp313-cp313-win_amd64.whl", hash = "sha256:016f2246209095e8eda7538944daa1d60e1e8134d98983b9fc1e92c1fc0cb8dd"}, - {file = "mypy-1.19.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:06e6170bd5836770e8104c8fdd58e5e725cfeb309f0a6c681a811f557e97eac1"}, - {file = "mypy-1.19.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:804bd67b8054a85447c8954215a906d6eff9cabeabe493fb6334b24f4bfff718"}, - {file = "mypy-1.19.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:21761006a7f497cb0d4de3d8ef4ca70532256688b0523eee02baf9eec895e27b"}, - {file = "mypy-1.19.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:28902ee51f12e0f19e1e16fbe2f8f06b6637f482c459dd393efddd0ec7f82045"}, - {file = "mypy-1.19.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:481daf36a4c443332e2ae9c137dfee878fcea781a2e3f895d54bd3002a900957"}, - {file = "mypy-1.19.1-cp314-cp314-win_amd64.whl", hash = "sha256:8bb5c6f6d043655e055be9b542aa5f3bdd30e4f3589163e85f93f3640060509f"}, - {file = "mypy-1.19.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:7bcfc336a03a1aaa26dfce9fff3e287a3ba99872a157561cbfcebe67c13308e3"}, - {file = "mypy-1.19.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b7951a701c07ea584c4fe327834b92a30825514c868b1f69c30445093fdd9d5a"}, - {file = "mypy-1.19.1-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b13cfdd6c87fc3efb69ea4ec18ef79c74c3f98b4e5498ca9b85ab3b2c2329a67"}, - {file = "mypy-1.19.1-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4f28f99c824ecebcdaa2e55d82953e38ff60ee5ec938476796636b86afa3956e"}, - {file = "mypy-1.19.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:c608937067d2fc5a4dd1a5ce92fd9e1398691b8c5d012d66e1ddd430e9244376"}, - {file = "mypy-1.19.1-cp39-cp39-win_amd64.whl", hash = "sha256:409088884802d511ee52ca067707b90c883426bd95514e8cfda8281dc2effe24"}, - {file = "mypy-1.19.1-py3-none-any.whl", hash = "sha256:f1235f5ea01b7db5468d53ece6aaddf1ad0b88d9e7462b86ef96fe04995d7247"}, - {file = "mypy-1.19.1.tar.gz", hash = "sha256:19d88bb05303fe63f71dd2c6270daca27cb9401c4ca8255fe50d1d920e0eb9ba"}, -] - -[package.dependencies] -librt = {version = ">=0.6.2", markers = "platform_python_implementation != \"PyPy\""} + {file = "mypy-1.20.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:cf5a4db6dca263010e2c7bff081c89383c72d187ba2cf4c44759aac970e2f0c4"}, + {file = "mypy-1.20.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:7b0e817b518bff7facd7f85ea05b643ad8bdcce684cf29784987b0a7c8e1f997"}, + {file = "mypy-1.20.2-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:97d7b9a485b40f8ca425460e89bf1da2814625b2da627c0dcc6aa46c92631d14"}, + {file = "mypy-1.20.2-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1e1c12f6d2db3d78b909b5f77513c11eb7f2dd2782b96a3ab6dffc7d44575c99"}, + {file = "mypy-1.20.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:89dce27e142d25ffbc154c1819383b69f2e9234dc4ed4766f42e0e8cb264ab5c"}, + {file = "mypy-1.20.2-cp310-cp310-win_amd64.whl", hash = "sha256:f376e37f9bf2a946872fc5fd1199c99310748e3c26c7a26683f13f8bdb756cbd"}, + {file = "mypy-1.20.2-cp310-cp310-win_arm64.whl", hash = "sha256:6e2b469efd811707bc530fd1effef0f5d6eebcb7fe376affae69025da4b979a2"}, + {file = "mypy-1.20.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4077797a273e56e8843d001e9dfe4ba10e33323d6ade647ff260e5cd97d9758c"}, + {file = "mypy-1.20.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:cdecf62abcc4292500d7858aeae87a1f8f1150f4c4dd08fb0b336ee79b2a6df3"}, + {file = "mypy-1.20.2-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c566c3a88b6ece59b3d70f65bedef17304f48eb52ff040a6a18214e1917b3254"}, + {file = "mypy-1.20.2-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0deb80d062b2479f2c87ae568f89845afc71d11bc41b04179e58165fd9f31e98"}, + {file = "mypy-1.20.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:bba9ad231e92a3e424b3e56b65aa17704993425bba97e302c832f9466bb85bac"}, + {file = "mypy-1.20.2-cp311-cp311-win_amd64.whl", hash = "sha256:baf593f2765fa3a6b1ef95807dbaa3d25b594f6a52adcc506a6b9cb115e1be67"}, + {file = "mypy-1.20.2-cp311-cp311-win_arm64.whl", hash = "sha256:20175a1c0f49863946ec20b7f63255768058ac4f07d2b9ded6a6b46cfb5a9100"}, + {file = "mypy-1.20.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:4dbfcf869f6b0517f70cf0030ba6ea1d6645e132337a7d5204a18d8d5636c02b"}, + {file = "mypy-1.20.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4b6481b228d072315b053210b01ac320e1be243dc17f9e5887ef167f23f5fae4"}, + {file = "mypy-1.20.2-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:34397cdced6b90b836e38182076049fdb41424322e0b0728c946b0939ebdf9f6"}, + {file = "mypy-1.20.2-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a5da6976f20cae27059ea8d0c86e7cef3de720e04c4bb9ee18e3690fdb792066"}, + {file = "mypy-1.20.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:56908d7e08318d39f85b1f0c6cfd47b0cac1a130da677630dac0de3e0623e102"}, + {file = "mypy-1.20.2-cp312-cp312-win_amd64.whl", hash = "sha256:d52ad8d78522da1d308789df651ee5379088e77c76cb1994858d40a426b343b9"}, + {file = "mypy-1.20.2-cp312-cp312-win_arm64.whl", hash = "sha256:785b08db19c9f214dc37d65f7c165d19a30fcecb48abfa30f31b01b5acaabb58"}, + {file = "mypy-1.20.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:edfbfca868cdd6bd8d974a60f8a3682f5565d3f5c99b327640cedd24c4264026"}, + {file = "mypy-1.20.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:e2877a02380adfcdbc69071a0f74d6e9dbbf593c0dc9d174e1f223ffd5281943"}, + {file = "mypy-1.20.2-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7488448de6007cd5177c6cea0517ac33b4c0f5ee9b5e9f2be51ce75511a85517"}, + {file = "mypy-1.20.2-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bb9c2fa06887e21d6a3a868762acb82aec34e2c6fd0174064f27c93ede68ad15"}, + {file = "mypy-1.20.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:9d56a78b646f2e3daa865bc70cd5ec5a46c50045801ca8ff17a0c43abc97e3ee"}, + {file = "mypy-1.20.2-cp313-cp313-win_amd64.whl", hash = "sha256:2a4102b03bb7481d9a91a6da8d174740c9c8c4401024684b9ca3b7cc5e49852f"}, + {file = "mypy-1.20.2-cp313-cp313-win_arm64.whl", hash = "sha256:a95a9248b0c6fd933a442c03c3b113c3b61320086b88e2c444676d3fd1ca3330"}, + {file = "mypy-1.20.2-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:419413398fe250aae057fd2fe50166b61077083c9b82754c341cf4fd73038f30"}, + {file = "mypy-1.20.2-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:e73c07f23009962885c197ccb9b41356a30cc0e5a1d0c2ea8fd8fb1362d7f924"}, + {file = "mypy-1.20.2-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0c64e5973df366b747646fc98da921f9d6eba9716d57d1db94a83c026a08e0fb"}, + {file = "mypy-1.20.2-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5a65aa591af023864fd08a97da9974e919452cfe19cb146c8a5dc692626445dc"}, + {file = "mypy-1.20.2-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:4fef51b01e638974a6e69885687e9bd40c8d1e09a6cd291cca0619625cf1f558"}, + {file = "mypy-1.20.2-cp314-cp314-win_amd64.whl", hash = "sha256:913485a03f1bcf5d279409a9d2b9ed565c151f61c09f29991e5faa14033da4c8"}, + {file = "mypy-1.20.2-cp314-cp314-win_arm64.whl", hash = "sha256:c3bae4f855d965b5453784300c12ffc63a548304ac7f99e55d4dc7c898673aa3"}, + {file = "mypy-1.20.2-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:2de3dcea53babc1c3237a19002bc3d228ce1833278f093b8d619e06e7cc79609"}, + {file = "mypy-1.20.2-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:52b176444e2e5054dfcbcb8c75b0b719865c96247b37407184bbfca5c353f2c2"}, + {file = "mypy-1.20.2-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:688c3312e5dadb573a2c69c82af3a298d43ecf9e6d264e0f95df960b5f6ac19c"}, + {file = "mypy-1.20.2-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:29752dbbf8cc53f89f6ac096d363314333045c257c9c75cbd189ca2de0455744"}, + {file = "mypy-1.20.2-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:803203d2b6ea644982c644895c2f78b28d0e208bba7b27d9b921e0ec5eb207c6"}, + {file = "mypy-1.20.2-cp314-cp314t-win_amd64.whl", hash = "sha256:9bcb8aa397ff0093c824182fd76a935a9ba7ad097fcbef80ae89bf6c1731d8ec"}, + {file = "mypy-1.20.2-cp314-cp314t-win_arm64.whl", hash = "sha256:e061b58443f1736f8a37c48978d7ab581636d6ab03e3d4f99e3fa90463bb9382"}, + {file = "mypy-1.20.2-py3-none-any.whl", hash = "sha256:a94c5a76ab46c5e6257c7972b6c8cff0574201ca7dc05647e33e795d78680563"}, + {file = "mypy-1.20.2.tar.gz", hash = "sha256:e8222c26daaafd9e8626dec58ae36029f82585890589576f769a650dd20fd665"}, +] + +[package.dependencies] +librt = {version = ">=0.8.0", markers = "platform_python_implementation != \"PyPy\""} mypy_extensions = ">=1.0.0" -pathspec = ">=0.9.0" +pathspec = ">=1.0.0" tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} -typing_extensions = ">=4.6.0" +typing_extensions = {version = ">=4.6.0", markers = "python_version < \"3.15\""} [package.extras] dmypy = ["psutil (>=4.0)"] faster-cache = ["orjson"] install-types = ["pip"] mypyc = ["setuptools (>=50)"] +native-parser = ["ast-serialize (>=0.1.1,<1.0.0)"] reports = ["lxml"] [[package]] @@ -2028,21 +2595,21 @@ files = [ [[package]] name = "nbclient" -version = "0.10.4" +version = "0.11.0" description = "A client library for executing notebooks. Formerly nbconvert's ExecutePreprocessor." optional = false python-versions = ">=3.10.0" groups = ["dev"] files = [ - {file = "nbclient-0.10.4-py3-none-any.whl", hash = "sha256:9162df5a7373d70d606527300a95a975a47c137776cd942e52d9c7e29ff83440"}, - {file = "nbclient-0.10.4.tar.gz", hash = "sha256:1e54091b16e6da39e297b0ece3e10f6f29f4ac4e8ee515d29f8a7099bd6553c9"}, + {file = "nbclient-0.11.0-py3-none-any.whl", hash = "sha256:ef7fa0d59d6e1d41103933d8a445a18d5de860ca6b613b87b8574accdb3c2895"}, + {file = "nbclient-0.11.0.tar.gz", hash = "sha256:04a134a5b087f2c5887f228aca155db50169b8cd9334dee6942c8e927e56081a"}, ] [package.dependencies] -jupyter-client = ">=6.1.12" -jupyter-core = ">=4.12,<5.0.dev0 || >=5.1.dev0" -nbformat = ">=5.1.3" -traitlets = ">=5.4" +jupyter-client = ">=7.0.0" +jupyter-core = ">=5.4.0" +nbformat = ">=5.2.0" +traitlets = ">=5.13" [package.extras] dev = ["pre-commit"] @@ -2051,14 +2618,14 @@ test = ["flaky", "ipykernel (>=6.19.3)", "ipython", "ipywidgets", "nbconvert (>= [[package]] name = "nbconvert" -version = "7.17.0" +version = "7.17.1" description = "Convert Jupyter Notebooks (.ipynb files) to other formats." optional = false python-versions = ">=3.9" groups = ["dev"] files = [ - {file = "nbconvert-7.17.0-py3-none-any.whl", hash = "sha256:4f99a63b337b9a23504347afdab24a11faa7d86b405e5c8f9881cd313336d518"}, - {file = "nbconvert-7.17.0.tar.gz", hash = "sha256:1b2696f1b5be12309f6c7d707c24af604b87dfaf6d950794c7b07acab96dda78"}, + {file = "nbconvert-7.17.1-py3-none-any.whl", hash = "sha256:aa85c087b435e7bf1ffd03319f658e285f2b89eccab33bc1ba7025495ab3e7c8"}, + {file = "nbconvert-7.17.1.tar.gz", hash = "sha256:34d0d0a7e73ce3cbab6c5aae8f4f468797280b01fd8bd2ca746da8569eddd7d2"}, ] [package.dependencies] @@ -2088,14 +2655,14 @@ webpdf = ["playwright"] [[package]] name = "nbformat" -version = "5.10.4" +version = "5.11.0" description = "The Jupyter Notebook format" optional = false -python-versions = ">=3.8" +python-versions = ">=3.10" groups = ["dev"] files = [ - {file = "nbformat-5.10.4-py3-none-any.whl", hash = "sha256:3b48d6c8fbca4b299bf3982ea7db1af21580e4fec269ad087b9e81588891200b"}, - {file = "nbformat-5.10.4.tar.gz", hash = "sha256:322168b14f937a5d11362988ecac2a4952d3d8e3a2cbeb2319584631226d5b3a"}, + {file = "nbformat-5.11.0-py3-none-any.whl", hash = "sha256:f70a17f591a9ccd1c601d5e61a4b20972703926df0ba42458ce14bf575766bb6"}, + {file = "nbformat-5.11.0.tar.gz", hash = "sha256:7dbaed4a69cae28c2b4d44ab7430a6af4544fb89455023f6f21550be757b60c8"}, ] [package.dependencies] @@ -2105,8 +2672,8 @@ jupyter-core = ">=4.12,<5.0.dev0 || >=5.1.dev0" traitlets = ">=5.1" [package.extras] -docs = ["myst-parser", "pydata-sphinx-theme", "sphinx", "sphinxcontrib-github-alt", "sphinxcontrib-spelling"] -test = ["pep440", "pre-commit", "pytest", "testpath"] +docs = ["intersphinx-registry", "myst-parser", "pydata-sphinx-theme", "sphinx", "sphinxcontrib-github-alt", "sphinxcontrib-spelling"] +test = ["packaging", "pre-commit", "pytest", "testpath"] [[package]] name = "nest-asyncio" @@ -2120,21 +2687,167 @@ files = [ {file = "nest_asyncio-1.6.0.tar.gz", hash = "sha256:6f172d5449aca15afd6c646851f4e31e02c598d553a667e38cafa997cfec55fe"}, ] +[[package]] +name = "netcdf4" +version = "1.7.3" +description = "Provides an object-oriented python interface to the netCDF version 4 library" +optional = false +python-versions = ">=3.10" +groups = ["floris"] +markers = "python_version < \"3.11\" and platform_system == \"Windows\" and platform_machine == \"ARM64\"" +files = [ + {file = "netcdf4-1.7.3-cp310-cp310-macosx_13_0_x86_64.whl", hash = "sha256:db761afd3a6b9482df018c4783e0bdf99141a41db1f14c68c89986effb182d57"}, + {file = "netcdf4-1.7.3-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:ad4c2d9b469248d83cbacb70ad9e7d3a6c0ba27febe839c90192147199745ba4"}, + {file = "netcdf4-1.7.3-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c6986d039717582071e55ae9c6fbebfe4e5bbbc3af122fc3db0c0c09c4d8955e"}, + {file = "netcdf4-1.7.3-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:348e79b4f26f2e403fe3c54364e9297e4ef326c7ee12f9be01c037db853d26c0"}, + {file = "netcdf4-1.7.3-cp310-cp310-win_amd64.whl", hash = "sha256:6ab71f5d70e55e8584d168d5158efdb2fd8d350a033d0c27d942c3d399587f54"}, + {file = "netcdf4-1.7.3-cp311-abi3-macosx_13_0_x86_64.whl", hash = "sha256:801c222d8ad35fd7dc7e9aa7ea6373d184bcb3b8ee6b794c5fbecaa5155b1792"}, + {file = "netcdf4-1.7.3-cp311-abi3-macosx_14_0_arm64.whl", hash = "sha256:83dbfd6f10a0ec785d5296016bd821bbe9f0df780be72fc00a1f0d179d9c5f0f"}, + {file = "netcdf4-1.7.3-cp311-abi3-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:949e086d4d2612b49e5b95f60119d216c9ceb7b17bc771e9e0fa0e9b9c0a2f9f"}, + {file = "netcdf4-1.7.3-cp311-abi3-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0c764ba6f6a1421cab5496097e8a1c4d2e36be2a04880dfd288bb61b348c217e"}, + {file = "netcdf4-1.7.3-cp311-abi3-win_amd64.whl", hash = "sha256:1b6c646fa179fb1e5e8d6e8231bc78cc0311eceaa1241256b5a853f1d04055b9"}, + {file = "netcdf4-1.7.3.tar.gz", hash = "sha256:83f122fc3415e92b1d4904fd6a0898468b5404c09432c34beb6b16c533884673"}, +] + +[package.dependencies] +certifi = "*" +cftime = "*" +numpy = "*" + +[package.extras] +parallel = ["mpi4py"] +tests = ["Cython", "packaging", "pytest", "typing-extensions (>=4.15.0)"] + +[[package]] +name = "netcdf4" +version = "1.7.4" +description = "Provides an object-oriented python interface to the netCDF version 4 library" +optional = false +python-versions = ">=3.10" +groups = ["floris"] +markers = "platform_system != \"Windows\" or platform_machine != \"ARM64\" or python_version >= \"3.11\"" +files = [ + {file = "netcdf4-1.7.4-cp310-cp310-macosx_13_0_x86_64.whl", hash = "sha256:b1c1a7ea3678db76bf33d14f7e202385d634db38c5e70d8cf4895971023eebb9"}, + {file = "netcdf4-1.7.4-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:d3f9497873454207f9480847d02b1b19a4bc81ad6e9166e1c17d4e2f8f3555d1"}, + {file = "netcdf4-1.7.4-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c8e18294af803e80f8c0339f791901942e268c334c099bbd5f7ea8325a49801a"}, + {file = "netcdf4-1.7.4-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0b06c0b93fd0ecc1ec67a582f3ba98b7db9da1fa843c8f83fd75990e3701771e"}, + {file = "netcdf4-1.7.4-cp310-cp310-win_amd64.whl", hash = "sha256:889ba77f084504aebaba9c6f9a88ac213431fef0e897f887cd35aef351ff7740"}, + {file = "netcdf4-1.7.4-cp311-abi3-macosx_13_0_x86_64.whl", hash = "sha256:dec70e809cc65b04ebe95113ee9c85ba46a51c3a37c058d2b2b0cadc4d3052d8"}, + {file = "netcdf4-1.7.4-cp311-abi3-macosx_14_0_arm64.whl", hash = "sha256:75cf59100f0775bc4d6b9d4aca7cbabd12e2b8cf3b9a4fb16d810b92743a315a"}, + {file = "netcdf4-1.7.4-cp311-abi3-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ddfc7e9d261125c74708119440c85ea288b5fee41db676d2ba1ce9be11f96932"}, + {file = "netcdf4-1.7.4-cp311-abi3-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a72c9f58767779ec14cb7451c3b56bdd8fdc027a792fac2062b14e090c5617f3"}, + {file = "netcdf4-1.7.4-cp311-abi3-win_amd64.whl", hash = "sha256:9476e1f23161ae5159cd1548c50c8a37922e77d76583e247133f256ef7b825fc"}, + {file = "netcdf4-1.7.4-cp311-abi3-win_arm64.whl", hash = "sha256:876ad9d58f09c98741c066c726164c45a098a58fb90e5fac9e74de4bb8a793fd"}, + {file = "netcdf4-1.7.4-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:56688c03444fffe0d0c7512cb45245e650389cd841c955b30e4552fa681c4cd9"}, + {file = "netcdf4-1.7.4-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7ecf471ba8a6ddb2200121949bedfa0095db228822f38227d5da680694a38358"}, + {file = "netcdf4-1.7.4-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a5841de0735e8e4875b367c668e81d334287858d64dd9f3e3e2261e808c84922"}, + {file = "netcdf4-1.7.4-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:86fac03a8c5b250d57866e7d98918a64742e4b0de1681c5c86bac5726bab8aee"}, + {file = "netcdf4-1.7.4-cp314-cp314t-macosx_13_0_x86_64.whl", hash = "sha256:ad083d260301b5add74b1669c75ab0df03bdf986decfcc092cb45eec2615b5f1"}, + {file = "netcdf4-1.7.4-cp314-cp314t-macosx_14_0_arm64.whl", hash = "sha256:7f22014092cc9da3f056b0368e2e38c42afd5725c87ad4843eb2f467e16dd4f6"}, + {file = "netcdf4-1.7.4-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:224a15434c165a5e0225e5831f591edf62533044b1ce62fdfee815195bbd077d"}, + {file = "netcdf4-1.7.4-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:31a2318305de6831a18df25ad0df9f03b6d68666af0356d4f6057d66c02ffeb6"}, + {file = "netcdf4-1.7.4-cp314-cp314t-win_amd64.whl", hash = "sha256:6c4a0aa9446c3a616ef3be015b629dc6173643f8b09546de26a4e40e272cd1ed"}, + {file = "netcdf4-1.7.4-cp314-cp314t-win_arm64.whl", hash = "sha256:034220887d48da032cb2db5958f69759dbb04eb33e279ec6390571d4aea734fe"}, + {file = "netcdf4-1.7.4.tar.gz", hash = "sha256:cdbfdc92d6f4d7192ca8506c9b3d4c1d9892969ff28d8e8e1fc97ca08bf12164"}, +] + +[package.dependencies] +certifi = "*" +cftime = "*" +numpy = [ + {version = ">=1.21.2", markers = "platform_system != \"Windows\" or platform_machine != \"ARM64\""}, + {version = ">=2.3.0", markers = "platform_system == \"Windows\" and platform_machine == \"ARM64\""}, +] + +[package.extras] +parallel = ["mpi4py"] +tests = ["Cython", "packaging", "pytest", "typing-extensions (>=4.15.0)"] + +[[package]] +name = "networkx" +version = "3.4.2" +description = "Python package for creating and manipulating graphs and networks" +optional = false +python-versions = ">=3.10" +groups = ["floris"] +markers = "python_version < \"3.11\"" +files = [ + {file = "networkx-3.4.2-py3-none-any.whl", hash = "sha256:df5d4365b724cf81b8c6a7312509d0c22386097011ad1abe274afd5e9d3bbc5f"}, + {file = "networkx-3.4.2.tar.gz", hash = "sha256:307c3669428c5362aab27c8a1260aa8f47c4e91d3891f48be0141738d8d053e1"}, +] + +[package.extras] +default = ["matplotlib (>=3.7)", "numpy (>=1.24)", "pandas (>=2.0)", "scipy (>=1.10,!=1.11.0,!=1.11.1)"] +developer = ["changelist (==0.5)", "mypy (>=1.1)", "pre-commit (>=3.2)", "rtoml"] +doc = ["intersphinx-registry", "myst-nb (>=1.1)", "numpydoc (>=1.8.0)", "pillow (>=9.4)", "pydata-sphinx-theme (>=0.15)", "sphinx (>=7.3)", "sphinx-gallery (>=0.16)", "texext (>=0.6.7)"] +example = ["cairocffi (>=1.7)", "contextily (>=1.6)", "igraph (>=0.11)", "momepy (>=0.7.2)", "osmnx (>=1.9)", "scikit-learn (>=1.5)", "seaborn (>=0.13)"] +extra = ["lxml (>=4.6)", "pydot (>=3.0.1)", "pygraphviz (>=1.14)", "sympy (>=1.10)"] +test = ["pytest (>=7.2)", "pytest-cov (>=4.0)"] + +[[package]] +name = "networkx" +version = "3.6" +description = "Python package for creating and manipulating graphs and networks" +optional = false +python-versions = ">=3.11" +groups = ["floris"] +markers = "python_version == \"3.14\"" +files = [ + {file = "networkx-3.6-py3-none-any.whl", hash = "sha256:cdb395b105806062473d3be36458d8f1459a4e4b98e236a66c3a48996e07684f"}, + {file = "networkx-3.6.tar.gz", hash = "sha256:285276002ad1f7f7da0f7b42f004bcba70d381e936559166363707fdad3d72ad"}, +] + +[package.extras] +benchmarking = ["asv", "virtualenv"] +default = ["matplotlib (>=3.8)", "numpy (>=1.25)", "pandas (>=2.0)", "scipy (>=1.11.2)"] +developer = ["mypy (>=1.15)", "pre-commit (>=4.1)"] +doc = ["intersphinx-registry", "myst-nb (>=1.1)", "numpydoc (>=1.8.0)", "pillow (>=10)", "pydata-sphinx-theme (>=0.16)", "sphinx (>=8.0)", "sphinx-gallery (>=0.18)", "texext (>=0.6.7)"] +example = ["cairocffi (>=1.7)", "contextily (>=1.6)", "igraph (>=0.11)", "iplotx (>=0.9.0)", "momepy (>=0.7.2)", "osmnx (>=2.0.0)", "scikit-learn (>=1.5)", "seaborn (>=0.13)"] +extra = ["lxml (>=4.6)", "pydot (>=3.0.1)", "pygraphviz (>=1.14)", "sympy (>=1.10)"] +release = ["build (>=0.10)", "changelist (==0.5)", "twine (>=4.0)", "wheel (>=0.40)"] +test = ["pytest (>=7.2)", "pytest-cov (>=4.0)", "pytest-xdist (>=3.0)"] +test-extras = ["pytest-mpl", "pytest-randomly"] + +[[package]] +name = "networkx" +version = "3.6.1" +description = "Python package for creating and manipulating graphs and networks" +optional = false +python-versions = "!=3.14.1,>=3.11" +groups = ["floris"] +markers = "python_version < \"3.14\" and python_version >= \"3.11\"" +files = [ + {file = "networkx-3.6.1-py3-none-any.whl", hash = "sha256:d47fbf302e7d9cbbb9e2555a0d267983d2aa476bac30e90dfbe5669bd57f3762"}, + {file = "networkx-3.6.1.tar.gz", hash = "sha256:26b7c357accc0c8cde558ad486283728b65b6a95d85ee1cd66bafab4c8168509"}, +] + +[package.extras] +benchmarking = ["asv", "virtualenv"] +default = ["matplotlib (>=3.8)", "numpy (>=1.25)", "pandas (>=2.0)", "scipy (>=1.11.2)"] +developer = ["mypy (>=1.15)", "pre-commit (>=4.1)"] +doc = ["intersphinx-registry", "myst-nb (>=1.1)", "numpydoc (>=1.8.0)", "pillow (>=10)", "pydata-sphinx-theme (>=0.16)", "sphinx (>=8.0)", "sphinx-gallery (>=0.18)", "texext (>=0.6.7)"] +example = ["cairocffi (>=1.7)", "contextily (>=1.6)", "igraph (>=0.11)", "iplotx (>=0.9.0)", "momepy (>=0.7.2)", "osmnx (>=2.0.0)", "scikit-learn (>=1.5)", "seaborn (>=0.13)"] +extra = ["lxml (>=4.6)", "pydot (>=3.0.1)", "pygraphviz (>=1.14)", "sympy (>=1.10)"] +release = ["build (>=0.10)", "changelist (==0.5)", "twine (>=4.0)", "wheel (>=0.40)"] +test = ["pytest (>=7.2)", "pytest-cov (>=4.0)", "pytest-xdist (>=3.0)"] +test-extras = ["pytest-mpl", "pytest-randomly"] + [[package]] name = "notebook" -version = "7.5.4" +version = "7.6.2" description = "Jupyter Notebook - A web-based notebook environment for interactive computing" optional = false -python-versions = ">=3.9" +python-versions = ">=3.10" groups = ["dev"] files = [ - {file = "notebook-7.5.4-py3-none-any.whl", hash = "sha256:860e31782b3d3a25ca0819ff039f5cf77845d1bf30c78ef9528b88b25e0a9850"}, - {file = "notebook-7.5.4.tar.gz", hash = "sha256:b928b2ba22cb63aa83df2e0e76fe3697950a0c1c4a41b84ebccf1972b1bb5771"}, + {file = "notebook-7.6.2-py3-none-any.whl", hash = "sha256:5fe9e09c335cb4b7de21627b860f77210e70e54b1fb1276ad942a4a7e1d858d3"}, + {file = "notebook-7.6.2.tar.gz", hash = "sha256:cc02b5f0bb972160cccfe44ad8a1a202036206ba3439469c514f03aefa9ae807"}, ] [package.dependencies] -jupyter-server = ">=2.4.0,<3" -jupyterlab = ">=4.5.5,<4.6" +jupyter-builder = ">=1.0.2,<2" +jupyter-server = ">=2.19.0,<3" +jupyterlab = ">=4.6.3,<4.7" jupyterlab-server = ">=2.28.0,<3" notebook-shim = ">=0.2,<0.3" tornado = ">=6.2.0" @@ -2142,7 +2855,7 @@ tornado = ">=6.2.0" [package.extras] dev = ["hatch", "pre-commit"] docs = ["myst-parser", "nbsphinx", "pydata-sphinx-theme", "sphinx (>=1.3.6)", "sphinxcontrib-github-alt", "sphinxcontrib-spelling"] -test = ["importlib-resources (>=5.0) ; python_version < \"3.10\"", "ipykernel", "jupyter-server[test] (>=2.4.0,<3)", "jupyterlab-server[test] (>=2.28.0,<3)", "nbval", "pytest (>=7.0)", "pytest-console-scripts", "pytest-timeout", "pytest-tornasync", "requests"] +test = ["ipykernel", "jupyter-server[test] (>=2.19.0,<3)", "jupyterlab-server[test] (>=2.28.0,<3)", "nbval", "pytest (>=7.0)", "pytest-console-scripts", "pytest-timeout", "pytest-tornasync", "requests"] [[package]] name = "notebook-shim" @@ -2162,14 +2875,145 @@ jupyter-server = ">=1.8,<3" [package.extras] test = ["pytest", "pytest-console-scripts", "pytest-jupyter", "pytest-tornasync"] +[[package]] +name = "numexpr" +version = "2.14.1" +description = "Fast numerical expression evaluator for NumPy" +optional = false +python-versions = ">=3.10" +groups = ["floris"] +markers = "python_version < \"3.11\"" +files = [ + {file = "numexpr-2.14.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d0fab3fd06a04f6b86102552b26aa5d85e20ac7d8296c15764c726eeabae6cc8"}, + {file = "numexpr-2.14.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:64ae5dfd62d74a3ef82fe0b37f80527247f3626171ad82025900f46ffca4b39a"}, + {file = "numexpr-2.14.1-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:955c92b064f9074d2970cf3138f5e3b965be673b82024962ed526f39bc25a920"}, + {file = "numexpr-2.14.1-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:75440c54fc01e130396650fdf307aa9d41a67dc06ddbfb288971b591c13a395b"}, + {file = "numexpr-2.14.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:dde9fa47ed319e1e1728940a539df3cb78326b7754bc7c6ab3152afc91808f9b"}, + {file = "numexpr-2.14.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:76db0bc6267e591ab9c4df405ffb533598e4c88239db7338d11ae9e4b368a85a"}, + {file = "numexpr-2.14.1-cp310-cp310-win32.whl", hash = "sha256:0d1dcbdc4d0374c0d523cee2f94f06b001623cbc1fd163612841017a3495427c"}, + {file = "numexpr-2.14.1-cp310-cp310-win_amd64.whl", hash = "sha256:823cd82c8e7937981339f634e7a9c6a92cb2d0b9d0a5cf627a5e394fffc05377"}, + {file = "numexpr-2.14.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2d03fcb4644a12f70a14d74006f72662824da5b6128bf1bcd10cc3ed80e64c34"}, + {file = "numexpr-2.14.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2773ee1133f77009a1fc2f34fe236f3d9823779f5f75450e183137d49f00499f"}, + {file = "numexpr-2.14.1-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ebe4980f9494b9f94d10d2e526edc29e72516698d3bf95670ba79415492212a4"}, + {file = "numexpr-2.14.1-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2a381e5e919a745c9503bcefffc1c7f98c972c04ec58fc8e999ed1a929e01ba6"}, + {file = "numexpr-2.14.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d08856cfc1b440eb1caaa60515235369654321995dd68eb9377577392020f6cb"}, + {file = "numexpr-2.14.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:03130afa04edf83a7b590d207444f05a00363c9b9ea5d81c0f53b1ea13fad55a"}, + {file = "numexpr-2.14.1-cp311-cp311-win32.whl", hash = "sha256:db78fa0c9fcbaded3ae7453faf060bd7a18b0dc10299d7fcd02d9362be1213ed"}, + {file = "numexpr-2.14.1-cp311-cp311-win_amd64.whl", hash = "sha256:e9b2f957798c67a2428be96b04bce85439bed05efe78eb78e4c2ca43737578e7"}, + {file = "numexpr-2.14.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:91ebae0ab18c799b0e6b8c5a8d11e1fa3848eb4011271d99848b297468a39430"}, + {file = "numexpr-2.14.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:47041f2f7b9e69498fb311af672ba914a60e6e6d804011caacb17d66f639e659"}, + {file = "numexpr-2.14.1-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d686dfb2c1382d9e6e0ee0b7647f943c1886dba3adbf606c625479f35f1956c1"}, + {file = "numexpr-2.14.1-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:eee6d4fbbbc368e6cdd0772734d6249128d957b3b8ad47a100789009f4de7083"}, + {file = "numexpr-2.14.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:3a2839efa25f3c8d4133252ea7342d8f81226c7c4dda81f97a57e090b9d87a48"}, + {file = "numexpr-2.14.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:9f9137f1351b310436662b5dc6f4082a245efa8950c3b0d9008028df92fefb9b"}, + {file = "numexpr-2.14.1-cp312-cp312-win32.whl", hash = "sha256:36f8d5c1bd1355df93b43d766790f9046cccfc1e32b7c6163f75bcde682cda07"}, + {file = "numexpr-2.14.1-cp312-cp312-win_amd64.whl", hash = "sha256:fdd886f4b7dbaf167633ee396478f0d0aa58ea2f9e7ccc3c6431019623e8d68f"}, + {file = "numexpr-2.14.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:09078ba73cffe94745abfbcc2d81ab8b4b4e9d7bfbbde6cac2ee5dbf38eee222"}, + {file = "numexpr-2.14.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:dce0b5a0447baa7b44bc218ec2d7dcd175b8eee6083605293349c0c1d9b82fb6"}, + {file = "numexpr-2.14.1-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:06855053de7a3a8425429bd996e8ae3c50b57637ad3e757e0fa0602a7874be30"}, + {file = "numexpr-2.14.1-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:05f9366d23a2e991fd5a8b5e61a17558f028ba86158a4552f8f239b005cdf83c"}, + {file = "numexpr-2.14.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:c5f1b1605695778896534dfc6e130d54a65cd52be7ed2cd0cfee3981fd676bf5"}, + {file = "numexpr-2.14.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:a4ba71db47ea99c659d88ee6233fa77b6dc83392f1d324e0c90ddf617ae3f421"}, + {file = "numexpr-2.14.1-cp313-cp313-win32.whl", hash = "sha256:638dce8320f4a1483d5ca4fda69f60a70ed7e66be6e68bc23fb9f1a6b78a9e3b"}, + {file = "numexpr-2.14.1-cp313-cp313-win_amd64.whl", hash = "sha256:9fdcd4735121658a313f878fd31136d1bfc6a5b913219e7274e9fca9f8dac3bb"}, + {file = "numexpr-2.14.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:557887ad7f5d3c2a40fd7310e50597045a68e66b20a77b3f44d7bc7608523b4b"}, + {file = "numexpr-2.14.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:af111c8fe6fc55d15e4c7cab11920fc50740d913636d486545b080192cd0ad73"}, + {file = "numexpr-2.14.1-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:33265294376e7e2ae4d264d75b798a915d2acf37b9dd2b9405e8b04f84d05cfc"}, + {file = "numexpr-2.14.1-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:83647d846d3eeeb9a9255311236135286728b398d0d41d35dedb532dca807fe9"}, + {file = "numexpr-2.14.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:6e575fd3ad41ddf3355d0c7ef6bd0168619dc1779a98fe46693cad5e95d25e6e"}, + {file = "numexpr-2.14.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:67ea4771029ce818573b1998f5ca416bd255156feea017841b86176a938f7d19"}, + {file = "numexpr-2.14.1-cp313-cp313t-win32.whl", hash = "sha256:15015d47d3d1487072d58c0e7682ef2eb608321e14099c39d52e2dd689483611"}, + {file = "numexpr-2.14.1-cp313-cp313t-win_amd64.whl", hash = "sha256:94c711f6d8f17dfb4606842b403699603aa591ab9f6bf23038b488ea9cfb0f09"}, + {file = "numexpr-2.14.1-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:ede79f7ff06629f599081de644546ce7324f1581c09b0ac174da88a470d39c21"}, + {file = "numexpr-2.14.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:2eac7a5a2f70b3768c67056445d1ceb4ecd9b853c8eda9563823b551aeaa5082"}, + {file = "numexpr-2.14.1-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5aedf38d4c0c19d3cecfe0334c3f4099fb496f54c146223d30fa930084bc8574"}, + {file = "numexpr-2.14.1-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:439ec4d57b853792ebe5456e3160312281c3a7071ecac5532ded3278ede614de"}, + {file = "numexpr-2.14.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:e23b87f744e04e302d82ac5e2189ae20a533566aec76a46885376e20b0645bf8"}, + {file = "numexpr-2.14.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:44f84e0e5af219dbb62a081606156420815890e041b87252fbcea5df55214c4c"}, + {file = "numexpr-2.14.1-cp314-cp314-win32.whl", hash = "sha256:1f1a5e817c534539351aa75d26088e9e1e0ef1b3a6ab484047618a652ccc4fc3"}, + {file = "numexpr-2.14.1-cp314-cp314-win_amd64.whl", hash = "sha256:587c41509bc373dfb1fe6086ba55a73147297247bedb6d588cda69169fc412f2"}, + {file = "numexpr-2.14.1-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:ec368819502b64f190c3f71be14a304780b5935c42aae5bf22c27cc2cbba70b5"}, + {file = "numexpr-2.14.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:7e87f6d203ac57239de32261c941e9748f9309cbc0da6295eabd0c438b920d3a"}, + {file = "numexpr-2.14.1-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:dd72d8c2a165fe45ea7650b16eb8cc1792a94a722022006bb97c86fe51fd2091"}, + {file = "numexpr-2.14.1-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:70d80fcb418a54ca208e9a38e58ddc425c07f66485176b261d9a67c7f2864f73"}, + {file = "numexpr-2.14.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:edea2f20c2040df8b54ee8ca8ebda63de9545b2112872466118e9df4d0ae99f3"}, + {file = "numexpr-2.14.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:790447be6879a6c51b9545f79612d24c9ea0a41d537a84e15e6a8ddef0b6268e"}, + {file = "numexpr-2.14.1-cp314-cp314t-win32.whl", hash = "sha256:538961096c2300ea44240209181e31fae82759d26b51713b589332b9f2a4117e"}, + {file = "numexpr-2.14.1-cp314-cp314t-win_amd64.whl", hash = "sha256:a40b350cd45b4446076fa11843fa32bbe07024747aeddf6d467290bf9011b392"}, + {file = "numexpr-2.14.1.tar.gz", hash = "sha256:4be00b1086c7b7a5c32e31558122b7b80243fe098579b170967da83f3152b48b"}, +] + +[package.dependencies] +numpy = ">=1.23.0" + +[[package]] +name = "numexpr" +version = "2.14.2" +description = "Fast numerical expression evaluator for NumPy" +optional = false +python-versions = ">=3.11" +groups = ["floris"] +markers = "python_version >= \"3.11\"" +files = [ + {file = "numexpr-2.14.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2aa65ddc2243f19c6915f34ee0978b4a2df20f297230a793c4ee6d55f3472599"}, + {file = "numexpr-2.14.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:bf959e6df6cb603611c034b6cba7b03a361be0ad0b80b73f163fab95f5ccbb7f"}, + {file = "numexpr-2.14.2-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d534ecb456a4ae3995f99c8a5deb469bfff05d4ec610a7885c175c881d12f710"}, + {file = "numexpr-2.14.2-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f41170e9d0dbba76851e35d80cfa9f4ca5fe78628c5bf24d941cf3364940ab7a"}, + {file = "numexpr-2.14.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:6acafb2fdbeaaa6681a8f1a1d8b3f7dcd33704baace7057b950754b258be7c43"}, + {file = "numexpr-2.14.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:7ca9e71195b36cc7aeafe97347549e1e1c1e889ff700238782ef6447651ec26d"}, + {file = "numexpr-2.14.2-cp311-cp311-win32.whl", hash = "sha256:779129d50974e7d6d6581d322f75b8f8375e96215b6861a2d5460347997ef649"}, + {file = "numexpr-2.14.2-cp311-cp311-win_amd64.whl", hash = "sha256:2f132777d7d425471c458af5617e023402f13f5006301eacf8a1a6e7118ea70c"}, + {file = "numexpr-2.14.2-cp311-cp311-win_arm64.whl", hash = "sha256:f1de5c88515ed9fbcad42699a0e2b5821b4d0f0adb0da6fb7e009e5cb19d8493"}, + {file = "numexpr-2.14.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:606ceaf5722e295ef965ca591736fc26d9e5f13ad950a479e64cead1947f8a3d"}, + {file = "numexpr-2.14.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:790da022539fe7c37dc893acf530a91c2ca6964d7ba11f464131383729d058f3"}, + {file = "numexpr-2.14.2-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:327be9ee62251c173236dc620147ff2d0e732a32f5bad918d78a10082f502f63"}, + {file = "numexpr-2.14.2-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d6a5d8fc7016bf6f6e1808b011510aa7c3bd75ec1407f7650874ec591db59f5e"}, + {file = "numexpr-2.14.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:4b1ff261c3e69c4c59578d3a9ca6132603619d38ae1abe73325563bed3b9bbaf"}, + {file = "numexpr-2.14.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:8b8384592c49cb15a91caa54e2cd84d1ce18edb7af030bb76cd29b52e5dc155d"}, + {file = "numexpr-2.14.2-cp312-cp312-win32.whl", hash = "sha256:41cdeacf1b4e51c1143983ea61fcee68139ca47222b55a9265b4fa73826c4260"}, + {file = "numexpr-2.14.2-cp312-cp312-win_amd64.whl", hash = "sha256:8fc55d14bcf17b3fe69213bea14f999451892b4690717008c66f2edfd6a085ce"}, + {file = "numexpr-2.14.2-cp312-cp312-win_arm64.whl", hash = "sha256:806a4471310fe20aa7cb1b2816a6f5e508073a1ad1c2e18041b83e57066fad6a"}, + {file = "numexpr-2.14.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:0741efbd75c284e709b0fd430c85c31982b44c9962922ba8a9cbbea1bf413321"}, + {file = "numexpr-2.14.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:92b00c78664070e3af155c6be713a0a5d75d598647ce32a5609adb79a8f961d3"}, + {file = "numexpr-2.14.2-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:149ab5744a5222f07b1d60455c4021c754d395e44938944ac7c7c2495f7feb54"}, + {file = "numexpr-2.14.2-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fd2f5882a66a7792aa6614c68831aa20085b499d41422aedd001080624ebb14c"}, + {file = "numexpr-2.14.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:375d8bee15be42dab22100a0a3de05fe6689a2de853eca012858768a9a7e02ab"}, + {file = "numexpr-2.14.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:c1ffaf805d8636c3f95d0996517ecf9684c9ac62d768030ca78d1d00af2b3504"}, + {file = "numexpr-2.14.2-cp313-cp313-win32.whl", hash = "sha256:449a57fb9d38de136e742b1fc429572b42f29778f1d695c3fe50ffec9d3c9a71"}, + {file = "numexpr-2.14.2-cp313-cp313-win_amd64.whl", hash = "sha256:dd905922d7dce457947d54b84c7ac345cef37332b724445e159a5a1a2080ce2b"}, + {file = "numexpr-2.14.2-cp313-cp313-win_arm64.whl", hash = "sha256:b02738853b9b5b8a995f6c680f8f6ef33e8f419395b8fa380e38690495fdb911"}, + {file = "numexpr-2.14.2-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:76e87c7bd70d721ce4d418e81f4fb7ecf9e7e67d7cea8102527b07fd3d3facf9"}, + {file = "numexpr-2.14.2-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:939c89f613b814e64bb568859397dc9f99b219c3ef681a72fb99a86e435262f9"}, + {file = "numexpr-2.14.2-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b20c1c55aba7812ff2f2c6a50006425d02282fabb1eaf8d75fe638ffcf6deb02"}, + {file = "numexpr-2.14.2-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bac00898930f962f360c3d763a8e2273fc931f65a1759ff1bf64b3cf13d65aee"}, + {file = "numexpr-2.14.2-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:022e61a3d5dbf5807746264b62126d1c2c24057ad90052478a4d4482ab2555c2"}, + {file = "numexpr-2.14.2-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:1d4593e2c6fa060cd7441e8b6ef25c16321a6be2144b3c82d1e00885f1fb6e94"}, + {file = "numexpr-2.14.2-cp314-cp314-win32.whl", hash = "sha256:66f3b125b1104241322811de87918724d6709bf082dc0703722d0cecb7b29e82"}, + {file = "numexpr-2.14.2-cp314-cp314-win_amd64.whl", hash = "sha256:ef576a1cded27ba2f3129bc3c42df452a1c498072680d560793f98b0024cd7e6"}, + {file = "numexpr-2.14.2-cp314-cp314-win_arm64.whl", hash = "sha256:8274c51ae1842948f3ae7fe6951a23dcf4ddcbeeaff3737e978e7740b754662d"}, + {file = "numexpr-2.14.2-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:f3526699350f94c6277fb16863773a1af9defd95a6f78bbd69b1f0338fd94756"}, + {file = "numexpr-2.14.2-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:91e7928435f14fcb351c0157000bce65122b897cc8b0df6bcc48251f25850a6d"}, + {file = "numexpr-2.14.2-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c66925deb968f0b5280f723e2bb5918c11e6be2ca60e9e1530006286ab44031d"}, + {file = "numexpr-2.14.2-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a404c9a55902572eec810068d06b79a7c99e96f0400f5a7d73f39dff5ec5e371"}, + {file = "numexpr-2.14.2-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:44dc6b1dfa9abcbfc9917297f0d2af7c87c16b6ecd45747a8e70f54399a3a2f9"}, + {file = "numexpr-2.14.2-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:93233040f4bed3bce5abb0c2d20aeb1074511f29cbaa9c14828f86bcfa44d321"}, + {file = "numexpr-2.14.2-cp314-cp314t-win32.whl", hash = "sha256:2aceefa08f8f86317fa6e8fe9f6dc20d24ab8365d715be4a26306acf406d2dbe"}, + {file = "numexpr-2.14.2-cp314-cp314t-win_amd64.whl", hash = "sha256:cd684ac9daa539fcdac3437678834797b29d7780cfaad71111745132d466d51f"}, + {file = "numexpr-2.14.2-cp314-cp314t-win_arm64.whl", hash = "sha256:2ef72de3d3dd466cb0c435cae7141c99b0f8091b1eae9d03dcb38690f56c3f79"}, + {file = "numexpr-2.14.2.tar.gz", hash = "sha256:e7144e83ea9e581f2273e0304f15836736c4e470e2bd2e378ce617662a1ca278"}, +] + +[package.dependencies] +numpy = ">=1.26.0" + [[package]] name = "numpy" version = "2.2.6" description = "Fundamental package for array computing in Python" optional = false python-versions = ">=3.10" -groups = ["main", "examples"] -markers = "python_version < \"3.14\"" +groups = ["main", "examples", "floris"] +markers = "python_version < \"3.11\"" files = [ {file = "numpy-2.2.6-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b412caa66f72040e6d268491a59f2c43bf03eb6c96dd8f0307829feb7fa2b6fb"}, {file = "numpy-2.2.6-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8e41fd67c52b86603a91c1a505ebaef50b3314de0213461c7a6e99c9a3beff90"}, @@ -2230,95 +3074,286 @@ files = [ [[package]] name = "numpy" -version = "2.4.2" +version = "2.4.6" description = "Fundamental package for array computing in Python" optional = false python-versions = ">=3.11" -groups = ["main", "examples"] -markers = "python_version >= \"3.14\"" -files = [ - {file = "numpy-2.4.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:e7e88598032542bd49af7c4747541422884219056c268823ef6e5e89851c8825"}, - {file = "numpy-2.4.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7edc794af8b36ca37ef5fcb5e0d128c7e0595c7b96a2318d1badb6fcd8ee86b1"}, - {file = "numpy-2.4.2-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:6e9f61981ace1360e42737e2bae58b27bf28a1b27e781721047d84bd754d32e7"}, - {file = "numpy-2.4.2-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:cb7bbb88aa74908950d979eeaa24dbdf1a865e3c7e45ff0121d8f70387b55f73"}, - {file = "numpy-2.4.2-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4f069069931240b3fc703f1e23df63443dbd6390614c8c44a87d96cd0ec81eb1"}, - {file = "numpy-2.4.2-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c02ef4401a506fb60b411467ad501e1429a3487abca4664871d9ae0b46c8ba32"}, - {file = "numpy-2.4.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:2653de5c24910e49c2b106499803124dde62a5a1fe0eedeaecf4309a5f639390"}, - {file = "numpy-2.4.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:1ae241bbfc6ae276f94a170b14785e561cb5e7f626b6688cf076af4110887413"}, - {file = "numpy-2.4.2-cp311-cp311-win32.whl", hash = "sha256:df1b10187212b198dd45fa943d8985a3c8cf854aed4923796e0e019e113a1bda"}, - {file = "numpy-2.4.2-cp311-cp311-win_amd64.whl", hash = "sha256:b9c618d56a29c9cb1c4da979e9899be7578d2e0b3c24d52079c166324c9e8695"}, - {file = "numpy-2.4.2-cp311-cp311-win_arm64.whl", hash = "sha256:47c5a6ed21d9452b10227e5e8a0e1c22979811cad7dcc19d8e3e2fb8fa03f1a3"}, - {file = "numpy-2.4.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:21982668592194c609de53ba4933a7471880ccbaadcc52352694a59ecc860b3a"}, - {file = "numpy-2.4.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:40397bda92382fcec844066efb11f13e1c9a3e2a8e8f318fb72ed8b6db9f60f1"}, - {file = "numpy-2.4.2-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:b3a24467af63c67829bfaa61eecf18d5432d4f11992688537be59ecd6ad32f5e"}, - {file = "numpy-2.4.2-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:805cc8de9fd6e7a22da5aed858e0ab16be5a4db6c873dde1d7451c541553aa27"}, - {file = "numpy-2.4.2-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6d82351358ffbcdcd7b686b90742a9b86632d6c1c051016484fa0b326a0a1548"}, - {file = "numpy-2.4.2-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9e35d3e0144137d9fdae62912e869136164534d64a169f86438bc9561b6ad49f"}, - {file = "numpy-2.4.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:adb6ed2ad29b9e15321d167d152ee909ec73395901b70936f029c3bc6d7f4460"}, - {file = "numpy-2.4.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:8906e71fd8afcb76580404e2a950caef2685df3d2a57fe82a86ac8d33cc007ba"}, - {file = "numpy-2.4.2-cp312-cp312-win32.whl", hash = "sha256:ec055f6dae239a6299cace477b479cca2fc125c5675482daf1dd886933a1076f"}, - {file = "numpy-2.4.2-cp312-cp312-win_amd64.whl", hash = "sha256:209fae046e62d0ce6435fcfe3b1a10537e858249b3d9b05829e2a05218296a85"}, - {file = "numpy-2.4.2-cp312-cp312-win_arm64.whl", hash = "sha256:fbde1b0c6e81d56f5dccd95dd4a711d9b95df1ae4009a60887e56b27e8d903fa"}, - {file = "numpy-2.4.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:25f2059807faea4b077a2b6837391b5d830864b3543627f381821c646f31a63c"}, - {file = "numpy-2.4.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:bd3a7a9f5847d2fb8c2c6d1c862fa109c31a9abeca1a3c2bd5a64572955b2979"}, - {file = "numpy-2.4.2-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:8e4549f8a3c6d13d55041925e912bfd834285ef1dd64d6bc7d542583355e2e98"}, - {file = "numpy-2.4.2-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:aea4f66ff44dfddf8c2cffd66ba6538c5ec67d389285292fe428cb2c738c8aef"}, - {file = "numpy-2.4.2-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c3cd545784805de05aafe1dde61752ea49a359ccba9760c1e5d1c88a93bbf2b7"}, - {file = "numpy-2.4.2-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d0d9b7c93578baafcbc5f0b83eaf17b79d345c6f36917ba0c67f45226911d499"}, - {file = "numpy-2.4.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f74f0f7779cc7ae07d1810aab8ac6b1464c3eafb9e283a40da7309d5e6e48fbb"}, - {file = "numpy-2.4.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:c7ac672d699bf36275c035e16b65539931347d68b70667d28984c9fb34e07fa7"}, - {file = "numpy-2.4.2-cp313-cp313-win32.whl", hash = "sha256:8e9afaeb0beff068b4d9cd20d322ba0ee1cecfb0b08db145e4ab4dd44a6b5110"}, - {file = "numpy-2.4.2-cp313-cp313-win_amd64.whl", hash = "sha256:7df2de1e4fba69a51c06c28f5a3de36731eb9639feb8e1cf7e4a7b0daf4cf622"}, - {file = "numpy-2.4.2-cp313-cp313-win_arm64.whl", hash = "sha256:0fece1d1f0a89c16b03442eae5c56dc0be0c7883b5d388e0c03f53019a4bfd71"}, - {file = "numpy-2.4.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:5633c0da313330fd20c484c78cdd3f9b175b55e1a766c4a174230c6b70ad8262"}, - {file = "numpy-2.4.2-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:d9f64d786b3b1dd742c946c42d15b07497ed14af1a1f3ce840cce27daa0ce913"}, - {file = "numpy-2.4.2-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:b21041e8cb6a1eb5312dd1d2f80a94d91efffb7a06b70597d44f1bd2dfc315ab"}, - {file = "numpy-2.4.2-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:00ab83c56211a1d7c07c25e3217ea6695e50a3e2f255053686b081dc0b091a82"}, - {file = "numpy-2.4.2-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2fb882da679409066b4603579619341c6d6898fc83a8995199d5249f986e8e8f"}, - {file = "numpy-2.4.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:66cb9422236317f9d44b67b4d18f44efe6e9c7f8794ac0462978513359461554"}, - {file = "numpy-2.4.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:0f01dcf33e73d80bd8dc0f20a71303abbafa26a19e23f6b68d1aa9990af90257"}, - {file = "numpy-2.4.2-cp313-cp313t-win32.whl", hash = "sha256:52b913ec40ff7ae845687b0b34d8d93b60cb66dcee06996dd5c99f2fc9328657"}, - {file = "numpy-2.4.2-cp313-cp313t-win_amd64.whl", hash = "sha256:5eea80d908b2c1f91486eb95b3fb6fab187e569ec9752ab7d9333d2e66bf2d6b"}, - {file = "numpy-2.4.2-cp313-cp313t-win_arm64.whl", hash = "sha256:fd49860271d52127d61197bb50b64f58454e9f578cb4b2c001a6de8b1f50b0b1"}, - {file = "numpy-2.4.2-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:444be170853f1f9d528428eceb55f12918e4fda5d8805480f36a002f1415e09b"}, - {file = "numpy-2.4.2-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:d1240d50adff70c2a88217698ca844723068533f3f5c5fa6ee2e3220e3bdb000"}, - {file = "numpy-2.4.2-cp314-cp314-macosx_14_0_arm64.whl", hash = "sha256:7cdde6de52fb6664b00b056341265441192d1291c130e99183ec0d4b110ff8b1"}, - {file = "numpy-2.4.2-cp314-cp314-macosx_14_0_x86_64.whl", hash = "sha256:cda077c2e5b780200b6b3e09d0b42205a3d1c68f30c6dceb90401c13bff8fe74"}, - {file = "numpy-2.4.2-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d30291931c915b2ab5717c2974bb95ee891a1cf22ebc16a8006bd59cd210d40a"}, - {file = "numpy-2.4.2-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bba37bc29d4d85761deed3954a1bc62be7cf462b9510b51d367b769a8c8df325"}, - {file = "numpy-2.4.2-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:b2f0073ed0868db1dcd86e052d37279eef185b9c8db5bf61f30f46adac63c909"}, - {file = "numpy-2.4.2-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:7f54844851cdb630ceb623dcec4db3240d1ac13d4990532446761baede94996a"}, - {file = "numpy-2.4.2-cp314-cp314-win32.whl", hash = "sha256:12e26134a0331d8dbd9351620f037ec470b7c75929cb8a1537f6bfe411152a1a"}, - {file = "numpy-2.4.2-cp314-cp314-win_amd64.whl", hash = "sha256:068cdb2d0d644cdb45670810894f6a0600797a69c05f1ac478e8d31670b8ee75"}, - {file = "numpy-2.4.2-cp314-cp314-win_arm64.whl", hash = "sha256:6ed0be1ee58eef41231a5c943d7d1375f093142702d5723ca2eb07db9b934b05"}, - {file = "numpy-2.4.2-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:98f16a80e917003a12c0580f97b5f875853ebc33e2eaa4bccfc8201ac6869308"}, - {file = "numpy-2.4.2-cp314-cp314t-macosx_14_0_arm64.whl", hash = "sha256:20abd069b9cda45874498b245c8015b18ace6de8546bf50dfa8cea1696ed06ef"}, - {file = "numpy-2.4.2-cp314-cp314t-macosx_14_0_x86_64.whl", hash = "sha256:e98c97502435b53741540a5717a6749ac2ada901056c7db951d33e11c885cc7d"}, - {file = "numpy-2.4.2-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:da6cad4e82cb893db4b69105c604d805e0c3ce11501a55b5e9f9083b47d2ffe8"}, - {file = "numpy-2.4.2-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9e4424677ce4b47fe73c8b5556d876571f7c6945d264201180db2dc34f676ab5"}, - {file = "numpy-2.4.2-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:2b8f157c8a6f20eb657e240f8985cc135598b2b46985c5bccbde7616dc9c6b1e"}, - {file = "numpy-2.4.2-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:5daf6f3914a733336dab21a05cdec343144600e964d2fcdabaac0c0269874b2a"}, - {file = "numpy-2.4.2-cp314-cp314t-win32.whl", hash = "sha256:8c50dd1fc8826f5b26a5ee4d77ca55d88a895f4e4819c7ecc2a9f5905047a443"}, - {file = "numpy-2.4.2-cp314-cp314t-win_amd64.whl", hash = "sha256:fcf92bee92742edd401ba41135185866f7026c502617f422eb432cfeca4fe236"}, - {file = "numpy-2.4.2-cp314-cp314t-win_arm64.whl", hash = "sha256:1f92f53998a17265194018d1cc321b2e96e900ca52d54c7c77837b71b9465181"}, - {file = "numpy-2.4.2-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:89f7268c009bc492f506abd6f5265defa7cb3f7487dc21d357c3d290add45082"}, - {file = "numpy-2.4.2-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:e6dee3bb76aa4009d5a912180bf5b2de012532998d094acee25d9cb8dee3e44a"}, - {file = "numpy-2.4.2-pp311-pypy311_pp73-macosx_14_0_arm64.whl", hash = "sha256:cd2bd2bbed13e213d6b55dc1d035a4f91748a7d3edc9480c13898b0353708920"}, - {file = "numpy-2.4.2-pp311-pypy311_pp73-macosx_14_0_x86_64.whl", hash = "sha256:cf28c0c1d4c4bf00f509fa7eb02c58d7caf221b50b467bcb0d9bbf1584d5c821"}, - {file = "numpy-2.4.2-pp311-pypy311_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e04ae107ac591763a47398bb45b568fc38f02dbc4aa44c063f67a131f99346cb"}, - {file = "numpy-2.4.2-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:602f65afdef699cda27ec0b9224ae5dc43e328f4c24c689deaf77133dbee74d0"}, - {file = "numpy-2.4.2-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:be71bf1edb48ebbbf7f6337b5bfd2f895d1902f6335a5830b20141fc126ffba0"}, - {file = "numpy-2.4.2.tar.gz", hash = "sha256:659a6107e31a83c4e33f763942275fd278b21d095094044eb35569e86a21ddae"}, +groups = ["main", "examples", "floris"] +markers = "python_version == \"3.11\"" +files = [ + {file = "numpy-2.4.6-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0280e0356c0829a18d9de1cb7eee50ec22ca639878d7240307ca0943d73cd2c4"}, + {file = "numpy-2.4.6-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:110f8b71aacb688ec69062bb7f6938a0f8acb01b7c1c4beb453c65b6d234584d"}, + {file = "numpy-2.4.6-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:4cfe66903cc32a9921a6733d96b19bb6abf310397581bbad89c228f5abaf0ee8"}, + {file = "numpy-2.4.6-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:8155154c7c691289fe18f510b5d4657c68c67989f293f0535a91360392ff6538"}, + {file = "numpy-2.4.6-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0ab0a9c4ffb1a6d95ef519fe4247dba8eb6b18ad93999f76b7f657039acabd47"}, + {file = "numpy-2.4.6-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:89cd468399cfd2504718f0ba50e410dca55a170b61a02ad92bb18c8a65186e93"}, + {file = "numpy-2.4.6-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:c2d37ab77531417474168eb79d6d80b14f821a966818505d03013d0833edb7a8"}, + {file = "numpy-2.4.6-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f407cb6b8e9d6d8c626bc73c945db1706035af8fd632295547bf1c9e46d092d6"}, + {file = "numpy-2.4.6-cp311-cp311-win32.whl", hash = "sha256:ddea102b48f9e339f3948bf22040944184627a30fdf7f858667673b9c5f033c8"}, + {file = "numpy-2.4.6-cp311-cp311-win_amd64.whl", hash = "sha256:1e254a00cdf42b1e4d5b3d68d33af63268d41340d8885df2ab6470f2e1500147"}, + {file = "numpy-2.4.6-cp311-cp311-win_arm64.whl", hash = "sha256:ed9749eef4cbd126da3dc1d6bcb3a57f5eb7ac6a6484146bdbf743f552dfc577"}, + {file = "numpy-2.4.6-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:001fbb8e08d942dd57599e781f2472269ee7f2755fae407b4f67b2f0b17da3f1"}, + {file = "numpy-2.4.6-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ebfb099f8dcf083deef3ac1ca4c1503f387cf76296fcb3816b66f5ecb5f54fdb"}, + {file = "numpy-2.4.6-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:3213d622a0283a39a93d188f3cf72b26862df52fbb4ca3697f51705016523d41"}, + {file = "numpy-2.4.6-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:357cc07a6d7b0b182ff02249616a03742827ebb1277546b5c7cd7f7620a45698"}, + {file = "numpy-2.4.6-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5f9fb9157b4ce2971008323afe46053787b526ef624fea915b261468a8421a0f"}, + {file = "numpy-2.4.6-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:90f9849678c75fe7afa2d348ac842c168b0a4d3d61919687216dfc547976d853"}, + {file = "numpy-2.4.6-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:c1a2af6c6ef86344a6b0db6b97834208bf598db514f2b155042439b62605601a"}, + {file = "numpy-2.4.6-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e5805d5a22fd19c8ccff10a9561f9df94436b0545619ea579db2d3c35294bce2"}, + {file = "numpy-2.4.6-cp312-cp312-win32.whl", hash = "sha256:e3eeb0aabd6bd5ce64faae67e9935203a6991b4bc2a485a767fbafb2c5125f45"}, + {file = "numpy-2.4.6-cp312-cp312-win_amd64.whl", hash = "sha256:d8e8286dd7cea7895157318d1b91cdacac64c479f3cbc8dce548331728484751"}, + {file = "numpy-2.4.6-cp312-cp312-win_arm64.whl", hash = "sha256:4081eb135ac24158bd51cdfbef16f1c64df7063b1143f24731387137c092bec8"}, + {file = "numpy-2.4.6-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:511dbaf848decaaaf4b4ca48032619fb3138710c4bf7da7617765edad1ef96b0"}, + {file = "numpy-2.4.6-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:bf162abab1c1a736333192707cef898e735a5ca00f38f27eeedf44b39d9e85eb"}, + {file = "numpy-2.4.6-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:043191bfa8eab18c776647b62723ac9dddece59743b13f49b2016094129c2b3f"}, + {file = "numpy-2.4.6-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:6180d8b35af935aed8ece3a85e0a43f87393ae0ac87c8d2c8bd2c993f7270ef3"}, + {file = "numpy-2.4.6-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:72fbe16c6fac95aedf5937fa873445cec2110be35d8a4e9433d7501fd98dae6b"}, + {file = "numpy-2.4.6-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a7830bab239b79cda9c08c2da014761cafb48da6150e1da17ac06283f43b6089"}, + {file = "numpy-2.4.6-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:ef4aea96ce4d3b074422cb4f2f64e216bf9e213004bb58ecfdf50ea02ea8eb9a"}, + {file = "numpy-2.4.6-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:dfa20cc6ca228e6b155b11da03825975ce66aea520985dbbddf0f2a5a495c605"}, + {file = "numpy-2.4.6-cp313-cp313-win32.whl", hash = "sha256:56b39e5e0622a09a25bf5baf62f4bcf0cb8a41ae6e2819cf49bbc5a74c083f91"}, + {file = "numpy-2.4.6-cp313-cp313-win_amd64.whl", hash = "sha256:c4fc99836233ea196540b17ab0983aff60ed07941751930f5f4d05bc3b3b7359"}, + {file = "numpy-2.4.6-cp313-cp313-win_arm64.whl", hash = "sha256:a7c711e21628b52034bb5ab8d1bce291f752fcc5e92accc615778acee1ff4778"}, + {file = "numpy-2.4.6-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:112b06a867b235ef466ed3508ddf0238050df9c727cafb5301ac385b899189a1"}, + {file = "numpy-2.4.6-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:eaf7fa2de5c0be8ae6ff8e9bea2ccd725e980541244521d8d4b5f3354a27babe"}, + {file = "numpy-2.4.6-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:7265a2f3d436e54ef9f2b52b5c937e6be778781bd97a590319d7348f1c1ca997"}, + {file = "numpy-2.4.6-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f74a575920ab21fe304421a3fc28793d82e299cae9eccb37084e9fc7f3617c20"}, + {file = "numpy-2.4.6-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ede83e07a75dd06bc501566c1eca2afc0d61677c1472ac9ad93fdee6e638a48d"}, + {file = "numpy-2.4.6-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:68bb27509ac1b9a3443094260f6326150663b06abe40b73a2f81160623da5b67"}, + {file = "numpy-2.4.6-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:a0df0043bdb289bde1f62da130d20df23d58b45429f752bc7a8fc5325a225ecd"}, + {file = "numpy-2.4.6-cp313-cp313t-win32.whl", hash = "sha256:29a287e0cf63ff528da061de6b9f64a4618da591ca1046aafc54062e40ca7eab"}, + {file = "numpy-2.4.6-cp313-cp313t-win_amd64.whl", hash = "sha256:25c692919ac5a01f170a3bfcd62d745b24fd095c353d50812637d6fcab442e75"}, + {file = "numpy-2.4.6-cp313-cp313t-win_arm64.whl", hash = "sha256:1e978ec1e8bd0e0e4de6bb75de9d30cbb74db6b6a2bb727618613703ca0167dd"}, + {file = "numpy-2.4.6-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:06ca2f61ec4385a07a6977c55ba998a4466c123642b4a32694d3128fce18c079"}, + {file = "numpy-2.4.6-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:38efbc8de75c7a0fc1ac190162d892787f3f47b57cc291231aafee36b80982b7"}, + {file = "numpy-2.4.6-cp314-cp314-macosx_14_0_arm64.whl", hash = "sha256:d581b735e177fdcdce6fed8e7e8880a3fb6ee4e3653a3ac6af01c6f4c03effc5"}, + {file = "numpy-2.4.6-cp314-cp314-macosx_14_0_x86_64.whl", hash = "sha256:0a041d3d761dc3c35cc56ce0351506a02bcbc25f7b169f652435141a17db9096"}, + {file = "numpy-2.4.6-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:40fdc1ae7125e518ea98e53e69a4ebc27e1fd50510c47b7ea130cf21e5e1d42b"}, + {file = "numpy-2.4.6-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a2c306dea656c12c68f51f4cea133cbe78ca7435eb28c735eac1d3ebe73be6e8"}, + {file = "numpy-2.4.6-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:33111801a01c12a8a1e3721f0a9232f8cfc8ae2c6b7098167e6f623c6073f402"}, + {file = "numpy-2.4.6-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:ae506e6902902557576a26ff33eda8695e7ecb3cb36c3b573a0765dee114ebdb"}, + {file = "numpy-2.4.6-cp314-cp314-win32.whl", hash = "sha256:aaf159caa35993cb1f56fb9b8e4610d35758e7ca005412eb1daa856a78c9c4b1"}, + {file = "numpy-2.4.6-cp314-cp314-win_amd64.whl", hash = "sha256:b507f5c4c1d508876d1819b6bf9a49d365b96320b5d4993426b33a23ca4b8261"}, + {file = "numpy-2.4.6-cp314-cp314-win_arm64.whl", hash = "sha256:6f41ae150c4e32db4f3310cdaf64b1593a03dbabe29eec77fc9b50fe64061df6"}, + {file = "numpy-2.4.6-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:ece3d2cfe132e7d51f44a832b303895e6f2d499c5e74dfbdb06ee246147a304a"}, + {file = "numpy-2.4.6-cp314-cp314t-macosx_14_0_arm64.whl", hash = "sha256:e3e5193ef5a3dc73bceee50f7fdc2c90dbb76c42df8d8fae3d1067a583df579e"}, + {file = "numpy-2.4.6-cp314-cp314t-macosx_14_0_x86_64.whl", hash = "sha256:17f9ade344e7d9b464a084d69bcf18fc691cb1db67c62ed80820bf4926d78f0e"}, + {file = "numpy-2.4.6-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9cd5ffd25db4e7ba6a375693b3fc0fc1791ec636c17db3720da19bde7180ec43"}, + {file = "numpy-2.4.6-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7d92c3819208a60205a12a245c91ad70cb0a85336659b19b834205573ac8456e"}, + {file = "numpy-2.4.6-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:e85b752a1e912b70eaad4fafbd4d1238007ab221de2009b9a2f5ae7461239895"}, + {file = "numpy-2.4.6-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:29cb7f67d10b479ff07c17d33e39f78c07f71c40ef30d63c153d340e96cd3fb4"}, + {file = "numpy-2.4.6-cp314-cp314t-win32.whl", hash = "sha256:260a5d70215b61ab4fadf5c7baacd64821842975eea312125ed3c39a6391b063"}, + {file = "numpy-2.4.6-cp314-cp314t-win_amd64.whl", hash = "sha256:81a1cca95ed5bb92aa8b10dd2cdc9a0d3853a50fad926c28b5d7e8ea54389627"}, + {file = "numpy-2.4.6-cp314-cp314t-win_arm64.whl", hash = "sha256:0c9136e14ed34a9e343a31c533d78a9813a69a3148332bce5e9821cb2f996e66"}, + {file = "numpy-2.4.6-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:55cced7c52e981362f708ad635198e97a752dfba412cc03c23bbf3bd8d5cd662"}, + {file = "numpy-2.4.6-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:d6da64deb6b8ed903e7560180a92f2d804ee1ba5eeb849ac2748b8c1aba1f6d7"}, + {file = "numpy-2.4.6-pp311-pypy311_pp73-macosx_14_0_arm64.whl", hash = "sha256:68a5124b13fa6cc2086764a20005d30bc0548146f7f5322f02fce212ca14317f"}, + {file = "numpy-2.4.6-pp311-pypy311_pp73-macosx_14_0_x86_64.whl", hash = "sha256:948424b06129ce883307e8cff868c31396d8dc7630a59c61d70d98dbe70f222c"}, + {file = "numpy-2.4.6-pp311-pypy311_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5dbbdb29840ca3d91ee0fece42fc29278886d908280bfec0a5846c6f901a3eb0"}, + {file = "numpy-2.4.6-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8ad03c0965fb3c692200e74d458ca28c1dbb4ce96f9a479a8aa041ad5fabca02"}, + {file = "numpy-2.4.6-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:2803abfebfc990042cd494d8ce2d5f82e9d847af6d35ec486923aa19dbad5e73"}, + {file = "numpy-2.4.6.tar.gz", hash = "sha256:f3a3570c4a2a16746ac2c31a7c7c7b0c186b95ce902e33db6f28094ed7387dda"}, ] [[package]] -name = "overrides" -version = "7.7.0" -description = "A decorator to automatically detect mismatch when overriding a method." +name = "numpy" +version = "2.5.2" +description = "Fundamental package for array computing in Python" +optional = false +python-versions = ">=3.12" +groups = ["main", "examples", "floris"] +markers = "python_version >= \"3.12\"" +files = [ + {file = "numpy-2.5.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:14e373cfc6387177e8409dac3c7159be8eb05cd77096cd7c950268b86f62831c"}, + {file = "numpy-2.5.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4bbd96c833ecc8cc069ce518078fc8c60cb9cbfb0fea5b7a803ad65035596d03"}, + {file = "numpy-2.5.2-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:6e8172ddfcf5cf74b811d372b570b83c60bd2de87a6fbfbebdadb4a9bd9c6cbb"}, + {file = "numpy-2.5.2-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:65f188481f1669e26f62b701e8205d19e460fa4a9b52a1414ba382330e4a3414"}, + {file = "numpy-2.5.2-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8ee9c4eeb8454b3660a8b53493563c3e121c2fc94fbd72b848ef814ed7b676a9"}, + {file = "numpy-2.5.2-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:3cdec01fa790a186d430433fdd4d4ffb70eed6f0eeb4bf05c8dbe2dce0a9bcb8"}, + {file = "numpy-2.5.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:7999d4ddb0c4025018373fd787510d46e04c769467af22869707b3c1cfd459ab"}, + {file = "numpy-2.5.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c1f017dc0875c9209d219f97feceb7d54c2661bb243deb4114478e1295808af7"}, + {file = "numpy-2.5.2-cp312-cp312-win32.whl", hash = "sha256:d6a48072864e3324e194a8fbb3c657bcc5b5c869dbc64c9537b1d5c862572c0a"}, + {file = "numpy-2.5.2-cp312-cp312-win_amd64.whl", hash = "sha256:28ac63476ec7651484215ee7fa15a1f78b57c14621f01e392afe17b9a1390ce4"}, + {file = "numpy-2.5.2-cp312-cp312-win_arm64.whl", hash = "sha256:27650bb0e7140fa3d37b9923b4803645e0b125d190f326eecfd3f4dad8e8ade1"}, + {file = "numpy-2.5.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:8e4cb9a754c8a0c62eaa88273a5fba3391f4a610d1dee893c0755da31c083f15"}, + {file = "numpy-2.5.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:52c808f96484f5571a5cc863775ce50247c17dfb3b0361f8ed6b4b0456f80080"}, + {file = "numpy-2.5.2-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:29d81e97f668489cba8ebfd796b9bdd453525d35dd9e162e2daec94bf3fc7740"}, + {file = "numpy-2.5.2-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:afb3f0632d6b2e3ba04dbce8d1e48d321b369138b73830b5ca371a0e8d479d56"}, + {file = "numpy-2.5.2-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0aadf13b60048d501e05fa699efaf7734e2494f3498a4c2a5521d822640324f3"}, + {file = "numpy-2.5.2-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:29b86ff8a6cc556b47ec6b64b194815cc80e6bf5eedcc6cddfd65318cb0b4eee"}, + {file = "numpy-2.5.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:6950c4b7dd562453090548ba7f5da7e59f57f85663f15d5dcc60e249192f7e59"}, + {file = "numpy-2.5.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:b9727f472d2f3888053b8a75ab0cb94745a9de224bb5846dbadc0092101bc71d"}, + {file = "numpy-2.5.2-cp313-cp313-win32.whl", hash = "sha256:4f9744f9fbdcea0bc552e8f19e1f141f811a3f9bc2be2cc6e86d982cab23e3f4"}, + {file = "numpy-2.5.2-cp313-cp313-win_amd64.whl", hash = "sha256:85aaccb24182c25df891ad0ec333585967e115269d5f1b17f2c9ae005bc96657"}, + {file = "numpy-2.5.2-cp313-cp313-win_arm64.whl", hash = "sha256:bd68ece1553d2023c09a4226d9e41c586ad2d20594d1a456186c33513d2cb3f2"}, + {file = "numpy-2.5.2-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:d787cf769c3baeb5f6235e778edb52c08dfa923789b5958f28e6450f96107cb1"}, + {file = "numpy-2.5.2-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:24b9dc2e3d84aa58523798805194e23e736f3f6ce2d1a5b92583ae734e6dbda8"}, + {file = "numpy-2.5.2-cp314-cp314-macosx_14_0_arm64.whl", hash = "sha256:9e9413326d726c2545bfa65d2c0876871e8d8386e77f992c1d426e180bbd4323"}, + {file = "numpy-2.5.2-cp314-cp314-macosx_14_0_x86_64.whl", hash = "sha256:60e902ac295855348a5ca2ea4c89108989a9f5fddfad3dfc0a8f36b10358567e"}, + {file = "numpy-2.5.2-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:50e500dc868e9313530ce12ba470fe50ff3afe3d62993ed6eff652dacd555b65"}, + {file = "numpy-2.5.2-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:318b9a4c845dbea06708a29c84ee429cc3065048db34cdb799047643492050ee"}, + {file = "numpy-2.5.2-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:34c319e2963be042673fb46570501b2f06c41924e17e3563d58646b4380dfb68"}, + {file = "numpy-2.5.2-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:f06571a052127dc1b4e8b83029b4d1b20daa2b64a31cdd181fc6bc774e9000eb"}, + {file = "numpy-2.5.2-cp314-cp314-win32.whl", hash = "sha256:2cc779226e476d1e1f08c74068c419e60f41a9e0e069c92f6671d31d5c985e98"}, + {file = "numpy-2.5.2-cp314-cp314-win_amd64.whl", hash = "sha256:7587f53dfbd5edc0f7b87c6217b4c6d2d1f2ef9c3da70bc1315e7db5f8d7ec9d"}, + {file = "numpy-2.5.2-cp314-cp314-win_arm64.whl", hash = "sha256:3e4c367352d3747784248a227fbec218e193b56f7e6692e3b64fc805478ecfdf"}, + {file = "numpy-2.5.2-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:b879fb674276e331513fb136b78dbc6bd3c848309e0d841cfd63be3896c4cfc1"}, + {file = "numpy-2.5.2-cp314-cp314t-macosx_14_0_arm64.whl", hash = "sha256:fd0d703772bba096843785bd38371e31bb4a0c1151497ad5739d182114a73f7f"}, + {file = "numpy-2.5.2-cp314-cp314t-macosx_14_0_x86_64.whl", hash = "sha256:3a2f061cebd9e3d23bdcfaaded5e2293a4c6a5b60fa42df85d410a725ce621bf"}, + {file = "numpy-2.5.2-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6df895598c0edcb41030126c89e0f353b07d93238116143b7405e937359736c4"}, + {file = "numpy-2.5.2-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1ab3d4a901f844ea836c3e80bf463c6a27d7f3c14e8e292fcf28d348b25b9bce"}, + {file = "numpy-2.5.2-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:cebc2d6dbb605a7703d59751dea4bd6b0ab127a5a4338a6f432df1936fef8b26"}, + {file = "numpy-2.5.2-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:eaca7ff36f0f52e2111ec71f169d8fd3e889e7ddc0d2592e0d703fd8d3ce8fac"}, + {file = "numpy-2.5.2-cp314-cp314t-win32.whl", hash = "sha256:ddf47472af2e4280d79bac82304f5e80150211f1b9e614b760061d5fdfbb6eba"}, + {file = "numpy-2.5.2-cp314-cp314t-win_amd64.whl", hash = "sha256:44ef9675d908e65f9953063837c3277730f3f4437615a4cdab67b366cabaf884"}, + {file = "numpy-2.5.2-cp314-cp314t-win_arm64.whl", hash = "sha256:eaa088384c46f519dacb93b7ec483a6d6b19a4a2085ae4f25ab9b1c43d387d1e"}, + {file = "numpy-2.5.2-cp315-cp315-macosx_10_15_x86_64.whl", hash = "sha256:078f9b027b478c9379b9677babbf0f8b8f1ecfada27636d7b9a93990c638739f"}, + {file = "numpy-2.5.2-cp315-cp315-macosx_11_0_arm64.whl", hash = "sha256:50a68f4bacd8a2b33d8da3d2269d0d78500f86ea582e4786dc10f5ef2c2c6842"}, + {file = "numpy-2.5.2-cp315-cp315-macosx_14_0_arm64.whl", hash = "sha256:e79aba74ffaf5f78a050d777c184cddf8fdffabab38acf5f3ef1fecbc17895d6"}, + {file = "numpy-2.5.2-cp315-cp315-macosx_14_0_x86_64.whl", hash = "sha256:9a0731745a72a184490a582fb4af2533512bd071ace67785b5fdffc0ae58dce8"}, + {file = "numpy-2.5.2-cp315-cp315-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4ec954036759bcee3aa484f8603bd9c14f3e776293b85578b8734c2d72777c69"}, + {file = "numpy-2.5.2-cp315-cp315-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:dc649493697006bc90614a5f0bbc8cb3cb1866715c474e473694968d7e6b99ab"}, + {file = "numpy-2.5.2-cp315-cp315-musllinux_1_2_aarch64.whl", hash = "sha256:cf7de32f486e4ac9e2d93b810f9e9ac72a728dd46a32a0bb403222f27f653514"}, + {file = "numpy-2.5.2-cp315-cp315-musllinux_1_2_x86_64.whl", hash = "sha256:2ffa7bacab3e2ee1b19ed31766bb60bb380b68c23f051e199c5cc598afd68710"}, + {file = "numpy-2.5.2-cp315-cp315-win32.whl", hash = "sha256:6b588cc8f902d6bff201c19fd00c43ab8545671e3554d014e12e14139e5e8617"}, + {file = "numpy-2.5.2-cp315-cp315-win_amd64.whl", hash = "sha256:07d4e89f3a9ab0a9ba24264ccdb642b3dd951b2281e8883a5481a4aa79cc31a7"}, + {file = "numpy-2.5.2-cp315-cp315-win_arm64.whl", hash = "sha256:a610dc7e3c52edd39c2bc2375ff9c3fd59cb3ad00e4472d36f83bc1457145788"}, + {file = "numpy-2.5.2-cp315-cp315t-macosx_10_15_x86_64.whl", hash = "sha256:40f4d451aed46a8046a1aae41c4e55fb3612273df9c502480135e1501576a34b"}, + {file = "numpy-2.5.2-cp315-cp315t-macosx_11_0_arm64.whl", hash = "sha256:c081cbe16ba1ab53078e5ff29013621e33c509eedab055775d956427712c236e"}, + {file = "numpy-2.5.2-cp315-cp315t-macosx_14_0_arm64.whl", hash = "sha256:0090ccdd57ec2703e9b49d0bf554767370581c1dd0a6b2bb2b2d9def317d042a"}, + {file = "numpy-2.5.2-cp315-cp315t-macosx_14_0_x86_64.whl", hash = "sha256:6a9bb119fb8dd21ba30b3f0e555b7e2b081bd9883af21ec9c1c633d161cda3a8"}, + {file = "numpy-2.5.2-cp315-cp315t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a839318485284a6fb31be4f8f2c91c8f2cb22f4543c4a8903f12b0671ffe07cc"}, + {file = "numpy-2.5.2-cp315-cp315t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ba0a474801b8dc67b66bf465548abc90e82b44d2611b5770f33008dcabffe8ec"}, + {file = "numpy-2.5.2-cp315-cp315t-musllinux_1_2_aarch64.whl", hash = "sha256:0a4035ae1129ff8777f08bfbd44f1e5d8e9c049ce0c2dd78fc0d92c13e7251c0"}, + {file = "numpy-2.5.2-cp315-cp315t-musllinux_1_2_x86_64.whl", hash = "sha256:77843ca236b777e67f8d6b3660ea116e499612703a0ecd7093f316201eb9d8e2"}, + {file = "numpy-2.5.2-cp315-cp315t-win32.whl", hash = "sha256:7354826bc6f8f69402e9b7fe28d15fcd34feebd74f856f111585c5b0c9fb0251"}, + {file = "numpy-2.5.2-cp315-cp315t-win_amd64.whl", hash = "sha256:e5651f3f87add730ee6608d915009e19c911fba0cb000c7e3ea994b7d768eb12"}, + {file = "numpy-2.5.2-cp315-cp315t-win_arm64.whl", hash = "sha256:5f8e00be2ec6f45f4e8a41a527f68d44a7d96fee92a650e4d8b1326f77f61e6e"}, + {file = "numpy-2.5.2.tar.gz", hash = "sha256:d482d171c406ae88c5b19cad3b6a1c4c5209f886ab74bc44c2c865c23f52d860"}, +] + +[[package]] +name = "openfast-io" +version = "5.0.0" +description = "Readers and writers for OpenFAST files." +optional = false +python-versions = ">3.10" +groups = ["floris"] +files = [ + {file = "openfast_io-5.0.0-py3-none-any.whl", hash = "sha256:3558880af3af7d319e1644c3063eb44f067bd50db727b68dfc4578250deda093"}, + {file = "openfast_io-5.0.0.tar.gz", hash = "sha256:5b683f2f381eee506d1a6ce90e3324273c027dea831b9dd969edc6254ce61241"}, +] + +[package.dependencies] +deepdiff = ">8.0" +numpy = ">1.0" +pandas = ">2.0" +ruamel-yaml = ">0.18" + +[package.extras] +all = ["rosco (>2.9.2)", "xlrd (>2.0)"] +rosco = ["rosco (>2.9.2)"] +xlrd = ["xlrd (>2.0)"] + +[[package]] +name = "openmdao" +version = "3.45.0" +description = "OpenMDAO framework infrastructure" +optional = false +python-versions = ">=3.10" +groups = ["floris"] +files = [ + {file = "openmdao-3.45.0-py3-none-any.whl", hash = "sha256:ef01406fc29e763b69b979ffe7a3652351de5a68653da478cd4bbe02e2318f90"}, + {file = "openmdao-3.45.0.tar.gz", hash = "sha256:2e342398386230706999433a0eafc3df566e71f89709479323c3f00ab1b69e54"}, +] + +[package.dependencies] +networkx = ">=3.3" +numpy = ">=2.0,<2.4.0 || >2.4.0" +packaging = "*" +requests = "*" +scipy = ">=1.13" + +[package.extras] +all = ["aiounittest", "bokeh (>=3.4.0)", "colorama", "coverage (>=7.6.0)", "idna (>=3.7)", "ipympl", "ipyparallel", "jax (>=0.4.0)", "jaxlib (>=0.4.0)", "jinja2 (>=3.1.4)", "jupyter-book (>=1.0.3,<2)", "matplotlib", "notebook", "num2words", "numpydoc (>=1.1)", "panel", "parameterized", "playwright (>=1.20)", "pre-commit", "pycodestyle (>=2.4.0)", "pydata-sphinx-theme (>=0.15.0,<0.16.0)", "pydocstyle (>=2.0.0)", "pydoe3", "rich", "sphinx-sitemap", "testflo (>=1.3.6)", "tqdm (>=4.66.3)", "websockets (>8)"] +docs = ["idna (>=3.7)", "ipyparallel", "jinja2 (>=3.1.4)", "jupyter-book (>=1.0.3,<2)", "matplotlib", "numpydoc (>=1.1)", "pydata-sphinx-theme (>=0.15.0,<0.16.0)", "sphinx-sitemap", "tqdm (>=4.66.3)"] +doe = ["pydoe3"] +jax = ["jax (>=0.4.0)", "jaxlib (>=0.4.0)"] +julia = ["omjlcomps (>=0.2.6)"] +notebooks = ["idna (>=3.7)", "ipympl", "notebook"] +numba = ["numba"] +test = ["aiounittest", "coverage (>=7.6.0)", "num2words", "numpydoc (>=1.1)", "parameterized", "playwright (>=1.20)", "pre-commit", "pycodestyle (>=2.4.0)", "pydocstyle (>=2.0.0)", "testflo (>=1.3.6)", "websockets (>8)"] +visualization = ["bokeh (>=3.4.0)", "colorama", "matplotlib", "panel", "rich"] + +[[package]] +name = "openpyxl" +version = "3.1.5" +description = "A Python library to read/write Excel 2010 xlsx/xlsm files" +optional = false +python-versions = ">=3.8" +groups = ["floris"] +files = [ + {file = "openpyxl-3.1.5-py2.py3-none-any.whl", hash = "sha256:5282c12b107bffeef825f4617dc029afaf41d0ea60823bbb665ef3079dc79de2"}, + {file = "openpyxl-3.1.5.tar.gz", hash = "sha256:cf0e3cf56142039133628b5acffe8ef0c12bc902d2aadd3e0fe5878dc08d1050"}, +] + +[package.dependencies] +et-xmlfile = "*" + +[[package]] +name = "orbit-nrel" +version = "1.3" +description = "Offshore Renewables Balance of system and Installation Tool" +optional = false +python-versions = ">3.9" +groups = ["floris"] +files = [ + {file = "orbit_nrel-1.3-py3-none-any.whl", hash = "sha256:011925d18deb982f8265f35c4af30047807f5a08dc0b0fcb5f594b4eab15c8a2"}, + {file = "orbit_nrel-1.3.tar.gz", hash = "sha256:3cf16a4f4dec822c85b04743ca1ab6eebb830e47d2205b7cdcf95cb7ccc05537"}, +] + +[package.dependencies] +marmot-agents = ">=0.2.5" +matplotlib = "*" +numpy = "*" +pandas = "*" +python-benedict = "*" +pyyaml = "*" +scipy = "*" +simpy = "*" +statsmodels = "*" + +[package.extras] +dev = ["black", "isort", "pre-commit", "pytest (>=9)", "pytest-cov", "ruff"] +docs = ["jupyter-book (>=1,<2)", "linkify-it-py (>=2)", "myst-nb (>=0.16)", "myst-parser (>=0.17)", "nbformat (>=5.0.0)", "sphinx-autodoc-typehints", "sphinxcontrib-autoyaml", "sphinxcontrib-bibtex (>=2.4)", "sphinxcontrib-spelling (>=7)"] + +[[package]] +name = "orderly-set" +version = "5.5.0" +description = "Orderly set" +optional = false +python-versions = ">=3.8" +groups = ["floris"] +files = [ + {file = "orderly_set-5.5.0-py3-none-any.whl", hash = "sha256:46f0b801948e98f427b412fcabb831677194c05c3b699b80de260374baa0b1e7"}, + {file = "orderly_set-5.5.0.tar.gz", hash = "sha256:e87185c8e4d8afa64e7f8160ee2c542a475b738bc891dc3f58102e654125e6ce"}, +] + +[package.extras] +coverage = ["coverage (>=7.6.0,<7.7.0)"] +dev = ["bump2version (>=1.0.0,<1.1.0)", "ipdb (>=0.13.0,<0.14.0)"] +optimize = ["orjson"] +static = ["flake8 (>=7.1.0,<7.2.0)", "flake8-pyproject (>=1.2.3,<1.3.0)"] +test = ["pytest (>=8.3.0,<8.4.0)", "pytest-benchmark (>=5.1.0,<5.2.0)", "pytest-cov (>=6.0.0,<6.1.0)", "python-dotenv (>=1.0.0,<1.1.0)"] + +[[package]] +name = "overrides" +version = "7.7.0" +description = "A decorator to automatically detect mismatch when overriding a method." optional = false python-versions = ">=3.6" groups = ["dev"] -markers = "python_version < \"3.12\"" +markers = "python_version <= \"3.11\"" files = [ {file = "overrides-7.7.0-py3-none-any.whl", hash = "sha256:c7ed9d062f78b8e4c1a7b70bd8796b35ead4d9f510227ef9c5dc7626c60d7e49"}, {file = "overrides-7.7.0.tar.gz", hash = "sha256:55158fa3d93b98cc75299b1e67078ad9003ca27945c76162c1c0766d6f91820a"}, @@ -2326,16 +3361,200 @@ files = [ [[package]] name = "packaging" -version = "26.0" +version = "26.3" description = "Core utilities for Python packages" optional = false -python-versions = ">=3.8" -groups = ["dev", "examples"] +python-versions = ">=3.9" +groups = ["dev", "examples", "floris"] files = [ - {file = "packaging-26.0-py3-none-any.whl", hash = "sha256:b36f1fef9334a5588b4166f8bcd26a14e521f2b55e6b9de3aaa80d3ff7a37529"}, - {file = "packaging-26.0.tar.gz", hash = "sha256:00243ae351a257117b6a241061796684b084ed1c516a08c48a3f7e147a9d80b4"}, + {file = "packaging-26.3-py3-none-any.whl", hash = "sha256:d7193f7c8e4e93f444fde0262bf90af30e16fa0ad0ad44cb553c87339b23cd1c"}, + {file = "packaging-26.3.tar.gz", hash = "sha256:94edc256424af38762eb31306eed28beb9f0efc50a8837492c9d6fd6004aed79"}, ] +[[package]] +name = "pandas" +version = "2.3.3" +description = "Powerful data structures for data analysis, time series, and statistics" +optional = false +python-versions = ">=3.9" +groups = ["floris"] +markers = "python_version < \"3.11\"" +files = [ + {file = "pandas-2.3.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:376c6446ae31770764215a6c937f72d917f214b43560603cd60da6408f183b6c"}, + {file = "pandas-2.3.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e19d192383eab2f4ceb30b412b22ea30690c9e618f78870357ae1d682912015a"}, + {file = "pandas-2.3.3-cp310-cp310-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5caf26f64126b6c7aec964f74266f435afef1c1b13da3b0636c7518a1fa3e2b1"}, + {file = "pandas-2.3.3-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:dd7478f1463441ae4ca7308a70e90b33470fa593429f9d4c578dd00d1fa78838"}, + {file = "pandas-2.3.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:4793891684806ae50d1288c9bae9330293ab4e083ccd1c5e383c34549c6e4250"}, + {file = "pandas-2.3.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:28083c648d9a99a5dd035ec125d42439c6c1c525098c58af0fc38dd1a7a1b3d4"}, + {file = "pandas-2.3.3-cp310-cp310-win_amd64.whl", hash = "sha256:503cf027cf9940d2ceaa1a93cfb5f8c8c7e6e90720a2850378f0b3f3b1e06826"}, + {file = "pandas-2.3.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:602b8615ebcc4a0c1751e71840428ddebeb142ec02c786e8ad6b1ce3c8dec523"}, + {file = "pandas-2.3.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8fe25fc7b623b0ef6b5009149627e34d2a4657e880948ec3c840e9402e5c1b45"}, + {file = "pandas-2.3.3-cp311-cp311-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b468d3dad6ff947df92dcb32ede5b7bd41a9b3cceef0a30ed925f6d01fb8fa66"}, + {file = "pandas-2.3.3-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b98560e98cb334799c0b07ca7967ac361a47326e9b4e5a7dfb5ab2b1c9d35a1b"}, + {file = "pandas-2.3.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1d37b5848ba49824e5c30bedb9c830ab9b7751fd049bc7914533e01c65f79791"}, + {file = "pandas-2.3.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:db4301b2d1f926ae677a751eb2bd0e8c5f5319c9cb3f88b0becbbb0b07b34151"}, + {file = "pandas-2.3.3-cp311-cp311-win_amd64.whl", hash = "sha256:f086f6fe114e19d92014a1966f43a3e62285109afe874f067f5abbdcbb10e59c"}, + {file = "pandas-2.3.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:6d21f6d74eb1725c2efaa71a2bfc661a0689579b58e9c0ca58a739ff0b002b53"}, + {file = "pandas-2.3.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:3fd2f887589c7aa868e02632612ba39acb0b8948faf5cc58f0850e165bd46f35"}, + {file = "pandas-2.3.3-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ecaf1e12bdc03c86ad4a7ea848d66c685cb6851d807a26aa245ca3d2017a1908"}, + {file = "pandas-2.3.3-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b3d11d2fda7eb164ef27ffc14b4fcab16a80e1ce67e9f57e19ec0afaf715ba89"}, + {file = "pandas-2.3.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:a68e15f780eddf2b07d242e17a04aa187a7ee12b40b930bfdd78070556550e98"}, + {file = "pandas-2.3.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:371a4ab48e950033bcf52b6527eccb564f52dc826c02afd9a1bc0ab731bba084"}, + {file = "pandas-2.3.3-cp312-cp312-win_amd64.whl", hash = "sha256:a16dcec078a01eeef8ee61bf64074b4e524a2a3f4b3be9326420cabe59c4778b"}, + {file = "pandas-2.3.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:56851a737e3470de7fa88e6131f41281ed440d29a9268dcbf0002da5ac366713"}, + {file = "pandas-2.3.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:bdcd9d1167f4885211e401b3036c0c8d9e274eee67ea8d0758a256d60704cfe8"}, + {file = "pandas-2.3.3-cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e32e7cc9af0f1cc15548288a51a3b681cc2a219faa838e995f7dc53dbab1062d"}, + {file = "pandas-2.3.3-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:318d77e0e42a628c04dc56bcef4b40de67918f7041c2b061af1da41dcff670ac"}, + {file = "pandas-2.3.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:4e0a175408804d566144e170d0476b15d78458795bb18f1304fb94160cabf40c"}, + {file = "pandas-2.3.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:93c2d9ab0fc11822b5eece72ec9587e172f63cff87c00b062f6e37448ced4493"}, + {file = "pandas-2.3.3-cp313-cp313-win_amd64.whl", hash = "sha256:f8bfc0e12dc78f777f323f55c58649591b2cd0c43534e8355c51d3fede5f4dee"}, + {file = "pandas-2.3.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:75ea25f9529fdec2d2e93a42c523962261e567d250b0013b16210e1d40d7c2e5"}, + {file = "pandas-2.3.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:74ecdf1d301e812db96a465a525952f4dde225fdb6d8e5a521d47e1f42041e21"}, + {file = "pandas-2.3.3-cp313-cp313t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6435cb949cb34ec11cc9860246ccb2fdc9ecd742c12d3304989017d53f039a78"}, + {file = "pandas-2.3.3-cp313-cp313t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:900f47d8f20860de523a1ac881c4c36d65efcb2eb850e6948140fa781736e110"}, + {file = "pandas-2.3.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:a45c765238e2ed7d7c608fc5bc4a6f88b642f2f01e70c0c23d2224dd21829d86"}, + {file = "pandas-2.3.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:c4fc4c21971a1a9f4bdb4c73978c7f7256caa3e62b323f70d6cb80db583350bc"}, + {file = "pandas-2.3.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:ee15f284898e7b246df8087fc82b87b01686f98ee67d85a17b7ab44143a3a9a0"}, + {file = "pandas-2.3.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:1611aedd912e1ff81ff41c745822980c49ce4a7907537be8692c8dbc31924593"}, + {file = "pandas-2.3.3-cp314-cp314-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6d2cefc361461662ac48810cb14365a365ce864afe85ef1f447ff5a1e99ea81c"}, + {file = "pandas-2.3.3-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ee67acbbf05014ea6c763beb097e03cd629961c8a632075eeb34247120abcb4b"}, + {file = "pandas-2.3.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:c46467899aaa4da076d5abc11084634e2d197e9460643dd455ac3db5856b24d6"}, + {file = "pandas-2.3.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:6253c72c6a1d990a410bc7de641d34053364ef8bcd3126f7e7450125887dffe3"}, + {file = "pandas-2.3.3-cp314-cp314-win_amd64.whl", hash = "sha256:1b07204a219b3b7350abaae088f451860223a52cfb8a6c53358e7948735158e5"}, + {file = "pandas-2.3.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:2462b1a365b6109d275250baaae7b760fd25c726aaca0054649286bcfbb3e8ec"}, + {file = "pandas-2.3.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:0242fe9a49aa8b4d78a4fa03acb397a58833ef6199e9aa40a95f027bb3a1b6e7"}, + {file = "pandas-2.3.3-cp314-cp314t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a21d830e78df0a515db2b3d2f5570610f5e6bd2e27749770e8bb7b524b89b450"}, + {file = "pandas-2.3.3-cp314-cp314t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2e3ebdb170b5ef78f19bfb71b0dc5dc58775032361fa188e814959b74d726dd5"}, + {file = "pandas-2.3.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:d051c0e065b94b7a3cea50eb1ec32e912cd96dba41647eb24104b6c6c14c5788"}, + {file = "pandas-2.3.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:3869faf4bd07b3b66a9f462417d0ca3a9df29a9f6abd5d0d0dbab15dac7abe87"}, + {file = "pandas-2.3.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c503ba5216814e295f40711470446bc3fd00f0faea8a086cbc688808e26f92a2"}, + {file = "pandas-2.3.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a637c5cdfa04b6d6e2ecedcb81fc52ffb0fd78ce2ebccc9ea964df9f658de8c8"}, + {file = "pandas-2.3.3-cp39-cp39-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:854d00d556406bffe66a4c0802f334c9ad5a96b4f1f868adf036a21b11ef13ff"}, + {file = "pandas-2.3.3-cp39-cp39-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bf1f8a81d04ca90e32a0aceb819d34dbd378a98bf923b6398b9a3ec0bf44de29"}, + {file = "pandas-2.3.3-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:23ebd657a4d38268c7dfbdf089fbc31ea709d82e4923c5ffd4fbd5747133ce73"}, + {file = "pandas-2.3.3-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:5554c929ccc317d41a5e3d1234f3be588248e61f08a74dd17c9eabb535777dc9"}, + {file = "pandas-2.3.3-cp39-cp39-win_amd64.whl", hash = "sha256:d3e28b3e83862ccf4d85ff19cf8c20b2ae7e503881711ff2d534dc8f761131aa"}, + {file = "pandas-2.3.3.tar.gz", hash = "sha256:e05e1af93b977f7eafa636d043f9f94c7ee3ac81af99c13508215942e64c993b"}, +] + +[package.dependencies] +numpy = {version = ">=1.22.4", markers = "python_version < \"3.11\""} +python-dateutil = ">=2.8.2" +pytz = ">=2020.1" +tzdata = ">=2022.7" + +[package.extras] +all = ["PyQt5 (>=5.15.9)", "SQLAlchemy (>=2.0.0)", "adbc-driver-postgresql (>=0.8.0)", "adbc-driver-sqlite (>=0.8.0)", "beautifulsoup4 (>=4.11.2)", "bottleneck (>=1.3.6)", "dataframe-api-compat (>=0.1.7)", "fastparquet (>=2022.12.0)", "fsspec (>=2022.11.0)", "gcsfs (>=2022.11.0)", "html5lib (>=1.1)", "hypothesis (>=6.46.1)", "jinja2 (>=3.1.2)", "lxml (>=4.9.2)", "matplotlib (>=3.6.3)", "numba (>=0.56.4)", "numexpr (>=2.8.4)", "odfpy (>=1.4.1)", "openpyxl (>=3.1.0)", "pandas-gbq (>=0.19.0)", "psycopg2 (>=2.9.6)", "pyarrow (>=10.0.1)", "pymysql (>=1.0.2)", "pyreadstat (>=1.2.0)", "pytest (>=7.3.2)", "pytest-xdist (>=2.2.0)", "python-calamine (>=0.1.7)", "pyxlsb (>=1.0.10)", "qtpy (>=2.3.0)", "s3fs (>=2022.11.0)", "scipy (>=1.10.0)", "tables (>=3.8.0)", "tabulate (>=0.9.0)", "xarray (>=2022.12.0)", "xlrd (>=2.0.1)", "xlsxwriter (>=3.0.5)", "zstandard (>=0.19.0)"] +aws = ["s3fs (>=2022.11.0)"] +clipboard = ["PyQt5 (>=5.15.9)", "qtpy (>=2.3.0)"] +compression = ["zstandard (>=0.19.0)"] +computation = ["scipy (>=1.10.0)", "xarray (>=2022.12.0)"] +consortium-standard = ["dataframe-api-compat (>=0.1.7)"] +excel = ["odfpy (>=1.4.1)", "openpyxl (>=3.1.0)", "python-calamine (>=0.1.7)", "pyxlsb (>=1.0.10)", "xlrd (>=2.0.1)", "xlsxwriter (>=3.0.5)"] +feather = ["pyarrow (>=10.0.1)"] +fss = ["fsspec (>=2022.11.0)"] +gcp = ["gcsfs (>=2022.11.0)", "pandas-gbq (>=0.19.0)"] +hdf5 = ["tables (>=3.8.0)"] +html = ["beautifulsoup4 (>=4.11.2)", "html5lib (>=1.1)", "lxml (>=4.9.2)"] +mysql = ["SQLAlchemy (>=2.0.0)", "pymysql (>=1.0.2)"] +output-formatting = ["jinja2 (>=3.1.2)", "tabulate (>=0.9.0)"] +parquet = ["pyarrow (>=10.0.1)"] +performance = ["bottleneck (>=1.3.6)", "numba (>=0.56.4)", "numexpr (>=2.8.4)"] +plot = ["matplotlib (>=3.6.3)"] +postgresql = ["SQLAlchemy (>=2.0.0)", "adbc-driver-postgresql (>=0.8.0)", "psycopg2 (>=2.9.6)"] +pyarrow = ["pyarrow (>=10.0.1)"] +spss = ["pyreadstat (>=1.2.0)"] +sql-other = ["SQLAlchemy (>=2.0.0)", "adbc-driver-postgresql (>=0.8.0)", "adbc-driver-sqlite (>=0.8.0)"] +test = ["hypothesis (>=6.46.1)", "pytest (>=7.3.2)", "pytest-xdist (>=2.2.0)"] +xml = ["lxml (>=4.9.2)"] + +[[package]] +name = "pandas" +version = "3.0.5" +description = "Powerful data structures for data analysis, time series, and statistics" +optional = false +python-versions = ">=3.11" +groups = ["floris"] +markers = "python_version >= \"3.11\"" +files = [ + {file = "pandas-3.0.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2946e77e4a53cd248cbde631a12f0e51c8324ce354c3eba4d20147c1ad6f4282"}, + {file = "pandas-3.0.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:71ecc8fb7ed1a7aa4392316b5309a6347e8e7f832f38fd897846b3a1457a9298"}, + {file = "pandas-3.0.5-cp311-cp311-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b173f5951ff6b8b0ec7675e20dff3c97b7e7a57dfcce387c2d7c5afe87cb7899"}, + {file = "pandas-3.0.5-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2c0cf1dd9b55a22d105fc46c1b489af3bd42264fcba7c66297bf47a9a1d9c78a"}, + {file = "pandas-3.0.5-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:0fac0010c75e4efb6b99e249c183a8993ce0dc95c240f9b120a5e67c727b7928"}, + {file = "pandas-3.0.5-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:08d24fe11a17dc33bd6e937dc9c665f9cba08fbdc9f657f405713515febe300d"}, + {file = "pandas-3.0.5-cp311-cp311-win_amd64.whl", hash = "sha256:b1261758dfb6cf12c3cff8300e21cefad30e7ec709abb4c24ac7318e6a52462a"}, + {file = "pandas-3.0.5-cp311-cp311-win_arm64.whl", hash = "sha256:679f4e85b30ddb1515458ab1e788d3e260eae369b1f78da7a3aa4cac8ebf4a2a"}, + {file = "pandas-3.0.5-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:fa290c16964d4963fbfbc358928239cf3bd755b20e988ce944877def2f44471d"}, + {file = "pandas-3.0.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:c2e26bb46934b8a2ca0c3de1d3d606fc5f6746584791b2db264d58cf370e08dc"}, + {file = "pandas-3.0.5-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:73fa87b08a7ef706f8aafda39ddaccf2a99047bea62d8c88a0361bcafb2237bc"}, + {file = "pandas-3.0.5-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d373ce03ffd84010ed9839fa73672a9c8256990532e158440c0085db7d914b34"}, + {file = "pandas-3.0.5-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:2a29c53d85ea98c5e792c59ef82ee9fbe6ca902c0d0adb6b23f45ef894cd7bf6"}, + {file = "pandas-3.0.5-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:a5ad3b02ed6bc7d7ae9b70804b2c6aa31827489d150f8e623ce82491b82085d7"}, + {file = "pandas-3.0.5-cp312-cp312-pyemscripten_2024_0_wasm32.whl", hash = "sha256:b2acb4650527eec6822c3dadb2b771277b65e7dae7a267d4bccf65fd1bb3fbce"}, + {file = "pandas-3.0.5-cp312-cp312-win_amd64.whl", hash = "sha256:80a611068e8a3ac23f7398c6c14eb46dc974e5cc9997f653e2dcfd1da74edd41"}, + {file = "pandas-3.0.5-cp312-cp312-win_arm64.whl", hash = "sha256:25ff585b972a18ef1fe9ffa3ac6544d9950508aa76832e5147640b6022821e49"}, + {file = "pandas-3.0.5-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:c1c05a767fe8e5b4fe9e1c29806829c582052eaedb9120a3da83ba3f69e24a5b"}, + {file = "pandas-3.0.5-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:b86765f268b56f7e665b93bce9d5df69dee7f99e595cf8fb839483ab315942a3"}, + {file = "pandas-3.0.5-cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c597ecf5616b5c420372c1d4d4c00dbbfba7398bea857dcc984347e1ea48417b"}, + {file = "pandas-3.0.5-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4b11c36e218331d0387cbe3a0a5f75162357a1d92d57b2b08a336ff94b19b2be"}, + {file = "pandas-3.0.5-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:cf52e1f61d229496da17dc7ab54acdee627357e7008fd4fecba3d0ba2937fa58"}, + {file = "pandas-3.0.5-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:db172144bb56422bd157812f3b021eacc255451470b31e2c633c349490a1cfee"}, + {file = "pandas-3.0.5-cp313-cp313-win_amd64.whl", hash = "sha256:0d298e951f23016ce4699951d044ae6418dbc91bf68cefca0f77666fcbb4e5c6"}, + {file = "pandas-3.0.5-cp313-cp313-win_arm64.whl", hash = "sha256:66266d3442a5e8b3c90274c2b8b230bee42dd1c286bc822cc2f9f2c7e12b883e"}, + {file = "pandas-3.0.5-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:2f264fc46911cc8131a7322a16199bbf8e353d27c10bb211f5bd0c814324dc36"}, + {file = "pandas-3.0.5-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:53730687fcd161883b24e10411c06d6a4c0f2275d2faf3bb2bc25deb4ba8007c"}, + {file = "pandas-3.0.5-cp314-cp314-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:960d3ebcf249f75206899fcd2c6de53f736b7265759ced0d3e559df0b8b709b0"}, + {file = "pandas-3.0.5-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9e94c2c5ca43bd3ca32bf64d32308887b65e5f9bfd8023ea52755107a999f93b"}, + {file = "pandas-3.0.5-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:e819dd5f62966b481a8cb649d3299ebd886a1ea91ed5a99bf7ce77c98d18ab94"}, + {file = "pandas-3.0.5-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:3c5ed2e7c06e91d340dfd091d7934f9bc82e4a36b95f647f090b9d1c9ac649da"}, + {file = "pandas-3.0.5-cp314-cp314-win_amd64.whl", hash = "sha256:cd8f7c6dc98527058ee6264219343f5392240a6f1bfa654fc5d79023020d0c92"}, + {file = "pandas-3.0.5-cp314-cp314-win_arm64.whl", hash = "sha256:5183427f5a8156d480f30333777bc978be93650a49a7c01db26adffe95b31e85"}, + {file = "pandas-3.0.5-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:303da736987d481074ca720ada325f8bd80c64ebc2d45ed79b29df3aaa4a26ca"}, + {file = "pandas-3.0.5-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:3b2801bbb049d0136f6c213eae02b5fca969384fc2064dd728d8620552aa49da"}, + {file = "pandas-3.0.5-cp314-cp314t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:cce3a9d11d2b1f82c69a27ec1f4948a170e2c403c4bbfa8cca62e3fdebe2ef3a"}, + {file = "pandas-3.0.5-cp314-cp314t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ef01af4d8dc6cd2c8d6c7736f149574ef93fe043811eeb5e445f2647154b5040"}, + {file = "pandas-3.0.5-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:e2759e890db96dfcffdbd9b86c3c2cb6afaf58def482820317e06163ec1066cd"}, + {file = "pandas-3.0.5-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:b58b1b39d46a5862e3fb18f50d1a201398619d16a0f9f73f57eea5583cf0e63c"}, + {file = "pandas-3.0.5-cp314-cp314t-win_amd64.whl", hash = "sha256:1c10461f6eeb35d8f05b6184c65c8b9991663b66c46b1d559b682cb34ae7c6ea"}, + {file = "pandas-3.0.5-cp314-cp314t-win_arm64.whl", hash = "sha256:3c5015fd1730fbf883647e88068176c839c102cea883ba1769a6f4593bfc1f8c"}, + {file = "pandas-3.0.5.tar.gz", hash = "sha256:dca3734d6ab7c906e6730f0788b0a1dbb9f2467731f9711f77995c8e9d62d712"}, +] + +[package.dependencies] +numpy = [ + {version = ">=1.26.0", markers = "python_version < \"3.14\""}, + {version = ">=2.3.3", markers = "python_version >= \"3.14\""}, +] +python-dateutil = ">=2.8.2" +tzdata = {version = "*", markers = "sys_platform == \"win32\" or sys_platform == \"emscripten\""} + +[package.extras] +all = ["PyQt5 (>=5.15.9)", "SQLAlchemy (>=2.0.36)", "adbc-driver-postgresql (>=1.2.0)", "adbc-driver-sqlite (>=1.2.0)", "beautifulsoup4 (>=4.12.3)", "bottleneck (>=1.4.2)", "fastparquet (>=2024.11.0)", "fsspec (>=2024.10.0)", "gcsfs (>=2024.10.0)", "html5lib (>=1.1)", "hypothesis (>=6.116.0)", "jinja2 (>=3.1.5)", "lxml (>=5.3.0)", "matplotlib (>=3.9.3)", "numba (>=0.60.0)", "numexpr (>=2.10.2)", "odfpy (>=1.4.1)", "openpyxl (>=3.1.5)", "psycopg2 (>=2.9.10)", "pyarrow (>=13.0.0)", "pyiceberg (>=0.8.1)", "pymysql (>=1.1.1)", "pyreadstat (>=1.2.8)", "pytest (>=8.3.4)", "pytest-xdist (>=3.6.1)", "python-calamine (>=0.3.0)", "pytz (>=2020.1)", "pyxlsb (>=1.0.10)", "qtpy (>=2.4.2)", "s3fs (>=2024.10.0)", "scipy (>=1.14.1)", "tables (>=3.10.1)", "tabulate (>=0.9.0)", "xarray (>=2024.10.0)", "xlrd (>=2.0.1)", "xlsxwriter (>=3.2.0)", "zstandard (>=0.23.0)"] +aws = ["s3fs (>=2024.10.0)"] +clipboard = ["PyQt5 (>=5.15.9)", "qtpy (>=2.4.2)"] +compression = ["zstandard (>=0.23.0)"] +computation = ["scipy (>=1.14.1)", "xarray (>=2024.10.0)"] +excel = ["odfpy (>=1.4.1)", "openpyxl (>=3.1.5)", "python-calamine (>=0.3.0)", "pyxlsb (>=1.0.10)", "xlrd (>=2.0.1)", "xlsxwriter (>=3.2.0)"] +feather = ["pyarrow (>=13.0.0)"] +fss = ["fsspec (>=2024.10.0)"] +gcp = ["gcsfs (>=2024.10.0)"] +hdf5 = ["tables (>=3.10.1)"] +html = ["beautifulsoup4 (>=4.12.3)", "html5lib (>=1.1)", "lxml (>=5.3.0)"] +iceberg = ["pyiceberg (>=0.8.1)"] +mysql = ["SQLAlchemy (>=2.0.36)", "pymysql (>=1.1.1)"] +output-formatting = ["jinja2 (>=3.1.5)", "tabulate (>=0.9.0)"] +parquet = ["pyarrow (>=13.0.0)"] +performance = ["bottleneck (>=1.4.2)", "numba (>=0.60.0)", "numexpr (>=2.10.2)"] +plot = ["matplotlib (>=3.9.3)"] +postgresql = ["SQLAlchemy (>=2.0.36)", "adbc-driver-postgresql (>=1.2.0)", "psycopg2 (>=2.9.10)"] +pyarrow = ["pyarrow (>=13.0.0)"] +spss = ["pyreadstat (>=1.2.8)"] +sql-other = ["SQLAlchemy (>=2.0.36)", "adbc-driver-postgresql (>=1.2.0)", "adbc-driver-sqlite (>=1.2.0)"] +test = ["hypothesis (>=6.116.0)", "pytest (>=8.3.4,<9.1)", "pytest-xdist (>=3.6.1)"] +timezone = ["pytz (>=2020.1)"] +xml = ["lxml (>=5.3.0)"] + [[package]] name = "pandocfilters" version = "1.5.1" @@ -2350,37 +3569,72 @@ files = [ [[package]] name = "parso" -version = "0.8.6" +version = "0.8.7" description = "A Python Parser" optional = false python-versions = ">=3.6" groups = ["dev"] files = [ - {file = "parso-0.8.6-py2.py3-none-any.whl", hash = "sha256:2c549f800b70a5c4952197248825584cb00f033b29c692671d3bf08bf380baff"}, - {file = "parso-0.8.6.tar.gz", hash = "sha256:2b9a0332696df97d454fa67b81618fd69c35a7b90327cbe6ba5c92d2c68a7bfd"}, + {file = "parso-0.8.7-py2.py3-none-any.whl", hash = "sha256:a8926eb2a1b915486941fdbd31e86a4baf88fe8c210f25f2f35ecec5b574ca1c"}, + {file = "parso-0.8.7.tar.gz", hash = "sha256:eaaac4c9fdd5e9e8852dc778d2d7405897ec510f2a298071453e5e3a07914bb1"}, ] [package.extras] qa = ["flake8 (==5.0.4)", "types-setuptools (==67.2.0.1)", "zuban (==0.5.1)"] testing = ["docopt", "pytest"] +[[package]] +name = "pathos" +version = "0.3.5" +description = "parallel graph management and execution in heterogeneous computing" +optional = false +python-versions = ">=3.9" +groups = ["floris"] +files = [ + {file = "pathos-0.3.5-py3-none-any.whl", hash = "sha256:c95b04103c40a16c08db69cd4b5c52624d55208beadf1348681edece809ec4f8"}, + {file = "pathos-0.3.5.tar.gz", hash = "sha256:8fe041b8545c5d3880a038f866022bdebf935e5cf68f56ed3407cb7e65193a61"}, +] + +[package.dependencies] +dill = ">=0.4.1" +multiprocess = ">=0.70.19" +pox = ">=0.3.7" +ppft = ">=1.7.8" + [[package]] name = "pathspec" -version = "1.0.4" +version = "1.1.1" description = "Utility library for gitignore style pattern matching of file paths." optional = false python-versions = ">=3.9" groups = ["dev"] files = [ - {file = "pathspec-1.0.4-py3-none-any.whl", hash = "sha256:fb6ae2fd4e7c921a165808a552060e722767cfa526f99ca5156ed2ce45a5c723"}, - {file = "pathspec-1.0.4.tar.gz", hash = "sha256:0210e2ae8a21a9137c0d470578cb0e595af87edaa6ebf12ff176f14a02e0e645"}, + {file = "pathspec-1.1.1-py3-none-any.whl", hash = "sha256:a00ce642f577bf7f473932318056212bc4f8bfdf53128c78bbd5af0b9b20b189"}, + {file = "pathspec-1.1.1.tar.gz", hash = "sha256:17db5ecd524104a120e173814c90367a96a98d07c45b2e10c2f3919fff91bf5a"}, ] [package.extras] hyperscan = ["hyperscan (>=0.7)"] optional = ["typing-extensions (>=4)"] re2 = ["google-re2 (>=1.1)"] -tests = ["pytest (>=9)", "typing-extensions (>=4.15)"] + +[[package]] +name = "patsy" +version = "1.0.2" +description = "A Python package for describing statistical models and for building design matrices." +optional = false +python-versions = ">=3.6" +groups = ["floris"] +files = [ + {file = "patsy-1.0.2-py2.py3-none-any.whl", hash = "sha256:37bfddbc58fcf0362febb5f54f10743f8b21dd2aa73dec7e7ef59d1b02ae668a"}, + {file = "patsy-1.0.2.tar.gz", hash = "sha256:cdc995455f6233e90e22de72c37fcadb344e7586fb83f06696f54d92f8ce74c0"}, +] + +[package.dependencies] +numpy = ">=1.4" + +[package.extras] +test = ["pytest", "pytest-cov", "scipy"] [[package]] name = "pexpect" @@ -2400,103 +3654,99 @@ ptyprocess = ">=0.5" [[package]] name = "pillow" -version = "12.1.1" +version = "12.3.0" description = "Python Imaging Library (fork)" optional = false python-versions = ">=3.10" -groups = ["examples"] -files = [ - {file = "pillow-12.1.1-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:1f1625b72740fdda5d77b4def688eb8fd6490975d06b909fd19f13f391e077e0"}, - {file = "pillow-12.1.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:178aa072084bd88ec759052feca8e56cbb14a60b39322b99a049e58090479713"}, - {file = "pillow-12.1.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:b66e95d05ba806247aaa1561f080abc7975daf715c30780ff92a20e4ec546e1b"}, - {file = "pillow-12.1.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:89c7e895002bbe49cdc5426150377cbbc04767d7547ed145473f496dfa40408b"}, - {file = "pillow-12.1.1-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3a5cbdcddad0af3da87cb16b60d23648bc3b51967eb07223e9fed77a82b457c4"}, - {file = "pillow-12.1.1-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9f51079765661884a486727f0729d29054242f74b46186026582b4e4769918e4"}, - {file = "pillow-12.1.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:99c1506ea77c11531d75e3a412832a13a71c7ebc8192ab9e4b2e355555920e3e"}, - {file = "pillow-12.1.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:36341d06738a9f66c8287cf8b876d24b18db9bd8740fa0672c74e259ad408cff"}, - {file = "pillow-12.1.1-cp310-cp310-win32.whl", hash = "sha256:6c52f062424c523d6c4db85518774cc3d50f5539dd6eed32b8f6229b26f24d40"}, - {file = "pillow-12.1.1-cp310-cp310-win_amd64.whl", hash = "sha256:c6008de247150668a705a6338156efb92334113421ceecf7438a12c9a12dab23"}, - {file = "pillow-12.1.1-cp310-cp310-win_arm64.whl", hash = "sha256:1a9b0ee305220b392e1124a764ee4265bd063e54a751a6b62eff69992f457fa9"}, - {file = "pillow-12.1.1-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:e879bb6cd5c73848ef3b2b48b8af9ff08c5b71ecda8048b7dd22d8a33f60be32"}, - {file = "pillow-12.1.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:365b10bb9417dd4498c0e3b128018c4a624dc11c7b97d8cc54effe3b096f4c38"}, - {file = "pillow-12.1.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:d4ce8e329c93845720cd2014659ca67eac35f6433fd3050393d85f3ecef0dad5"}, - {file = "pillow-12.1.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:fc354a04072b765eccf2204f588a7a532c9511e8b9c7f900e1b64e3e33487090"}, - {file = "pillow-12.1.1-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7e7976bf1910a8116b523b9f9f58bf410f3e8aa330cd9a2bb2953f9266ab49af"}, - {file = "pillow-12.1.1-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:597bd9c8419bc7c6af5604e55847789b69123bbe25d65cc6ad3012b4f3c98d8b"}, - {file = "pillow-12.1.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:2c1fc0f2ca5f96a3c8407e41cca26a16e46b21060fe6d5b099d2cb01412222f5"}, - {file = "pillow-12.1.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:578510d88c6229d735855e1f278aa305270438d36a05031dfaae5067cc8eb04d"}, - {file = "pillow-12.1.1-cp311-cp311-win32.whl", hash = "sha256:7311c0a0dcadb89b36b7025dfd8326ecfa36964e29913074d47382706e516a7c"}, - {file = "pillow-12.1.1-cp311-cp311-win_amd64.whl", hash = "sha256:fbfa2a7c10cc2623f412753cddf391c7f971c52ca40a3f65dc5039b2939e8563"}, - {file = "pillow-12.1.1-cp311-cp311-win_arm64.whl", hash = "sha256:b81b5e3511211631b3f672a595e3221252c90af017e399056d0faabb9538aa80"}, - {file = "pillow-12.1.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:ab323b787d6e18b3d91a72fc99b1a2c28651e4358749842b8f8dfacd28ef2052"}, - {file = "pillow-12.1.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:adebb5bee0f0af4909c30db0d890c773d1a92ffe83da908e2e9e720f8edf3984"}, - {file = "pillow-12.1.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:bb66b7cc26f50977108790e2456b7921e773f23db5630261102233eb355a3b79"}, - {file = "pillow-12.1.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:aee2810642b2898bb187ced9b349e95d2a7272930796e022efaf12e99dccd293"}, - {file = "pillow-12.1.1-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a0b1cd6232e2b618adcc54d9882e4e662a089d5768cd188f7c245b4c8c44a397"}, - {file = "pillow-12.1.1-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7aac39bcf8d4770d089588a2e1dd111cbaa42df5a94be3114222057d68336bd0"}, - {file = "pillow-12.1.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:ab174cd7d29a62dd139c44bf74b698039328f45cb03b4596c43473a46656b2f3"}, - {file = "pillow-12.1.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:339ffdcb7cbeaa08221cd401d517d4b1fe7a9ed5d400e4a8039719238620ca35"}, - {file = "pillow-12.1.1-cp312-cp312-win32.whl", hash = "sha256:5d1f9575a12bed9e9eedd9a4972834b08c97a352bd17955ccdebfeca5913fa0a"}, - {file = "pillow-12.1.1-cp312-cp312-win_amd64.whl", hash = "sha256:21329ec8c96c6e979cd0dfd29406c40c1d52521a90544463057d2aaa937d66a6"}, - {file = "pillow-12.1.1-cp312-cp312-win_arm64.whl", hash = "sha256:af9a332e572978f0218686636610555ae3defd1633597be015ed50289a03c523"}, - {file = "pillow-12.1.1-cp313-cp313-ios_13_0_arm64_iphoneos.whl", hash = "sha256:d242e8ac078781f1de88bf823d70c1a9b3c7950a44cdf4b7c012e22ccbcd8e4e"}, - {file = "pillow-12.1.1-cp313-cp313-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:02f84dfad02693676692746df05b89cf25597560db2857363a208e393429f5e9"}, - {file = "pillow-12.1.1-cp313-cp313-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:e65498daf4b583091ccbb2556c7000abf0f3349fcd57ef7adc9a84a394ed29f6"}, - {file = "pillow-12.1.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:6c6db3b84c87d48d0088943bf33440e0c42370b99b1c2a7989216f7b42eede60"}, - {file = "pillow-12.1.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:8b7e5304e34942bf62e15184219a7b5ad4ff7f3bb5cca4d984f37df1a0e1aee2"}, - {file = "pillow-12.1.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:18e5bddd742a44b7e6b1e773ab5db102bd7a94c32555ba656e76d319d19c3850"}, - {file = "pillow-12.1.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:fc44ef1f3de4f45b50ccf9136999d71abb99dca7706bc75d222ed350b9fd2289"}, - {file = "pillow-12.1.1-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5a8eb7ed8d4198bccbd07058416eeec51686b498e784eda166395a23eb99138e"}, - {file = "pillow-12.1.1-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:47b94983da0c642de92ced1702c5b6c292a84bd3a8e1d1702ff923f183594717"}, - {file = "pillow-12.1.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:518a48c2aab7ce596d3bf79d0e275661b846e86e4d0e7dec34712c30fe07f02a"}, - {file = "pillow-12.1.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:a550ae29b95c6dc13cf69e2c9dc5747f814c54eeb2e32d683e5e93af56caa029"}, - {file = "pillow-12.1.1-cp313-cp313-win32.whl", hash = "sha256:a003d7422449f6d1e3a34e3dd4110c22148336918ddbfc6a32581cd54b2e0b2b"}, - {file = "pillow-12.1.1-cp313-cp313-win_amd64.whl", hash = "sha256:344cf1e3dab3be4b1fa08e449323d98a2a3f819ad20f4b22e77a0ede31f0faa1"}, - {file = "pillow-12.1.1-cp313-cp313-win_arm64.whl", hash = "sha256:5c0dd1636633e7e6a0afe7bf6a51a14992b7f8e60de5789018ebbdfae55b040a"}, - {file = "pillow-12.1.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:0330d233c1a0ead844fc097a7d16c0abff4c12e856c0b325f231820fee1f39da"}, - {file = "pillow-12.1.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:5dae5f21afb91322f2ff791895ddd8889e5e947ff59f71b46041c8ce6db790bc"}, - {file = "pillow-12.1.1-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:2e0c664be47252947d870ac0d327fea7e63985a08794758aa8af5b6cb6ec0c9c"}, - {file = "pillow-12.1.1-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:691ab2ac363b8217f7d31b3497108fb1f50faab2f75dfb03284ec2f217e87bf8"}, - {file = "pillow-12.1.1-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e9e8064fb1cc019296958595f6db671fba95209e3ceb0c4734c9baf97de04b20"}, - {file = "pillow-12.1.1-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:472a8d7ded663e6162dafdf20015c486a7009483ca671cece7a9279b512fcb13"}, - {file = "pillow-12.1.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:89b54027a766529136a06cfebeecb3a04900397a3590fd252160b888479517bf"}, - {file = "pillow-12.1.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:86172b0831b82ce4f7877f280055892b31179e1576aa00d0df3bb1bbf8c3e524"}, - {file = "pillow-12.1.1-cp313-cp313t-win32.whl", hash = "sha256:44ce27545b6efcf0fdbdceb31c9a5bdea9333e664cda58a7e674bb74608b3986"}, - {file = "pillow-12.1.1-cp313-cp313t-win_amd64.whl", hash = "sha256:a285e3eb7a5a45a2ff504e31f4a8d1b12ef62e84e5411c6804a42197c1cf586c"}, - {file = "pillow-12.1.1-cp313-cp313t-win_arm64.whl", hash = "sha256:cc7d296b5ea4d29e6570dabeaed58d31c3fea35a633a69679fb03d7664f43fb3"}, - {file = "pillow-12.1.1-cp314-cp314-ios_13_0_arm64_iphoneos.whl", hash = "sha256:417423db963cb4be8bac3fc1204fe61610f6abeed1580a7a2cbb2fbda20f12af"}, - {file = "pillow-12.1.1-cp314-cp314-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:b957b71c6b2387610f556a7eb0828afbe40b4a98036fc0d2acfa5a44a0c2036f"}, - {file = "pillow-12.1.1-cp314-cp314-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:097690ba1f2efdeb165a20469d59d8bb03c55fb6621eb2041a060ae8ea3e9642"}, - {file = "pillow-12.1.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:2815a87ab27848db0321fb78c7f0b2c8649dee134b7f2b80c6a45c6831d75ccd"}, - {file = "pillow-12.1.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:f7ed2c6543bad5a7d5530eb9e78c53132f93dfa44a28492db88b41cdab885202"}, - {file = "pillow-12.1.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:652a2c9ccfb556235b2b501a3a7cf3742148cd22e04b5625c5fe057ea3e3191f"}, - {file = "pillow-12.1.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:d6e4571eedf43af33d0fc233a382a76e849badbccdf1ac438841308652a08e1f"}, - {file = "pillow-12.1.1-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b574c51cf7d5d62e9be37ba446224b59a2da26dc4c1bb2ecbe936a4fb1a7cb7f"}, - {file = "pillow-12.1.1-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a37691702ed687799de29a518d63d4682d9016932db66d4e90c345831b02fb4e"}, - {file = "pillow-12.1.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:f95c00d5d6700b2b890479664a06e754974848afaae5e21beb4d83c106923fd0"}, - {file = "pillow-12.1.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:559b38da23606e68681337ad74622c4dbba02254fc9cb4488a305dd5975c7eeb"}, - {file = "pillow-12.1.1-cp314-cp314-win32.whl", hash = "sha256:03edcc34d688572014ff223c125a3f77fb08091e4607e7745002fc214070b35f"}, - {file = "pillow-12.1.1-cp314-cp314-win_amd64.whl", hash = "sha256:50480dcd74fa63b8e78235957d302d98d98d82ccbfac4c7e12108ba9ecbdba15"}, - {file = "pillow-12.1.1-cp314-cp314-win_arm64.whl", hash = "sha256:5cb1785d97b0c3d1d1a16bc1d710c4a0049daefc4935f3a8f31f827f4d3d2e7f"}, - {file = "pillow-12.1.1-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:1f90cff8aa76835cba5769f0b3121a22bd4eb9e6884cfe338216e557a9a548b8"}, - {file = "pillow-12.1.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:1f1be78ce9466a7ee64bfda57bdba0f7cc499d9794d518b854816c41bf0aa4e9"}, - {file = "pillow-12.1.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:42fc1f4677106188ad9a55562bbade416f8b55456f522430fadab3cef7cd4e60"}, - {file = "pillow-12.1.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:98edb152429ab62a1818039744d8fbb3ccab98a7c29fc3d5fcef158f3f1f68b7"}, - {file = "pillow-12.1.1-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d470ab1178551dd17fdba0fef463359c41aaa613cdcd7ff8373f54be629f9f8f"}, - {file = "pillow-12.1.1-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6408a7b064595afcab0a49393a413732a35788f2a5092fdc6266952ed67de586"}, - {file = "pillow-12.1.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:5d8c41325b382c07799a3682c1c258469ea2ff97103c53717b7893862d0c98ce"}, - {file = "pillow-12.1.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:c7697918b5be27424e9ce568193efd13d925c4481dd364e43f5dff72d33e10f8"}, - {file = "pillow-12.1.1-cp314-cp314t-win32.whl", hash = "sha256:d2912fd8114fc5545aa3a4b5576512f64c55a03f3ebcca4c10194d593d43ea36"}, - {file = "pillow-12.1.1-cp314-cp314t-win_amd64.whl", hash = "sha256:4ceb838d4bd9dab43e06c363cab2eebf63846d6a4aeaea283bbdfd8f1a8ed58b"}, - {file = "pillow-12.1.1-cp314-cp314t-win_arm64.whl", hash = "sha256:7b03048319bfc6170e93bd60728a1af51d3dd7704935feb228c4d4faab35d334"}, - {file = "pillow-12.1.1-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:600fd103672b925fe62ed08e0d874ea34d692474df6f4bf7ebe148b30f89f39f"}, - {file = "pillow-12.1.1-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:665e1b916b043cef294bc54d47bf02d87e13f769bc4bc5fa225a24b3a6c5aca9"}, - {file = "pillow-12.1.1-pp311-pypy311_pp73-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:495c302af3aad1ca67420ddd5c7bd480c8867ad173528767d906428057a11f0e"}, - {file = "pillow-12.1.1-pp311-pypy311_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:8fd420ef0c52c88b5a035a0886f367748c72147b2b8f384c9d12656678dfdfa9"}, - {file = "pillow-12.1.1-pp311-pypy311_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f975aa7ef9684ce7e2c18a3aa8f8e2106ce1e46b94ab713d156b2898811651d3"}, - {file = "pillow-12.1.1-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8089c852a56c2966cf18835db62d9b34fef7ba74c726ad943928d494fa7f4735"}, - {file = "pillow-12.1.1-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:cb9bb857b2d057c6dfc72ac5f3b44836924ba15721882ef103cecb40d002d80e"}, - {file = "pillow-12.1.1.tar.gz", hash = "sha256:9ad8fa5937ab05218e2b6a4cff30295ad35afd2f83ac592e68c0d871bb0fdbc4"}, +groups = ["examples", "floris"] +files = [ + {file = "pillow-12.3.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:6c0016e7b354317c4e9e525b937ac8596c38d2d232b419529b9cd7a1cd46e39a"}, + {file = "pillow-12.3.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:bcc33feacfaefce60c12fd500a277533bdc02b10a19f7f6d348763d8140bbba7"}, + {file = "pillow-12.3.0-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5594fc43d548a7ed94949d139aa1341b270f1863f11cfd37f5a6c8b778a6b67f"}, + {file = "pillow-12.3.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f0606c8bf2cdefea14a43530f7657cbbb7ecf1c4222512492ef4a4434a9501ec"}, + {file = "pillow-12.3.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:85f998ea1848bc6757289e739cfbdda3a04adfd58b02fc018ce54d754a5ce468"}, + {file = "pillow-12.3.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:25b9b82bb22e6e2b3cd07b39c68b7b862001226cb3dff7130d1cb914121b39ed"}, + {file = "pillow-12.3.0-cp310-cp310-win32.whl", hash = "sha256:37dc8f7bbb66efe481bb60defacef820c950c24713fb44962ed6aa2a50966de1"}, + {file = "pillow-12.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:300557495eb45ebb8aec96c2da9c4be642fbf7cd937278b4013ba894ea8eb0eb"}, + {file = "pillow-12.3.0-cp310-cp310-win_arm64.whl", hash = "sha256:514435a37670e3e5e08f3945b68718b6ed329bb84367777e16f9f4dfe1e61a0f"}, + {file = "pillow-12.3.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:00808c5e14ef63ac5161091d242999076604ff74b883423a11e5d7bbb38bf756"}, + {file = "pillow-12.3.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:37d6d0a00072fd2948eb22bce7e1475f34569d90c87c59f7a2ec59541b77f7a6"}, + {file = "pillow-12.3.0-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:bcb46e2f9feff8d06323983bd83ed00c201fdcab3d74973e7072a889b3979fcd"}, + {file = "pillow-12.3.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:23d27a3e0307ec2244cc51e7287b919aa68d097504ebe19df4e76a98a3eea5bd"}, + {file = "pillow-12.3.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:4f883547d4b7f0495ebe7056b0cc2aea76094e7a4abc8e933540f3271df27d9c"}, + {file = "pillow-12.3.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:236ff70b9312fb68943c703aa842ca6a758abfa45ac187a5e7c1452e96ef72b5"}, + {file = "pillow-12.3.0-cp311-cp311-win32.whl", hash = "sha256:10e41f0fbf1eec8cfd234b8fe17a4caac7c9d0db4c204d3c173a8f9f6ef3232b"}, + {file = "pillow-12.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:8e95e1385e4998ae9694eeaa4730ba5457ff61185b3a55e2e7bea0880aef452a"}, + {file = "pillow-12.3.0-cp311-cp311-win_arm64.whl", hash = "sha256:ebaea975e03d3141d9d3a507df75c9b3ec90fa9d2ffd07567b3a978d9d790b26"}, + {file = "pillow-12.3.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:ba09209fbe443b4acccebe845d8a138b89a8f4fbaeedd44953490b5315d5e965"}, + {file = "pillow-12.3.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ffd0c5368496f41b0944be820fcb7a838aa6e623d250b01acf2643939c3f99d7"}, + {file = "pillow-12.3.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d9c7f76c0673154f044e9d78c8655fb4213f6ca31a836df48b40fe5d187717b9"}, + {file = "pillow-12.3.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:78cb2c6865a35ab8ff8b75fd122f6033b92a62c82801110e48ddd6c936a45d91"}, + {file = "pillow-12.3.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e491916b378fba47242221bb9ead245211b70d504f495d105d17b14a24b4907c"}, + {file = "pillow-12.3.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:0dd2064cbc55aaec028ef5fbb60fa47bb6c3e7918e07ff17935284b227a9d2df"}, + {file = "pillow-12.3.0-cp312-cp312-win32.whl", hash = "sha256:dbce0b29841537a2fa4a214c2bbf14de3587c9680caa9b4e217568472490b28f"}, + {file = "pillow-12.3.0-cp312-cp312-win_amd64.whl", hash = "sha256:a2b55dd6b2a4c4b7d87ffa56bdb33fdc5fdb9a462173861a7bc097f17d91cb09"}, + {file = "pillow-12.3.0-cp312-cp312-win_arm64.whl", hash = "sha256:331b624368d4f1d069149002f25f44bc61c8919ce8ddb3c45bdad8f6e2d89510"}, + {file = "pillow-12.3.0-cp313-cp313-ios_13_0_arm64_iphoneos.whl", hash = "sha256:21900ce7ba264168cd50defae43cd75d25c833ad4ad6e73ffc5596d12e25ac89"}, + {file = "pillow-12.3.0-cp313-cp313-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:4e8c2a84d977f50b9daed6eeaf3baef67d00d5d74d932288f02cb94518ee3ace"}, + {file = "pillow-12.3.0-cp313-cp313-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:ae26d61dfa7a47befdc7572b521024e8745f3d809bd95ca9505a7bba9ef849ec"}, + {file = "pillow-12.3.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:7a743ff716f746fc19a9557f60dab1600d4613255f8a7aeb3cdde4db7eb15a66"}, + {file = "pillow-12.3.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:d69141514cc30b774ceea5e3ed3a6635c8d8a96edf664689b890f4089111fb35"}, + {file = "pillow-12.3.0-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f7401aebd7f581d7f83a439d87d474999317ee099218e5ad25d125290990ba65"}, + {file = "pillow-12.3.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0847a763afefb695bc912d7c131e7e0632d4edc1d8698f58ddabec8e46b8b6d3"}, + {file = "pillow-12.3.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:571b9fcb07b97ef3a492028fb3d2dc0993ca23a06138b0315286566d29ef718a"}, + {file = "pillow-12.3.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:756c768d0c9c2955feb7a56c37ea24aea2e369f8d36a88da270b6a9f19e62b5e"}, + {file = "pillow-12.3.0-cp313-cp313-win32.whl", hash = "sha256:a876864214e136f0eb367788dbd7df045f4806801518e2cfe9e13229cfe06d8f"}, + {file = "pillow-12.3.0-cp313-cp313-win_amd64.whl", hash = "sha256:1cca606cd25738df4ed873d5ad46bbdb3d83b5cbca291f6b4ff13a4df6b0bbe8"}, + {file = "pillow-12.3.0-cp313-cp313-win_arm64.whl", hash = "sha256:b629de27fda84b42cde7edef0d85f13b958b47f6e9bbcbba9b673c562a89bd8b"}, + {file = "pillow-12.3.0-cp314-cp314-ios_13_0_arm64_iphoneos.whl", hash = "sha256:9cf95fe4d0f84c82d282745d9bb08ad9f926efa00be4697e767b814ce40d4330"}, + {file = "pillow-12.3.0-cp314-cp314-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:8728f216dcdb6e6d555cf971cb34076139ad74b31fc2c14da4fafc741c5f6217"}, + {file = "pillow-12.3.0-cp314-cp314-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:a45650e8ce7fafffd731db8550230db6b0d306d181a90b67d3e6bca2f1990930"}, + {file = "pillow-12.3.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:ba54cfebe86920a559a7c4d6b9050791c20513650a1952ebe3368c7dc70306f8"}, + {file = "pillow-12.3.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:e158cb00350dc278f3b91551101aa7d12415a66ebf2c91d8d5ac14e56ddd3ad0"}, + {file = "pillow-12.3.0-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e9aeb04d6aef139de265b29683e119b638208f88cf73cdd1658aa07221165321"}, + {file = "pillow-12.3.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:251bf95b67017e27b13d82f5b326234ca62d70f9cf4c2b9032de2358a3b12c7b"}, + {file = "pillow-12.3.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:fe3cca2e4e8a592be0f269a1ca4835c25199d9f3ce815c8491048f785b0a0198"}, + {file = "pillow-12.3.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:23aceaa007d6172b02c277f0cd359c79492bbb14f7072b4ede9fbcaf20648130"}, + {file = "pillow-12.3.0-cp314-cp314-win32.whl", hash = "sha256:af8d94b0db561cf68b88a267c5c44b49e134f525d0dc2cb7ed413a66bc23559a"}, + {file = "pillow-12.3.0-cp314-cp314-win_amd64.whl", hash = "sha256:fdafc9cce40277e0f7a0feabce0ee50dd2fa1800f3b38015e51296b5e814048d"}, + {file = "pillow-12.3.0-cp314-cp314-win_arm64.whl", hash = "sha256:e91206ee562682b51b98ef4b26a6ef48fd84e15fd4c4bc5ec768eb641d206838"}, + {file = "pillow-12.3.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:164b31cd1a0490ab6efae01aa5df49da7061be0af1b30e035b6e9a1bfe34ee6e"}, + {file = "pillow-12.3.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:5afb51d599ea772b8365ae807ae557f18bccfe46ab261fd1c2a9ed700fc6eb17"}, + {file = "pillow-12.3.0-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3edce1d53195db527e0191f84b71d02022de0540bf43a16ed734ed7537b07385"}, + {file = "pillow-12.3.0-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bf16ba1b4d0b6b7c8e534936632270cf70eb00dbe09005bc345b2677b726855c"}, + {file = "pillow-12.3.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:24870b09b224f7ae3c39ed07d10e819d06f8720bc551847b1d623832b5b0e28d"}, + {file = "pillow-12.3.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:30f2aa603c41533cc25c05acd0da21636e84a315768feb631c937177db558931"}, + {file = "pillow-12.3.0-cp314-cp314t-win32.whl", hash = "sha256:4b0a7fe987b14c31ebda6083f74f22b561fd3739bc0ac51e019622e3d72668c7"}, + {file = "pillow-12.3.0-cp314-cp314t-win_amd64.whl", hash = "sha256:962864dc93511324d51ddbb5b9f8731bf71675b93ca612a07441896f4688fb8c"}, + {file = "pillow-12.3.0-cp314-cp314t-win_arm64.whl", hash = "sha256:0740a512dc522224c77d9aa5a8d70d8b7d73fb91f2c21125d8d025d3b8990e45"}, + {file = "pillow-12.3.0-cp315-cp315-ios_13_0_arm64_iphoneos.whl", hash = "sha256:0feb2e9d6ad6c9e3c06effe9d00f3f1e618a6643273576b016f591e9315a7139"}, + {file = "pillow-12.3.0-cp315-cp315-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:9e881fca225083806662a5c43d627d215f258ff43c890f831966c7d7ba9c7402"}, + {file = "pillow-12.3.0-cp315-cp315-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:4998562bf62a445225f22e07c896bb04b35b1b1f2eb6d760584c9c51d7a5f78c"}, + {file = "pillow-12.3.0-cp315-cp315-macosx_10_15_x86_64.whl", hash = "sha256:dc624f6bc473dacdf7ef7eb8678d0d08edf15cd94fad6ae5c7d6cc67a4e4902f"}, + {file = "pillow-12.3.0-cp315-cp315-macosx_11_0_arm64.whl", hash = "sha256:71d6097b330eea8fd15097780c8e89cb1a8ce7838669f48c5bacd6f663dd4701"}, + {file = "pillow-12.3.0-cp315-cp315-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:28ce87c5ab450a9dd970b52e5aca5fe63ed432d18a2eaddd1979a00a1ba24ace"}, + {file = "pillow-12.3.0-cp315-cp315-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6b02afb9b97f65fbca5f31db6a2a3ba21aa93030225f150fa3f249717e938fb4"}, + {file = "pillow-12.3.0-cp315-cp315-musllinux_1_2_aarch64.whl", hash = "sha256:1182d52bc2d5e5d7d0949503aa7e36d12f42205dc287e4883f407b1988820d39"}, + {file = "pillow-12.3.0-cp315-cp315-musllinux_1_2_x86_64.whl", hash = "sha256:e795b7eb908249c4e43c7c99fac7c2c75dab0c43566e37db472a355f63693d71"}, + {file = "pillow-12.3.0-cp315-cp315-win32.whl", hash = "sha256:57b3d78c95ba9059768b10e28b813002261d3f3dfc55cc48b0c988f625175827"}, + {file = "pillow-12.3.0-cp315-cp315-win_amd64.whl", hash = "sha256:fa4ecea169a355be7a3ade2c783e2ed12f0e40d2c5621cda8b3297faf7fbb9f5"}, + {file = "pillow-12.3.0-cp315-cp315-win_arm64.whl", hash = "sha256:877c3f311ff35410f690861c4409e7ccbf0cd2f878e50628a28e5a0bb689e658"}, + {file = "pillow-12.3.0-cp315-cp315t-macosx_10_15_x86_64.whl", hash = "sha256:e9871b1ffbfa9656b60aeee92ed5136a5742696006fa322b29ea3d8da0ecc9cf"}, + {file = "pillow-12.3.0-cp315-cp315t-macosx_11_0_arm64.whl", hash = "sha256:53aa02d20d10c3d814d536aa4e5ac9b84ca0ff5a88377963b085ad6822f93e64"}, + {file = "pillow-12.3.0-cp315-cp315t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:446c34dcc4324b084a53b705127dc15717b22c5e140ae0a3c38349d4efec071e"}, + {file = "pillow-12.3.0-cp315-cp315t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:cf1845d02ad822a369a49f2bb9345b1614744267682e7a03527dc3bf6eea1777"}, + {file = "pillow-12.3.0-cp315-cp315t-musllinux_1_2_aarch64.whl", hash = "sha256:186941b6aef820ad110fb01fb06eb925374dc3a21b17e37ec9a53b250c6fe2d1"}, + {file = "pillow-12.3.0-cp315-cp315t-musllinux_1_2_x86_64.whl", hash = "sha256:f13c32a3abd6079a66d9526e18dad9b6d280384d49d7c54040cd57b6424041d9"}, + {file = "pillow-12.3.0-cp315-cp315t-win32.whl", hash = "sha256:1657923d2d45afb66526e5b933e5b3052e6bdea196c90d3abb2424e18c77dae8"}, + {file = "pillow-12.3.0-cp315-cp315t-win_amd64.whl", hash = "sha256:8cd2f7bdda092d99c9fc2fb7391354f306d01443d22785d0cbfafa2e2c8bb418"}, + {file = "pillow-12.3.0-cp315-cp315t-win_arm64.whl", hash = "sha256:06ff022112bc9cbf83b60f8e028d94ad87b60621706487e65f673de61610ab59"}, + {file = "pillow-12.3.0-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:b3c777e849237620b022f7f297dd67705f9f5cf1685f09f02e46f93e92725468"}, + {file = "pillow-12.3.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:b343699e8308bdc51978310e1c959c584e7869cc8c40780058c87da7781a1e94"}, + {file = "pillow-12.3.0-pp311-pypy311_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:fbd139c8447d25dd750ab79ee274cc5e1fe80fc56340ab10b18a195e1b6eca3e"}, + {file = "pillow-12.3.0-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e7e480451b9fa137494bccd3a7d69adbe8ac65a87d97be61e11f1b1050a5bac3"}, + {file = "pillow-12.3.0-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:04f01d28a6aaff387bf842a13be313df23ba0597a44f1a976c9feb3c6ff4711a"}, + {file = "pillow-12.3.0.tar.gz", hash = "sha256:3b8182a766685eaa002637e28b4ec8d6b18819a0c71f579bf0dbaa5830297cce"}, ] [package.extras] @@ -2504,19 +3754,19 @@ docs = ["furo", "olefile", "sphinx (>=8.2)", "sphinx-autobuild", "sphinx-copybut fpx = ["olefile"] mic = ["olefile"] test-arrow = ["arro3-compute", "arro3-core", "nanoarrow", "pyarrow"] -tests = ["check-manifest", "coverage (>=7.4.2)", "defusedxml", "markdown2", "olefile", "packaging", "pyroma (>=5)", "pytest", "pytest-cov", "pytest-timeout", "pytest-xdist", "trove-classifiers (>=2024.10.12)"] +tests = ["coverage (>=7.4.2)", "defusedxml", "markdown2", "olefile", "packaging", "pytest", "pytest-cov", "pytest-timeout", "pytest-xdist", "setuptools", "trove-classifiers (>=2024.10.12)"] xmp = ["defusedxml"] [[package]] name = "platformdirs" -version = "4.9.2" +version = "4.11.2" description = "A small Python package for determining appropriate platform-specific dirs, e.g. a `user data dir`." optional = false python-versions = ">=3.10" groups = ["dev"] files = [ - {file = "platformdirs-4.9.2-py3-none-any.whl", hash = "sha256:9170634f126f8efdae22fb58ae8a0eaa86f38365bc57897a6c4f781d1f5875bd"}, - {file = "platformdirs-4.9.2.tar.gz", hash = "sha256:9a33809944b9db043ad67ca0db94b14bf452cc6aeaac46a88ea55b26e2e9d291"}, + {file = "platformdirs-4.11.2-py3-none-any.whl", hash = "sha256:7f89089b6ea71bda7962953edcf784b2e2d9d285b40ad88be2bb75c6e9d82ab4"}, + {file = "platformdirs-4.11.2.tar.gz", hash = "sha256:3a2ae5fca3520a01ab1be8b45613537f52ddf5b5f6f53d88233892dfbf0cd82d"}, ] [[package]] @@ -2572,16 +3822,43 @@ timezone = ["backports.zoneinfo ; python_version < \"3.9\"", "tzdata ; platform_ xlsx2csv = ["xlsx2csv (>=0.8.0)"] xlsxwriter = ["xlsxwriter"] +[[package]] +name = "pox" +version = "0.3.7" +description = "utilities for filesystem exploration and automated builds" +optional = false +python-versions = ">=3.9" +groups = ["floris"] +files = [ + {file = "pox-0.3.7-py3-none-any.whl", hash = "sha256:82a495249d13371314c1a5b5626a115e067ef5215d49530bf5efa37fbc25b56a"}, + {file = "pox-0.3.7.tar.gz", hash = "sha256:0652f6f2103fe6d4ba638beb6fa8d3e8a68fd44bcb63315c614118515bcc3afb"}, +] + +[[package]] +name = "ppft" +version = "1.7.8" +description = "distributed and parallel Python" +optional = false +python-versions = ">=3.9" +groups = ["floris"] +files = [ + {file = "ppft-1.7.8-py3-none-any.whl", hash = "sha256:d3e0e395215b14afc3dd5adfc032ccecfda2d4ed50dc7ded076cd1d215442843"}, + {file = "ppft-1.7.8.tar.gz", hash = "sha256:5f696d4f397ae9b0af39b1faffb31957c51dfbc5a3815856472d4f4e872937ee"}, +] + +[package.extras] +dill = ["dill (>=0.4.1)"] + [[package]] name = "prometheus-client" -version = "0.24.1" +version = "0.26.0" description = "Python client for the Prometheus monitoring system." optional = false python-versions = ">=3.9" groups = ["dev"] files = [ - {file = "prometheus_client-0.24.1-py3-none-any.whl", hash = "sha256:150db128af71a5c2482b36e588fc8a6b95e498750da4b17065947c16070f4055"}, - {file = "prometheus_client-0.24.1.tar.gz", hash = "sha256:7e0ced7fbbd40f7b84962d5d2ab6f17ef88a72504dcf7c0b40737b43b2a461f9"}, + {file = "prometheus_client-0.26.0-py3-none-any.whl", hash = "sha256:fa93d06737aa02bacd05794768508bb97d2fbee28cb3bca04eaae92f0ca953d6"}, + {file = "prometheus_client-0.26.0.tar.gz", hash = "sha256:04a91bcf94e2cf74a44a1a874d651a2e853ed354b6e822f3b7487751465d5c2b"}, ] [package.extras] @@ -2591,18 +3868,18 @@ twisted = ["twisted"] [[package]] name = "prompt-toolkit" -version = "3.0.52" +version = "3.0.53" description = "Library for building powerful interactive command lines in Python" optional = false -python-versions = ">=3.8" +python-versions = ">=3.10" groups = ["dev"] files = [ - {file = "prompt_toolkit-3.0.52-py3-none-any.whl", hash = "sha256:9aac639a3bbd33284347de5ad8d68ecc044b91a762dc39b7c21095fcd6a19955"}, - {file = "prompt_toolkit-3.0.52.tar.gz", hash = "sha256:28cde192929c8e7321de85de1ddbe736f1375148b02f2e17edd840042b1be855"}, + {file = "prompt_toolkit-3.0.53-py3-none-any.whl", hash = "sha256:01c0891d7f9237d5e339f7d3e42cdae80b7534abb1c7c0e3352efba6231492f2"}, + {file = "prompt_toolkit-3.0.53.tar.gz", hash = "sha256:9ec8a0ad96d5c56148b3f914aa79c1564c3fde5d2e6b876e7bc327e353cf8fa6"}, ] [package.dependencies] -wcwidth = "*" +wcwidth = ">=0.1.4" [[package]] name = "psutil" @@ -2646,7 +3923,7 @@ description = "Run a subprocess in a pseudo terminal" optional = false python-versions = "*" groups = ["dev"] -markers = "sys_platform != \"win32\" and sys_platform != \"emscripten\" or os_name != \"nt\"" +markers = "os_name != \"nt\" or sys_platform != \"win32\" and sys_platform != \"emscripten\"" files = [ {file = "ptyprocess-0.7.0-py2.py3-none-any.whl", hash = "sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35"}, {file = "ptyprocess-0.7.0.tar.gz", hash = "sha256:5c5d0a3b48ceee0b48485e0c26037c0acd7d29765ca3fbb5cb3831d347423220"}, @@ -2673,23 +3950,42 @@ version = "3.0" description = "C parser in Python" optional = false python-versions = ">=3.10" -groups = ["dev"] -markers = "implementation_name != \"PyPy\"" +groups = ["dev", "floris"] files = [ {file = "pycparser-3.0-py3-none-any.whl", hash = "sha256:b727414169a36b7d524c1c3e31839a521725078d7b2ff038656844266160a992"}, {file = "pycparser-3.0.tar.gz", hash = "sha256:600f49d217304a5902ac3c37e1281c9fe94e4d0489de643a9504c5cdfdfc6b29"}, ] +markers = {dev = "implementation_name != \"PyPy\"", floris = "implementation_name == \"pypy\""} + +[[package]] +name = "pydoe3" +version = "1.6.2" +description = "Design of experiments for Python" +optional = false +python-versions = "*" +groups = ["floris"] +files = [ + {file = "pydoe3-1.6.2-py2.py3-none-any.whl", hash = "sha256:21b5c3ef10a350bed01f59df54ae262fd1eda9983efac294b679988f311f3445"}, + {file = "pydoe3-1.6.2.tar.gz", hash = "sha256:ff7377c30e0a2ea8af3f074723488779f557457c8b74029965896c30b8a1a541"}, +] + +[package.dependencies] +numpy = "*" +scipy = "*" + +[package.extras] +docs = ["mkdocs (>=1.6.1)", "mkdocs-material (>=9.6.22)", "mkdocs-minify-plugin (>=0.8.0)", "mkdocstrings[python] (>=0.30.1)", "pymdown-extensions (>=10.16.1)"] [[package]] name = "pygments" -version = "2.19.2" +version = "2.20.0" description = "Pygments is a syntax highlighting package written in Python." optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" groups = ["dev"] files = [ - {file = "pygments-2.19.2-py3-none-any.whl", hash = "sha256:86540386c03d588bb81d44bc3928634ff26449851e99741617ecb9037ee5ec0b"}, - {file = "pygments-2.19.2.tar.gz", hash = "sha256:636cb2477cec7f8952536970bc533bc43743542f70392ae026374600add5b887"}, + {file = "pygments-2.20.0-py3-none-any.whl", hash = "sha256:81a9e26dd42fd28a23a2d169d86d7ac03b46e2f8b59ed4698fb4785f946d0176"}, + {file = "pygments-2.20.0.tar.gz", hash = "sha256:6757cd03768053ff99f3039c1a36d6c0aa0b263438fcab17520b30a303a82b5f"}, ] [package.extras] @@ -2701,7 +3997,7 @@ version = "3.3.2" description = "pyparsing - Classes and methods to define and execute parsing grammars" optional = false python-versions = ">=3.9" -groups = ["examples"] +groups = ["examples", "floris"] files = [ {file = "pyparsing-3.3.2-py3-none-any.whl", hash = "sha256:850ba148bd908d7e2411587e247a1e4f0327839c40e2e5e6d05a007ecc69911d"}, {file = "pyparsing-3.3.2.tar.gz", hash = "sha256:c777f4d763f140633dcb6d8a3eda953bf7a214dc4eff598413c070bcdc117cbc"}, @@ -2710,6 +4006,22 @@ files = [ [package.extras] diagrams = ["jinja2", "railroad-diagrams"] +[[package]] +name = "pyreadline3" +version = "3.5.6" +description = "A python implementation of GNU readline." +optional = false +python-versions = ">=3.8" +groups = ["floris"] +markers = "sys_platform == \"win32\"" +files = [ + {file = "pyreadline3-3.5.6-py3-none-any.whl", hash = "sha256:8449b734232e42a5dcd74048e39b60db2839a4c38cf3ae2bf7707d58b5389c0d"}, + {file = "pyreadline3-3.5.6.tar.gz", hash = "sha256:61e53218b99656091ddb077df9e71f25850e72e030b6183b39c9b7e6e4f4a9bf"}, +] + +[package.extras] +dev = ["build", "flake8", "mypy", "pytest", "twine"] + [[package]] name = "pytest" version = "7.4.4" @@ -2733,13 +4045,41 @@ tomli = {version = ">=1.0.0", markers = "python_version < \"3.11\""} [package.extras] testing = ["argcomplete", "attrs (>=19.2.0)", "hypothesis (>=3.56)", "mock", "nose", "pygments (>=2.7.2)", "requests", "setuptools", "xmlschema"] +[[package]] +name = "python-benedict" +version = "0.38.0" +description = "python-benedict is a dict subclass with keylist/keypath/keyattr support, normalized I/O operations (base64, csv, ini, json, pickle, plist, query-string, toml, xls, xml, yaml) and many utilities... for humans, obviously." +optional = false +python-versions = "*" +groups = ["floris"] +files = [ + {file = "python_benedict-0.38.0-py3-none-any.whl", hash = "sha256:5f4cbdfdda245d3f2899a7fd9d59ee68e69e6d1e0d57693f8626f186a11fcc6b"}, + {file = "python_benedict-0.38.0.tar.gz", hash = "sha256:71e066b73f15d2231927b3021469a1db57a3e96092a99917018b63f51329e49c"}, +] + +[package.dependencies] +python-slugify = ">=7.0.0,<9.0.0" +typing_extensions = ">=4.13.2,<4.16.0" + +[package.extras] +all = ["python-benedict[io,parse,s3,schema]"] +html = ["beautifulsoup4 (>=4.12.0,<5.0.0)", "python-benedict[xml]"] +io = ["python-benedict[html,toml,xls,xml,yaml]", "python-fsutil (>=0.17.0,<1.0.0)", "requests (>=2.33.0,<3.0.0)"] +parse = ["ftfy (>=6.0.0,<7.0.0)", "mailchecker (>=4.1.0,<7.0.0)", "phonenumbers (>=8.12.0,<10.0.0)", "python-dateutil (>=2.8.0,<3.0.0)"] +s3 = ["boto3 (>=1.24.89,<2.0.0)", "python-fsutil (>=0.17.0,<1.0.0)"] +schema = ["pydantic (>=2.0.0,<3.0.0)"] +toml = ["tomli (>=2.0.0,<3.0.0) ; python_version < \"3.11\"", "tomli-w (>=1.0.0,<2.0.0)"] +xls = ["openpyxl (>=3.0.0,<4.0.0)", "python-fsutil (>=0.17.0,<1.0.0)", "xlrd (>=2.0.0,<3.0.0)"] +xml = ["xmltodict (>=0.12.0,<2.0.0)"] +yaml = ["pyyaml (>=6.0,<7.0)"] + [[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" -groups = ["dev", "examples"] +groups = ["dev", "examples", "floris"] 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"}, @@ -2750,44 +4090,74 @@ six = ">=1.5" [[package]] name = "python-json-logger" -version = "4.0.0" +version = "4.1.0" description = "JSON Log Formatter for the Python Logging Package" optional = false -python-versions = ">=3.8" +python-versions = ">=3.10" groups = ["dev"] files = [ - {file = "python_json_logger-4.0.0-py3-none-any.whl", hash = "sha256:af09c9daf6a813aa4cc7180395f50f2a9e5fa056034c9953aec92e381c5ba1e2"}, - {file = "python_json_logger-4.0.0.tar.gz", hash = "sha256:f58e68eb46e1faed27e0f574a55a0455eecd7b8a5b88b85a784519ba3cff047f"}, + {file = "python_json_logger-4.1.0-py3-none-any.whl", hash = "sha256:132994765cf75bf44554be9aa49b06ef2345d23661a96720262716438141b6b2"}, + {file = "python_json_logger-4.1.0.tar.gz", hash = "sha256:b396b9e3ed782b09ff9d6e4f1683d46c83ad0d35d2e407c09a9ebbf038f88195"}, +] + +[package.extras] +dev = ["black", "build", "freezegun", "mdx_truly_sane_lists", "mike", "mkdocs", "mkdocs-awesome-pages-plugin", "mkdocs-gen-files", "mkdocs-literate-nav", "mkdocs-material (>=8.5)", "mkdocstrings[python]", "msgspec ; implementation_name != \"pypy\"", "mypy", "orjson ; implementation_name != \"pypy\"", "pylint", "pytest", "tzdata", "validate-pyproject[all]"] + +[[package]] +name = "python-slugify" +version = "8.0.4" +description = "A Python slugify application that also handles Unicode" +optional = false +python-versions = ">=3.7" +groups = ["floris"] +files = [ + {file = "python-slugify-8.0.4.tar.gz", hash = "sha256:59202371d1d05b54a9e7720c5e038f928f45daaffe41dd10822f3907b937c856"}, + {file = "python_slugify-8.0.4-py2.py3-none-any.whl", hash = "sha256:276540b79961052b66b7d116620b36518847f52d5fd9e3a70164fc8c50faa6b8"}, ] +[package.dependencies] +text-unidecode = ">=1.3" + [package.extras] -dev = ["backports.zoneinfo ; python_version < \"3.9\"", "black", "build", "freezegun", "mdx_truly_sane_lists", "mike", "mkdocs", "mkdocs-awesome-pages-plugin", "mkdocs-gen-files", "mkdocs-literate-nav", "mkdocs-material (>=8.5)", "mkdocstrings[python]", "msgspec ; implementation_name != \"pypy\"", "mypy", "orjson ; implementation_name != \"pypy\"", "pylint", "pytest", "tzdata", "validate-pyproject[all]"] +unidecode = ["Unidecode (>=1.1.1)"] + +[[package]] +name = "pytz" +version = "2026.3.post1" +description = "World timezone definitions, modern and historical" +optional = false +python-versions = "*" +groups = ["floris"] +markers = "python_version < \"3.11\"" +files = [ + {file = "pytz-2026.3.post1-py2.py3-none-any.whl", hash = "sha256:dd95840dd199baea12d9cc096a1d452caa6596a1c1e4b5f3dbd1541855d5e815"}, + {file = "pytz-2026.3.post1.tar.gz", hash = "sha256:2211d3fcf9a797d3405cac96ac7f61d80e6a644f72a3309607282fe8a2010c5d"}, +] [[package]] name = "pywinpty" -version = "3.0.3" +version = "3.0.5" description = "Pseudo terminal support for Windows from Python." optional = false -python-versions = ">=3.9" +python-versions = ">=3.10" groups = ["dev"] markers = "os_name == \"nt\"" files = [ - {file = "pywinpty-3.0.3-cp310-cp310-win_amd64.whl", hash = "sha256:ff05f12d775b142b11c6fe085129bdd759b61cf7d41da6c745e78e3a1ef5bf40"}, - {file = "pywinpty-3.0.3-cp310-cp310-win_arm64.whl", hash = "sha256:340ccacb4d74278a631923794ccd758471cfc8eeeeee4610b280420a17ad1e82"}, - {file = "pywinpty-3.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:dff25a9a6435f527d7c65608a7e62783fc12076e7d44487a4911ee91be5a8ac8"}, - {file = "pywinpty-3.0.3-cp311-cp311-win_arm64.whl", hash = "sha256:fbc1e230e5b193eef4431cba3f39996a288f9958f9c9f092c8a961d930ee8f68"}, - {file = "pywinpty-3.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:c9081df0e49ffa86d15db4a6ba61530630e48707f987df42c9d3313537e81fc0"}, - {file = "pywinpty-3.0.3-cp312-cp312-win_arm64.whl", hash = "sha256:15e79d870e18b678fb8a5a6105fd38496b55697c66e6fc0378236026bc4d59e9"}, - {file = "pywinpty-3.0.3-cp313-cp313-win_amd64.whl", hash = "sha256:9c91dbb026050c77bdcef964e63a4f10f01a639113c4d3658332614544c467ab"}, - {file = "pywinpty-3.0.3-cp313-cp313-win_arm64.whl", hash = "sha256:fe1f7911805127c94cf51f89ab14096c6f91ffdcacf993d2da6082b2142a2523"}, - {file = "pywinpty-3.0.3-cp313-cp313t-win_amd64.whl", hash = "sha256:3f07a6cf1c1d470d284e614733c3d0f726d2c85e78508ea10a403140c3c0c18a"}, - {file = "pywinpty-3.0.3-cp313-cp313t-win_arm64.whl", hash = "sha256:15c7c0b6f8e9d87aabbaff76468dabf6e6121332c40fc1d83548d02a9d6a3759"}, - {file = "pywinpty-3.0.3-cp314-cp314-win_amd64.whl", hash = "sha256:d4b6b7b0fe0cdcd02e956bd57cfe9f4e5a06514eecf3b5ae174da4f951b58be9"}, - {file = "pywinpty-3.0.3-cp314-cp314-win_arm64.whl", hash = "sha256:34789d685fc0d547ce0c8a65e5a70e56f77d732fa6e03c8f74fefb8cbb252019"}, - {file = "pywinpty-3.0.3-cp314-cp314t-win_amd64.whl", hash = "sha256:0c37e224a47a971d1a6e08649a1714dac4f63c11920780977829ed5c8cadead1"}, - {file = "pywinpty-3.0.3-cp314-cp314t-win_arm64.whl", hash = "sha256:c4e9c3dff7d86ba81937438d5819f19f385a39d8f592d4e8af67148ceb4f6ab5"}, - {file = "pywinpty-3.0.3-cp39-cp39-win_amd64.whl", hash = "sha256:0f10e81d52d7f2c4d927f645f247028e64eaf205a3ed9e64dbd998122108a218"}, - {file = "pywinpty-3.0.3.tar.gz", hash = "sha256:523441dc34d231fb361b4b00f8c99d3f16de02f5005fd544a0183112bcc22412"}, + {file = "pywinpty-3.0.5-cp310-cp310-win_amd64.whl", hash = "sha256:b467dcad72365bc2205ed8b6e694e817d71de269d46e56cfe267dfa9d3d30e1b"}, + {file = "pywinpty-3.0.5-cp310-cp310-win_arm64.whl", hash = "sha256:7dc4046ea8e4d7f0a16dae8dfcaeeda6df7ca3a9330444d2ba5bb96138fe0a91"}, + {file = "pywinpty-3.0.5-cp311-cp311-win_amd64.whl", hash = "sha256:af7a8720c78776ddd6259b71dd567944f766a6cd67f8d2887fbc4973967bacda"}, + {file = "pywinpty-3.0.5-cp311-cp311-win_arm64.whl", hash = "sha256:c2406f54f699eab75953fb75ce805f2ae55a33a957cd070890abd454fb4b7680"}, + {file = "pywinpty-3.0.5-cp312-cp312-win_amd64.whl", hash = "sha256:d62946adf14b15b54c0b8d785f93fe18b04da23f4ad59e2e8c4612646e9abd23"}, + {file = "pywinpty-3.0.5-cp312-cp312-win_arm64.whl", hash = "sha256:e9391c05fbfa7a992a97e831fc6849887b4014a614192e3d984a7ca59592b376"}, + {file = "pywinpty-3.0.5-cp313-cp313-win_amd64.whl", hash = "sha256:48db1b0ad9d0a1b81dcaaa7163a99a7808deaceb0c1b2344716dc1fc090c3c4c"}, + {file = "pywinpty-3.0.5-cp313-cp313-win_arm64.whl", hash = "sha256:2c6008fb2d3774b48693b2fcb7f2cc317ade9dc581289a964ffeeaf81307c9b5"}, + {file = "pywinpty-3.0.5-cp313-cp313t-win_amd64.whl", hash = "sha256:22ce1b780d89821cc52daf6eac0708af22d93d000ce9c7c07e37489db8594598"}, + {file = "pywinpty-3.0.5-cp313-cp313t-win_arm64.whl", hash = "sha256:9c2919a81bc5cfb09b86fc5a002112b2de95ca4304a07413cbeeb746a1307a5c"}, + {file = "pywinpty-3.0.5-cp314-cp314-win_amd64.whl", hash = "sha256:03bb3c16d691d9242267201830bcd0e64a9b663170e9042bc84b210da9de15ac"}, + {file = "pywinpty-3.0.5-cp314-cp314-win_arm64.whl", hash = "sha256:89c5c6ef08997a3b4b277b214a35fe15cab4dd6d119f0140aa71df5b1168fdbc"}, + {file = "pywinpty-3.0.5-cp314-cp314t-win_amd64.whl", hash = "sha256:7b566165e0c5fdd6abe167a5ac8b954be6a843eb55a85946576d6bc1dea03d6d"}, + {file = "pywinpty-3.0.5-cp314-cp314t-win_arm64.whl", hash = "sha256:24366280a8aa677323da87bec729cb3ea3b35367386cece0978bdc6e4695c690"}, + {file = "pywinpty-3.0.5.tar.gz", hash = "sha256:61db0db063de9865adbea66db294628f8577f608d9764a4c7d3384eeacc4e81b"}, ] [[package]] @@ -2796,7 +4166,7 @@ version = "6.0.3" description = "YAML parser and emitter for Python" optional = false python-versions = ">=3.8" -groups = ["main", "dev"] +groups = ["main", "dev", "floris"] files = [ {file = "PyYAML-6.0.3-cp38-cp38-macosx_10_13_x86_64.whl", hash = "sha256:c2514fceb77bc5e7a2f7adfaa1feb2fb311607c9cb518dbc378688ec73d8292f"}, {file = "PyYAML-6.0.3-cp38-cp38-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9c57bb8c96f6d1808c030b1687b9b5fb476abaa47f0db9c0101f5e9f394e97f4"}, @@ -2879,7 +4249,7 @@ version = "27.1.0" description = "Python bindings for 0MQ" optional = false python-versions = ">=3.8" -groups = ["dev"] +groups = ["dev", "floris"] files = [ {file = "pyzmq-27.1.0-cp310-cp310-macosx_10_15_universal2.whl", hash = "sha256:508e23ec9bc44c0005c4946ea013d9317ae00ac67778bd47519fdf5a0e930ff4"}, {file = "pyzmq-27.1.0-cp310-cp310-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:507b6f430bdcf0ee48c0d30e734ea89ce5567fd7b8a0f0044a369c176aa44556"}, @@ -2984,7 +4354,7 @@ version = "0.37.0" description = "JSON Referencing + Python" optional = false python-versions = ">=3.10" -groups = ["dev"] +groups = ["dev", "floris"] files = [ {file = "referencing-0.37.0-py3-none-any.whl", hash = "sha256:381329a9f99628c9069361716891d34ad94af76e461dcb0335825aecc7692231"}, {file = "referencing-0.37.0.tar.gz", hash = "sha256:44aefc3142c5b842538163acb373e24cce6632bd54bdb01b21ad5863489f50d8"}, @@ -2997,25 +4367,25 @@ typing-extensions = {version = ">=4.4.0", markers = "python_version < \"3.13\""} [[package]] name = "requests" -version = "2.32.5" +version = "2.34.2" description = "Python HTTP for Humans." optional = false -python-versions = ">=3.9" -groups = ["dev"] +python-versions = ">=3.10" +groups = ["dev", "floris"] files = [ - {file = "requests-2.32.5-py3-none-any.whl", hash = "sha256:2462f94637a34fd532264295e186976db0f5d453d1cdd31473c85a6a161affb6"}, - {file = "requests-2.32.5.tar.gz", hash = "sha256:dbba0bac56e100853db0ea71b82b4dfd5fe2bf6d3754a8893c3af500cec7d7cf"}, + {file = "requests-2.34.2-py3-none-any.whl", hash = "sha256:2a0d60c172f83ac6ab31e4554906c0f3b3588d37b5cb939b1c061f4907e278e0"}, + {file = "requests-2.34.2.tar.gz", hash = "sha256:f288924cae4e29463698d6d60bc6a4da69c89185ad1e0bcc4104f584e960b9ed"}, ] [package.dependencies] -certifi = ">=2017.4.17" +certifi = ">=2023.5.7" charset_normalizer = ">=2,<4" idna = ">=2.5,<4" -urllib3 = ">=1.21.1,<3" +urllib3 = ">=1.26,<3" [package.extras] socks = ["PySocks (>=1.5.6,!=1.5.7)"] -use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] +use-chardet-on-py3 = ["chardet (>=3.0.2,<8)"] [[package]] name = "rfc3339-validator" @@ -3062,13 +4432,82 @@ lark = ">=1.2.2" [package.extras] testing = ["pytest (>=8.3.5)"] +[[package]] +name = "rosco" +version = "2.10.4" +description = "A reference open source controller toolset for wind turbine applications." +optional = false +python-versions = ">=3.9" +groups = ["floris"] +files = [ + {file = "rosco-2.10.4-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:58b8744a6a8c66a16fb48c27b2846320cfc26b03bb5533581184543459ce804f"}, + {file = "rosco-2.10.4-cp310-cp310-macosx_15_0_arm64.whl", hash = "sha256:b6e932f0c6e2055950dfa81b1d5c10a5ce4278f5bd71f5cf52a3363c1938f574"}, + {file = "rosco-2.10.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a40d9aee6618d95b0a8f9bccbfcd3c30d62daa847f699a14b1f8c4848b19b136"}, + {file = "rosco-2.10.4-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1e98960b71fc0e1b72a56b47974b8f11cc850df976e305e7705567e37a6843bb"}, + {file = "rosco-2.10.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8bb08688239e6a8fe97e82cb86003cc30825600e0fbbd06c5244d980bd1b67ed"}, + {file = "rosco-2.10.4-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:bb43839d10b87d45320d930b2a7632f8257d3df74070cce336c0a21f1216e6d0"}, + {file = "rosco-2.10.4-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:798759543f92dfbf0ab3be304f7d5a758c709702eb8529cc229699a496a2bb22"}, + {file = "rosco-2.10.4-cp310-cp310-win_amd64.whl", hash = "sha256:9d7d9b3c376b3dd7a5065b323e53382168908797acdf5c56341f9b9784513613"}, + {file = "rosco-2.10.4-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:bbc0eb6d2d743ee001329a3dffb05c2a9f16c7a12117d21f1240b5b55826f7d1"}, + {file = "rosco-2.10.4-cp311-cp311-macosx_15_0_arm64.whl", hash = "sha256:1d623e9747bd416798edcb915f9c7aabc11e2ba606479f41dc630f05979d9fe8"}, + {file = "rosco-2.10.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7b91f51ba2a7cb91e3e14e7f21099df075c5667dccd877c789386c63ad45fc0c"}, + {file = "rosco-2.10.4-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:764b5d07c63c30b22eff9b9b361b3468cde114568767f725febfffe96f8f9091"}, + {file = "rosco-2.10.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d3f4301427aabfd2764c65786cd058e975a986ccc52883ff0bdabcc58f182113"}, + {file = "rosco-2.10.4-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:1e45628f6e95ccb2e2a83fa4039a95fc0e3254cb8c7a6873076fa0e26d013381"}, + {file = "rosco-2.10.4-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f19795c0b8fb08d60aa9bf8077faee59d07228e32554eb70af5eaef3ab82c803"}, + {file = "rosco-2.10.4-cp311-cp311-win_amd64.whl", hash = "sha256:cdd8e01aff72f553dd4f112deeed33984b681e44598d33c3f5d70a6441f68b03"}, + {file = "rosco-2.10.4-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:3cef4ebad5fa6c1c110154a8cc212c721c8c162ff0875196500979dbfa9e0b54"}, + {file = "rosco-2.10.4-cp312-cp312-macosx_15_0_arm64.whl", hash = "sha256:3a79547b516c899a2db1bc446a64d7b01d25a1d4cc6f058e073e7b126489a803"}, + {file = "rosco-2.10.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7103499a61bbc2a8510423ac5a43840372983dd7d1bf99cbe99fcde1cec621e4"}, + {file = "rosco-2.10.4-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d795a2f1615a3ff281a36f62132ed24e1791726ad7c8a66bf4c4897315c6e4e8"}, + {file = "rosco-2.10.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ef54a8570861b0a5e5ff030d5b50ea19ba1fcd4e614c8b14124b54b2fa4e988d"}, + {file = "rosco-2.10.4-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:776a234aab93a0f510eb4b62f5d3448b4d682e20029305c370f1c41678fde539"}, + {file = "rosco-2.10.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:03e7ce8282e821fd23d2cf0f933f2a207f2a9611d29e0477890b398d354dc8c4"}, + {file = "rosco-2.10.4-cp312-cp312-win_amd64.whl", hash = "sha256:c85a25eb99aa230670020aad3a9cd17fdb0fc05a35ee5828cdee71060cd89e32"}, + {file = "rosco-2.10.4-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:8d3bf944755ad7c0516238a9b009b5f7990106e6a6aa55ed2d98f3ed514af116"}, + {file = "rosco-2.10.4-cp313-cp313-macosx_15_0_arm64.whl", hash = "sha256:3b70954bd965278c3e3cc88bb5cfc1a49782fed0ec3214bd81cda0206d52a555"}, + {file = "rosco-2.10.4-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9651f32435789135b7d1a0f29b335bb82e07cd87e6aaa63d5c39e49752f48ad3"}, + {file = "rosco-2.10.4-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f34bac456efab5be143f2574f832d507c8583129d7311d8ac87b8c34c4cd3764"}, + {file = "rosco-2.10.4-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1d152646cb400db753efecc786a24b6b028b1d83b4bed0c45d5fe6b0235f3a1d"}, + {file = "rosco-2.10.4-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:b1c2791e865b23c703fbb9bf0a169e2814aedc785f0fa533079fdd09bcaa63fd"}, + {file = "rosco-2.10.4-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4220572d09b31b27603d3a7ef3fff263dccbdfbfbf4268713600d5db8997adf9"}, + {file = "rosco-2.10.4-cp313-cp313-win_amd64.whl", hash = "sha256:41661ac2089bb6cfaec2399bb9c45dbae4e0f8b3050bbc9c618839cef1f84e80"}, + {file = "rosco-2.10.4-cp39-cp39-macosx_14_0_arm64.whl", hash = "sha256:74f509eb0415ca5729f508ae783f178568367f5e45950bf3c69513d3f2248f75"}, + {file = "rosco-2.10.4-cp39-cp39-macosx_15_0_arm64.whl", hash = "sha256:0d2002d3a392a285959adcf93990c209632b589099cd6387f4eebf41e549d26b"}, + {file = "rosco-2.10.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f3aa0b894715242fb9191f2f10e80fed8a53ae9ad361b2346e2028ab73b79831"}, + {file = "rosco-2.10.4-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:133486ba634d0e47d5d756794b91a62778e2ad94d31aad44e6d33235f40c9765"}, + {file = "rosco-2.10.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d40b16110cc8ee5aed206dc839eee92f62377ecb7b661d5eab560128ecfee653"}, + {file = "rosco-2.10.4-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:be7f9c7500c2a57899ced8431a1f76b06a32c4f030035914bfb30c3e40961a52"}, + {file = "rosco-2.10.4-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:632d3dd73a8a7444bc1aad841beda7f5e99839b7009d8d2bdffd64045c6c6c49"}, + {file = "rosco-2.10.4-cp39-cp39-win_amd64.whl", hash = "sha256:9275097a862b263feceed0543dea3d8f81ee89512314c108328c8bdb46e677ad"}, + {file = "rosco-2.10.4.tar.gz", hash = "sha256:15e06f46bd8096dfa6f8cab7b312dacdfe3a88ad3f20fef9f320621cae462aaf"}, +] + +[package.dependencies] +control = "*" +matplotlib = "*" +numpy = "*" +openfast_io = "*" +pandas = "*" +pyparsing = "*" +pyYAML = "*" +pyzmq = "*" +"ruamel.yaml" = "*" +scipy = "*" +wisdem = "*" + +[package.extras] +dev = ["cmake"] +test = ["pytest", "treon"] + [[package]] name = "rpds-py" version = "0.30.0" description = "Python bindings to Rust's persistent data structures (rpds)" optional = false python-versions = ">=3.10" -groups = ["dev"] +groups = ["dev", "floris"] +markers = "python_version < \"3.11\"" files = [ {file = "rpds_py-0.30.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:679ae98e00c0e8d68a7fda324e16b90fd5260945b45d3b824c892cec9eea3288"}, {file = "rpds_py-0.30.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:4cc2206b76b4f576934f0ed374b10d7ca5f457858b157ca52064bdfc26b9fc00"}, @@ -3187,6 +4626,151 @@ files = [ {file = "rpds_py-0.30.0.tar.gz", hash = "sha256:dd8ff7cf90014af0c0f787eea34794ebf6415242ee1d6fa91eaba725cc441e84"}, ] +[[package]] +name = "rpds-py" +version = "2026.6.3" +description = "Python bindings to Rust's persistent data structures (rpds)" +optional = false +python-versions = ">=3.11" +groups = ["dev", "floris"] +markers = "python_version >= \"3.11\"" +files = [ + {file = "rpds_py-2026.6.3-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:7b689145a1485c335569bd056464f3243a29af7ed3871c7be31ad624ba239bc7"}, + {file = "rpds_py-2026.6.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:db08f45aecde626498fb3df07bcf6d2ec040af42e859a4f5040d79c200342911"}, + {file = "rpds_py-2026.6.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:acc992ab27b15f852c76755eb2ab7dce86585ddadba6fa5946e58556088845b4"}, + {file = "rpds_py-2026.6.3-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7f88d653e7b3b779d71ae7454e20dcc9b6bae903f33c269db9f2be41bda3f261"}, + {file = "rpds_py-2026.6.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e52655eaf81e32593abedaa4bfe33170c8cfedf3365ed9be6e11e07f148f0278"}, + {file = "rpds_py-2026.6.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dfcc8b909769d19db55c7cc9541eb64b9b774b1057ffffb4f1048070475bb9f9"}, + {file = "rpds_py-2026.6.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9c1255b302953c86a486b81d330d5ee1d5bd937691ce271b6be0ef0e299eaab7"}, + {file = "rpds_py-2026.6.3-cp311-cp311-manylinux_2_31_riscv64.whl", hash = "sha256:8d2294a31386bfa251d8c8a39472beee17db67d4f1a6eabea665d35c9a4461c3"}, + {file = "rpds_py-2026.6.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f8f23ead891a3b762f35ab3b04623da7056545b48aa60d59957e6789914545da"}, + {file = "rpds_py-2026.6.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:421aba32367055614287a4292b6a17f1939c9452299f7a0209c117e990b646d4"}, + {file = "rpds_py-2026.6.3-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:1e5822dfc2f0d4ab7e745eaa6d85945069329beeccef965af3f3bb26058fcab6"}, + {file = "rpds_py-2026.6.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:83e35b57523816c8613fd0776b40cd8bb9f596b37ddd2692eb4a6bb5ab2f8c93"}, + {file = "rpds_py-2026.6.3-cp311-cp311-win32.whl", hash = "sha256:de3eceba0b683bcbb1ab93da016d0270df1f9ae7be716b40214c5dafac6ea45a"}, + {file = "rpds_py-2026.6.3-cp311-cp311-win_amd64.whl", hash = "sha256:2c54a076ca4d370980ab57bc0e31df57bbe8d41340436a90ef8b1219a3cbb127"}, + {file = "rpds_py-2026.6.3-cp311-cp311-win_arm64.whl", hash = "sha256:168c733a7112e071bb7a66460e667edfcff06c017a3c523f7a8a8e08d0140804"}, + {file = "rpds_py-2026.6.3-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:a0811d33247c3d6128a3001d763f2aa056bb3425204335400ac54f89eec3a0d0"}, + {file = "rpds_py-2026.6.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:538949e262e46caa31ac01bdb3c1e8f642622922cacbabbae6a8445d9dc33eaf"}, + {file = "rpds_py-2026.6.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:55927d532399c2c646100ff7feb48eaa940ad70f42cd68e1328f3ded9f81ca24"}, + {file = "rpds_py-2026.6.3-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f56f1695bc5c0871cbc33dc0130fcf503aab0c57dcc5a6700a4f49eba4f2652e"}, + {file = "rpds_py-2026.6.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:270b293dae9058fc9fcedab50f13cebf46fb8ed1d1d54e0521a9da5d6b211975"}, + {file = "rpds_py-2026.6.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:127565fead0a10943b282957bd5447804ff3160ad79f2ad2635e6d249e380680"}, + {file = "rpds_py-2026.6.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ecabd69db66de867690f9797f2f8fa27ba501bbc24540cbdbdc649cd15888ba6"}, + {file = "rpds_py-2026.6.3-cp312-cp312-manylinux_2_31_riscv64.whl", hash = "sha256:58eadac9cd119677b60e1cf8ac4052f35949d71b8a9e5556efccbe82533cf22a"}, + {file = "rpds_py-2026.6.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:7491ee23305ac3eb59e492b6945881f5cd77a6f731061a3f25b77fd40f9e99a4"}, + {file = "rpds_py-2026.6.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:2c99f7e8ccb3dd6e3e4bfeac657a7b208c9bac8075f4b078c02d7404c34107fa"}, + {file = "rpds_py-2026.6.3-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:62698275682bf121181861295c9181e789030a2d516071f5b8f3c23c170cd0fc"}, + {file = "rpds_py-2026.6.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:a214c993455f99a89aaeadc9b21241900037adc9d97203e374d75513c5911822"}, + {file = "rpds_py-2026.6.3-cp312-cp312-win32.whl", hash = "sha256:501f9f04a588d6a09179368c57071301445191767c64e4b52a6aa9871f1ef5ed"}, + {file = "rpds_py-2026.6.3-cp312-cp312-win_amd64.whl", hash = "sha256:2c958bf94822e9290a40aaf2a822d4bc5c88099093e3948ad6c571eca9272e5f"}, + {file = "rpds_py-2026.6.3-cp312-cp312-win_arm64.whl", hash = "sha256:22bffe6042b9bcb0822bcd1955ec00e245daf17b4344e4ed8e9551b976b63e96"}, + {file = "rpds_py-2026.6.3-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:3cfe765c1da0072636ca06628261e0ea05688e160d5c8a03e0217c3854037223"}, + {file = "rpds_py-2026.6.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f4d78253f6996be4901669ad25319f842f740eccf4d58e3c7f3dd39e6dde1d8f"}, + {file = "rpds_py-2026.6.3-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:54f45a148e28767bf343d33a684693c70e451c6f4c0e9904709a723fafbdfc1f"}, + {file = "rpds_py-2026.6.3-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:842e7b070435622248c7a2c44ae53fa1440e073cc3023bc919fed570884097a7"}, + {file = "rpds_py-2026.6.3-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8020133a74bd81b4572dd8e4be028a6b1ebcd70e6726edc3918008c08bee6ee6"}, + {file = "rpds_py-2026.6.3-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cdc7e35386f3847df728fbcb5e887e2d79c19e2fa1eba9e51b6621d23e3243af"}, + {file = "rpds_py-2026.6.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:acac386b453c2516111b50985d60ce46e7fadb5ea71ae7b25f4c946935bf27cf"}, + {file = "rpds_py-2026.6.3-cp313-cp313-manylinux_2_31_riscv64.whl", hash = "sha256:425560c6fa0415f27261727bb20bd097568485e5eb0c121f1949417d1c516885"}, + {file = "rpds_py-2026.6.3-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a550fb4950a06dde3beb4721f5ad4b25bf4513784665b0a8522c792e2bd822a4"}, + {file = "rpds_py-2026.6.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:4f4bca01b63096f606e095734dd56e74e175f94cfbf24ff3d63281cec61f7bb7"}, + {file = "rpds_py-2026.6.3-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:ccffae9a092a00deb7efd545fe5e2c33c33b88e7c054337e9a74c179347d0b7d"}, + {file = "rpds_py-2026.6.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:1cf01971c4f2c5553b772a542e4aaf191789cd331bc2cd4ff0e6e65ba49e1e97"}, + {file = "rpds_py-2026.6.3-cp313-cp313-win32.whl", hash = "sha256:8c3d1e9c15b9d51ca0391e13da1a25a0a4df3c58a37c9dc368e0736cf7f69df0"}, + {file = "rpds_py-2026.6.3-cp313-cp313-win_amd64.whl", hash = "sha256:9250a9a0a6fd4648b3f868da8d91a4c52b5811a62df58e753d50ae4454a36f80"}, + {file = "rpds_py-2026.6.3-cp313-cp313-win_arm64.whl", hash = "sha256:900a67df3fd1660b035a4761c4ce73c382ea6b35f90f9863c36c6fd8bf8b09bb"}, + {file = "rpds_py-2026.6.3-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:931908d9fc855d8f74783377822be318edb6dcb19e47169dc038f9a1bf60b06e"}, + {file = "rpds_py-2026.6.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:d7469697dce35be237db177d42e2a2ee26e6dcc5fc052078a6fefabd288c6edd"}, + {file = "rpds_py-2026.6.3-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bcfbcf66006befb9fd2aeaa9e01feaf881b4dc330a02ba07d2322b1c11be7b5d"}, + {file = "rpds_py-2026.6.3-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:847927daf4cffbd4e90e42bc890069897101edd015f956cb8721b3473372edda"}, + {file = "rpds_py-2026.6.3-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:aca6c1ef08a82bfe327cc156da694660f599923e2e6665b6d81c9c2d0ac9ffc8"}, + {file = "rpds_py-2026.6.3-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ae50181a047c871561212bb97f7932a2d45fb53e947bd9b57ebad85b529cbc53"}, + {file = "rpds_py-2026.6.3-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dc319e5a1de4b6913aac94bf6a2f9e847371e0a140a43dd4991db1a09bc2d504"}, + {file = "rpds_py-2026.6.3-cp314-cp314-manylinux_2_31_riscv64.whl", hash = "sha256:e4316bf32babbed84e691e352faf967ce2f0f024174a8643c37c94a1080374fc"}, + {file = "rpds_py-2026.6.3-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:8c6e5a2f750cc71c3e3b11d71661f21d6f9bc6cebc6564b1466417a1ec03ec77"}, + {file = "rpds_py-2026.6.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:4470ce197d4090875cf6affbf1f853338387428df97c4fb7b7106317b8214698"}, + {file = "rpds_py-2026.6.3-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:ea964164cc9afa72d4d9b23cc28dafae93693c0a53e0b42acbff15b22c3f9ddd"}, + {file = "rpds_py-2026.6.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:639c8929aa0afe81be836b04de888460d6bed38b9c54cfc18da8f6bfabf5af5d"}, + {file = "rpds_py-2026.6.3-cp314-cp314-win32.whl", hash = "sha256:882076c00c0a608b131187055ddc5ae29f2e7eaf870d6168980420d58528a5c8"}, + {file = "rpds_py-2026.6.3-cp314-cp314-win_amd64.whl", hash = "sha256:0be972be84cfcaf46c8c6edf690ca0f154ac17babf1f6a955a51579b34ad2dc5"}, + {file = "rpds_py-2026.6.3-cp314-cp314-win_arm64.whl", hash = "sha256:2a9c6f195058cb45335e8cc3802745c603d716eb96bc9625950c1aac71c0c703"}, + {file = "rpds_py-2026.6.3-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:f90938e92afda60266da758ee7d363447f7f0138c9559f9e1811629580582d90"}, + {file = "rpds_py-2026.6.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:ec829541c45bca16e61c7ae50c20501f213605beb75d1aba91a6ee37fbbb56a4"}, + {file = "rpds_py-2026.6.3-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:afd70d95892096cdb26f15a00c45907b17817577aa8d1c76b2dcc2788391f9e9"}, + {file = "rpds_py-2026.6.3-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:29dfa0533a5d4c94d4dfa1b694fcb56c9c63aad8330ffdd816fd225d0a7a162f"}, + {file = "rpds_py-2026.6.3-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:af05d726809bff6b141be124d4c7ce998f9c9c7f30edb1f46c07aa103d540b41"}, + {file = "rpds_py-2026.6.3-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9826217f048f620d9a712672818bf231442c1b35d96b227a07eabd11b4bb6945"}, + {file = "rpds_py-2026.6.3-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:536bceea4fa4acf7e1c61da2b5786304367c816c8895be71b8f537c480b0ea1f"}, + {file = "rpds_py-2026.6.3-cp314-cp314t-manylinux_2_31_riscv64.whl", hash = "sha256:bc0011654b91cc4fb2ae701bec0a0ba1e552c0714247fa7af6c59e0ccfa3a4e1"}, + {file = "rpds_py-2026.6.3-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:539d75de9e0d536c84ff18dfeb805398e58227001ce09231a26a08b9aed1ee0e"}, + {file = "rpds_py-2026.6.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:166cf54d9f44fc6ceb53c7860258dde44a81406646de79f8ed3234fca3b6e538"}, + {file = "rpds_py-2026.6.3-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:d34c20167764fbcf927194d532dd7e0c56772f0a5f943fa5ef9e9afbba8fb9db"}, + {file = "rpds_py-2026.6.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:ea7bb13b7c9a29791f87a0387ba7d3ad3a6d783d827e4d3f27b40a0ff44495e2"}, + {file = "rpds_py-2026.6.3-cp314-cp314t-win32.whl", hash = "sha256:6de4744d05bd1aa1be4ed7ea1189e3979196808008113bbbf899a460966b925e"}, + {file = "rpds_py-2026.6.3-cp314-cp314t-win_amd64.whl", hash = "sha256:c7b9a2f8f4d8e90af72571d3d495deebdd7e3c75451f5b41719aee166e940fc2"}, + {file = "rpds_py-2026.6.3-cp315-cp315-macosx_10_12_x86_64.whl", hash = "sha256:e059c5dde6452b44424bd1834557556c226b57781dee1227af23518459722b13"}, + {file = "rpds_py-2026.6.3-cp315-cp315-macosx_11_0_arm64.whl", hash = "sha256:2f7c26fbc5acd2522b95d4177fe4710ffd8e9b20529e703ffbf8db4d93903f05"}, + {file = "rpds_py-2026.6.3-cp315-cp315-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a3086b538543802f84c843911242db20447de00d8752dd0efc936dbcf02218ba"}, + {file = "rpds_py-2026.6.3-cp315-cp315-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:8f2e5c5ee828d42cb11760761c0af6507927bec42d0ad5458f97c9203b054617"}, + {file = "rpds_py-2026.6.3-cp315-cp315-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ed0c1e5d10cdc7135537988c74a0188da68e2f3c30813ba3744ab1e42e0480f9"}, + {file = "rpds_py-2026.6.3-cp315-cp315-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8c2642a7603ec0b16ed77da4555db3b4b472341904873788327c0b0d7b95f1bb"}, + {file = "rpds_py-2026.6.3-cp315-cp315-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8e4320744c1ffdd95a603def63344bfab2d33edeab301c5007e7de9f9f5b3885"}, + {file = "rpds_py-2026.6.3-cp315-cp315-manylinux_2_31_riscv64.whl", hash = "sha256:a9f4645593036b81bbdb36b9c8e0ea0d1c3fee968c4d59db0344c14087ef143a"}, + {file = "rpds_py-2026.6.3-cp315-cp315-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e55d236be29255554da47abe5c577637db7c24a02b8b46f0ca9524c855801868"}, + {file = "rpds_py-2026.6.3-cp315-cp315-musllinux_1_2_aarch64.whl", hash = "sha256:24e9c5386e16669b674a69c156c8eeefcb578f3b3397b713b08e6d60f3c7b187"}, + {file = "rpds_py-2026.6.3-cp315-cp315-musllinux_1_2_i686.whl", hash = "sha256:c60924535c75f1566b6eb75b5c31a48a43fef04fa2d0d201acbad8a9969c6107"}, + {file = "rpds_py-2026.6.3-cp315-cp315-musllinux_1_2_x86_64.whl", hash = "sha256:38a2fea2787428f811719ceb9114cb78964a3138838320c29ac39526c79c16ba"}, + {file = "rpds_py-2026.6.3-cp315-cp315-win32.whl", hash = "sha256:d483fe17f01ad64b7bf7cc38fcefff1ca9fb83f8c2b2542b68f97ffe0611b369"}, + {file = "rpds_py-2026.6.3-cp315-cp315-win_amd64.whl", hash = "sha256:67e3a721ffc5d8d2210d3671872298c4a84e4b8035cfe42ffd7cde35d772b146"}, + {file = "rpds_py-2026.6.3-cp315-cp315-win_arm64.whl", hash = "sha256:6e84adbcf4bf841aed8116a8264b9f50b4cb3e7bd89b516122e616ac56ca269e"}, + {file = "rpds_py-2026.6.3-cp315-cp315t-macosx_10_12_x86_64.whl", hash = "sha256:ae6dd8f10bd17aad820876d24caec9efdafd80a318d16c0a48edb5e136902c6b"}, + {file = "rpds_py-2026.6.3-cp315-cp315t-macosx_11_0_arm64.whl", hash = "sha256:bdbd97738551fca3917c1bd7188bec1920bb520104f28e7e1007f9ceb17b7690"}, + {file = "rpds_py-2026.6.3-cp315-cp315t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8b95977e7211527ab0ba576e286d023389fbeeb32a6b7b771665d333c60e5342"}, + {file = "rpds_py-2026.6.3-cp315-cp315t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d15fde0e6fb0d88a60d221204873743e5d9f0b7d29165e62cd86d0413ad74ba6"}, + {file = "rpds_py-2026.6.3-cp315-cp315t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a136d453475ac0fcbda502ef1e6504bd28d6d904700915d278deeab0d00fe140"}, + {file = "rpds_py-2026.6.3-cp315-cp315t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f826877d462181e5eb1c26a0026b8d0cab05d99844ecb6d8bf3627a2ca0c0442"}, + {file = "rpds_py-2026.6.3-cp315-cp315t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:79486287de1730dbaff3dbd124d0ca4d2ef7f9d29bf2544f1f93c09b5bcbbd12"}, + {file = "rpds_py-2026.6.3-cp315-cp315t-manylinux_2_31_riscv64.whl", hash = "sha256:808345f53cb952433ca2816f1604ff3515608a81784954f38d4452acfe8e61d5"}, + {file = "rpds_py-2026.6.3-cp315-cp315t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1967debc37f64f2c4dc90a7f563aec558b471966e12adcac4e1c4240496b6ebf"}, + {file = "rpds_py-2026.6.3-cp315-cp315t-musllinux_1_2_aarch64.whl", hash = "sha256:f0840b5b17057f7fd918b76183a4b5a0635f43e14eb2ce60dce1d4ee4707ea00"}, + {file = "rpds_py-2026.6.3-cp315-cp315t-musllinux_1_2_i686.whl", hash = "sha256:faa679d19a6696fd54259ad321251ad77a13e70e03dd834daa762a44fb6196ef"}, + {file = "rpds_py-2026.6.3-cp315-cp315t-musllinux_1_2_x86_64.whl", hash = "sha256:23a439f31ccbeff1574e24889128821d1f7917470e830cf6544dced1c662262a"}, + {file = "rpds_py-2026.6.3-cp315-cp315t-win32.whl", hash = "sha256:913ca42ccad3f8cc6e292b587ae8ae49c8c823e5dce51a736252fc7c7cdfa577"}, + {file = "rpds_py-2026.6.3-cp315-cp315t-win_amd64.whl", hash = "sha256:ae3d4fe8c0b9213624fdce7279d70e3b148b682ca20719ebd193a23ebfa47324"}, + {file = "rpds_py-2026.6.3-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:4cf2d36a2357e4d07bb5a4f98801265327b48256867816cfd2ceb001e9754a8f"}, + {file = "rpds_py-2026.6.3-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:30c6dc199b24a5e3e81d50da0f00858c5bbdb2617a750395687f4339c5818171"}, + {file = "rpds_py-2026.6.3-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9891e594296ab9dada6551c8e7b387b2721f27a67eecd528412e8906247a7b90"}, + {file = "rpds_py-2026.6.3-pp311-pypy311_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b5c2dc92304aa48a4a60443b548bb12f12e119d4b72f314015e67b9e1be97fca"}, + {file = "rpds_py-2026.6.3-pp311-pypy311_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:127e08c0642d880cf32ca47ec2a4a77b901f7e2dd1ad9762adb13955d72ffcc9"}, + {file = "rpds_py-2026.6.3-pp311-pypy311_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8bb68f03f395eb793220b45c097bd4d8c32944393da0fad8b999efac0868fc8c"}, + {file = "rpds_py-2026.6.3-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a3450b693fde92133e9f51060568a4c31fcca76d5e53bbd611e689ca446517e9"}, + {file = "rpds_py-2026.6.3-pp311-pypy311_pp73-manylinux_2_31_riscv64.whl", hash = "sha256:5e8d07bddee435a2ff6f1920e18feff28d0bc4533e42f4bf6927fbd073312c41"}, + {file = "rpds_py-2026.6.3-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:3a83ae6c67b7676b9878378547ca8e93ed77a580037bcbcd1d32f739e1e6089c"}, + {file = "rpds_py-2026.6.3-pp311-pypy311_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:2bfd04c19ddbd6640de0b51894d764bd2758854d5b75bd102d2ef10cb9c293a9"}, + {file = "rpds_py-2026.6.3-pp311-pypy311_pp73-musllinux_1_2_i686.whl", hash = "sha256:ca6546b66be9dc4738b1b043d5ebd5488c66c578c5ff0fd0e8065313fe3afb76"}, + {file = "rpds_py-2026.6.3-pp311-pypy311_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:8e65860d238379ed982fd9ba690579b5e95af2f4840f99c772816dbe573cb826"}, + {file = "rpds_py-2026.6.3.tar.gz", hash = "sha256:1cebd1337c242e4ec2293e541f712b2da849b29f48f0c293684b71c0632625d4"}, +] + +[[package]] +name = "ruamel-yaml" +version = "0.19.1" +description = "ruamel.yaml is a YAML parser/emitter that supports roundtrip preservation of comments, seq/map flow style, and map key order" +optional = false +python-versions = ">=3.9" +groups = ["floris"] +files = [ + {file = "ruamel_yaml-0.19.1-py3-none-any.whl", hash = "sha256:27592957fedf6e0b62f281e96effd28043345e0e66001f97683aa9a40c667c93"}, + {file = "ruamel_yaml-0.19.1.tar.gz", hash = "sha256:53eb66cd27849eff968ebf8f0bf61f46cdac2da1d1f3576dd4ccee9b25c31993"}, +] + +[package.extras] +docs = ["mercurial (>5.7)", "ryd"] +jinja2 = ["ruamel.yaml.jinja2 (>=0.2)"] +libyaml = ["ruamel.yaml.clibz (>=0.3.7) ; platform_python_implementation == \"CPython\""] +oldlibyaml = ["ruamel.yaml.clib ; platform_python_implementation == \"CPython\""] + [[package]] name = "ruff" version = "0.1.15" @@ -3220,8 +4804,8 @@ version = "1.15.3" description = "Fundamental algorithms for scientific computing in Python" optional = false python-versions = ">=3.10" -groups = ["main"] -markers = "python_version < \"3.14\"" +groups = ["main", "floris"] +markers = "python_version < \"3.11\"" files = [ {file = "scipy-1.15.3-cp310-cp310-macosx_10_13_x86_64.whl", hash = "sha256:a345928c86d535060c9c2b25e71e87c39ab2f22fc96e9636bd74d1dbf9de448c"}, {file = "scipy-1.15.3-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:ad3432cb0f9ed87477a8d97f03b763fd1d57709f1bbde3c9369b1dff5503b253"}, @@ -3285,8 +4869,8 @@ version = "1.17.1" description = "Fundamental algorithms for scientific computing in Python" optional = false python-versions = ">=3.11" -groups = ["main"] -markers = "python_version >= \"3.14\"" +groups = ["main", "floris"] +markers = "python_version == \"3.11\"" files = [ {file = "scipy-1.17.1-cp311-cp311-macosx_10_14_x86_64.whl", hash = "sha256:1f95b894f13729334fb990162e911c9e5dc1ab390c58aa6cbecb389c5b5e28ec"}, {file = "scipy-1.17.1-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:e18f12c6b0bc5a592ed23d3f7b891f68fd7f8241d69b7883769eb5d5dfb52696"}, @@ -3359,6 +4943,66 @@ dev = ["click (<8.3.0)", "cython-lint (>=0.12.2)", "mypy (==1.10.0)", "pycodesty doc = ["intersphinx_registry", "jupyterlite-pyodide-kernel", "jupyterlite-sphinx (>=0.19.1)", "jupytext", "linkify-it-py", "matplotlib (>=3.5)", "myst-nb (>=1.2.0)", "numpydoc", "pooch", "pydata-sphinx-theme (>=0.15.2)", "sphinx (>=5.0.0,<8.2.0)", "sphinx-copybutton", "sphinx-design (>=0.4.0)", "tabulate"] test = ["Cython", "array-api-strict (>=2.3.1)", "asv", "gmpy2", "hypothesis (>=6.30)", "meson", "mpmath", "ninja ; sys_platform != \"emscripten\"", "pooch", "pytest (>=8.0.0)", "pytest-cov", "pytest-timeout", "pytest-xdist", "scikit-umfpack", "threadpoolctl"] +[[package]] +name = "scipy" +version = "1.18.0" +description = "Fundamental algorithms for scientific computing in Python" +optional = false +python-versions = ">=3.12" +groups = ["main", "floris"] +markers = "python_version >= \"3.12\"" +files = [ + {file = "scipy-1.18.0-cp312-cp312-macosx_10_15_x86_64.whl", hash = "sha256:7bd21faaf5a1a3b2eff922d02db5f191b99a6518db9078a8fb23169f6d22259a"}, + {file = "scipy-1.18.0-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:265915e79107de9f946b855e50d7470d5893ec3f54b342e1aa6201cbdcd8bb6b"}, + {file = "scipy-1.18.0-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:9ab7b758be6940954a713ee466e2043e9f6e2ed965c1fce5c91039f4be3d90a9"}, + {file = "scipy-1.18.0-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:97b6cddaaee0a779ef6b5ca83c9604b27cc16b2b8fc22c142652df8793319fb8"}, + {file = "scipy-1.18.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:52a96e21517c7292375c0e27dd796a811f03fcea5fd4d108fdfea8145dcf17ab"}, + {file = "scipy-1.18.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1f55797419e16e7f30cf88ffb3113ce0467f00cfe3f70d5c281730b21769bfc2"}, + {file = "scipy-1.18.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:ad033410e2e0672ffdc1042110cef20e1c46f8fd0616cee1d44d8d58fad8fc11"}, + {file = "scipy-1.18.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:4a55985d54c769c872e64b7f4c8a81cc30ef700cc04296abbbf3705439c126de"}, + {file = "scipy-1.18.0-cp312-cp312-win_amd64.whl", hash = "sha256:71ccc8faa2dd16ac310233203474a8b5cb67f10dedd54a3116d34943f4b19132"}, + {file = "scipy-1.18.0-cp312-cp312-win_arm64.whl", hash = "sha256:d88363fd9d8fbd3511bd273f1a49efb2a540773ddf92a91d57498ce7dd7f3e76"}, + {file = "scipy-1.18.0-cp313-cp313-macosx_10_15_x86_64.whl", hash = "sha256:09143f676d157d9f546d663504ef9c1becb819824f1afc018814176411942446"}, + {file = "scipy-1.18.0-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:5efe260f69417b97ddae455bfb5a95e8359f7f66ad7fa9522a60feb66f169520"}, + {file = "scipy-1.18.0-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:68363b7eaacd8b5dd426df56d782cc156468ac79a127a1b87ca597d6e2e82197"}, + {file = "scipy-1.18.0-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:c5557d8be5da8e41353fcd4d21491fdbab83b062fc579e94dc09a7c8ab4f669b"}, + {file = "scipy-1.18.0-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0d13bca67c096d89fb95ced0d8921807300fce0275643aef9533cc63a0773468"}, + {file = "scipy-1.18.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a46f9273dbd0eb1cefba61c9b8648b4dfe3cbc14a080176f9a73e44b8336dc7f"}, + {file = "scipy-1.18.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:5aba46108853ddfc77906b6557aac839d2b52e900c1d72a1180adaaab58d265f"}, + {file = "scipy-1.18.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:b6f758e35f12757b5d95c00bc6de2438e229c2664b7a92e96f205959d9f2dfa4"}, + {file = "scipy-1.18.0-cp313-cp313-win_amd64.whl", hash = "sha256:1afac4a847207c7ff8efd321734a50b06d0280b3b2a2c0fc2f413101747ad7c7"}, + {file = "scipy-1.18.0-cp313-cp313-win_arm64.whl", hash = "sha256:c5dbddf60e58c2312316d097271a8e73d40eaf2eabfa4d95ed7d3695bbf2ce7b"}, + {file = "scipy-1.18.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:4c256ee70c0d1a8a2ace807e199ccd4e3f57037433842abb3fb36bc17eaa9578"}, + {file = "scipy-1.18.0-cp314-cp314-macosx_12_0_arm64.whl", hash = "sha256:2ef3abc54a4ffc53765374b0d5728532dfdd2585ed23f6b11c206a1f0b1b9af8"}, + {file = "scipy-1.18.0-cp314-cp314-macosx_14_0_arm64.whl", hash = "sha256:f2a6af57bd9e4a75d70e4117e78a1bbee84f79ae3fbb6d0111005d6ebcc4cb8d"}, + {file = "scipy-1.18.0-cp314-cp314-macosx_14_0_x86_64.whl", hash = "sha256:3f1ac564d3bf6c03d861d2cd87a1bea0da2887136f7fb1bf519c05a8971452d6"}, + {file = "scipy-1.18.0-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:40395a5fcd1abee49a5c7aaa98c29db393eedc835138560a588c47ec16156690"}, + {file = "scipy-1.18.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8ca01e8ae69f1b18e9a58d91afead31be3cef0dd905a10249dac559ee15460a0"}, + {file = "scipy-1.18.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:7a7f3b01647384dbc3a711e8c6778e0aabbe93959249fef5c7393396bcac0867"}, + {file = "scipy-1.18.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:6aa94e78ec192a30063a5e72e561c28af769dc311190b24fe91774eff1969709"}, + {file = "scipy-1.18.0-cp314-cp314-win_amd64.whl", hash = "sha256:2d8bbdc6c817f5b4006a54d799d4f5bab6f910193cbb9a1ff310833d4d270f61"}, + {file = "scipy-1.18.0-cp314-cp314-win_arm64.whl", hash = "sha256:18e9575f1569b2c54174e6159d32942e03731177f63dce7975f0a0c88d102f5b"}, + {file = "scipy-1.18.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:f351e0dd702687d12a402b867a1b4146a256923e1c38317cbc472f6372b94707"}, + {file = "scipy-1.18.0-cp314-cp314t-macosx_12_0_arm64.whl", hash = "sha256:7c7a51b33ce387193c97f228320cf8e87361daa1bba750638677729598b3e677"}, + {file = "scipy-1.18.0-cp314-cp314t-macosx_14_0_arm64.whl", hash = "sha256:84031d7b052a54fae2f8632e0ec802073d385476eb9a63079bce6e23ef9283d4"}, + {file = "scipy-1.18.0-cp314-cp314t-macosx_14_0_x86_64.whl", hash = "sha256:56abf29a7c067dde59be8b9a22d606a4ea1b2f2a4b756d9d903c62818f5dacce"}, + {file = "scipy-1.18.0-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1ad44305cfa24b1ba5803cbbebf033590ccbac1aa5d612d727b785325ab408b0"}, + {file = "scipy-1.18.0-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:945c1761b93f38d7f99ae81ae80c63e621471608c7eeead563f6df025585cd58"}, + {file = "scipy-1.18.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:1a4441f15d620578772a49e5ab48c0ee1f7a0220e387110283062729136b2553"}, + {file = "scipy-1.18.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:9aac6192fac56bf2ca534389d24623f07b39ff83317d58287285e7fbd622ff76"}, + {file = "scipy-1.18.0-cp314-cp314t-win_amd64.whl", hash = "sha256:e40baea28ae7f5475c779741e2d90b1247c78531207b49c7030e698ff81cee3f"}, + {file = "scipy-1.18.0-cp314-cp314t-win_arm64.whl", hash = "sha256:368e0a705903c466aa5f08eefb39e6b1b6b2d659e7352a31fd9e2438365be0f8"}, + {file = "scipy-1.18.0.tar.gz", hash = "sha256:67b2ad2ad54c72ca6d04975a9b2df8c3638c34ddd5b28738e94fc2b57929d378"}, +] + +[package.dependencies] +numpy = ">=2.0.0,<2.8" + +[package.extras] +dev = ["click (<8.3.0)", "cython-lint (>=0.12.2)", "mypy (==1.19.1)", "pycodestyle", "pyrefly (==0.63.0)", "ruff (>=0.12.0)", "spin", "types-psutil", "typing_extensions"] +doc = ["intersphinx_registry", "jupyterlite-pyodide-kernel", "jupyterlite-sphinx (>=0.19.1)", "jupytext", "linkify-it-py", "matplotlib (>=3.5)", "myst-nb (>=1.2.0)", "numpydoc", "pooch", "pydata-sphinx-theme (>=0.15.2)", "sphinx (>=5.0.0,<8.2.0)", "sphinx-copybutton", "sphinx-design (>=0.4.0)", "tabulate"] +test = ["Cython", "array-api-strict (>=2.3.1)", "asv", "gmpy2", "hypothesis (>=6.30)", "meson", "mpmath", "ninja ; sys_platform != \"emscripten\"", "pooch", "pytest (>=8.0.0)", "pytest-cov", "pytest-timeout", "pytest-xdist", "scikit-umfpack", "scipy-doctest (>=2.0.0)", "threadpoolctl"] + [[package]] name = "send2trash" version = "2.1.0" @@ -3376,25 +5020,90 @@ nativelib = ["pyobjc (>=9.0) ; sys_platform == \"darwin\"", "pywin32 (>=305) ; s test = ["pytest (>=8)"] [[package]] -name = "setuptools" -version = "82.0.0" -description = "Easily download, build, install, upgrade, and uninstall Python packages" +name = "shapely" +version = "2.1.2" +description = "Manipulation and analysis of geometric objects" optional = false -python-versions = ">=3.9" -groups = ["dev"] -files = [ - {file = "setuptools-82.0.0-py3-none-any.whl", hash = "sha256:70b18734b607bd1da571d097d236cfcfacaf01de45717d59e6e04b96877532e0"}, - {file = "setuptools-82.0.0.tar.gz", hash = "sha256:22e0a2d69474c6ae4feb01951cb69d515ed23728cf96d05513d36e42b62b37cb"}, +python-versions = ">=3.10" +groups = ["floris"] +files = [ + {file = "shapely-2.1.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:7ae48c236c0324b4e139bea88a306a04ca630f49be66741b340729d380d8f52f"}, + {file = "shapely-2.1.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:eba6710407f1daa8e7602c347dfc94adc02205ec27ed956346190d66579eb9ea"}, + {file = "shapely-2.1.2-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:ef4a456cc8b7b3d50ccec29642aa4aeda959e9da2fe9540a92754770d5f0cf1f"}, + {file = "shapely-2.1.2-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:e38a190442aacc67ff9f75ce60aec04893041f16f97d242209106d502486a142"}, + {file = "shapely-2.1.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:40d784101f5d06a1fd30b55fc11ea58a61be23f930d934d86f19a180909908a4"}, + {file = "shapely-2.1.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:f6f6cd5819c50d9bcf921882784586aab34a4bd53e7553e175dece6db513a6f0"}, + {file = "shapely-2.1.2-cp310-cp310-win32.whl", hash = "sha256:fe9627c39c59e553c90f5bc3128252cb85dc3b3be8189710666d2f8bc3a5503e"}, + {file = "shapely-2.1.2-cp310-cp310-win_amd64.whl", hash = "sha256:1d0bfb4b8f661b3b4ec3565fa36c340bfb1cda82087199711f86a88647d26b2f"}, + {file = "shapely-2.1.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:91121757b0a36c9aac3427a651a7e6567110a4a67c97edf04f8d55d4765f6618"}, + {file = "shapely-2.1.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:16a9c722ba774cf50b5d4541242b4cce05aafd44a015290c82ba8a16931ff63d"}, + {file = "shapely-2.1.2-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:cc4f7397459b12c0b196c9efe1f9d7e92463cbba142632b4cc6d8bbbbd3e2b09"}, + {file = "shapely-2.1.2-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:136ab87b17e733e22f0961504d05e77e7be8c9b5a8184f685b4a91a84efe3c26"}, + {file = "shapely-2.1.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:16c5d0fc45d3aa0a69074979f4f1928ca2734fb2e0dde8af9611e134e46774e7"}, + {file = "shapely-2.1.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:6ddc759f72b5b2b0f54a7e7cde44acef680a55019eb52ac63a7af2cf17cb9cd2"}, + {file = "shapely-2.1.2-cp311-cp311-win32.whl", hash = "sha256:2fa78b49485391224755a856ed3b3bd91c8455f6121fee0db0e71cefb07d0ef6"}, + {file = "shapely-2.1.2-cp311-cp311-win_amd64.whl", hash = "sha256:c64d5c97b2f47e3cd9b712eaced3b061f2b71234b3fc263e0fcf7d889c6559dc"}, + {file = "shapely-2.1.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:fe2533caae6a91a543dec62e8360fe86ffcdc42a7c55f9dfd0128a977a896b94"}, + {file = "shapely-2.1.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ba4d1333cc0bc94381d6d4308d2e4e008e0bd128bdcff5573199742ee3634359"}, + {file = "shapely-2.1.2-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:0bd308103340030feef6c111d3eb98d50dc13feea33affc8a6f9fa549e9458a3"}, + {file = "shapely-2.1.2-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:1e7d4d7ad262a48bb44277ca12c7c78cb1b0f56b32c10734ec9a1d30c0b0c54b"}, + {file = "shapely-2.1.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e9eddfe513096a71896441a7c37db72da0687b34752c4e193577a145c71736fc"}, + {file = "shapely-2.1.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:980c777c612514c0cf99bc8a9de6d286f5e186dcaf9091252fcd444e5638193d"}, + {file = "shapely-2.1.2-cp312-cp312-win32.whl", hash = "sha256:9111274b88e4d7b54a95218e243282709b330ef52b7b86bc6aaf4f805306f454"}, + {file = "shapely-2.1.2-cp312-cp312-win_amd64.whl", hash = "sha256:743044b4cfb34f9a67205cee9279feaf60ba7d02e69febc2afc609047cb49179"}, + {file = "shapely-2.1.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:b510dda1a3672d6879beb319bc7c5fd302c6c354584690973c838f46ec3e0fa8"}, + {file = "shapely-2.1.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:8cff473e81017594d20ec55d86b54bc635544897e13a7cfc12e36909c5309a2a"}, + {file = "shapely-2.1.2-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:fe7b77dc63d707c09726b7908f575fc04ff1d1ad0f3fb92aec212396bc6cfe5e"}, + {file = "shapely-2.1.2-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:7ed1a5bbfb386ee8332713bf7508bc24e32d24b74fc9a7b9f8529a55db9f4ee6"}, + {file = "shapely-2.1.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a84e0582858d841d54355246ddfcbd1fce3179f185da7470f41ce39d001ee1af"}, + {file = "shapely-2.1.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:dc3487447a43d42adcdf52d7ac73804f2312cbfa5d433a7d2c506dcab0033dfd"}, + {file = "shapely-2.1.2-cp313-cp313-win32.whl", hash = "sha256:9c3a3c648aedc9f99c09263b39f2d8252f199cb3ac154fadc173283d7d111350"}, + {file = "shapely-2.1.2-cp313-cp313-win_amd64.whl", hash = "sha256:ca2591bff6645c216695bdf1614fca9c82ea1144d4a7591a466fef64f28f0715"}, + {file = "shapely-2.1.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:2d93d23bdd2ed9dc157b46bc2f19b7da143ca8714464249bef6771c679d5ff40"}, + {file = "shapely-2.1.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:01d0d304b25634d60bd7cf291828119ab55a3bab87dc4af1e44b07fb225f188b"}, + {file = "shapely-2.1.2-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:8d8382dd120d64b03698b7298b89611a6ea6f55ada9d39942838b79c9bc89801"}, + {file = "shapely-2.1.2-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:19efa3611eef966e776183e338b2d7ea43569ae99ab34f8d17c2c054d3205cc0"}, + {file = "shapely-2.1.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:346ec0c1a0fcd32f57f00e4134d1200e14bf3f5ae12af87ba83ca275c502498c"}, + {file = "shapely-2.1.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:6305993a35989391bd3476ee538a5c9a845861462327efe00dd11a5c8c709a99"}, + {file = "shapely-2.1.2-cp313-cp313t-win32.whl", hash = "sha256:c8876673449f3401f278c86eb33224c5764582f72b653a415d0e6672fde887bf"}, + {file = "shapely-2.1.2-cp313-cp313t-win_amd64.whl", hash = "sha256:4a44bc62a10d84c11a7a3d7c1c4fe857f7477c3506e24c9062da0db0ae0c449c"}, + {file = "shapely-2.1.2-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:9a522f460d28e2bf4e12396240a5fc1518788b2fcd73535166d748399ef0c223"}, + {file = "shapely-2.1.2-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:1ff629e00818033b8d71139565527ced7d776c269a49bd78c9df84e8f852190c"}, + {file = "shapely-2.1.2-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:f67b34271dedc3c653eba4e3d7111aa421d5be9b4c4c7d38d30907f796cb30df"}, + {file = "shapely-2.1.2-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:21952dc00df38a2c28375659b07a3979d22641aeb104751e769c3ee825aadecf"}, + {file = "shapely-2.1.2-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:1f2f33f486777456586948e333a56ae21f35ae273be99255a191f5c1fa302eb4"}, + {file = "shapely-2.1.2-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:cf831a13e0d5a7eb519e96f58ec26e049b1fad411fc6fc23b162a7ce04d9cffc"}, + {file = "shapely-2.1.2-cp314-cp314-win32.whl", hash = "sha256:61edcd8d0d17dd99075d320a1dd39c0cb9616f7572f10ef91b4b5b00c4aeb566"}, + {file = "shapely-2.1.2-cp314-cp314-win_amd64.whl", hash = "sha256:a444e7afccdb0999e203b976adb37ea633725333e5b119ad40b1ca291ecf311c"}, + {file = "shapely-2.1.2-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:5ebe3f84c6112ad3d4632b1fd2290665aa75d4cef5f6c5d77c4c95b324527c6a"}, + {file = "shapely-2.1.2-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:5860eb9f00a1d49ebb14e881f5caf6c2cf472c7fd38bd7f253bbd34f934eb076"}, + {file = "shapely-2.1.2-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:b705c99c76695702656327b819c9660768ec33f5ce01fa32b2af62b56ba400a1"}, + {file = "shapely-2.1.2-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:a1fd0ea855b2cf7c9cddaf25543e914dd75af9de08785f20ca3085f2c9ca60b0"}, + {file = "shapely-2.1.2-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:df90e2db118c3671a0754f38e36802db75fe0920d211a27481daf50a711fdf26"}, + {file = "shapely-2.1.2-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:361b6d45030b4ac64ddd0a26046906c8202eb60d0f9f53085f5179f1d23021a0"}, + {file = "shapely-2.1.2-cp314-cp314t-win32.whl", hash = "sha256:b54df60f1fbdecc8ebc2c5b11870461a6417b3d617f555e5033f1505d36e5735"}, + {file = "shapely-2.1.2-cp314-cp314t-win_amd64.whl", hash = "sha256:0036ac886e0923417932c2e6369b6c52e38e0ff5d9120b90eef5cd9a5fc5cae9"}, + {file = "shapely-2.1.2.tar.gz", hash = "sha256:2ed4ecb28320a433db18a5bf029986aa8afcfd740745e78847e330d5d94922a9"}, ] +[package.dependencies] +numpy = ">=1.21" + [package.extras] -check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1) ; sys_platform != \"cygwin\"", "ruff (>=0.13.0) ; sys_platform != \"cygwin\""] -core = ["importlib_metadata (>=6) ; python_version < \"3.10\"", "jaraco.functools (>=4)", "jaraco.text (>=3.7)", "more_itertools", "more_itertools (>=8.8)", "packaging (>=24.2)", "platformdirs (>=4.2.2)", "tomli (>=2.0.1) ; python_version < \"3.11\"", "wheel (>=0.43.0)"] -cover = ["pytest-cov"] -doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "pyproject-hooks (!=1.1)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (>=1,<2)", "sphinx-reredirects", "sphinxcontrib-towncrier", "towncrier (<24.7)"] -enabler = ["pytest-enabler (>=2.2)"] -test = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "ini2toml[lite] (>=0.14)", "jaraco.develop (>=7.21) ; python_version >= \"3.9\" and sys_platform != \"cygwin\"", "jaraco.envs (>=2.2)", "jaraco.path (>=3.7.2)", "jaraco.test (>=5.5)", "packaging (>=24.2)", "pip (>=19.1)", "pyproject-hooks (!=1.1)", "pytest (>=6,!=8.1.*)", "pytest-home (>=0.5)", "pytest-perf ; sys_platform != \"cygwin\"", "pytest-subprocess", "pytest-timeout", "pytest-xdist (>=3)", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel (>=0.44.0)"] -type = ["importlib_metadata (>=7.0.2) ; python_version < \"3.10\"", "jaraco.develop (>=7.21) ; sys_platform != \"cygwin\"", "mypy (==1.18.*)", "pytest-mypy"] +docs = ["matplotlib", "numpydoc (==1.1.*)", "sphinx", "sphinx-book-theme", "sphinx-remove-toctrees"] +test = ["pytest", "pytest-cov", "scipy-doctest"] + +[[package]] +name = "simpy" +version = "4.1.2" +description = "Event discrete, process based simulation for Python." +optional = false +python-versions = ">=3.8" +groups = ["floris"] +files = [ + {file = "simpy-4.1.2-py3-none-any.whl", hash = "sha256:43071f84b6512c9b4fcb33ef057f240ccb1d1f3b263f9b4f9229d072e310b372"}, + {file = "simpy-4.1.2.tar.gz", hash = "sha256:76ef36b71e0436ba94e55febc001c78879e493a323f045bbcfbb0b216e9b1fbc"}, +] [[package]] name = "six" @@ -3402,22 +5111,34 @@ version = "1.17.0" description = "Python 2 and 3 compatibility utilities" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" -groups = ["dev", "examples"] +groups = ["dev", "examples", "floris"] files = [ {file = "six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274"}, {file = "six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81"}, ] +[[package]] +name = "sortedcontainers" +version = "2.4.0" +description = "Sorted Containers -- Sorted List, Sorted Dict, Sorted Set" +optional = false +python-versions = "*" +groups = ["floris"] +files = [ + {file = "sortedcontainers-2.4.0-py2.py3-none-any.whl", hash = "sha256:a163dcaede0f1c021485e957a39245190e74249897e2ae4b2aa38595db237ee0"}, + {file = "sortedcontainers-2.4.0.tar.gz", hash = "sha256:25caa5a06cc30b6b83d11423433f65d1f9d76c4c6a0c90e3379eaa43b9bfdb88"}, +] + [[package]] name = "soupsieve" -version = "2.8.3" +version = "2.9.2" description = "A modern CSS selector implementation for Beautiful Soup." optional = false -python-versions = ">=3.9" +python-versions = ">=3.10" groups = ["dev"] files = [ - {file = "soupsieve-2.8.3-py3-none-any.whl", hash = "sha256:ed64f2ba4eebeab06cc4962affce381647455978ffc1e36bb79a545b91f45a95"}, - {file = "soupsieve-2.8.3.tar.gz", hash = "sha256:3267f1eeea4251fb42728b6dfb746edc9acaffc4a45b27e19450b676586e8349"}, + {file = "soupsieve-2.9.2-py3-none-any.whl", hash = "sha256:8089a26fd974ca7a1f30276d3d8492ab266ab15af581642dfe8aa162e0c1c823"}, + {file = "soupsieve-2.9.2.tar.gz", hash = "sha256:4a55d8cf158a9c2e587fa4922f1bbb91d68ac829e2d6f25403a85747c71daf74"}, ] [[package]] @@ -3440,6 +5161,64 @@ pure-eval = "*" [package.extras] tests = ["cython", "littleutils", "pygments", "pytest", "typeguard"] +[[package]] +name = "statsmodels" +version = "0.14.6" +description = "Statistical computations and models for Python" +optional = false +python-versions = ">=3.9" +groups = ["floris"] +files = [ + {file = "statsmodels-0.14.6-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f4ff0649a2df674c7ffb6fa1a06bffdb82a6adf09a48e90e000a15a6aaa734b0"}, + {file = "statsmodels-0.14.6-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:109012088b3e370080846ab053c76d125268631410142daad2f8c10770e8e8d9"}, + {file = "statsmodels-0.14.6-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e93bd5d220f3cb6fc5fc1bffd5b094966cab8ee99f6c57c02e95710513d6ac3f"}, + {file = "statsmodels-0.14.6-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:06eec42d682fdb09fe5d70a05930857efb141754ec5a5056a03304c1b5e32fd9"}, + {file = "statsmodels-0.14.6-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:0444e88557df735eda7db330806fe09d51c9f888bb1f5906cb3a61fb1a3ed4a8"}, + {file = "statsmodels-0.14.6-cp310-cp310-win_amd64.whl", hash = "sha256:e83a9abe653835da3b37fb6ae04b45480c1de11b3134bd40b09717192a1456ea"}, + {file = "statsmodels-0.14.6-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6ad5c2810fc6c684254a7792bf1cbaf1606cdee2a253f8bd259c43135d87cfb4"}, + {file = "statsmodels-0.14.6-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:341fa68a7403e10a95c7b6e41134b0da3a7b835ecff1eb266294408535a06eb6"}, + {file = "statsmodels-0.14.6-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:bdf1dfe2a3ca56f5529118baf33a13efed2783c528f4a36409b46bbd2d9d48eb"}, + {file = "statsmodels-0.14.6-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a3764ba8195c9baf0925a96da0743ff218067a269f01d155ca3558deed2658ca"}, + {file = "statsmodels-0.14.6-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:9e8d2e519852adb1b420e018f5ac6e6684b2b877478adf7fda2cfdb58f5acb5d"}, + {file = "statsmodels-0.14.6-cp311-cp311-win_amd64.whl", hash = "sha256:2738a00fca51196f5a7d44b06970ace6b8b30289839e4808d656f8a98e35faa7"}, + {file = "statsmodels-0.14.6-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:fe76140ae7adc5ff0e60a3f0d56f4fffef484efa803c3efebf2fcd734d72ecb5"}, + {file = "statsmodels-0.14.6-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:26d4f0ed3b31f3c86f83a92f5c1f5cbe63fc992cd8915daf28ca49be14463a1c"}, + {file = "statsmodels-0.14.6-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d8c00a42863e4f4733ac9d078bbfad816249c01451740e6f5053ecc7db6d6368"}, + {file = "statsmodels-0.14.6-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:19b58cf7474aa9e7e3b0771a66537148b2df9b5884fbf156096c0e6c1ff0469d"}, + {file = "statsmodels-0.14.6-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:81e7dcc5e9587f2567e52deaff5220b175bf2f648951549eae5fc9383b62bc37"}, + {file = "statsmodels-0.14.6-cp312-cp312-win_amd64.whl", hash = "sha256:b5eb07acd115aa6208b4058211138393a7e6c2cf12b6f213ede10f658f6a714f"}, + {file = "statsmodels-0.14.6-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:47ee7af083623d2091954fa71c7549b8443168f41b7c5dce66510274c50fd73e"}, + {file = "statsmodels-0.14.6-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:aa60d82e29fcd0a736e86feb63a11d2380322d77a9369a54be8b0965a3985f71"}, + {file = "statsmodels-0.14.6-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:89ee7d595f5939cc20bf946faedcb5137d975f03ae080f300ebb4398f16a5bd4"}, + {file = "statsmodels-0.14.6-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:730f3297b26749b216a06e4327fe0be59b8d05f7d594fb6caff4287b69654589"}, + {file = "statsmodels-0.14.6-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:f1c08befa85e93acc992b72a390ddb7bd876190f1360e61d10cf43833463bc9c"}, + {file = "statsmodels-0.14.6-cp313-cp313-win_amd64.whl", hash = "sha256:8021271a79f35b842c02a1794465a651a9d06ec2080f76ebc3b7adce77d08233"}, + {file = "statsmodels-0.14.6-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:00781869991f8f02ad3610da6627fd26ebe262210287beb59761982a8fa88cae"}, + {file = "statsmodels-0.14.6-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:73f305fbf31607b35ce919fae636ab8b80d175328ed38fdc6f354e813b86ee37"}, + {file = "statsmodels-0.14.6-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e443e7077a6e2d3faeea72f5a92c9f12c63722686eb80bb40a0f04e4a7e267ad"}, + {file = "statsmodels-0.14.6-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:3414e40c073d725007a6603a18247ab7af3467e1af4a5e5a24e4c27bc26673b4"}, + {file = "statsmodels-0.14.6-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:a518d3f9889ef920116f9fa56d0338069e110f823926356946dae83bc9e33e19"}, + {file = "statsmodels-0.14.6-cp314-cp314-win_amd64.whl", hash = "sha256:151b73e29f01fe619dbce7f66d61a356e9d1fe5e906529b78807df9189c37721"}, + {file = "statsmodels-0.14.6-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:4d0c1b0f9f6915619e2a0d3853e5763d4d66876892ad352e7d7b93a737556978"}, + {file = "statsmodels-0.14.6-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:9e0fc891d6358bf376cc0ae1fee10a650478172ae9ba359daba1785fc496cd1a"}, + {file = "statsmodels-0.14.6-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0f52ef0f0b63b8fd11e1ef1c2a1e73a410720b8715c9a83a26d733b6815597fe"}, + {file = "statsmodels-0.14.6-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b328eafa86a2a67303fdb1d25677d15b70cd2a5229aabec7670ec5ea840f1375"}, + {file = "statsmodels-0.14.6-cp39-cp39-win_amd64.whl", hash = "sha256:3bef39f8587754f2d644b2e831e102fa08ace9a5a1af4b583b122e6fd3e083ab"}, + {file = "statsmodels-0.14.6.tar.gz", hash = "sha256:4d17873d3e607d398b85126cd4ed7aad89e4e9d89fc744cdab1af3189a996c2a"}, +] + +[package.dependencies] +numpy = ">=1.22.3,<3" +packaging = ">=21.3" +pandas = ">=1.4,<2.1.0 || >2.1.0" +patsy = ">=0.5.6" +scipy = ">=1.8,<1.9.2 || >1.9.2" + +[package.extras] +build = ["cython (>=3.0.10)"] +develop = ["colorama", "cython (>=3.0.10)", "cython (>=3.0.10,<4)", "flake8", "isort", "jinja2", "joblib", "matplotlib (>=3)", "pytest (>=7.3.0,<8)", "pytest-cov", "pytest-randomly", "pytest-xdist", "pywinpty ; os_name == \"nt\"", "setuptools_scm[toml] (>=8.0,<9.0)"] +docs = ["ipykernel", "jupyter_client", "matplotlib", "nbconvert", "nbformat", "numpydoc", "pandas-datareader", "sphinx"] + [[package]] name = "terminado" version = "0.18.1" @@ -3462,23 +5241,35 @@ docs = ["myst-parser", "pydata-sphinx-theme", "sphinx"] test = ["pre-commit", "pytest (>=7.0)", "pytest-timeout"] typing = ["mypy (>=1.6,<2.0)", "traitlets (>=5.11.1)"] +[[package]] +name = "text-unidecode" +version = "1.3" +description = "The most basic Text::Unidecode port" +optional = false +python-versions = "*" +groups = ["floris"] +files = [ + {file = "text-unidecode-1.3.tar.gz", hash = "sha256:bad6603bb14d279193107714b288be206cac565dfa49aa5b105294dd5c4aab93"}, + {file = "text_unidecode-1.3-py2.py3-none-any.whl", hash = "sha256:1311f10e8b895935241623731c2ba64f4c455287888b18189350b67134a822e8"}, +] + [[package]] name = "tinycss2" -version = "1.4.0" +version = "1.5.1" description = "A tiny CSS parser" optional = false -python-versions = ">=3.8" +python-versions = ">=3.10" groups = ["dev"] files = [ - {file = "tinycss2-1.4.0-py3-none-any.whl", hash = "sha256:3a49cf47b7675da0b15d0c6e1df8df4ebd96e9394bb905a5775adb0d884c5289"}, - {file = "tinycss2-1.4.0.tar.gz", hash = "sha256:10c0972f6fc0fbee87c3edb76549357415e94548c1ae10ebccdea16fb404a9b7"}, + {file = "tinycss2-1.5.1-py3-none-any.whl", hash = "sha256:3415ba0f5839c062696996998176c4a3751d18b7edaaeeb658c9ce21ec150661"}, + {file = "tinycss2-1.5.1.tar.gz", hash = "sha256:d339d2b616ba90ccce58da8495a78f46e55d4d25f9fd71dfd526f07e7d53f957"}, ] [package.dependencies] webencodings = ">=0.4" [package.extras] -doc = ["sphinx", "sphinx_rtd_theme"] +doc = ["furo", "sphinx"] test = ["pytest", "ruff"] [[package]] @@ -3495,121 +5286,133 @@ files = [ [[package]] name = "tomli" -version = "2.4.0" +version = "2.4.1" description = "A lil' TOML parser" optional = false python-versions = ">=3.8" groups = ["dev"] -markers = "python_version == \"3.10\"" -files = [ - {file = "tomli-2.4.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b5ef256a3fd497d4973c11bf142e9ed78b150d36f5773f1ca6088c230ffc5867"}, - {file = "tomli-2.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5572e41282d5268eb09a697c89a7bee84fae66511f87533a6f88bd2f7b652da9"}, - {file = "tomli-2.4.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:551e321c6ba03b55676970b47cb1b73f14a0a4dce6a3e1a9458fd6d921d72e95"}, - {file = "tomli-2.4.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5e3f639a7a8f10069d0e15408c0b96a2a828cfdec6fca05296ebcdcc28ca7c76"}, - {file = "tomli-2.4.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1b168f2731796b045128c45982d3a4874057626da0e2ef1fdd722848b741361d"}, - {file = "tomli-2.4.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:133e93646ec4300d651839d382d63edff11d8978be23da4cc106f5a18b7d0576"}, - {file = "tomli-2.4.0-cp311-cp311-win32.whl", hash = "sha256:b6c78bdf37764092d369722d9946cb65b8767bfa4110f902a1b2542d8d173c8a"}, - {file = "tomli-2.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:d3d1654e11d724760cdb37a3d7691f0be9db5fbdaef59c9f532aabf87006dbaa"}, - {file = "tomli-2.4.0-cp311-cp311-win_arm64.whl", hash = "sha256:cae9c19ed12d4e8f3ebf46d1a75090e4c0dc16271c5bce1c833ac168f08fb614"}, - {file = "tomli-2.4.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:920b1de295e72887bafa3ad9f7a792f811847d57ea6b1215154030cf131f16b1"}, - {file = "tomli-2.4.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7d6d9a4aee98fac3eab4952ad1d73aee87359452d1c086b5ceb43ed02ddb16b8"}, - {file = "tomli-2.4.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:36b9d05b51e65b254ea6c2585b59d2c4cb91c8a3d91d0ed0f17591a29aaea54a"}, - {file = "tomli-2.4.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1c8a885b370751837c029ef9bc014f27d80840e48bac415f3412e6593bbc18c1"}, - {file = "tomli-2.4.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8768715ffc41f0008abe25d808c20c3d990f42b6e2e58305d5da280ae7d1fa3b"}, - {file = "tomli-2.4.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:7b438885858efd5be02a9a133caf5812b8776ee0c969fea02c45e8e3f296ba51"}, - {file = "tomli-2.4.0-cp312-cp312-win32.whl", hash = "sha256:0408e3de5ec77cc7f81960c362543cbbd91ef883e3138e81b729fc3eea5b9729"}, - {file = "tomli-2.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:685306e2cc7da35be4ee914fd34ab801a6acacb061b6a7abca922aaf9ad368da"}, - {file = "tomli-2.4.0-cp312-cp312-win_arm64.whl", hash = "sha256:5aa48d7c2356055feef06a43611fc401a07337d5b006be13a30f6c58f869e3c3"}, - {file = "tomli-2.4.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:84d081fbc252d1b6a982e1870660e7330fb8f90f676f6e78b052ad4e64714bf0"}, - {file = "tomli-2.4.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:9a08144fa4cba33db5255f9b74f0b89888622109bd2776148f2597447f92a94e"}, - {file = "tomli-2.4.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c73add4bb52a206fd0c0723432db123c0c75c280cbd67174dd9d2db228ebb1b4"}, - {file = "tomli-2.4.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1fb2945cbe303b1419e2706e711b7113da57b7db31ee378d08712d678a34e51e"}, - {file = "tomli-2.4.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:bbb1b10aa643d973366dc2cb1ad94f99c1726a02343d43cbc011edbfac579e7c"}, - {file = "tomli-2.4.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4cbcb367d44a1f0c2be408758b43e1ffb5308abe0ea222897d6bfc8e8281ef2f"}, - {file = "tomli-2.4.0-cp313-cp313-win32.whl", hash = "sha256:7d49c66a7d5e56ac959cb6fc583aff0651094ec071ba9ad43df785abc2320d86"}, - {file = "tomli-2.4.0-cp313-cp313-win_amd64.whl", hash = "sha256:3cf226acb51d8f1c394c1b310e0e0e61fecdd7adcb78d01e294ac297dd2e7f87"}, - {file = "tomli-2.4.0-cp313-cp313-win_arm64.whl", hash = "sha256:d20b797a5c1ad80c516e41bc1fb0443ddb5006e9aaa7bda2d71978346aeb9132"}, - {file = "tomli-2.4.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:26ab906a1eb794cd4e103691daa23d95c6919cc2fa9160000ac02370cc9dd3f6"}, - {file = "tomli-2.4.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:20cedb4ee43278bc4f2fee6cb50daec836959aadaf948db5172e776dd3d993fc"}, - {file = "tomli-2.4.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:39b0b5d1b6dd03684b3fb276407ebed7090bbec989fa55838c98560c01113b66"}, - {file = "tomli-2.4.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a26d7ff68dfdb9f87a016ecfd1e1c2bacbe3108f4e0f8bcd2228ef9a766c787d"}, - {file = "tomli-2.4.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:20ffd184fb1df76a66e34bd1b36b4a4641bd2b82954befa32fe8163e79f1a702"}, - {file = "tomli-2.4.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:75c2f8bbddf170e8effc98f5e9084a8751f8174ea6ccf4fca5398436e0320bc8"}, - {file = "tomli-2.4.0-cp314-cp314-win32.whl", hash = "sha256:31d556d079d72db7c584c0627ff3a24c5d3fb4f730221d3444f3efb1b2514776"}, - {file = "tomli-2.4.0-cp314-cp314-win_amd64.whl", hash = "sha256:43e685b9b2341681907759cf3a04e14d7104b3580f808cfde1dfdb60ada85475"}, - {file = "tomli-2.4.0-cp314-cp314-win_arm64.whl", hash = "sha256:3d895d56bd3f82ddd6faaff993c275efc2ff38e52322ea264122d72729dca2b2"}, - {file = "tomli-2.4.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:5b5807f3999fb66776dbce568cc9a828544244a8eb84b84b9bafc080c99597b9"}, - {file = "tomli-2.4.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:c084ad935abe686bd9c898e62a02a19abfc9760b5a79bc29644463eaf2840cb0"}, - {file = "tomli-2.4.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0f2e3955efea4d1cfbcb87bc321e00dc08d2bcb737fd1d5e398af111d86db5df"}, - {file = "tomli-2.4.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0e0fe8a0b8312acf3a88077a0802565cb09ee34107813bba1c7cd591fa6cfc8d"}, - {file = "tomli-2.4.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:413540dce94673591859c4c6f794dfeaa845e98bf35d72ed59636f869ef9f86f"}, - {file = "tomli-2.4.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:0dc56fef0e2c1c470aeac5b6ca8cc7b640bb93e92d9803ddaf9ea03e198f5b0b"}, - {file = "tomli-2.4.0-cp314-cp314t-win32.whl", hash = "sha256:d878f2a6707cc9d53a1be1414bbb419e629c3d6e67f69230217bb663e76b5087"}, - {file = "tomli-2.4.0-cp314-cp314t-win_amd64.whl", hash = "sha256:2add28aacc7425117ff6364fe9e06a183bb0251b03f986df0e78e974047571fd"}, - {file = "tomli-2.4.0-cp314-cp314t-win_arm64.whl", hash = "sha256:2b1e3b80e1d5e52e40e9b924ec43d81570f0e7d09d11081b797bc4692765a3d4"}, - {file = "tomli-2.4.0-py3-none-any.whl", hash = "sha256:1f776e7d669ebceb01dee46484485f43a4048746235e683bcdffacdf1fb4785a"}, - {file = "tomli-2.4.0.tar.gz", hash = "sha256:aa89c3f6c277dd275d8e243ad24f3b5e701491a860d5121f2cdd399fbb31fc9c"}, +markers = "python_version < \"3.11\"" +files = [ + {file = "tomli-2.4.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f8f0fc26ec2cc2b965b7a3b87cd19c5c6b8c5e5f436b984e85f486d652285c30"}, + {file = "tomli-2.4.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4ab97e64ccda8756376892c53a72bd1f964e519c77236368527f758fbc36a53a"}, + {file = "tomli-2.4.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:96481a5786729fd470164b47cdb3e0e58062a496f455ee41b4403be77cb5a076"}, + {file = "tomli-2.4.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5a881ab208c0baf688221f8cecc5401bd291d67e38a1ac884d6736cbcd8247e9"}, + {file = "tomli-2.4.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:47149d5bd38761ac8be13a84864bf0b7b70bc051806bc3669ab1cbc56216b23c"}, + {file = "tomli-2.4.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ec9bfaf3ad2df51ace80688143a6a4ebc09a248f6ff781a9945e51937008fcbc"}, + {file = "tomli-2.4.1-cp311-cp311-win32.whl", hash = "sha256:ff2983983d34813c1aeb0fa89091e76c3a22889ee83ab27c5eeb45100560c049"}, + {file = "tomli-2.4.1-cp311-cp311-win_amd64.whl", hash = "sha256:5ee18d9ebdb417e384b58fe414e8d6af9f4e7a0ae761519fb50f721de398dd4e"}, + {file = "tomli-2.4.1-cp311-cp311-win_arm64.whl", hash = "sha256:c2541745709bad0264b7d4705ad453b76ccd191e64aa6f0fc66b69a293a45ece"}, + {file = "tomli-2.4.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:c742f741d58a28940ce01d58f0ab2ea3ced8b12402f162f4d534dfe18ba1cd6a"}, + {file = "tomli-2.4.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7f86fd587c4ed9dd76f318225e7d9b29cfc5a9d43de44e5754db8d1128487085"}, + {file = "tomli-2.4.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ff18e6a727ee0ab0388507b89d1bc6a22b138d1e2fa56d1ad494586d61d2eae9"}, + {file = "tomli-2.4.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:136443dbd7e1dee43c68ac2694fde36b2849865fa258d39bf822c10e8068eac5"}, + {file = "tomli-2.4.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:5e262d41726bc187e69af7825504c933b6794dc3fbd5945e41a79bb14c31f585"}, + {file = "tomli-2.4.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:5cb41aa38891e073ee49d55fbc7839cfdb2bc0e600add13874d048c94aadddd1"}, + {file = "tomli-2.4.1-cp312-cp312-win32.whl", hash = "sha256:da25dc3563bff5965356133435b757a795a17b17d01dbc0f42fb32447ddfd917"}, + {file = "tomli-2.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:52c8ef851d9a240f11a88c003eacb03c31fc1c9c4ec64a99a0f922b93874fda9"}, + {file = "tomli-2.4.1-cp312-cp312-win_arm64.whl", hash = "sha256:f758f1b9299d059cc3f6546ae2af89670cb1c4d48ea29c3cacc4fe7de3058257"}, + {file = "tomli-2.4.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:36d2bd2ad5fb9eaddba5226aa02c8ec3fa4f192631e347b3ed28186d43be6b54"}, + {file = "tomli-2.4.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:eb0dc4e38e6a1fd579e5d50369aa2e10acfc9cace504579b2faabb478e76941a"}, + {file = "tomli-2.4.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c7f2c7f2b9ca6bdeef8f0fa897f8e05085923eb091721675170254cbc5b02897"}, + {file = "tomli-2.4.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f3c6818a1a86dd6dca7ddcaaf76947d5ba31aecc28cb1b67009a5877c9a64f3f"}, + {file = "tomli-2.4.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:d312ef37c91508b0ab2cee7da26ec0b3ed2f03ce12bd87a588d771ae15dcf82d"}, + {file = "tomli-2.4.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:51529d40e3ca50046d7606fa99ce3956a617f9b36380da3b7f0dd3dd28e68cb5"}, + {file = "tomli-2.4.1-cp313-cp313-win32.whl", hash = "sha256:2190f2e9dd7508d2a90ded5ed369255980a1bcdd58e52f7fe24b8162bf9fedbd"}, + {file = "tomli-2.4.1-cp313-cp313-win_amd64.whl", hash = "sha256:8d65a2fbf9d2f8352685bc1364177ee3923d6baf5e7f43ea4959d7d8bc326a36"}, + {file = "tomli-2.4.1-cp313-cp313-win_arm64.whl", hash = "sha256:4b605484e43cdc43f0954ddae319fb75f04cc10dd80d830540060ee7cd0243cd"}, + {file = "tomli-2.4.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:fd0409a3653af6c147209d267a0e4243f0ae46b011aa978b1080359fddc9b6cf"}, + {file = "tomli-2.4.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:a120733b01c45e9a0c34aeef92bf0cf1d56cfe81ed9d47d562f9ed591a9828ac"}, + {file = "tomli-2.4.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:559db847dc486944896521f68d8190be1c9e719fced785720d2216fe7022b662"}, + {file = "tomli-2.4.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:01f520d4f53ef97964a240a035ec2a869fe1a37dde002b57ebc4417a27ccd853"}, + {file = "tomli-2.4.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:7f94b27a62cfad8496c8d2513e1a222dd446f095fca8987fceef261225538a15"}, + {file = "tomli-2.4.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:ede3e6487c5ef5d28634ba3f31f989030ad6af71edfb0055cbbd14189ff240ba"}, + {file = "tomli-2.4.1-cp314-cp314-win32.whl", hash = "sha256:3d48a93ee1c9b79c04bb38772ee1b64dcf18ff43085896ea460ca8dec96f35f6"}, + {file = "tomli-2.4.1-cp314-cp314-win_amd64.whl", hash = "sha256:88dceee75c2c63af144e456745e10101eb67361050196b0b6af5d717254dddf7"}, + {file = "tomli-2.4.1-cp314-cp314-win_arm64.whl", hash = "sha256:b8c198f8c1805dc42708689ed6864951fd2494f924149d3e4bce7710f8eb5232"}, + {file = "tomli-2.4.1-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:d4d8fe59808a54658fcc0160ecfb1b30f9089906c50b23bcb4c69eddc19ec2b4"}, + {file = "tomli-2.4.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:7008df2e7655c495dd12d2a4ad038ff878d4ca4b81fccaf82b714e07eae4402c"}, + {file = "tomli-2.4.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1d8591993e228b0c930c4bb0db464bdad97b3289fb981255d6c9a41aedc84b2d"}, + {file = "tomli-2.4.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:734e20b57ba95624ecf1841e72b53f6e186355e216e5412de414e3c51e5e3c41"}, + {file = "tomli-2.4.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:8a650c2dbafa08d42e51ba0b62740dae4ecb9338eefa093aa5c78ceb546fcd5c"}, + {file = "tomli-2.4.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:504aa796fe0569bb43171066009ead363de03675276d2d121ac1a4572397870f"}, + {file = "tomli-2.4.1-cp314-cp314t-win32.whl", hash = "sha256:b1d22e6e9387bf4739fbe23bfa80e93f6b0373a7f1b96c6227c32bef95a4d7a8"}, + {file = "tomli-2.4.1-cp314-cp314t-win_amd64.whl", hash = "sha256:2c1c351919aca02858f740c6d33adea0c5deea37f9ecca1cc1ef9e884a619d26"}, + {file = "tomli-2.4.1-cp314-cp314t-win_arm64.whl", hash = "sha256:eab21f45c7f66c13f2a9e0e1535309cee140182a9cdae1e041d02e47291e8396"}, + {file = "tomli-2.4.1-py3-none-any.whl", hash = "sha256:0d85819802132122da43cb86656f8d1f8c6587d54ae7dcaf30e90533028b49fe"}, + {file = "tomli-2.4.1.tar.gz", hash = "sha256:7c7e1a961a0b2f2472c1ac5b69affa0ae1132c39adcb67aba98568702b9cc23f"}, ] [[package]] name = "tornado" -version = "6.5.4" +version = "6.5.8" description = "Tornado is a Python web framework and asynchronous networking library, originally developed at FriendFeed." optional = false python-versions = ">=3.9" groups = ["dev"] files = [ - {file = "tornado-6.5.4-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:d6241c1a16b1c9e4cc28148b1cda97dd1c6cb4fb7068ac1bedc610768dff0ba9"}, - {file = "tornado-6.5.4-cp39-abi3-macosx_10_9_x86_64.whl", hash = "sha256:2d50f63dda1d2cac3ae1fa23d254e16b5e38153758470e9956cbc3d813d40843"}, - {file = "tornado-6.5.4-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d1cf66105dc6acb5af613c054955b8137e34a03698aa53272dbda4afe252be17"}, - {file = "tornado-6.5.4-cp39-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:50ff0a58b0dc97939d29da29cd624da010e7f804746621c78d14b80238669335"}, - {file = "tornado-6.5.4-cp39-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e5fb5e04efa54cf0baabdd10061eb4148e0be137166146fff835745f59ab9f7f"}, - {file = "tornado-6.5.4-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:9c86b1643b33a4cd415f8d0fe53045f913bf07b4a3ef646b735a6a86047dda84"}, - {file = "tornado-6.5.4-cp39-abi3-musllinux_1_2_i686.whl", hash = "sha256:6eb82872335a53dd063a4f10917b3efd28270b56a33db69009606a0312660a6f"}, - {file = "tornado-6.5.4-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:6076d5dda368c9328ff41ab5d9dd3608e695e8225d1cd0fd1e006f05da3635a8"}, - {file = "tornado-6.5.4-cp39-abi3-win32.whl", hash = "sha256:1768110f2411d5cd281bac0a090f707223ce77fd110424361092859e089b38d1"}, - {file = "tornado-6.5.4-cp39-abi3-win_amd64.whl", hash = "sha256:fa07d31e0cd85c60713f2b995da613588aa03e1303d75705dca6af8babc18ddc"}, - {file = "tornado-6.5.4-cp39-abi3-win_arm64.whl", hash = "sha256:053e6e16701eb6cbe641f308f4c1a9541f91b6261991160391bfc342e8a551a1"}, - {file = "tornado-6.5.4.tar.gz", hash = "sha256:a22fa9047405d03260b483980635f0b041989d8bcc9a313f8fe18b411d84b1d7"}, + {file = "tornado-6.5.8-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:cc6aa787d7cfab7c3d35189dc7a56fbd2399a569624c730c6b55b3d6531d0403"}, + {file = "tornado-6.5.8-cp39-abi3-macosx_10_9_x86_64.whl", hash = "sha256:9715b5eb79735b2bcd454ce216a9275b7c0470e64ea1bf5742f78b2f72b26eeb"}, + {file = "tornado-6.5.8-cp39-abi3-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:547d63f450d570c14fe0e8db2cfb14c9bbd1c2503b4a6612586267955aa47b58"}, + {file = "tornado-6.5.8-cp39-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7e2360a0ffbe145eca8af0b19cb7203d79b1a98dd4cccdd6b368f6f49c2e3808"}, + {file = "tornado-6.5.8-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:5d242290bdf7ab3151bc1065fdd75c0dcc21cbc7b49f22a4c56329c2d6566d22"}, + {file = "tornado-6.5.8-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:7b94ff0e128fe0542f3bd331fb44d06260fc4ac16881545159f34ef08aad4195"}, + {file = "tornado-6.5.8-cp39-abi3-win32.whl", hash = "sha256:67832909c4779c64942380cb5f044a5c6163d00831472d80e25e115de9917836"}, + {file = "tornado-6.5.8-cp39-abi3-win_amd64.whl", hash = "sha256:11881db6b7c168494be2c2d12e65931451bdf7ee718535418ae1d8855dd5a0ee"}, + {file = "tornado-6.5.8-cp39-abi3-win_arm64.whl", hash = "sha256:68a7468c7e289f8514d7d664101753903217eff1bb6822c6b5994a0b5f5bcb26"}, + {file = "tornado-6.5.8.tar.gz", hash = "sha256:9452e1b208a8bd771e2cb1f2ff564985b9b214bdebbe622793e1799e0a6bd23f"}, ] [[package]] name = "tqdm" -version = "4.67.3" +version = "4.70.0" description = "Fast, Extensible Progress Meter" optional = false -python-versions = ">=3.7" -groups = ["main", "examples"] +python-versions = ">=3.8" +groups = ["main", "examples", "floris"] files = [ - {file = "tqdm-4.67.3-py3-none-any.whl", hash = "sha256:ee1e4c0e59148062281c49d80b25b67771a127c85fc9676d3be5f243206826bf"}, - {file = "tqdm-4.67.3.tar.gz", hash = "sha256:7d825f03f89244ef73f1d4ce193cb1774a8179fd96f31d7e1dcde62092b960bb"}, + {file = "tqdm-4.70.0-py3-none-any.whl", hash = "sha256:7f585706bfddbdebf89daac705b2dfcc16890130727d3197ca62c732b4310953"}, + {file = "tqdm-4.70.0.tar.gz", hash = "sha256:55b0b0dbd97462d06ebee91e4dac24ed4d4702be82b24f07e6c1d27e08cea220"}, ] [package.dependencies] colorama = {version = "*", markers = "platform_system == \"Windows\""} [package.extras] -dev = ["nbval", "pytest (>=6)", "pytest-asyncio (>=0.24)", "pytest-cov", "pytest-timeout"] -discord = ["requests"] +discord = ["envwrap", "requests"] notebook = ["ipywidgets (>=6)"] -slack = ["slack-sdk"] -telegram = ["requests"] +slack = ["envwrap", "slack-sdk"] +telegram = ["envwrap", "requests"] + +[[package]] +name = "tqdm-joblib" +version = "0.0.5" +description = "Tracking progress of joblib.Parallel execution" +optional = false +python-versions = ">=3.10" +groups = ["floris"] +files = [ + {file = "tqdm_joblib-0.0.5-py3-none-any.whl", hash = "sha256:5948fccca627970cc8340dd56ac49d29222ed110b9ee39fd310b76a1483b471f"}, + {file = "tqdm_joblib-0.0.5.tar.gz", hash = "sha256:34dd63c92e1b88b5118661a41eaf91001cac2687bfe217a4b6a9ab1bbf0f1c64"}, +] + +[package.dependencies] +tqdm = "*" [[package]] name = "traitlets" -version = "5.14.3" +version = "5.16.1" description = "Traitlets Python configuration system" optional = false -python-versions = ">=3.8" +python-versions = ">=3.10" groups = ["dev"] files = [ - {file = "traitlets-5.14.3-py3-none-any.whl", hash = "sha256:b74e89e397b1ed28cc831db7aea759ba6640cb3de13090ca145426688ff1ac4f"}, - {file = "traitlets-5.14.3.tar.gz", hash = "sha256:9ed0579d3502c94b4b3732ac120375cda96f923114522847de4b3bb98b96b6b7"}, + {file = "traitlets-5.16.1-py3-none-any.whl", hash = "sha256:f775618166caa0396c8e337099240f2bd3e5e917d203b2e6fbe21a58d3cb1f6b"}, + {file = "traitlets-5.16.1.tar.gz", hash = "sha256:ed900c2b631aa3a112811139fa97b8d2c3bad5e989656bba4b7e52c7852c18c1"}, ] [package.extras] docs = ["myst-parser", "pydata-sphinx-theme", "sphinx"] -test = ["argcomplete (>=3.0.3)", "mypy (>=1.7.0)", "pre-commit", "pytest (>=7.0,<8.2)", "pytest-mock", "pytest-mypy-testing"] +test = ["argcomplete (>=3.0.3) ; python_version < \"3.12\"", "argcomplete (>=3.5.2) ; python_version >= \"3.12\"", "mypy (>=2.0) ; implementation_name != \"pypy\"", "pre-commit", "pytest (>=7.0,<10.0)", "pytest-mock", "pytest-mypy-testing ; implementation_name != \"pypy\""] [[package]] name = "typing-extensions" @@ -3617,7 +5420,7 @@ version = "4.15.0" description = "Backported and Experimental Type Hints for Python 3.9+" optional = false python-versions = ">=3.9" -groups = ["dev"] +groups = ["dev", "floris"] files = [ {file = "typing_extensions-4.15.0-py3-none-any.whl", hash = "sha256:f0fa19c6845758ab08074a0cfa8b7aecb71c999ca73d62883bc25cc018c4e548"}, {file = "typing_extensions-4.15.0.tar.gz", hash = "sha256:0cea48d173cc12fa28ecabc3b837ea3cf6f38c6d1136f85cbaaf598984861466"}, @@ -3625,15 +5428,16 @@ files = [ [[package]] name = "tzdata" -version = "2025.3" +version = "2026.3" description = "Provider of IANA time zone data" optional = false python-versions = ">=2" -groups = ["dev"] +groups = ["dev", "floris"] files = [ - {file = "tzdata-2025.3-py2.py3-none-any.whl", hash = "sha256:06a47e5700f3081aab02b2e513160914ff0694bce9947d6b76ebd6bf57cfc5d1"}, - {file = "tzdata-2025.3.tar.gz", hash = "sha256:de39c2ca5dc7b0344f2eba86f49d614019d29f060fc4ebc8a417896a620b56a7"}, + {file = "tzdata-2026.3-py2.py3-none-any.whl", hash = "sha256:dc096730c87af6cab1b171c9d532be840741ff5d459015e7f6947bd7d7e54931"}, + {file = "tzdata-2026.3.tar.gz", hash = "sha256:4a1518b8993086a7982523e071643f3c0e5f213e75b21318e78bcabfff9d1415"}, ] +markers = {floris = "sys_platform == \"win32\" or sys_platform == \"emscripten\" or python_version < \"3.11\""} [[package]] name = "unified-momentum-model" @@ -3680,14 +5484,14 @@ dev = ["flake8", "flake8-annotations", "flake8-bandit", "flake8-bugbear", "flake [[package]] name = "urllib3" -version = "2.6.3" +version = "2.7.0" description = "HTTP library with thread-safe connection pooling, file post, and more." optional = false -python-versions = ">=3.9" -groups = ["dev"] +python-versions = ">=3.10" +groups = ["dev", "floris"] files = [ - {file = "urllib3-2.6.3-py3-none-any.whl", hash = "sha256:bf272323e553dfb2e87d9bfd225ca7b0f467b919d7bbd355436d3fd37cb0acd4"}, - {file = "urllib3-2.6.3.tar.gz", hash = "sha256:1b62b6884944a57dbe321509ab94fd4d3b307075e0c2eae991ac71ee15ad38ed"}, + {file = "urllib3-2.7.0-py3-none-any.whl", hash = "sha256:9fb4c81ebbb1ce9531cce37674bbc6f1360472bc18ca9a553ede278ef7276897"}, + {file = "urllib3-2.7.0.tar.gz", hash = "sha256:231e0ec3b63ceb14667c67be60f2f2c40a518cb38b03af60abc813da26505f4c"}, ] [package.extras] @@ -3698,14 +5502,14 @@ zstd = ["backports-zstd (>=1.0.0) ; python_version < \"3.14\""] [[package]] name = "wcwidth" -version = "0.6.0" +version = "0.8.2" description = "Measures the displayed width of unicode strings in a terminal" optional = false python-versions = ">=3.8" groups = ["dev"] files = [ - {file = "wcwidth-0.6.0-py3-none-any.whl", hash = "sha256:1a3a1e510b553315f8e146c54764f4fb6264ffad731b3d78088cdb1478ffbdad"}, - {file = "wcwidth-0.6.0.tar.gz", hash = "sha256:cdc4e4262d6ef9a1a57e018384cbeb1208d8abbc64176027e2c2455c81313159"}, + {file = "wcwidth-0.8.2-py3-none-any.whl", hash = "sha256:d63947694a0539a1d51e01eda7caf800c291020e6cdd7e28ad7b14dd33ad4f85"}, + {file = "wcwidth-0.8.2.tar.gz", hash = "sha256:91fbef97204b96a3d4d421609b80340b760cf33e26da123ff243d76b1fda8dda"}, ] [[package]] @@ -3761,7 +5565,166 @@ files = [ {file = "widgetsnbextension-4.0.15.tar.gz", hash = "sha256:de8610639996f1567952d763a5a41af8af37f2575a41f9852a38f947eb82a3b9"}, ] +[[package]] +name = "windio" +version = "2.1.1" +description = "Frameworks defining the inputs and outputs for systems engineering MDAO of wind turbine and plants." +optional = false +python-versions = ">=3.9" +groups = ["floris"] +files = [ + {file = "windio-2.1.1-py3-none-any.whl", hash = "sha256:333820957a0b38651d1ea48df5a2544f17d4cf766cee7bb2b1caed5557e7d35b"}, + {file = "windio-2.1.1.tar.gz", hash = "sha256:ca5581a8a54425695b7726713bbc878ad1f2073a767b568166fa1e8340ec7de9"}, +] + +[package.dependencies] +jsonschema = "*" +netcdf4 = "*" +"ruamel.yaml" = "*" +xarray = "*" + +[package.extras] +docs = ["gitpython", "json-schema-for-humans", "pydata-sphinx-theme", "sphinx (<=6.2)", "sphinx_multiversion"] +test = ["numpy", "pint", "pytest", "pytest-subtests", "scipy"] + +[[package]] +name = "wisdem" +version = "4.0.5" +description = "Wind-Plant Integrated System Design & Engineering Model" +optional = false +python-versions = ">=3.9" +groups = ["floris"] +files = [ + {file = "wisdem-4.0.5-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:5334e38e26efba43c9848de4a4a4fc681b438635f0b773aff01ba6ed29d61833"}, + {file = "wisdem-4.0.5-cp310-cp310-macosx_15_0_arm64.whl", hash = "sha256:8040476014ce81342a996dbb1b3355605a8fc0b824af7ea6d5b4a95735699895"}, + {file = "wisdem-4.0.5-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0e8749f4f3a81c3d3759451bf7c221e84165ec4c9c3200bf27d4250890b4caa1"}, + {file = "wisdem-4.0.5-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:34cf7d3d26ab8fb56b447f6c3ad00697dfa1709a90059ae2ae724f4b15abbcc0"}, + {file = "wisdem-4.0.5-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:fe5590a9a6bec0226944533930b8b2ecc088463464b1b89296612f548eeb1b3c"}, + {file = "wisdem-4.0.5-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:39fd308ddd7aa52f071eda69171c7eca09af9847d66072dd0e5036997056a3ec"}, + {file = "wisdem-4.0.5-cp310-cp310-win_amd64.whl", hash = "sha256:6b53a9df4a08e4377066632a8b9030b193ad22725e3d2b220b4cc1b1a1443b95"}, + {file = "wisdem-4.0.5-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:74cd83d116e79dc2855866bab1e3b821e842bc589c682f5fea848a0cad645e0e"}, + {file = "wisdem-4.0.5-cp311-cp311-macosx_15_0_arm64.whl", hash = "sha256:5d5b494a31f17c5160b0387a8fc23271813740276661b9587b8e596e286fa04b"}, + {file = "wisdem-4.0.5-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:225245e10812ae99532dc81ec51625188baf85e96bdd5ecd50f1b0df84f855cd"}, + {file = "wisdem-4.0.5-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:47e531fa4caea3b17dd661bbcbc8e9ccb21a32ea8523d229345dfc594697d30e"}, + {file = "wisdem-4.0.5-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:3fcfc81a86be6930bb1c361e1e98181c94dea921a9b082a55ab30257de66fe44"}, + {file = "wisdem-4.0.5-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:7a5e0042b9209857c92166b86428a2ece2f08a356a95b558df0558ba564a640a"}, + {file = "wisdem-4.0.5-cp311-cp311-win_amd64.whl", hash = "sha256:2b9aab5fd74ed7f6f5d4ec019f21b4dc1396a1a8b6081c76b5ba696986cbd781"}, + {file = "wisdem-4.0.5-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:fd71cc4a9bf22b33b44a012b0fd93e07446cd873ef7dd51868026873d23d8e56"}, + {file = "wisdem-4.0.5-cp312-cp312-macosx_15_0_arm64.whl", hash = "sha256:7ba8a539a7ea88226fbb88d7f3b85ce77fd9008baa86f2d70277a78b12d92df8"}, + {file = "wisdem-4.0.5-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b424a88bcaff9563edd58b6591428a0184f3f048505196780114680a436e28ca"}, + {file = "wisdem-4.0.5-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a80913729f90fccce7bcf0270a42410a93980a181878c23dfb998323a6cb4a7b"}, + {file = "wisdem-4.0.5-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:b64dbc7f44a32a56c6af6579f18e57147fe50fa8d3f82e952693bcde5ed513d5"}, + {file = "wisdem-4.0.5-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:14b9080f1ed81c5484eee80902bb6135e19e35265154169cc01bda79a257ac2d"}, + {file = "wisdem-4.0.5-cp312-cp312-win_amd64.whl", hash = "sha256:0ee7d2561072255c326787909a6b44e42a660e08a327682286874f19d20c03ff"}, + {file = "wisdem-4.0.5-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:399fdfb699dde9ecf2370ea70f11d2166f5576ff6f17924001a0091bb64d3ed9"}, + {file = "wisdem-4.0.5-cp313-cp313-macosx_15_0_arm64.whl", hash = "sha256:aea2768334208adc94a98aebdfaac087ded95a2191b25889efc0e8111954e7c3"}, + {file = "wisdem-4.0.5-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7c7eaa94675c5dfce17e66f808b492939d05da538943e26a26c764179682e44b"}, + {file = "wisdem-4.0.5-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d9e9dba0f90efb450a3b3d0d6bbde95efd9c55e3e56fde9102597199be0a5611"}, + {file = "wisdem-4.0.5-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:db7898d130fc3de7ddd25fe5a2f844e3ee58a6b5507b7b93fd8140518376c784"}, + {file = "wisdem-4.0.5-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:244a31cfc048c8089ab40662a34c98a4c05547e3ec692cb9722d9f0530a93cdd"}, + {file = "wisdem-4.0.5-cp313-cp313-win_amd64.whl", hash = "sha256:d5816268c275139e0de18306e6b27d38ea73e9a3da8c3b719da00fdb4286bb7d"}, + {file = "wisdem-4.0.5-cp314-cp314-macosx_14_0_arm64.whl", hash = "sha256:e3d78c2b617a4bac8de1bd42293effaabbb7fc7d0c11bd17e37a61f3a396f036"}, + {file = "wisdem-4.0.5-cp314-cp314-macosx_15_0_arm64.whl", hash = "sha256:ed7ad36a201b4583a54b34ef84055f82c954bcd961edf80892217f6a0551a5a3"}, + {file = "wisdem-4.0.5-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2b1ed6bd1db1bd5e00f997a8be19fb7bd1275603595d94b088bb23a30f45a4be"}, + {file = "wisdem-4.0.5-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:dfab853f51bf4930cc809262c9bc9104d074dbf355103623f39be7b2a99b7506"}, + {file = "wisdem-4.0.5-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:114603f3b38e8c48bcf8489e9dbcd66c2ede51162ea0124f5942bb615e42b6d9"}, + {file = "wisdem-4.0.5-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:efb89da281fa9d4fd1282e83364ad63e1207fa0956ef7102dd2938ac7771ceb2"}, + {file = "wisdem-4.0.5-cp314-cp314-win_amd64.whl", hash = "sha256:b912a57ffb8206b8e635ab710d51d96429c8e06f139dd9733212576e0b2f5265"}, + {file = "wisdem-4.0.5-cp314-cp314t-macosx_14_0_arm64.whl", hash = "sha256:92d5843bd9065d0ee08e8fc43bc222246c9374d3cb7b41d82ab3cd2616273e0f"}, + {file = "wisdem-4.0.5-cp314-cp314t-macosx_15_0_arm64.whl", hash = "sha256:64df7bd76d79e7cd412308f615c21c287cd2cb3842abde7412d0355d1375d2af"}, + {file = "wisdem-4.0.5-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5870790fb8d44535db0b8e50195f4352fe050be95163026f2337e5bfc5170bd2"}, + {file = "wisdem-4.0.5-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c26d49792394ab6ff7d4a85c808b94641ee5fdc5e8d9732c4ef20342f1a140f1"}, + {file = "wisdem-4.0.5-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:c946c169d7bd679ad7b7c89d81c58735e3bff3d79a848d3c27b2d6aa1787bc96"}, + {file = "wisdem-4.0.5-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:9ebd315b7f4dbd93acaef36470ea7a303df02484866b5904fa0a5040729baf1a"}, + {file = "wisdem-4.0.5-cp314-cp314t-win_amd64.whl", hash = "sha256:1198f91fb5c8964bda81bda1cd6c161350536679bd03fb41166ecacd865564fe"}, + {file = "wisdem-4.0.5-cp39-cp39-macosx_14_0_arm64.whl", hash = "sha256:035e242eb82b0cbf80497d487afb49d92474a96627a59684682eea479f703007"}, + {file = "wisdem-4.0.5-cp39-cp39-macosx_15_0_arm64.whl", hash = "sha256:fd68a77551832707d9ab2c5f7b5adbcb1826b5c9c1bc6baf766fc86d43da39a2"}, + {file = "wisdem-4.0.5-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:77f39e9e9d934d6ecd0aa46772b174c493f58f8c1ef95d15e978d1909e5b26ce"}, + {file = "wisdem-4.0.5-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:38a812b5bcd165ee9ccbc5b9cdcc11903488fcc5faaac043ac45867def1e4d57"}, + {file = "wisdem-4.0.5-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:ec75b435f752a7de52acb2ad25eb750593e1dab8f704fae06d772923d6033017"}, + {file = "wisdem-4.0.5-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:fde662130fa928552cbe0e8a28ccb87bc066c497d50be12b52dee40bf1b15a49"}, + {file = "wisdem-4.0.5-cp39-cp39-win_amd64.whl", hash = "sha256:441662d687e55bb0417ed73b75c6d2b63ce0f6a10d889d4a2a1a50c90e441685"}, + {file = "wisdem-4.0.5.tar.gz", hash = "sha256:2361912b9816d02f71bbe5f5852bc434d4f3d606821ecfb345c2254711081019"}, +] + +[package.dependencies] +jsonmerge = "*" +jsonschema = "*" +moorpy = ">=1.2" +numpy = "*" +openmdao = "*" +openpyxl = "*" +orbit-nrel = ">=1.2.1" +pandas = "*" +pydoe3 = "*" +pyyaml = "*" +scipy = "*" +sortedcontainers = "*" +statsmodels = ">=0.14.5" +windIO = "*" + +[package.extras] +dev = ["black", "isort", "meson", "ninja", "pre-commit", "swig"] +docs = ["numpydoc", "sphinx", "sphinx-copybutton", "sphinx-jsonschema", "sphinx_rtd_theme (>=1.3)", "sphinxcontrib-bibtex"] +gui = ["dearpygui"] +opt = ["nlopt", "pyoptsparse"] +test = ["coveralls", "pytest", "pytest-cov"] + +[[package]] +name = "xarray" +version = "2025.6.1" +description = "N-D labeled arrays and datasets in Python" +optional = false +python-versions = ">=3.10" +groups = ["floris"] +markers = "python_version < \"3.11\"" +files = [ + {file = "xarray-2025.6.1-py3-none-any.whl", hash = "sha256:8b988b47f67a383bdc3b04c5db475cd165e580134c1f1943d52aee4a9c97651b"}, + {file = "xarray-2025.6.1.tar.gz", hash = "sha256:a84f3f07544634a130d7dc615ae44175419f4c77957a7255161ed99c69c7c8b0"}, +] + +[package.dependencies] +numpy = ">=1.24" +packaging = ">=23.2" +pandas = ">=2.1" + +[package.extras] +accel = ["bottleneck", "flox", "numba (>=0.54)", "numbagg", "opt_einsum", "scipy"] +complete = ["xarray[accel,etc,io,parallel,viz]"] +etc = ["sparse"] +io = ["cftime", "fsspec", "h5netcdf", "netCDF4", "pooch", "pydap ; python_version < \"3.10\"", "scipy", "zarr"] +parallel = ["dask[complete]"] +types = ["pandas-stubs", "scipy-stubs", "types-PyYAML", "types-Pygments", "types-colorama", "types-decorator", "types-defusedxml", "types-docutils", "types-networkx", "types-openpyxl", "types-pexpect", "types-psutil", "types-pycurl", "types-python-dateutil", "types-pytz", "types-setuptools"] +viz = ["cartopy", "matplotlib", "nc-time-axis", "seaborn"] + +[[package]] +name = "xarray" +version = "2026.7.0" +description = "N-D labeled arrays and datasets in Python" +optional = false +python-versions = ">=3.11" +groups = ["floris"] +markers = "python_version >= \"3.11\"" +files = [ + {file = "xarray-2026.7.0-py3-none-any.whl", hash = "sha256:bf9dd130b93806dc78e90c1b7ac24851b31557b888674c53622235691cf21824"}, + {file = "xarray-2026.7.0.tar.gz", hash = "sha256:361b495928fdbf5b58d0969bb6775339019da5e93ca74d61ddf4eb5edd6ce604"}, +] + +[package.dependencies] +numpy = ">=1.26" +packaging = ">=24.2" +pandas = ">=2.2" + +[package.extras] +accel = ["bottleneck", "flox (>=0.10)", "numba (>=0.62)", "numbagg (>=0.9)", "opt_einsum", "scipy (>=1.15)"] +complete = ["xarray[accel,etc,io,parallel,viz]"] +etc = ["sparse (>=0.15)"] +io = ["cftime", "fsspec", "h5netcdf[h5py] (>=1.5.0)", "netCDF4 (>=1.6.0)", "pooch", "pydap", "scipy (>=1.15)", "zarr (>=3.0)"] +parallel = ["dask[complete]"] +types = ["pandas-stubs", "scipy-stubs", "types-PyYAML", "types-Pygments", "types-colorama", "types-decorator", "types-defusedxml", "types-docutils", "types-networkx", "types-openpyxl", "types-pexpect", "types-psutil", "types-pycurl", "types-python-dateutil", "types-pytz", "types-requests", "types-setuptools", "types-xlrd"] +viz = ["cartopy (>=0.24)", "matplotlib (>=3.10)", "nc-time-axis", "seaborn"] + [metadata] lock-version = "2.1" -python-versions = ">=3.10,<4.0" -content-hash = "fbfaf93683678bf7892ad47c20c98b358472a8122c7e2c210a885cb80c79fbed" +python-versions = ">3.10, <3.15" +content-hash = "5115538db144c529f7a4929f110cf1cfb41be0ee4dbe4cd13e5b9c874d6194ec" diff --git a/pyproject.toml b/pyproject.toml index 239968e..7642016 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,18 +1,27 @@ [tool.poetry] name = "MITRotor" -version = "0.2.1" +version = "0.2.2" description = "" authors = ["Jaime Liew "] readme = "README.md" packages = [{ include = "MITRotor" }] [tool.poetry.dependencies] -python = ">=3.10,<4.0" +python = ">3.10, <3.15" numpy = "^2.2.1" scipy = ">=1.6" unified-momentum-model = {git = "https://github.com/Howland-Lab/Unified-Momentum-Model.git"} pyyaml = "^6.0.1" +[tool.poetry.group.floris] +optional = true + +[tool.poetry.group.floris.dependencies] +floris = {git = "https://github.com/NatLabRockies/floris.git", branch = "dev/v5-beta"} +rosco = "^2.10.4" +joblib = "^1.5.3" +tqdm-joblib = "^0.0.5" + [tool.poetry.group.dev.dependencies] black = { extras = ["jupyter"], version = "^23.9.1" } ipython = "^8" @@ -30,14 +39,14 @@ matplotlib = "^3.7.3" polars = "^0.19.2" tqdm = "^4.66.1" - [build-system] requires = ["poetry-core"] build-backend = "poetry.core.masonry.api" - [tool.black] line-length = 120 [tool.ruff] line-length = 120 + +include = ["MITRotor/FlorisInterface/*.csv"] diff --git a/tests/test_bem.py b/tests/test_bem.py index b721efd..2e4ddd8 100644 --- a/tests/test_bem.py +++ b/tests/test_bem.py @@ -1,4 +1,4 @@ -from MITRotor import BEM, IEA15MW, UnifiedMomentum, BEMGeometry +from MITRotor import BEM, IEA15MW, UnifiedMomentum, UnifiedMomentumLUT, BEMGeometry from UnifiedMomentumModel.Utilities.Geometry import calc_eff_yaw import numpy as np from pytest import approx @@ -6,7 +6,6 @@ def test_IEA15MW(): IEA15MW() - def test_BEM_initialise(): rotor = IEA15MW() BEM(rotor=rotor) @@ -102,4 +101,101 @@ def test_model_yaw_tilt_rotor_phase(): # tilt and yaw should be offset by 90 degrees assert np.isclose(np.abs(theta_mesh[yaw_max_idx] - theta_mesh[tilt_max_idx]), np.pi / 2, atol = deg_atol) # yaw and evenly split yaw/tilt should be offset by 45 degrees - assert np.isclose(np.abs(theta_mesh[yaw_max_idx] - theta_mesh[yaw_and_tilt_max_idx]), np.pi / 4, atol = deg_atol) \ No newline at end of file + assert np.isclose(np.abs(theta_mesh[yaw_max_idx] - theta_mesh[yaw_and_tilt_max_idx]), np.pi / 4, atol = deg_atol) + +def _expected_shape(grid, Np, Nr, Ntheta): + if grid == "rotor": + return () if Np == 0 else (Np,) + elif grid == "annulus": + return (Nr,) if Np == 0 else (Np, Nr) + elif grid == "sector": + return (Nr, Ntheta) if Np == 0 else (Np, Nr, Ntheta) + else: + raise ValueError(grid) + + +def test_BEM_dimensionality(): + Nr, Ntheta = 20, 40 + rotor = IEA15MW() + + bems = [ + BEM(rotor=rotor, + momentum_model=UnifiedMomentum(averaging="rotor"), + geometry=BEMGeometry(Nr=Nr, Ntheta=Ntheta)), + + BEM(rotor=rotor, + momentum_model=UnifiedMomentumLUT(averaging="annulus"), + geometry=BEMGeometry(Nr=Nr, Ntheta=Ntheta)), + + BEM(rotor=rotor, + momentum_model=UnifiedMomentumLUT(averaging="sector"), + geometry=BEMGeometry(Nr=Nr, Ntheta=Ntheta)), + ] + + # --- inputs --- + pitch_s, tsr_s, yaw_s, tilt_s = 0.0, 7.0, 0.0, 0.0 + + pitch_v = np.array([0.0, 0.1, 0.2]) + tsr_v = np.array([6.0, 7.0, 8.0]) + yaw_v = np.array([0.0, 0.1, 0.2]) + tilt_v = np.array([0.0, -0.1, -0.2]) + + cases = [ + (pitch_s, tsr_s, yaw_s, tilt_s, 0), + (pitch_v, tsr_v, yaw_v, tilt_v, 3), + ] + + fields = ["Cp", "Cp_corr", "Ct", "a", "aoa"] + + for pitch, tsr, yaw, tilt, Np in cases: + for bem in bems: + sol = bem(pitch, tsr, yaw=yaw, tilt=tilt) + + # ========================= + # 1. u4, w4 dimensionality + # ========================= + u4 = np.asarray(sol.u4) + w4 = np.asarray(sol.w4) + + expected = () if Np == 0 else (Np,) + assert u4.shape == expected + assert w4.shape == expected + + # ========================= + # 2. Shape checks for fields + # ========================= + for grid in ["rotor", "annulus", "sector"]: + expected_shape = _expected_shape(grid, Np, Nr, Ntheta) + + for name in fields: + val = np.asarray(getattr(sol, name)(grid=grid)) + assert val.shape == expected_shape, f"{name}, {grid}" + # ========================= + # 3. Vectorized vs Loop + # ========================= + if Np > 0: # Only test vectorized case + # Solve in loop (scalar inputs) + sols_loop = [] + for i in range(Np): + sol_loop = bem(pitch[i], tsr[i], yaw=yaw[i], tilt=tilt[i]) + sols_loop.append(sol_loop) + + # Compare u4, w4 + u4_vec = np.asarray(sol.u4) + w4_vec = np.asarray(sol.w4) + + u4_loop = np.stack([np.asarray(s.u4) for s in sols_loop]) + w4_loop = np.stack([np.asarray(s.w4) for s in sols_loop]) + + np.testing.assert_allclose(u4_vec, u4_loop, atol=1e-5) + np.testing.assert_allclose(w4_vec, w4_loop, atol=1e-5) + + # Compare field outputs + for grid in ["rotor", "annulus", "sector"]: + for name in fields: + val_vec = np.asarray(getattr(sol, name)(grid=grid)) + val_loop = np.stack([ + np.asarray(getattr(s, name)(grid=grid)) + for s in sols_loop + ]) + np.testing.assert_allclose(val_vec, val_loop, atol=1e-5) diff --git a/tests/test_floris_interface.py b/tests/test_floris_interface.py new file mode 100644 index 0000000..7c0e8d5 --- /dev/null +++ b/tests/test_floris_interface.py @@ -0,0 +1,116 @@ +import os +import numpy as np +import pytest +import polars as pl +from numpy.testing import assert_almost_equal, assert_allclose +from floris import FlorisModel, TimeSeries +from MITRotor.FlorisInterface.FlorisInterface import MITRotorTurbine, default_bem_factory, default_pitch_interp, default_tsr_interp + + +def test_pitch_tsr_interpolation(): + # create default interpolators + tsr_interp = default_tsr_interp() + pitch_interp = default_pitch_interp() + + # load raw CSV data + module_dir = os.path.dirname(__file__) # tests/ + validation_csv = os.path.abspath(os.path.join(module_dir, "..", "MITRotor", "FlorisInterface", "IEA_15mw_rotor.csv")) + df = pl.read_csv(validation_csv) + wind_data = df["Wind [m/s]"].to_numpy() + pitch_deg_data = df["Pitch [deg]"].to_numpy() + pitch_rad_data = np.deg2rad(pitch_deg_data) + tip_speed_data = df["Tip Speed [m/s]"].to_numpy() + tsr_data = tip_speed_data / wind_data + + # interpolator reproduces raw data + assert_allclose(tsr_interp(wind_data), tsr_data, rtol=1e-12, atol=1e-12) + assert_allclose(pitch_interp(wind_data), pitch_rad_data, rtol=1e-12, atol=1e-12) + + # reasonable values + x_interp_vals = np.linspace(0.0, 25.0, 100) + tsr_interp_vals = tsr_interp(x_interp_vals) + pitch_interp_vals = pitch_interp(x_interp_vals) + assert np.all(np.isfinite(tsr_interp_vals)) + assert np.all(np.isfinite(pitch_interp_vals)) + assert np.all(tsr_interp_vals > 0.0) + assert np.all(pitch_interp_vals >= -10.0) # deg, loose bound + assert np.all(pitch_interp_vals <= 40.0) + + +# compute MITRotor BEM outputs directly +def compute_mitrotor_cp_ct_a(wind_speeds, yaw_deg = 0.0, tilt_deg = 0.0): + bem_model = default_bem_factory() # default BEM (IEA15MW) used in floris interface + pitch_interp = default_pitch_interp() # IEA15MW pitch curve + tsr_interp = default_tsr_interp() # IEA15MW tsr curve + + n = len(wind_speeds) + Ct = np.empty(n) + a = np.empty(n) + for i, ws in enumerate(wind_speeds): + pitch_rad = pitch_interp(ws) + tsr = tsr_interp(ws) + sol = bem_model(pitch_rad, tsr, yaw=np.deg2rad(yaw_deg), tilt = np.deg2rad(tilt_deg)) + Ct[i] = sol.Ct() + a[i] = sol.a() + + return Ct, a + +@pytest.mark.parametrize("n_turbines", [1, 2]) +def test_mitrotor_floris_wind_speeds(n_turbines): + wind_speeds = np.array([6.0, 8.0, 10.0, 12.0]) + wind_dirs = np.full_like(wind_speeds, 270.0) + turbulence_intensity = np.zeros_like(wind_speeds) + + time_series = TimeSeries( + wind_speeds=wind_speeds, + wind_directions=wind_dirs, + turbulence_intensities=turbulence_intensity, + ) + + layout_x = np.linspace(0.0, 500.0 * (n_turbines - 1), n_turbines) + layout_y = np.zeros_like(layout_x) + + fmodel = FlorisModel("defaults") + fmodel.set(layout_x=layout_x, layout_y=layout_y, wind_data=time_series) + fmodel.set_operation_model(MITRotorTurbine()) + + fmodel.run() + + floris_Ct = fmodel.get_turbine_thrust_coefficients() + floris_a = fmodel.get_turbine_axial_induction_factors() + + mit_Ct, mit_a = compute_mitrotor_cp_ct_a(wind_speeds) + + # First turbine matches MITRotor BEM (<1% error) + assert_almost_equal(floris_Ct[:, 0], mit_Ct, decimal=2) + assert_almost_equal(floris_a[:, 0], mit_a, decimal=2) + + if n_turbines > 1: + # first turbine produces more power than the second (wake effects) + floris_power = fmodel.get_turbine_powers() + assert np.all(floris_power[:, 0] > floris_power[:, 1]) + + # yawing the first turbine decreases first turbine power and increases second turbine power + fmodel = FlorisModel("defaults") + yaw_angles = np.tile(np.array([5.0, 0.0]), (4,1)) + fmodel.set(layout_x=layout_x, layout_y=layout_y, wind_data=time_series, yaw_angles = yaw_angles) + fmodel.set_operation_model(MITRotorTurbine()) + fmodel.run() + yawed_floris_power = fmodel.get_turbine_powers() + assert np.all(floris_power[:, 0] > yawed_floris_power[:, 0]) + assert np.all(floris_power[:, 1] < yawed_floris_power[:, 1]) + + # TODO: uncomment if tilt is able to be set for Floris + # tilting the first turbine decreases first turbine power and increases second turbine power + # fmodel = FlorisModel("defaults") + # tilt_angles = np.tile(np.array([5.0, 0.0]), (4,1)) + # fmodel.set(layout_x=layout_x, layout_y=layout_y, wind_data=time_series, tilt_angles = tilt_angles) + # fmodel.set_operation_model(MITRotorTurbine()) + # fmodel.run() + # tilted_floris_power = fmodel.get_turbine_powers() + # assert np.all(floris_power[:, 0] > tilted_floris_power[:, 0]) + # assert np.all(floris_power[:, 1] < tilted_floris_power[:, 1]) + + # # yawing and tilting turbines is equivalent + # assert_almost_equal(yawed_floris_power[:, 0], tilted_floris_power[:, 0], decimal=4) + # assert_almost_equal(yawed_floris_power[:, 1], tilted_floris_power[:, 1], decimal=4)