From dd8fdec269b6ffc9118f82cdd339f47e5d453078 Mon Sep 17 00:00:00 2001 From: Yannick Marcon Date: Mon, 16 Feb 2026 15:40:02 +0100 Subject: [PATCH 1/7] feat: implemented R sessions api --- datashield_opal/impl.py | 137 +++- examples/datashield.py.ipynb | 1286 ++++++++++++++++++++++++++++++++++ pyproject.toml | 8 +- uv.lock | 859 ++++++++++++++++++++++- 4 files changed, 2265 insertions(+), 25 deletions(-) create mode 100644 examples/datashield.py.ipynb diff --git a/datashield_opal/impl.py b/datashield_opal/impl.py index 6da6983..7ad261e 100644 --- a/datashield_opal/impl.py +++ b/datashield_opal/impl.py @@ -5,7 +5,7 @@ from argparse import Namespace from contextlib import suppress from obiba_opal.core import OpalClient, UriBuilder, OpalRequest, OpalResponse, HTTPError -from datashield.interface import DSLoginInfo, DSDriver, DSConnection, DSResult, DSError +from datashield.interface import DSLoginInfo, DSDriver, DSConnection, DSResult, DSError, RSession class OpalDSError(DSError): @@ -23,6 +23,97 @@ def is_server_error(self) -> bool: return isinstance(self.exception, HTTPError) and self.exception.code >= 500 +class OpalRSession(RSession): + def __init__(self, client: OpalClient, profile: str = None, restore: str = None, verbose: bool = False): + self.client = client + self.profile = profile + self.restore = restore + self.verbose = verbose + self.id = None + + def get_id(self) -> str: + if self.id is None: + self.start(False) + return self.id + + def start(self, asynchronous: bool = True) -> None: + builder = UriBuilder(["datashield", "sessions"]).query("wait", not asynchronous) + if self.profile is not None: + builder.query("profile", self.profile) + if self.restore is not None: + builder.query("restore", self.restore) + response = self._post(builder.build()).send() + if response.code != 201: + raise OpalDSError(ValueError(f"Failed to start R session: {response.code}")) + session = response.from_json() + if "id" not in session: + raise OpalDSError(ValueError("Failed to start R session: no session id returned")) + self.id = session["id"] + + def is_ready(self) -> bool: + if self.id is None: + raise OpalDSError(ValueError("R session not started")) + response = self._get(UriBuilder(["datashield", "session", self.id]).build()).send() + if response.code != 200: + raise OpalDSError(ValueError(f"Failed to check R session status: {response.code}")) + session = response.from_json() + return session.get("state", "").lower() == "running" + + def is_pending(self) -> bool: + if self.id is None: + raise OpalDSError(ValueError("R session not started")) + response = self._get(UriBuilder(["datashield", "session", self.id]).build()).send() + if response.code != 200: + raise OpalDSError(ValueError(f"Failed to check R session status: {response.code}")) + session = response.from_json() + return session.get("state", "").lower() == "pending" + + def is_failed(self) -> bool: + if self.id is None: + raise OpalDSError(ValueError("R session not started")) + response = self._get(UriBuilder(["datashield", "session", self.id]).build()).send() + if response.code != 200: + raise OpalDSError(ValueError(f"Failed to check R session status: {response.code}")) + session = response.from_json() + return session.get("state", "").lower() == "failed" + + def get_state_message(self) -> str: + if self.id is None: + raise OpalDSError(ValueError("R session not started")) + response = self._get(UriBuilder(["datashield", "session", self.id]).build()).send() + if response.code != 200: + raise OpalDSError(ValueError(f"Failed to check R session status: {response.code}")) + session = response.from_json() + events = session.get("events", []) + if events: + return events[-1] + return "No recent events" + + def close(self) -> None: + if self.id is not None: + builder = UriBuilder(["datashield", "session", self.id]) + self._delete(builder.build()).send() + self.id = None + + def _post(self, ws: str) -> OpalRequest: + request = self.client.new_request() + if self.verbose: + request.verbose() + return request.accept_json().post().resource(ws) + + def _get(self, ws: str) -> OpalRequest: + request = self.client.new_request() + if self.verbose: + request.verbose() + return request.accept_json().get().resource(ws) + + def _delete(self, ws: str) -> OpalRequest: + request = self.client.new_request() + if self.verbose: + request.verbose() + return request.accept_json().delete().resource(ws) + + class OpalConnection(DSConnection): def __init__(self, name: str, loginInfo: OpalClient.LoginInfo, profile: str = "default", restore: str = None): self.name = name @@ -30,8 +121,8 @@ def __init__(self, name: str, loginInfo: OpalClient.LoginInfo, profile: str = "d self.subject = None self.profile = profile self.restore = restore - self.session = None self.verbose = False + self.rsession = None # # Content listing @@ -68,6 +159,25 @@ def has_resource(self, name: str) -> bool: response = self._get(UriBuilder(["project", parts[0], "resource", parts[1]]).build()).send() return response.code == 200 + # + # R Session (server side) + # + + def has_session(self) -> bool: + return self.rsession is not None + + def start_session(self, asynchronous: bool = True) -> RSession: + if self.rsession is not None: + return self.rsession + self.rsession = OpalRSession(self.client, profile=self.profile, restore=self.restore, verbose=self.verbose) + self.rsession.start(asynchronous=asynchronous) + return self.rsession + + def get_session(self) -> RSession: + if self.rsession is None: + raise OpalDSError(ValueError("No R session established. Please start a session first.")) + return self.rsession + # # Assign # @@ -249,10 +359,8 @@ def disconnect(self) -> None: """ Close DataSHIELD session, and then Opal session. """ - if self.session is not None: - builder = UriBuilder(["datashield", "session", self._get_session_id()]) - self._delete(builder.build()).send() - self.session = None + if self.rsession is not None: + self.rsession.close() self.client.close() # @@ -267,21 +375,8 @@ def _get_subject(self): return self.subject def _get_session_id(self) -> str: - return self._get_session()["id"] - - def _get_session(self): - if self.session is None: - builder = UriBuilder(["datashield", "sessions"]) - if self.profile is not None: - builder.query("profile", self.profile) - if self.restore is not None: - builder.query("restore", self.restore) - response = self._post(builder.build()).send() - if response.code == 201: - self.session = response.from_json() - else: - raise OpalDSError(ValueError(f"DataSHIELD session creation failed: {response.code}")) - return self.session + self.start_session(asynchronous=False) + return self.rsession.get_id() def _get(self, ws) -> OpalRequest: request = self.client.new_request() diff --git a/examples/datashield.py.ipynb b/examples/datashield.py.ipynb new file mode 100644 index 0000000..b9a7c89 --- /dev/null +++ b/examples/datashield.py.ipynb @@ -0,0 +1,1286 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "9a8b742c", + "metadata": {}, + "source": [ + "# DataSHIELD Python Demo\n", + "\n", + "1. Establish connections with DataSHIELD nodes" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "id": "298b59d2", + "metadata": {}, + "outputs": [], + "source": [ + "from datashield import DSSession, DSLoginBuilder, DSError\n", + "import pandas as pd\n", + "\n", + "url = 'https://opal-demo.obiba.org'\n", + "builder = DSLoginBuilder().add('server1', url, 'dsuser', 'P@ssw0rd').add('server2', url, 'dsuser', 'P@ssw0rd')\n", + "logins = builder.build()\n", + "\n", + "session = DSSession(logins)\n", + "session.open()" + ] + }, + { + "cell_type": "markdown", + "id": "a2071f3c", + "metadata": {}, + "source": [ + "2. Utility functions" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "a8c38e5d", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'server1': {'available': ['default',\n", + " 'exposome',\n", + " 'geo',\n", + " 'lemon-donkey',\n", + " 'margin-idiom',\n", + " 'mediation',\n", + " 'mtl',\n", + " 'omics',\n", + " 'omop',\n", + " 'survival'],\n", + " 'current': 'default'},\n", + " 'server2': {'available': ['default',\n", + " 'exposome',\n", + " 'geo',\n", + " 'lemon-donkey',\n", + " 'margin-idiom',\n", + " 'mediation',\n", + " 'mtl',\n", + " 'omics',\n", + " 'omop',\n", + " 'survival'],\n", + " 'current': 'default'}}" + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "session.profiles()" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "66a8c7ed", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
pkgversion
0dsTidyverse1.1.0
1dsBase6.3.4
2resourcer1.5.0
\n", + "
" + ], + "text/plain": [ + " pkg version\n", + "0 dsTidyverse 1.1.0\n", + "1 dsBase 6.3.4\n", + "2 resourcer 1.5.0" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "pkgs = session.packages()\n", + "pd.DataFrame.from_records(pkgs['server1'])" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "d6853094", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
nameclassvaluepkgversion
0NROWfuncbase::NROWdsBase6.3.4
1asFactorDS1funcdsBase::asFactorDS1dsBase6.3.4
2asListDSfuncdsBase::asListDSdsBase6.3.4
3aucDSfuncdsBase::aucDSdsBase6.3.4
4boxPlotGGDSfuncdsBase::boxPlotGGDSdsBase6.3.4
..................
67tableDSfuncdsBase::tableDSdsBase6.3.4
68tableDS2funcdsBase::tableDS2dsBase6.3.4
69tapplyDSfuncdsBase::tapplyDSdsBase6.3.4
70testObjExistsDSfuncdsBase::testObjExistsDSdsBase6.3.4
71varDSfuncdsBase::varDSdsBase6.3.4
\n", + "

72 rows × 5 columns

\n", + "
" + ], + "text/plain": [ + " name class value pkg version\n", + "0 NROW func base::NROW dsBase 6.3.4\n", + "1 asFactorDS1 func dsBase::asFactorDS1 dsBase 6.3.4\n", + "2 asListDS func dsBase::asListDS dsBase 6.3.4\n", + "3 aucDS func dsBase::aucDS dsBase 6.3.4\n", + "4 boxPlotGGDS func dsBase::boxPlotGGDS dsBase 6.3.4\n", + ".. ... ... ... ... ...\n", + "67 tableDS func dsBase::tableDS dsBase 6.3.4\n", + "68 tableDS2 func dsBase::tableDS2 dsBase 6.3.4\n", + "69 tapplyDS func dsBase::tapplyDS dsBase 6.3.4\n", + "70 testObjExistsDS func dsBase::testObjExistsDS dsBase 6.3.4\n", + "71 varDS func dsBase::varDS dsBase 6.3.4\n", + "\n", + "[72 rows x 5 columns]" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "methods = session.methods(type='aggregate')\n", + "pd.DataFrame.from_records(methods['server1'])" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "c226246e", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'server1': ['CNSIM.CNSIM1',\n", + " 'CNSIM.CNSIM2',\n", + " 'CNSIM.CNSIM3',\n", + " 'DASIM.DASIM1',\n", + " 'DASIM.DASIM2',\n", + " 'DASIM.DASIM3',\n", + " 'DISCORDANT.DISCORDANT_STUDY1',\n", + " 'DISCORDANT.DISCORDANT_STUDY2',\n", + " 'DISCORDANT.DISCORDANT_STUDY3',\n", + " 'GREENSPACE.Cohort1_exposome',\n", + " 'GREENSPACE.Cohort2_exposome',\n", + " 'GREENSPACE.Cohort3_exposome',\n", + " 'GWAS.ega_phenotypes',\n", + " 'GWAS.ega_phenotypes_1',\n", + " 'GWAS.ega_phenotypes_2',\n", + " 'GWAS.ega_phenotypes_3',\n", + " 'MEDIATION.UPBdata1',\n", + " 'MEDIATION.UPBdata2',\n", + " 'MEDIATION.UPBdata3',\n", + " 'SURVIVAL.EXPAND_WITH_MISSING1',\n", + " 'SURVIVAL.EXPAND_WITH_MISSING2',\n", + " 'SURVIVAL.EXPAND_WITH_MISSING3',\n", + " 'TESTING.TESTING1',\n", + " 'TESTING.TESTING2',\n", + " 'TESTING.TESTING3',\n", + " 'TITANIC_NEWCOMERS_WORKSHOP.titanic_server_1',\n", + " 'TITANIC_NEWCOMERS_WORKSHOP.titanic_server_2',\n", + " 'depression.growth_1',\n", + " 'depression.growth_2'],\n", + " 'server2': ['CNSIM.CNSIM1',\n", + " 'CNSIM.CNSIM2',\n", + " 'CNSIM.CNSIM3',\n", + " 'DASIM.DASIM1',\n", + " 'DASIM.DASIM2',\n", + " 'DASIM.DASIM3',\n", + " 'DISCORDANT.DISCORDANT_STUDY1',\n", + " 'DISCORDANT.DISCORDANT_STUDY2',\n", + " 'DISCORDANT.DISCORDANT_STUDY3',\n", + " 'GREENSPACE.Cohort1_exposome',\n", + " 'GREENSPACE.Cohort2_exposome',\n", + " 'GREENSPACE.Cohort3_exposome',\n", + " 'GWAS.ega_phenotypes',\n", + " 'GWAS.ega_phenotypes_1',\n", + " 'GWAS.ega_phenotypes_2',\n", + " 'GWAS.ega_phenotypes_3',\n", + " 'MEDIATION.UPBdata1',\n", + " 'MEDIATION.UPBdata2',\n", + " 'MEDIATION.UPBdata3',\n", + " 'SURVIVAL.EXPAND_WITH_MISSING1',\n", + " 'SURVIVAL.EXPAND_WITH_MISSING2',\n", + " 'SURVIVAL.EXPAND_WITH_MISSING3',\n", + " 'TESTING.TESTING1',\n", + " 'TESTING.TESTING2',\n", + " 'TESTING.TESTING3',\n", + " 'TITANIC_NEWCOMERS_WORKSHOP.titanic_server_1',\n", + " 'TITANIC_NEWCOMERS_WORKSHOP.titanic_server_2',\n", + " 'depression.growth_1',\n", + " 'depression.growth_2']}" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "session.tables()" + ] + }, + { + "cell_type": "code", + "execution_count": 355, + "id": "30574455", + "metadata": {}, + "outputs": [], + "source": [ + "#session.resources()" + ] + }, + { + "cell_type": "markdown", + "id": "41680012", + "metadata": {}, + "source": [ + "3. Make analysis" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "id": "8c3f1ce1", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'server1': ['client', 'df'], 'server2': ['client']}" + ] + }, + "execution_count": 26, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "session.assign_resource('client', resources = { 'server1': 'RSRC.CNSIM1', 'server2': 'RSRC.CNSIM1' })\n", + "session.ls()" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "id": "c9f5ae1a", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'server1': ['SQLResourceClient', 'ResourceClient', 'R6'],\n", + " 'server2': ['SQLResourceClient', 'ResourceClient', 'R6']}" + ] + }, + "execution_count": 27, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "session.aggregate('classDS(\"client\")')" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "id": "36dbc72d", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'server1': ['client', 'df'], 'server2': ['client', 'df']}" + ] + }, + "execution_count": 28, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "session.assign_expr('df', 'as.resource.data.frame(client, strict = TRUE)')\n", + "session.ls()" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "id": "ccdcfd91", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'server1': 'data.frame', 'server2': 'data.frame'}" + ] + }, + "execution_count": 29, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "session.aggregate('classDS(\"df\")')" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "id": "9ae41ebc", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'server1': ['id',\n", + " 'LAB_TSC',\n", + " 'LAB_TRIG',\n", + " 'LAB_HDL',\n", + " 'LAB_GLUC_ADJUSTED',\n", + " 'PM_BMI_CONTINUOUS',\n", + " 'DIS_CVA',\n", + " 'MEDI_LPD',\n", + " 'DIS_DIAB',\n", + " 'DIS_AMI',\n", + " 'GENDER',\n", + " 'PM_BMI_CATEGORICAL'],\n", + " 'server2': ['id',\n", + " 'LAB_TSC',\n", + " 'LAB_TRIG',\n", + " 'LAB_HDL',\n", + " 'LAB_GLUC_ADJUSTED',\n", + " 'PM_BMI_CONTINUOUS',\n", + " 'DIS_CVA',\n", + " 'MEDI_LPD',\n", + " 'DIS_DIAB',\n", + " 'DIS_AMI',\n", + " 'GENDER',\n", + " 'PM_BMI_CATEGORICAL']}" + ] + }, + "execution_count": 30, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "session.aggregate('colnamesDS(\"df\")')" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "id": "ee31c50b", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'server1': {'EstimatedMean': 6.12409001097695,\n", + " 'Nmissing': 341,\n", + " 'Nvalid': 1822,\n", + " 'Ntotal': 2163,\n", + " 'ValidityMessage': 'VALID ANALYSIS'},\n", + " 'server2': {'EstimatedMean': 6.12409001097695,\n", + " 'Nmissing': 341,\n", + " 'Nvalid': 1822,\n", + " 'Ntotal': 2163,\n", + " 'ValidityMessage': 'VALID ANALYSIS'}}" + ] + }, + "execution_count": 31, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "session.aggregate('meanDS(df$LAB_GLUC_ADJUSTED)')" + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "id": "d4cde00d", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'server1': ['client', 'df', 'df2'], 'server2': ['client', 'df', 'df2']}" + ] + }, + "execution_count": 32, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "session.assign_table('df2', tables = { 'server1': 'CNSIM.CNSIM1', 'server2': 'CNSIM.CNSIM2' })\n", + "session.ls()" + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "id": "f6ed662c", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[[0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 2.59225,\n", + " 0.068282325],\n", + " [0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 2.95275,\n", + " 0.208472975],\n", + " [0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 3,\n", + " 0,\n", + " 4,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 3.31325,\n", + " 0.348663625],\n", + " [0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 8,\n", + " 0,\n", + " 4,\n", + " 0,\n", + " 5,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 3.67375,\n", + " 0.488854275],\n", + " [0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 3,\n", + " 8,\n", + " 3,\n", + " 8,\n", + " 7,\n", + " 6,\n", + " 11,\n", + " 0,\n", + " 6,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 4.03425,\n", + " 0.629044925],\n", + " [0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 3,\n", + " 0,\n", + " 4,\n", + " 13,\n", + " 16,\n", + " 6,\n", + " 12,\n", + " 12,\n", + " 9,\n", + " 6,\n", + " 4,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 4.39475,\n", + " 0.769235575],\n", + " [0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 3,\n", + " 7,\n", + " 11,\n", + " 14,\n", + " 16,\n", + " 28,\n", + " 25,\n", + " 16,\n", + " 9,\n", + " 9,\n", + " 10,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 4.75525,\n", + " 0.909426225],\n", + " [0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 4,\n", + " 7,\n", + " 19,\n", + " 21,\n", + " 28,\n", + " 31,\n", + " 26,\n", + " 27,\n", + " 13,\n", + " 10,\n", + " 0,\n", + " 3,\n", + " 0,\n", + " 0,\n", + " 5.11575,\n", + " 1.049616875],\n", + " [0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 5,\n", + " 13,\n", + " 14,\n", + " 28,\n", + " 37,\n", + " 28,\n", + " 28,\n", + " 26,\n", + " 23,\n", + " 14,\n", + " 6,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 5.47625,\n", + " 1.189807525],\n", + " [0,\n", + " 0,\n", + " 0,\n", + " 3,\n", + " 0,\n", + " 5,\n", + " 6,\n", + " 8,\n", + " 24,\n", + " 22,\n", + " 29,\n", + " 35,\n", + " 39,\n", + " 30,\n", + " 20,\n", + " 15,\n", + " 0,\n", + " 4,\n", + " 0,\n", + " 0,\n", + " 5.83675,\n", + " 1.329998175],\n", + " [0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 4,\n", + " 0,\n", + " 11,\n", + " 14,\n", + " 18,\n", + " 32,\n", + " 28,\n", + " 28,\n", + " 24,\n", + " 23,\n", + " 12,\n", + " 8,\n", + " 5,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 6.19725,\n", + " 1.470188825],\n", + " [0,\n", + " 0,\n", + " 0,\n", + " 3,\n", + " 0,\n", + " 3,\n", + " 6,\n", + " 14,\n", + " 17,\n", + " 18,\n", + " 27,\n", + " 25,\n", + " 25,\n", + " 19,\n", + " 15,\n", + " 9,\n", + " 5,\n", + " 4,\n", + " 0,\n", + " 0,\n", + " 6.55775,\n", + " 1.610379475],\n", + " [0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 5,\n", + " 6,\n", + " 7,\n", + " 10,\n", + " 21,\n", + " 24,\n", + " 9,\n", + " 19,\n", + " 13,\n", + " 6,\n", + " 11,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 6.91825,\n", + " 1.750570125],\n", + " [0,\n", + " 0,\n", + " 0,\n", + " 4,\n", + " 0,\n", + " 5,\n", + " 6,\n", + " 6,\n", + " 10,\n", + " 10,\n", + " 9,\n", + " 13,\n", + " 9,\n", + " 3,\n", + " 4,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 3,\n", + " 0,\n", + " 7.27875,\n", + " 1.890760775],\n", + " [0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 3,\n", + " 3,\n", + " 3,\n", + " 0,\n", + " 8,\n", + " 6,\n", + " 8,\n", + " 10,\n", + " 6,\n", + " 8,\n", + " 6,\n", + " 3,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 7.63925,\n", + " 2.030951425],\n", + " [0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 3,\n", + " 0,\n", + " 3,\n", + " 6,\n", + " 6,\n", + " 6,\n", + " 5,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 3,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 7.99975,\n", + " 2.171142075],\n", + " [0,\n", + " 3,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 8.36025,\n", + " 2.311332725],\n", + " [0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 8.72075,\n", + " 2.451523375],\n", + " [0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 9.08125,\n", + " 2.591714025],\n", + " [0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 9.44175,\n", + " 2.731904675]]" + ] + }, + "execution_count": 33, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "numints = 20\n", + "densityGrid = session.aggregate(f'densityGridDS(df2$LAB_TSC, df2$LAB_HDL, limits=FALSE, x.min=NULL, x.max=NULL, y.min=NULL, y.max=NULL, numints = {numints})')\n", + "densityGrid['server1']" + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "id": "51dc8812", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAiwAAAGzCAYAAAAMr0ziAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjgsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvwVt1zgAAAAlwSFlzAAAPYQAAD2EBqD+naQAAOHlJREFUeJzt3Xt0VOW9//HPJCETCElQCSSBcJFr5SqphqAISjREikAtYMQSrKKHA602WJFWxQMeU+oVC0V7llyEKpcWwQsHCshFBVTAHMULAg2EW4JBkpAgCSTP74/zYw5jMklGZ5Mn4f1aa6/F3vvZ3/nu2TOZD3v2zLiMMUYAAAAWC6rrBgAAAGpCYAEAANYjsAAAAOsRWAAAgPUILAAAwHoEFgAAYD0CCwAAsB6BBQAAWI/AAgAArEdgAXDJKi4uVosWLfS3v/2trluxWt++ffXwww/XdRu4xBFYAB8+/vhjTZo0Sd26dVN4eLjatGmjUaNG6euvv651jXbt2snlcsnlcikoKEjNmjVTjx49dN999+nDDz+sdZ2BAweqe/fuVa47cOCAXC6XnnnmmVrX+yGeeuoprVy5slZjz/fkcrn05JNPVjlmzJgxcrlcatq0aQC79M+sWbMUERGhO+64o856qCvFxcWaNm2aBg8erMsvv1wul0sLFiyocuyUKVM0Z84c5ebmXtwmgQsQWAAfZs6cqX/84x8aNGiQZs2apfvuu09btmxRnz59tHv37lrX6d27txYtWqRXX31VmZmZuvHGG/XWW2+pb9++ysjIcHAPAsufwHJeWFiYXn/99UrLS0pKtGrVKoWFhQWoO/+dPXtWs2bN0r333qvg4OA666Ou5Ofna/r06fryyy/Vq1evascOGzZMkZGR+stf/nKRugMqI7AAPmRkZOjgwYN68cUXde+99+rRRx/Ve++9p3PnzumPf/xjreu0atVKd911l+666y5NmDBBL774ov71r39p+PDhev755zV37lwH96Ju3Xrrrfriiy/0P//zP17LV61apbKyMt1888111Jn09ttv65tvvtGoUaMu6u2WlJRYcVuxsbE6duyYDh48qKeffrraOkFBQfrFL36hV199VfxeLuoKgQXwoV+/fgoNDfVa1qlTJ3Xr1k1ffvnlj6rduHFjLVq0SJdffrn+8z//05EXgYKCAj344IOKj4+X2+1Wx44dNXPmTFVUVHiNe+aZZ9SvXz9dccUVaty4sRISEvT3v//da4zL5VJJSYkWLlzoeatn3LhxNfaQlJSk9u3b67XXXvNa/re//c3zVsT3rVq1SkOGDFFcXJzcbrc6dOigGTNmqLy83Gvc+bfJdu7cqX79+qlx48Zq3769XnrppVrdPytXrlS7du3UoUMHr+W5ubm6++671bp1a7ndbsXGxmrYsGE6cOCA17j//u//Vv/+/RUeHq6IiAgNGTJEn3/+udeYcePGqWnTptq/f79uvfVWRUREaMyYMZo0aZKaNm2q06dPV+orLS1NMTExXvv7Y27LF7fbrZiYmFrdV5J088036+DBg8rKyqr1NkAgEVgAPxhjlJeXp+bNm//oWk2bNtWIESN05MgRffHFFzWOLy8vV35+fqXp5MmTlcaePn1aAwYM0OLFizV27Fi9+OKLuu666zR16tRKb0PNmjVLV199taZPn66nnnpKISEhGjlypN555x3PmEWLFsntdqt///5atGiRFi1apPvvv79W+5mWlqYlS5Z4Qll+fr7++c9/6s4776xy/IIFC9S0aVNlZGRo1qxZSkhI0OOPP65HHnmk0tiTJ0/q1ltvVUJCgv70pz+pdevWmjBhgubNm1djX1u3blWfPn0qLb/99tv1xhtv6O6779Zf/vIX/eY3v9GpU6eUk5PjdX8MGTJETZs21cyZM/XYY4/piy++0PXXX18p2Jw7d04pKSlq0aKFnnnmGd1+++0aPXq0SkpKvO5j6X+P21tvvaVf/OIXnrepfuxtBUpCQoIk6YMPPghYTcAvBkCtLVq0yEgyr7zySq3Gt23b1gwZMsTn+ueff95IMqtWraq2zoABA4ykaqenn37aM37GjBkmPDzcfP311151HnnkERMcHGxycnI8y06fPu01pqyszHTv3t3cdNNNXsvDw8NNenp6TbtsjDEmOzvb09Pu3buNJPPee+8ZY4yZM2eOadq0qSkpKTHp6ekmPDzca9vv92OMMffff79p0qSJOXPmTKX75Nlnn/UsKy0tNb179zYtWrQwZWVlPvs7e/ascblcZvLkyV7LT548Wem+/L5Tp06ZZs2amfHjx3stz83NNVFRUV7L09PTjSTzyCOPeI2tqKgwrVq1MrfffrvX8mXLlhlJZsuWLQG7rdr4+OOPjSQzf/78aseFhoaaCRMm+F0fCATOsAC19NVXX2nixIlKSkpSenp6QGqe/4TMqVOnahzbrl07rVu3rtK0ePHiSmOXL1+u/v3767LLLvM6G5OcnKzy8nJt2bLFM7Zx48aef588eVKFhYXq37+/du3aFYA9lLp166aePXt6Lr597bXXNGzYMDVp0qTK8Rf2c+rUKeXn56t///46ffq0vvrqK6+xISEhXmd6QkNDdf/99+v48ePauXOnz56+/fZbGWN02WWXVbrt0NBQbdq0qcozV5K0bt06FRQUKC0tzeu+DQ4OVmJiojZu3FhpmwkTJnjNu1wujRw5UqtXr1ZxcbFn+dKlS9WqVStdf/31AbutQDr/eALqQkhdNwDUB7m5uRoyZIiioqL097//3etTJYWFhfruu+8886GhoVVem1GV8y9WERERNY4NDw9XcnJypeXff1tAkvbu3atPP/1U0dHRVdY6fvy4599vv/22nnzySWVlZam0tNSz3OVy1dhTbd1555169tln9dvf/lZbt27V73//e59jP//8cz366KN69913VVRU5LWusLDQaz4uLk7h4eFeyzp37izpf++Xvn37VtuX+d61Q263WzNnztTkyZPVsmVL9e3bVz/72c80duxYz/Uee/fulSTddNNNVdaMjIz0mg8JCVHr1q0rjRs9erReeOEFvfnmm7rzzjtVXFys1atX6/777/fc94G6rUAxxgT0cQH4g8AC1KCwsFCpqakqKCjQe++9p7i4OK/1DzzwgBYuXOiZHzBggDZt2lSr2uc/Ht2xY8eA9StJFRUVuvnmm31+2df5F/X33ntPt912m2644Qb95S9/UWxsrBo1aqT58+dXulD2x0hLS9PUqVM1fvx4XXHFFbrllluqHFdQUKABAwYoMjJS06dPV4cOHRQWFqZdu3ZpypQplS4Y/qHOf+9IVWdRHnzwQQ0dOlQrV67U2rVr9dhjjykzM1Pvvvuurr76ak8PixYtqvKi1ZAQ7z+rbrdbQUGVT2b37dtX7dq107Jly3TnnXfqrbfe0nfffafRo0d7xgTqtgKloKAgINdvAT8EgQWoxpkzZzR06FB9/fXXWr9+va666qpKYx5++GHdddddnvnvv83gS3Fxsd544w3Fx8frJz/5ScB6lqQOHTqouLi4yjMyF/rHP/6hsLAwrV27Vm6327N8/vz5lcb+mP9Zt2nTRtddd502bdqkCRMmVHqhPW/Tpk06ceKEVqxYoRtuuMGzPDs7u8rxR48eVUlJiddZlvNf7NeuXTuf/YSEhKhDhw4+63bo0EGTJ0/W5MmTtXfvXvXu3VvPPvusFi9e7PlUUYsWLWq8f2syatQozZo1S0VFRVq6dKnatWvndVYokLf1Yx05ckRlZWUBf6wCtcU1LIAP5eXlGj16tLZt26bly5crKSmpynFXXXWVkpOTPdP5T1NU57vvvtMvf/lLffvtt/rDH/4Q8NPso0aN0rZt27R27dpK6woKCnTu3DlJUnBwsFwul9dHaA8cOFDlF8SFh4eroKDgB/f05JNPatq0afr1r3/tc8z5t9oufKumrKzM5xeWnTt3Ti+//LLX2JdfflnR0dE1HoekpCTt2LHDa9np06d15swZr2UdOnRQRESE5+2ylJQURUZG6qmnntLZs2cr1f3mm2+qvd0LjR49WqWlpVq4cKHWrFlT6TthAnlbP9b5a4L69et30W4TuBBnWAAfJk+erDfffFNDhw7Vt99+W+ni1gvPqlTnyJEjnm2Li4v1xRdfaPny5crNzdXkyZNr/fFgf/zud7/Tm2++qZ/97GcaN26cEhISVFJSos8++0x///vfdeDAATVv3lxDhgzRc889p8GDB+vOO+/U8ePHNWfOHHXs2FGffvqpV82EhAStX79ezz33nOLi4tS+fXslJibWuqcBAwZowIAB1Y7p16+fLrvsMqWnp+s3v/mNXC6XFi1a5PN7auLi4jRz5kwdOHBAnTt31tKlS5WVlaW//vWvatSoUbW3NWzYMC1atEhff/215y2yr7/+WoMGDdKoUaN01VVXKSQkRG+88Yby8vI8X98fGRmpuXPn6pe//KX69OmjO+64Q9HR0crJydE777yj6667TrNnz67VfdKnTx917NhRf/jDH1RaWur1dlCgb6sqs2fPVkFBgY4ePSpJeuutt3T48GFJ0q9//WtFRUV5xq5bt05t2rTR1Vdf/YNvD/hR6vQzSoDFavoocW20bdvWM97lcpnIyEjTrVs3M378ePPhhx/61Uu3bt2qXHfhR4gvdOrUKTN16lTTsWNHExoaapo3b2769etnnnnmGa+P/L7yyiumU6dOxu12m65du5r58+ebadOmVdrHr776ytxwww2mcePGRlK1H3H21dP3VfWx5g8++MD07dvXNG7c2MTFxZmHH37YrF271kgy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UVGR1wQAABqugAaW3NxcSVLLli29lrds2dKz7vvy8/NVXl7u1zaZmZmKioryTPHx8QHoHgAA2Kpefkpo6tSpKiws9EyHDh2q65YAAICDAhpYYmJiJEl5eXley/Py8jzrvq958+YKDg72axu3263IyEivCQAANFwBDSzt27dXTEyMNmzY4FlWVFSkDz/8UElJSVVuExoaqoSEBK9tKioqtGHDBp/bAACAS4vfPydaXFysffv2eeazs7OVlZWlyy+/XG3atNGDDz6oJ598Up06dVL79u312GOPKS4uTsOHD/dsM2jQII0YMUKTJk2SJGVkZCg9PV0//elPde211+qFF15QSUmJ7r777h+/hwAAoN7zO7Ds2LFDN954o2c+IyNDkpSenq4FCxbo4YcfVklJie677z4VFBTo+uuv15o1axQWFubZZv/+/crPz/fMjx49Wt98840ef/xx5ebmqnfv3lqzZk2lC3EBAMClye/AMnDgQBljfK53uVyaPn26pk+f7nPMgQMHKi2bNGmS54wLAADAherlp4QAAMClxe8zLKgfQlrFOVL33L5sR+pKzvUctbfYkbqSdOYKZz6hFlzqcqSuJP3Xm7c4Ujf+2iOO1JWk/OJwR+q6Q885UleSzh1s6ljtM82deXw0ya9//4cN7tjesdrlDv69c0pFiDPHMMTlzGPOpdrXrX+PTgAAcMkhsAAAAOsRWAAAgPUILAAAwHoEFgAAYD0CCwAAsB6BBQAAWI/AAgAArEdgAQAA1iOwAAAA6xFYAACA9QgsAADAegQWAABgPQILAACwHoEFAABYj8ACAACsR2ABAADWI7AAAADrhdR1A3DGuSNH67oFv5lmEXXdgt+iPzntSN3vWrodqStJh28xjtQ98m2UI3UlKWZhmCN1Dw907k9g1F7HSit6V5EjdQs7NXWkriS5P9/jWG1cIMhVv+qa2tflDAsAALAegQUAAFiPwAIAAKxHYAEAANYjsAAAAOsRWAAAgPUILAAAwHoEFgAAYD0CCwAAsB6BBQAAWI/AAgAArEdgAQAA1iOwAAAA6xFYAACA9fwOLFu2bNHQoUMVFxcnl8ullStXetadPXtWU6ZMUY8ePRQeHq64uDiNHTtWR48erbbmE088IZfL5TV17drV750BAAANk9+BpaSkRL169dKcOXMqrTt9+rR27dqlxx57TLt27dKK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aYCuvfZaM3HiRM98eXm5iYuLM5mZmVWOHzVqlBkyZIjXssTERHP//fc72mcgHD9+3Egymzdv9jlm/vz5Jioq6uI19SNNmzbN9OrVq9bj6/PxM8aYBx54wHTo0MFUVFRUub4+HT9J5o033vDMV1RUmJiYGPP00097lhUUFBi3221ef/11n3X8fQ5fTN/fx6p89NFHRpI5ePCgzzH+Ps4vlqr2Lz093QwbNsyvOrYew9ocv2HDhpmbbrqp2jG2Hj9jKr8uFBQUmEaNGpnly5d7xnz55ZdGktm2bVuVNX7oc9dJDe4MS1lZmXbu3Knk5GTPsqCgICUnJ2vbtm1VbrNt2zav8ZKUkpLic7xNCgsLJUmXX355teOKi4vVtm1bxcfHa9iwYfr8888vRns/2N69exUXF6crr7xSY8aMUU5Ojs+x9fn4lZWVafHixfrVr35V7S+N17fjd152drZyc3O9jk9UVJQSExN9Hp8f8hy2TWFhoVwul5o1a1btOH8e53Vt06ZNatGihbp06aIJEyboxIkTPsfW52OYl5end955R/fcc0+NY209ft9/Xdi5c6fOnj3rdTy6du2qNm3a+DweP+S567QGF1jy8/NVXl6uli1bei1v2bKlcnNzq9wmNzfXr/G2qKio0IMPPqjrrrtO3bt39zmuS5cumjdvnlatWqXFixeroqJC/fr10+HDhy9it7WXmJioBQsWaM2aNZo7d66ys7PVv39/nTp1qsrx9fX4SdLKlStVUFCgcePG+RxT347fhc4fA3+Ozw95DtvkzJkzmjJlitLS0qr9BVx/H+d1afDgwXr11Ve1YcMGzZw5U5s3b1ZqaqrKy8urHF+fj+HChQsVERFR49slth6/ql4XcnNzFRoaWilA1/S6eH5MbbdxWkid3CoCYuLEidq9e3eN75smJSUpKSnJM9+vXz/95Cc/0csvv6wZM2Y43abfUlNTPf/u2bOnEhMT1bZtWy1btqxW/+upT1555RWlpqYqLi7O55j6dvwuZWfPntWoUaNkjNHcuXOrHVufHud33HGH5989evRQz5491aFDB23atEmDBg2qw84Cb968eRozZkyNF7bbevxq+7pQHzW4MyzNmzdXcHBwpauf8/LyFBMTU+U2MTExfo23waRJk/T2229r48aNat26tV/bNmrUSFdffbX27dvnUHeB1axZM3Xu3Nlnv/Xx+EnSwYMHtX79et17771+bVefjt/5Y+DP8fkhz2EbnA8rBw8e1Lp166o9u1KVmh7nNrnyyivVvHlzn73W12P43nvvac+ePX4/JyU7jp+v14WYmBiVlZWpoKDAa3xNr4vnx9R2G6c1uMASGhqqhIQEbdiwwbOsoqJCGzZs8Ppf6oWSkpK8xkvSunXrfI6vS8YYTZo0SW+88YbeffddtW/f3u8a5eXl+uyzzxQbG+tAh4FXXFys/fv3++y3Ph2/C82fP18tWrTQkCFD/NquPh2/9u3bKyYmxuv4FBUV6cMPP/R5fH7Ic7iunQ8re/fu1fr163XFFVf4XaOmx7lNDh8+rBMnTvjstT4eQ+l/z3gmJCSoV69efm9bl8evpteFhIQENWrUyOt47NmzRzk5OT6Pxw957jquTi71ddiSJUuM2+02CxYsMF988YW57777TLNmzUxubq4xxphf/vKX5pFHHvGM/+CDD0xISIh55plnzJdffmmmTZtmGjVqZD777LO62gWfJkyYYKKiosymTZvMsWPHPNPp06c9Y76/f//xH/9h1q5da/bv32927txp7rjjDhMWFmY+//zzutiFGk2ePNls2rTJZGdnmw8++MAkJyeb5s2bm+PHjxtj6vfxO6+8vNy0adPGTJkypdK6+nb8Tp06ZT755BPzySefGEnmueeeM5988onnEzJ//OMfTbNmzcyqVavMp59+aoYNG2bat29vvvvuO0+Nm266yfz5z3/2zNf0HL7YqtvHsrIyc9ttt5nWrVubrKwsr+dlaWmpp8b397Gmx7kt+3fq1Cnz0EMPmW3btpns7Gyzfv1606dPH9OpUydz5swZn/tn0zGs6TFqjDGFhYWmSZMmZu7cuVXWsPn41eZ14d/+7d9MmzZtzLvvvmt27NhhkpKSTFJSkledLl26mBUrVnjma/PcvZgaZGAxxpg///nPpk2bNiY0NNRce+21Zvv27Z51AwYMMOnp6V7jly1bZjp37mxCQ0NNt27dzDvvvHORO64dSVVO8+fP94z5/v49+OCDnvuiZcuW5tZbbzW7du26+M3X0ujRo01sbKwJDQ01rVq1MqNHjzb79u3zrK/Px++8tWvXGklmz549ldbVt+O3cePGKh+T5/ehoqLCPPbYY6Zly5bG7XabQYMGVdrvtm3bmmnTpnktq+45fLFVt4/Z2dk+n5cbN2701Pj+Ptb0OL+Yqtu/06dPm1tuucVER0ebRo0ambZt25rx48dXCh42H8OaHqPGGPPyyy+bxo0bm4KCgipr2Hz8avO68N1335l///d/N5dddplp0qSJGTFihDl27FilOhduU5vn7sXkMsYYZ87dAAAABEaDu4YFAAA0PAQWAABgPQILAACwHoEFAABYj8ACAACsR2ABAADWI7AAAADrEVgAAID1CCwAAMB6BBYAAGA9AgsAALDe/wPy5XbtAkkF/gAAAABJRU5ErkJggg==", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "import matplotlib.pyplot as plt\n", + "plt.imshow(densityGrid['server1'], aspect='auto')\n", + "plt.title( \"2-D Heat Map (server 1)\" )\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 35, + "id": "48242294", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'type': 'list',\n", + " 'attributes': {'names': {'type': 'character',\n", + " 'attributes': {},\n", + " 'value': ['histobject', 'invalidcells']}},\n", + " 'value': [{'type': 'list',\n", + " 'attributes': {'names': {'type': 'character',\n", + " 'attributes': {},\n", + " 'value': ['breaks', 'counts', 'density', 'mids', 'xname', 'equidist']},\n", + " 'class': {'type': 'character', 'attributes': {}, 'value': ['histogram']}},\n", + " 'value': [{'type': 'double',\n", + " 'attributes': {},\n", + " 'value': [0,\n", + " 1,\n", + " 2,\n", + " 3,\n", + " 4,\n", + " 5,\n", + " 6,\n", + " 7,\n", + " 8,\n", + " 9,\n", + " 10,\n", + " 11,\n", + " 12,\n", + " 13,\n", + " 14,\n", + " 15,\n", + " 16,\n", + " 17,\n", + " 18,\n", + " 19,\n", + " 20]},\n", + " {'type': 'double',\n", + " 'attributes': {},\n", + " 'value': [0,\n", + " 0,\n", + " 9,\n", + " 60,\n", + " 277,\n", + " 521,\n", + " 558,\n", + " 281,\n", + " 80,\n", + " 9,\n", + " 4,\n", + " 11,\n", + " 5,\n", + " 5,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0]},\n", + " {'type': 'double',\n", + " 'attributes': {},\n", + " 'value': [0,\n", + " 0,\n", + " 0.00493963,\n", + " 0.03293085,\n", + " 0.15203074,\n", + " 0.28594951,\n", + " 0.30625686,\n", + " 0.15422613,\n", + " 0.04390779,\n", + " 0.00493963,\n", + " 0.00219539,\n", + " 0.00603732,\n", + " 0.00274424,\n", + " 0.00274424,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " 0]},\n", + " {'type': 'double',\n", + " 'attributes': {},\n", + " 'value': [0.5,\n", + " 1.5,\n", + " 2.5,\n", + " 3.5,\n", + " 4.5,\n", + " 5.5,\n", + " 6.5,\n", + " 7.5,\n", + " 8.5,\n", + " 9.5,\n", + " 10.5,\n", + " 11.5,\n", + " 12.5,\n", + " 13.5,\n", + " 14.5,\n", + " 15.5,\n", + " 16.5,\n", + " 17.5,\n", + " 18.5,\n", + " 19.5]},\n", + " {'type': 'character', 'attributes': {}, 'value': ['xvect']},\n", + " {'type': 'logical', 'attributes': {}, 'value': [True]}]},\n", + " {'type': 'integer', 'attributes': {}, 'value': [2]}]}" + ] + }, + "execution_count": 35, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "data = session.aggregate('histogramDS2(df2$LAB_GLUC_ADJUSTED, num.breaks=20, min=0, max=20, method.indicator=1, k=3, noise=0.25)')\n", + "data['server1']" + ] + }, + { + "cell_type": "code", + "execution_count": 36, + "id": "50165862", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAjsAAAHHCAYAAABZbpmkAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjgsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvwVt1zgAAAAlwSFlzAAAPYQAAD2EBqD+naQAAQJRJREFUeJzt3Xd8FOXe///3pkNIIZQEpIr0KiAQRY9CJJQbQVAgIgTEhkGlWA63SlVDkWIJ6DknJjbqfRAVEAlVpag0RfAERCAgCQFCGphCMr8//GW/Lkkg2WySzZzX8/GYh+w111zzuTJZ952Z2V2LYRiGAAAATMqlsgsAAAAoT4QdAABgaoQdAABgaoQdAABgaoQdAABgaoQdAABgaoQdAABgaoQdAABgaoQdAABgaoQdoIpr0qSJxowZU9llVFmZmZmqW7euPvnkk8ouxan16NFDL7zwQmWXAdiFsAM4kdjYWFksFu3du7fI9XfffbfatWtX5v1s2LBBM2bMKPM4ZvDmm2/Kx8dHI0aMqOxSKlxmZqamT5+uvn37KiAgQBaLRbGxsUX2ffHFFxUVFaWkpKSKLRJwAMIOUMXFx8frn//8Z6m22bBhg2bOnFlOFVUdubm5evPNN/Xoo4/K1dW1ssupcBcuXNCsWbP0yy+/qGPHjtftO2jQIPn6+mrJkiUVVB3gOIQdoIrz9PSUu7t7ZZdRKpcvX67sEiRJ69at0/nz5zVs2LAK3W9Fzv96+6pXr54SExN16tQpzZ8//7rjuLi46IEHHtCHH34ovj8aVQ1hB6jirr1nJzc3VzNnzlTz5s3l5eWlWrVqqWfPnoqLi5MkjRkzRlFRUZIki8ViXQpcvnxZU6ZMUcOGDeXp6amWLVvqjTfeKPQC98cff+iZZ55R7dq15ePjo/vuu0+///67LBaLzSWyGTNmyGKx6MiRI3rooYdUs2ZN9ezZU5L0008/acyYMbr55pvl5eWloKAgPfLII7p48aLNvgrGOHr0qB5++GH5+fmpTp06euWVV2QYhk6fPm098xAUFKQFCxaU6Ge3du1aNWnSRM2aNbNpT0pK0tixY9WgQQN5enqqXr16GjRokE6ePGnT78svv9Sdd94pb29v+fj4aMCAATp8+LBNnzFjxqhGjRo6fvy4+vfvLx8fH40cOVITJkxQjRo1dOXKlUJ1hYWFKSgoSHl5eQ7ZV3E8PT0VFBRUop+VJN177706deqUDh48WOJtAGfgVtkFACgsLS1NFy5cKNSem5t7w21nzJihyMhIPfroo+rWrZvS09O1d+9e7d+/X/fee6+eeOIJnT17VnFxcfroo49stjUMQ/fdd5+2bdumcePGqVOnTvrqq6/0/PPP6/fff9eiRYusfceMGaNVq1Zp1KhR6tGjh3bs2KEBAwYUW9eDDz6o5s2b6/XXX7cGp7i4OP32228aO3asgoKCdPjwYf3jH//Q4cOHtWfPHpsQJknDhw9X69atNWfOHK1fv16vvvqqAgIC9N5776lXr16aO3euPvnkEz333HO67bbbdNddd133Z7Vr1y517ty5UPvQoUN1+PBhPf3002rSpImSk5MVFxenhIQENWnSRJL00UcfKTw8XKGhoZo7d66uXLmipUuXqmfPnjpw4IC1nyRdvXpVoaGh6tmzp9544w1Vr15dTZo0UVRUlNavX68HH3zQ2vfKlSv64osvNGbMGOultbLuy1G6dOkiSdq5c6duvfVWh40LlDsDgNOIiYkxJF13adu2rc02jRs3NsLDw62PO3bsaAwYMOC6+4mIiDCKevqvXbvWkGS8+uqrNu0PPPCAYbFYjF9//dUwDMPYt2+fIcmYOHGiTb8xY8YYkozp06db26ZPn25IMsLCwgrt78qVK4Xali9fbkgyvv7660JjPP7449a2q1evGg0aNDAsFosxZ84ca/ulS5eMatWq2fxMipKbm2tYLBZjypQpNu2XLl0yJBnz588vdtuMjAzD39/feOyxx2zak5KSDD8/P5v28PBwQ5Lx97//3aZvfn6+cdNNNxlDhw61aV+1apXN/B2xr5L44YcfDElGTEzMdft5eHgY48ePL/X4QGXiMhbghKKiohQXF1do6dChww239ff31+HDh3Xs2LFS73fDhg1ydXXVM888Y9M+ZcoUGYahL7/8UpK0ceNGSdJTTz1l0+/pp58uduwnn3yyUFu1atWs/87KytKFCxfUo0cPSdL+/fsL9X/00Uet/3Z1dVXXrl1lGIbGjRtnbff391fLli3122+/FVuLJKWkpMgwDNWsWbNQTR4eHtq+fbsuXbpU5LZxcXFKTU1VWFiYLly4YF1cXV3VvXt3bdu2rdA248ePt3lssVj04IMPasOGDcrMzLS2r1y5UjfddJP1Up8j9uVINWvWLPKs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pUaNGmn37t2SpN27d6t9+/YKDAy09gkNDVV6eroOHz5cgdUDAABnVKlndv4qPz9fEydO1B133KF27dpJkpKSkuTh4SF/f3+bvoGBgUpKSrL2+WvQKVhfsK4o2dnZys7Otj5OT0931DQAAICTcZozOxEREfr555+1YsWKct9XZGSk/Pz8rEvDhg3LfZ8AAKByOEXYmTBhgtatW6dt27apQYMG1vagoCDl5OQoNTXVpv+5c+cUFBRk7XPtu7MKHhf0udbUqVOVlpZmXU6fPu3A2QAAAGdSqWHHMAxNmDBBn376qbZu3aqmTZvarO/SpYvc3d21ZcsWa1t8fLwSEhIUHBwsSQoODtahQ4eUnJxs7RMXFydfX1+1adOmyP16enrK19fXZgEAAOZUqffsREREaNmyZfrss8/k4+NjvcfGz89P1apVk5+fn8aNG6fJkycrICBAvr6+evrppxUcHKwePXpIkvr06aM2bdpo1KhRmjdvnpKSkvTyyy8rIiJCnp6elTk9AADgBCo17CxdulSSdPfdd9u0x8TEaMyYMZKkRYsWycXFRUOHDlV2drZCQ0O1ZMkSa19XV1etW7dO48ePV3BwsLy9vRUeHq5Zs2ZV1DQAAIATq9SwYxjGDft4eXkpKipKUVFRxfZp3LixNmzY4MjSAACASTjFDcoAAADlhbADAABMjbADAABMjbADAABMjbADAABMjbADAABMjbADAABMjbADAABMjbADAABMjbADAABMjbADAABMjbADAABMjbADAABMjbADAABMjbADAABMjbADAABMjbADAABMjbADAABMjbADAABMjbADAABMjbADAABMjbADAABMjbADAABMjbADAABMjbADAABMjbADAABMjbADAABMjbADAABMjbADAABMjbADAABMjbADAABMjbADAABMjbADAABMjbADAABMjbADAABMjbADAABMjbADAABMjbADAABMjbADAABMjbADAABMjbADAABMjbADAABMjbADAABMjbADAABMjbADAABMjbADAABMjbADAABMjbADAABMjbADAABMjbADAABMjbADAABMjbADAABMrVLDztdff62BAweqfv36slgsWrt2rc16wzA0bdo01atXT9WqVVNISIiOHTtm0yclJUUjR46Ur6+v/P39NW7cOGVmZlbgLAAAgDOr1LBz+fJldezY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5urqqpo1a6p79+6aNWuW0tLSSvzzAqoqt8ouAED5io2N1bBhw/T111/ru+++U/fu3Qv1iYmJUd++fZWbm6sff/xRY8eOlbe3t2bPnn3D8bOzs9WnTx/99NNPmjlzpu644w7VqVNHJ06c0PLly/X2228rMjLSYfNJTU1Vz549lZaWpldffVW33Xab3NzctGPHDr3wwgvq1atXoXBUnOjoaL3wwgt67733tGDBAnl5eRXqEx8fL19fX6Wnp2v//v2aN2+eoqOjtX37drVv375Mc5k5c6bee+89vfPOO+ratavS09O1d+9eXbp0SZJsQtXKlSs1bdo0xcfHW9tq1KihCxcuSJI2b96stm3b2oz/1y8V9fX1VXx8vAzDUGpqqnbt2qXIyEjFxMRo586dql+/fpnmAjgzwg5gYoZhKCYmRkuWLFGDBg0UHR1dZNjx9/dXUFCQJKlhw4YaNGiQ9u/fX6J9LFq0SN9++6327t2rW2+91dreqFEj/e1vfyvVmZaS+N///V+dPHlSR48etXmBbtGihcLCwooMLEU5ceKEdu3apX//+9/atm2b1qxZo4ceeqhQv7p161p/Pi1atNCgQYN06623avz48fr222/LNJfPP/9cTz31lB588EFr21+/MbvgmEiSn5+fLBaLTZska9ipVatWoXV/9ddt69Wrp9atW2vgwIFq27atXnjhBX388cdlmgvgzLiMBZjYtm3bdOXKFYWEhOjhhx/WihUrdPny5etuc/ToUW3durXIUFSU5cuX695777UJOn9lsVhKXXdx8vPztWLFCo0cObLIMxE1atSQm1vJ/oaLiYnRgAED5Ofnp4cffljR0dEl2q5atWp68skntXPnTiUnJ5eq/msFBQVp69atOn/+fJnGsVfdunU1cuRIff7558rLy6uUGoCKQNgBTCw6OlojRoyQq6ur2rVrp5tvvlmrV68u1C8sLEw1atSQl5eXWrZsqbZt22rq1Kkl2sfRo0fVsmVLm7b7779fNWrUUI0aNXT77bc7ZC7Sn2cxLl26pFatWpVpnPz8fMXGxurhhx+WJI0YMULffvutTpw4UaLtC/Z/8uTJMtWxcOFCnT9/XkFBQerQoYOefPJJffnll3aNdfvtt1t/5gVLSbRq1UoZGRm6ePGiXfsFqgLCDmBSqampWrNmjfUFXVKxZzAWLVqkgwcP6scff9S6det09OhRjRo1yu59L1myRAcPHtQjjzyiK1eu2D3OtRx1SSwuLk6XL19W//79JUm1a9fWvffeq/fff79UdZT1rFWbNm30888/a8+ePXrkkUeUnJysgQMH6tFHHy31WCtXrtTBgwdtlpJw1FwAZ8Y9O4BJLVu2TFlZWTaXowzDUH5+vo4ePaoWLVpY24OCgnTLLbdIklq2bKmMjAyFhYXp1VdftbYXp3nz5jY3zUp/3hMiSQEBASWu19fXt8h3BqWmpsrPz0+SVKdOHfn7++s///lPicctSnR0tFJSUlStWjVrW35+vvUmaxeX6/8d+Msvv0iSmjRpUuR6X19fnTp1qlB7amqqXF1d5e3tbW1zcXHRbbfdpttuu00TJ07Uxx9/rFGjRumll15S06ZNSzynhg0b3vBYFeWXX36Rr6+vzc3MgNlwZgcwqejoaE2ZMsXmL/0ff/xRd9555w3PYLi6ukqS/vjjjxvuJywsTHFxcTpw4ECZ6m3ZsmWRN0Xv37/fGsxcXFw0YsQIffLJJzZvaS+QmZmpq1evXnc/Fy9e1GeffaYVK1bY/GwOHDigS5cuadOmTdfd/o8//tA//vEP3XXXXapTp06xczl8+HCht+/v379fTZs2lbu7e7Hjt2nTRpJueG+VIyQnJ2vZsmUaPHjwDQMeUJVxZgeo4tLS0gpdssjIyND+/fv1ySefFLq/JSwsTLNmzdKrr75qvZk3NTVVSUlJys/P17FjxzRr1iy1aNFCrVu3vuH+J02apPXr16t3796aPn267rzzTtWsWVNHjx7Vl19+aQ1O16u3Vq1aGj9+vN555x0988wzevTRR+Xp6an169dr+fLl+uKLL6x9X3vtNW3fvl3du3fXa6+9pq5du8rd3V3ffPONIiMj9cMPP1z3recfffSRatWqpWHDhhW6dNO/f39FR0erb9++1rbk5GRlZWUpIyND+/bt07x583ThwgWtWbOm2H2MHDlSs2bN0ujRo/XCCy/Iz89PX3/9tRYvXqx58+ZZ+z3wwAO64447dPvttysoKEgnTpzQ1KlT1aJFi1Lfl3Tx4kUlJSXZtPn7+1vfnWYYhpKSkqxvPd+9e7def/11+fn5ac6cOaXaF1DlGACqrPDwcENSoWXMmDFGmzZtitwmMTHRcHFxMT777DPDMAyb7SwWi1GvXj1j+PDhxvHjx0tcR1ZWljFnzhyjY8eORrVq1QxPT0+jVatWxqRJk4yEhIQb1jtu3DjDMAzj+++/N+69916jTp06hp+fn9G9e3fj008/LbS/1NRU4+9//7vRvHlzw8PDwwgMDDRCQkKMTz/91MjPz79ure3btzeeeuqpItetXLnS8PDwMM6fP29s27bN5ufi4+NjdOzY0Xj++eeNxMREm+1eeeUVo0uXLjZt8fHxxv3332/Ur1/f8Pb2Njp27Gj885//tKnvH//4h3HPPfcYderUMTw8PIxGjRoZY8aMMU6ePFmotpiYGMPPz69Q+4kTJ4r8mUoyli9fbt32r3Px8/MzunXrZsyaNctIS0u77s8LMAOLYTj4QzAA4L/Mk08+qTNnzmjdunWVXQqAInCRFgDslJGRoa+//lpr1qxRSEhIZZcDoBiEHQDX1bZt20Kf31KwfPLJJ5VdXiHffPNNsfWW9LNnSmratGl64IEHdP/99+vJJ5906NgAHIfLWACu69SpU8rNzS1yXWBgoHx8fCq4ouv7448/9Pvvvxe73p63ZwOo2gg7AADA1LiMBQAATI2wAwAATI2wAwAATI2wAwAATI2wAwAATI2wAwAATI2wAwAATI2wAwAATO3/A2HFuVihBUU8AAAAAElFTkSuQmCC", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "breaks = data['server1']['value'][0]['value'][0]['value']\n", + "counts = data['server1']['value'][0]['value'][1]['value']\n", + "\n", + "plt.bar(breaks[1:], counts, width=1, edgecolor='black', linewidth=0.5, color='lightgrey')\n", + "plt.xlabel('LAB_GLUC_ADJUSTED')\n", + "plt.ylabel('Frequency')\n", + "plt.title('Histogram (server 1)')\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "0a98f514", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Command 2e62e66a-87e7-4eb9-917f-91197716327b-12 failed on server1: Error while evaluating 'dsBase::heatmapPlotDS(\"df2$LAB_TSC\", \"df2$LAB_HDL\", 3, 0.25, \"xxx\")' -> Error in dsBase::heatmapPlotDS(\"df2$LAB_TSC\", \"df2$LAB_HDL\", 3, 0.25, : \n", + " object 'x.new' not found\n", + "\n", + "True\n", + "False\n" + ] + } + ], + "source": [ + "try:\n", + " session.aggregate('heatmapPlotDS(df2$LAB_TSC, df2$LAB_HDL, 3, 0.25, \"xxx\")')\n", + "except DSError as e:\n", + " print(session.get_errors()['server1'])\n", + " print(session.get_errors()['server1'].is_client_error())\n", + " print(session.get_errors()['server1'].is_server_error())" + ] + }, + { + "cell_type": "markdown", + "id": "4c21152b", + "metadata": {}, + "source": [ + "4. Cleanup" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "id": "85481de0", + "metadata": {}, + "outputs": [], + "source": [ + "session.close()" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "datashield-opal", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.14" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/pyproject.toml b/pyproject.toml index 6833419..4efb143 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -23,7 +23,7 @@ classifiers = [ "Programming Language :: Python :: 3.13", ] dependencies = [ - "datashield @ git+https://github.com/datashield/datashield-python.git@master", + "datashield @ git+https://github.com/datashield/datashield-python.git@feat/sessions", "obiba_opal @ git+https://github.com/obiba/opal-python-client.git@master" ] @@ -33,6 +33,8 @@ test = [ ] dev = [ "ruff>=0.10.0", + "matplotlib>=3.10.8", + "pandas>=2.3.3", ] [project.urls] @@ -55,3 +57,7 @@ build-backend = "hatchling.build" [tool.hatch.build.targets.wheel] packages = ["datashield_opal"] +exclude = [ + "examples/", + "tests/", +] diff --git a/uv.lock b/uv.lock index e46926e..c80ee96 100644 --- a/uv.lock +++ b/uv.lock @@ -1,6 +1,15 @@ version = 1 revision = 3 requires-python = ">=3.10" +resolution-markers = [ + "python_full_version >= '3.14' and sys_platform == 'win32'", + "python_full_version >= '3.14' and sys_platform == 'emscripten'", + "python_full_version >= '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version >= '3.11' and python_full_version < '3.14' and sys_platform == 'win32'", + "python_full_version >= '3.11' and python_full_version < '3.14' and sys_platform == 'emscripten'", + "python_full_version >= '3.11' and python_full_version < '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version < '3.11'", +] [[package]] name = "annotated-doc" @@ -130,10 +139,179 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335, upload-time = "2022-10-25T02:36:20.889Z" }, ] +[[package]] +name = "contourpy" +version = "1.3.2" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version < '3.11'", +] +dependencies = [ + { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/66/54/eb9bfc647b19f2009dd5c7f5ec51c4e6ca831725f1aea7a993034f483147/contourpy-1.3.2.tar.gz", hash = "sha256:b6945942715a034c671b7fc54f9588126b0b8bf23db2696e3ca8328f3ff0ab54", size = 13466130, upload-time = "2025-04-15T17:47:53.79Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/12/a3/da4153ec8fe25d263aa48c1a4cbde7f49b59af86f0b6f7862788c60da737/contourpy-1.3.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ba38e3f9f330af820c4b27ceb4b9c7feee5fe0493ea53a8720f4792667465934", size = 268551, upload-time = "2025-04-15T17:34:46.581Z" }, + { url = "https://files.pythonhosted.org/packages/2f/6c/330de89ae1087eb622bfca0177d32a7ece50c3ef07b28002de4757d9d875/contourpy-1.3.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:dc41ba0714aa2968d1f8674ec97504a8f7e334f48eeacebcaa6256213acb0989", size = 253399, upload-time = "2025-04-15T17:34:51.427Z" }, + { url = "https://files.pythonhosted.org/packages/c1/bd/20c6726b1b7f81a8bee5271bed5c165f0a8e1f572578a9d27e2ccb763cb2/contourpy-1.3.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9be002b31c558d1ddf1b9b415b162c603405414bacd6932d031c5b5a8b757f0d", size = 312061, upload-time = "2025-04-15T17:34:55.961Z" }, + { url = "https://files.pythonhosted.org/packages/22/fc/a9665c88f8a2473f823cf1ec601de9e5375050f1958cbb356cdf06ef1ab6/contourpy-1.3.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8d2e74acbcba3bfdb6d9d8384cdc4f9260cae86ed9beee8bd5f54fee49a430b9", size = 351956, upload-time = "2025-04-15T17:35:00.992Z" }, + { url = "https://files.pythonhosted.org/packages/25/eb/9f0a0238f305ad8fb7ef42481020d6e20cf15e46be99a1fcf939546a177e/contourpy-1.3.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e259bced5549ac64410162adc973c5e2fb77f04df4a439d00b478e57a0e65512", size = 320872, upload-time = "2025-04-15T17:35:06.177Z" }, + { url = "https://files.pythonhosted.org/packages/32/5c/1ee32d1c7956923202f00cf8d2a14a62ed7517bdc0ee1e55301227fc273c/contourpy-1.3.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ad687a04bc802cbe8b9c399c07162a3c35e227e2daccf1668eb1f278cb698631", size = 325027, upload-time = "2025-04-15T17:35:11.244Z" }, + { url = "https://files.pythonhosted.org/packages/83/bf/9baed89785ba743ef329c2b07fd0611d12bfecbedbdd3eeecf929d8d3b52/contourpy-1.3.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:cdd22595308f53ef2f891040ab2b93d79192513ffccbd7fe19be7aa773a5e09f", size = 1306641, upload-time = "2025-04-15T17:35:26.701Z" }, + { url = "https://files.pythonhosted.org/packages/d4/cc/74e5e83d1e35de2d28bd97033426b450bc4fd96e092a1f7a63dc7369b55d/contourpy-1.3.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:b4f54d6a2defe9f257327b0f243612dd051cc43825587520b1bf74a31e2f6ef2", size = 1374075, upload-time = "2025-04-15T17:35:43.204Z" }, + { url = "https://files.pythonhosted.org/packages/0c/42/17f3b798fd5e033b46a16f8d9fcb39f1aba051307f5ebf441bad1ecf78f8/contourpy-1.3.2-cp310-cp310-win32.whl", hash = "sha256:f939a054192ddc596e031e50bb13b657ce318cf13d264f095ce9db7dc6ae81c0", size = 177534, upload-time = "2025-04-15T17:35:46.554Z" }, + { url = "https://files.pythonhosted.org/packages/54/ec/5162b8582f2c994721018d0c9ece9dc6ff769d298a8ac6b6a652c307e7df/contourpy-1.3.2-cp310-cp310-win_amd64.whl", hash = "sha256:c440093bbc8fc21c637c03bafcbef95ccd963bc6e0514ad887932c18ca2a759a", size = 221188, upload-time = "2025-04-15T17:35:50.064Z" }, + { url = "https://files.pythonhosted.org/packages/b3/b9/ede788a0b56fc5b071639d06c33cb893f68b1178938f3425debebe2dab78/contourpy-1.3.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6a37a2fb93d4df3fc4c0e363ea4d16f83195fc09c891bc8ce072b9d084853445", size = 269636, upload-time = "2025-04-15T17:35:54.473Z" }, + { url = "https://files.pythonhosted.org/packages/e6/75/3469f011d64b8bbfa04f709bfc23e1dd71be54d05b1b083be9f5b22750d1/contourpy-1.3.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b7cd50c38f500bbcc9b6a46643a40e0913673f869315d8e70de0438817cb7773", size = 254636, upload-time = "2025-04-15T17:35:58.283Z" }, + { url = "https://files.pythonhosted.org/packages/8d/2f/95adb8dae08ce0ebca4fd8e7ad653159565d9739128b2d5977806656fcd2/contourpy-1.3.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d6658ccc7251a4433eebd89ed2672c2ed96fba367fd25ca9512aa92a4b46c4f1", size = 313053, upload-time = "2025-04-15T17:36:03.235Z" }, + { url = "https://files.pythonhosted.org/packages/c3/a6/8ccf97a50f31adfa36917707fe39c9a0cbc24b3bbb58185577f119736cc9/contourpy-1.3.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:70771a461aaeb335df14deb6c97439973d253ae70660ca085eec25241137ef43", size = 352985, upload-time = "2025-04-15T17:36:08.275Z" }, + { url = "https://files.pythonhosted.org/packages/1d/b6/7925ab9b77386143f39d9c3243fdd101621b4532eb126743201160ffa7e6/contourpy-1.3.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:65a887a6e8c4cd0897507d814b14c54a8c2e2aa4ac9f7686292f9769fcf9a6ab", size = 323750, upload-time = "2025-04-15T17:36:13.29Z" }, + { url = "https://files.pythonhosted.org/packages/c2/f3/20c5d1ef4f4748e52d60771b8560cf00b69d5c6368b5c2e9311bcfa2a08b/contourpy-1.3.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3859783aefa2b8355697f16642695a5b9792e7a46ab86da1118a4a23a51a33d7", size = 326246, upload-time = "2025-04-15T17:36:18.329Z" }, + { url = "https://files.pythonhosted.org/packages/8c/e5/9dae809e7e0b2d9d70c52b3d24cba134dd3dad979eb3e5e71f5df22ed1f5/contourpy-1.3.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:eab0f6db315fa4d70f1d8ab514e527f0366ec021ff853d7ed6a2d33605cf4b83", size = 1308728, upload-time = "2025-04-15T17:36:33.878Z" }, + { url = "https://files.pythonhosted.org/packages/e2/4a/0058ba34aeea35c0b442ae61a4f4d4ca84d6df8f91309bc2d43bb8dd248f/contourpy-1.3.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:d91a3ccc7fea94ca0acab82ceb77f396d50a1f67412efe4c526f5d20264e6ecd", size = 1375762, upload-time = "2025-04-15T17:36:51.295Z" }, + { url = "https://files.pythonhosted.org/packages/09/33/7174bdfc8b7767ef2c08ed81244762d93d5c579336fc0b51ca57b33d1b80/contourpy-1.3.2-cp311-cp311-win32.whl", hash = "sha256:1c48188778d4d2f3d48e4643fb15d8608b1d01e4b4d6b0548d9b336c28fc9b6f", size = 178196, upload-time = "2025-04-15T17:36:55.002Z" }, + { url = "https://files.pythonhosted.org/packages/5e/fe/4029038b4e1c4485cef18e480b0e2cd2d755448bb071eb9977caac80b77b/contourpy-1.3.2-cp311-cp311-win_amd64.whl", hash = "sha256:5ebac872ba09cb8f2131c46b8739a7ff71de28a24c869bcad554477eb089a878", size = 222017, upload-time = "2025-04-15T17:36:58.576Z" }, + { url = "https://files.pythonhosted.org/packages/34/f7/44785876384eff370c251d58fd65f6ad7f39adce4a093c934d4a67a7c6b6/contourpy-1.3.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:4caf2bcd2969402bf77edc4cb6034c7dd7c0803213b3523f111eb7460a51b8d2", size = 271580, upload-time = "2025-04-15T17:37:03.105Z" }, + { url = "https://files.pythonhosted.org/packages/93/3b/0004767622a9826ea3d95f0e9d98cd8729015768075d61f9fea8eeca42a8/contourpy-1.3.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:82199cb78276249796419fe36b7386bd8d2cc3f28b3bc19fe2454fe2e26c4c15", size = 255530, upload-time = "2025-04-15T17:37:07.026Z" }, + { url = "https://files.pythonhosted.org/packages/e7/bb/7bd49e1f4fa805772d9fd130e0d375554ebc771ed7172f48dfcd4ca61549/contourpy-1.3.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:106fab697af11456fcba3e352ad50effe493a90f893fca6c2ca5c033820cea92", size = 307688, upload-time = "2025-04-15T17:37:11.481Z" }, + { url = "https://files.pythonhosted.org/packages/fc/97/e1d5dbbfa170725ef78357a9a0edc996b09ae4af170927ba8ce977e60a5f/contourpy-1.3.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d14f12932a8d620e307f715857107b1d1845cc44fdb5da2bc8e850f5ceba9f87", size = 347331, upload-time = "2025-04-15T17:37:18.212Z" }, + { url = "https://files.pythonhosted.org/packages/6f/66/e69e6e904f5ecf6901be3dd16e7e54d41b6ec6ae3405a535286d4418ffb4/contourpy-1.3.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:532fd26e715560721bb0d5fc7610fce279b3699b018600ab999d1be895b09415", size = 318963, upload-time = "2025-04-15T17:37:22.76Z" }, + { url = "https://files.pythonhosted.org/packages/a8/32/b8a1c8965e4f72482ff2d1ac2cd670ce0b542f203c8e1d34e7c3e6925da7/contourpy-1.3.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f26b383144cf2d2c29f01a1e8170f50dacf0eac02d64139dcd709a8ac4eb3cfe", size = 323681, upload-time = "2025-04-15T17:37:33.001Z" }, + { url = "https://files.pythonhosted.org/packages/30/c6/12a7e6811d08757c7162a541ca4c5c6a34c0f4e98ef2b338791093518e40/contourpy-1.3.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:c49f73e61f1f774650a55d221803b101d966ca0c5a2d6d5e4320ec3997489441", size = 1308674, upload-time = "2025-04-15T17:37:48.64Z" }, + { url = "https://files.pythonhosted.org/packages/2a/8a/bebe5a3f68b484d3a2b8ffaf84704b3e343ef1addea528132ef148e22b3b/contourpy-1.3.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:3d80b2c0300583228ac98d0a927a1ba6a2ba6b8a742463c564f1d419ee5b211e", size = 1380480, upload-time = "2025-04-15T17:38:06.7Z" }, + { url = "https://files.pythonhosted.org/packages/34/db/fcd325f19b5978fb509a7d55e06d99f5f856294c1991097534360b307cf1/contourpy-1.3.2-cp312-cp312-win32.whl", hash = "sha256:90df94c89a91b7362e1142cbee7568f86514412ab8a2c0d0fca72d7e91b62912", size = 178489, upload-time = "2025-04-15T17:38:10.338Z" }, + { url = "https://files.pythonhosted.org/packages/01/c8/fadd0b92ffa7b5eb5949bf340a63a4a496a6930a6c37a7ba0f12acb076d6/contourpy-1.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:8c942a01d9163e2e5cfb05cb66110121b8d07ad438a17f9e766317bcb62abf73", size = 223042, upload-time = "2025-04-15T17:38:14.239Z" }, + { url = "https://files.pythonhosted.org/packages/2e/61/5673f7e364b31e4e7ef6f61a4b5121c5f170f941895912f773d95270f3a2/contourpy-1.3.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:de39db2604ae755316cb5967728f4bea92685884b1e767b7c24e983ef5f771cb", size = 271630, upload-time = "2025-04-15T17:38:19.142Z" }, + { url = "https://files.pythonhosted.org/packages/ff/66/a40badddd1223822c95798c55292844b7e871e50f6bfd9f158cb25e0bd39/contourpy-1.3.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:3f9e896f447c5c8618f1edb2bafa9a4030f22a575ec418ad70611450720b5b08", size = 255670, upload-time = "2025-04-15T17:38:23.688Z" }, + { url = "https://files.pythonhosted.org/packages/1e/c7/cf9fdee8200805c9bc3b148f49cb9482a4e3ea2719e772602a425c9b09f8/contourpy-1.3.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:71e2bd4a1c4188f5c2b8d274da78faab884b59df20df63c34f74aa1813c4427c", size = 306694, upload-time = "2025-04-15T17:38:28.238Z" }, + { url = "https://files.pythonhosted.org/packages/dd/e7/ccb9bec80e1ba121efbffad7f38021021cda5be87532ec16fd96533bb2e0/contourpy-1.3.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:de425af81b6cea33101ae95ece1f696af39446db9682a0b56daaa48cfc29f38f", size = 345986, upload-time = "2025-04-15T17:38:33.502Z" }, + { url = "https://files.pythonhosted.org/packages/dc/49/ca13bb2da90391fa4219fdb23b078d6065ada886658ac7818e5441448b78/contourpy-1.3.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:977e98a0e0480d3fe292246417239d2d45435904afd6d7332d8455981c408b85", size = 318060, upload-time = "2025-04-15T17:38:38.672Z" }, + { url = "https://files.pythonhosted.org/packages/c8/65/5245ce8c548a8422236c13ffcdcdada6a2a812c361e9e0c70548bb40b661/contourpy-1.3.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:434f0adf84911c924519d2b08fc10491dd282b20bdd3fa8f60fd816ea0b48841", size = 322747, upload-time = "2025-04-15T17:38:43.712Z" }, + { url = "https://files.pythonhosted.org/packages/72/30/669b8eb48e0a01c660ead3752a25b44fdb2e5ebc13a55782f639170772f9/contourpy-1.3.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:c66c4906cdbc50e9cba65978823e6e00b45682eb09adbb78c9775b74eb222422", size = 1308895, upload-time = "2025-04-15T17:39:00.224Z" }, + { url = "https://files.pythonhosted.org/packages/05/5a/b569f4250decee6e8d54498be7bdf29021a4c256e77fe8138c8319ef8eb3/contourpy-1.3.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:8b7fc0cd78ba2f4695fd0a6ad81a19e7e3ab825c31b577f384aa9d7817dc3bef", size = 1379098, upload-time = "2025-04-15T17:43:29.649Z" }, + { url = "https://files.pythonhosted.org/packages/19/ba/b227c3886d120e60e41b28740ac3617b2f2b971b9f601c835661194579f1/contourpy-1.3.2-cp313-cp313-win32.whl", hash = "sha256:15ce6ab60957ca74cff444fe66d9045c1fd3e92c8936894ebd1f3eef2fff075f", size = 178535, upload-time = "2025-04-15T17:44:44.532Z" }, + { url = "https://files.pythonhosted.org/packages/12/6e/2fed56cd47ca739b43e892707ae9a13790a486a3173be063681ca67d2262/contourpy-1.3.2-cp313-cp313-win_amd64.whl", hash = "sha256:e1578f7eafce927b168752ed7e22646dad6cd9bca673c60bff55889fa236ebf9", size = 223096, upload-time = "2025-04-15T17:44:48.194Z" }, + { url = "https://files.pythonhosted.org/packages/54/4c/e76fe2a03014a7c767d79ea35c86a747e9325537a8b7627e0e5b3ba266b4/contourpy-1.3.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:0475b1f6604896bc7c53bb070e355e9321e1bc0d381735421a2d2068ec56531f", size = 285090, upload-time = "2025-04-15T17:43:34.084Z" }, + { url = "https://files.pythonhosted.org/packages/7b/e2/5aba47debd55d668e00baf9651b721e7733975dc9fc27264a62b0dd26eb8/contourpy-1.3.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:c85bb486e9be652314bb5b9e2e3b0d1b2e643d5eec4992c0fbe8ac71775da739", size = 268643, upload-time = "2025-04-15T17:43:38.626Z" }, + { url = "https://files.pythonhosted.org/packages/a1/37/cd45f1f051fe6230f751cc5cdd2728bb3a203f5619510ef11e732109593c/contourpy-1.3.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:745b57db7758f3ffc05a10254edd3182a2a83402a89c00957a8e8a22f5582823", size = 310443, upload-time = "2025-04-15T17:43:44.522Z" }, + { url = "https://files.pythonhosted.org/packages/8b/a2/36ea6140c306c9ff6dd38e3bcec80b3b018474ef4d17eb68ceecd26675f4/contourpy-1.3.2-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:970e9173dbd7eba9b4e01aab19215a48ee5dd3f43cef736eebde064a171f89a5", size = 349865, upload-time = "2025-04-15T17:43:49.545Z" }, + { url = "https://files.pythonhosted.org/packages/95/b7/2fc76bc539693180488f7b6cc518da7acbbb9e3b931fd9280504128bf956/contourpy-1.3.2-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c6c4639a9c22230276b7bffb6a850dfc8258a2521305e1faefe804d006b2e532", size = 321162, upload-time = "2025-04-15T17:43:54.203Z" }, + { url = "https://files.pythonhosted.org/packages/f4/10/76d4f778458b0aa83f96e59d65ece72a060bacb20cfbee46cf6cd5ceba41/contourpy-1.3.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cc829960f34ba36aad4302e78eabf3ef16a3a100863f0d4eeddf30e8a485a03b", size = 327355, upload-time = "2025-04-15T17:44:01.025Z" }, + { url = "https://files.pythonhosted.org/packages/43/a3/10cf483ea683f9f8ab096c24bad3cce20e0d1dd9a4baa0e2093c1c962d9d/contourpy-1.3.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:d32530b534e986374fc19eaa77fcb87e8a99e5431499949b828312bdcd20ac52", size = 1307935, upload-time = "2025-04-15T17:44:17.322Z" }, + { url = "https://files.pythonhosted.org/packages/78/73/69dd9a024444489e22d86108e7b913f3528f56cfc312b5c5727a44188471/contourpy-1.3.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:e298e7e70cf4eb179cc1077be1c725b5fd131ebc81181bf0c03525c8abc297fd", size = 1372168, upload-time = "2025-04-15T17:44:33.43Z" }, + { url = "https://files.pythonhosted.org/packages/0f/1b/96d586ccf1b1a9d2004dd519b25fbf104a11589abfd05484ff12199cca21/contourpy-1.3.2-cp313-cp313t-win32.whl", hash = "sha256:d0e589ae0d55204991450bb5c23f571c64fe43adaa53f93fc902a84c96f52fe1", size = 189550, upload-time = "2025-04-15T17:44:37.092Z" }, + { url = "https://files.pythonhosted.org/packages/b0/e6/6000d0094e8a5e32ad62591c8609e269febb6e4db83a1c75ff8868b42731/contourpy-1.3.2-cp313-cp313t-win_amd64.whl", hash = "sha256:78e9253c3de756b3f6a5174d024c4835acd59eb3f8e2ca13e775dbffe1558f69", size = 238214, upload-time = "2025-04-15T17:44:40.827Z" }, + { url = "https://files.pythonhosted.org/packages/33/05/b26e3c6ecc05f349ee0013f0bb850a761016d89cec528a98193a48c34033/contourpy-1.3.2-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:fd93cc7f3139b6dd7aab2f26a90dde0aa9fc264dbf70f6740d498a70b860b82c", size = 265681, upload-time = "2025-04-15T17:44:59.314Z" }, + { url = "https://files.pythonhosted.org/packages/2b/25/ac07d6ad12affa7d1ffed11b77417d0a6308170f44ff20fa1d5aa6333f03/contourpy-1.3.2-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:107ba8a6a7eec58bb475329e6d3b95deba9440667c4d62b9b6063942b61d7f16", size = 315101, upload-time = "2025-04-15T17:45:04.165Z" }, + { url = "https://files.pythonhosted.org/packages/8f/4d/5bb3192bbe9d3f27e3061a6a8e7733c9120e203cb8515767d30973f71030/contourpy-1.3.2-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:ded1706ed0c1049224531b81128efbd5084598f18d8a2d9efae833edbd2b40ad", size = 220599, upload-time = "2025-04-15T17:45:08.456Z" }, + { url = "https://files.pythonhosted.org/packages/ff/c0/91f1215d0d9f9f343e4773ba6c9b89e8c0cc7a64a6263f21139da639d848/contourpy-1.3.2-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:5f5964cdad279256c084b69c3f412b7801e15356b16efa9d78aa974041903da0", size = 266807, upload-time = "2025-04-15T17:45:15.535Z" }, + { url = "https://files.pythonhosted.org/packages/d4/79/6be7e90c955c0487e7712660d6cead01fa17bff98e0ea275737cc2bc8e71/contourpy-1.3.2-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:49b65a95d642d4efa8f64ba12558fcb83407e58a2dfba9d796d77b63ccfcaff5", size = 318729, upload-time = "2025-04-15T17:45:20.166Z" }, + { url = "https://files.pythonhosted.org/packages/87/68/7f46fb537958e87427d98a4074bcde4b67a70b04900cfc5ce29bc2f556c1/contourpy-1.3.2-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:8c5acb8dddb0752bf252e01a3035b21443158910ac16a3b0d20e7fed7d534ce5", size = 221791, upload-time = "2025-04-15T17:45:24.794Z" }, +] + +[[package]] +name = "contourpy" +version = "1.3.3" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.14' and sys_platform == 'win32'", + "python_full_version >= '3.14' and sys_platform == 'emscripten'", + "python_full_version >= '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version >= '3.11' and python_full_version < '3.14' and sys_platform == 'win32'", + "python_full_version >= '3.11' and python_full_version < '3.14' and sys_platform == 'emscripten'", + "python_full_version >= '3.11' and python_full_version < '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", +] +dependencies = [ + { name = "numpy", version = "2.4.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/58/01/1253e6698a07380cd31a736d248a3f2a50a7c88779a1813da27503cadc2a/contourpy-1.3.3.tar.gz", hash = "sha256:083e12155b210502d0bca491432bb04d56dc3432f95a979b429f2848c3dbe880", size = 13466174, upload-time = "2025-07-26T12:03:12.549Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/91/2e/c4390a31919d8a78b90e8ecf87cd4b4c4f05a5b48d05ec17db8e5404c6f4/contourpy-1.3.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:709a48ef9a690e1343202916450bc48b9e51c049b089c7f79a267b46cffcdaa1", size = 288773, upload-time = "2025-07-26T12:01:02.277Z" }, + { url = "https://files.pythonhosted.org/packages/0d/44/c4b0b6095fef4dc9c420e041799591e3b63e9619e3044f7f4f6c21c0ab24/contourpy-1.3.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:23416f38bfd74d5d28ab8429cc4d63fa67d5068bd711a85edb1c3fb0c3e2f381", size = 270149, upload-time = "2025-07-26T12:01:04.072Z" }, + { url = "https://files.pythonhosted.org/packages/30/2e/dd4ced42fefac8470661d7cb7e264808425e6c5d56d175291e93890cce09/contourpy-1.3.3-cp311-cp311-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:929ddf8c4c7f348e4c0a5a3a714b5c8542ffaa8c22954862a46ca1813b667ee7", size = 329222, upload-time = "2025-07-26T12:01:05.688Z" }, + { url = "https://files.pythonhosted.org/packages/f2/74/cc6ec2548e3d276c71389ea4802a774b7aa3558223b7bade3f25787fafc2/contourpy-1.3.3-cp311-cp311-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:9e999574eddae35f1312c2b4b717b7885d4edd6cb46700e04f7f02db454e67c1", size = 377234, upload-time = "2025-07-26T12:01:07.054Z" }, + { url = "https://files.pythonhosted.org/packages/03/b3/64ef723029f917410f75c09da54254c5f9ea90ef89b143ccadb09df14c15/contourpy-1.3.3-cp311-cp311-manylinux_2_26_s390x.manylinux_2_28_s390x.whl", hash = "sha256:0bf67e0e3f482cb69779dd3061b534eb35ac9b17f163d851e2a547d56dba0a3a", size = 380555, upload-time = "2025-07-26T12:01:08.801Z" }, + { url = "https://files.pythonhosted.org/packages/5f/4b/6157f24ca425b89fe2eb7e7be642375711ab671135be21e6faa100f7448c/contourpy-1.3.3-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:51e79c1f7470158e838808d4a996fa9bac72c498e93d8ebe5119bc1e6becb0db", size = 355238, upload-time = "2025-07-26T12:01:10.319Z" }, + { url = "https://files.pythonhosted.org/packages/98/56/f914f0dd678480708a04cfd2206e7c382533249bc5001eb9f58aa693e200/contourpy-1.3.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:598c3aaece21c503615fd59c92a3598b428b2f01bfb4b8ca9c4edeecc2438620", size = 1326218, upload-time = "2025-07-26T12:01:12.659Z" }, + { url = "https://files.pythonhosted.org/packages/fb/d7/4a972334a0c971acd5172389671113ae82aa7527073980c38d5868ff1161/contourpy-1.3.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:322ab1c99b008dad206d406bb61d014cf0174df491ae9d9d0fac6a6fda4f977f", size = 1392867, upload-time = "2025-07-26T12:01:15.533Z" }, + { url = "https://files.pythonhosted.org/packages/75/3e/f2cc6cd56dc8cff46b1a56232eabc6feea52720083ea71ab15523daab796/contourpy-1.3.3-cp311-cp311-win32.whl", hash = "sha256:fd907ae12cd483cd83e414b12941c632a969171bf90fc937d0c9f268a31cafff", size = 183677, upload-time = "2025-07-26T12:01:17.088Z" }, + { url = "https://files.pythonhosted.org/packages/98/4b/9bd370b004b5c9d8045c6c33cf65bae018b27aca550a3f657cdc99acdbd8/contourpy-1.3.3-cp311-cp311-win_amd64.whl", hash = "sha256:3519428f6be58431c56581f1694ba8e50626f2dd550af225f82fb5f5814d2a42", size = 225234, upload-time = "2025-07-26T12:01:18.256Z" }, + { url = "https://files.pythonhosted.org/packages/d9/b6/71771e02c2e004450c12b1120a5f488cad2e4d5b590b1af8bad060360fe4/contourpy-1.3.3-cp311-cp311-win_arm64.whl", hash = "sha256:15ff10bfada4bf92ec8b31c62bf7c1834c244019b4a33095a68000d7075df470", size = 193123, upload-time = "2025-07-26T12:01:19.848Z" }, + { url = "https://files.pythonhosted.org/packages/be/45/adfee365d9ea3d853550b2e735f9d66366701c65db7855cd07621732ccfc/contourpy-1.3.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:b08a32ea2f8e42cf1d4be3169a98dd4be32bafe4f22b6c4cb4ba810fa9e5d2cb", size = 293419, upload-time = "2025-07-26T12:01:21.16Z" }, + { url = "https://files.pythonhosted.org/packages/53/3e/405b59cfa13021a56bba395a6b3aca8cec012b45bf177b0eaf7a202cde2c/contourpy-1.3.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:556dba8fb6f5d8742f2923fe9457dbdd51e1049c4a43fd3986a0b14a1d815fc6", size = 273979, upload-time = "2025-07-26T12:01:22.448Z" }, + { url = "https://files.pythonhosted.org/packages/d4/1c/a12359b9b2ca3a845e8f7f9ac08bdf776114eb931392fcad91743e2ea17b/contourpy-1.3.3-cp312-cp312-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:92d9abc807cf7d0e047b95ca5d957cf4792fcd04e920ca70d48add15c1a90ea7", size = 332653, upload-time = "2025-07-26T12:01:24.155Z" }, + { url = "https://files.pythonhosted.org/packages/63/12/897aeebfb475b7748ea67b61e045accdfcf0d971f8a588b67108ed7f5512/contourpy-1.3.3-cp312-cp312-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:b2e8faa0ed68cb29af51edd8e24798bb661eac3bd9f65420c1887b6ca89987c8", size = 379536, upload-time = "2025-07-26T12:01:25.91Z" }, + { url = "https://files.pythonhosted.org/packages/43/8a/a8c584b82deb248930ce069e71576fc09bd7174bbd35183b7943fb1064fd/contourpy-1.3.3-cp312-cp312-manylinux_2_26_s390x.manylinux_2_28_s390x.whl", hash = "sha256:626d60935cf668e70a5ce6ff184fd713e9683fb458898e4249b63be9e28286ea", size = 384397, upload-time = "2025-07-26T12:01:27.152Z" }, + { url = "https://files.pythonhosted.org/packages/cc/8f/ec6289987824b29529d0dfda0d74a07cec60e54b9c92f3c9da4c0ac732de/contourpy-1.3.3-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4d00e655fcef08aba35ec9610536bfe90267d7ab5ba944f7032549c55a146da1", size = 362601, upload-time = "2025-07-26T12:01:28.808Z" }, + { url = "https://files.pythonhosted.org/packages/05/0a/a3fe3be3ee2dceb3e615ebb4df97ae6f3828aa915d3e10549ce016302bd1/contourpy-1.3.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:451e71b5a7d597379ef572de31eeb909a87246974d960049a9848c3bc6c41bf7", size = 1331288, upload-time = "2025-07-26T12:01:31.198Z" }, + { url = "https://files.pythonhosted.org/packages/33/1d/acad9bd4e97f13f3e2b18a3977fe1b4a37ecf3d38d815333980c6c72e963/contourpy-1.3.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:459c1f020cd59fcfe6650180678a9993932d80d44ccde1fa1868977438f0b411", size = 1403386, upload-time = "2025-07-26T12:01:33.947Z" }, + { url = "https://files.pythonhosted.org/packages/cf/8f/5847f44a7fddf859704217a99a23a4f6417b10e5ab1256a179264561540e/contourpy-1.3.3-cp312-cp312-win32.whl", hash = "sha256:023b44101dfe49d7d53932be418477dba359649246075c996866106da069af69", size = 185018, upload-time = "2025-07-26T12:01:35.64Z" }, + { url = "https://files.pythonhosted.org/packages/19/e8/6026ed58a64563186a9ee3f29f41261fd1828f527dd93d33b60feca63352/contourpy-1.3.3-cp312-cp312-win_amd64.whl", hash = "sha256:8153b8bfc11e1e4d75bcb0bff1db232f9e10b274e0929de9d608027e0d34ff8b", size = 226567, upload-time = "2025-07-26T12:01:36.804Z" }, + { url = "https://files.pythonhosted.org/packages/d1/e2/f05240d2c39a1ed228d8328a78b6f44cd695f7ef47beb3e684cf93604f86/contourpy-1.3.3-cp312-cp312-win_arm64.whl", hash = "sha256:07ce5ed73ecdc4a03ffe3e1b3e3c1166db35ae7584be76f65dbbe28a7791b0cc", size = 193655, upload-time = "2025-07-26T12:01:37.999Z" }, + { url = "https://files.pythonhosted.org/packages/68/35/0167aad910bbdb9599272bd96d01a9ec6852f36b9455cf2ca67bd4cc2d23/contourpy-1.3.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:177fb367556747a686509d6fef71d221a4b198a3905fe824430e5ea0fda54eb5", size = 293257, upload-time = "2025-07-26T12:01:39.367Z" }, + { url = "https://files.pythonhosted.org/packages/96/e4/7adcd9c8362745b2210728f209bfbcf7d91ba868a2c5f40d8b58f54c509b/contourpy-1.3.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:d002b6f00d73d69333dac9d0b8d5e84d9724ff9ef044fd63c5986e62b7c9e1b1", size = 274034, upload-time = "2025-07-26T12:01:40.645Z" }, + { url = "https://files.pythonhosted.org/packages/73/23/90e31ceeed1de63058a02cb04b12f2de4b40e3bef5e082a7c18d9c8ae281/contourpy-1.3.3-cp313-cp313-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:348ac1f5d4f1d66d3322420f01d42e43122f43616e0f194fc1c9f5d830c5b286", size = 334672, upload-time = "2025-07-26T12:01:41.942Z" }, + { url = "https://files.pythonhosted.org/packages/ed/93/b43d8acbe67392e659e1d984700e79eb67e2acb2bd7f62012b583a7f1b55/contourpy-1.3.3-cp313-cp313-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:655456777ff65c2c548b7c454af9c6f33f16c8884f11083244b5819cc214f1b5", size = 381234, upload-time = "2025-07-26T12:01:43.499Z" }, + { url = "https://files.pythonhosted.org/packages/46/3b/bec82a3ea06f66711520f75a40c8fc0b113b2a75edb36aa633eb11c4f50f/contourpy-1.3.3-cp313-cp313-manylinux_2_26_s390x.manylinux_2_28_s390x.whl", hash = "sha256:644a6853d15b2512d67881586bd03f462c7ab755db95f16f14d7e238f2852c67", size = 385169, upload-time = "2025-07-26T12:01:45.219Z" }, + { url = "https://files.pythonhosted.org/packages/4b/32/e0f13a1c5b0f8572d0ec6ae2f6c677b7991fafd95da523159c19eff0696a/contourpy-1.3.3-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4debd64f124ca62069f313a9cb86656ff087786016d76927ae2cf37846b006c9", size = 362859, upload-time = "2025-07-26T12:01:46.519Z" }, + { url = "https://files.pythonhosted.org/packages/33/71/e2a7945b7de4e58af42d708a219f3b2f4cff7386e6b6ab0a0fa0033c49a9/contourpy-1.3.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a15459b0f4615b00bbd1e91f1b9e19b7e63aea7483d03d804186f278c0af2659", size = 1332062, upload-time = "2025-07-26T12:01:48.964Z" }, + { url = "https://files.pythonhosted.org/packages/12/fc/4e87ac754220ccc0e807284f88e943d6d43b43843614f0a8afa469801db0/contourpy-1.3.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:ca0fdcd73925568ca027e0b17ab07aad764be4706d0a925b89227e447d9737b7", size = 1403932, upload-time = "2025-07-26T12:01:51.979Z" }, + { url = "https://files.pythonhosted.org/packages/a6/2e/adc197a37443f934594112222ac1aa7dc9a98faf9c3842884df9a9d8751d/contourpy-1.3.3-cp313-cp313-win32.whl", hash = "sha256:b20c7c9a3bf701366556e1b1984ed2d0cedf999903c51311417cf5f591d8c78d", size = 185024, upload-time = "2025-07-26T12:01:53.245Z" }, + { url = "https://files.pythonhosted.org/packages/18/0b/0098c214843213759692cc638fce7de5c289200a830e5035d1791d7a2338/contourpy-1.3.3-cp313-cp313-win_amd64.whl", hash = "sha256:1cadd8b8969f060ba45ed7c1b714fe69185812ab43bd6b86a9123fe8f99c3263", size = 226578, upload-time = "2025-07-26T12:01:54.422Z" }, + { url = "https://files.pythonhosted.org/packages/8a/9a/2f6024a0c5995243cd63afdeb3651c984f0d2bc727fd98066d40e141ad73/contourpy-1.3.3-cp313-cp313-win_arm64.whl", hash = "sha256:fd914713266421b7536de2bfa8181aa8c699432b6763a0ea64195ebe28bff6a9", size = 193524, upload-time = "2025-07-26T12:01:55.73Z" }, + { url = "https://files.pythonhosted.org/packages/c0/b3/f8a1a86bd3298513f500e5b1f5fd92b69896449f6cab6a146a5d52715479/contourpy-1.3.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:88df9880d507169449d434c293467418b9f6cbe82edd19284aa0409e7fdb933d", size = 306730, upload-time = "2025-07-26T12:01:57.051Z" }, + { url = "https://files.pythonhosted.org/packages/3f/11/4780db94ae62fc0c2053909b65dc3246bd7cecfc4f8a20d957ad43aa4ad8/contourpy-1.3.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:d06bb1f751ba5d417047db62bca3c8fde202b8c11fb50742ab3ab962c81e8216", size = 287897, upload-time = "2025-07-26T12:01:58.663Z" }, + { url = "https://files.pythonhosted.org/packages/ae/15/e59f5f3ffdd6f3d4daa3e47114c53daabcb18574a26c21f03dc9e4e42ff0/contourpy-1.3.3-cp313-cp313t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e4e6b05a45525357e382909a4c1600444e2a45b4795163d3b22669285591c1ae", size = 326751, upload-time = "2025-07-26T12:02:00.343Z" }, + { url = "https://files.pythonhosted.org/packages/0f/81/03b45cfad088e4770b1dcf72ea78d3802d04200009fb364d18a493857210/contourpy-1.3.3-cp313-cp313t-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:ab3074b48c4e2cf1a960e6bbeb7f04566bf36b1861d5c9d4d8ac04b82e38ba20", size = 375486, upload-time = "2025-07-26T12:02:02.128Z" }, + { url = "https://files.pythonhosted.org/packages/0c/ba/49923366492ffbdd4486e970d421b289a670ae8cf539c1ea9a09822b371a/contourpy-1.3.3-cp313-cp313t-manylinux_2_26_s390x.manylinux_2_28_s390x.whl", hash = "sha256:6c3d53c796f8647d6deb1abe867daeb66dcc8a97e8455efa729516b997b8ed99", size = 388106, upload-time = "2025-07-26T12:02:03.615Z" }, + { url = "https://files.pythonhosted.org/packages/9f/52/5b00ea89525f8f143651f9f03a0df371d3cbd2fccd21ca9b768c7a6500c2/contourpy-1.3.3-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:50ed930df7289ff2a8d7afeb9603f8289e5704755c7e5c3bbd929c90c817164b", size = 352548, upload-time = "2025-07-26T12:02:05.165Z" }, + { url = "https://files.pythonhosted.org/packages/32/1d/a209ec1a3a3452d490f6b14dd92e72280c99ae3d1e73da74f8277d4ee08f/contourpy-1.3.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:4feffb6537d64b84877da813a5c30f1422ea5739566abf0bd18065ac040e120a", size = 1322297, upload-time = "2025-07-26T12:02:07.379Z" }, + { url = "https://files.pythonhosted.org/packages/bc/9e/46f0e8ebdd884ca0e8877e46a3f4e633f6c9c8c4f3f6e72be3fe075994aa/contourpy-1.3.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:2b7e9480ffe2b0cd2e787e4df64270e3a0440d9db8dc823312e2c940c167df7e", size = 1391023, upload-time = "2025-07-26T12:02:10.171Z" }, + { url = "https://files.pythonhosted.org/packages/b9/70/f308384a3ae9cd2209e0849f33c913f658d3326900d0ff5d378d6a1422d2/contourpy-1.3.3-cp313-cp313t-win32.whl", hash = "sha256:283edd842a01e3dcd435b1c5116798d661378d83d36d337b8dde1d16a5fc9ba3", size = 196157, upload-time = "2025-07-26T12:02:11.488Z" }, + { url = "https://files.pythonhosted.org/packages/b2/dd/880f890a6663b84d9e34a6f88cded89d78f0091e0045a284427cb6b18521/contourpy-1.3.3-cp313-cp313t-win_amd64.whl", hash = "sha256:87acf5963fc2b34825e5b6b048f40e3635dd547f590b04d2ab317c2619ef7ae8", size = 240570, upload-time = "2025-07-26T12:02:12.754Z" }, + { url = "https://files.pythonhosted.org/packages/80/99/2adc7d8ffead633234817ef8e9a87115c8a11927a94478f6bb3d3f4d4f7d/contourpy-1.3.3-cp313-cp313t-win_arm64.whl", hash = "sha256:3c30273eb2a55024ff31ba7d052dde990d7d8e5450f4bbb6e913558b3d6c2301", size = 199713, upload-time = "2025-07-26T12:02:14.4Z" }, + { url = "https://files.pythonhosted.org/packages/72/8b/4546f3ab60f78c514ffb7d01a0bd743f90de36f0019d1be84d0a708a580a/contourpy-1.3.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:fde6c716d51c04b1c25d0b90364d0be954624a0ee9d60e23e850e8d48353d07a", size = 292189, upload-time = "2025-07-26T12:02:16.095Z" }, + { url = "https://files.pythonhosted.org/packages/fd/e1/3542a9cb596cadd76fcef413f19c79216e002623158befe6daa03dbfa88c/contourpy-1.3.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:cbedb772ed74ff5be440fa8eee9bd49f64f6e3fc09436d9c7d8f1c287b121d77", size = 273251, upload-time = "2025-07-26T12:02:17.524Z" }, + { url = "https://files.pythonhosted.org/packages/b1/71/f93e1e9471d189f79d0ce2497007731c1e6bf9ef6d1d61b911430c3db4e5/contourpy-1.3.3-cp314-cp314-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:22e9b1bd7a9b1d652cd77388465dc358dafcd2e217d35552424aa4f996f524f5", size = 335810, upload-time = "2025-07-26T12:02:18.9Z" }, + { url = "https://files.pythonhosted.org/packages/91/f9/e35f4c1c93f9275d4e38681a80506b5510e9327350c51f8d4a5a724d178c/contourpy-1.3.3-cp314-cp314-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a22738912262aa3e254e4f3cb079a95a67132fc5a063890e224393596902f5a4", size = 382871, upload-time = "2025-07-26T12:02:20.418Z" }, + { url = "https://files.pythonhosted.org/packages/b5/71/47b512f936f66a0a900d81c396a7e60d73419868fba959c61efed7a8ab46/contourpy-1.3.3-cp314-cp314-manylinux_2_26_s390x.manylinux_2_28_s390x.whl", hash = "sha256:afe5a512f31ee6bd7d0dda52ec9864c984ca3d66664444f2d72e0dc4eb832e36", size = 386264, upload-time = "2025-07-26T12:02:21.916Z" }, + { url = "https://files.pythonhosted.org/packages/04/5f/9ff93450ba96b09c7c2b3f81c94de31c89f92292f1380261bd7195bea4ea/contourpy-1.3.3-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f64836de09927cba6f79dcd00fdd7d5329f3fccc633468507079c829ca4db4e3", size = 363819, upload-time = "2025-07-26T12:02:23.759Z" }, + { url = "https://files.pythonhosted.org/packages/3e/a6/0b185d4cc480ee494945cde102cb0149ae830b5fa17bf855b95f2e70ad13/contourpy-1.3.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:1fd43c3be4c8e5fd6e4f2baeae35ae18176cf2e5cced681cca908addf1cdd53b", size = 1333650, upload-time = "2025-07-26T12:02:26.181Z" }, + { url = "https://files.pythonhosted.org/packages/43/d7/afdc95580ca56f30fbcd3060250f66cedbde69b4547028863abd8aa3b47e/contourpy-1.3.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:6afc576f7b33cf00996e5c1102dc2a8f7cc89e39c0b55df93a0b78c1bd992b36", size = 1404833, upload-time = "2025-07-26T12:02:28.782Z" }, + { url = "https://files.pythonhosted.org/packages/e2/e2/366af18a6d386f41132a48f033cbd2102e9b0cf6345d35ff0826cd984566/contourpy-1.3.3-cp314-cp314-win32.whl", hash = "sha256:66c8a43a4f7b8df8b71ee1840e4211a3c8d93b214b213f590e18a1beca458f7d", size = 189692, upload-time = "2025-07-26T12:02:30.128Z" }, + { url = "https://files.pythonhosted.org/packages/7d/c2/57f54b03d0f22d4044b8afb9ca0e184f8b1afd57b4f735c2fa70883dc601/contourpy-1.3.3-cp314-cp314-win_amd64.whl", hash = "sha256:cf9022ef053f2694e31d630feaacb21ea24224be1c3ad0520b13d844274614fd", size = 232424, upload-time = "2025-07-26T12:02:31.395Z" }, + { url = "https://files.pythonhosted.org/packages/18/79/a9416650df9b525737ab521aa181ccc42d56016d2123ddcb7b58e926a42c/contourpy-1.3.3-cp314-cp314-win_arm64.whl", hash = "sha256:95b181891b4c71de4bb404c6621e7e2390745f887f2a026b2d99e92c17892339", size = 198300, upload-time = "2025-07-26T12:02:32.956Z" }, + { url = "https://files.pythonhosted.org/packages/1f/42/38c159a7d0f2b7b9c04c64ab317042bb6952b713ba875c1681529a2932fe/contourpy-1.3.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:33c82d0138c0a062380332c861387650c82e4cf1747aaa6938b9b6516762e772", size = 306769, upload-time = "2025-07-26T12:02:34.2Z" }, + { url = "https://files.pythonhosted.org/packages/c3/6c/26a8205f24bca10974e77460de68d3d7c63e282e23782f1239f226fcae6f/contourpy-1.3.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:ea37e7b45949df430fe649e5de8351c423430046a2af20b1c1961cae3afcda77", size = 287892, upload-time = "2025-07-26T12:02:35.807Z" }, + { url = "https://files.pythonhosted.org/packages/66/06/8a475c8ab718ebfd7925661747dbb3c3ee9c82ac834ccb3570be49d129f4/contourpy-1.3.3-cp314-cp314t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d304906ecc71672e9c89e87c4675dc5c2645e1f4269a5063b99b0bb29f232d13", size = 326748, upload-time = "2025-07-26T12:02:37.193Z" }, + { url = "https://files.pythonhosted.org/packages/b4/a3/c5ca9f010a44c223f098fccd8b158bb1cb287378a31ac141f04730dc49be/contourpy-1.3.3-cp314-cp314t-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:ca658cd1a680a5c9ea96dc61cdbae1e85c8f25849843aa799dfd3cb370ad4fbe", size = 375554, upload-time = "2025-07-26T12:02:38.894Z" }, + { url = "https://files.pythonhosted.org/packages/80/5b/68bd33ae63fac658a4145088c1e894405e07584a316738710b636c6d0333/contourpy-1.3.3-cp314-cp314t-manylinux_2_26_s390x.manylinux_2_28_s390x.whl", hash = "sha256:ab2fd90904c503739a75b7c8c5c01160130ba67944a7b77bbf36ef8054576e7f", size = 388118, upload-time = "2025-07-26T12:02:40.642Z" }, + { url = "https://files.pythonhosted.org/packages/40/52/4c285a6435940ae25d7410a6c36bda5145839bc3f0beb20c707cda18b9d2/contourpy-1.3.3-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b7301b89040075c30e5768810bc96a8e8d78085b47d8be6e4c3f5a0b4ed478a0", size = 352555, upload-time = "2025-07-26T12:02:42.25Z" }, + { url = "https://files.pythonhosted.org/packages/24/ee/3e81e1dd174f5c7fefe50e85d0892de05ca4e26ef1c9a59c2a57e43b865a/contourpy-1.3.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:2a2a8b627d5cc6b7c41a4beff6c5ad5eb848c88255fda4a8745f7e901b32d8e4", size = 1322295, upload-time = "2025-07-26T12:02:44.668Z" }, + { url = "https://files.pythonhosted.org/packages/3c/b2/6d913d4d04e14379de429057cd169e5e00f6c2af3bb13e1710bcbdb5da12/contourpy-1.3.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:fd6ec6be509c787f1caf6b247f0b1ca598bef13f4ddeaa126b7658215529ba0f", size = 1391027, upload-time = "2025-07-26T12:02:47.09Z" }, + { url = "https://files.pythonhosted.org/packages/93/8a/68a4ec5c55a2971213d29a9374913f7e9f18581945a7a31d1a39b5d2dfe5/contourpy-1.3.3-cp314-cp314t-win32.whl", hash = "sha256:e74a9a0f5e3fff48fb5a7f2fd2b9b70a3fe014a67522f79b7cca4c0c7e43c9ae", size = 202428, upload-time = "2025-07-26T12:02:48.691Z" }, + { url = "https://files.pythonhosted.org/packages/fa/96/fd9f641ffedc4fa3ace923af73b9d07e869496c9cc7a459103e6e978992f/contourpy-1.3.3-cp314-cp314t-win_amd64.whl", hash = "sha256:13b68d6a62db8eafaebb8039218921399baf6e47bf85006fd8529f2a08ef33fc", size = 250331, upload-time = "2025-07-26T12:02:50.137Z" }, + { url = "https://files.pythonhosted.org/packages/ae/8c/469afb6465b853afff216f9528ffda78a915ff880ed58813ba4faf4ba0b6/contourpy-1.3.3-cp314-cp314t-win_arm64.whl", hash = "sha256:b7448cb5a725bb1e35ce88771b86fba35ef418952474492cf7c764059933ff8b", size = 203831, upload-time = "2025-07-26T12:02:51.449Z" }, + { url = "https://files.pythonhosted.org/packages/a5/29/8dcfe16f0107943fa92388c23f6e05cff0ba58058c4c95b00280d4c75a14/contourpy-1.3.3-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:cd5dfcaeb10f7b7f9dc8941717c6c2ade08f587be2226222c12b25f0483ed497", size = 278809, upload-time = "2025-07-26T12:02:52.74Z" }, + { url = "https://files.pythonhosted.org/packages/85/a9/8b37ef4f7dafeb335daee3c8254645ef5725be4d9c6aa70b50ec46ef2f7e/contourpy-1.3.3-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:0c1fc238306b35f246d61a1d416a627348b5cf0648648a031e14bb8705fcdfe8", size = 261593, upload-time = "2025-07-26T12:02:54.037Z" }, + { url = "https://files.pythonhosted.org/packages/0a/59/ebfb8c677c75605cc27f7122c90313fd2f375ff3c8d19a1694bda74aaa63/contourpy-1.3.3-pp311-pypy311_pp73-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:70f9aad7de812d6541d29d2bbf8feb22ff7e1c299523db288004e3157ff4674e", size = 302202, upload-time = "2025-07-26T12:02:55.947Z" }, + { url = "https://files.pythonhosted.org/packages/3c/37/21972a15834d90bfbfb009b9d004779bd5a07a0ec0234e5ba8f64d5736f4/contourpy-1.3.3-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5ed3657edf08512fc3fe81b510e35c2012fbd3081d2e26160f27ca28affec989", size = 329207, upload-time = "2025-07-26T12:02:57.468Z" }, + { url = "https://files.pythonhosted.org/packages/0c/58/bd257695f39d05594ca4ad60df5bcb7e32247f9951fd09a9b8edb82d1daa/contourpy-1.3.3-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:3d1a3799d62d45c18bafd41c5fa05120b96a28079f2393af559b843d1a966a77", size = 225315, upload-time = "2025-07-26T12:02:58.801Z" }, +] + +[[package]] +name = "cycler" +version = "0.12.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a9/95/a3dbbb5028f35eafb79008e7522a75244477d2838f38cbb722248dabc2a8/cycler-0.12.1.tar.gz", hash = "sha256:88bb128f02ba341da8ef447245a9e138fae777f6a23943da4540077d3601eb1c", size = 7615, upload-time = "2023-10-07T05:32:18.335Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl", hash = "sha256:85cef7cff222d8644161529808465972e51340599459b8ac3ccbac5a854e0d30", size = 8321, upload-time = "2023-10-07T05:32:16.783Z" }, +] + [[package]] name = "datashield" version = "1.0.0" -source = { git = "https://github.com/datashield/datashield-python.git?rev=master#fa2659266abef1c447686482a83b94bf47caf5ca" } +source = { git = "https://github.com/datashield/datashield-python.git?rev=feat%2Fsessions#800b98450397a461a1bd71412724a78e4df60ca5" } [[package]] name = "datashield-opal" @@ -146,6 +324,9 @@ dependencies = [ [package.optional-dependencies] dev = [ + { name = "matplotlib" }, + { name = "pandas", version = "2.3.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, + { name = "pandas", version = "3.0.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, { name = "ruff" }, ] test = [ @@ -154,8 +335,10 @@ test = [ [package.metadata] requires-dist = [ - { name = "datashield", git = "https://github.com/datashield/datashield-python.git?rev=master" }, + { name = "datashield", git = "https://github.com/datashield/datashield-python.git?rev=feat%2Fsessions" }, + { name = "matplotlib", marker = "extra == 'dev'", specifier = ">=3.10.8" }, { name = "obiba-opal", git = "https://github.com/obiba/opal-python-client.git?rev=master" }, + { name = "pandas", marker = "extra == 'dev'", specifier = ">=2.3.3" }, { name = "pytest", marker = "extra == 'test'", specifier = ">=7.2.2" }, { name = "ruff", marker = "extra == 'dev'", specifier = ">=0.10.0" }, ] @@ -166,13 +349,70 @@ name = "exceptiongroup" version = "1.3.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "typing-extensions", marker = "python_full_version < '3.13'" }, + { name = "typing-extensions", marker = "python_full_version < '3.11'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/50/79/66800aadf48771f6b62f7eb014e352e5d06856655206165d775e675a02c9/exceptiongroup-1.3.1.tar.gz", hash = "sha256:8b412432c6055b0b7d14c310000ae93352ed6754f70fa8f7c34141f91c4e3219", size = 30371, upload-time = "2025-11-21T23:01:54.787Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/8a/0e/97c33bf5009bdbac74fd2beace167cab3f978feb69cc36f1ef79360d6c4e/exceptiongroup-1.3.1-py3-none-any.whl", hash = "sha256:a7a39a3bd276781e98394987d3a5701d0c4edffb633bb7a5144577f82c773598", size = 16740, upload-time = "2025-11-21T23:01:53.443Z" }, ] +[[package]] +name = "fonttools" +version = "4.61.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ec/ca/cf17b88a8df95691275a3d77dc0a5ad9907f328ae53acbe6795da1b2f5ed/fonttools-4.61.1.tar.gz", hash = "sha256:6675329885c44657f826ef01d9e4fb33b9158e9d93c537d84ad8399539bc6f69", size = 3565756, upload-time = "2025-12-12T17:31:24.246Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5b/94/8a28707adb00bed1bf22dac16ccafe60faf2ade353dcb32c3617ee917307/fonttools-4.61.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7c7db70d57e5e1089a274cbb2b1fd635c9a24de809a231b154965d415d6c6d24", size = 2854799, upload-time = "2025-12-12T17:29:27.5Z" }, + { url = "https://files.pythonhosted.org/packages/94/93/c2e682faaa5ee92034818d8f8a8145ae73eb83619600495dcf8503fa7771/fonttools-4.61.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5fe9fd43882620017add5eabb781ebfbc6998ee49b35bd7f8f79af1f9f99a958", size = 2403032, upload-time = "2025-12-12T17:29:30.115Z" }, + { url = "https://files.pythonhosted.org/packages/f1/62/1748f7e7e1ee41aa52279fd2e3a6d0733dc42a673b16932bad8e5d0c8b28/fonttools-4.61.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d8db08051fc9e7d8bc622f2112511b8107d8f27cd89e2f64ec45e9825e8288da", size = 4897863, upload-time = "2025-12-12T17:29:32.535Z" }, + { url = "https://files.pythonhosted.org/packages/69/69/4ca02ee367d2c98edcaeb83fc278d20972502ee071214ad9d8ca85e06080/fonttools-4.61.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:a76d4cb80f41ba94a6691264be76435e5f72f2cb3cab0b092a6212855f71c2f6", size = 4859076, upload-time = "2025-12-12T17:29:34.907Z" }, + { url = "https://files.pythonhosted.org/packages/8c/f5/660f9e3cefa078861a7f099107c6d203b568a6227eef163dd173bfc56bdc/fonttools-4.61.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:a13fc8aeb24bad755eea8f7f9d409438eb94e82cf86b08fe77a03fbc8f6a96b1", size = 4875623, upload-time = "2025-12-12T17:29:37.33Z" }, + { url = "https://files.pythonhosted.org/packages/63/d1/9d7c5091d2276ed47795c131c1bf9316c3c1ab2789c22e2f59e0572ccd38/fonttools-4.61.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:b846a1fcf8beadeb9ea4f44ec5bdde393e2f1569e17d700bfc49cd69bde75881", size = 4993327, upload-time = "2025-12-12T17:29:39.781Z" }, + { url = "https://files.pythonhosted.org/packages/6f/2d/28def73837885ae32260d07660a052b99f0aa00454867d33745dfe49dbf0/fonttools-4.61.1-cp310-cp310-win32.whl", hash = "sha256:78a7d3ab09dc47ac1a363a493e6112d8cabed7ba7caad5f54dbe2f08676d1b47", size = 1502180, upload-time = "2025-12-12T17:29:42.217Z" }, + { url = "https://files.pythonhosted.org/packages/63/fa/bfdc98abb4dd2bd491033e85e3ba69a2313c850e759a6daa014bc9433b0f/fonttools-4.61.1-cp310-cp310-win_amd64.whl", hash = "sha256:eff1ac3cc66c2ac7cda1e64b4e2f3ffef474b7335f92fc3833fc632d595fcee6", size = 1550654, upload-time = "2025-12-12T17:29:44.564Z" }, + { url = "https://files.pythonhosted.org/packages/69/12/bf9f4eaa2fad039356cc627587e30ed008c03f1cebd3034376b5ee8d1d44/fonttools-4.61.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:c6604b735bb12fef8e0efd5578c9fb5d3d8532d5001ea13a19cddf295673ee09", size = 2852213, upload-time = "2025-12-12T17:29:46.675Z" }, + { url = "https://files.pythonhosted.org/packages/ac/49/4138d1acb6261499bedde1c07f8c2605d1d8f9d77a151e5507fd3ef084b6/fonttools-4.61.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5ce02f38a754f207f2f06557523cd39a06438ba3aafc0639c477ac409fc64e37", size = 2401689, upload-time = "2025-12-12T17:29:48.769Z" }, + { url = "https://files.pythonhosted.org/packages/e5/fe/e6ce0fe20a40e03aef906af60aa87668696f9e4802fa283627d0b5ed777f/fonttools-4.61.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:77efb033d8d7ff233385f30c62c7c79271c8885d5c9657d967ede124671bbdfb", size = 5058809, upload-time = "2025-12-12T17:29:51.701Z" }, + { url = "https://files.pythonhosted.org/packages/79/61/1ca198af22f7dd22c17ab86e9024ed3c06299cfdb08170640e9996d501a0/fonttools-4.61.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:75c1a6dfac6abd407634420c93864a1e274ebc1c7531346d9254c0d8f6ca00f9", size = 5036039, upload-time = "2025-12-12T17:29:53.659Z" }, + { url = "https://files.pythonhosted.org/packages/99/cc/fa1801e408586b5fce4da9f5455af8d770f4fc57391cd5da7256bb364d38/fonttools-4.61.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:0de30bfe7745c0d1ffa2b0b7048fb7123ad0d71107e10ee090fa0b16b9452e87", size = 5034714, upload-time = "2025-12-12T17:29:55.592Z" }, + { url = "https://files.pythonhosted.org/packages/bf/aa/b7aeafe65adb1b0a925f8f25725e09f078c635bc22754f3fecb7456955b0/fonttools-4.61.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:58b0ee0ab5b1fc9921eccfe11d1435added19d6494dde14e323f25ad2bc30c56", size = 5158648, upload-time = "2025-12-12T17:29:57.861Z" }, + { url = "https://files.pythonhosted.org/packages/99/f9/08ea7a38663328881384c6e7777bbefc46fd7d282adfd87a7d2b84ec9d50/fonttools-4.61.1-cp311-cp311-win32.whl", hash = "sha256:f79b168428351d11e10c5aeb61a74e1851ec221081299f4cf56036a95431c43a", size = 2280681, upload-time = "2025-12-12T17:29:59.943Z" }, + { url = "https://files.pythonhosted.org/packages/07/ad/37dd1ae5fa6e01612a1fbb954f0927681f282925a86e86198ccd7b15d515/fonttools-4.61.1-cp311-cp311-win_amd64.whl", hash = "sha256:fe2efccb324948a11dd09d22136fe2ac8a97d6c1347cf0b58a911dcd529f66b7", size = 2331951, upload-time = "2025-12-12T17:30:02.254Z" }, + { url = "https://files.pythonhosted.org/packages/6f/16/7decaa24a1bd3a70c607b2e29f0adc6159f36a7e40eaba59846414765fd4/fonttools-4.61.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:f3cb4a569029b9f291f88aafc927dd53683757e640081ca8c412781ea144565e", size = 2851593, upload-time = "2025-12-12T17:30:04.225Z" }, + { url = "https://files.pythonhosted.org/packages/94/98/3c4cb97c64713a8cf499b3245c3bf9a2b8fd16a3e375feff2aed78f96259/fonttools-4.61.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:41a7170d042e8c0024703ed13b71893519a1a6d6e18e933e3ec7507a2c26a4b2", size = 2400231, upload-time = "2025-12-12T17:30:06.47Z" }, + { url = "https://files.pythonhosted.org/packages/b7/37/82dbef0f6342eb01f54bca073ac1498433d6ce71e50c3c3282b655733b31/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", size = 4954103, upload-time = "2025-12-12T17:30:08.432Z" }, + { url = "https://files.pythonhosted.org/packages/6c/44/f3aeac0fa98e7ad527f479e161aca6c3a1e47bb6996b053d45226fe37bf2/fonttools-4.61.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:15acc09befd16a0fb8a8f62bc147e1a82817542d72184acca9ce6e0aeda9fa6d", size = 5004295, upload-time = "2025-12-12T17:30:10.56Z" }, + { url = "https://files.pythonhosted.org/packages/14/e8/7424ced75473983b964d09f6747fa09f054a6d656f60e9ac9324cf40c743/fonttools-4.61.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e6bcdf33aec38d16508ce61fd81838f24c83c90a1d1b8c68982857038673d6b8", size = 4944109, upload-time = "2025-12-12T17:30:12.874Z" }, + { url = "https://files.pythonhosted.org/packages/c8/8b/6391b257fa3d0b553d73e778f953a2f0154292a7a7a085e2374b111e5410/fonttools-4.61.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:5fade934607a523614726119164ff621e8c30e8fa1ffffbbd358662056ba69f0", size = 5093598, upload-time = "2025-12-12T17:30:15.79Z" }, + { url = "https://files.pythonhosted.org/packages/d9/71/fd2ea96cdc512d92da5678a1c98c267ddd4d8c5130b76d0f7a80f9a9fde8/fonttools-4.61.1-cp312-cp312-win32.whl", hash = "sha256:75da8f28eff26defba42c52986de97b22106cb8f26515b7c22443ebc9c2d3261", size = 2269060, upload-time = "2025-12-12T17:30:18.058Z" }, + { url = "https://files.pythonhosted.org/packages/80/3b/a3e81b71aed5a688e89dfe0e2694b26b78c7d7f39a5ffd8a7d75f54a12a8/fonttools-4.61.1-cp312-cp312-win_amd64.whl", hash = "sha256:497c31ce314219888c0e2fce5ad9178ca83fe5230b01a5006726cdf3ac9f24d9", size = 2319078, upload-time = "2025-12-12T17:30:22.862Z" }, + { url = "https://files.pythonhosted.org/packages/4b/cf/00ba28b0990982530addb8dc3e9e6f2fa9cb5c20df2abdda7baa755e8fe1/fonttools-4.61.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:8c56c488ab471628ff3bfa80964372fc13504ece601e0d97a78ee74126b2045c", size = 2846454, upload-time = "2025-12-12T17:30:24.938Z" }, + { url = "https://files.pythonhosted.org/packages/5a/ca/468c9a8446a2103ae645d14fee3f610567b7042aba85031c1c65e3ef7471/fonttools-4.61.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:dc492779501fa723b04d0ab1f5be046797fee17d27700476edc7ee9ae535a61e", size = 2398191, upload-time = "2025-12-12T17:30:27.343Z" }, + { url = "https://files.pythonhosted.org/packages/a3/4b/d67eedaed19def5967fade3297fed8161b25ba94699efc124b14fb68cdbc/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", size = 4928410, upload-time = "2025-12-12T17:30:29.771Z" }, + { url = "https://files.pythonhosted.org/packages/b0/8d/6fb3494dfe61a46258cd93d979cf4725ded4eb46c2a4ca35e4490d84daea/fonttools-4.61.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4c1b526c8d3f615a7b1867f38a9410849c8f4aef078535742198e942fba0e9bd", size = 4984460, upload-time = "2025-12-12T17:30:32.073Z" }, + { url = "https://files.pythonhosted.org/packages/f7/f1/a47f1d30b3dc00d75e7af762652d4cbc3dff5c2697a0dbd5203c81afd9c3/fonttools-4.61.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:41ed4b5ec103bd306bb68f81dc166e77409e5209443e5773cb4ed837bcc9b0d3", size = 4925800, upload-time = "2025-12-12T17:30:34.339Z" }, + { url = "https://files.pythonhosted.org/packages/a7/01/e6ae64a0981076e8a66906fab01539799546181e32a37a0257b77e4aa88b/fonttools-4.61.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:b501c862d4901792adaec7c25b1ecc749e2662543f68bb194c42ba18d6eec98d", size = 5067859, upload-time = "2025-12-12T17:30:36.593Z" }, + { url = "https://files.pythonhosted.org/packages/73/aa/28e40b8d6809a9b5075350a86779163f074d2b617c15d22343fce81918db/fonttools-4.61.1-cp313-cp313-win32.whl", hash = "sha256:4d7092bb38c53bbc78e9255a59158b150bcdc115a1e3b3ce0b5f267dc35dd63c", size = 2267821, upload-time = "2025-12-12T17:30:38.478Z" }, + { url = "https://files.pythonhosted.org/packages/1a/59/453c06d1d83dc0951b69ef692d6b9f1846680342927df54e9a1ca91c6f90/fonttools-4.61.1-cp313-cp313-win_amd64.whl", hash = "sha256:21e7c8d76f62ab13c9472ccf74515ca5b9a761d1bde3265152a6dc58700d895b", size = 2318169, upload-time = "2025-12-12T17:30:40.951Z" }, + { url = "https://files.pythonhosted.org/packages/32/8f/4e7bf82c0cbb738d3c2206c920ca34ca74ef9dabde779030145d28665104/fonttools-4.61.1-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:fff4f534200a04b4a36e7ae3cb74493afe807b517a09e99cb4faa89a34ed6ecd", size = 2846094, upload-time = "2025-12-12T17:30:43.511Z" }, + { url = "https://files.pythonhosted.org/packages/71/09/d44e45d0a4f3a651f23a1e9d42de43bc643cce2971b19e784cc67d823676/fonttools-4.61.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:d9203500f7c63545b4ce3799319fe4d9feb1a1b89b28d3cb5abd11b9dd64147e", size = 2396589, upload-time = "2025-12-12T17:30:45.681Z" }, + { url = "https://files.pythonhosted.org/packages/89/18/58c64cafcf8eb677a99ef593121f719e6dcbdb7d1c594ae5a10d4997ca8a/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", size = 4877892, upload-time = "2025-12-12T17:30:47.709Z" }, + { url = "https://files.pythonhosted.org/packages/8a/ec/9e6b38c7ba1e09eb51db849d5450f4c05b7e78481f662c3b79dbde6f3d04/fonttools-4.61.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:11f35ad7805edba3aac1a3710d104592df59f4b957e30108ae0ba6c10b11dd75", size = 4972884, upload-time = "2025-12-12T17:30:49.656Z" }, + { url = "https://files.pythonhosted.org/packages/5e/87/b5339da8e0256734ba0dbbf5b6cdebb1dd79b01dc8c270989b7bcd465541/fonttools-4.61.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:b931ae8f62db78861b0ff1ac017851764602288575d65b8e8ff1963fed419063", size = 4924405, upload-time = "2025-12-12T17:30:51.735Z" }, + { url = "https://files.pythonhosted.org/packages/0b/47/e3409f1e1e69c073a3a6fd8cb886eb18c0bae0ee13db2c8d5e7f8495e8b7/fonttools-4.61.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:b148b56f5de675ee16d45e769e69f87623a4944f7443850bf9a9376e628a89d2", size = 5035553, upload-time = "2025-12-12T17:30:54.823Z" }, + { url = "https://files.pythonhosted.org/packages/bf/b6/1f6600161b1073a984294c6c031e1a56ebf95b6164249eecf30012bb2e38/fonttools-4.61.1-cp314-cp314-win32.whl", hash = "sha256:9b666a475a65f4e839d3d10473fad6d47e0a9db14a2f4a224029c5bfde58ad2c", size = 2271915, upload-time = "2025-12-12T17:30:57.913Z" }, + { url = "https://files.pythonhosted.org/packages/52/7b/91e7b01e37cc8eb0e1f770d08305b3655e4f002fc160fb82b3390eabacf5/fonttools-4.61.1-cp314-cp314-win_amd64.whl", hash = "sha256:4f5686e1fe5fce75d82d93c47a438a25bf0d1319d2843a926f741140b2b16e0c", size = 2323487, upload-time = "2025-12-12T17:30:59.804Z" }, + { url = "https://files.pythonhosted.org/packages/39/5c/908ad78e46c61c3e3ed70c3b58ff82ab48437faf84ec84f109592cabbd9f/fonttools-4.61.1-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:e76ce097e3c57c4bcb67c5aa24a0ecdbd9f74ea9219997a707a4061fbe2707aa", size = 2929571, upload-time = "2025-12-12T17:31:02.574Z" }, + { url = "https://files.pythonhosted.org/packages/bd/41/975804132c6dea64cdbfbaa59f3518a21c137a10cccf962805b301ac6ab2/fonttools-4.61.1-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:9cfef3ab326780c04d6646f68d4b4742aae222e8b8ea1d627c74e38afcbc9d91", size = 2435317, upload-time = "2025-12-12T17:31:04.974Z" }, + { url = "https://files.pythonhosted.org/packages/b0/5a/aef2a0a8daf1ebaae4cfd83f84186d4a72ee08fd6a8451289fcd03ffa8a4/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", size = 4882124, upload-time = "2025-12-12T17:31:07.456Z" }, + { url = "https://files.pythonhosted.org/packages/80/33/d6db3485b645b81cea538c9d1c9219d5805f0877fda18777add4671c5240/fonttools-4.61.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:91669ccac46bbc1d09e9273546181919064e8df73488ea087dcac3e2968df9ba", size = 5100391, upload-time = "2025-12-12T17:31:09.732Z" }, + { url = "https://files.pythonhosted.org/packages/6c/d6/675ba631454043c75fcf76f0ca5463eac8eb0666ea1d7badae5fea001155/fonttools-4.61.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:c33ab3ca9d3ccd581d58e989d67554e42d8d4ded94ab3ade3508455fe70e65f7", size = 4978800, upload-time = "2025-12-12T17:31:11.681Z" }, + { url = "https://files.pythonhosted.org/packages/7f/33/d3ec753d547a8d2bdaedd390d4a814e8d5b45a093d558f025c6b990b554c/fonttools-4.61.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:664c5a68ec406f6b1547946683008576ef8b38275608e1cee6c061828171c118", size = 5006426, upload-time = "2025-12-12T17:31:13.764Z" }, + { url = "https://files.pythonhosted.org/packages/b4/40/cc11f378b561a67bea850ab50063366a0d1dd3f6d0a30ce0f874b0ad5664/fonttools-4.61.1-cp314-cp314t-win32.whl", hash = "sha256:aed04cabe26f30c1647ef0e8fbb207516fd40fe9472e9439695f5c6998e60ac5", size = 2335377, upload-time = "2025-12-12T17:31:16.49Z" }, + { url = "https://files.pythonhosted.org/packages/e4/ff/c9a2b66b39f8628531ea58b320d66d951267c98c6a38684daa8f50fb02f8/fonttools-4.61.1-cp314-cp314t-win_amd64.whl", hash = "sha256:2180f14c141d2f0f3da43f3a81bc8aa4684860f6b0e6f9e165a4831f24e6a23b", size = 2400613, upload-time = "2025-12-12T17:31:18.769Z" }, + { url = "https://files.pythonhosted.org/packages/c7/4e/ce75a57ff3aebf6fc1f4e9d508b8e5810618a33d900ad6c19eb30b290b97/fonttools-4.61.1-py3-none-any.whl", hash = "sha256:17d2bf5d541add43822bcf0c43d7d847b160c9bb01d15d5007d84e2217aaa371", size = 1148996, upload-time = "2025-12-12T17:31:21.03Z" }, +] + [[package]] name = "idna" version = "3.11" @@ -191,6 +431,114 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl", hash = "sha256:f631c04d2c48c52b84d0d0549c99ff3859c98df65b3101406327ecc7d53fbf12", size = 7484, upload-time = "2025-10-18T21:55:41.639Z" }, ] +[[package]] +name = "kiwisolver" +version = "1.4.9" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/5c/3c/85844f1b0feb11ee581ac23fe5fce65cd049a200c1446708cc1b7f922875/kiwisolver-1.4.9.tar.gz", hash = "sha256:c3b22c26c6fd6811b0ae8363b95ca8ce4ea3c202d3d0975b2914310ceb1bcc4d", size = 97564, upload-time = "2025-08-10T21:27:49.279Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c6/5d/8ce64e36d4e3aac5ca96996457dcf33e34e6051492399a3f1fec5657f30b/kiwisolver-1.4.9-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:b4b4d74bda2b8ebf4da5bd42af11d02d04428b2c32846e4c2c93219df8a7987b", size = 124159, upload-time = "2025-08-10T21:25:35.472Z" }, + { url = "https://files.pythonhosted.org/packages/96/1e/22f63ec454874378175a5f435d6ea1363dd33fb2af832c6643e4ccea0dc8/kiwisolver-1.4.9-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:fb3b8132019ea572f4611d770991000d7f58127560c4889729248eb5852a102f", size = 66578, upload-time = "2025-08-10T21:25:36.73Z" }, + { url = "https://files.pythonhosted.org/packages/41/4c/1925dcfff47a02d465121967b95151c82d11027d5ec5242771e580e731bd/kiwisolver-1.4.9-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:84fd60810829c27ae375114cd379da1fa65e6918e1da405f356a775d49a62bcf", size = 65312, upload-time = "2025-08-10T21:25:37.658Z" }, + { url = "https://files.pythonhosted.org/packages/d4/42/0f333164e6307a0687d1eb9ad256215aae2f4bd5d28f4653d6cd319a3ba3/kiwisolver-1.4.9-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:b78efa4c6e804ecdf727e580dbb9cba85624d2e1c6b5cb059c66290063bd99a9", size = 1628458, upload-time = "2025-08-10T21:25:39.067Z" }, + { url = "https://files.pythonhosted.org/packages/86/b6/2dccb977d651943995a90bfe3495c2ab2ba5cd77093d9f2318a20c9a6f59/kiwisolver-1.4.9-cp310-cp310-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d4efec7bcf21671db6a3294ff301d2fc861c31faa3c8740d1a94689234d1b415", size = 1225640, upload-time = "2025-08-10T21:25:40.489Z" }, + { url = "https://files.pythonhosted.org/packages/50/2b/362ebd3eec46c850ccf2bfe3e30f2fc4c008750011f38a850f088c56a1c6/kiwisolver-1.4.9-cp310-cp310-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:90f47e70293fc3688b71271100a1a5453aa9944a81d27ff779c108372cf5567b", size = 1244074, upload-time = "2025-08-10T21:25:42.221Z" }, + { url = "https://files.pythonhosted.org/packages/6f/bb/f09a1e66dab8984773d13184a10a29fe67125337649d26bdef547024ed6b/kiwisolver-1.4.9-cp310-cp310-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:8fdca1def57a2e88ef339de1737a1449d6dbf5fab184c54a1fca01d541317154", size = 1293036, upload-time = "2025-08-10T21:25:43.801Z" }, + { url = "https://files.pythonhosted.org/packages/ea/01/11ecf892f201cafda0f68fa59212edaea93e96c37884b747c181303fccd1/kiwisolver-1.4.9-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:9cf554f21be770f5111a1690d42313e140355e687e05cf82cb23d0a721a64a48", size = 2175310, upload-time = "2025-08-10T21:25:45.045Z" }, + { url = "https://files.pythonhosted.org/packages/7f/5f/bfe11d5b934f500cc004314819ea92427e6e5462706a498c1d4fc052e08f/kiwisolver-1.4.9-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:fc1795ac5cd0510207482c3d1d3ed781143383b8cfd36f5c645f3897ce066220", size = 2270943, upload-time = "2025-08-10T21:25:46.393Z" }, + { url = "https://files.pythonhosted.org/packages/3d/de/259f786bf71f1e03e73d87e2db1a9a3bcab64d7b4fd780167123161630ad/kiwisolver-1.4.9-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:ccd09f20ccdbbd341b21a67ab50a119b64a403b09288c27481575105283c1586", size = 2440488, upload-time = "2025-08-10T21:25:48.074Z" }, + { url = "https://files.pythonhosted.org/packages/1b/76/c989c278faf037c4d3421ec07a5c452cd3e09545d6dae7f87c15f54e4edf/kiwisolver-1.4.9-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:540c7c72324d864406a009d72f5d6856f49693db95d1fbb46cf86febef873634", size = 2246787, upload-time = "2025-08-10T21:25:49.442Z" }, + { url = "https://files.pythonhosted.org/packages/a2/55/c2898d84ca440852e560ca9f2a0d28e6e931ac0849b896d77231929900e7/kiwisolver-1.4.9-cp310-cp310-win_amd64.whl", hash = "sha256:ede8c6d533bc6601a47ad4046080d36b8fc99f81e6f1c17b0ac3c2dc91ac7611", size = 73730, upload-time = "2025-08-10T21:25:51.102Z" }, + { url = "https://files.pythonhosted.org/packages/e8/09/486d6ac523dd33b80b368247f238125d027964cfacb45c654841e88fb2ae/kiwisolver-1.4.9-cp310-cp310-win_arm64.whl", hash = "sha256:7b4da0d01ac866a57dd61ac258c5607b4cd677f63abaec7b148354d2b2cdd536", size = 65036, upload-time = "2025-08-10T21:25:52.063Z" }, + { url = "https://files.pythonhosted.org/packages/6f/ab/c80b0d5a9d8a1a65f4f815f2afff9798b12c3b9f31f1d304dd233dd920e2/kiwisolver-1.4.9-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:eb14a5da6dc7642b0f3a18f13654847cd8b7a2550e2645a5bda677862b03ba16", size = 124167, upload-time = "2025-08-10T21:25:53.403Z" }, + { url = "https://files.pythonhosted.org/packages/a0/c0/27fe1a68a39cf62472a300e2879ffc13c0538546c359b86f149cc19f6ac3/kiwisolver-1.4.9-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:39a219e1c81ae3b103643d2aedb90f1ef22650deb266ff12a19e7773f3e5f089", size = 66579, upload-time = "2025-08-10T21:25:54.79Z" }, + { url = "https://files.pythonhosted.org/packages/31/a2/a12a503ac1fd4943c50f9822678e8015a790a13b5490354c68afb8489814/kiwisolver-1.4.9-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2405a7d98604b87f3fc28b1716783534b1b4b8510d8142adca34ee0bc3c87543", size = 65309, upload-time = "2025-08-10T21:25:55.76Z" }, + { url = "https://files.pythonhosted.org/packages/66/e1/e533435c0be77c3f64040d68d7a657771194a63c279f55573188161e81ca/kiwisolver-1.4.9-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:dc1ae486f9abcef254b5618dfb4113dd49f94c68e3e027d03cf0143f3f772b61", size = 1435596, upload-time = "2025-08-10T21:25:56.861Z" }, + { url = "https://files.pythonhosted.org/packages/67/1e/51b73c7347f9aabdc7215aa79e8b15299097dc2f8e67dee2b095faca9cb0/kiwisolver-1.4.9-cp311-cp311-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8a1f570ce4d62d718dce3f179ee78dac3b545ac16c0c04bb363b7607a949c0d1", size = 1246548, upload-time = "2025-08-10T21:25:58.246Z" }, + { url = "https://files.pythonhosted.org/packages/21/aa/72a1c5d1e430294f2d32adb9542719cfb441b5da368d09d268c7757af46c/kiwisolver-1.4.9-cp311-cp311-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:cb27e7b78d716c591e88e0a09a2139c6577865d7f2e152488c2cc6257f460872", size = 1263618, upload-time = "2025-08-10T21:25:59.857Z" }, + { url = "https://files.pythonhosted.org/packages/a3/af/db1509a9e79dbf4c260ce0cfa3903ea8945f6240e9e59d1e4deb731b1a40/kiwisolver-1.4.9-cp311-cp311-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:15163165efc2f627eb9687ea5f3a28137217d217ac4024893d753f46bce9de26", size = 1317437, upload-time = "2025-08-10T21:26:01.105Z" }, + { url = "https://files.pythonhosted.org/packages/e0/f2/3ea5ee5d52abacdd12013a94130436e19969fa183faa1e7c7fbc89e9a42f/kiwisolver-1.4.9-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:bdee92c56a71d2b24c33a7d4c2856bd6419d017e08caa7802d2963870e315028", size = 2195742, upload-time = "2025-08-10T21:26:02.675Z" }, + { url = "https://files.pythonhosted.org/packages/6f/9b/1efdd3013c2d9a2566aa6a337e9923a00590c516add9a1e89a768a3eb2fc/kiwisolver-1.4.9-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:412f287c55a6f54b0650bd9b6dce5aceddb95864a1a90c87af16979d37c89771", size = 2290810, upload-time = "2025-08-10T21:26:04.009Z" }, + { url = "https://files.pythonhosted.org/packages/fb/e5/cfdc36109ae4e67361f9bc5b41323648cb24a01b9ade18784657e022e65f/kiwisolver-1.4.9-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:2c93f00dcba2eea70af2be5f11a830a742fe6b579a1d4e00f47760ef13be247a", size = 2461579, upload-time = "2025-08-10T21:26:05.317Z" }, + { url = "https://files.pythonhosted.org/packages/62/86/b589e5e86c7610842213994cdea5add00960076bef4ae290c5fa68589cac/kiwisolver-1.4.9-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f117e1a089d9411663a3207ba874f31be9ac8eaa5b533787024dc07aeb74f464", size = 2268071, upload-time = "2025-08-10T21:26:06.686Z" }, + { url = "https://files.pythonhosted.org/packages/3b/c6/f8df8509fd1eee6c622febe54384a96cfaf4d43bf2ccec7a0cc17e4715c9/kiwisolver-1.4.9-cp311-cp311-win_amd64.whl", hash = "sha256:be6a04e6c79819c9a8c2373317d19a96048e5a3f90bec587787e86a1153883c2", size = 73840, upload-time = "2025-08-10T21:26:07.94Z" }, + { url = "https://files.pythonhosted.org/packages/e2/2d/16e0581daafd147bc11ac53f032a2b45eabac897f42a338d0a13c1e5c436/kiwisolver-1.4.9-cp311-cp311-win_arm64.whl", hash = "sha256:0ae37737256ba2de764ddc12aed4956460277f00c4996d51a197e72f62f5eec7", size = 65159, upload-time = "2025-08-10T21:26:09.048Z" }, + { url = "https://files.pythonhosted.org/packages/86/c9/13573a747838aeb1c76e3267620daa054f4152444d1f3d1a2324b78255b5/kiwisolver-1.4.9-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:ac5a486ac389dddcc5bef4f365b6ae3ffff2c433324fb38dd35e3fab7c957999", size = 123686, upload-time = "2025-08-10T21:26:10.034Z" }, + { url = "https://files.pythonhosted.org/packages/51/ea/2ecf727927f103ffd1739271ca19c424d0e65ea473fbaeea1c014aea93f6/kiwisolver-1.4.9-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:f2ba92255faa7309d06fe44c3a4a97efe1c8d640c2a79a5ef728b685762a6fd2", size = 66460, upload-time = "2025-08-10T21:26:11.083Z" }, + { url = "https://files.pythonhosted.org/packages/5b/5a/51f5464373ce2aeb5194508298a508b6f21d3867f499556263c64c621914/kiwisolver-1.4.9-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4a2899935e724dd1074cb568ce7ac0dce28b2cd6ab539c8e001a8578eb106d14", size = 64952, upload-time = "2025-08-10T21:26:12.058Z" }, + { url = "https://files.pythonhosted.org/packages/70/90/6d240beb0f24b74371762873e9b7f499f1e02166a2d9c5801f4dbf8fa12e/kiwisolver-1.4.9-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f6008a4919fdbc0b0097089f67a1eb55d950ed7e90ce2cc3e640abadd2757a04", size = 1474756, upload-time = "2025-08-10T21:26:13.096Z" }, + { url = "https://files.pythonhosted.org/packages/12/42/f36816eaf465220f683fb711efdd1bbf7a7005a2473d0e4ed421389bd26c/kiwisolver-1.4.9-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:67bb8b474b4181770f926f7b7d2f8c0248cbcb78b660fdd41a47054b28d2a752", size = 1276404, upload-time = "2025-08-10T21:26:14.457Z" }, + { url = "https://files.pythonhosted.org/packages/2e/64/bc2de94800adc830c476dce44e9b40fd0809cddeef1fde9fcf0f73da301f/kiwisolver-1.4.9-cp312-cp312-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:2327a4a30d3ee07d2fbe2e7933e8a37c591663b96ce42a00bc67461a87d7df77", size = 1294410, upload-time = "2025-08-10T21:26:15.73Z" }, + { url = "https://files.pythonhosted.org/packages/5f/42/2dc82330a70aa8e55b6d395b11018045e58d0bb00834502bf11509f79091/kiwisolver-1.4.9-cp312-cp312-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:7a08b491ec91b1d5053ac177afe5290adacf1f0f6307d771ccac5de30592d198", size = 1343631, upload-time = "2025-08-10T21:26:17.045Z" }, + { url = "https://files.pythonhosted.org/packages/22/fd/f4c67a6ed1aab149ec5a8a401c323cee7a1cbe364381bb6c9c0d564e0e20/kiwisolver-1.4.9-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:d8fc5c867c22b828001b6a38d2eaeb88160bf5783c6cb4a5e440efc981ce286d", size = 2224963, upload-time = "2025-08-10T21:26:18.737Z" }, + { url = "https://files.pythonhosted.org/packages/45/aa/76720bd4cb3713314677d9ec94dcc21ced3f1baf4830adde5bb9b2430a5f/kiwisolver-1.4.9-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:3b3115b2581ea35bb6d1f24a4c90af37e5d9b49dcff267eeed14c3893c5b86ab", size = 2321295, upload-time = "2025-08-10T21:26:20.11Z" }, + { url = "https://files.pythonhosted.org/packages/80/19/d3ec0d9ab711242f56ae0dc2fc5d70e298bb4a1f9dfab44c027668c673a1/kiwisolver-1.4.9-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:858e4c22fb075920b96a291928cb7dea5644e94c0ee4fcd5af7e865655e4ccf2", size = 2487987, upload-time = "2025-08-10T21:26:21.49Z" }, + { url = "https://files.pythonhosted.org/packages/39/e9/61e4813b2c97e86b6fdbd4dd824bf72d28bcd8d4849b8084a357bc0dd64d/kiwisolver-1.4.9-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ed0fecd28cc62c54b262e3736f8bb2512d8dcfdc2bcf08be5f47f96bf405b145", size = 2291817, upload-time = "2025-08-10T21:26:22.812Z" }, + { url = "https://files.pythonhosted.org/packages/a0/41/85d82b0291db7504da3c2defe35c9a8a5c9803a730f297bd823d11d5fb77/kiwisolver-1.4.9-cp312-cp312-win_amd64.whl", hash = "sha256:f68208a520c3d86ea51acf688a3e3002615a7f0238002cccc17affecc86a8a54", size = 73895, upload-time = "2025-08-10T21:26:24.37Z" }, + { url = "https://files.pythonhosted.org/packages/e2/92/5f3068cf15ee5cb624a0c7596e67e2a0bb2adee33f71c379054a491d07da/kiwisolver-1.4.9-cp312-cp312-win_arm64.whl", hash = "sha256:2c1a4f57df73965f3f14df20b80ee29e6a7930a57d2d9e8491a25f676e197c60", size = 64992, upload-time = "2025-08-10T21:26:25.732Z" }, + { url = "https://files.pythonhosted.org/packages/31/c1/c2686cda909742ab66c7388e9a1a8521a59eb89f8bcfbee28fc980d07e24/kiwisolver-1.4.9-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:a5d0432ccf1c7ab14f9949eec60c5d1f924f17c037e9f8b33352fa05799359b8", size = 123681, upload-time = "2025-08-10T21:26:26.725Z" }, + { url = "https://files.pythonhosted.org/packages/ca/f0/f44f50c9f5b1a1860261092e3bc91ecdc9acda848a8b8c6abfda4a24dd5c/kiwisolver-1.4.9-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:efb3a45b35622bb6c16dbfab491a8f5a391fe0e9d45ef32f4df85658232ca0e2", size = 66464, upload-time = "2025-08-10T21:26:27.733Z" }, + { url = "https://files.pythonhosted.org/packages/2d/7a/9d90a151f558e29c3936b8a47ac770235f436f2120aca41a6d5f3d62ae8d/kiwisolver-1.4.9-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:1a12cf6398e8a0a001a059747a1cbf24705e18fe413bc22de7b3d15c67cffe3f", size = 64961, upload-time = "2025-08-10T21:26:28.729Z" }, + { url = "https://files.pythonhosted.org/packages/e9/e9/f218a2cb3a9ffbe324ca29a9e399fa2d2866d7f348ec3a88df87fc248fc5/kiwisolver-1.4.9-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:b67e6efbf68e077dd71d1a6b37e43e1a99d0bff1a3d51867d45ee8908b931098", size = 1474607, upload-time = "2025-08-10T21:26:29.798Z" }, + { url = "https://files.pythonhosted.org/packages/d9/28/aac26d4c882f14de59041636292bc838db8961373825df23b8eeb807e198/kiwisolver-1.4.9-cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5656aa670507437af0207645273ccdfee4f14bacd7f7c67a4306d0dcaeaf6eed", size = 1276546, upload-time = "2025-08-10T21:26:31.401Z" }, + { url = "https://files.pythonhosted.org/packages/8b/ad/8bfc1c93d4cc565e5069162f610ba2f48ff39b7de4b5b8d93f69f30c4bed/kiwisolver-1.4.9-cp313-cp313-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:bfc08add558155345129c7803b3671cf195e6a56e7a12f3dde7c57d9b417f525", size = 1294482, upload-time = "2025-08-10T21:26:32.721Z" }, + { url = "https://files.pythonhosted.org/packages/da/f1/6aca55ff798901d8ce403206d00e033191f63d82dd708a186e0ed2067e9c/kiwisolver-1.4.9-cp313-cp313-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:40092754720b174e6ccf9e845d0d8c7d8e12c3d71e7fc35f55f3813e96376f78", size = 1343720, upload-time = "2025-08-10T21:26:34.032Z" }, + { url = "https://files.pythonhosted.org/packages/d1/91/eed031876c595c81d90d0f6fc681ece250e14bf6998c3d7c419466b523b7/kiwisolver-1.4.9-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:497d05f29a1300d14e02e6441cf0f5ee81c1ff5a304b0d9fb77423974684e08b", size = 2224907, upload-time = "2025-08-10T21:26:35.824Z" }, + { url = "https://files.pythonhosted.org/packages/e9/ec/4d1925f2e49617b9cca9c34bfa11adefad49d00db038e692a559454dfb2e/kiwisolver-1.4.9-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:bdd1a81a1860476eb41ac4bc1e07b3f07259e6d55bbf739b79c8aaedcf512799", size = 2321334, upload-time = "2025-08-10T21:26:37.534Z" }, + { url = "https://files.pythonhosted.org/packages/43/cb/450cd4499356f68802750c6ddc18647b8ea01ffa28f50d20598e0befe6e9/kiwisolver-1.4.9-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:e6b93f13371d341afee3be9f7c5964e3fe61d5fa30f6a30eb49856935dfe4fc3", size = 2488313, upload-time = "2025-08-10T21:26:39.191Z" }, + { url = "https://files.pythonhosted.org/packages/71/67/fc76242bd99f885651128a5d4fa6083e5524694b7c88b489b1b55fdc491d/kiwisolver-1.4.9-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:d75aa530ccfaa593da12834b86a0724f58bff12706659baa9227c2ccaa06264c", size = 2291970, upload-time = "2025-08-10T21:26:40.828Z" }, + { url = "https://files.pythonhosted.org/packages/75/bd/f1a5d894000941739f2ae1b65a32892349423ad49c2e6d0771d0bad3fae4/kiwisolver-1.4.9-cp313-cp313-win_amd64.whl", hash = "sha256:dd0a578400839256df88c16abddf9ba14813ec5f21362e1fe65022e00c883d4d", size = 73894, upload-time = "2025-08-10T21:26:42.33Z" }, + { url = "https://files.pythonhosted.org/packages/95/38/dce480814d25b99a391abbddadc78f7c117c6da34be68ca8b02d5848b424/kiwisolver-1.4.9-cp313-cp313-win_arm64.whl", hash = "sha256:d4188e73af84ca82468f09cadc5ac4db578109e52acb4518d8154698d3a87ca2", size = 64995, upload-time = "2025-08-10T21:26:43.889Z" }, + { url = "https://files.pythonhosted.org/packages/e2/37/7d218ce5d92dadc5ebdd9070d903e0c7cf7edfe03f179433ac4d13ce659c/kiwisolver-1.4.9-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:5a0f2724dfd4e3b3ac5a82436a8e6fd16baa7d507117e4279b660fe8ca38a3a1", size = 126510, upload-time = "2025-08-10T21:26:44.915Z" }, + { url = "https://files.pythonhosted.org/packages/23/b0/e85a2b48233daef4b648fb657ebbb6f8367696a2d9548a00b4ee0eb67803/kiwisolver-1.4.9-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:1b11d6a633e4ed84fc0ddafd4ebfd8ea49b3f25082c04ad12b8315c11d504dc1", size = 67903, upload-time = "2025-08-10T21:26:45.934Z" }, + { url = "https://files.pythonhosted.org/packages/44/98/f2425bc0113ad7de24da6bb4dae1343476e95e1d738be7c04d31a5d037fd/kiwisolver-1.4.9-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:61874cdb0a36016354853593cffc38e56fc9ca5aa97d2c05d3dcf6922cd55a11", size = 66402, upload-time = "2025-08-10T21:26:47.101Z" }, + { url = "https://files.pythonhosted.org/packages/98/d8/594657886df9f34c4177cc353cc28ca7e6e5eb562d37ccc233bff43bbe2a/kiwisolver-1.4.9-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:60c439763a969a6af93b4881db0eed8fadf93ee98e18cbc35bc8da868d0c4f0c", size = 1582135, upload-time = "2025-08-10T21:26:48.665Z" }, + { url = "https://files.pythonhosted.org/packages/5c/c6/38a115b7170f8b306fc929e166340c24958347308ea3012c2b44e7e295db/kiwisolver-1.4.9-cp313-cp313t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:92a2f997387a1b79a75e7803aa7ded2cfbe2823852ccf1ba3bcf613b62ae3197", size = 1389409, upload-time = "2025-08-10T21:26:50.335Z" }, + { url = "https://files.pythonhosted.org/packages/bf/3b/e04883dace81f24a568bcee6eb3001da4ba05114afa622ec9b6fafdc1f5e/kiwisolver-1.4.9-cp313-cp313t-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a31d512c812daea6d8b3be3b2bfcbeb091dbb09177706569bcfc6240dcf8b41c", size = 1401763, upload-time = "2025-08-10T21:26:51.867Z" }, + { url = "https://files.pythonhosted.org/packages/9f/80/20ace48e33408947af49d7d15c341eaee69e4e0304aab4b7660e234d6288/kiwisolver-1.4.9-cp313-cp313t-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:52a15b0f35dad39862d376df10c5230155243a2c1a436e39eb55623ccbd68185", size = 1453643, upload-time = "2025-08-10T21:26:53.592Z" }, + { url = "https://files.pythonhosted.org/packages/64/31/6ce4380a4cd1f515bdda976a1e90e547ccd47b67a1546d63884463c92ca9/kiwisolver-1.4.9-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:a30fd6fdef1430fd9e1ba7b3398b5ee4e2887783917a687d86ba69985fb08748", size = 2330818, upload-time = "2025-08-10T21:26:55.051Z" }, + { url = "https://files.pythonhosted.org/packages/fa/e9/3f3fcba3bcc7432c795b82646306e822f3fd74df0ee81f0fa067a1f95668/kiwisolver-1.4.9-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:cc9617b46837c6468197b5945e196ee9ca43057bb7d9d1ae688101e4e1dddf64", size = 2419963, upload-time = "2025-08-10T21:26:56.421Z" }, + { url = "https://files.pythonhosted.org/packages/99/43/7320c50e4133575c66e9f7dadead35ab22d7c012a3b09bb35647792b2a6d/kiwisolver-1.4.9-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:0ab74e19f6a2b027ea4f845a78827969af45ce790e6cb3e1ebab71bdf9f215ff", size = 2594639, upload-time = "2025-08-10T21:26:57.882Z" }, + { url = "https://files.pythonhosted.org/packages/65/d6/17ae4a270d4a987ef8a385b906d2bdfc9fce502d6dc0d3aea865b47f548c/kiwisolver-1.4.9-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:dba5ee5d3981160c28d5490f0d1b7ed730c22470ff7f6cc26cfcfaacb9896a07", size = 2391741, upload-time = "2025-08-10T21:26:59.237Z" }, + { url = "https://files.pythonhosted.org/packages/2a/8f/8f6f491d595a9e5912971f3f863d81baddccc8a4d0c3749d6a0dd9ffc9df/kiwisolver-1.4.9-cp313-cp313t-win_arm64.whl", hash = "sha256:0749fd8f4218ad2e851e11cc4dc05c7cbc0cbc4267bdfdb31782e65aace4ee9c", size = 68646, upload-time = "2025-08-10T21:27:00.52Z" }, + { url = "https://files.pythonhosted.org/packages/6b/32/6cc0fbc9c54d06c2969faa9c1d29f5751a2e51809dd55c69055e62d9b426/kiwisolver-1.4.9-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:9928fe1eb816d11ae170885a74d074f57af3a0d65777ca47e9aeb854a1fba386", size = 123806, upload-time = "2025-08-10T21:27:01.537Z" }, + { url = "https://files.pythonhosted.org/packages/b2/dd/2bfb1d4a4823d92e8cbb420fe024b8d2167f72079b3bb941207c42570bdf/kiwisolver-1.4.9-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:d0005b053977e7b43388ddec89fa567f43d4f6d5c2c0affe57de5ebf290dc552", size = 66605, upload-time = "2025-08-10T21:27:03.335Z" }, + { url = "https://files.pythonhosted.org/packages/f7/69/00aafdb4e4509c2ca6064646cba9cd4b37933898f426756adb2cb92ebbed/kiwisolver-1.4.9-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:2635d352d67458b66fd0667c14cb1d4145e9560d503219034a18a87e971ce4f3", size = 64925, upload-time = "2025-08-10T21:27:04.339Z" }, + { url = "https://files.pythonhosted.org/packages/43/dc/51acc6791aa14e5cb6d8a2e28cefb0dc2886d8862795449d021334c0df20/kiwisolver-1.4.9-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:767c23ad1c58c9e827b649a9ab7809fd5fd9db266a9cf02b0e926ddc2c680d58", size = 1472414, upload-time = "2025-08-10T21:27:05.437Z" }, + { url = "https://files.pythonhosted.org/packages/3d/bb/93fa64a81db304ac8a246f834d5094fae4b13baf53c839d6bb6e81177129/kiwisolver-1.4.9-cp314-cp314-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:72d0eb9fba308b8311685c2268cf7d0a0639a6cd027d8128659f72bdd8a024b4", size = 1281272, upload-time = "2025-08-10T21:27:07.063Z" }, + { url = "https://files.pythonhosted.org/packages/70/e6/6df102916960fb8d05069d4bd92d6d9a8202d5a3e2444494e7cd50f65b7a/kiwisolver-1.4.9-cp314-cp314-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f68e4f3eeca8fb22cc3d731f9715a13b652795ef657a13df1ad0c7dc0e9731df", size = 1298578, upload-time = "2025-08-10T21:27:08.452Z" }, + { url = "https://files.pythonhosted.org/packages/7c/47/e142aaa612f5343736b087864dbaebc53ea8831453fb47e7521fa8658f30/kiwisolver-1.4.9-cp314-cp314-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d84cd4061ae292d8ac367b2c3fa3aad11cb8625a95d135fe93f286f914f3f5a6", size = 1345607, upload-time = "2025-08-10T21:27:10.125Z" }, + { url = "https://files.pythonhosted.org/packages/54/89/d641a746194a0f4d1a3670fb900d0dbaa786fb98341056814bc3f058fa52/kiwisolver-1.4.9-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:a60ea74330b91bd22a29638940d115df9dc00af5035a9a2a6ad9399ffb4ceca5", size = 2230150, upload-time = "2025-08-10T21:27:11.484Z" }, + { url = "https://files.pythonhosted.org/packages/aa/6b/5ee1207198febdf16ac11f78c5ae40861b809cbe0e6d2a8d5b0b3044b199/kiwisolver-1.4.9-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:ce6a3a4e106cf35c2d9c4fa17c05ce0b180db622736845d4315519397a77beaf", size = 2325979, upload-time = "2025-08-10T21:27:12.917Z" }, + { url = "https://files.pythonhosted.org/packages/fc/ff/b269eefd90f4ae14dcc74973d5a0f6d28d3b9bb1afd8c0340513afe6b39a/kiwisolver-1.4.9-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:77937e5e2a38a7b48eef0585114fe7930346993a88060d0bf886086d2aa49ef5", size = 2491456, upload-time = "2025-08-10T21:27:14.353Z" }, + { url = "https://files.pythonhosted.org/packages/fc/d4/10303190bd4d30de547534601e259a4fbf014eed94aae3e5521129215086/kiwisolver-1.4.9-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:24c175051354f4a28c5d6a31c93906dc653e2bf234e8a4bbfb964892078898ce", size = 2294621, upload-time = "2025-08-10T21:27:15.808Z" }, + { url = "https://files.pythonhosted.org/packages/28/e0/a9a90416fce5c0be25742729c2ea52105d62eda6c4be4d803c2a7be1fa50/kiwisolver-1.4.9-cp314-cp314-win_amd64.whl", hash = "sha256:0763515d4df10edf6d06a3c19734e2566368980d21ebec439f33f9eb936c07b7", size = 75417, upload-time = "2025-08-10T21:27:17.436Z" }, + { url = "https://files.pythonhosted.org/packages/1f/10/6949958215b7a9a264299a7db195564e87900f709db9245e4ebdd3c70779/kiwisolver-1.4.9-cp314-cp314-win_arm64.whl", hash = "sha256:0e4e2bf29574a6a7b7f6cb5fa69293b9f96c928949ac4a53ba3f525dffb87f9c", size = 66582, upload-time = "2025-08-10T21:27:18.436Z" }, + { url = "https://files.pythonhosted.org/packages/ec/79/60e53067903d3bc5469b369fe0dfc6b3482e2133e85dae9daa9527535991/kiwisolver-1.4.9-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:d976bbb382b202f71c67f77b0ac11244021cfa3f7dfd9e562eefcea2df711548", size = 126514, upload-time = "2025-08-10T21:27:19.465Z" }, + { url = "https://files.pythonhosted.org/packages/25/d1/4843d3e8d46b072c12a38c97c57fab4608d36e13fe47d47ee96b4d61ba6f/kiwisolver-1.4.9-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:2489e4e5d7ef9a1c300a5e0196e43d9c739f066ef23270607d45aba368b91f2d", size = 67905, upload-time = "2025-08-10T21:27:20.51Z" }, + { url = "https://files.pythonhosted.org/packages/8c/ae/29ffcbd239aea8b93108de1278271ae764dfc0d803a5693914975f200596/kiwisolver-1.4.9-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:e2ea9f7ab7fbf18fffb1b5434ce7c69a07582f7acc7717720f1d69f3e806f90c", size = 66399, upload-time = "2025-08-10T21:27:21.496Z" }, + { url = "https://files.pythonhosted.org/packages/a1/ae/d7ba902aa604152c2ceba5d352d7b62106bedbccc8e95c3934d94472bfa3/kiwisolver-1.4.9-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:b34e51affded8faee0dfdb705416153819d8ea9250bbbf7ea1b249bdeb5f1122", size = 1582197, upload-time = "2025-08-10T21:27:22.604Z" }, + { url = "https://files.pythonhosted.org/packages/f2/41/27c70d427eddb8bc7e4f16420a20fefc6f480312122a59a959fdfe0445ad/kiwisolver-1.4.9-cp314-cp314t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d8aacd3d4b33b772542b2e01beb50187536967b514b00003bdda7589722d2a64", size = 1390125, upload-time = "2025-08-10T21:27:24.036Z" }, + { url = "https://files.pythonhosted.org/packages/41/42/b3799a12bafc76d962ad69083f8b43b12bf4fe78b097b12e105d75c9b8f1/kiwisolver-1.4.9-cp314-cp314t-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:7cf974dd4e35fa315563ac99d6287a1024e4dc2077b8a7d7cd3d2fb65d283134", size = 1402612, upload-time = "2025-08-10T21:27:25.773Z" }, + { url = "https://files.pythonhosted.org/packages/d2/b5/a210ea073ea1cfaca1bb5c55a62307d8252f531beb364e18aa1e0888b5a0/kiwisolver-1.4.9-cp314-cp314t-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:85bd218b5ecfbee8c8a82e121802dcb519a86044c9c3b2e4aef02fa05c6da370", size = 1453990, upload-time = "2025-08-10T21:27:27.089Z" }, + { url = "https://files.pythonhosted.org/packages/5f/ce/a829eb8c033e977d7ea03ed32fb3c1781b4fa0433fbadfff29e39c676f32/kiwisolver-1.4.9-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:0856e241c2d3df4efef7c04a1e46b1936b6120c9bcf36dd216e3acd84bc4fb21", size = 2331601, upload-time = "2025-08-10T21:27:29.343Z" }, + { url = "https://files.pythonhosted.org/packages/e0/4b/b5e97eb142eb9cd0072dacfcdcd31b1c66dc7352b0f7c7255d339c0edf00/kiwisolver-1.4.9-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:9af39d6551f97d31a4deebeac6f45b156f9755ddc59c07b402c148f5dbb6482a", size = 2422041, upload-time = "2025-08-10T21:27:30.754Z" }, + { url = "https://files.pythonhosted.org/packages/40/be/8eb4cd53e1b85ba4edc3a9321666f12b83113a178845593307a3e7891f44/kiwisolver-1.4.9-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:bb4ae2b57fc1d8cbd1cf7b1d9913803681ffa903e7488012be5b76dedf49297f", size = 2594897, upload-time = "2025-08-10T21:27:32.803Z" }, + { url = "https://files.pythonhosted.org/packages/99/dd/841e9a66c4715477ea0abc78da039832fbb09dac5c35c58dc4c41a407b8a/kiwisolver-1.4.9-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:aedff62918805fb62d43a4aa2ecd4482c380dc76cd31bd7c8878588a61bd0369", size = 2391835, upload-time = "2025-08-10T21:27:34.23Z" }, + { url = "https://files.pythonhosted.org/packages/0c/28/4b2e5c47a0da96896fdfdb006340ade064afa1e63675d01ea5ac222b6d52/kiwisolver-1.4.9-cp314-cp314t-win_amd64.whl", hash = "sha256:1fa333e8b2ce4d9660f2cda9c0e1b6bafcfb2457a9d259faa82289e73ec24891", size = 79988, upload-time = "2025-08-10T21:27:35.587Z" }, + { url = "https://files.pythonhosted.org/packages/80/be/3578e8afd18c88cdf9cb4cffde75a96d2be38c5a903f1ed0ceec061bd09e/kiwisolver-1.4.9-cp314-cp314t-win_arm64.whl", hash = "sha256:4a48a2ce79d65d363597ef7b567ce3d14d68783d2b2263d98db3d9477805ba32", size = 70260, upload-time = "2025-08-10T21:27:36.606Z" }, + { url = "https://files.pythonhosted.org/packages/a2/63/fde392691690f55b38d5dd7b3710f5353bf7a8e52de93a22968801ab8978/kiwisolver-1.4.9-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:4d1d9e582ad4d63062d34077a9a1e9f3c34088a2ec5135b1f7190c07cf366527", size = 60183, upload-time = "2025-08-10T21:27:37.669Z" }, + { url = "https://files.pythonhosted.org/packages/27/b1/6aad34edfdb7cced27f371866f211332bba215bfd918ad3322a58f480d8b/kiwisolver-1.4.9-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:deed0c7258ceb4c44ad5ec7d9918f9f14fd05b2be86378d86cf50e63d1e7b771", size = 58675, upload-time = "2025-08-10T21:27:39.031Z" }, + { url = "https://files.pythonhosted.org/packages/9d/1a/23d855a702bb35a76faed5ae2ba3de57d323f48b1f6b17ee2176c4849463/kiwisolver-1.4.9-pp310-pypy310_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:0a590506f303f512dff6b7f75fd2fd18e16943efee932008fe7140e5fa91d80e", size = 80277, upload-time = "2025-08-10T21:27:40.129Z" }, + { url = "https://files.pythonhosted.org/packages/5a/5b/5239e3c2b8fb5afa1e8508f721bb77325f740ab6994d963e61b2b7abcc1e/kiwisolver-1.4.9-pp310-pypy310_pp73-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e09c2279a4d01f099f52d5c4b3d9e208e91edcbd1a175c9662a8b16e000fece9", size = 77994, upload-time = "2025-08-10T21:27:41.181Z" }, + { url = "https://files.pythonhosted.org/packages/f9/1c/5d4d468fb16f8410e596ed0eac02d2c68752aa7dc92997fe9d60a7147665/kiwisolver-1.4.9-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:c9e7cdf45d594ee04d5be1b24dd9d49f3d1590959b2271fb30b5ca2b262c00fb", size = 73744, upload-time = "2025-08-10T21:27:42.254Z" }, + { url = "https://files.pythonhosted.org/packages/a3/0f/36d89194b5a32c054ce93e586d4049b6c2c22887b0eb229c61c68afd3078/kiwisolver-1.4.9-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:720e05574713db64c356e86732c0f3c5252818d05f9df320f0ad8380641acea5", size = 60104, upload-time = "2025-08-10T21:27:43.287Z" }, + { url = "https://files.pythonhosted.org/packages/52/ba/4ed75f59e4658fd21fe7dde1fee0ac397c678ec3befba3fe6482d987af87/kiwisolver-1.4.9-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:17680d737d5335b552994a2008fab4c851bcd7de33094a82067ef3a576ff02fa", size = 58592, upload-time = "2025-08-10T21:27:44.314Z" }, + { url = "https://files.pythonhosted.org/packages/33/01/a8ea7c5ea32a9b45ceeaee051a04c8ed4320f5add3c51bfa20879b765b70/kiwisolver-1.4.9-pp311-pypy311_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:85b5352f94e490c028926ea567fc569c52ec79ce131dadb968d3853e809518c2", size = 80281, upload-time = "2025-08-10T21:27:45.369Z" }, + { url = "https://files.pythonhosted.org/packages/da/e3/dbd2ecdce306f1d07a1aaf324817ee993aab7aee9db47ceac757deabafbe/kiwisolver-1.4.9-pp311-pypy311_pp73-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:464415881e4801295659462c49461a24fb107c140de781d55518c4b80cb6790f", size = 78009, upload-time = "2025-08-10T21:27:46.376Z" }, + { url = "https://files.pythonhosted.org/packages/da/e9/0d4add7873a73e462aeb45c036a2dead2562b825aa46ba326727b3f31016/kiwisolver-1.4.9-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:fb940820c63a9590d31d88b815e7a3aa5915cad3ce735ab45f0c730b39547de1", size = 73929, upload-time = "2025-08-10T21:27:48.236Z" }, +] + [[package]] name = "markdown-it-py" version = "4.0.0" @@ -203,6 +551,81 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/94/54/e7d793b573f298e1c9013b8c4dade17d481164aa517d1d7148619c2cedbf/markdown_it_py-4.0.0-py3-none-any.whl", hash = "sha256:87327c59b172c5011896038353a81343b6754500a08cd7a4973bb48c6d578147", size = 87321, upload-time = "2025-08-11T12:57:51.923Z" }, ] +[[package]] +name = "matplotlib" +version = "3.10.8" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "contourpy", version = "1.3.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, + { name = "contourpy", version = "1.3.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "cycler" }, + { name = "fonttools" }, + { name = "kiwisolver" }, + { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, + { name = "numpy", version = "2.4.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "packaging" }, + { name = "pillow" }, + { name = "pyparsing" }, + { name = "python-dateutil" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/8a/76/d3c6e3a13fe484ebe7718d14e269c9569c4eb0020a968a327acb3b9a8fe6/matplotlib-3.10.8.tar.gz", hash = "sha256:2299372c19d56bcd35cf05a2738308758d32b9eaed2371898d8f5bd33f084aa3", size = 34806269, upload-time = "2025-12-10T22:56:51.155Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/58/be/a30bd917018ad220c400169fba298f2bb7003c8ccbc0c3e24ae2aacad1e8/matplotlib-3.10.8-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:00270d217d6b20d14b584c521f810d60c5c78406dc289859776550df837dcda7", size = 8239828, upload-time = "2025-12-10T22:55:02.313Z" }, + { url = "https://files.pythonhosted.org/packages/58/27/ca01e043c4841078e82cf6e80a6993dfecd315c3d79f5f3153afbb8e1ec6/matplotlib-3.10.8-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:37b3c1cc42aa184b3f738cfa18c1c1d72fd496d85467a6cf7b807936d39aa656", size = 8128050, upload-time = "2025-12-10T22:55:04.997Z" }, + { url = "https://files.pythonhosted.org/packages/cb/aa/7ab67f2b729ae6a91bcf9dcac0affb95fb8c56f7fd2b2af894ae0b0cf6fa/matplotlib-3.10.8-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:ee40c27c795bda6a5292e9cff9890189d32f7e3a0bf04e0e3c9430c4a00c37df", size = 8700452, upload-time = "2025-12-10T22:55:07.47Z" }, + { url = "https://files.pythonhosted.org/packages/73/ae/2d5817b0acee3c49b7e7ccfbf5b273f284957cc8e270adf36375db353190/matplotlib-3.10.8-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a48f2b74020919552ea25d222d5cc6af9ca3f4eb43a93e14d068457f545c2a17", size = 9534928, upload-time = "2025-12-10T22:55:10.566Z" }, + { url = "https://files.pythonhosted.org/packages/c9/5b/8e66653e9f7c39cb2e5cab25fce4810daffa2bff02cbf5f3077cea9e942c/matplotlib-3.10.8-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:f254d118d14a7f99d616271d6c3c27922c092dac11112670b157798b89bf4933", size = 9586377, upload-time = "2025-12-10T22:55:12.362Z" }, + { url = "https://files.pythonhosted.org/packages/e2/e2/fd0bbadf837f81edb0d208ba8f8cb552874c3b16e27cb91a31977d90875d/matplotlib-3.10.8-cp310-cp310-win_amd64.whl", hash = "sha256:f9b587c9c7274c1613a30afabf65a272114cd6cdbe67b3406f818c79d7ab2e2a", size = 8128127, upload-time = "2025-12-10T22:55:14.436Z" }, + { url = "https://files.pythonhosted.org/packages/f8/86/de7e3a1cdcfc941483af70609edc06b83e7c8a0e0dc9ac325200a3f4d220/matplotlib-3.10.8-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:6be43b667360fef5c754dda5d25a32e6307a03c204f3c0fc5468b78fa87b4160", size = 8251215, upload-time = "2025-12-10T22:55:16.175Z" }, + { url = "https://files.pythonhosted.org/packages/fd/14/baad3222f424b19ce6ad243c71de1ad9ec6b2e4eb1e458a48fdc6d120401/matplotlib-3.10.8-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a2b336e2d91a3d7006864e0990c83b216fcdca64b5a6484912902cef87313d78", size = 8139625, upload-time = "2025-12-10T22:55:17.712Z" }, + { url = "https://files.pythonhosted.org/packages/8f/a0/7024215e95d456de5883e6732e708d8187d9753a21d32f8ddb3befc0c445/matplotlib-3.10.8-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:efb30e3baaea72ce5928e32bab719ab4770099079d66726a62b11b1ef7273be4", size = 8712614, upload-time = "2025-12-10T22:55:20.8Z" }, + { url = "https://files.pythonhosted.org/packages/5a/f4/b8347351da9a5b3f41e26cf547252d861f685c6867d179a7c9d60ad50189/matplotlib-3.10.8-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d56a1efd5bfd61486c8bc968fa18734464556f0fb8e51690f4ac25d85cbbbbc2", size = 9540997, upload-time = "2025-12-10T22:55:23.258Z" }, + { url = "https://files.pythonhosted.org/packages/9e/c0/c7b914e297efe0bc36917bf216b2acb91044b91e930e878ae12981e461e5/matplotlib-3.10.8-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:238b7ce5717600615c895050239ec955d91f321c209dd110db988500558e70d6", size = 9596825, upload-time = "2025-12-10T22:55:25.217Z" }, + { url = "https://files.pythonhosted.org/packages/6f/d3/a4bbc01c237ab710a1f22b4da72f4ff6d77eb4c7735ea9811a94ae239067/matplotlib-3.10.8-cp311-cp311-win_amd64.whl", hash = "sha256:18821ace09c763ec93aef5eeff087ee493a24051936d7b9ebcad9662f66501f9", size = 8135090, upload-time = "2025-12-10T22:55:27.162Z" }, + { url = "https://files.pythonhosted.org/packages/89/dd/a0b6588f102beab33ca6f5218b31725216577b2a24172f327eaf6417d5c9/matplotlib-3.10.8-cp311-cp311-win_arm64.whl", hash = "sha256:bab485bcf8b1c7d2060b4fcb6fc368a9e6f4cd754c9c2fea281f4be21df394a2", size = 8012377, upload-time = "2025-12-10T22:55:29.185Z" }, + { url = "https://files.pythonhosted.org/packages/9e/67/f997cdcbb514012eb0d10cd2b4b332667997fb5ebe26b8d41d04962fa0e6/matplotlib-3.10.8-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:64fcc24778ca0404ce0cb7b6b77ae1f4c7231cdd60e6778f999ee05cbd581b9a", size = 8260453, upload-time = "2025-12-10T22:55:30.709Z" }, + { url = "https://files.pythonhosted.org/packages/7e/65/07d5f5c7f7c994f12c768708bd2e17a4f01a2b0f44a1c9eccad872433e2e/matplotlib-3.10.8-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b9a5ca4ac220a0cdd1ba6bcba3608547117d30468fefce49bb26f55c1a3d5c58", size = 8148321, upload-time = "2025-12-10T22:55:33.265Z" }, + { url = "https://files.pythonhosted.org/packages/3e/f3/c5195b1ae57ef85339fd7285dfb603b22c8b4e79114bae5f4f0fcf688677/matplotlib-3.10.8-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:3ab4aabc72de4ff77b3ec33a6d78a68227bf1123465887f9905ba79184a1cc04", size = 8716944, upload-time = "2025-12-10T22:55:34.922Z" }, + { url = "https://files.pythonhosted.org/packages/00/f9/7638f5cc82ec8a7aa005de48622eecc3ed7c9854b96ba15bd76b7fd27574/matplotlib-3.10.8-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:24d50994d8c5816ddc35411e50a86ab05f575e2530c02752e02538122613371f", size = 9550099, upload-time = "2025-12-10T22:55:36.789Z" }, + { url = "https://files.pythonhosted.org/packages/57/61/78cd5920d35b29fd2a0fe894de8adf672ff52939d2e9b43cb83cd5ce1bc7/matplotlib-3.10.8-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:99eefd13c0dc3b3c1b4d561c1169e65fe47aab7b8158754d7c084088e2329466", size = 9613040, upload-time = "2025-12-10T22:55:38.715Z" }, + { url = "https://files.pythonhosted.org/packages/30/4e/c10f171b6e2f44d9e3a2b96efa38b1677439d79c99357600a62cc1e9594e/matplotlib-3.10.8-cp312-cp312-win_amd64.whl", hash = "sha256:dd80ecb295460a5d9d260df63c43f4afbdd832d725a531f008dad1664f458adf", size = 8142717, upload-time = "2025-12-10T22:55:41.103Z" }, + { url = "https://files.pythonhosted.org/packages/f1/76/934db220026b5fef85f45d51a738b91dea7d70207581063cd9bd8fafcf74/matplotlib-3.10.8-cp312-cp312-win_arm64.whl", hash = "sha256:3c624e43ed56313651bc18a47f838b60d7b8032ed348911c54906b130b20071b", size = 8012751, upload-time = "2025-12-10T22:55:42.684Z" }, + { url = "https://files.pythonhosted.org/packages/3d/b9/15fd5541ef4f5b9a17eefd379356cf12175fe577424e7b1d80676516031a/matplotlib-3.10.8-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:3f2e409836d7f5ac2f1c013110a4d50b9f7edc26328c108915f9075d7d7a91b6", size = 8261076, upload-time = "2025-12-10T22:55:44.648Z" }, + { url = "https://files.pythonhosted.org/packages/8d/a0/2ba3473c1b66b9c74dc7107c67e9008cb1782edbe896d4c899d39ae9cf78/matplotlib-3.10.8-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:56271f3dac49a88d7fca5060f004d9d22b865f743a12a23b1e937a0be4818ee1", size = 8148794, upload-time = "2025-12-10T22:55:46.252Z" }, + { url = "https://files.pythonhosted.org/packages/75/97/a471f1c3eb1fd6f6c24a31a5858f443891d5127e63a7788678d14e249aea/matplotlib-3.10.8-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:a0a7f52498f72f13d4a25ea70f35f4cb60642b466cbb0a9be951b5bc3f45a486", size = 8718474, upload-time = "2025-12-10T22:55:47.864Z" }, + { url = "https://files.pythonhosted.org/packages/01/be/cd478f4b66f48256f42927d0acbcd63a26a893136456cd079c0cc24fbabf/matplotlib-3.10.8-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:646d95230efb9ca614a7a594d4fcacde0ac61d25e37dd51710b36477594963ce", size = 9549637, upload-time = "2025-12-10T22:55:50.048Z" }, + { url = "https://files.pythonhosted.org/packages/5d/7c/8dc289776eae5109e268c4fb92baf870678dc048a25d4ac903683b86d5bf/matplotlib-3.10.8-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:f89c151aab2e2e23cb3fe0acad1e8b82841fd265379c4cecd0f3fcb34c15e0f6", size = 9613678, upload-time = "2025-12-10T22:55:52.21Z" }, + { url = "https://files.pythonhosted.org/packages/64/40/37612487cc8a437d4dd261b32ca21fe2d79510fe74af74e1f42becb1bdb8/matplotlib-3.10.8-cp313-cp313-win_amd64.whl", hash = "sha256:e8ea3e2d4066083e264e75c829078f9e149fa119d27e19acd503de65e0b13149", size = 8142686, upload-time = "2025-12-10T22:55:54.253Z" }, + { url = "https://files.pythonhosted.org/packages/66/52/8d8a8730e968185514680c2a6625943f70269509c3dcfc0dcf7d75928cb8/matplotlib-3.10.8-cp313-cp313-win_arm64.whl", hash = "sha256:c108a1d6fa78a50646029cb6d49808ff0fc1330fda87fa6f6250c6b5369b6645", size = 8012917, upload-time = "2025-12-10T22:55:56.268Z" }, + { url = "https://files.pythonhosted.org/packages/b5/27/51fe26e1062f298af5ef66343d8ef460e090a27fea73036c76c35821df04/matplotlib-3.10.8-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:ad3d9833a64cf48cc4300f2b406c3d0f4f4724a91c0bd5640678a6ba7c102077", size = 8305679, upload-time = "2025-12-10T22:55:57.856Z" }, + { url = "https://files.pythonhosted.org/packages/2c/1e/4de865bc591ac8e3062e835f42dd7fe7a93168d519557837f0e37513f629/matplotlib-3.10.8-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:eb3823f11823deade26ce3b9f40dcb4a213da7a670013929f31d5f5ed1055b22", size = 8198336, upload-time = "2025-12-10T22:55:59.371Z" }, + { url = "https://files.pythonhosted.org/packages/c6/cb/2f7b6e75fb4dce87ef91f60cac4f6e34f4c145ab036a22318ec837971300/matplotlib-3.10.8-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:d9050fee89a89ed57b4fb2c1bfac9a3d0c57a0d55aed95949eedbc42070fea39", size = 8731653, upload-time = "2025-12-10T22:56:01.032Z" }, + { url = "https://files.pythonhosted.org/packages/46/b3/bd9c57d6ba670a37ab31fb87ec3e8691b947134b201f881665b28cc039ff/matplotlib-3.10.8-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b44d07310e404ba95f8c25aa5536f154c0a8ec473303535949e52eb71d0a1565", size = 9561356, upload-time = "2025-12-10T22:56:02.95Z" }, + { url = "https://files.pythonhosted.org/packages/c0/3d/8b94a481456dfc9dfe6e39e93b5ab376e50998cddfd23f4ae3b431708f16/matplotlib-3.10.8-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:0a33deb84c15ede243aead39f77e990469fff93ad1521163305095b77b72ce4a", size = 9614000, upload-time = "2025-12-10T22:56:05.411Z" }, + { url = "https://files.pythonhosted.org/packages/bd/cd/bc06149fe5585ba800b189a6a654a75f1f127e8aab02fd2be10df7fa500c/matplotlib-3.10.8-cp313-cp313t-win_amd64.whl", hash = "sha256:3a48a78d2786784cc2413e57397981fb45c79e968d99656706018d6e62e57958", size = 8220043, upload-time = "2025-12-10T22:56:07.551Z" }, + { url = "https://files.pythonhosted.org/packages/e3/de/b22cf255abec916562cc04eef457c13e58a1990048de0c0c3604d082355e/matplotlib-3.10.8-cp313-cp313t-win_arm64.whl", hash = "sha256:15d30132718972c2c074cd14638c7f4592bd98719e2308bccea40e0538bc0cb5", size = 8062075, upload-time = "2025-12-10T22:56:09.178Z" }, + { url = "https://files.pythonhosted.org/packages/3c/43/9c0ff7a2f11615e516c3b058e1e6e8f9614ddeca53faca06da267c48345d/matplotlib-3.10.8-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:b53285e65d4fa4c86399979e956235deb900be5baa7fc1218ea67fbfaeaadd6f", size = 8262481, upload-time = "2025-12-10T22:56:10.885Z" }, + { url = "https://files.pythonhosted.org/packages/6f/ca/e8ae28649fcdf039fda5ef554b40a95f50592a3c47e6f7270c9561c12b07/matplotlib-3.10.8-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:32f8dce744be5569bebe789e46727946041199030db8aeb2954d26013a0eb26b", size = 8151473, upload-time = "2025-12-10T22:56:12.377Z" }, + { url = "https://files.pythonhosted.org/packages/f1/6f/009d129ae70b75e88cbe7e503a12a4c0670e08ed748a902c2568909e9eb5/matplotlib-3.10.8-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4cf267add95b1c88300d96ca837833d4112756045364f5c734a2276038dae27d", size = 9553896, upload-time = "2025-12-10T22:56:14.432Z" }, + { url = "https://files.pythonhosted.org/packages/f5/26/4221a741eb97967bc1fd5e4c52b9aa5a91b2f4ec05b59f6def4d820f9df9/matplotlib-3.10.8-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2cf5bd12cecf46908f286d7838b2abc6c91cda506c0445b8223a7c19a00df008", size = 9824193, upload-time = "2025-12-10T22:56:16.29Z" }, + { url = "https://files.pythonhosted.org/packages/1f/f3/3abf75f38605772cf48a9daf5821cd4f563472f38b4b828c6fba6fa6d06e/matplotlib-3.10.8-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:41703cc95688f2516b480f7f339d8851a6035f18e100ee6a32bc0b8536a12a9c", size = 9615444, upload-time = "2025-12-10T22:56:18.155Z" }, + { url = "https://files.pythonhosted.org/packages/93/a5/de89ac80f10b8dc615807ee1133cd99ac74082581196d4d9590bea10690d/matplotlib-3.10.8-cp314-cp314-win_amd64.whl", hash = "sha256:83d282364ea9f3e52363da262ce32a09dfe241e4080dcedda3c0db059d3c1f11", size = 8272719, upload-time = "2025-12-10T22:56:20.366Z" }, + { url = "https://files.pythonhosted.org/packages/69/ce/b006495c19ccc0a137b48083168a37bd056392dee02f87dba0472f2797fe/matplotlib-3.10.8-cp314-cp314-win_arm64.whl", hash = "sha256:2c1998e92cd5999e295a731bcb2911c75f597d937341f3030cc24ef2733d78a8", size = 8144205, upload-time = "2025-12-10T22:56:22.239Z" }, + { url = "https://files.pythonhosted.org/packages/68/d9/b31116a3a855bd313c6fcdb7226926d59b041f26061c6c5b1be66a08c826/matplotlib-3.10.8-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:b5a2b97dbdc7d4f353ebf343744f1d1f1cca8aa8bfddb4262fcf4306c3761d50", size = 8305785, upload-time = "2025-12-10T22:56:24.218Z" }, + { url = "https://files.pythonhosted.org/packages/1e/90/6effe8103f0272685767ba5f094f453784057072f49b393e3ea178fe70a5/matplotlib-3.10.8-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:3f5c3e4da343bba819f0234186b9004faba952cc420fbc522dc4e103c1985908", size = 8198361, upload-time = "2025-12-10T22:56:26.787Z" }, + { url = "https://files.pythonhosted.org/packages/d7/65/a73188711bea603615fc0baecca1061429ac16940e2385433cc778a9d8e7/matplotlib-3.10.8-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5f62550b9a30afde8c1c3ae450e5eb547d579dd69b25c2fc7a1c67f934c1717a", size = 9561357, upload-time = "2025-12-10T22:56:28.953Z" }, + { url = "https://files.pythonhosted.org/packages/f4/3d/b5c5d5d5be8ce63292567f0e2c43dde9953d3ed86ac2de0a72e93c8f07a1/matplotlib-3.10.8-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:495672de149445ec1b772ff2c9ede9b769e3cb4f0d0aa7fa730d7f59e2d4e1c1", size = 9823610, upload-time = "2025-12-10T22:56:31.455Z" }, + { url = "https://files.pythonhosted.org/packages/4d/4b/e7beb6bbd49f6bae727a12b270a2654d13c397576d25bd6786e47033300f/matplotlib-3.10.8-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:595ba4d8fe983b88f0eec8c26a241e16d6376fe1979086232f481f8f3f67494c", size = 9614011, upload-time = "2025-12-10T22:56:33.85Z" }, + { url = "https://files.pythonhosted.org/packages/7c/e6/76f2813d31f032e65f6f797e3f2f6e4aab95b65015924b1c51370395c28a/matplotlib-3.10.8-cp314-cp314t-win_amd64.whl", hash = "sha256:25d380fe8b1dc32cf8f0b1b448470a77afb195438bafdf1d858bfb876f3edf7b", size = 8362801, upload-time = "2025-12-10T22:56:36.107Z" }, + { url = "https://files.pythonhosted.org/packages/5d/49/d651878698a0b67f23aa28e17f45a6d6dd3d3f933fa29087fa4ce5947b5a/matplotlib-3.10.8-cp314-cp314t-win_arm64.whl", hash = "sha256:113bb52413ea508ce954a02c10ffd0d565f9c3bc7f2eddc27dfe1731e71c7b5f", size = 8192560, upload-time = "2025-12-10T22:56:38.008Z" }, + { url = "https://files.pythonhosted.org/packages/f5/43/31d59500bb950b0d188e149a2e552040528c13d6e3d6e84d0cccac593dcd/matplotlib-3.10.8-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:f97aeb209c3d2511443f8797e3e5a569aebb040d4f8bc79aa3ee78a8fb9e3dd8", size = 8237252, upload-time = "2025-12-10T22:56:39.529Z" }, + { url = "https://files.pythonhosted.org/packages/0c/2c/615c09984f3c5f907f51c886538ad785cf72e0e11a3225de2c0f9442aecc/matplotlib-3.10.8-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:fb061f596dad3a0f52b60dc6a5dec4a0c300dec41e058a7efe09256188d170b7", size = 8124693, upload-time = "2025-12-10T22:56:41.758Z" }, + { url = "https://files.pythonhosted.org/packages/91/e1/2757277a1c56041e1fc104b51a0f7b9a4afc8eb737865d63cababe30bc61/matplotlib-3.10.8-pp310-pypy310_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:12d90df9183093fcd479f4172ac26b322b1248b15729cb57f42f71f24c7e37a3", size = 8702205, upload-time = "2025-12-10T22:56:43.415Z" }, + { url = "https://files.pythonhosted.org/packages/04/30/3afaa31c757f34b7725ab9d2ba8b48b5e89c2019c003e7d0ead143aabc5a/matplotlib-3.10.8-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:6da7c2ce169267d0d066adcf63758f0604aa6c3eebf67458930f9d9b79ad1db1", size = 8249198, upload-time = "2025-12-10T22:56:45.584Z" }, + { url = "https://files.pythonhosted.org/packages/48/2f/6334aec331f57485a642a7c8be03cb286f29111ae71c46c38b363230063c/matplotlib-3.10.8-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:9153c3292705be9f9c64498a8872118540c3f4123d1a1c840172edf262c8be4a", size = 8136817, upload-time = "2025-12-10T22:56:47.339Z" }, + { url = "https://files.pythonhosted.org/packages/73/e4/6d6f14b2a759c622f191b2d67e9075a3f56aaccb3be4bb9bb6890030d0a0/matplotlib-3.10.8-pp311-pypy311_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:1ae029229a57cd1e8fe542485f27e7ca7b23aa9e8944ddb4985d0bc444f1eca2", size = 8713867, upload-time = "2025-12-10T22:56:48.954Z" }, +] + [[package]] name = "mdurl" version = "0.1.2" @@ -212,6 +635,158 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8", size = 9979, upload-time = "2022-08-14T12:40:09.779Z" }, ] +[[package]] +name = "numpy" +version = "2.2.6" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version < '3.11'", +] +sdist = { url = "https://files.pythonhosted.org/packages/76/21/7d2a95e4bba9dc13d043ee156a356c0a8f0c6309dff6b21b4d71a073b8a8/numpy-2.2.6.tar.gz", hash = "sha256:e29554e2bef54a90aa5cc07da6ce955accb83f21ab5de01a62c8478897b264fd", size = 20276440, upload-time = "2025-05-17T22:38:04.611Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9a/3e/ed6db5be21ce87955c0cbd3009f2803f59fa08df21b5df06862e2d8e2bdd/numpy-2.2.6-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b412caa66f72040e6d268491a59f2c43bf03eb6c96dd8f0307829feb7fa2b6fb", size = 21165245, upload-time = "2025-05-17T21:27:58.555Z" }, + { url = "https://files.pythonhosted.org/packages/22/c2/4b9221495b2a132cc9d2eb862e21d42a009f5a60e45fc44b00118c174bff/numpy-2.2.6-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8e41fd67c52b86603a91c1a505ebaef50b3314de0213461c7a6e99c9a3beff90", size = 14360048, upload-time = "2025-05-17T21:28:21.406Z" }, + { url = "https://files.pythonhosted.org/packages/fd/77/dc2fcfc66943c6410e2bf598062f5959372735ffda175b39906d54f02349/numpy-2.2.6-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:37e990a01ae6ec7fe7fa1c26c55ecb672dd98b19c3d0e1d1f326fa13cb38d163", size = 5340542, upload-time = "2025-05-17T21:28:30.931Z" }, + { url = "https://files.pythonhosted.org/packages/7a/4f/1cb5fdc353a5f5cc7feb692db9b8ec2c3d6405453f982435efc52561df58/numpy-2.2.6-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:5a6429d4be8ca66d889b7cf70f536a397dc45ba6faeb5f8c5427935d9592e9cf", size = 6878301, upload-time = "2025-05-17T21:28:41.613Z" }, + { url = "https://files.pythonhosted.org/packages/eb/17/96a3acd228cec142fcb8723bd3cc39c2a474f7dcf0a5d16731980bcafa95/numpy-2.2.6-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:efd28d4e9cd7d7a8d39074a4d44c63eda73401580c5c76acda2ce969e0a38e83", size = 14297320, upload-time = "2025-05-17T21:29:02.78Z" }, + { url = "https://files.pythonhosted.org/packages/b4/63/3de6a34ad7ad6646ac7d2f55ebc6ad439dbbf9c4370017c50cf403fb19b5/numpy-2.2.6-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc7b73d02efb0e18c000e9ad8b83480dfcd5dfd11065997ed4c6747470ae8915", size = 16801050, upload-time = "2025-05-17T21:29:27.675Z" }, + { url = "https://files.pythonhosted.org/packages/07/b6/89d837eddef52b3d0cec5c6ba0456c1bf1b9ef6a6672fc2b7873c3ec4e2e/numpy-2.2.6-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:74d4531beb257d2c3f4b261bfb0fc09e0f9ebb8842d82a7b4209415896adc680", size = 15807034, upload-time = "2025-05-17T21:29:51.102Z" }, + { url = "https://files.pythonhosted.org/packages/01/c8/dc6ae86e3c61cfec1f178e5c9f7858584049b6093f843bca541f94120920/numpy-2.2.6-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:8fc377d995680230e83241d8a96def29f204b5782f371c532579b4f20607a289", size = 18614185, upload-time = "2025-05-17T21:30:18.703Z" }, + { url = "https://files.pythonhosted.org/packages/5b/c5/0064b1b7e7c89137b471ccec1fd2282fceaae0ab3a9550f2568782d80357/numpy-2.2.6-cp310-cp310-win32.whl", hash = "sha256:b093dd74e50a8cba3e873868d9e93a85b78e0daf2e98c6797566ad8044e8363d", size = 6527149, upload-time = "2025-05-17T21:30:29.788Z" }, + { url = "https://files.pythonhosted.org/packages/a3/dd/4b822569d6b96c39d1215dbae0582fd99954dcbcf0c1a13c61783feaca3f/numpy-2.2.6-cp310-cp310-win_amd64.whl", hash = "sha256:f0fd6321b839904e15c46e0d257fdd101dd7f530fe03fd6359c1ea63738703f3", size = 12904620, upload-time = "2025-05-17T21:30:48.994Z" }, + { url = "https://files.pythonhosted.org/packages/da/a8/4f83e2aa666a9fbf56d6118faaaf5f1974d456b1823fda0a176eff722839/numpy-2.2.6-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f9f1adb22318e121c5c69a09142811a201ef17ab257a1e66ca3025065b7f53ae", size = 21176963, upload-time = "2025-05-17T21:31:19.36Z" }, + { url = "https://files.pythonhosted.org/packages/b3/2b/64e1affc7972decb74c9e29e5649fac940514910960ba25cd9af4488b66c/numpy-2.2.6-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c820a93b0255bc360f53eca31a0e676fd1101f673dda8da93454a12e23fc5f7a", size = 14406743, upload-time = "2025-05-17T21:31:41.087Z" }, + { url = "https://files.pythonhosted.org/packages/4a/9f/0121e375000b5e50ffdd8b25bf78d8e1a5aa4cca3f185d41265198c7b834/numpy-2.2.6-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:3d70692235e759f260c3d837193090014aebdf026dfd167834bcba43e30c2a42", size = 5352616, upload-time = "2025-05-17T21:31:50.072Z" }, + { url = "https://files.pythonhosted.org/packages/31/0d/b48c405c91693635fbe2dcd7bc84a33a602add5f63286e024d3b6741411c/numpy-2.2.6-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:481b49095335f8eed42e39e8041327c05b0f6f4780488f61286ed3c01368d491", size = 6889579, upload-time = "2025-05-17T21:32:01.712Z" }, + { url = "https://files.pythonhosted.org/packages/52/b8/7f0554d49b565d0171eab6e99001846882000883998e7b7d9f0d98b1f934/numpy-2.2.6-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b64d8d4d17135e00c8e346e0a738deb17e754230d7e0810ac5012750bbd85a5a", size = 14312005, upload-time = "2025-05-17T21:32:23.332Z" }, + { url = "https://files.pythonhosted.org/packages/b3/dd/2238b898e51bd6d389b7389ffb20d7f4c10066d80351187ec8e303a5a475/numpy-2.2.6-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba10f8411898fc418a521833e014a77d3ca01c15b0c6cdcce6a0d2897e6dbbdf", size = 16821570, upload-time = "2025-05-17T21:32:47.991Z" }, + { url = "https://files.pythonhosted.org/packages/83/6c/44d0325722cf644f191042bf47eedad61c1e6df2432ed65cbe28509d404e/numpy-2.2.6-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:bd48227a919f1bafbdda0583705e547892342c26fb127219d60a5c36882609d1", size = 15818548, upload-time = "2025-05-17T21:33:11.728Z" }, + { url = "https://files.pythonhosted.org/packages/ae/9d/81e8216030ce66be25279098789b665d49ff19eef08bfa8cb96d4957f422/numpy-2.2.6-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:9551a499bf125c1d4f9e250377c1ee2eddd02e01eac6644c080162c0c51778ab", size = 18620521, upload-time = "2025-05-17T21:33:39.139Z" }, + { url = "https://files.pythonhosted.org/packages/6a/fd/e19617b9530b031db51b0926eed5345ce8ddc669bb3bc0044b23e275ebe8/numpy-2.2.6-cp311-cp311-win32.whl", hash = "sha256:0678000bb9ac1475cd454c6b8c799206af8107e310843532b04d49649c717a47", size = 6525866, upload-time = "2025-05-17T21:33:50.273Z" }, + { url = "https://files.pythonhosted.org/packages/31/0a/f354fb7176b81747d870f7991dc763e157a934c717b67b58456bc63da3df/numpy-2.2.6-cp311-cp311-win_amd64.whl", hash = "sha256:e8213002e427c69c45a52bbd94163084025f533a55a59d6f9c5b820774ef3303", size = 12907455, upload-time = "2025-05-17T21:34:09.135Z" }, + { url = "https://files.pythonhosted.org/packages/82/5d/c00588b6cf18e1da539b45d3598d3557084990dcc4331960c15ee776ee41/numpy-2.2.6-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:41c5a21f4a04fa86436124d388f6ed60a9343a6f767fced1a8a71c3fbca038ff", size = 20875348, upload-time = "2025-05-17T21:34:39.648Z" }, + { url = "https://files.pythonhosted.org/packages/66/ee/560deadcdde6c2f90200450d5938f63a34b37e27ebff162810f716f6a230/numpy-2.2.6-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:de749064336d37e340f640b05f24e9e3dd678c57318c7289d222a8a2f543e90c", size = 14119362, upload-time = "2025-05-17T21:35:01.241Z" }, + { url = "https://files.pythonhosted.org/packages/3c/65/4baa99f1c53b30adf0acd9a5519078871ddde8d2339dc5a7fde80d9d87da/numpy-2.2.6-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:894b3a42502226a1cac872f840030665f33326fc3dac8e57c607905773cdcde3", size = 5084103, upload-time = "2025-05-17T21:35:10.622Z" }, + { url = "https://files.pythonhosted.org/packages/cc/89/e5a34c071a0570cc40c9a54eb472d113eea6d002e9ae12bb3a8407fb912e/numpy-2.2.6-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:71594f7c51a18e728451bb50cc60a3ce4e6538822731b2933209a1f3614e9282", size = 6625382, upload-time = "2025-05-17T21:35:21.414Z" }, + { url = "https://files.pythonhosted.org/packages/f8/35/8c80729f1ff76b3921d5c9487c7ac3de9b2a103b1cd05e905b3090513510/numpy-2.2.6-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f2618db89be1b4e05f7a1a847a9c1c0abd63e63a1607d892dd54668dd92faf87", size = 14018462, upload-time = "2025-05-17T21:35:42.174Z" }, + { url = "https://files.pythonhosted.org/packages/8c/3d/1e1db36cfd41f895d266b103df00ca5b3cbe965184df824dec5c08c6b803/numpy-2.2.6-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd83c01228a688733f1ded5201c678f0c53ecc1006ffbc404db9f7a899ac6249", size = 16527618, upload-time = "2025-05-17T21:36:06.711Z" }, + { url = "https://files.pythonhosted.org/packages/61/c6/03ed30992602c85aa3cd95b9070a514f8b3c33e31124694438d88809ae36/numpy-2.2.6-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:37c0ca431f82cd5fa716eca9506aefcabc247fb27ba69c5062a6d3ade8cf8f49", size = 15505511, upload-time = "2025-05-17T21:36:29.965Z" }, + { url = "https://files.pythonhosted.org/packages/b7/25/5761d832a81df431e260719ec45de696414266613c9ee268394dd5ad8236/numpy-2.2.6-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:fe27749d33bb772c80dcd84ae7e8df2adc920ae8297400dabec45f0dedb3f6de", size = 18313783, upload-time = "2025-05-17T21:36:56.883Z" }, + { url = "https://files.pythonhosted.org/packages/57/0a/72d5a3527c5ebffcd47bde9162c39fae1f90138c961e5296491ce778e682/numpy-2.2.6-cp312-cp312-win32.whl", hash = "sha256:4eeaae00d789f66c7a25ac5f34b71a7035bb474e679f410e5e1a94deb24cf2d4", size = 6246506, upload-time = "2025-05-17T21:37:07.368Z" }, + { url = "https://files.pythonhosted.org/packages/36/fa/8c9210162ca1b88529ab76b41ba02d433fd54fecaf6feb70ef9f124683f1/numpy-2.2.6-cp312-cp312-win_amd64.whl", hash = "sha256:c1f9540be57940698ed329904db803cf7a402f3fc200bfe599334c9bd84a40b2", size = 12614190, upload-time = "2025-05-17T21:37:26.213Z" }, + { url = "https://files.pythonhosted.org/packages/f9/5c/6657823f4f594f72b5471f1db1ab12e26e890bb2e41897522d134d2a3e81/numpy-2.2.6-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:0811bb762109d9708cca4d0b13c4f67146e3c3b7cf8d34018c722adb2d957c84", size = 20867828, upload-time = "2025-05-17T21:37:56.699Z" }, + { url = "https://files.pythonhosted.org/packages/dc/9e/14520dc3dadf3c803473bd07e9b2bd1b69bc583cb2497b47000fed2fa92f/numpy-2.2.6-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:287cc3162b6f01463ccd86be154f284d0893d2b3ed7292439ea97eafa8170e0b", size = 14143006, upload-time = "2025-05-17T21:38:18.291Z" }, + { url = "https://files.pythonhosted.org/packages/4f/06/7e96c57d90bebdce9918412087fc22ca9851cceaf5567a45c1f404480e9e/numpy-2.2.6-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:f1372f041402e37e5e633e586f62aa53de2eac8d98cbfb822806ce4bbefcb74d", size = 5076765, upload-time = "2025-05-17T21:38:27.319Z" }, + { url = "https://files.pythonhosted.org/packages/73/ed/63d920c23b4289fdac96ddbdd6132e9427790977d5457cd132f18e76eae0/numpy-2.2.6-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:55a4d33fa519660d69614a9fad433be87e5252f4b03850642f88993f7b2ca566", size = 6617736, upload-time = "2025-05-17T21:38:38.141Z" }, + { url = "https://files.pythonhosted.org/packages/85/c5/e19c8f99d83fd377ec8c7e0cf627a8049746da54afc24ef0a0cb73d5dfb5/numpy-2.2.6-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f92729c95468a2f4f15e9bb94c432a9229d0d50de67304399627a943201baa2f", size = 14010719, upload-time = "2025-05-17T21:38:58.433Z" }, + { url = "https://files.pythonhosted.org/packages/19/49/4df9123aafa7b539317bf6d342cb6d227e49f7a35b99c287a6109b13dd93/numpy-2.2.6-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1bc23a79bfabc5d056d106f9befb8d50c31ced2fbc70eedb8155aec74a45798f", size = 16526072, upload-time = "2025-05-17T21:39:22.638Z" }, + { url = "https://files.pythonhosted.org/packages/b2/6c/04b5f47f4f32f7c2b0e7260442a8cbcf8168b0e1a41ff1495da42f42a14f/numpy-2.2.6-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:e3143e4451880bed956e706a3220b4e5cf6172ef05fcc397f6f36a550b1dd868", size = 15503213, upload-time = "2025-05-17T21:39:45.865Z" }, + { url = "https://files.pythonhosted.org/packages/17/0a/5cd92e352c1307640d5b6fec1b2ffb06cd0dabe7d7b8227f97933d378422/numpy-2.2.6-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:b4f13750ce79751586ae2eb824ba7e1e8dba64784086c98cdbbcc6a42112ce0d", size = 18316632, upload-time = "2025-05-17T21:40:13.331Z" }, + { url = "https://files.pythonhosted.org/packages/f0/3b/5cba2b1d88760ef86596ad0f3d484b1cbff7c115ae2429678465057c5155/numpy-2.2.6-cp313-cp313-win32.whl", hash = "sha256:5beb72339d9d4fa36522fc63802f469b13cdbe4fdab4a288f0c441b74272ebfd", size = 6244532, upload-time = "2025-05-17T21:43:46.099Z" }, + { url = "https://files.pythonhosted.org/packages/cb/3b/d58c12eafcb298d4e6d0d40216866ab15f59e55d148a5658bb3132311fcf/numpy-2.2.6-cp313-cp313-win_amd64.whl", hash = "sha256:b0544343a702fa80c95ad5d3d608ea3599dd54d4632df855e4c8d24eb6ecfa1c", size = 12610885, upload-time = "2025-05-17T21:44:05.145Z" }, + { url = "https://files.pythonhosted.org/packages/6b/9e/4bf918b818e516322db999ac25d00c75788ddfd2d2ade4fa66f1f38097e1/numpy-2.2.6-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:0bca768cd85ae743b2affdc762d617eddf3bcf8724435498a1e80132d04879e6", size = 20963467, upload-time = "2025-05-17T21:40:44Z" }, + { url = "https://files.pythonhosted.org/packages/61/66/d2de6b291507517ff2e438e13ff7b1e2cdbdb7cb40b3ed475377aece69f9/numpy-2.2.6-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:fc0c5673685c508a142ca65209b4e79ed6740a4ed6b2267dbba90f34b0b3cfda", size = 14225144, upload-time = "2025-05-17T21:41:05.695Z" }, + { url = "https://files.pythonhosted.org/packages/e4/25/480387655407ead912e28ba3a820bc69af9adf13bcbe40b299d454ec011f/numpy-2.2.6-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:5bd4fc3ac8926b3819797a7c0e2631eb889b4118a9898c84f585a54d475b7e40", size = 5200217, upload-time = "2025-05-17T21:41:15.903Z" }, + { url = "https://files.pythonhosted.org/packages/aa/4a/6e313b5108f53dcbf3aca0c0f3e9c92f4c10ce57a0a721851f9785872895/numpy-2.2.6-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:fee4236c876c4e8369388054d02d0e9bb84821feb1a64dd59e137e6511a551f8", size = 6712014, upload-time = "2025-05-17T21:41:27.321Z" }, + { url = "https://files.pythonhosted.org/packages/b7/30/172c2d5c4be71fdf476e9de553443cf8e25feddbe185e0bd88b096915bcc/numpy-2.2.6-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e1dda9c7e08dc141e0247a5b8f49cf05984955246a327d4c48bda16821947b2f", size = 14077935, upload-time = "2025-05-17T21:41:49.738Z" }, + { url = "https://files.pythonhosted.org/packages/12/fb/9e743f8d4e4d3c710902cf87af3512082ae3d43b945d5d16563f26ec251d/numpy-2.2.6-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f447e6acb680fd307f40d3da4852208af94afdfab89cf850986c3ca00562f4fa", size = 16600122, upload-time = "2025-05-17T21:42:14.046Z" }, + { url = "https://files.pythonhosted.org/packages/12/75/ee20da0e58d3a66f204f38916757e01e33a9737d0b22373b3eb5a27358f9/numpy-2.2.6-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:389d771b1623ec92636b0786bc4ae56abafad4a4c513d36a55dce14bd9ce8571", size = 15586143, upload-time = "2025-05-17T21:42:37.464Z" }, + { url = "https://files.pythonhosted.org/packages/76/95/bef5b37f29fc5e739947e9ce5179ad402875633308504a52d188302319c8/numpy-2.2.6-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:8e9ace4a37db23421249ed236fdcdd457d671e25146786dfc96835cd951aa7c1", size = 18385260, upload-time = "2025-05-17T21:43:05.189Z" }, + { url = "https://files.pythonhosted.org/packages/09/04/f2f83279d287407cf36a7a8053a5abe7be3622a4363337338f2585e4afda/numpy-2.2.6-cp313-cp313t-win32.whl", hash = "sha256:038613e9fb8c72b0a41f025a7e4c3f0b7a1b5d768ece4796b674c8f3fe13efff", size = 6377225, upload-time = "2025-05-17T21:43:16.254Z" }, + { url = "https://files.pythonhosted.org/packages/67/0e/35082d13c09c02c011cf21570543d202ad929d961c02a147493cb0c2bdf5/numpy-2.2.6-cp313-cp313t-win_amd64.whl", hash = "sha256:6031dd6dfecc0cf9f668681a37648373bddd6421fff6c66ec1624eed0180ee06", size = 12771374, upload-time = "2025-05-17T21:43:35.479Z" }, + { url = "https://files.pythonhosted.org/packages/9e/3b/d94a75f4dbf1ef5d321523ecac21ef23a3cd2ac8b78ae2aac40873590229/numpy-2.2.6-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:0b605b275d7bd0c640cad4e5d30fa701a8d59302e127e5f79138ad62762c3e3d", size = 21040391, upload-time = "2025-05-17T21:44:35.948Z" }, + { url = "https://files.pythonhosted.org/packages/17/f4/09b2fa1b58f0fb4f7c7963a1649c64c4d315752240377ed74d9cd878f7b5/numpy-2.2.6-pp310-pypy310_pp73-macosx_14_0_x86_64.whl", hash = "sha256:7befc596a7dc9da8a337f79802ee8adb30a552a94f792b9c9d18c840055907db", size = 6786754, upload-time = "2025-05-17T21:44:47.446Z" }, + { url = "https://files.pythonhosted.org/packages/af/30/feba75f143bdc868a1cc3f44ccfa6c4b9ec522b36458e738cd00f67b573f/numpy-2.2.6-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ce47521a4754c8f4593837384bd3424880629f718d87c5d44f8ed763edd63543", size = 16643476, upload-time = "2025-05-17T21:45:11.871Z" }, + { url = "https://files.pythonhosted.org/packages/37/48/ac2a9584402fb6c0cd5b5d1a91dcf176b15760130dd386bbafdbfe3640bf/numpy-2.2.6-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:d042d24c90c41b54fd506da306759e06e568864df8ec17ccc17e9e884634fd00", size = 12812666, upload-time = "2025-05-17T21:45:31.426Z" }, +] + +[[package]] +name = "numpy" +version = "2.4.2" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.14' and sys_platform == 'win32'", + "python_full_version >= '3.14' and sys_platform == 'emscripten'", + "python_full_version >= '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version >= '3.11' and python_full_version < '3.14' and sys_platform == 'win32'", + "python_full_version >= '3.11' and python_full_version < '3.14' and sys_platform == 'emscripten'", + "python_full_version >= '3.11' and python_full_version < '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", +] +sdist = { url = "https://files.pythonhosted.org/packages/57/fd/0005efbd0af48e55eb3c7208af93f2862d4b1a56cd78e84309a2d959208d/numpy-2.4.2.tar.gz", hash = "sha256:659a6107e31a83c4e33f763942275fd278b21d095094044eb35569e86a21ddae", size = 20723651, upload-time = "2026-01-31T23:13:10.135Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d3/44/71852273146957899753e69986246d6a176061ea183407e95418c2aa4d9a/numpy-2.4.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:e7e88598032542bd49af7c4747541422884219056c268823ef6e5e89851c8825", size = 16955478, upload-time = "2026-01-31T23:10:25.623Z" }, + { url = "https://files.pythonhosted.org/packages/74/41/5d17d4058bd0cd96bcbd4d9ff0fb2e21f52702aab9a72e4a594efa18692f/numpy-2.4.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7edc794af8b36ca37ef5fcb5e0d128c7e0595c7b96a2318d1badb6fcd8ee86b1", size = 14965467, upload-time = "2026-01-31T23:10:28.186Z" }, + { url = "https://files.pythonhosted.org/packages/49/48/fb1ce8136c19452ed15f033f8aee91d5defe515094e330ce368a0647846f/numpy-2.4.2-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:6e9f61981ace1360e42737e2bae58b27bf28a1b27e781721047d84bd754d32e7", size = 5475172, upload-time = "2026-01-31T23:10:30.848Z" }, + { url = "https://files.pythonhosted.org/packages/40/a9/3feb49f17bbd1300dd2570432961f5c8a4ffeff1db6f02c7273bd020a4c9/numpy-2.4.2-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:cb7bbb88aa74908950d979eeaa24dbdf1a865e3c7e45ff0121d8f70387b55f73", size = 6805145, upload-time = "2026-01-31T23:10:32.352Z" }, + { url = "https://files.pythonhosted.org/packages/3f/39/fdf35cbd6d6e2fcad42fcf85ac04a85a0d0fbfbf34b30721c98d602fd70a/numpy-2.4.2-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4f069069931240b3fc703f1e23df63443dbd6390614c8c44a87d96cd0ec81eb1", size = 15966084, upload-time = "2026-01-31T23:10:34.502Z" }, + { url = "https://files.pythonhosted.org/packages/1b/46/6fa4ea94f1ddf969b2ee941290cca6f1bfac92b53c76ae5f44afe17ceb69/numpy-2.4.2-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c02ef4401a506fb60b411467ad501e1429a3487abca4664871d9ae0b46c8ba32", size = 16899477, upload-time = "2026-01-31T23:10:37.075Z" }, + { url = "https://files.pythonhosted.org/packages/09/a1/2a424e162b1a14a5bd860a464ab4e07513916a64ab1683fae262f735ccd2/numpy-2.4.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:2653de5c24910e49c2b106499803124dde62a5a1fe0eedeaecf4309a5f639390", size = 17323429, upload-time = "2026-01-31T23:10:39.704Z" }, + { url = "https://files.pythonhosted.org/packages/ce/a2/73014149ff250628df72c58204822ac01d768697913881aacf839ff78680/numpy-2.4.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:1ae241bbfc6ae276f94a170b14785e561cb5e7f626b6688cf076af4110887413", size = 18635109, upload-time = "2026-01-31T23:10:41.924Z" }, + { url = "https://files.pythonhosted.org/packages/6c/0c/73e8be2f1accd56df74abc1c5e18527822067dced5ec0861b5bb882c2ce0/numpy-2.4.2-cp311-cp311-win32.whl", hash = "sha256:df1b10187212b198dd45fa943d8985a3c8cf854aed4923796e0e019e113a1bda", size = 6237915, upload-time = "2026-01-31T23:10:45.26Z" }, + { url = "https://files.pythonhosted.org/packages/76/ae/e0265e0163cf127c24c3969d29f1c4c64551a1e375d95a13d32eab25d364/numpy-2.4.2-cp311-cp311-win_amd64.whl", hash = "sha256:b9c618d56a29c9cb1c4da979e9899be7578d2e0b3c24d52079c166324c9e8695", size = 12607972, upload-time = "2026-01-31T23:10:47.021Z" }, + { url = "https://files.pythonhosted.org/packages/29/a5/c43029af9b8014d6ea157f192652c50042e8911f4300f8f6ed3336bf437f/numpy-2.4.2-cp311-cp311-win_arm64.whl", hash = "sha256:47c5a6ed21d9452b10227e5e8a0e1c22979811cad7dcc19d8e3e2fb8fa03f1a3", size = 10485763, upload-time = "2026-01-31T23:10:50.087Z" }, + { url = "https://files.pythonhosted.org/packages/51/6e/6f394c9c77668153e14d4da83bcc247beb5952f6ead7699a1a2992613bea/numpy-2.4.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:21982668592194c609de53ba4933a7471880ccbaadcc52352694a59ecc860b3a", size = 16667963, upload-time = "2026-01-31T23:10:52.147Z" }, + { url = "https://files.pythonhosted.org/packages/1f/f8/55483431f2b2fd015ae6ed4fe62288823ce908437ed49db5a03d15151678/numpy-2.4.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:40397bda92382fcec844066efb11f13e1c9a3e2a8e8f318fb72ed8b6db9f60f1", size = 14693571, upload-time = "2026-01-31T23:10:54.789Z" }, + { url = "https://files.pythonhosted.org/packages/2f/20/18026832b1845cdc82248208dd929ca14c9d8f2bac391f67440707fff27c/numpy-2.4.2-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:b3a24467af63c67829bfaa61eecf18d5432d4f11992688537be59ecd6ad32f5e", size = 5203469, upload-time = "2026-01-31T23:10:57.343Z" }, + { url = "https://files.pythonhosted.org/packages/7d/33/2eb97c8a77daaba34eaa3fa7241a14ac5f51c46a6bd5911361b644c4a1e2/numpy-2.4.2-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:805cc8de9fd6e7a22da5aed858e0ab16be5a4db6c873dde1d7451c541553aa27", size = 6550820, upload-time = "2026-01-31T23:10:59.429Z" }, + { url = "https://files.pythonhosted.org/packages/b1/91/b97fdfd12dc75b02c44e26c6638241cc004d4079a0321a69c62f51470c4c/numpy-2.4.2-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6d82351358ffbcdcd7b686b90742a9b86632d6c1c051016484fa0b326a0a1548", size = 15663067, upload-time = "2026-01-31T23:11:01.291Z" }, + { url = "https://files.pythonhosted.org/packages/f5/c6/a18e59f3f0b8071cc85cbc8d80cd02d68aa9710170b2553a117203d46936/numpy-2.4.2-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9e35d3e0144137d9fdae62912e869136164534d64a169f86438bc9561b6ad49f", size = 16619782, upload-time = "2026-01-31T23:11:03.669Z" }, + { url = "https://files.pythonhosted.org/packages/b7/83/9751502164601a79e18847309f5ceec0b1446d7b6aa12305759b72cf98b2/numpy-2.4.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:adb6ed2ad29b9e15321d167d152ee909ec73395901b70936f029c3bc6d7f4460", size = 17013128, upload-time = "2026-01-31T23:11:05.913Z" }, + { url = "https://files.pythonhosted.org/packages/61/c4/c4066322256ec740acc1c8923a10047818691d2f8aec254798f3dd90f5f2/numpy-2.4.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:8906e71fd8afcb76580404e2a950caef2685df3d2a57fe82a86ac8d33cc007ba", size = 18345324, upload-time = "2026-01-31T23:11:08.248Z" }, + { url = "https://files.pythonhosted.org/packages/ab/af/6157aa6da728fa4525a755bfad486ae7e3f76d4c1864138003eb84328497/numpy-2.4.2-cp312-cp312-win32.whl", hash = "sha256:ec055f6dae239a6299cace477b479cca2fc125c5675482daf1dd886933a1076f", size = 5960282, upload-time = "2026-01-31T23:11:10.497Z" }, + { url = "https://files.pythonhosted.org/packages/92/0f/7ceaaeaacb40567071e94dbf2c9480c0ae453d5bb4f52bea3892c39dc83c/numpy-2.4.2-cp312-cp312-win_amd64.whl", hash = "sha256:209fae046e62d0ce6435fcfe3b1a10537e858249b3d9b05829e2a05218296a85", size = 12314210, upload-time = "2026-01-31T23:11:12.176Z" }, + { url = "https://files.pythonhosted.org/packages/2f/a3/56c5c604fae6dd40fa2ed3040d005fca97e91bd320d232ac9931d77ba13c/numpy-2.4.2-cp312-cp312-win_arm64.whl", hash = "sha256:fbde1b0c6e81d56f5dccd95dd4a711d9b95df1ae4009a60887e56b27e8d903fa", size = 10220171, upload-time = "2026-01-31T23:11:14.684Z" }, + { url = "https://files.pythonhosted.org/packages/a1/22/815b9fe25d1d7ae7d492152adbc7226d3eff731dffc38fe970589fcaaa38/numpy-2.4.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:25f2059807faea4b077a2b6837391b5d830864b3543627f381821c646f31a63c", size = 16663696, upload-time = "2026-01-31T23:11:17.516Z" }, + { url = "https://files.pythonhosted.org/packages/09/f0/817d03a03f93ba9c6c8993de509277d84e69f9453601915e4a69554102a1/numpy-2.4.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:bd3a7a9f5847d2fb8c2c6d1c862fa109c31a9abeca1a3c2bd5a64572955b2979", size = 14688322, upload-time = "2026-01-31T23:11:19.883Z" }, + { url = "https://files.pythonhosted.org/packages/da/b4/f805ab79293c728b9a99438775ce51885fd4f31b76178767cfc718701a39/numpy-2.4.2-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:8e4549f8a3c6d13d55041925e912bfd834285ef1dd64d6bc7d542583355e2e98", size = 5198157, upload-time = "2026-01-31T23:11:22.375Z" }, + { url = "https://files.pythonhosted.org/packages/74/09/826e4289844eccdcd64aac27d13b0fd3f32039915dd5b9ba01baae1f436c/numpy-2.4.2-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:aea4f66ff44dfddf8c2cffd66ba6538c5ec67d389285292fe428cb2c738c8aef", size = 6546330, upload-time = "2026-01-31T23:11:23.958Z" }, + { url = "https://files.pythonhosted.org/packages/19/fb/cbfdbfa3057a10aea5422c558ac57538e6acc87ec1669e666d32ac198da7/numpy-2.4.2-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c3cd545784805de05aafe1dde61752ea49a359ccba9760c1e5d1c88a93bbf2b7", size = 15660968, upload-time = "2026-01-31T23:11:25.713Z" }, + { url = "https://files.pythonhosted.org/packages/04/dc/46066ce18d01645541f0186877377b9371b8fa8017fa8262002b4ef22612/numpy-2.4.2-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d0d9b7c93578baafcbc5f0b83eaf17b79d345c6f36917ba0c67f45226911d499", size = 16607311, upload-time = "2026-01-31T23:11:28.117Z" }, + { url = "https://files.pythonhosted.org/packages/14/d9/4b5adfc39a43fa6bf918c6d544bc60c05236cc2f6339847fc5b35e6cb5b0/numpy-2.4.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f74f0f7779cc7ae07d1810aab8ac6b1464c3eafb9e283a40da7309d5e6e48fbb", size = 17012850, upload-time = "2026-01-31T23:11:30.888Z" }, + { url = "https://files.pythonhosted.org/packages/b7/20/adb6e6adde6d0130046e6fdfb7675cc62bc2f6b7b02239a09eb58435753d/numpy-2.4.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:c7ac672d699bf36275c035e16b65539931347d68b70667d28984c9fb34e07fa7", size = 18334210, upload-time = "2026-01-31T23:11:33.214Z" }, + { url = "https://files.pythonhosted.org/packages/78/0e/0a73b3dff26803a8c02baa76398015ea2a5434d9b8265a7898a6028c1591/numpy-2.4.2-cp313-cp313-win32.whl", hash = "sha256:8e9afaeb0beff068b4d9cd20d322ba0ee1cecfb0b08db145e4ab4dd44a6b5110", size = 5958199, upload-time = "2026-01-31T23:11:35.385Z" }, + { url = "https://files.pythonhosted.org/packages/43/bc/6352f343522fcb2c04dbaf94cb30cca6fd32c1a750c06ad6231b4293708c/numpy-2.4.2-cp313-cp313-win_amd64.whl", hash = "sha256:7df2de1e4fba69a51c06c28f5a3de36731eb9639feb8e1cf7e4a7b0daf4cf622", size = 12310848, upload-time = "2026-01-31T23:11:38.001Z" }, + { url = "https://files.pythonhosted.org/packages/6e/8d/6da186483e308da5da1cc6918ce913dcfe14ffde98e710bfeff2a6158d4e/numpy-2.4.2-cp313-cp313-win_arm64.whl", hash = "sha256:0fece1d1f0a89c16b03442eae5c56dc0be0c7883b5d388e0c03f53019a4bfd71", size = 10221082, upload-time = "2026-01-31T23:11:40.392Z" }, + { url = "https://files.pythonhosted.org/packages/25/a1/9510aa43555b44781968935c7548a8926274f815de42ad3997e9e83680dd/numpy-2.4.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:5633c0da313330fd20c484c78cdd3f9b175b55e1a766c4a174230c6b70ad8262", size = 14815866, upload-time = "2026-01-31T23:11:42.495Z" }, + { url = "https://files.pythonhosted.org/packages/36/30/6bbb5e76631a5ae46e7923dd16ca9d3f1c93cfa8d4ed79a129814a9d8db3/numpy-2.4.2-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:d9f64d786b3b1dd742c946c42d15b07497ed14af1a1f3ce840cce27daa0ce913", size = 5325631, upload-time = "2026-01-31T23:11:44.7Z" }, + { url = "https://files.pythonhosted.org/packages/46/00/3a490938800c1923b567b3a15cd17896e68052e2145d8662aaf3e1ffc58f/numpy-2.4.2-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:b21041e8cb6a1eb5312dd1d2f80a94d91efffb7a06b70597d44f1bd2dfc315ab", size = 6646254, upload-time = "2026-01-31T23:11:46.341Z" }, + { url = "https://files.pythonhosted.org/packages/d3/e9/fac0890149898a9b609caa5af7455a948b544746e4b8fe7c212c8edd71f8/numpy-2.4.2-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:00ab83c56211a1d7c07c25e3217ea6695e50a3e2f255053686b081dc0b091a82", size = 15720138, upload-time = "2026-01-31T23:11:48.082Z" }, + { url = "https://files.pythonhosted.org/packages/ea/5c/08887c54e68e1e28df53709f1893ce92932cc6f01f7c3d4dc952f61ffd4e/numpy-2.4.2-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2fb882da679409066b4603579619341c6d6898fc83a8995199d5249f986e8e8f", size = 16655398, upload-time = "2026-01-31T23:11:50.293Z" }, + { url = "https://files.pythonhosted.org/packages/4d/89/253db0fa0e66e9129c745e4ef25631dc37d5f1314dad2b53e907b8538e6d/numpy-2.4.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:66cb9422236317f9d44b67b4d18f44efe6e9c7f8794ac0462978513359461554", size = 17079064, upload-time = "2026-01-31T23:11:52.927Z" }, + { url = "https://files.pythonhosted.org/packages/2a/d5/cbade46ce97c59c6c3da525e8d95b7abe8a42974a1dc5c1d489c10433e88/numpy-2.4.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:0f01dcf33e73d80bd8dc0f20a71303abbafa26a19e23f6b68d1aa9990af90257", size = 18379680, upload-time = "2026-01-31T23:11:55.22Z" }, + { url = "https://files.pythonhosted.org/packages/40/62/48f99ae172a4b63d981babe683685030e8a3df4f246c893ea5c6ef99f018/numpy-2.4.2-cp313-cp313t-win32.whl", hash = "sha256:52b913ec40ff7ae845687b0b34d8d93b60cb66dcee06996dd5c99f2fc9328657", size = 6082433, upload-time = "2026-01-31T23:11:58.096Z" }, + { url = "https://files.pythonhosted.org/packages/07/38/e054a61cfe48ad9f1ed0d188e78b7e26859d0b60ef21cd9de4897cdb5326/numpy-2.4.2-cp313-cp313t-win_amd64.whl", hash = "sha256:5eea80d908b2c1f91486eb95b3fb6fab187e569ec9752ab7d9333d2e66bf2d6b", size = 12451181, upload-time = "2026-01-31T23:11:59.782Z" }, + { url = "https://files.pythonhosted.org/packages/6e/a4/a05c3a6418575e185dd84d0b9680b6bb2e2dc3e4202f036b7b4e22d6e9dc/numpy-2.4.2-cp313-cp313t-win_arm64.whl", hash = "sha256:fd49860271d52127d61197bb50b64f58454e9f578cb4b2c001a6de8b1f50b0b1", size = 10290756, upload-time = "2026-01-31T23:12:02.438Z" }, + { url = "https://files.pythonhosted.org/packages/18/88/b7df6050bf18fdcfb7046286c6535cabbdd2064a3440fca3f069d319c16e/numpy-2.4.2-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:444be170853f1f9d528428eceb55f12918e4fda5d8805480f36a002f1415e09b", size = 16663092, upload-time = "2026-01-31T23:12:04.521Z" }, + { url = "https://files.pythonhosted.org/packages/25/7a/1fee4329abc705a469a4afe6e69b1ef7e915117747886327104a8493a955/numpy-2.4.2-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:d1240d50adff70c2a88217698ca844723068533f3f5c5fa6ee2e3220e3bdb000", size = 14698770, upload-time = "2026-01-31T23:12:06.96Z" }, + { url = "https://files.pythonhosted.org/packages/fb/0b/f9e49ba6c923678ad5bc38181c08ac5e53b7a5754dbca8e581aa1a56b1ff/numpy-2.4.2-cp314-cp314-macosx_14_0_arm64.whl", hash = "sha256:7cdde6de52fb6664b00b056341265441192d1291c130e99183ec0d4b110ff8b1", size = 5208562, upload-time = "2026-01-31T23:12:09.632Z" }, + { url = "https://files.pythonhosted.org/packages/7d/12/d7de8f6f53f9bb76997e5e4c069eda2051e3fe134e9181671c4391677bb2/numpy-2.4.2-cp314-cp314-macosx_14_0_x86_64.whl", hash = "sha256:cda077c2e5b780200b6b3e09d0b42205a3d1c68f30c6dceb90401c13bff8fe74", size = 6543710, upload-time = "2026-01-31T23:12:11.969Z" }, + { url = "https://files.pythonhosted.org/packages/09/63/c66418c2e0268a31a4cf8a8b512685748200f8e8e8ec6c507ce14e773529/numpy-2.4.2-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d30291931c915b2ab5717c2974bb95ee891a1cf22ebc16a8006bd59cd210d40a", size = 15677205, upload-time = "2026-01-31T23:12:14.33Z" }, + { url = "https://files.pythonhosted.org/packages/5d/6c/7f237821c9642fb2a04d2f1e88b4295677144ca93285fd76eff3bcba858d/numpy-2.4.2-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bba37bc29d4d85761deed3954a1bc62be7cf462b9510b51d367b769a8c8df325", size = 16611738, upload-time = "2026-01-31T23:12:16.525Z" }, + { url = "https://files.pythonhosted.org/packages/c2/a7/39c4cdda9f019b609b5c473899d87abff092fc908cfe4d1ecb2fcff453b0/numpy-2.4.2-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:b2f0073ed0868db1dcd86e052d37279eef185b9c8db5bf61f30f46adac63c909", size = 17028888, upload-time = "2026-01-31T23:12:19.306Z" }, + { url = "https://files.pythonhosted.org/packages/da/b3/e84bb64bdfea967cc10950d71090ec2d84b49bc691df0025dddb7c26e8e3/numpy-2.4.2-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:7f54844851cdb630ceb623dcec4db3240d1ac13d4990532446761baede94996a", size = 18339556, upload-time = "2026-01-31T23:12:21.816Z" }, + { url = "https://files.pythonhosted.org/packages/88/f5/954a291bc1192a27081706862ac62bb5920fbecfbaa302f64682aa90beed/numpy-2.4.2-cp314-cp314-win32.whl", hash = "sha256:12e26134a0331d8dbd9351620f037ec470b7c75929cb8a1537f6bfe411152a1a", size = 6006899, upload-time = "2026-01-31T23:12:24.14Z" }, + { url = "https://files.pythonhosted.org/packages/05/cb/eff72a91b2efdd1bc98b3b8759f6a1654aa87612fc86e3d87d6fe4f948c4/numpy-2.4.2-cp314-cp314-win_amd64.whl", hash = "sha256:068cdb2d0d644cdb45670810894f6a0600797a69c05f1ac478e8d31670b8ee75", size = 12443072, upload-time = "2026-01-31T23:12:26.33Z" }, + { url = "https://files.pythonhosted.org/packages/37/75/62726948db36a56428fce4ba80a115716dc4fad6a3a4352487f8bb950966/numpy-2.4.2-cp314-cp314-win_arm64.whl", hash = "sha256:6ed0be1ee58eef41231a5c943d7d1375f093142702d5723ca2eb07db9b934b05", size = 10494886, upload-time = "2026-01-31T23:12:28.488Z" }, + { url = "https://files.pythonhosted.org/packages/36/2f/ee93744f1e0661dc267e4b21940870cabfae187c092e1433b77b09b50ac4/numpy-2.4.2-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:98f16a80e917003a12c0580f97b5f875853ebc33e2eaa4bccfc8201ac6869308", size = 14818567, upload-time = "2026-01-31T23:12:30.709Z" }, + { url = "https://files.pythonhosted.org/packages/a7/24/6535212add7d76ff938d8bdc654f53f88d35cddedf807a599e180dcb8e66/numpy-2.4.2-cp314-cp314t-macosx_14_0_arm64.whl", hash = "sha256:20abd069b9cda45874498b245c8015b18ace6de8546bf50dfa8cea1696ed06ef", size = 5328372, upload-time = "2026-01-31T23:12:32.962Z" }, + { url = "https://files.pythonhosted.org/packages/5e/9d/c48f0a035725f925634bf6b8994253b43f2047f6778a54147d7e213bc5a7/numpy-2.4.2-cp314-cp314t-macosx_14_0_x86_64.whl", hash = "sha256:e98c97502435b53741540a5717a6749ac2ada901056c7db951d33e11c885cc7d", size = 6649306, upload-time = "2026-01-31T23:12:34.797Z" }, + { url = "https://files.pythonhosted.org/packages/81/05/7c73a9574cd4a53a25907bad38b59ac83919c0ddc8234ec157f344d57d9a/numpy-2.4.2-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:da6cad4e82cb893db4b69105c604d805e0c3ce11501a55b5e9f9083b47d2ffe8", size = 15722394, upload-time = "2026-01-31T23:12:36.565Z" }, + { url = "https://files.pythonhosted.org/packages/35/fa/4de10089f21fc7d18442c4a767ab156b25c2a6eaf187c0db6d9ecdaeb43f/numpy-2.4.2-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9e4424677ce4b47fe73c8b5556d876571f7c6945d264201180db2dc34f676ab5", size = 16653343, upload-time = "2026-01-31T23:12:39.188Z" }, + { url = "https://files.pythonhosted.org/packages/b8/f9/d33e4ffc857f3763a57aa85650f2e82486832d7492280ac21ba9efda80da/numpy-2.4.2-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:2b8f157c8a6f20eb657e240f8985cc135598b2b46985c5bccbde7616dc9c6b1e", size = 17078045, upload-time = "2026-01-31T23:12:42.041Z" }, + { url = "https://files.pythonhosted.org/packages/c8/b8/54bdb43b6225badbea6389fa038c4ef868c44f5890f95dd530a218706da3/numpy-2.4.2-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:5daf6f3914a733336dab21a05cdec343144600e964d2fcdabaac0c0269874b2a", size = 18380024, upload-time = "2026-01-31T23:12:44.331Z" }, + { url = "https://files.pythonhosted.org/packages/a5/55/6e1a61ded7af8df04016d81b5b02daa59f2ea9252ee0397cb9f631efe9e5/numpy-2.4.2-cp314-cp314t-win32.whl", hash = "sha256:8c50dd1fc8826f5b26a5ee4d77ca55d88a895f4e4819c7ecc2a9f5905047a443", size = 6153937, upload-time = "2026-01-31T23:12:47.229Z" }, + { url = "https://files.pythonhosted.org/packages/45/aa/fa6118d1ed6d776b0983f3ceac9b1a5558e80df9365b1c3aa6d42bf9eee4/numpy-2.4.2-cp314-cp314t-win_amd64.whl", hash = "sha256:fcf92bee92742edd401ba41135185866f7026c502617f422eb432cfeca4fe236", size = 12631844, upload-time = "2026-01-31T23:12:48.997Z" }, + { url = "https://files.pythonhosted.org/packages/32/0a/2ec5deea6dcd158f254a7b372fb09cfba5719419c8d66343bab35237b3fb/numpy-2.4.2-cp314-cp314t-win_arm64.whl", hash = "sha256:1f92f53998a17265194018d1cc321b2e96e900ca52d54c7c77837b71b9465181", size = 10565379, upload-time = "2026-01-31T23:12:51.345Z" }, + { url = "https://files.pythonhosted.org/packages/f4/f8/50e14d36d915ef64d8f8bc4a087fc8264d82c785eda6711f80ab7e620335/numpy-2.4.2-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:89f7268c009bc492f506abd6f5265defa7cb3f7487dc21d357c3d290add45082", size = 16833179, upload-time = "2026-01-31T23:12:53.5Z" }, + { url = "https://files.pythonhosted.org/packages/17/17/809b5cad63812058a8189e91a1e2d55a5a18fd04611dbad244e8aeae465c/numpy-2.4.2-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:e6dee3bb76aa4009d5a912180bf5b2de012532998d094acee25d9cb8dee3e44a", size = 14889755, upload-time = "2026-01-31T23:12:55.933Z" }, + { url = "https://files.pythonhosted.org/packages/3e/ea/181b9bcf7627fc8371720316c24db888dcb9829b1c0270abf3d288b2e29b/numpy-2.4.2-pp311-pypy311_pp73-macosx_14_0_arm64.whl", hash = "sha256:cd2bd2bbed13e213d6b55dc1d035a4f91748a7d3edc9480c13898b0353708920", size = 5399500, upload-time = "2026-01-31T23:12:58.671Z" }, + { url = "https://files.pythonhosted.org/packages/33/9f/413adf3fc955541ff5536b78fcf0754680b3c6d95103230252a2c9408d23/numpy-2.4.2-pp311-pypy311_pp73-macosx_14_0_x86_64.whl", hash = "sha256:cf28c0c1d4c4bf00f509fa7eb02c58d7caf221b50b467bcb0d9bbf1584d5c821", size = 6714252, upload-time = "2026-01-31T23:13:00.518Z" }, + { url = "https://files.pythonhosted.org/packages/91/da/643aad274e29ccbdf42ecd94dafe524b81c87bcb56b83872d54827f10543/numpy-2.4.2-pp311-pypy311_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e04ae107ac591763a47398bb45b568fc38f02dbc4aa44c063f67a131f99346cb", size = 15797142, upload-time = "2026-01-31T23:13:02.219Z" }, + { url = "https://files.pythonhosted.org/packages/66/27/965b8525e9cb5dc16481b30a1b3c21e50c7ebf6e9dbd48d0c4d0d5089c7e/numpy-2.4.2-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:602f65afdef699cda27ec0b9224ae5dc43e328f4c24c689deaf77133dbee74d0", size = 16727979, upload-time = "2026-01-31T23:13:04.62Z" }, + { url = "https://files.pythonhosted.org/packages/de/e5/b7d20451657664b07986c2f6e3be564433f5dcaf3482d68eaecd79afaf03/numpy-2.4.2-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:be71bf1edb48ebbbf7f6337b5bfd2f895d1902f6335a5830b20141fc126ffba0", size = 12502577, upload-time = "2026-01-31T23:13:07.08Z" }, +] + [[package]] name = "obiba-opal" version = "6.0.0" @@ -231,6 +806,236 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/b7/b9/c538f279a4e237a006a2c98387d081e9eb060d203d8ed34467cc0f0b9b53/packaging-26.0-py3-none-any.whl", hash = "sha256:b36f1fef9334a5588b4166f8bcd26a14e521f2b55e6b9de3aaa80d3ff7a37529", size = 74366, upload-time = "2026-01-21T20:50:37.788Z" }, ] +[[package]] +name = "pandas" +version = "2.3.3" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version < '3.11'", +] +dependencies = [ + { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, + { name = "python-dateutil", marker = "python_full_version < '3.11'" }, + { name = "pytz", marker = "python_full_version < '3.11'" }, + { name = "tzdata", marker = "python_full_version < '3.11'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/33/01/d40b85317f86cf08d853a4f495195c73815fdf205eef3993821720274518/pandas-2.3.3.tar.gz", hash = "sha256:e05e1af93b977f7eafa636d043f9f94c7ee3ac81af99c13508215942e64c993b", size = 4495223, upload-time = "2025-09-29T23:34:51.853Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3d/f7/f425a00df4fcc22b292c6895c6831c0c8ae1d9fac1e024d16f98a9ce8749/pandas-2.3.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:376c6446ae31770764215a6c937f72d917f214b43560603cd60da6408f183b6c", size = 11555763, upload-time = "2025-09-29T23:16:53.287Z" }, + { url = "https://files.pythonhosted.org/packages/13/4f/66d99628ff8ce7857aca52fed8f0066ce209f96be2fede6cef9f84e8d04f/pandas-2.3.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e19d192383eab2f4ceb30b412b22ea30690c9e618f78870357ae1d682912015a", size = 10801217, upload-time = "2025-09-29T23:17:04.522Z" }, + { url = "https://files.pythonhosted.org/packages/1d/03/3fc4a529a7710f890a239cc496fc6d50ad4a0995657dccc1d64695adb9f4/pandas-2.3.3-cp310-cp310-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5caf26f64126b6c7aec964f74266f435afef1c1b13da3b0636c7518a1fa3e2b1", size = 12148791, upload-time = "2025-09-29T23:17:18.444Z" }, + { url = "https://files.pythonhosted.org/packages/40/a8/4dac1f8f8235e5d25b9955d02ff6f29396191d4e665d71122c3722ca83c5/pandas-2.3.3-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:dd7478f1463441ae4ca7308a70e90b33470fa593429f9d4c578dd00d1fa78838", size = 12769373, upload-time = "2025-09-29T23:17:35.846Z" }, + { url = "https://files.pythonhosted.org/packages/df/91/82cc5169b6b25440a7fc0ef3a694582418d875c8e3ebf796a6d6470aa578/pandas-2.3.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:4793891684806ae50d1288c9bae9330293ab4e083ccd1c5e383c34549c6e4250", size = 13200444, upload-time = "2025-09-29T23:17:49.341Z" }, + { url = "https://files.pythonhosted.org/packages/10/ae/89b3283800ab58f7af2952704078555fa60c807fff764395bb57ea0b0dbd/pandas-2.3.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:28083c648d9a99a5dd035ec125d42439c6c1c525098c58af0fc38dd1a7a1b3d4", size = 13858459, upload-time = "2025-09-29T23:18:03.722Z" }, + { url = "https://files.pythonhosted.org/packages/85/72/530900610650f54a35a19476eca5104f38555afccda1aa11a92ee14cb21d/pandas-2.3.3-cp310-cp310-win_amd64.whl", hash = "sha256:503cf027cf9940d2ceaa1a93cfb5f8c8c7e6e90720a2850378f0b3f3b1e06826", size = 11346086, upload-time = "2025-09-29T23:18:18.505Z" }, + { url = "https://files.pythonhosted.org/packages/c1/fa/7ac648108144a095b4fb6aa3de1954689f7af60a14cf25583f4960ecb878/pandas-2.3.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:602b8615ebcc4a0c1751e71840428ddebeb142ec02c786e8ad6b1ce3c8dec523", size = 11578790, upload-time = "2025-09-29T23:18:30.065Z" }, + { url = "https://files.pythonhosted.org/packages/9b/35/74442388c6cf008882d4d4bdfc4109be87e9b8b7ccd097ad1e7f006e2e95/pandas-2.3.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8fe25fc7b623b0ef6b5009149627e34d2a4657e880948ec3c840e9402e5c1b45", size = 10833831, upload-time = "2025-09-29T23:38:56.071Z" }, + { url = "https://files.pythonhosted.org/packages/fe/e4/de154cbfeee13383ad58d23017da99390b91d73f8c11856f2095e813201b/pandas-2.3.3-cp311-cp311-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b468d3dad6ff947df92dcb32ede5b7bd41a9b3cceef0a30ed925f6d01fb8fa66", size = 12199267, upload-time = "2025-09-29T23:18:41.627Z" }, + { url = "https://files.pythonhosted.org/packages/bf/c9/63f8d545568d9ab91476b1818b4741f521646cbdd151c6efebf40d6de6f7/pandas-2.3.3-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b98560e98cb334799c0b07ca7967ac361a47326e9b4e5a7dfb5ab2b1c9d35a1b", size = 12789281, upload-time = "2025-09-29T23:18:56.834Z" }, + { url = "https://files.pythonhosted.org/packages/f2/00/a5ac8c7a0e67fd1a6059e40aa08fa1c52cc00709077d2300e210c3ce0322/pandas-2.3.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1d37b5848ba49824e5c30bedb9c830ab9b7751fd049bc7914533e01c65f79791", size = 13240453, upload-time = "2025-09-29T23:19:09.247Z" }, + { url = "https://files.pythonhosted.org/packages/27/4d/5c23a5bc7bd209231618dd9e606ce076272c9bc4f12023a70e03a86b4067/pandas-2.3.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:db4301b2d1f926ae677a751eb2bd0e8c5f5319c9cb3f88b0becbbb0b07b34151", size = 13890361, upload-time = "2025-09-29T23:19:25.342Z" }, + { url = "https://files.pythonhosted.org/packages/8e/59/712db1d7040520de7a4965df15b774348980e6df45c129b8c64d0dbe74ef/pandas-2.3.3-cp311-cp311-win_amd64.whl", hash = "sha256:f086f6fe114e19d92014a1966f43a3e62285109afe874f067f5abbdcbb10e59c", size = 11348702, upload-time = "2025-09-29T23:19:38.296Z" }, + { url = "https://files.pythonhosted.org/packages/9c/fb/231d89e8637c808b997d172b18e9d4a4bc7bf31296196c260526055d1ea0/pandas-2.3.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:6d21f6d74eb1725c2efaa71a2bfc661a0689579b58e9c0ca58a739ff0b002b53", size = 11597846, upload-time = "2025-09-29T23:19:48.856Z" }, + { url = "https://files.pythonhosted.org/packages/5c/bd/bf8064d9cfa214294356c2d6702b716d3cf3bb24be59287a6a21e24cae6b/pandas-2.3.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:3fd2f887589c7aa868e02632612ba39acb0b8948faf5cc58f0850e165bd46f35", size = 10729618, upload-time = "2025-09-29T23:39:08.659Z" }, + { url = "https://files.pythonhosted.org/packages/57/56/cf2dbe1a3f5271370669475ead12ce77c61726ffd19a35546e31aa8edf4e/pandas-2.3.3-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ecaf1e12bdc03c86ad4a7ea848d66c685cb6851d807a26aa245ca3d2017a1908", size = 11737212, upload-time = "2025-09-29T23:19:59.765Z" }, + { url = "https://files.pythonhosted.org/packages/e5/63/cd7d615331b328e287d8233ba9fdf191a9c2d11b6af0c7a59cfcec23de68/pandas-2.3.3-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b3d11d2fda7eb164ef27ffc14b4fcab16a80e1ce67e9f57e19ec0afaf715ba89", size = 12362693, upload-time = "2025-09-29T23:20:14.098Z" }, + { url = "https://files.pythonhosted.org/packages/a6/de/8b1895b107277d52f2b42d3a6806e69cfef0d5cf1d0ba343470b9d8e0a04/pandas-2.3.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:a68e15f780eddf2b07d242e17a04aa187a7ee12b40b930bfdd78070556550e98", size = 12771002, upload-time = "2025-09-29T23:20:26.76Z" }, + { url = "https://files.pythonhosted.org/packages/87/21/84072af3187a677c5893b170ba2c8fbe450a6ff911234916da889b698220/pandas-2.3.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:371a4ab48e950033bcf52b6527eccb564f52dc826c02afd9a1bc0ab731bba084", size = 13450971, upload-time = "2025-09-29T23:20:41.344Z" }, + { url = "https://files.pythonhosted.org/packages/86/41/585a168330ff063014880a80d744219dbf1dd7a1c706e75ab3425a987384/pandas-2.3.3-cp312-cp312-win_amd64.whl", hash = "sha256:a16dcec078a01eeef8ee61bf64074b4e524a2a3f4b3be9326420cabe59c4778b", size = 10992722, upload-time = "2025-09-29T23:20:54.139Z" }, + { url = "https://files.pythonhosted.org/packages/cd/4b/18b035ee18f97c1040d94debd8f2e737000ad70ccc8f5513f4eefad75f4b/pandas-2.3.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:56851a737e3470de7fa88e6131f41281ed440d29a9268dcbf0002da5ac366713", size = 11544671, upload-time = "2025-09-29T23:21:05.024Z" }, + { url = "https://files.pythonhosted.org/packages/31/94/72fac03573102779920099bcac1c3b05975c2cb5f01eac609faf34bed1ca/pandas-2.3.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:bdcd9d1167f4885211e401b3036c0c8d9e274eee67ea8d0758a256d60704cfe8", size = 10680807, upload-time = "2025-09-29T23:21:15.979Z" }, + { url = "https://files.pythonhosted.org/packages/16/87/9472cf4a487d848476865321de18cc8c920b8cab98453ab79dbbc98db63a/pandas-2.3.3-cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e32e7cc9af0f1cc15548288a51a3b681cc2a219faa838e995f7dc53dbab1062d", size = 11709872, upload-time = "2025-09-29T23:21:27.165Z" }, + { url = "https://files.pythonhosted.org/packages/15/07/284f757f63f8a8d69ed4472bfd85122bd086e637bf4ed09de572d575a693/pandas-2.3.3-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:318d77e0e42a628c04dc56bcef4b40de67918f7041c2b061af1da41dcff670ac", size = 12306371, upload-time = "2025-09-29T23:21:40.532Z" }, + { url = "https://files.pythonhosted.org/packages/33/81/a3afc88fca4aa925804a27d2676d22dcd2031c2ebe08aabd0ae55b9ff282/pandas-2.3.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:4e0a175408804d566144e170d0476b15d78458795bb18f1304fb94160cabf40c", size = 12765333, upload-time = "2025-09-29T23:21:55.77Z" }, + { url = "https://files.pythonhosted.org/packages/8d/0f/b4d4ae743a83742f1153464cf1a8ecfafc3ac59722a0b5c8602310cb7158/pandas-2.3.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:93c2d9ab0fc11822b5eece72ec9587e172f63cff87c00b062f6e37448ced4493", size = 13418120, upload-time = "2025-09-29T23:22:10.109Z" }, + { url = "https://files.pythonhosted.org/packages/4f/c7/e54682c96a895d0c808453269e0b5928a07a127a15704fedb643e9b0a4c8/pandas-2.3.3-cp313-cp313-win_amd64.whl", hash = "sha256:f8bfc0e12dc78f777f323f55c58649591b2cd0c43534e8355c51d3fede5f4dee", size = 10993991, upload-time = "2025-09-29T23:25:04.889Z" }, + { url = "https://files.pythonhosted.org/packages/f9/ca/3f8d4f49740799189e1395812f3bf23b5e8fc7c190827d55a610da72ce55/pandas-2.3.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:75ea25f9529fdec2d2e93a42c523962261e567d250b0013b16210e1d40d7c2e5", size = 12048227, upload-time = "2025-09-29T23:22:24.343Z" }, + { url = "https://files.pythonhosted.org/packages/0e/5a/f43efec3e8c0cc92c4663ccad372dbdff72b60bdb56b2749f04aa1d07d7e/pandas-2.3.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:74ecdf1d301e812db96a465a525952f4dde225fdb6d8e5a521d47e1f42041e21", size = 11411056, upload-time = "2025-09-29T23:22:37.762Z" }, + { url = "https://files.pythonhosted.org/packages/46/b1/85331edfc591208c9d1a63a06baa67b21d332e63b7a591a5ba42a10bb507/pandas-2.3.3-cp313-cp313t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6435cb949cb34ec11cc9860246ccb2fdc9ecd742c12d3304989017d53f039a78", size = 11645189, upload-time = "2025-09-29T23:22:51.688Z" }, + { url = "https://files.pythonhosted.org/packages/44/23/78d645adc35d94d1ac4f2a3c4112ab6f5b8999f4898b8cdf01252f8df4a9/pandas-2.3.3-cp313-cp313t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:900f47d8f20860de523a1ac881c4c36d65efcb2eb850e6948140fa781736e110", size = 12121912, upload-time = "2025-09-29T23:23:05.042Z" }, + { url = "https://files.pythonhosted.org/packages/53/da/d10013df5e6aaef6b425aa0c32e1fc1f3e431e4bcabd420517dceadce354/pandas-2.3.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:a45c765238e2ed7d7c608fc5bc4a6f88b642f2f01e70c0c23d2224dd21829d86", size = 12712160, upload-time = "2025-09-29T23:23:28.57Z" }, + { url = "https://files.pythonhosted.org/packages/bd/17/e756653095a083d8a37cbd816cb87148debcfcd920129b25f99dd8d04271/pandas-2.3.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:c4fc4c21971a1a9f4bdb4c73978c7f7256caa3e62b323f70d6cb80db583350bc", size = 13199233, upload-time = "2025-09-29T23:24:24.876Z" }, + { url = "https://files.pythonhosted.org/packages/04/fd/74903979833db8390b73b3a8a7d30d146d710bd32703724dd9083950386f/pandas-2.3.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:ee15f284898e7b246df8087fc82b87b01686f98ee67d85a17b7ab44143a3a9a0", size = 11540635, upload-time = "2025-09-29T23:25:52.486Z" }, + { url = "https://files.pythonhosted.org/packages/21/00/266d6b357ad5e6d3ad55093a7e8efc7dd245f5a842b584db9f30b0f0a287/pandas-2.3.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:1611aedd912e1ff81ff41c745822980c49ce4a7907537be8692c8dbc31924593", size = 10759079, upload-time = "2025-09-29T23:26:33.204Z" }, + { url = "https://files.pythonhosted.org/packages/ca/05/d01ef80a7a3a12b2f8bbf16daba1e17c98a2f039cbc8e2f77a2c5a63d382/pandas-2.3.3-cp314-cp314-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6d2cefc361461662ac48810cb14365a365ce864afe85ef1f447ff5a1e99ea81c", size = 11814049, upload-time = "2025-09-29T23:27:15.384Z" }, + { url = "https://files.pythonhosted.org/packages/15/b2/0e62f78c0c5ba7e3d2c5945a82456f4fac76c480940f805e0b97fcbc2f65/pandas-2.3.3-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ee67acbbf05014ea6c763beb097e03cd629961c8a632075eeb34247120abcb4b", size = 12332638, upload-time = "2025-09-29T23:27:51.625Z" }, + { url = "https://files.pythonhosted.org/packages/c5/33/dd70400631b62b9b29c3c93d2feee1d0964dc2bae2e5ad7a6c73a7f25325/pandas-2.3.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:c46467899aaa4da076d5abc11084634e2d197e9460643dd455ac3db5856b24d6", size = 12886834, upload-time = "2025-09-29T23:28:21.289Z" }, + { url = "https://files.pythonhosted.org/packages/d3/18/b5d48f55821228d0d2692b34fd5034bb185e854bdb592e9c640f6290e012/pandas-2.3.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:6253c72c6a1d990a410bc7de641d34053364ef8bcd3126f7e7450125887dffe3", size = 13409925, upload-time = "2025-09-29T23:28:58.261Z" }, + { url = "https://files.pythonhosted.org/packages/a6/3d/124ac75fcd0ecc09b8fdccb0246ef65e35b012030defb0e0eba2cbbbe948/pandas-2.3.3-cp314-cp314-win_amd64.whl", hash = "sha256:1b07204a219b3b7350abaae088f451860223a52cfb8a6c53358e7948735158e5", size = 11109071, upload-time = "2025-09-29T23:32:27.484Z" }, + { url = "https://files.pythonhosted.org/packages/89/9c/0e21c895c38a157e0faa1fb64587a9226d6dd46452cac4532d80c3c4a244/pandas-2.3.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:2462b1a365b6109d275250baaae7b760fd25c726aaca0054649286bcfbb3e8ec", size = 12048504, upload-time = "2025-09-29T23:29:31.47Z" }, + { url = "https://files.pythonhosted.org/packages/d7/82/b69a1c95df796858777b68fbe6a81d37443a33319761d7c652ce77797475/pandas-2.3.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:0242fe9a49aa8b4d78a4fa03acb397a58833ef6199e9aa40a95f027bb3a1b6e7", size = 11410702, upload-time = "2025-09-29T23:29:54.591Z" }, + { url = "https://files.pythonhosted.org/packages/f9/88/702bde3ba0a94b8c73a0181e05144b10f13f29ebfc2150c3a79062a8195d/pandas-2.3.3-cp314-cp314t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a21d830e78df0a515db2b3d2f5570610f5e6bd2e27749770e8bb7b524b89b450", size = 11634535, upload-time = "2025-09-29T23:30:21.003Z" }, + { url = "https://files.pythonhosted.org/packages/a4/1e/1bac1a839d12e6a82ec6cb40cda2edde64a2013a66963293696bbf31fbbb/pandas-2.3.3-cp314-cp314t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2e3ebdb170b5ef78f19bfb71b0dc5dc58775032361fa188e814959b74d726dd5", size = 12121582, upload-time = "2025-09-29T23:30:43.391Z" }, + { url = "https://files.pythonhosted.org/packages/44/91/483de934193e12a3b1d6ae7c8645d083ff88dec75f46e827562f1e4b4da6/pandas-2.3.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:d051c0e065b94b7a3cea50eb1ec32e912cd96dba41647eb24104b6c6c14c5788", size = 12699963, upload-time = "2025-09-29T23:31:10.009Z" }, + { url = "https://files.pythonhosted.org/packages/70/44/5191d2e4026f86a2a109053e194d3ba7a31a2d10a9c2348368c63ed4e85a/pandas-2.3.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:3869faf4bd07b3b66a9f462417d0ca3a9df29a9f6abd5d0d0dbab15dac7abe87", size = 13202175, upload-time = "2025-09-29T23:31:59.173Z" }, +] + +[[package]] +name = "pandas" +version = "3.0.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.14' and sys_platform == 'win32'", + "python_full_version >= '3.14' and sys_platform == 'emscripten'", + "python_full_version >= '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version >= '3.11' and python_full_version < '3.14' and sys_platform == 'win32'", + "python_full_version >= '3.11' and python_full_version < '3.14' and sys_platform == 'emscripten'", + "python_full_version >= '3.11' and python_full_version < '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", +] +dependencies = [ + { name = "numpy", version = "2.4.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "python-dateutil", marker = "python_full_version >= '3.11'" }, + { name = "tzdata", marker = "(python_full_version >= '3.11' and sys_platform == 'emscripten') or (python_full_version >= '3.11' and sys_platform == 'win32')" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/de/da/b1dc0481ab8d55d0f46e343cfe67d4551a0e14fcee52bd38ca1bd73258d8/pandas-3.0.0.tar.gz", hash = "sha256:0facf7e87d38f721f0af46fe70d97373a37701b1c09f7ed7aeeb292ade5c050f", size = 4633005, upload-time = "2026-01-21T15:52:04.726Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/46/1e/b184654a856e75e975a6ee95d6577b51c271cd92cb2b020c9378f53e0032/pandas-3.0.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d64ce01eb9cdca96a15266aa679ae50212ec52757c79204dbc7701a222401850", size = 10313247, upload-time = "2026-01-21T15:50:15.775Z" }, + { url = "https://files.pythonhosted.org/packages/dd/5e/e04a547ad0f0183bf151fd7c7a477468e3b85ff2ad231c566389e6cc9587/pandas-3.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:613e13426069793aa1ec53bdcc3b86e8d32071daea138bbcf4fa959c9cdaa2e2", size = 9913131, upload-time = "2026-01-21T15:50:18.611Z" }, + { url = "https://files.pythonhosted.org/packages/a2/93/bb77bfa9fc2aba9f7204db807d5d3fb69832ed2854c60ba91b4c65ba9219/pandas-3.0.0-cp311-cp311-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0192fee1f1a8e743b464a6607858ee4b071deb0b118eb143d71c2a1d170996d5", size = 10741925, upload-time = "2026-01-21T15:50:21.058Z" }, + { url = "https://files.pythonhosted.org/packages/62/fb/89319812eb1d714bfc04b7f177895caeba8ab4a37ef6712db75ed786e2e0/pandas-3.0.0-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f0b853319dec8d5e0c8b875374c078ef17f2269986a78168d9bd57e49bf650ae", size = 11245979, upload-time = "2026-01-21T15:50:23.413Z" }, + { url = "https://files.pythonhosted.org/packages/a9/63/684120486f541fc88da3862ed31165b3b3e12b6a1c7b93be4597bc84e26c/pandas-3.0.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:707a9a877a876c326ae2cb640fbdc4ef63b0a7b9e2ef55c6df9942dcee8e2af9", size = 11756337, upload-time = "2026-01-21T15:50:25.932Z" }, + { url = "https://files.pythonhosted.org/packages/39/92/7eb0ad232312b59aec61550c3c81ad0743898d10af5df7f80bc5e5065416/pandas-3.0.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:afd0aa3d0b5cda6e0b8ffc10dbcca3b09ef3cbcd3fe2b27364f85fdc04e1989d", size = 12325517, upload-time = "2026-01-21T15:50:27.952Z" }, + { url = "https://files.pythonhosted.org/packages/51/27/bf9436dd0a4fc3130acec0828951c7ef96a0631969613a9a35744baf27f6/pandas-3.0.0-cp311-cp311-win_amd64.whl", hash = "sha256:113b4cca2614ff7e5b9fee9b6f066618fe73c5a83e99d721ffc41217b2bf57dd", size = 9881576, upload-time = "2026-01-21T15:50:30.149Z" }, + { url = "https://files.pythonhosted.org/packages/e7/2b/c618b871fce0159fd107516336e82891b404e3f340821853c2fc28c7830f/pandas-3.0.0-cp311-cp311-win_arm64.whl", hash = "sha256:c14837eba8e99a8da1527c0280bba29b0eb842f64aa94982c5e21227966e164b", size = 9140807, upload-time = "2026-01-21T15:50:32.308Z" }, + { url = "https://files.pythonhosted.org/packages/0b/38/db33686f4b5fa64d7af40d96361f6a4615b8c6c8f1b3d334eee46ae6160e/pandas-3.0.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:9803b31f5039b3c3b10cc858c5e40054adb4b29b4d81cb2fd789f4121c8efbcd", size = 10334013, upload-time = "2026-01-21T15:50:34.771Z" }, + { url = "https://files.pythonhosted.org/packages/a5/7b/9254310594e9774906bacdd4e732415e1f86ab7dbb4b377ef9ede58cd8ec/pandas-3.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:14c2a4099cd38a1d18ff108168ea417909b2dea3bd1ebff2ccf28ddb6a74d740", size = 9874154, upload-time = "2026-01-21T15:50:36.67Z" }, + { url = "https://files.pythonhosted.org/packages/63/d4/726c5a67a13bc66643e66d2e9ff115cead482a44fc56991d0c4014f15aaf/pandas-3.0.0-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d257699b9a9960e6125686098d5714ac59d05222bef7a5e6af7a7fd87c650801", size = 10384433, upload-time = "2026-01-21T15:50:39.132Z" }, + { url = "https://files.pythonhosted.org/packages/bf/2e/9211f09bedb04f9832122942de8b051804b31a39cfbad199a819bb88d9f3/pandas-3.0.0-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:69780c98f286076dcafca38d8b8eee1676adf220199c0a39f0ecbf976b68151a", size = 10864519, upload-time = "2026-01-21T15:50:41.043Z" }, + { url = "https://files.pythonhosted.org/packages/00/8d/50858522cdc46ac88b9afdc3015e298959a70a08cd21e008a44e9520180c/pandas-3.0.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:4a66384f017240f3858a4c8a7cf21b0591c3ac885cddb7758a589f0f71e87ebb", size = 11394124, upload-time = "2026-01-21T15:50:43.377Z" }, + { url = "https://files.pythonhosted.org/packages/86/3f/83b2577db02503cd93d8e95b0f794ad9d4be0ba7cb6c8bcdcac964a34a42/pandas-3.0.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:be8c515c9bc33989d97b89db66ea0cececb0f6e3c2a87fcc8b69443a6923e95f", size = 11920444, upload-time = "2026-01-21T15:50:45.932Z" }, + { url = "https://files.pythonhosted.org/packages/64/2d/4f8a2f192ed12c90a0aab47f5557ece0e56b0370c49de9454a09de7381b2/pandas-3.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:a453aad8c4f4e9f166436994a33884442ea62aa8b27d007311e87521b97246e1", size = 9730970, upload-time = "2026-01-21T15:50:47.962Z" }, + { url = "https://files.pythonhosted.org/packages/d4/64/ff571be435cf1e643ca98d0945d76732c0b4e9c37191a89c8550b105eed1/pandas-3.0.0-cp312-cp312-win_arm64.whl", hash = "sha256:da768007b5a33057f6d9053563d6b74dd6d029c337d93c6d0d22a763a5c2ecc0", size = 9041950, upload-time = "2026-01-21T15:50:50.422Z" }, + { url = "https://files.pythonhosted.org/packages/6f/fa/7f0ac4ca8877c57537aaff2a842f8760e630d8e824b730eb2e859ffe96ca/pandas-3.0.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:b78d646249b9a2bc191040988c7bb524c92fa8534fb0898a0741d7e6f2ffafa6", size = 10307129, upload-time = "2026-01-21T15:50:52.877Z" }, + { url = "https://files.pythonhosted.org/packages/6f/11/28a221815dcea4c0c9414dfc845e34a84a6a7dabc6da3194498ed5ba4361/pandas-3.0.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:bc9cba7b355cb4162442a88ce495e01cb605f17ac1e27d6596ac963504e0305f", size = 9850201, upload-time = "2026-01-21T15:50:54.807Z" }, + { url = "https://files.pythonhosted.org/packages/ba/da/53bbc8c5363b7e5bd10f9ae59ab250fc7a382ea6ba08e4d06d8694370354/pandas-3.0.0-cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3c9a1a149aed3b6c9bf246033ff91e1b02d529546c5d6fb6b74a28fea0cf4c70", size = 10354031, upload-time = "2026-01-21T15:50:57.463Z" }, + { url = "https://files.pythonhosted.org/packages/f7/a3/51e02ebc2a14974170d51e2410dfdab58870ea9bcd37cda15bd553d24dc4/pandas-3.0.0-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:95683af6175d884ee89471842acfca29172a85031fccdabc35e50c0984470a0e", size = 10861165, upload-time = "2026-01-21T15:50:59.32Z" }, + { url = "https://files.pythonhosted.org/packages/a5/fe/05a51e3cac11d161472b8297bd41723ea98013384dd6d76d115ce3482f9b/pandas-3.0.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:1fbbb5a7288719e36b76b4f18d46ede46e7f916b6c8d9915b756b0a6c3f792b3", size = 11359359, upload-time = "2026-01-21T15:51:02.014Z" }, + { url = "https://files.pythonhosted.org/packages/ee/56/ba620583225f9b85a4d3e69c01df3e3870659cc525f67929b60e9f21dcd1/pandas-3.0.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:8e8b9808590fa364416b49b2a35c1f4cf2785a6c156935879e57f826df22038e", size = 11912907, upload-time = "2026-01-21T15:51:05.175Z" }, + { url = "https://files.pythonhosted.org/packages/c9/8c/c6638d9f67e45e07656b3826405c5cc5f57f6fd07c8b2572ade328c86e22/pandas-3.0.0-cp313-cp313-win_amd64.whl", hash = "sha256:98212a38a709feb90ae658cb6227ea3657c22ba8157d4b8f913cd4c950de5e7e", size = 9732138, upload-time = "2026-01-21T15:51:07.569Z" }, + { url = "https://files.pythonhosted.org/packages/7b/bf/bd1335c3bf1770b6d8fed2799993b11c4971af93bb1b729b9ebbc02ca2ec/pandas-3.0.0-cp313-cp313-win_arm64.whl", hash = "sha256:177d9df10b3f43b70307a149d7ec49a1229a653f907aa60a48f1877d0e6be3be", size = 9033568, upload-time = "2026-01-21T15:51:09.484Z" }, + { url = "https://files.pythonhosted.org/packages/8e/c6/f5e2171914d5e29b9171d495344097d54e3ffe41d2d85d8115baba4dc483/pandas-3.0.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:2713810ad3806767b89ad3b7b69ba153e1c6ff6d9c20f9c2140379b2a98b6c98", size = 10741936, upload-time = "2026-01-21T15:51:11.693Z" }, + { url = "https://files.pythonhosted.org/packages/51/88/9a0164f99510a1acb9f548691f022c756c2314aad0d8330a24616c14c462/pandas-3.0.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:15d59f885ee5011daf8335dff47dcb8a912a27b4ad7826dc6cbe809fd145d327", size = 10393884, upload-time = "2026-01-21T15:51:14.197Z" }, + { url = "https://files.pythonhosted.org/packages/e0/53/b34d78084d88d8ae2b848591229da8826d1e65aacf00b3abe34023467648/pandas-3.0.0-cp313-cp313t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:24e6547fb64d2c92665dd2adbfa4e85fa4fd70a9c070e7cfb03b629a0bbab5eb", size = 10310740, upload-time = "2026-01-21T15:51:16.093Z" }, + { url = "https://files.pythonhosted.org/packages/5b/d3/bee792e7c3d6930b74468d990604325701412e55d7aaf47460a22311d1a5/pandas-3.0.0-cp313-cp313t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:48ee04b90e2505c693d3f8e8f524dab8cb8aaf7ddcab52c92afa535e717c4812", size = 10700014, upload-time = "2026-01-21T15:51:18.818Z" }, + { url = "https://files.pythonhosted.org/packages/55/db/2570bc40fb13aaed1cbc3fbd725c3a60ee162477982123c3adc8971e7ac1/pandas-3.0.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:66f72fb172959af42a459e27a8d8d2c7e311ff4c1f7db6deb3b643dbc382ae08", size = 11323737, upload-time = "2026-01-21T15:51:20.784Z" }, + { url = "https://files.pythonhosted.org/packages/bc/2e/297ac7f21c8181b62a4cccebad0a70caf679adf3ae5e83cb676194c8acc3/pandas-3.0.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:4a4a400ca18230976724a5066f20878af785f36c6756e498e94c2a5e5d57779c", size = 11771558, upload-time = "2026-01-21T15:51:22.977Z" }, + { url = "https://files.pythonhosted.org/packages/0a/46/e1c6876d71c14332be70239acce9ad435975a80541086e5ffba2f249bcf6/pandas-3.0.0-cp313-cp313t-win_amd64.whl", hash = "sha256:940eebffe55528074341a5a36515f3e4c5e25e958ebbc764c9502cfc35ba3faa", size = 10473771, upload-time = "2026-01-21T15:51:25.285Z" }, + { url = "https://files.pythonhosted.org/packages/c0/db/0270ad9d13c344b7a36fa77f5f8344a46501abf413803e885d22864d10bf/pandas-3.0.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:597c08fb9fef0edf1e4fa2f9828dd27f3d78f9b8c9b4a748d435ffc55732310b", size = 10312075, upload-time = "2026-01-21T15:51:28.5Z" }, + { url = "https://files.pythonhosted.org/packages/09/9f/c176f5e9717f7c91becfe0f55a52ae445d3f7326b4a2cf355978c51b7913/pandas-3.0.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:447b2d68ac5edcbf94655fe909113a6dba6ef09ad7f9f60c80477825b6c489fe", size = 9900213, upload-time = "2026-01-21T15:51:30.955Z" }, + { url = "https://files.pythonhosted.org/packages/d9/e7/63ad4cc10b257b143e0a5ebb04304ad806b4e1a61c5da25f55896d2ca0f4/pandas-3.0.0-cp314-cp314-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:debb95c77ff3ed3ba0d9aa20c3a2f19165cc7956362f9873fce1ba0a53819d70", size = 10428768, upload-time = "2026-01-21T15:51:33.018Z" }, + { url = "https://files.pythonhosted.org/packages/9e/0e/4e4c2d8210f20149fd2248ef3fff26623604922bd564d915f935a06dd63d/pandas-3.0.0-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fedabf175e7cd82b69b74c30adbaa616de301291a5231138d7242596fc296a8d", size = 10882954, upload-time = "2026-01-21T15:51:35.287Z" }, + { url = "https://files.pythonhosted.org/packages/c6/60/c9de8ac906ba1f4d2250f8a951abe5135b404227a55858a75ad26f84db47/pandas-3.0.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:412d1a89aab46889f3033a386912efcdfa0f1131c5705ff5b668dda88305e986", size = 11430293, upload-time = "2026-01-21T15:51:37.57Z" }, + { url = "https://files.pythonhosted.org/packages/a1/69/806e6637c70920e5787a6d6896fd707f8134c2c55cd761e7249a97b7dc5a/pandas-3.0.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:e979d22316f9350c516479dd3a92252be2937a9531ed3a26ec324198a99cdd49", size = 11952452, upload-time = "2026-01-21T15:51:39.618Z" }, + { url = "https://files.pythonhosted.org/packages/cb/de/918621e46af55164c400ab0ef389c9d969ab85a43d59ad1207d4ddbe30a5/pandas-3.0.0-cp314-cp314-win_amd64.whl", hash = "sha256:083b11415b9970b6e7888800c43c82e81a06cd6b06755d84804444f0007d6bb7", size = 9851081, upload-time = "2026-01-21T15:51:41.758Z" }, + { url = "https://files.pythonhosted.org/packages/91/a1/3562a18dd0bd8c73344bfa26ff90c53c72f827df119d6d6b1dacc84d13e3/pandas-3.0.0-cp314-cp314-win_arm64.whl", hash = "sha256:5db1e62cb99e739fa78a28047e861b256d17f88463c76b8dafc7c1338086dca8", size = 9174610, upload-time = "2026-01-21T15:51:44.312Z" }, + { url = "https://files.pythonhosted.org/packages/ce/26/430d91257eaf366f1737d7a1c158677caaf6267f338ec74e3a1ec444111c/pandas-3.0.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:697b8f7d346c68274b1b93a170a70974cdc7d7354429894d5927c1effdcccd73", size = 10761999, upload-time = "2026-01-21T15:51:46.899Z" }, + { url = "https://files.pythonhosted.org/packages/ec/1a/954eb47736c2b7f7fe6a9d56b0cb6987773c00faa3c6451a43db4beb3254/pandas-3.0.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:8cb3120f0d9467ed95e77f67a75e030b67545bcfa08964e349252d674171def2", size = 10410279, upload-time = "2026-01-21T15:51:48.89Z" }, + { url = "https://files.pythonhosted.org/packages/20/fc/b96f3a5a28b250cd1b366eb0108df2501c0f38314a00847242abab71bb3a/pandas-3.0.0-cp314-cp314t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:33fd3e6baa72899746b820c31e4b9688c8e1b7864d7aec2de7ab5035c285277a", size = 10330198, upload-time = "2026-01-21T15:51:51.015Z" }, + { url = "https://files.pythonhosted.org/packages/90/b3/d0e2952f103b4fbef1ef22d0c2e314e74fc9064b51cee30890b5e3286ee6/pandas-3.0.0-cp314-cp314t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a8942e333dc67ceda1095227ad0febb05a3b36535e520154085db632c40ad084", size = 10728513, upload-time = "2026-01-21T15:51:53.387Z" }, + { url = "https://files.pythonhosted.org/packages/76/81/832894f286df828993dc5fd61c63b231b0fb73377e99f6c6c369174cf97e/pandas-3.0.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:783ac35c4d0fe0effdb0d67161859078618b1b6587a1af15928137525217a721", size = 11345550, upload-time = "2026-01-21T15:51:55.329Z" }, + { url = "https://files.pythonhosted.org/packages/34/a0/ed160a00fb4f37d806406bc0a79a8b62fe67f29d00950f8d16203ff3409b/pandas-3.0.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:125eb901e233f155b268bbef9abd9afb5819db74f0e677e89a61b246228c71ac", size = 11799386, upload-time = "2026-01-21T15:51:57.457Z" }, + { url = "https://files.pythonhosted.org/packages/36/c8/2ac00d7255252c5e3cf61b35ca92ca25704b0188f7454ca4aec08a33cece/pandas-3.0.0-cp314-cp314t-win_amd64.whl", hash = "sha256:b86d113b6c109df3ce0ad5abbc259fe86a1bd4adfd4a31a89da42f84f65509bb", size = 10873041, upload-time = "2026-01-21T15:52:00.034Z" }, + { url = "https://files.pythonhosted.org/packages/e6/3f/a80ac00acbc6b35166b42850e98a4f466e2c0d9c64054161ba9620f95680/pandas-3.0.0-cp314-cp314t-win_arm64.whl", hash = "sha256:1c39eab3ad38f2d7a249095f0a3d8f8c22cc0f847e98ccf5bbe732b272e2d9fa", size = 9441003, upload-time = "2026-01-21T15:52:02.281Z" }, +] + +[[package]] +name = "pillow" +version = "12.1.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/1f/42/5c74462b4fd957fcd7b13b04fb3205ff8349236ea74c7c375766d6c82288/pillow-12.1.1.tar.gz", hash = "sha256:9ad8fa5937ab05218e2b6a4cff30295ad35afd2f83ac592e68c0d871bb0fdbc4", size = 46980264, upload-time = "2026-02-11T04:23:07.146Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1d/30/5bd3d794762481f8c8ae9c80e7b76ecea73b916959eb587521358ef0b2f9/pillow-12.1.1-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:1f1625b72740fdda5d77b4def688eb8fd6490975d06b909fd19f13f391e077e0", size = 5304099, upload-time = "2026-02-11T04:20:06.13Z" }, + { url = "https://files.pythonhosted.org/packages/bd/c1/aab9e8f3eeb4490180e357955e15c2ef74b31f64790ff356c06fb6cf6d84/pillow-12.1.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:178aa072084bd88ec759052feca8e56cbb14a60b39322b99a049e58090479713", size = 4657880, upload-time = "2026-02-11T04:20:09.291Z" }, + { url = "https://files.pythonhosted.org/packages/f1/0a/9879e30d56815ad529d3985aeff5af4964202425c27261a6ada10f7cbf53/pillow-12.1.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:b66e95d05ba806247aaa1561f080abc7975daf715c30780ff92a20e4ec546e1b", size = 6222587, upload-time = "2026-02-11T04:20:10.82Z" }, + { url = "https://files.pythonhosted.org/packages/5a/5f/a1b72ff7139e4f89014e8d451442c74a774d5c43cd938fb0a9f878576b37/pillow-12.1.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:89c7e895002bbe49cdc5426150377cbbc04767d7547ed145473f496dfa40408b", size = 8027678, upload-time = "2026-02-11T04:20:12.455Z" }, + { url = "https://files.pythonhosted.org/packages/e2/c2/c7cb187dac79a3d22c3ebeae727abee01e077c8c7d930791dc592f335153/pillow-12.1.1-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3a5cbdcddad0af3da87cb16b60d23648bc3b51967eb07223e9fed77a82b457c4", size = 6335777, upload-time = "2026-02-11T04:20:14.441Z" }, + { url = "https://files.pythonhosted.org/packages/0c/7b/f9b09a7804ec7336effb96c26d37c29d27225783dc1501b7d62dcef6ae25/pillow-12.1.1-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9f51079765661884a486727f0729d29054242f74b46186026582b4e4769918e4", size = 7027140, upload-time = "2026-02-11T04:20:16.387Z" }, + { url = "https://files.pythonhosted.org/packages/98/b2/2fa3c391550bd421b10849d1a2144c44abcd966daadd2f7c12e19ea988c4/pillow-12.1.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:99c1506ea77c11531d75e3a412832a13a71c7ebc8192ab9e4b2e355555920e3e", size = 6449855, upload-time = "2026-02-11T04:20:18.554Z" }, + { url = "https://files.pythonhosted.org/packages/96/ff/9caf4b5b950c669263c39e96c78c0d74a342c71c4f43fd031bb5cb7ceac9/pillow-12.1.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:36341d06738a9f66c8287cf8b876d24b18db9bd8740fa0672c74e259ad408cff", size = 7151329, upload-time = "2026-02-11T04:20:20.646Z" }, + { url = "https://files.pythonhosted.org/packages/7b/f8/4b24841f582704da675ca535935bccb32b00a6da1226820845fac4a71136/pillow-12.1.1-cp310-cp310-win32.whl", hash = "sha256:6c52f062424c523d6c4db85518774cc3d50f5539dd6eed32b8f6229b26f24d40", size = 6325574, upload-time = "2026-02-11T04:20:22.43Z" }, + { url = "https://files.pythonhosted.org/packages/f8/f9/9f6b01c0881d7036063aa6612ef04c0e2cad96be21325a1e92d0203f8e91/pillow-12.1.1-cp310-cp310-win_amd64.whl", hash = "sha256:c6008de247150668a705a6338156efb92334113421ceecf7438a12c9a12dab23", size = 7032347, upload-time = "2026-02-11T04:20:23.932Z" }, + { url = "https://files.pythonhosted.org/packages/79/13/c7922edded3dcdaf10c59297540b72785620abc0538872c819915746757d/pillow-12.1.1-cp310-cp310-win_arm64.whl", hash = "sha256:1a9b0ee305220b392e1124a764ee4265bd063e54a751a6b62eff69992f457fa9", size = 2453457, upload-time = "2026-02-11T04:20:25.392Z" }, + { url = "https://files.pythonhosted.org/packages/2b/46/5da1ec4a5171ee7bf1a0efa064aba70ba3d6e0788ce3f5acd1375d23c8c0/pillow-12.1.1-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:e879bb6cd5c73848ef3b2b48b8af9ff08c5b71ecda8048b7dd22d8a33f60be32", size = 5304084, upload-time = "2026-02-11T04:20:27.501Z" }, + { url = "https://files.pythonhosted.org/packages/78/93/a29e9bc02d1cf557a834da780ceccd54e02421627200696fcf805ebdc3fb/pillow-12.1.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:365b10bb9417dd4498c0e3b128018c4a624dc11c7b97d8cc54effe3b096f4c38", size = 4657866, upload-time = "2026-02-11T04:20:29.827Z" }, + { url = "https://files.pythonhosted.org/packages/13/84/583a4558d492a179d31e4aae32eadce94b9acf49c0337c4ce0b70e0a01f2/pillow-12.1.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:d4ce8e329c93845720cd2014659ca67eac35f6433fd3050393d85f3ecef0dad5", size = 6232148, upload-time = "2026-02-11T04:20:31.329Z" }, + { url = "https://files.pythonhosted.org/packages/d5/e2/53c43334bbbb2d3b938978532fbda8e62bb6e0b23a26ce8592f36bcc4987/pillow-12.1.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:fc354a04072b765eccf2204f588a7a532c9511e8b9c7f900e1b64e3e33487090", size = 8038007, upload-time = "2026-02-11T04:20:34.225Z" }, + { url = "https://files.pythonhosted.org/packages/b8/a6/3d0e79c8a9d58150dd98e199d7c1c56861027f3829a3a60b3c2784190180/pillow-12.1.1-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7e7976bf1910a8116b523b9f9f58bf410f3e8aa330cd9a2bb2953f9266ab49af", size = 6345418, upload-time = "2026-02-11T04:20:35.858Z" }, + { url = "https://files.pythonhosted.org/packages/a2/c8/46dfeac5825e600579157eea177be43e2f7ff4a99da9d0d0a49533509ac5/pillow-12.1.1-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:597bd9c8419bc7c6af5604e55847789b69123bbe25d65cc6ad3012b4f3c98d8b", size = 7034590, upload-time = "2026-02-11T04:20:37.91Z" }, + { url = "https://files.pythonhosted.org/packages/af/bf/e6f65d3db8a8bbfeaf9e13cc0417813f6319863a73de934f14b2229ada18/pillow-12.1.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:2c1fc0f2ca5f96a3c8407e41cca26a16e46b21060fe6d5b099d2cb01412222f5", size = 6458655, upload-time = "2026-02-11T04:20:39.496Z" }, + { url = "https://files.pythonhosted.org/packages/f9/c2/66091f3f34a25894ca129362e510b956ef26f8fb67a0e6417bc5744e56f1/pillow-12.1.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:578510d88c6229d735855e1f278aa305270438d36a05031dfaae5067cc8eb04d", size = 7159286, upload-time = "2026-02-11T04:20:41.139Z" }, + { url = "https://files.pythonhosted.org/packages/7b/5a/24bc8eb526a22f957d0cec6243146744966d40857e3d8deb68f7902ca6c1/pillow-12.1.1-cp311-cp311-win32.whl", hash = "sha256:7311c0a0dcadb89b36b7025dfd8326ecfa36964e29913074d47382706e516a7c", size = 6328663, upload-time = "2026-02-11T04:20:43.184Z" }, + { url = "https://files.pythonhosted.org/packages/31/03/bef822e4f2d8f9d7448c133d0a18185d3cce3e70472774fffefe8b0ed562/pillow-12.1.1-cp311-cp311-win_amd64.whl", hash = "sha256:fbfa2a7c10cc2623f412753cddf391c7f971c52ca40a3f65dc5039b2939e8563", size = 7031448, upload-time = "2026-02-11T04:20:44.696Z" }, + { url = "https://files.pythonhosted.org/packages/49/70/f76296f53610bd17b2e7d31728b8b7825e3ac3b5b3688b51f52eab7c0818/pillow-12.1.1-cp311-cp311-win_arm64.whl", hash = "sha256:b81b5e3511211631b3f672a595e3221252c90af017e399056d0faabb9538aa80", size = 2453651, upload-time = "2026-02-11T04:20:46.243Z" }, + { url = "https://files.pythonhosted.org/packages/07/d3/8df65da0d4df36b094351dce696f2989bec731d4f10e743b1c5f4da4d3bf/pillow-12.1.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:ab323b787d6e18b3d91a72fc99b1a2c28651e4358749842b8f8dfacd28ef2052", size = 5262803, upload-time = "2026-02-11T04:20:47.653Z" }, + { url = "https://files.pythonhosted.org/packages/d6/71/5026395b290ff404b836e636f51d7297e6c83beceaa87c592718747e670f/pillow-12.1.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:adebb5bee0f0af4909c30db0d890c773d1a92ffe83da908e2e9e720f8edf3984", size = 4657601, upload-time = "2026-02-11T04:20:49.328Z" }, + { url = "https://files.pythonhosted.org/packages/b1/2e/1001613d941c67442f745aff0f7cc66dd8df9a9c084eb497e6a543ee6f7e/pillow-12.1.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:bb66b7cc26f50977108790e2456b7921e773f23db5630261102233eb355a3b79", size = 6234995, upload-time = "2026-02-11T04:20:51.032Z" }, + { url = "https://files.pythonhosted.org/packages/07/26/246ab11455b2549b9233dbd44d358d033a2f780fa9007b61a913c5b2d24e/pillow-12.1.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:aee2810642b2898bb187ced9b349e95d2a7272930796e022efaf12e99dccd293", size = 8045012, upload-time = "2026-02-11T04:20:52.882Z" }, + { url = "https://files.pythonhosted.org/packages/b2/8b/07587069c27be7535ac1fe33874e32de118fbd34e2a73b7f83436a88368c/pillow-12.1.1-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a0b1cd6232e2b618adcc54d9882e4e662a089d5768cd188f7c245b4c8c44a397", size = 6349638, upload-time = "2026-02-11T04:20:54.444Z" }, + { url = "https://files.pythonhosted.org/packages/ff/79/6df7b2ee763d619cda2fb4fea498e5f79d984dae304d45a8999b80d6cf5c/pillow-12.1.1-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7aac39bcf8d4770d089588a2e1dd111cbaa42df5a94be3114222057d68336bd0", size = 7041540, upload-time = "2026-02-11T04:20:55.97Z" }, + { url = "https://files.pythonhosted.org/packages/2c/5e/2ba19e7e7236d7529f4d873bdaf317a318896bac289abebd4bb00ef247f0/pillow-12.1.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:ab174cd7d29a62dd139c44bf74b698039328f45cb03b4596c43473a46656b2f3", size = 6462613, upload-time = "2026-02-11T04:20:57.542Z" }, + { url = "https://files.pythonhosted.org/packages/03/03/31216ec124bb5c3dacd74ce8efff4cc7f52643653bad4825f8f08c697743/pillow-12.1.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:339ffdcb7cbeaa08221cd401d517d4b1fe7a9ed5d400e4a8039719238620ca35", size = 7166745, upload-time = "2026-02-11T04:20:59.196Z" }, + { url = "https://files.pythonhosted.org/packages/1f/e7/7c4552d80052337eb28653b617eafdef39adfb137c49dd7e831b8dc13bc5/pillow-12.1.1-cp312-cp312-win32.whl", hash = "sha256:5d1f9575a12bed9e9eedd9a4972834b08c97a352bd17955ccdebfeca5913fa0a", size = 6328823, upload-time = "2026-02-11T04:21:01.385Z" }, + { url = "https://files.pythonhosted.org/packages/3d/17/688626d192d7261bbbf98846fc98995726bddc2c945344b65bec3a29d731/pillow-12.1.1-cp312-cp312-win_amd64.whl", hash = "sha256:21329ec8c96c6e979cd0dfd29406c40c1d52521a90544463057d2aaa937d66a6", size = 7033367, upload-time = "2026-02-11T04:21:03.536Z" }, + { url = "https://files.pythonhosted.org/packages/ed/fe/a0ef1f73f939b0eca03ee2c108d0043a87468664770612602c63266a43c4/pillow-12.1.1-cp312-cp312-win_arm64.whl", hash = "sha256:af9a332e572978f0218686636610555ae3defd1633597be015ed50289a03c523", size = 2453811, upload-time = "2026-02-11T04:21:05.116Z" }, + { url = "https://files.pythonhosted.org/packages/d5/11/6db24d4bd7685583caeae54b7009584e38da3c3d4488ed4cd25b439de486/pillow-12.1.1-cp313-cp313-ios_13_0_arm64_iphoneos.whl", hash = "sha256:d242e8ac078781f1de88bf823d70c1a9b3c7950a44cdf4b7c012e22ccbcd8e4e", size = 4062689, upload-time = "2026-02-11T04:21:06.804Z" }, + { url = "https://files.pythonhosted.org/packages/33/c0/ce6d3b1fe190f0021203e0d9b5b99e57843e345f15f9ef22fcd43842fd21/pillow-12.1.1-cp313-cp313-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:02f84dfad02693676692746df05b89cf25597560db2857363a208e393429f5e9", size = 4138535, upload-time = "2026-02-11T04:21:08.452Z" }, + { url = "https://files.pythonhosted.org/packages/a0/c6/d5eb6a4fb32a3f9c21a8c7613ec706534ea1cf9f4b3663e99f0d83f6fca8/pillow-12.1.1-cp313-cp313-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:e65498daf4b583091ccbb2556c7000abf0f3349fcd57ef7adc9a84a394ed29f6", size = 3601364, upload-time = "2026-02-11T04:21:10.194Z" }, + { url = "https://files.pythonhosted.org/packages/14/a1/16c4b823838ba4c9c52c0e6bbda903a3fe5a1bdbf1b8eb4fff7156f3e318/pillow-12.1.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:6c6db3b84c87d48d0088943bf33440e0c42370b99b1c2a7989216f7b42eede60", size = 5262561, upload-time = "2026-02-11T04:21:11.742Z" }, + { url = "https://files.pythonhosted.org/packages/bb/ad/ad9dc98ff24f485008aa5cdedaf1a219876f6f6c42a4626c08bc4e80b120/pillow-12.1.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:8b7e5304e34942bf62e15184219a7b5ad4ff7f3bb5cca4d984f37df1a0e1aee2", size = 4657460, upload-time = "2026-02-11T04:21:13.786Z" }, + { url = "https://files.pythonhosted.org/packages/9e/1b/f1a4ea9a895b5732152789326202a82464d5254759fbacae4deea3069334/pillow-12.1.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:18e5bddd742a44b7e6b1e773ab5db102bd7a94c32555ba656e76d319d19c3850", size = 6232698, upload-time = "2026-02-11T04:21:15.949Z" }, + { url = "https://files.pythonhosted.org/packages/95/f4/86f51b8745070daf21fd2e5b1fe0eb35d4db9ca26e6d58366562fb56a743/pillow-12.1.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:fc44ef1f3de4f45b50ccf9136999d71abb99dca7706bc75d222ed350b9fd2289", size = 8041706, upload-time = "2026-02-11T04:21:17.723Z" }, + { url = "https://files.pythonhosted.org/packages/29/9b/d6ecd956bb1266dd1045e995cce9b8d77759e740953a1c9aad9502a0461e/pillow-12.1.1-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5a8eb7ed8d4198bccbd07058416eeec51686b498e784eda166395a23eb99138e", size = 6346621, upload-time = "2026-02-11T04:21:19.547Z" }, + { url = "https://files.pythonhosted.org/packages/71/24/538bff45bde96535d7d998c6fed1a751c75ac7c53c37c90dc2601b243893/pillow-12.1.1-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:47b94983da0c642de92ced1702c5b6c292a84bd3a8e1d1702ff923f183594717", size = 7038069, upload-time = "2026-02-11T04:21:21.378Z" }, + { url = "https://files.pythonhosted.org/packages/94/0e/58cb1a6bc48f746bc4cb3adb8cabff73e2742c92b3bf7a220b7cf69b9177/pillow-12.1.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:518a48c2aab7ce596d3bf79d0e275661b846e86e4d0e7dec34712c30fe07f02a", size = 6460040, upload-time = "2026-02-11T04:21:23.148Z" }, + { url = "https://files.pythonhosted.org/packages/6c/57/9045cb3ff11eeb6c1adce3b2d60d7d299d7b273a2e6c8381a524abfdc474/pillow-12.1.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:a550ae29b95c6dc13cf69e2c9dc5747f814c54eeb2e32d683e5e93af56caa029", size = 7164523, upload-time = "2026-02-11T04:21:25.01Z" }, + { url = "https://files.pythonhosted.org/packages/73/f2/9be9cb99f2175f0d4dbadd6616ce1bf068ee54a28277ea1bf1fbf729c250/pillow-12.1.1-cp313-cp313-win32.whl", hash = "sha256:a003d7422449f6d1e3a34e3dd4110c22148336918ddbfc6a32581cd54b2e0b2b", size = 6332552, upload-time = "2026-02-11T04:21:27.238Z" }, + { url = "https://files.pythonhosted.org/packages/3f/eb/b0834ad8b583d7d9d42b80becff092082a1c3c156bb582590fcc973f1c7c/pillow-12.1.1-cp313-cp313-win_amd64.whl", hash = "sha256:344cf1e3dab3be4b1fa08e449323d98a2a3f819ad20f4b22e77a0ede31f0faa1", size = 7040108, upload-time = "2026-02-11T04:21:29.462Z" }, + { url = "https://files.pythonhosted.org/packages/d5/7d/fc09634e2aabdd0feabaff4a32f4a7d97789223e7c2042fd805ea4b4d2c2/pillow-12.1.1-cp313-cp313-win_arm64.whl", hash = "sha256:5c0dd1636633e7e6a0afe7bf6a51a14992b7f8e60de5789018ebbdfae55b040a", size = 2453712, upload-time = "2026-02-11T04:21:31.072Z" }, + { url = "https://files.pythonhosted.org/packages/19/2a/b9d62794fc8a0dd14c1943df68347badbd5511103e0d04c035ffe5cf2255/pillow-12.1.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:0330d233c1a0ead844fc097a7d16c0abff4c12e856c0b325f231820fee1f39da", size = 5264880, upload-time = "2026-02-11T04:21:32.865Z" }, + { url = "https://files.pythonhosted.org/packages/26/9d/e03d857d1347fa5ed9247e123fcd2a97b6220e15e9cb73ca0a8d91702c6e/pillow-12.1.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:5dae5f21afb91322f2ff791895ddd8889e5e947ff59f71b46041c8ce6db790bc", size = 4660616, upload-time = "2026-02-11T04:21:34.97Z" }, + { url = "https://files.pythonhosted.org/packages/f7/ec/8a6d22afd02570d30954e043f09c32772bfe143ba9285e2fdb11284952cd/pillow-12.1.1-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:2e0c664be47252947d870ac0d327fea7e63985a08794758aa8af5b6cb6ec0c9c", size = 6269008, upload-time = "2026-02-11T04:21:36.623Z" }, + { url = "https://files.pythonhosted.org/packages/3d/1d/6d875422c9f28a4a361f495a5f68d9de4a66941dc2c619103ca335fa6446/pillow-12.1.1-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:691ab2ac363b8217f7d31b3497108fb1f50faab2f75dfb03284ec2f217e87bf8", size = 8073226, upload-time = "2026-02-11T04:21:38.585Z" }, + { url = "https://files.pythonhosted.org/packages/a1/cd/134b0b6ee5eda6dc09e25e24b40fdafe11a520bc725c1d0bbaa5e00bf95b/pillow-12.1.1-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e9e8064fb1cc019296958595f6db671fba95209e3ceb0c4734c9baf97de04b20", size = 6380136, upload-time = "2026-02-11T04:21:40.562Z" }, + { url = "https://files.pythonhosted.org/packages/7a/a9/7628f013f18f001c1b98d8fffe3452f306a70dc6aba7d931019e0492f45e/pillow-12.1.1-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:472a8d7ded663e6162dafdf20015c486a7009483ca671cece7a9279b512fcb13", size = 7067129, upload-time = "2026-02-11T04:21:42.521Z" }, + { url = "https://files.pythonhosted.org/packages/1e/f8/66ab30a2193b277785601e82ee2d49f68ea575d9637e5e234faaa98efa4c/pillow-12.1.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:89b54027a766529136a06cfebeecb3a04900397a3590fd252160b888479517bf", size = 6491807, upload-time = "2026-02-11T04:21:44.22Z" }, + { url = "https://files.pythonhosted.org/packages/da/0b/a877a6627dc8318fdb84e357c5e1a758c0941ab1ddffdafd231983788579/pillow-12.1.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:86172b0831b82ce4f7877f280055892b31179e1576aa00d0df3bb1bbf8c3e524", size = 7190954, upload-time = "2026-02-11T04:21:46.114Z" }, + { url = "https://files.pythonhosted.org/packages/83/43/6f732ff85743cf746b1361b91665d9f5155e1483817f693f8d57ea93147f/pillow-12.1.1-cp313-cp313t-win32.whl", hash = "sha256:44ce27545b6efcf0fdbdceb31c9a5bdea9333e664cda58a7e674bb74608b3986", size = 6336441, upload-time = "2026-02-11T04:21:48.22Z" }, + { url = "https://files.pythonhosted.org/packages/3b/44/e865ef3986611bb75bfabdf94a590016ea327833f434558801122979cd0e/pillow-12.1.1-cp313-cp313t-win_amd64.whl", hash = "sha256:a285e3eb7a5a45a2ff504e31f4a8d1b12ef62e84e5411c6804a42197c1cf586c", size = 7045383, upload-time = "2026-02-11T04:21:50.015Z" }, + { url = "https://files.pythonhosted.org/packages/a8/c6/f4fb24268d0c6908b9f04143697ea18b0379490cb74ba9e8d41b898bd005/pillow-12.1.1-cp313-cp313t-win_arm64.whl", hash = "sha256:cc7d296b5ea4d29e6570dabeaed58d31c3fea35a633a69679fb03d7664f43fb3", size = 2456104, upload-time = "2026-02-11T04:21:51.633Z" }, + { url = "https://files.pythonhosted.org/packages/03/d0/bebb3ffbf31c5a8e97241476c4cf8b9828954693ce6744b4a2326af3e16b/pillow-12.1.1-cp314-cp314-ios_13_0_arm64_iphoneos.whl", hash = "sha256:417423db963cb4be8bac3fc1204fe61610f6abeed1580a7a2cbb2fbda20f12af", size = 4062652, upload-time = "2026-02-11T04:21:53.19Z" }, + { url = "https://files.pythonhosted.org/packages/2d/c0/0e16fb0addda4851445c28f8350d8c512f09de27bbb0d6d0bbf8b6709605/pillow-12.1.1-cp314-cp314-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:b957b71c6b2387610f556a7eb0828afbe40b4a98036fc0d2acfa5a44a0c2036f", size = 4138823, upload-time = "2026-02-11T04:22:03.088Z" }, + { url = "https://files.pythonhosted.org/packages/6b/fb/6170ec655d6f6bb6630a013dd7cf7bc218423d7b5fa9071bf63dc32175ae/pillow-12.1.1-cp314-cp314-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:097690ba1f2efdeb165a20469d59d8bb03c55fb6621eb2041a060ae8ea3e9642", size = 3601143, upload-time = "2026-02-11T04:22:04.909Z" }, + { url = "https://files.pythonhosted.org/packages/59/04/dc5c3f297510ba9a6837cbb318b87dd2b8f73eb41a43cc63767f65cb599c/pillow-12.1.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:2815a87ab27848db0321fb78c7f0b2c8649dee134b7f2b80c6a45c6831d75ccd", size = 5266254, upload-time = "2026-02-11T04:22:07.656Z" }, + { url = "https://files.pythonhosted.org/packages/05/30/5db1236b0d6313f03ebf97f5e17cda9ca060f524b2fcc875149a8360b21c/pillow-12.1.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:f7ed2c6543bad5a7d5530eb9e78c53132f93dfa44a28492db88b41cdab885202", size = 4657499, upload-time = "2026-02-11T04:22:09.613Z" }, + { url = "https://files.pythonhosted.org/packages/6f/18/008d2ca0eb612e81968e8be0bbae5051efba24d52debf930126d7eaacbba/pillow-12.1.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:652a2c9ccfb556235b2b501a3a7cf3742148cd22e04b5625c5fe057ea3e3191f", size = 6232137, upload-time = "2026-02-11T04:22:11.434Z" }, + { url = "https://files.pythonhosted.org/packages/70/f1/f14d5b8eeb4b2cd62b9f9f847eb6605f103df89ef619ac68f92f748614ea/pillow-12.1.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:d6e4571eedf43af33d0fc233a382a76e849badbccdf1ac438841308652a08e1f", size = 8042721, upload-time = "2026-02-11T04:22:13.321Z" }, + { url = "https://files.pythonhosted.org/packages/5a/d6/17824509146e4babbdabf04d8171491fa9d776f7061ff6e727522df9bd03/pillow-12.1.1-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b574c51cf7d5d62e9be37ba446224b59a2da26dc4c1bb2ecbe936a4fb1a7cb7f", size = 6347798, upload-time = "2026-02-11T04:22:15.449Z" }, + { url = "https://files.pythonhosted.org/packages/d1/ee/c85a38a9ab92037a75615aba572c85ea51e605265036e00c5b67dfafbfe2/pillow-12.1.1-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a37691702ed687799de29a518d63d4682d9016932db66d4e90c345831b02fb4e", size = 7039315, upload-time = "2026-02-11T04:22:17.24Z" }, + { url = "https://files.pythonhosted.org/packages/ec/f3/bc8ccc6e08a148290d7523bde4d9a0d6c981db34631390dc6e6ec34cacf6/pillow-12.1.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:f95c00d5d6700b2b890479664a06e754974848afaae5e21beb4d83c106923fd0", size = 6462360, upload-time = "2026-02-11T04:22:19.111Z" }, + { url = "https://files.pythonhosted.org/packages/f6/ab/69a42656adb1d0665ab051eec58a41f169ad295cf81ad45406963105408f/pillow-12.1.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:559b38da23606e68681337ad74622c4dbba02254fc9cb4488a305dd5975c7eeb", size = 7165438, upload-time = "2026-02-11T04:22:21.041Z" }, + { url = "https://files.pythonhosted.org/packages/02/46/81f7aa8941873f0f01d4b55cc543b0a3d03ec2ee30d617a0448bf6bd6dec/pillow-12.1.1-cp314-cp314-win32.whl", hash = "sha256:03edcc34d688572014ff223c125a3f77fb08091e4607e7745002fc214070b35f", size = 6431503, upload-time = "2026-02-11T04:22:22.833Z" }, + { url = "https://files.pythonhosted.org/packages/40/72/4c245f7d1044b67affc7f134a09ea619d4895333d35322b775b928180044/pillow-12.1.1-cp314-cp314-win_amd64.whl", hash = "sha256:50480dcd74fa63b8e78235957d302d98d98d82ccbfac4c7e12108ba9ecbdba15", size = 7176748, upload-time = "2026-02-11T04:22:24.64Z" }, + { url = "https://files.pythonhosted.org/packages/e4/ad/8a87bdbe038c5c698736e3348af5c2194ffb872ea52f11894c95f9305435/pillow-12.1.1-cp314-cp314-win_arm64.whl", hash = "sha256:5cb1785d97b0c3d1d1a16bc1d710c4a0049daefc4935f3a8f31f827f4d3d2e7f", size = 2544314, upload-time = "2026-02-11T04:22:26.685Z" }, + { url = "https://files.pythonhosted.org/packages/6c/9d/efd18493f9de13b87ede7c47e69184b9e859e4427225ea962e32e56a49bc/pillow-12.1.1-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:1f90cff8aa76835cba5769f0b3121a22bd4eb9e6884cfe338216e557a9a548b8", size = 5268612, upload-time = "2026-02-11T04:22:29.884Z" }, + { url = "https://files.pythonhosted.org/packages/f8/f1/4f42eb2b388eb2ffc660dcb7f7b556c1015c53ebd5f7f754965ef997585b/pillow-12.1.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:1f1be78ce9466a7ee64bfda57bdba0f7cc499d9794d518b854816c41bf0aa4e9", size = 4660567, upload-time = "2026-02-11T04:22:31.799Z" }, + { url = "https://files.pythonhosted.org/packages/01/54/df6ef130fa43e4b82e32624a7b821a2be1c5653a5fdad8469687a7db4e00/pillow-12.1.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:42fc1f4677106188ad9a55562bbade416f8b55456f522430fadab3cef7cd4e60", size = 6269951, upload-time = "2026-02-11T04:22:33.921Z" }, + { url = "https://files.pythonhosted.org/packages/a9/48/618752d06cc44bb4aae8ce0cd4e6426871929ed7b46215638088270d9b34/pillow-12.1.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:98edb152429ab62a1818039744d8fbb3ccab98a7c29fc3d5fcef158f3f1f68b7", size = 8074769, upload-time = "2026-02-11T04:22:35.877Z" }, + { url = "https://files.pythonhosted.org/packages/c3/bd/f1d71eb39a72fa088d938655afba3e00b38018d052752f435838961127d8/pillow-12.1.1-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d470ab1178551dd17fdba0fef463359c41aaa613cdcd7ff8373f54be629f9f8f", size = 6381358, upload-time = "2026-02-11T04:22:37.698Z" }, + { url = "https://files.pythonhosted.org/packages/64/ef/c784e20b96674ed36a5af839305f55616f8b4f8aa8eeccf8531a6e312243/pillow-12.1.1-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6408a7b064595afcab0a49393a413732a35788f2a5092fdc6266952ed67de586", size = 7068558, upload-time = "2026-02-11T04:22:39.597Z" }, + { url = "https://files.pythonhosted.org/packages/73/cb/8059688b74422ae61278202c4e1ad992e8a2e7375227be0a21c6b87ca8d5/pillow-12.1.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:5d8c41325b382c07799a3682c1c258469ea2ff97103c53717b7893862d0c98ce", size = 6493028, upload-time = "2026-02-11T04:22:42.73Z" }, + { url = "https://files.pythonhosted.org/packages/c6/da/e3c008ed7d2dd1f905b15949325934510b9d1931e5df999bb15972756818/pillow-12.1.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:c7697918b5be27424e9ce568193efd13d925c4481dd364e43f5dff72d33e10f8", size = 7191940, upload-time = "2026-02-11T04:22:44.543Z" }, + { url = "https://files.pythonhosted.org/packages/01/4a/9202e8d11714c1fc5951f2e1ef362f2d7fbc595e1f6717971d5dd750e969/pillow-12.1.1-cp314-cp314t-win32.whl", hash = "sha256:d2912fd8114fc5545aa3a4b5576512f64c55a03f3ebcca4c10194d593d43ea36", size = 6438736, upload-time = "2026-02-11T04:22:46.347Z" }, + { url = "https://files.pythonhosted.org/packages/f3/ca/cbce2327eb9885476b3957b2e82eb12c866a8b16ad77392864ad601022ce/pillow-12.1.1-cp314-cp314t-win_amd64.whl", hash = "sha256:4ceb838d4bd9dab43e06c363cab2eebf63846d6a4aeaea283bbdfd8f1a8ed58b", size = 7182894, upload-time = "2026-02-11T04:22:48.114Z" }, + { url = "https://files.pythonhosted.org/packages/ec/d2/de599c95ba0a973b94410477f8bf0b6f0b5e67360eb89bcb1ad365258beb/pillow-12.1.1-cp314-cp314t-win_arm64.whl", hash = "sha256:7b03048319bfc6170e93bd60728a1af51d3dd7704935feb228c4d4faab35d334", size = 2546446, upload-time = "2026-02-11T04:22:50.342Z" }, + { url = "https://files.pythonhosted.org/packages/56/11/5d43209aa4cb58e0cc80127956ff1796a68b928e6324bbf06ef4db34367b/pillow-12.1.1-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:600fd103672b925fe62ed08e0d874ea34d692474df6f4bf7ebe148b30f89f39f", size = 5228606, upload-time = "2026-02-11T04:22:52.106Z" }, + { url = "https://files.pythonhosted.org/packages/5f/d5/3b005b4e4fda6698b371fa6c21b097d4707585d7db99e98d9b0b87ac612a/pillow-12.1.1-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:665e1b916b043cef294bc54d47bf02d87e13f769bc4bc5fa225a24b3a6c5aca9", size = 4622321, upload-time = "2026-02-11T04:22:53.827Z" }, + { url = "https://files.pythonhosted.org/packages/df/36/ed3ea2d594356fd8037e5a01f6156c74bc8d92dbb0fa60746cc96cabb6e8/pillow-12.1.1-pp311-pypy311_pp73-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:495c302af3aad1ca67420ddd5c7bd480c8867ad173528767d906428057a11f0e", size = 5247579, upload-time = "2026-02-11T04:22:56.094Z" }, + { url = "https://files.pythonhosted.org/packages/54/9a/9cc3e029683cf6d20ae5085da0dafc63148e3252c2f13328e553aaa13cfb/pillow-12.1.1-pp311-pypy311_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:8fd420ef0c52c88b5a035a0886f367748c72147b2b8f384c9d12656678dfdfa9", size = 6989094, upload-time = "2026-02-11T04:22:58.288Z" }, + { url = "https://files.pythonhosted.org/packages/00/98/fc53ab36da80b88df0967896b6c4b4cd948a0dc5aa40a754266aa3ae48b3/pillow-12.1.1-pp311-pypy311_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f975aa7ef9684ce7e2c18a3aa8f8e2106ce1e46b94ab713d156b2898811651d3", size = 5313850, upload-time = "2026-02-11T04:23:00.554Z" }, + { url = "https://files.pythonhosted.org/packages/30/02/00fa585abfd9fe9d73e5f6e554dc36cc2b842898cbfc46d70353dae227f8/pillow-12.1.1-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8089c852a56c2966cf18835db62d9b34fef7ba74c726ad943928d494fa7f4735", size = 5963343, upload-time = "2026-02-11T04:23:02.934Z" }, + { url = "https://files.pythonhosted.org/packages/f2/26/c56ce33ca856e358d27fda9676c055395abddb82c35ac0f593877ed4562e/pillow-12.1.1-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:cb9bb857b2d057c6dfc72ac5f3b44836924ba15721882ef103cecb40d002d80e", size = 7029880, upload-time = "2026-02-11T04:23:04.783Z" }, +] + [[package]] name = "pluggy" version = "1.6.0" @@ -249,6 +1054,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl", hash = "sha256:86540386c03d588bb81d44bc3928634ff26449851e99741617ecb9037ee5ec0b", size = 1225217, upload-time = "2025-06-21T13:39:07.939Z" }, ] +[[package]] +name = "pyparsing" +version = "3.3.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f3/91/9c6ee907786a473bf81c5f53cf703ba0957b23ab84c264080fb5a450416f/pyparsing-3.3.2.tar.gz", hash = "sha256:c777f4d763f140633dcb6d8a3eda953bf7a214dc4eff598413c070bcdc117cbc", size = 6851574, upload-time = "2026-01-21T03:57:59.36Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/10/bd/c038d7cc38edc1aa5bf91ab8068b63d4308c66c4c8bb3cbba7dfbc049f9c/pyparsing-3.3.2-py3-none-any.whl", hash = "sha256:850ba148bd908d7e2411587e247a1e4f0327839c40e2e5e6d05a007ecc69911d", size = 122781, upload-time = "2026-01-21T03:57:55.912Z" }, +] + [[package]] name = "pytest" version = "9.0.2" @@ -267,6 +1081,27 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/3b/ab/b3226f0bd7cdcf710fbede2b3548584366da3b19b5021e74f5bde2a8fa3f/pytest-9.0.2-py3-none-any.whl", hash = "sha256:711ffd45bf766d5264d487b917733b453d917afd2b0ad65223959f59089f875b", size = 374801, upload-time = "2025-12-06T21:30:49.154Z" }, ] +[[package]] +name = "python-dateutil" +version = "2.9.0.post0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "six" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/66/c0/0c8b6ad9f17a802ee498c46e004a0eb49bc148f2fd230864601a86dcf6db/python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3", size = 342432, upload-time = "2024-03-01T18:36:20.211Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427", size = 229892, upload-time = "2024-03-01T18:36:18.57Z" }, +] + +[[package]] +name = "pytz" +version = "2025.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f8/bf/abbd3cdfb8fbc7fb3d4d38d320f2441b1e7cbe29be4f23797b4a2b5d8aac/pytz-2025.2.tar.gz", hash = "sha256:360b9e3dbb49a209c21ad61809c7fb453643e048b38924c765813546746e81c3", size = 320884, upload-time = "2025-03-25T02:25:00.538Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/81/c4/34e93fe5f5429d7570ec1fa436f1986fb1f00c3e0f43a589fe2bbcd22c3f/pytz-2025.2-py2.py3-none-any.whl", hash = "sha256:5ddf76296dd8c44c26eb8f4b6f35488f3ccbf6fbbd7adee0b7262d43f0ec2f00", size = 509225, upload-time = "2025-03-25T02:24:58.468Z" }, +] + [[package]] name = "requests" version = "2.32.5" @@ -329,6 +1164,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/e0/f9/0595336914c5619e5f28a1fb793285925a8cd4b432c9da0a987836c7f822/shellingham-1.5.4-py2.py3-none-any.whl", hash = "sha256:7ecfff8f2fd72616f7481040475a65b2bf8af90a56c89140852d1120324e8686", size = 9755, upload-time = "2023-10-24T04:13:38.866Z" }, ] +[[package]] +name = "six" +version = "1.17.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/94/e7/b2c673351809dca68a0e064b6af791aa332cf192da575fd474ed7d6f16a2/six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81", size = 34031, upload-time = "2024-12-04T17:35:28.174Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274", size = 11050, upload-time = "2024-12-04T17:35:26.475Z" }, +] + [[package]] name = "tomli" version = "2.4.0" @@ -407,6 +1251,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl", hash = "sha256:f0fa19c6845758ab08074a0cfa8b7aecb71c999ca73d62883bc25cc018c4e548", size = 44614, upload-time = "2025-08-25T13:49:24.86Z" }, ] +[[package]] +name = "tzdata" +version = "2025.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/5e/a7/c202b344c5ca7daf398f3b8a477eeb205cf3b6f32e7ec3a6bac0629ca975/tzdata-2025.3.tar.gz", hash = "sha256:de39c2ca5dc7b0344f2eba86f49d614019d29f060fc4ebc8a417896a620b56a7", size = 196772, upload-time = "2025-12-13T17:45:35.667Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c7/b0/003792df09decd6849a5e39c28b513c06e84436a54440380862b5aeff25d/tzdata-2025.3-py2.py3-none-any.whl", hash = "sha256:06a47e5700f3081aab02b2e513160914ff0694bce9947d6b76ebd6bf57cfc5d1", size = 348521, upload-time = "2025-12-13T17:45:33.889Z" }, +] + [[package]] name = "urllib3" version = "2.6.3" From 1fe8f3d4aa9f44fa2824f3c2583a76a8d4cc00c6 Mon Sep 17 00:00:00 2001 From: Yannick Marcon Date: Mon, 16 Feb 2026 15:50:24 +0100 Subject: [PATCH 2/7] fix: corrected lint errors --- examples/datashield.py.ipynb | 59 +++++++++++++++++++----------------- 1 file changed, 32 insertions(+), 27 deletions(-) diff --git a/examples/datashield.py.ipynb b/examples/datashield.py.ipynb index b9a7c89..72ae140 100644 --- a/examples/datashield.py.ipynb +++ b/examples/datashield.py.ipynb @@ -20,8 +20,8 @@ "from datashield import DSSession, DSLoginBuilder, DSError\n", "import pandas as pd\n", "\n", - "url = 'https://opal-demo.obiba.org'\n", - "builder = DSLoginBuilder().add('server1', url, 'dsuser', 'P@ssw0rd').add('server2', url, 'dsuser', 'P@ssw0rd')\n", + "url = \"https://opal-demo.obiba.org\"\n", + "builder = DSLoginBuilder().add(\"server1\", url, \"dsuser\", \"P@ssw0rd\").add(\"server2\", url, \"dsuser\", \"P@ssw0rd\")\n", "logins = builder.build()\n", "\n", "session = DSSession(logins)\n", @@ -143,7 +143,7 @@ ], "source": [ "pkgs = session.packages()\n", - "pd.DataFrame.from_records(pkgs['server1'])" + "pd.DataFrame.from_records(pkgs[\"server1\"])" ] }, { @@ -297,8 +297,8 @@ } ], "source": [ - "methods = session.methods(type='aggregate')\n", - "pd.DataFrame.from_records(methods['server1'])" + "methods = session.methods(type=\"aggregate\")\n", + "pd.DataFrame.from_records(methods[\"server1\"])" ] }, { @@ -386,7 +386,7 @@ "metadata": {}, "outputs": [], "source": [ - "#session.resources()" + "# session.resources()" ] }, { @@ -415,7 +415,7 @@ } ], "source": [ - "session.assign_resource('client', resources = { 'server1': 'RSRC.CNSIM1', 'server2': 'RSRC.CNSIM1' })\n", + "session.assign_resource(\"client\", resources={\"server1\": \"RSRC.CNSIM1\", \"server2\": \"RSRC.CNSIM1\"})\n", "session.ls()" ] }, @@ -459,7 +459,7 @@ } ], "source": [ - "session.assign_expr('df', 'as.resource.data.frame(client, strict = TRUE)')\n", + "session.assign_expr(\"df\", \"as.resource.data.frame(client, strict = TRUE)\")\n", "session.ls()" ] }, @@ -555,7 +555,7 @@ } ], "source": [ - "session.aggregate('meanDS(df$LAB_GLUC_ADJUSTED)')" + "session.aggregate(\"meanDS(df$LAB_GLUC_ADJUSTED)\")" ] }, { @@ -576,7 +576,7 @@ } ], "source": [ - "session.assign_table('df2', tables = { 'server1': 'CNSIM.CNSIM1', 'server2': 'CNSIM.CNSIM2' })\n", + "session.assign_table(\"df2\", tables={\"server1\": \"CNSIM.CNSIM1\", \"server2\": \"CNSIM.CNSIM2\"})\n", "session.ls()" ] }, @@ -1038,8 +1038,10 @@ ], "source": [ "numints = 20\n", - "densityGrid = session.aggregate(f'densityGridDS(df2$LAB_TSC, df2$LAB_HDL, limits=FALSE, x.min=NULL, x.max=NULL, y.min=NULL, y.max=NULL, numints = {numints})')\n", - "densityGrid['server1']" + "densityGrid = session.aggregate(\n", + " f\"densityGridDS(df2$LAB_TSC, df2$LAB_HDL, limits=FALSE, x.min=NULL, x.max=NULL, y.min=NULL, y.max=NULL, numints = {numints})\"\n", + ")\n", + "densityGrid[\"server1\"]" ] }, { @@ -1061,8 +1063,9 @@ ], "source": [ "import matplotlib.pyplot as plt\n", - "plt.imshow(densityGrid['server1'], aspect='auto')\n", - "plt.title( \"2-D Heat Map (server 1)\" )\n", + "\n", + "plt.imshow(densityGrid[\"server1\"], aspect=\"auto\")\n", + "plt.title(\"2-D Heat Map (server 1)\")\n", "plt.show()" ] }, @@ -1184,8 +1187,10 @@ } ], "source": [ - "data = session.aggregate('histogramDS2(df2$LAB_GLUC_ADJUSTED, num.breaks=20, min=0, max=20, method.indicator=1, k=3, noise=0.25)')\n", - "data['server1']" + "data = session.aggregate(\n", + " \"histogramDS2(df2$LAB_GLUC_ADJUSTED, num.breaks=20, min=0, max=20, method.indicator=1, k=3, noise=0.25)\"\n", + ")\n", + "data[\"server1\"]" ] }, { @@ -1206,13 +1211,13 @@ } ], "source": [ - "breaks = data['server1']['value'][0]['value'][0]['value']\n", - "counts = data['server1']['value'][0]['value'][1]['value']\n", + "breaks = data[\"server1\"][\"value\"][0][\"value\"][0][\"value\"]\n", + "counts = data[\"server1\"][\"value\"][0][\"value\"][1][\"value\"]\n", "\n", - "plt.bar(breaks[1:], counts, width=1, edgecolor='black', linewidth=0.5, color='lightgrey')\n", - "plt.xlabel('LAB_GLUC_ADJUSTED')\n", - "plt.ylabel('Frequency')\n", - "plt.title('Histogram (server 1)')\n", + "plt.bar(breaks[1:], counts, width=1, edgecolor=\"black\", linewidth=0.5, color=\"lightgrey\")\n", + "plt.xlabel(\"LAB_GLUC_ADJUSTED\")\n", + "plt.ylabel(\"Frequency\")\n", + "plt.title(\"Histogram (server 1)\")\n", "plt.show()" ] }, @@ -1236,11 +1241,11 @@ ], "source": [ "try:\n", - " session.aggregate('heatmapPlotDS(df2$LAB_TSC, df2$LAB_HDL, 3, 0.25, \"xxx\")')\n", - "except DSError as e:\n", - " print(session.get_errors()['server1'])\n", - " print(session.get_errors()['server1'].is_client_error())\n", - " print(session.get_errors()['server1'].is_server_error())" + " session.aggregate('heatmapPlotDS(df2$LAB_TSC, df2$LAB_HDL, 3, 0.25, \"xxx\")')\n", + "except DSError:\n", + " print(session.get_errors()[\"server1\"])\n", + " print(session.get_errors()[\"server1\"].is_client_error())\n", + " print(session.get_errors()[\"server1\"].is_server_error())" ] }, { From 7eb6ad22b6a442ec3c863850002030662e7a8c7a Mon Sep 17 00:00:00 2001 From: Yannick Marcon Date: Tue, 17 Feb 2026 14:17:08 +0100 Subject: [PATCH 3/7] feat: updated R session api --- datashield_opal/impl.py | 25 +- examples/datashield.py.ipynb | 1051 ++++------------------------------ uv.lock | 8 +- 3 files changed, 137 insertions(+), 947 deletions(-) diff --git a/datashield_opal/impl.py b/datashield_opal/impl.py index 7ad261e..6a8dc57 100644 --- a/datashield_opal/impl.py +++ b/datashield_opal/impl.py @@ -50,6 +50,9 @@ def start(self, asynchronous: bool = True) -> None: raise OpalDSError(ValueError("Failed to start R session: no session id returned")) self.id = session["id"] + def is_started(self) -> bool: + return self.id is not None + def is_ready(self) -> bool: if self.id is None: raise OpalDSError(ValueError("R session not started")) @@ -77,16 +80,30 @@ def is_failed(self) -> bool: session = response.from_json() return session.get("state", "").lower() == "failed" - def get_state_message(self) -> str: + def is_terminated(self) -> bool: if self.id is None: raise OpalDSError(ValueError("R session not started")) response = self._get(UriBuilder(["datashield", "session", self.id]).build()).send() if response.code != 200: raise OpalDSError(ValueError(f"Failed to check R session status: {response.code}")) session = response.from_json() - events = session.get("events", []) - if events: - return events[-1] + return session.get("state", "").lower() == "terminated" + + def get_events(self) -> list: + if self.id is None: + raise OpalDSError(ValueError("R session not started")) + response = self._get(UriBuilder(["datashield", "session", self.id]).build()).send() + if response.code != 200: + raise OpalDSError(ValueError(f"Failed to retrieve R session events: {response.code}")) + session = response.from_json() + events = [evt.split(";") for evt in session.get("events", [])] + return events + + def get_last_message(self) -> str: + events = self.get_events() + if events and len(events) > 0: + last_event = events[-1] + return last_event[2] if len(last_event) > 2 else "No message" return "No recent events" def close(self) -> None: diff --git a/examples/datashield.py.ipynb b/examples/datashield.py.ipynb index 72ae140..12e7872 100644 --- a/examples/datashield.py.ipynb +++ b/examples/datashield.py.ipynb @@ -12,13 +12,14 @@ }, { "cell_type": "code", - "execution_count": 22, + "execution_count": 1, "id": "298b59d2", "metadata": {}, "outputs": [], "source": [ - "from datashield import DSSession, DSLoginBuilder, DSError\n", + "from datashield import DSSession, DSLoginBuilder\n", "import pandas as pd\n", + "import matplotlib.pyplot as plt\n", "\n", "url = \"https://opal-demo.obiba.org\"\n", "builder = DSLoginBuilder().add(\"server1\", url, \"dsuser\", \"P@ssw0rd\").add(\"server2\", url, \"dsuser\", \"P@ssw0rd\")\n", @@ -38,109 +39,20 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": null, "id": "a8c38e5d", "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'server1': {'available': ['default',\n", - " 'exposome',\n", - " 'geo',\n", - " 'lemon-donkey',\n", - " 'margin-idiom',\n", - " 'mediation',\n", - " 'mtl',\n", - " 'omics',\n", - " 'omop',\n", - " 'survival'],\n", - " 'current': 'default'},\n", - " 'server2': {'available': ['default',\n", - " 'exposome',\n", - " 'geo',\n", - " 'lemon-donkey',\n", - " 'margin-idiom',\n", - " 'mediation',\n", - " 'mtl',\n", - " 'omics',\n", - " 'omop',\n", - " 'survival'],\n", - " 'current': 'default'}}" - ] - }, - "execution_count": 2, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "session.profiles()" ] }, { "cell_type": "code", - "execution_count": 3, + "execution_count": null, "id": "66a8c7ed", "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
pkgversion
0dsTidyverse1.1.0
1dsBase6.3.4
2resourcer1.5.0
\n", - "
" - ], - "text/plain": [ - " pkg version\n", - "0 dsTidyverse 1.1.0\n", - "1 dsBase 6.3.4\n", - "2 resourcer 1.5.0" - ] - }, - "execution_count": 3, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "pkgs = session.packages()\n", "pd.DataFrame.from_records(pkgs[\"server1\"])" @@ -148,154 +60,10 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": null, "id": "d6853094", "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
nameclassvaluepkgversion
0NROWfuncbase::NROWdsBase6.3.4
1asFactorDS1funcdsBase::asFactorDS1dsBase6.3.4
2asListDSfuncdsBase::asListDSdsBase6.3.4
3aucDSfuncdsBase::aucDSdsBase6.3.4
4boxPlotGGDSfuncdsBase::boxPlotGGDSdsBase6.3.4
..................
67tableDSfuncdsBase::tableDSdsBase6.3.4
68tableDS2funcdsBase::tableDS2dsBase6.3.4
69tapplyDSfuncdsBase::tapplyDSdsBase6.3.4
70testObjExistsDSfuncdsBase::testObjExistsDSdsBase6.3.4
71varDSfuncdsBase::varDSdsBase6.3.4
\n", - "

72 rows × 5 columns

\n", - "
" - ], - "text/plain": [ - " name class value pkg version\n", - "0 NROW func base::NROW dsBase 6.3.4\n", - "1 asFactorDS1 func dsBase::asFactorDS1 dsBase 6.3.4\n", - "2 asListDS func dsBase::asListDS dsBase 6.3.4\n", - "3 aucDS func dsBase::aucDS dsBase 6.3.4\n", - "4 boxPlotGGDS func dsBase::boxPlotGGDS dsBase 6.3.4\n", - ".. ... ... ... ... ...\n", - "67 tableDS func dsBase::tableDS dsBase 6.3.4\n", - "68 tableDS2 func dsBase::tableDS2 dsBase 6.3.4\n", - "69 tapplyDS func dsBase::tapplyDS dsBase 6.3.4\n", - "70 testObjExistsDS func dsBase::testObjExistsDS dsBase 6.3.4\n", - "71 varDS func dsBase::varDS dsBase 6.3.4\n", - "\n", - "[72 rows x 5 columns]" - ] - }, - "execution_count": 4, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "methods = session.methods(type=\"aggregate\")\n", "pd.DataFrame.from_records(methods[\"server1\"])" @@ -303,90 +71,22 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": null, "id": "c226246e", "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'server1': ['CNSIM.CNSIM1',\n", - " 'CNSIM.CNSIM2',\n", - " 'CNSIM.CNSIM3',\n", - " 'DASIM.DASIM1',\n", - " 'DASIM.DASIM2',\n", - " 'DASIM.DASIM3',\n", - " 'DISCORDANT.DISCORDANT_STUDY1',\n", - " 'DISCORDANT.DISCORDANT_STUDY2',\n", - " 'DISCORDANT.DISCORDANT_STUDY3',\n", - " 'GREENSPACE.Cohort1_exposome',\n", - " 'GREENSPACE.Cohort2_exposome',\n", - " 'GREENSPACE.Cohort3_exposome',\n", - " 'GWAS.ega_phenotypes',\n", - " 'GWAS.ega_phenotypes_1',\n", - " 'GWAS.ega_phenotypes_2',\n", - " 'GWAS.ega_phenotypes_3',\n", - " 'MEDIATION.UPBdata1',\n", - " 'MEDIATION.UPBdata2',\n", - " 'MEDIATION.UPBdata3',\n", - " 'SURVIVAL.EXPAND_WITH_MISSING1',\n", - " 'SURVIVAL.EXPAND_WITH_MISSING2',\n", - " 'SURVIVAL.EXPAND_WITH_MISSING3',\n", - " 'TESTING.TESTING1',\n", - " 'TESTING.TESTING2',\n", - " 'TESTING.TESTING3',\n", - " 'TITANIC_NEWCOMERS_WORKSHOP.titanic_server_1',\n", - " 'TITANIC_NEWCOMERS_WORKSHOP.titanic_server_2',\n", - " 'depression.growth_1',\n", - " 'depression.growth_2'],\n", - " 'server2': ['CNSIM.CNSIM1',\n", - " 'CNSIM.CNSIM2',\n", - " 'CNSIM.CNSIM3',\n", - " 'DASIM.DASIM1',\n", - " 'DASIM.DASIM2',\n", - " 'DASIM.DASIM3',\n", - " 'DISCORDANT.DISCORDANT_STUDY1',\n", - " 'DISCORDANT.DISCORDANT_STUDY2',\n", - " 'DISCORDANT.DISCORDANT_STUDY3',\n", - " 'GREENSPACE.Cohort1_exposome',\n", - " 'GREENSPACE.Cohort2_exposome',\n", - " 'GREENSPACE.Cohort3_exposome',\n", - " 'GWAS.ega_phenotypes',\n", - " 'GWAS.ega_phenotypes_1',\n", - " 'GWAS.ega_phenotypes_2',\n", - " 'GWAS.ega_phenotypes_3',\n", - " 'MEDIATION.UPBdata1',\n", - " 'MEDIATION.UPBdata2',\n", - " 'MEDIATION.UPBdata3',\n", - " 'SURVIVAL.EXPAND_WITH_MISSING1',\n", - " 'SURVIVAL.EXPAND_WITH_MISSING2',\n", - " 'SURVIVAL.EXPAND_WITH_MISSING3',\n", - " 'TESTING.TESTING1',\n", - " 'TESTING.TESTING2',\n", - " 'TESTING.TESTING3',\n", - " 'TITANIC_NEWCOMERS_WORKSHOP.titanic_server_1',\n", - " 'TITANIC_NEWCOMERS_WORKSHOP.titanic_server_2',\n", - " 'depression.growth_1',\n", - " 'depression.growth_2']}" - ] - }, - "execution_count": 5, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "session.tables()" ] }, { "cell_type": "code", - "execution_count": 355, + "execution_count": null, "id": "30574455", "metadata": {}, "outputs": [], "source": [ - "# session.resources()" + "session.resources()" ] }, { @@ -399,29 +99,51 @@ }, { "cell_type": "code", - "execution_count": 26, + "execution_count": 8, + "id": "56772b7c", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Last message from server1: Ready\n", + "Events from server1: [['PENDING', '2026-02-17T14:01:01.399Z', 'Created'], ['RUNNING', '2026-02-17T14:01:01.427Z', 'Ready']]\n" + ] + } + ], + "source": [ + "# Optional: explicitly start R server sessions\n", + "rsessions = session.sessions()\n", + "print(f\"Last message from server1: {rsessions['server1'].get_last_message()}\")\n", + "print(f\"Events from server1: {rsessions['server1'].get_events()}\")" + ] + }, + { + "cell_type": "code", + "execution_count": 61, "id": "8c3f1ce1", "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "{'server1': ['client', 'df'], 'server2': ['client']}" + "{'server1': ['client'], 'server2': ['client']}" ] }, - "execution_count": 26, + "execution_count": 61, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "session.assign_resource(\"client\", resources={\"server1\": \"RSRC.CNSIM1\", \"server2\": \"RSRC.CNSIM1\"})\n", + "session.assign_resource(\"client\", resources={\"server1\": \"RSRC.CNSIM1\", \"server2\": \"RSRC.CNSIM2\"})\n", "session.ls()" ] }, { "cell_type": "code", - "execution_count": 27, + "execution_count": 62, "id": "c9f5ae1a", "metadata": {}, "outputs": [ @@ -429,10 +151,13 @@ "data": { "text/plain": [ "{'server1': ['SQLResourceClient', 'ResourceClient', 'R6'],\n", - " 'server2': ['SQLResourceClient', 'ResourceClient', 'R6']}" + " 'server2': ['TidyFileResourceClient',\n", + " 'FileResourceClient',\n", + " 'ResourceClient',\n", + " 'R6']}" ] }, - "execution_count": 27, + "execution_count": 62, "metadata": {}, "output_type": "execute_result" } @@ -443,7 +168,7 @@ }, { "cell_type": "code", - "execution_count": 28, + "execution_count": 63, "id": "36dbc72d", "metadata": {}, "outputs": [ @@ -453,7 +178,7 @@ "{'server1': ['client', 'df'], 'server2': ['client', 'df']}" ] }, - "execution_count": 28, + "execution_count": 63, "metadata": {}, "output_type": "execute_result" } @@ -465,7 +190,7 @@ }, { "cell_type": "code", - "execution_count": 29, + "execution_count": 64, "id": "ccdcfd91", "metadata": {}, "outputs": [ @@ -475,7 +200,7 @@ "{'server1': 'data.frame', 'server2': 'data.frame'}" ] }, - "execution_count": 29, + "execution_count": 64, "metadata": {}, "output_type": "execute_result" } @@ -486,7 +211,7 @@ }, { "cell_type": "code", - "execution_count": 30, + "execution_count": 65, "id": "9ae41ebc", "metadata": {}, "outputs": [ @@ -505,21 +230,21 @@ " 'DIS_AMI',\n", " 'GENDER',\n", " 'PM_BMI_CATEGORICAL'],\n", - " 'server2': ['id',\n", - " 'LAB_TSC',\n", - " 'LAB_TRIG',\n", - " 'LAB_HDL',\n", - " 'LAB_GLUC_ADJUSTED',\n", - " 'PM_BMI_CONTINUOUS',\n", + " 'server2': ['entity_id',\n", + " 'DIS_AMI',\n", " 'DIS_CVA',\n", - " 'MEDI_LPD',\n", " 'DIS_DIAB',\n", - " 'DIS_AMI',\n", " 'GENDER',\n", - " 'PM_BMI_CATEGORICAL']}" + " 'LAB_GLUC_ADJUSTED',\n", + " 'LAB_HDL',\n", + " 'LAB_TRIG',\n", + " 'LAB_TSC',\n", + " 'MEDI_LPD',\n", + " 'PM_BMI_CATEGORICAL',\n", + " 'PM_BMI_CONTINUOUS']}" ] }, - "execution_count": 30, + "execution_count": 65, "metadata": {}, "output_type": "execute_result" } @@ -530,7 +255,7 @@ }, { "cell_type": "code", - "execution_count": 31, + "execution_count": 66, "id": "ee31c50b", "metadata": {}, "outputs": [ @@ -542,14 +267,14 @@ " 'Nvalid': 1822,\n", " 'Ntotal': 2163,\n", " 'ValidityMessage': 'VALID ANALYSIS'},\n", - " 'server2': {'EstimatedMean': 6.12409001097695,\n", - " 'Nmissing': 341,\n", - " 'Nvalid': 1822,\n", - " 'Ntotal': 2163,\n", + " 'server2': {'EstimatedMean': 6.10151761517615,\n", + " 'Nmissing': 505,\n", + " 'Nvalid': 2583,\n", + " 'Ntotal': 3088,\n", " 'ValidityMessage': 'VALID ANALYSIS'}}" ] }, - "execution_count": 31, + "execution_count": 66, "metadata": {}, "output_type": "execute_result" } @@ -560,17 +285,17 @@ }, { "cell_type": "code", - "execution_count": 32, + "execution_count": 4, "id": "d4cde00d", "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "{'server1': ['client', 'df', 'df2'], 'server2': ['client', 'df', 'df2']}" + "{'server1': ['df2'], 'server2': ['df2']}" ] }, - "execution_count": 32, + "execution_count": 4, "metadata": {}, "output_type": "execute_result" } @@ -582,471 +307,21 @@ }, { "cell_type": "code", - "execution_count": 33, + "execution_count": 5, "id": "f6ed662c", "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "[[0,\n", - " 0,\n", - " 0,\n", - " 0,\n", - " 0,\n", - " 0,\n", - " 0,\n", - " 0,\n", - " 0,\n", - " 0,\n", - " 0,\n", - " 0,\n", - " 0,\n", - " 0,\n", - " 0,\n", - " 0,\n", - " 0,\n", - " 0,\n", - " 0,\n", - " 0,\n", - " 2.59225,\n", - " 0.068282325],\n", - " [0,\n", - " 0,\n", - " 0,\n", - " 0,\n", - " 0,\n", - " 0,\n", - " 0,\n", - " 0,\n", - " 0,\n", - " 0,\n", - " 0,\n", - " 0,\n", - " 0,\n", - " 0,\n", - " 0,\n", - " 0,\n", - " 0,\n", - " 0,\n", - " 0,\n", - " 0,\n", - " 2.95275,\n", - " 0.208472975],\n", - " [0,\n", - " 0,\n", - " 0,\n", - " 0,\n", - " 0,\n", - " 0,\n", - " 0,\n", - " 0,\n", - " 0,\n", - " 0,\n", - " 3,\n", - " 0,\n", - " 4,\n", - " 0,\n", - " 0,\n", - " 0,\n", - " 0,\n", - " 0,\n", - " 0,\n", - " 0,\n", - " 3.31325,\n", - " 0.348663625],\n", - " [0,\n", - " 0,\n", - " 0,\n", - " 0,\n", - " 0,\n", - " 0,\n", - " 0,\n", - " 0,\n", - " 0,\n", - " 8,\n", - " 0,\n", - " 4,\n", - " 0,\n", - " 5,\n", - " 0,\n", - " 0,\n", - " 0,\n", - " 0,\n", - " 0,\n", - " 0,\n", - " 3.67375,\n", - " 0.488854275],\n", - " [0,\n", - " 0,\n", - " 0,\n", - " 0,\n", - " 0,\n", - " 0,\n", - " 0,\n", - " 3,\n", - " 8,\n", - " 3,\n", - " 8,\n", - " 7,\n", - " 6,\n", - " 11,\n", - " 0,\n", - " 6,\n", - " 0,\n", - " 0,\n", - " 0,\n", - " 0,\n", - " 4.03425,\n", - " 0.629044925],\n", - " [0,\n", - " 0,\n", - " 0,\n", - " 0,\n", - " 0,\n", - " 0,\n", - " 3,\n", - " 0,\n", - " 4,\n", - " 13,\n", - " 16,\n", - " 6,\n", - " 12,\n", - " 12,\n", - " 9,\n", - " 6,\n", - " 4,\n", - " 0,\n", - " 0,\n", - " 0,\n", - " 4.39475,\n", - " 0.769235575],\n", - " [0,\n", - " 0,\n", - " 0,\n", - " 0,\n", - " 0,\n", - " 0,\n", - " 3,\n", - " 7,\n", - " 11,\n", - " 14,\n", - " 16,\n", - " 28,\n", - " 25,\n", - " 16,\n", - " 9,\n", - " 9,\n", - " 10,\n", - " 0,\n", - " 0,\n", - " 0,\n", - " 4.75525,\n", - " 0.909426225],\n", - " [0,\n", - " 0,\n", - " 0,\n", - " 0,\n", - " 0,\n", - " 0,\n", - " 4,\n", - " 7,\n", - " 19,\n", - " 21,\n", - " 28,\n", - " 31,\n", - " 26,\n", - " 27,\n", - " 13,\n", - " 10,\n", - " 0,\n", - " 3,\n", - " 0,\n", - " 0,\n", - " 5.11575,\n", - " 1.049616875],\n", - " [0,\n", - " 0,\n", - " 0,\n", - " 0,\n", - " 0,\n", - " 0,\n", - " 5,\n", - " 13,\n", - " 14,\n", - " 28,\n", - " 37,\n", - " 28,\n", - " 28,\n", - " 26,\n", - " 23,\n", - " 14,\n", - " 6,\n", - " 0,\n", - " 0,\n", - " 0,\n", - " 5.47625,\n", - " 1.189807525],\n", - " [0,\n", - " 0,\n", - " 0,\n", - " 3,\n", - " 0,\n", - " 5,\n", - " 6,\n", - " 8,\n", - " 24,\n", - " 22,\n", - " 29,\n", - " 35,\n", - " 39,\n", - " 30,\n", - " 20,\n", - " 15,\n", - " 0,\n", - " 4,\n", - " 0,\n", - " 0,\n", - " 5.83675,\n", - " 1.329998175],\n", - " [0,\n", - " 0,\n", - " 0,\n", - " 0,\n", - " 4,\n", - " 0,\n", - " 11,\n", - " 14,\n", - " 18,\n", - " 32,\n", - " 28,\n", - " 28,\n", - " 24,\n", - " 23,\n", - " 12,\n", - " 8,\n", - " 5,\n", - " 0,\n", - " 0,\n", - " 0,\n", - " 6.19725,\n", - " 1.470188825],\n", - " [0,\n", - " 0,\n", - " 0,\n", - " 3,\n", - " 0,\n", - " 3,\n", - " 6,\n", - " 14,\n", - " 17,\n", - " 18,\n", - " 27,\n", - " 25,\n", - " 25,\n", - " 19,\n", - " 15,\n", - " 9,\n", - " 5,\n", - " 4,\n", - " 0,\n", - " 0,\n", - " 6.55775,\n", - " 1.610379475],\n", - " [0,\n", - " 0,\n", - " 0,\n", - " 0,\n", - " 0,\n", - " 5,\n", - " 6,\n", - " 7,\n", - " 10,\n", - " 21,\n", - " 24,\n", - " 9,\n", - " 19,\n", - " 13,\n", - " 6,\n", - " 11,\n", - " 0,\n", - " 0,\n", - " 0,\n", - " 0,\n", - " 6.91825,\n", - " 1.750570125],\n", - " [0,\n", - " 0,\n", - " 0,\n", - " 4,\n", - " 0,\n", - " 5,\n", - " 6,\n", - " 6,\n", - " 10,\n", - " 10,\n", - " 9,\n", - " 13,\n", - " 9,\n", - " 3,\n", - " 4,\n", - " 0,\n", - " 0,\n", - " 0,\n", - " 3,\n", - " 0,\n", - " 7.27875,\n", - " 1.890760775],\n", - " [0,\n", - " 0,\n", - " 0,\n", - " 0,\n", - " 3,\n", - " 3,\n", - " 3,\n", - " 0,\n", - " 8,\n", - " 6,\n", - " 8,\n", - " 10,\n", - " 6,\n", - " 8,\n", - " 6,\n", - " 3,\n", - " 0,\n", - " 0,\n", - " 0,\n", - " 0,\n", - " 7.63925,\n", - " 2.030951425],\n", - " [0,\n", - " 0,\n", - " 0,\n", - " 0,\n", - " 0,\n", - " 0,\n", - " 3,\n", - " 0,\n", - " 3,\n", - " 6,\n", - " 6,\n", - " 6,\n", - " 5,\n", - " 0,\n", - " 0,\n", - " 0,\n", - " 3,\n", - " 0,\n", - " 0,\n", - " 0,\n", - " 7.99975,\n", - " 2.171142075],\n", - " [0,\n", - " 3,\n", - " 0,\n", - " 0,\n", - " 0,\n", - " 0,\n", - " 0,\n", - " 0,\n", - " 0,\n", - " 0,\n", - " 0,\n", - " 0,\n", - " 0,\n", - " 0,\n", - " 0,\n", - " 0,\n", - " 0,\n", - " 0,\n", - " 0,\n", - " 0,\n", - " 8.36025,\n", - " 2.311332725],\n", - " [0,\n", - " 0,\n", - " 0,\n", - " 0,\n", - " 0,\n", - " 0,\n", - " 0,\n", - " 0,\n", - " 0,\n", - " 0,\n", - " 0,\n", - " 0,\n", - " 0,\n", - " 0,\n", - " 0,\n", - " 0,\n", - " 0,\n", - " 0,\n", - " 0,\n", - " 0,\n", - " 8.72075,\n", - " 2.451523375],\n", - " [0,\n", - " 0,\n", - " 0,\n", - " 0,\n", - " 0,\n", - " 0,\n", - " 0,\n", - " 0,\n", - " 0,\n", - " 0,\n", - " 0,\n", - " 0,\n", - " 0,\n", - " 0,\n", - " 0,\n", - " 0,\n", - " 0,\n", - " 0,\n", - " 0,\n", - " 0,\n", - " 9.08125,\n", - " 2.591714025],\n", - " [0,\n", - " 0,\n", - " 0,\n", - " 0,\n", - " 0,\n", - " 0,\n", - " 0,\n", - " 0,\n", - " 0,\n", - " 0,\n", - " 0,\n", - " 0,\n", - " 0,\n", - " 0,\n", - " 0,\n", - " 0,\n", - " 0,\n", - " 0,\n", - " 0,\n", - " 0,\n", - " 9.44175,\n", - " 2.731904675]]" - ] - }, - "execution_count": 33, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "numints = 20\n", "densityGrid = session.aggregate(\n", " f\"densityGridDS(df2$LAB_TSC, df2$LAB_HDL, limits=FALSE, x.min=NULL, x.max=NULL, y.min=NULL, y.max=NULL, numints = {numints})\"\n", ")\n", - "densityGrid[\"server1\"]" + "# densityGrid[\"server1\"]" ] }, { "cell_type": "code", - "execution_count": 34, + "execution_count": null, "id": "51dc8812", "metadata": {}, "outputs": [ @@ -1062,8 +337,6 @@ } ], "source": [ - "import matplotlib.pyplot as plt\n", - "\n", "plt.imshow(densityGrid[\"server1\"], aspect=\"auto\")\n", "plt.title(\"2-D Heat Map (server 1)\")\n", "plt.show()" @@ -1071,137 +344,25 @@ }, { "cell_type": "code", - "execution_count": 35, + "execution_count": null, "id": "48242294", "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'type': 'list',\n", - " 'attributes': {'names': {'type': 'character',\n", - " 'attributes': {},\n", - " 'value': ['histobject', 'invalidcells']}},\n", - " 'value': [{'type': 'list',\n", - " 'attributes': {'names': {'type': 'character',\n", - " 'attributes': {},\n", - " 'value': ['breaks', 'counts', 'density', 'mids', 'xname', 'equidist']},\n", - " 'class': {'type': 'character', 'attributes': {}, 'value': ['histogram']}},\n", - " 'value': [{'type': 'double',\n", - " 'attributes': {},\n", - " 'value': [0,\n", - " 1,\n", - " 2,\n", - " 3,\n", - " 4,\n", - " 5,\n", - " 6,\n", - " 7,\n", - " 8,\n", - " 9,\n", - " 10,\n", - " 11,\n", - " 12,\n", - " 13,\n", - " 14,\n", - " 15,\n", - " 16,\n", - " 17,\n", - " 18,\n", - " 19,\n", - " 20]},\n", - " {'type': 'double',\n", - " 'attributes': {},\n", - " 'value': [0,\n", - " 0,\n", - " 9,\n", - " 60,\n", - " 277,\n", - " 521,\n", - " 558,\n", - " 281,\n", - " 80,\n", - " 9,\n", - " 4,\n", - " 11,\n", - " 5,\n", - " 5,\n", - " 0,\n", - " 0,\n", - " 0,\n", - " 0,\n", - " 0,\n", - " 0]},\n", - " {'type': 'double',\n", - " 'attributes': {},\n", - " 'value': [0,\n", - " 0,\n", - " 0.00493963,\n", - " 0.03293085,\n", - " 0.15203074,\n", - " 0.28594951,\n", - " 0.30625686,\n", - " 0.15422613,\n", - " 0.04390779,\n", - " 0.00493963,\n", - " 0.00219539,\n", - " 0.00603732,\n", - " 0.00274424,\n", - " 0.00274424,\n", - " 0,\n", - " 0,\n", - " 0,\n", - " 0,\n", - " 0,\n", - " 0]},\n", - " {'type': 'double',\n", - " 'attributes': {},\n", - " 'value': [0.5,\n", - " 1.5,\n", - " 2.5,\n", - " 3.5,\n", - " 4.5,\n", - " 5.5,\n", - " 6.5,\n", - " 7.5,\n", - " 8.5,\n", - " 9.5,\n", - " 10.5,\n", - " 11.5,\n", - " 12.5,\n", - " 13.5,\n", - " 14.5,\n", - " 15.5,\n", - " 16.5,\n", - " 17.5,\n", - " 18.5,\n", - " 19.5]},\n", - " {'type': 'character', 'attributes': {}, 'value': ['xvect']},\n", - " {'type': 'logical', 'attributes': {}, 'value': [True]}]},\n", - " {'type': 'integer', 'attributes': {}, 'value': [2]}]}" - ] - }, - "execution_count": 35, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "data = session.aggregate(\n", " \"histogramDS2(df2$LAB_GLUC_ADJUSTED, num.breaks=20, min=0, max=20, method.indicator=1, k=3, noise=0.25)\"\n", - ")\n", - "data[\"server1\"]" + ")" ] }, { "cell_type": "code", - "execution_count": 36, + "execution_count": 8, "id": "50165862", "metadata": {}, "outputs": [ { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAjsAAAHHCAYAAABZbpmkAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjgsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvwVt1zgAAAAlwSFlzAAAPYQAAD2EBqD+naQAAQJRJREFUeJzt3Xd8FOXe///3pkNIIZQEpIr0KiAQRY9CJJQbQVAgIgTEhkGlWA63SlVDkWIJ6DknJjbqfRAVEAlVpag0RfAERCAgCQFCGphCMr8//GW/Lkkg2WySzZzX8/GYh+w111zzuTJZ952Z2V2LYRiGAAAATMqlsgsAAAAoT4QdAABgaoQdAABgaoQdAABgaoQdAABgaoQdAABgaoQdAABgaoQdAABgaoQdAABgaoQdoIpr0qSJxowZU9llVFmZmZmqW7euPvnkk8ouxan16NFDL7zwQmWXAdiFsAM4kdjYWFksFu3du7fI9XfffbfatWtX5v1s2LBBM2bMKPM4ZvDmm2/Kx8dHI0aMqOxSKlxmZqamT5+uvn37KiAgQBaLRbGxsUX2ffHFFxUVFaWkpKSKLRJwAMIOUMXFx8frn//8Z6m22bBhg2bOnFlOFVUdubm5evPNN/Xoo4/K1dW1ssupcBcuXNCsWbP0yy+/qGPHjtftO2jQIPn6+mrJkiUVVB3gOIQdoIrz9PSUu7t7ZZdRKpcvX67sEiRJ69at0/nz5zVs2LAK3W9Fzv96+6pXr54SExN16tQpzZ8//7rjuLi46IEHHtCHH34ovj8aVQ1hB6jirr1nJzc3VzNnzlTz5s3l5eWlWrVqqWfPnoqLi5MkjRkzRlFRUZIki8ViXQpcvnxZU6ZMUcOGDeXp6amWLVvqjTfeKPQC98cff+iZZ55R7dq15ePjo/vuu0+///67LBaLzSWyGTNmyGKx6MiRI3rooYdUs2ZN9ezZU5L0008/acyYMbr55pvl5eWloKAgPfLII7p48aLNvgrGOHr0qB5++GH5+fmpTp06euWVV2QYhk6fPm098xAUFKQFCxaU6Ge3du1aNWnSRM2aNbNpT0pK0tixY9WgQQN5enqqXr16GjRokE6ePGnT78svv9Sdd94pb29v+fj4aMCAATp8+LBNnzFjxqhGjRo6fvy4+vfvLx8fH40cOVITJkxQjRo1dOXKlUJ1hYWFKSgoSHl5eQ7ZV3E8PT0VFBRUop+VJN177706deqUDh48WOJtAGfgVtkFACgsLS1NFy5cKNSem5t7w21nzJihyMhIPfroo+rWrZvS09O1d+9e7d+/X/fee6+eeOIJnT17VnFxcfroo49stjUMQ/fdd5+2bdumcePGqVOnTvrqq6/0/PPP6/fff9eiRYusfceMGaNVq1Zp1KhR6tGjh3bs2KEBAwYUW9eDDz6o5s2b6/XXX7cGp7i4OP32228aO3asgoKCdPjwYf3jH//Q4cOHtWfPHpsQJknDhw9X69atNWfOHK1fv16vvvqqAgIC9N5776lXr16aO3euPvnkEz333HO67bbbdNddd133Z7Vr1y517ty5UPvQoUN1+PBhPf3002rSpImSk5MVFxenhIQENWnSRJL00UcfKTw8XKGhoZo7d66uXLmipUuXqmfPnjpw4IC1nyRdvXpVoaGh6tmzp9544w1Vr15dTZo0UVRUlNavX68HH3zQ2vfKlSv64osvNGbMGOultbLuy1G6dOkiSdq5c6duvfVWh40LlDsDgNOIiYkxJF13adu2rc02jRs3NsLDw62PO3bsaAwYMOC6+4mIiDCKevqvXbvWkGS8+uqrNu0PPPCAYbFYjF9//dUwDMPYt2+fIcmYOHGiTb8xY8YYkozp06db26ZPn25IMsLCwgrt78qVK4Xali9fbkgyvv7660JjPP7449a2q1evGg0aNDAsFosxZ84ca/ulS5eMatWq2fxMipKbm2tYLBZjypQpNu2XLl0yJBnz588vdtuMjAzD39/feOyxx2zak5KSDD8/P5v28PBwQ5Lx97//3aZvfn6+cdNNNxlDhw61aV+1apXN/B2xr5L44YcfDElGTEzMdft5eHgY48ePL/X4QGXiMhbghKKiohQXF1do6dChww239ff31+HDh3Xs2LFS73fDhg1ydXXVM888Y9M+ZcoUGYahL7/8UpK0ceNGSdJTTz1l0+/pp58uduwnn3yyUFu1atWs/87KytKFCxfUo0cPSdL+/fsL9X/00Uet/3Z1dVXXrl1lGIbGjRtnbff391fLli3122+/FVuLJKWkpMgwDNWsWbNQTR4eHtq+fbsuXbpU5LZxcXFKTU1VWFiYLly4YF1cXV3VvXt3bdu2rdA248ePt3lssVj04IMPasOGDcrMzLS2r1y5UjfddJP1Up8j9uVINWvWLPKs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pUaNGmn37t2SpN27d6t9+/YKDAy09gkNDVV6eroOHz5cgdUDAABnVKlndv4qPz9fEydO1B133KF27dpJkpKSkuTh4SF/f3+bvoGBgUpKSrL2+WvQKVhfsK4o2dnZys7Otj5OT0931DQAAICTcZozOxEREfr555+1YsWKct9XZGSk/Pz8rEvDhg3LfZ8AAKByOEXYmTBhgtatW6dt27apQYMG1vagoCDl5OQoNTXVpv+5c+cUFBRk7XPtu7MKHhf0udbUqVOVlpZmXU6fPu3A2QAAAGdSqWHHMAxNmDBBn376qbZu3aqmTZvarO/SpYvc3d21ZcsWa1t8fLwSEhIUHBwsSQoODtahQ4eUnJxs7RMXFydfX1+1adOmyP16enrK19fXZgEAAOZUqffsREREaNmyZfrss8/k4+NjvcfGz89P1apVk5+fn8aNG6fJkycrICBAvr6+evrppxUcHKwePXpIkvr06aM2bdpo1KhRmjdvnpKSkvTyyy8rIiJCnp6elTk9AADgBCo17CxdulSSdPfdd9u0x8TEaMyYMZKkRYsWycXFRUOHDlV2drZCQ0O1ZMkSa19XV1etW7dO48ePV3BwsLy9vRUeHq5Zs2ZV1DQAAIATq9SwYxjGDft4eXkpKipKUVFRxfZp3LixNmzY4MjSAACASTjFDcoAAADlhbADAABMjbADAABMjbADAABMjbADAABMjbADAABMjbADAABMjbADAABMjbADAABMjbADAABMjbADAABMjbADAABMjbADAABMjbADAABMjbADAABMjbADAABMjbADAABMjbADAABMjbADAABMjbADAABMjbADAABMjbADAABMjbADAABMjbADAABMjbADAABMjbADAABMjbADAABMjbADAABMjbADAABMjbADAABMjbADAABMjbADAABMjbADAABMjbADAABMjbADAABMjbADAABMjbADAABMjbADAABMjbADAABMjbADAABMjbADAABMjbADAABMjbADAABMjbADAABMjbADAABMjbADAABMjbADAABMjbADAABMjbADAABMjbADAABMjbADAABMjbADAABMrVLDztdff62BAweqfv36slgsWrt2rc16wzA0bdo01atXT9WqVVNISIiOHTtm0yclJUUjR46Ur6+v/P39NW7cOGVmZlbgLAAAgDOr1LBz+fJldezYUVFRUUWunzdvnt566y29++67+u677+Tt7a3Q0FBlZWVZ+4wcOVKHDx9WXFyc1q1bp6+//lqPP/54RU0BAAA4ObfK3Hm/fv3Ur1+/ItcZhqHFixfr5Zdf1qBBgyRJH374oQIDA7V27VqNGDFCv/zyizZu3KgffvhBXbt2lSS9/fbb6t+/v9544w3Vr1+/wuYCAACck9Pes3PixAklJSUpJCTE2ubn56fu3btr9+7dkqTdu3fL39/fGnQkKSQkRC4uLvruu+8qvGYAAOB8KvXMzvUkJSVJkgIDA23aAwMDreuSkpJUt25dm/Vubm4KCAiw9ilKdna2srOzrY/T09MdVTYAAHAyTntmpzxFRkbKz8/PujRs2LCySwIAAOXEacNOUFCQJOncuXM27efOnbOuCwoKUnJyss36q1evKiUlxdqnKFOnTlVaWpp1OX36tIOrBwAAzsJpw07Tpk0VFBSkLVu2WNvS09P13XffKTg4WJIUHBys1NRU7du3z9pn69atys/PV/fu3Ysd29PTU76+vjYLAAAwp0q9ZyczM1O//vqr9fGJEyd08OBBBQQEqFGjRpo4caJeffVVNW/eXE2bNtUrr7yi+vXra/DgwZKk1q1bq2/fvnrsscf07rvvKjc3VxMmTNCIESN4JxYAAJBUyWFn7969uueee6yPJ0+eLEkKDw9XbGysXnjhBV2+fFmPP/64UlNT1bNnT23cuFFeXl7WbT755BNNmDBBvXv3louLi4YOHaq33nqrwucCAACcU6WGnbvvvluGYRS73mKxaNasWZo1a1axfQICArRs2bLyKA8AAJiA096zAwAA4AiEHQAAYGqEHQAAYGqEHQAAYGqEHQAAYGqEHQAAYGpO+0WgAJzTyZMnFRoa6vBxAwICtHz5coePCwCEHQCl4ubmpgULFjh83ClTpjh8TACQuIwFAABMjrADAABMjbADAABMjbADAABMjbADAABMjbADAABMjbADAABMjbADAABMjbADAABMjbADAABMjbADAABMje/GQoUKCwtTSkqKw8dNTEx0+JgAAHMg7KBCpaSklMuXSA4fPtzhYwIAzIHLWAAAwNQIOwAAwNQIOwAAwNQIOwAAwNQIOwAAwNQIOwAAwNQIOwAAwNQIOwAAwNQIOwAAwNQIOwAAwNQIOwAAwNQIOwAAwNQIOwAAwNQIOwAAwNQIOwAAwNQIOwAAwNQIOwAAwNQIOwAAwNQIOwAAwNQIOwAAwNQIOwAAwNQIOwAAwNQIOwAAwNQIOwAAwNQIOwAAwNQIOwAAwNQIOwAAwNQIOwAAwNQIOwAAwNTcKrsAAKiqwsLClJKSUi5jBwQEaPny5eUyNvDfhrCDQsrzf+CJiYnlMi6qvpMnTyo0NLRcxi6v4JCSkqIFCxY4fFxJmjJlSrmMC/w3Mk3YiYqK0vz585WUlKSOHTvq7bffVrdu3Sq7rCqpPP8HPnz48HIZF1Wfm5sbwQFAuTDFPTsrV67U5MmTNX36dO3fv18dO3ZUaGiokpOTK7s0AABQyUxxZmfhwoV67LHHNHbsWEnSu+++q/Xr1+v999/X3//+90quDkBlK69LZOV5Wba8aj5z5owaNGjg8HEl7jOC86ryYScnJ0f79u3T1KlTrW0uLi4KCQnR7t27K7EyAM6ivC6Rledl2fKsmcuF+G9T5cPOhQsXlJeXp8DAQJv2wMBA/ec//ylym+zsbGVnZ1sfp6WlSZLS09PLr9Aq5OrVq8rMzCyXsfPy8spl7PIatzzHroo1l+fY1FwxY5dnzVevXuX/o6hQBb9vhmFcv6NRxf3++++GJGPXrl027c8//7zRrVu3IreZPn26IYmFhYWFhYXFBMvp06evmxWq/Jmd2rVry9XVVefOnbNpP3funIKCgorcZurUqZo8ebL1cX5+vlJSUlSrVi1ZLJbr7i89PV0NGzbU6dOn5evrW/YJOBmzz08y/xyZX9Vn9jkyv6rPWeZoGIYyMjJUv3796/ar8mHHw8NDXbp00ZYtWzR48GBJf4aXLVu2aMKECUVu4+npKU9PT5s2f3//Uu3X19fXtL/EkvnnJ5l/jsyv6jP7HJlf1ecMc/Tz87thnyofdiRp8uTJCg8PV9euXdWtWzctXrxYly9ftr47CwAA/PcyRdgZPny4zp8/r2nTpikpKUmdOnXSxo0bC920DAAA/vuYIuxI0oQJE4q9bOVInp6emj59eqHLYGZh9vlJ5p8j86v6zD5H5lf1VbU5WgzjRu/XAgAAqLpM8XURAAAAxSHsAAAAUyPsAAAAUyPsAAAAUyPsFCEqKkpNmjSRl5eXunfvru+///66/VevXq1WrVrJy8tL7du314YNGyqo0tKJjIzUbbfdJh8fH9WtW1eDBw9WfHz8dbeJjY2VxWKxWby8vCqo4tKbMWNGoXpbtWp13W2qyvGTpCZNmhSan8ViUURERJH9q8Lx+/rrrzVw4EDVr19fFotFa9eutVlvGIamTZumevXqqVq1agoJCdGxY8duOG5pn8fl5Xrzy83N1Ysvvqj27dvL29tb9evX1+jRo3X27NnrjmnP73l5udHxGzNmTKFa+/bte8NxneX4STeeY1HPSYvFovnz5xc7pjMdw5K8NmRlZSkiIkK1atVSjRo1NHTo0ELfXHAte5+75YGwc42VK1dq8uTJmj59uvbv36+OHTsqNDRUycnJRfbftWuXwsLCNG7cOB04cECDBw/W4MGD9fPPP1dw5Te2Y8cORUREaM+ePYqLi1Nubq769Omjy5cvX3c7X19fJSYmWpdTp05VUMX2adu2rU293377bbF9q9Lxk6QffvjBZm5xcXGSpAcffLDYbZz9+F2+fFkdO3ZUVFRUkevnzZunt956S++++66+++47eXt7KzQ0VFlZWcWOWdrncXm63vyuXLmi/fv365VXXtH+/fu1Zs0axcfH67777rvhuKX5PS9PNzp+ktS3b1+bWpcvX37dMZ3p+Ek3nuNf55aYmKj3339fFotFQ4cOve64znIMS/LaMGnSJH3xxRdavXq1duzYobNnz2rIkCHXHdee5265ccSXcZpJt27djIiICOvjvLw8o379+kZkZGSR/YcNG2YMGDDApq179+7GE088Ua51OkJycrIhydixY0exfWJiYgw/P7+KK6qMpk+fbnTs2LHE/avy8TMMw3j22WeNZs2aGfn5+UWur2rHT5Lx6aefWh/n5+cbQUFBxvz5861tqamphqenp7F8+fJixynt87iiXDu/onz//feGJOPUqVPF9int73lFKWp+4eHhxqBBg0o1jrMeP8Mo2TEcNGiQ0atXr+v2cdZjaBiFXxtSU1MNd3d3Y/Xq1dY+v/zyiyHJ2L17d5Fj2PvcLS+c2fmLnJwc7du3TyEhIdY2FxcXhYSEaPfu3UVus3v3bpv+khQaGlpsf2eSlpYmSQoICLhuv8zMTDVu3FgNGzbUoEGDdPjw4Yooz27Hjh1T/fr1dfPNN2vkyJFKSEgotm9VPn45OTn6+OOP9cgjj1z3C2yr2vH7qxMnTigpKcnmGPn5+al79+7FHiN7nsfOJC0tTRaL5Ybf11ea3/PKtn37dtWtW1ctW7bU+PHjdfHixWL7VvXjd+7cOa1fv17jxo27YV9nPYbXvjbs27dPubm5NsekVatWatSoUbHHxJ7nbnki7PzFhQsXlJeXV+hrJgIDA5WUlFTkNklJSaXq7yzy8/M1ceJE3XHHHWrXrl2x/Vq2bKn3339fn332mT7++GPl5+fr9ttv15kzZyqw2pLr3r27YmNjtXHjRi1dulQnTpzQnXfeqYyMjCL7V9XjJ0lr165VamqqxowZU2yfqnb8rlVwHEpzjOx5HjuLrKwsvfjiiwoLC7vulyuW9ve8MvXt21cffvihtmzZorlz52rHjh3q16+f8vLyiuxflY+fJH3wwQfy8fG54SUeZz2GRb02JCUlycPDo1AAv9FrY0Gfkm5TnkzzdREonYiICP388883vEYcHBys4OBg6+Pbb79drVu31nvvvafZs2eXd5ml1q9fP+u/O3TooO7du6tx48ZatWpVif7Sqkqio6PVr18/1a9fv9g+Ve34/TfLzc3VsGHDZBiGli5det2+Ven3fMSIEdZ/t2/fXh06dFCzZs20fft29e7duxIrKx/vv/++Ro4cecM3AjjrMSzpa0NVw5mdv6hdu7ZcXV0L3WF+7tw5BQUFFblNUFBQqfo7gwkTJmjdunXatm2bGjRoUKpt3d3ddeutt+rXX38tp+ocy9/fXy1atCi23qp4/CTp1KlT2rx5sx599NFSbVfVjl/BcSjNMbLneVzZCoLOqVOnFBcXd92zOkW50e+5M7n55ptVu3btYmutisevwDfffKP4+PhSPy8l5ziGxb02BAUFKScnR6mpqTb9b/TaWNCnpNuUJ8LOX3h4eKhLly7asmWLtS0/P19btmyx+ev4r4KDg236S1JcXFyx/SuTYRiaMGGCPv30U23dulVNmzYt9Rh5eXk6dOiQ6tWrVw4VOl5mZqaOHz9ebL1V6fj9VUxMjOrWrasBAwaUaruqdvyaNm2qoKAgm2OUnp6u7777rthjZM/zuDIVBJ1jx45p8+bNqlWrVqnHuNHvuTM5c+aMLl68WGytVe34/VV0dLS6dOmijh07lnrbyjyGN3pt6NKli9zd3W2OSXx8vBISEoo9JvY8d8tVhd8S7eRWrFhheHp6GrGxscaRI0eMxx9/3PD39zeSkpIMwzCMUaNGGX//+9+t/Xfu3Gm4ubkZb7zxhvHLL78Y06dPN9zd3Y1Dhw5V1hSKNX78eMPPz8/Yvn27kZiYaF2uXLli7XPt/GbOnGl89dVXxvHjx419+/YZI0aMMLy8vIzDhw9XxhRuaMqUKcb27duNEydOGDt37jRCQkKM2rVrG8nJyYZhVO3jVyAvL89o1KiR8eKLLxZaVxWPX0ZGhnHgwAHjwIEDhiRj4cKFxoEDB6zvRpozZ47h7+9vfPbZZ8ZPP/1kDBo0yGjatKnxxx9/WMfo1auX8fbbb1sf3+h57Czzy8nJMe677z6jQYMGxsGDB22el9nZ2cXO70a/584yv4yMDOO5554zdu/ebZw4ccLYvHmz0blzZ6N58+ZGVlZWsfNzpuNnGDf+HTUMw0hLSzOqV69uLF26tMgxnPkYluS14cknnzQaNWpkbN261di7d68RHBxsBAcH24zTsmVLY82aNdbHJXnuVhTCThHefvtto1GjRoaHh4fRrVs3Y8+ePdZ1f/vb34zw8HCb/qtWrTJatGhheHh4GG3btjXWr19fwRWXjKQil5iYGGufa+c3ceJE688iMDDQ6N+/v7F///6KL76Ehg8fbtSrV8/w8PAwbrrpJmP48OHGr7/+al1flY9fga+++sqQZMTHxxdaVxWP37Zt24r8vSyYR35+vvHKK68YgYGBhqenp9G7d+9Cc2/cuLExffp0m7brPY8r0vXmd+LEiWKfl9u2bbOOce38bvR7XpGuN78rV64Yffr0MerUqWO4u7sbjRs3Nh577LFCocWZj59h3Ph31DAM47333jOqVatmpKamFjmGMx/Dkrw2/PHHH8ZTTz1l1KxZ06hevbpx//33G4mJiYXG+es2JXnuVhTL/18gAACAKXHPDgAAMDXCDgAAMDXCDgAAMDXCDgAAMDXCDgAAMDXCDgAAMDXCDgAAMDXCDgAAMDXCDlCFjRkzRoMHD75unzNnzsjDw0Pt2rUrcr3FYrEubm5uatSokSZPnqzs7OwS15GTk6P58+erc+fO8vb2lp+fnzp27KiXX35ZZ8+eLVG9d999tyZOnFioPTY2Vv7+/jZt6enpeumll9SqVSt5eXkpKChIISEhWrNmjUrzOanLly+Xq6urIiIiCq3bvn279efi4uIiPz8/3XrrrXrhhReUmJho03fGjBnq1KnTDedZMGbBFyrm5eVpzpw5atWqlapVq6aAgAB1795d//rXvyTZHpuilhkzZujkyZPFrt+zZ4/1Z1jQ5urqqpo1a6p79+6aNWuW0tLSSvzzAqoqt8ouAED5io2N1bBhw/T111/ru+++U/fu3Qv1iYmJUd++fZWbm6sff/xRY8eOlbe3t2bPnn3D8bOzs9WnTx/99NNPmjlzpu644w7VqVNHJ06c0PLly/X2228rMjLSYfNJTU1Vz549lZaWpldffVW33Xab3NzctGPHDr3wwgvq1atXoXBUnOjoaL3wwgt67733tGDBAnl5eRXqEx8fL19fX6Wnp2v//v2aN2+eoqOjtX37drVv375Mc5k5c6bee+89vfPOO+ratavS09O1d+9eXbp0SZJsQtXKlSs1bdo0xcfHW9tq1KihCxcuSJI2b96stm3b2oz/1y8V9fX1VXx8vAzDUGpqqnbt2qXIyEjFxMRo586dql+/fpnmAjgzwg5gYoZhKCYmRkuWLFGDBg0UHR1dZNjx9/dXUFCQJKlhw4YaNGiQ9u/fX6J9LFq0SN9++6327t2rW2+91dreqFEj/e1vfyvVmZaS+N///V+dPHlSR48etXmBbtGihcLCwooMLEU5ceKEdu3apX//+9/atm2b1qxZo4ceeqhQv7p161p/Pi1atNCgQYN06623avz48fr222/LNJfPP/9cTz31lB588EFr21+/MbvgmEiSn5+fLBaLTZska9ipVatWoXV/9ddt69Wrp9atW2vgwIFq27atXnjhBX388cdlmgvgzLiMBZjYtm3bdOXKFYWEhOjhhx/WihUrdPny5etuc/ToUW3durXIUFSU5cuX695777UJOn9lsVhKXXdx8vPztWLFCo0cObLIMxE1atSQm1vJ/oaLiYnRgAED5Ofnp4cffljR0dEl2q5atWp68skntXPnTiUnJ5eq/msFBQVp69atOn/+fJnGsVfdunU1cuRIff7558rLy6uUGoCKQNgBTCw6OlojRoyQq6ur2rVrp5tvvlmrV68u1C8sLEw1atSQl5eXWrZsqbZt22rq1Kkl2sfRo0fVsmVLm7b7779fNWrUUI0aNXT77bc7ZC7Sn2cxLl26pFatWpVpnPz8fMXGxurhhx+WJI0YMULffvutTpw4UaLtC/Z/8uTJMtWxcOFCnT9/XkFBQerQoYOefPJJffnll3aNdfvtt1t/5gVLSbRq1UoZGRm6ePGiXfsFqgLCDmBSqampWrNmjfUFXVKxZzAWLVqkgwcP6scff9S6det09OhRjRo1yu59L1myRAcPHtQjjzyiK1eu2D3OtRx1SSwuLk6XL19W//79JUm1a9fWvffeq/fff79UdZT1rFWbNm30888/a8+ePXrkkUeUnJysgQMH6tFHHy31WCtXrtTBgwdtlpJw1FwAZ8Y9O4BJLVu2TFlZWTaXowzDUH5+vo4ePaoWLVpY24OCgnTLLbdIklq2bKmMjAyFhYXp1VdftbYXp3nz5jY3zUp/3hMiSQEBASWu19fXt8h3BqWmpsrPz0+SVKdOHfn7++s///lPicctSnR0tFJSUlStWjVrW35+vvUmaxeX6/8d+Msvv0iSmjRpUuR6X19fnTp1qlB7amqqXF1d5e3tbW1zcXHRbbfdpttuu00TJ07Uxx9/rFGjRumll15S06ZNSzynhg0b3vBYFeWXX36Rr6+vzc3MgNlwZgcwqejoaE2ZMsXmL/0ff/xRd9555w3PYLi6ukqS/vjjjxvuJywsTHFxcTpw4ECZ6m3ZsmWRN0Xv37/fGsxcXFw0YsQIffLJJzZvaS+QmZmpq1evXnc/Fy9e1GeffaYVK1bY/GwOHDigS5cuadOmTdfd/o8//tA//vEP3XXXXapTp06xczl8+HCht+/v379fTZs2lbu7e7Hjt2nTRpJueG+VIyQnJ2vZsmUaPHjwDQMeUJVxZgeo4tLS0gpdssjIyND+/fv1ySefFLq/JSwsTLNmzdKrr75qvZk3NTVVSUlJys/P17FjxzRr1iy1aNFCrVu3vuH+J02apPXr16t3796aPn267rzzTtWsWVNHjx7Vl19+aQ1O16u3Vq1aGj9+vN555x0988wzevTRR+Xp6an169dr+fLl+uKLL6x9X3vtNW3fvl3du3fXa6+9pq5du8rd3V3ffPONIiMj9cMPP1z3recfffSRatWqpWHDhhW6dNO/f39FR0erb9++1rbk5GRlZWUpIyND+/bt07x583ThwgWtWbOm2H2MHDlSs2bN0ujRo/XCCy/Iz89PX3/9tRYvXqx58+ZZ+z3wwAO64447dPvttysoKEgnTpzQ1KlT1aJFi1Lfl3Tx4kUlJSXZtPn7+1vfnWYYhpKSkqxvPd+9e7def/11+fn5ac6cOaXaF1DlGACqrPDwcENSoWXMmDFGmzZtitwmMTHRcHFxMT777DPDMAyb7SwWi1GvXj1j+PDhxvHjx0tcR1ZWljFnzhyjY8eORrVq1QxPT0+jVatWxqRJk4yEhIQb1jtu3DjDMAzj+++/N+69916jTp06hp+fn9G9e3fj008/LbS/1NRU4+9//7vRvHlzw8PDwwgMDDRCQkKMTz/91MjPz79ure3btzeeeuqpItetXLnS8PDwMM6fP29s27bN5ufi4+NjdOzY0Xj++eeNxMREm+1eeeUVo0uXLjZt8fHxxv3332/Ur1/f8Pb2Njp27Gj885//tKnvH//4h3HPPfcYderUMTw8PIxGjRoZY8aMMU6ePFmotpiYGMPPz69Q+4kTJ4r8mUoyli9fbt32r3Px8/MzunXrZsyaNctIS0u77s8LMAOLYTj4QzAA4L/Mk08+qTNnzmjdunWVXQqAInCRFgDslJGRoa+//lpr1qxRSEhIZZcDoBiEHQDX1bZt20Kf31KwfPLJJ5VdXiHffPNNsfWW9LNnSmratGl64IEHdP/99+vJJ5906NgAHIfLWACu69SpU8rNzS1yXWBgoHx8fCq4ouv7448/9Pvvvxe73p63ZwOo2gg7AADA1LiMBQAATI2wAwAATI2wAwAATI2wAwAATI2wAwAATI2wAwAATI2wAwAATI2wAwAATO3/A2HFuVihBUU8AAAAAElFTkSuQmCC", + "image/png": "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H2LQoEFwcnLCnTt3MHv2bOjr62PEiBGwsrJCaGgoJk+eDBsbG1haWmL8+PHw9PREjx49AADe3t5o3749Ro4ciSVLlkChUGDmzJkICwuDsbGxNrtGREREOkKrYef27dsYMWIE7t27h6ZNm+KFF17AyZMn0bRpUwDAihUroKenh4CAABQWFsLHxwdr164V19fX18fOnTsxduxYeHp6wtzcHMHBwZg3b562ukREREQ6RqthZ8uWLdUuNzExwZo1a7BmzZoqyzg5OWH37t3qbhoRERFJhE6ds0NERESkbgw7REREJGkMO0RERCRpKoWdv/76S93tICIiItIIlcLOs88+i5dffhmbNm1CQUGButtEREREpDYqhZ2zZ8+iY8eOmDx5MuRyOd59912cOnVK3W0jIiIiemoqhZ3OnTtj1apVuHPnDr799lukpaXhhRdeQIcOHbB8+XLcvXtX3e0kIiIiUslTnaBsYGCAoUOHIjY2FosXL8b169fx4YcfokWLFhg1ahTS0tLU1U4iIiIilTxV2Dlz5gzef/99NGvWDMuXL8eHH36IGzduIC4uDnfu3IG/v7+62klERESkEpXuoLx8+XJERkYiOTkZvr6++O677+Dr6ws9vUfZydnZGVFRUWjZsqU620pERERUZyqFnXXr1uHtt99GSEgImjVrVmkZOzs7REREPFXjiIiIiJ6WSmHn2rVrNZYxMjJCcHCwKtUTERERqY1K5+xERkYiNja2wvzY2Fhs3LjxqRtFREREpC4qhZ1FixahSZMmFebb2dnhs88+e+pGEREREamLSmEnNTUVzs7OFeY7OTkhNTX1qRtFREREpC4qhR07OztcvHixwvwLFy7A1tb2qRtFREREpC4qhZ0RI0bggw8+wKFDh1BaWorS0lIcPHgQEyZMQGBgoLrbSERERKQyla7Gmj9/Pv7++2/069cPBgaPqigrK8OoUaN4zg4RERHpFJXCjpGREbZu3Yr58+fjwoULMDU1hZubG5ycnNTdPiIiIqKnolLYKdemTRu0adNGXW0hIiIiUjuVwk5paSmioqIQHx+PjIwMlJWVKS0/ePCgWhpHRERE9LRUCjsTJkxAVFQU/Pz80KFDB8hkMnW3i4iIiEgtVAo7W7ZswQ8//ABfX191t4eIiIhIrVS69NzIyAjPPvusuttCREREpHYqhZ0pU6Zg1apVEARB3e0hIiIiUiuVDmP99ttvOHToEPbs2YPnnnsOhoaGSsu3bdumlsYRERERPS2Vwo61tTWGDBmi7rYQERERqZ1KYScyMlLd7SAiIiLSCJXO2QGAkpISHDhwAOvXr0dOTg4A4M6dO8jNzVVb44iIiIielkojOzdv3sSAAQOQmpqKwsJC9O/fHxYWFli8eDEKCwsRHh6u7nYSERERqUSlkZ0JEyagW7duePDgAUxNTcX5Q4YMQXx8vNoaR0RERPS0VBrZOXbsGE6cOAEjIyOl+S1btsQ///yjloYRERERqYNKIztlZWUoLS2tMP/27duwsLB46kYRERERqYtKYcfb2xsrV64UX8tkMuTm5mL27Nl8hAQRERHpFJUOYy1btgw+Pj5o3749CgoK8MYbb+DatWto0qQJNm/erO42EhEREalMpZGd5s2b48KFC/j4448xadIkdOnSBZ9//jnOnTsHOzs7lRry+eefQyaTYeLEieK8goIChIWFwdbWFo0aNUJAQADS09OV1ktNTYWfnx/MzMxgZ2eHqVOnoqSkRKU2EBERkfSoNLIDAAYGBnjzzTfV0ojTp09j/fr16Nixo9L8SZMmYdeuXYiNjYWVlRXGjRuHoUOH4vjx4wCA0tJS+Pn5QS6X48SJE0hLS8OoUaNgaGiIzz77TC1tIyIiooZNpbDz3XffVbt81KhRta4rNzcXQUFB+Oabb7BgwQJxflZWFiIiIhATE4O+ffsCeHTn5nbt2uHkyZPo0aMH9u/fjytXruDAgQOwt7dH586dMX/+fEyfPh1z5sypcLUYERER/feoFHYmTJig9Lq4uBj5+fkwMjKCmZlZncJOWFgY/Pz84OXlpRR2kpKSUFxcDC8vL3Geq6srHB0dkZCQgB49eiAhIQFubm6wt7cXy/j4+GDs2LG4fPkyunTpUuk2CwsLUVhYKL7Ozs6udXuJiIioYVEp7Dx48KDCvGvXrmHs2LGYOnVqrevZsmULzp49i9OnT1dYplAoYGRkBGtra6X59vb2UCgUYpnHg0758vJlVVm0aBHmzp1b63YSNTSpd+9ifVT1I7CqsjAzxRvDh2mkbiIiTVD5nJ0nubi44PPPP8ebb76JP//8s8byt27dwoQJExAXFwcTExN1NaNWZsyYgcmTJ4uvs7Oz0aJFi3ptA5Em6Rmb4MVXhmik7mM7t2ukXiIiTVH5QaCVMTAwwJ07d2pVNikpCRkZGejatSsMDAxgYGCAI0eO4Msvv4SBgQHs7e1RVFSEzMxMpfXS09Mhl8sBAHK5vMLVWeWvy8tUxtjYGJaWlkoTERERSZNKIzu//vqr0mtBEJCWloavvvoKvXr1qlUd/fr1w++//64076233oKrqyumT5+OFi1awNDQEPHx8QgICAAAJCcnIzU1FZ6engAAT09PLFy4EBkZGeIl73FxcbC0tET79u1V6RoRERFJjEphZ/DgwUqvZTIZmjZtir59+2LZsmW1qsPCwgIdOnRQmmdubg5bW1txfmhoKCZPngwbGxtYWlpi/Pjx8PT0RI8ePQA8upNz+/btMXLkSCxZsgQKhQIzZ85EWFgYjI2NVekaNVAxP8QiJ/+hRuq+k5mlkXqJiKh+qBR2ysrK1N2OSq1YsQJ6enoICAhAYWEhfHx8sHbtWnG5vr4+du7cibFjx8LT0xPm5uYIDg7GvHnz6qV9pDty8h9q7ByVvb/u0Ei9RERUP9R2grI6HD58WOm1iYkJ1qxZgzVr1lS5jpOTE3bv3q3hlhEREVFDpVLYefxKpposX75clU0QERERqYVKYefcuXM4d+4ciouL0bZtWwDA1atXoa+vj65du4rlZDKZelpJREREpCKVws6gQYNgYWGBjRs3onHjxgAe3WjwrbfewosvvogpU6aotZFEREREqlLpPjvLli3DokWLxKADAI0bN8aCBQtqfTUWERERUX1QKexkZ2fj7t27FebfvXsXOTk5T90oIiIiInVRKewMGTIEb731FrZt24bbt2/j9u3b+OmnnxAaGoqhQ4equ41EREREKlPpnJ3w8HB8+OGHeOONN1BcXPyoIgMDhIaGYunSpWptIBEREdHTUCnsmJmZYe3atVi6dClu3LgBAGjdujXMzc3V2jgiIiKip/VUDwJNS0tDWloaXFxcYG5uDkEQ1NUuIiIiIrVQKezcu3cP/fr1Q5s2beDr64u0tDQAj55lxcvOiYiISJeoFHYmTZoEQ0NDpKamwszMTJz/+uuvY+/evWprHBEREdHTUumcnf3792Pfvn1o3ry50nwXFxfcvHlTLQ0jIiIiUgeVRnby8vKURnTK3b9/H8bGxk/dKCIiIiJ1USnsvPjii/juu+/E1zKZDGVlZViyZAlefvlltTWOiIiI6GmpdBhryZIl6NevH86cOYOioiJMmzYNly9fxv3793H8+HF1t5GIiIhIZSqN7HTo0AFXr17FCy+8AH9/f+Tl5WHo0KE4d+4cWrdure42EhEREamsziM7xcXFGDBgAMLDw/HJJ59ook1EREREalPnkR1DQ0NcvHhRE20hIiIiUjuVDmO9+eabiIiIUHdbiIiIiNROpROUS0pK8O233+LAgQNwd3ev8Eys5cuXq6VxRERERE+rTmHnr7/+QsuWLXHp0iV07doVAHD16lWlMjKZTH2tIyIiInpKdQo7Li4uSEtLw6FDhwA8ejzEl19+CXt7e400joiIiOhp1emcnSefar5nzx7k5eWptUFERERE6qTSCcrlngw/RERERLqmTmFHJpNVOCeH5+gQERGRLqvTOTuCICAkJER82GdBQQHee++9Cldjbdu2TX0tJCIiInoKdQo7wcHBSq/ffPNNtTaGiIiISN3qFHYiIyM11Q4iIiIijXiqE5SJiIiIdB3DDhEREUkaww4RERFJGsMOERERSRrDDhEREUkaww4RERFJmlbDzrp169CxY0dYWlrC0tISnp6e2LNnj7i8oKAAYWFhsLW1RaNGjRAQEID09HSlOlJTU+Hn5wczMzPY2dlh6tSpKCkpqe+uEBERkY7Sathp3rw5Pv/8cyQlJeHMmTPo27cv/P39cfnyZQDApEmTsGPHDsTGxuLIkSO4c+cOhg4dKq5fWloKPz8/FBUV4cSJE9i4cSOioqIwa9YsbXWJiIiIdEydbiqoboMGDVJ6vXDhQqxbtw4nT55E8+bNERERgZiYGPTt2xfAo5satmvXDidPnkSPHj2wf/9+XLlyBQcOHIC9vT06d+6M+fPnY/r06ZgzZw6MjIy00S0iIiLSITpzzk5paSm2bNmCvLw8eHp6IikpCcXFxfDy8hLLuLq6wtHREQkJCQCAhIQEuLm5wd7eXizj4+OD7OxscXSoMoWFhcjOzlaaiIiISJq0HnZ+//13NGrUCMbGxnjvvfewfft2tG/fHgqFAkZGRrC2tlYqb29vD4VCAQBQKBRKQad8efmyqixatAhWVlbi1KJFC/V2ioiIiHSG1sNO27Ztcf78eSQmJmLs2LEIDg7GlStXNLrNGTNmICsrS5xu3bql0e0RERGR9mj1nB0AMDIywrPPPgsAcHd3x+nTp7Fq1Sq8/vrrKCoqQmZmptLoTnp6OuRyOQBALpfj1KlTSvWVX61VXqYyxsbGMDY2VnNPiIiISBdpfWTnSWVlZSgsLIS7uzsMDQ0RHx8vLktOTkZqaio8PT0BAJ6envj999+RkZEhlomLi4OlpSXat29f720nIiIi3aPVkZ0ZM2Zg4MCBcHR0RE5ODmJiYnD48GHs27cPVlZWCA0NxeTJk2FjYwNLS0uMHz8enp6e6NGjBwDA29sb7du3x8iRI7FkyRIoFArMnDkTYWFhHLkhIiIiAFoOOxkZGRg1ahTS0tJgZWWFjh07Yt++fejfvz8AYMWKFdDT00NAQAAKCwvh4+ODtWvXiuvr6+tj586dGDt2LDw9PWFubo7g4GDMmzdPW10iIiIiHaPVsBMREVHtchMTE6xZswZr1qypsoyTkxN2796t7qYRERGRROjcOTtERERE6sSwQ0RERJKm9UvPiUj98nJzcenQIY3U/WdSEhAySiN1ExFpAsMOkQTJSkrRQSbTSN3HcnI0Ui8RkaYw7JAk/JmUhMbm1hqp+2FurkbqJSKi+sGwQ5JQkpOjsZEMoaRUI/USEVH94AnKREREJGkMO0RERCRpDDtEREQkaQw7REREJGkMO0RERCRpDDtEREQkaQw7REREJGkMO0RERCRpDDtEREQkaQw7REREJGkMO0RERCRpDDtEREQkaQw7REREJGkMO0RERCRpDDtEREQkaQw7REREJGkMO0RERCRpDDtEREQkaQw7REREJGkMO0RERCRpDDtEREQkaQw7REREJGkMO0RERCRpDDtEREQkaQw7REREJGkMO0RERCRpDDtEREQkaQw7REREJGkMO0RERCRpWg07ixYtwvPPPw8LCwvY2dlh8ODBSE5OVipTUFCAsLAw2NraolGjRggICEB6erpSmdTUVPj5+cHMzAx2dnaYOnUqSkpK6rMrREREpKO0GnaOHDmCsLAwnDx5EnFxcSguLoa3tzfy8vLEMpMmTcKOHTsQGxuLI0eO4M6dOxg6dKi4vLS0FH5+figqKsKJEyewceNGREVFYdasWdroEhEREekYA21ufO/evUqvo6KiYGdnh6SkJLz00kvIyspCREQEYmJi0LdvXwBAZGQk2rVrh5MnT6JHjx7Yv38/rly5ggMHDsDe3h6dO3fG/PnzMX36dMyZMwdGRkba6BoRERHpCJ06ZycrKwsAYGNjAwBISkpCcXExvLy8xDKurq5wdHREQkICACAhIQFubm6wt7cXy/j4+CA7OxuXL1+udDuFhYXIzs5WmoiIiEiadCbslJWVYeLEiejVqxc6dOgAAFAoFDAyMoK1tbVSWXt7eygUCrHM40GnfHn5ssosWrQIVlZW4tSiRQs194aIiIh0hc6EnbCwMFy6dAlbtmzR+LZmzJiBrKwscbp165bGt0lERETaodVzdsqNGzcOO3fuxNGjR9G8eXNxvlwuR1FRETIzM5VGd9LT0yGXy8Uyp06dUqqv/Gqt8jJPMjY2hrGxsZp7QURERLpIqyM7giBg3Lhx2L59Ow4ePAhnZ2el5e7u7jA0NER8fLw4Lzk5GampqfD09AQAeHp64vfff0dGRoZYJi4uDpaWlmjfvn39dISIiIh0llZHdsLCwhATE4NffvkFFhYW4jk2VlZWMDU1hZWVFUJDQzF58mTY2NjA0tIS48ePh6enJ3r06AEA8Pb2Rvv27TFy5EgsWbIECoUCM2fORFhYGEdviIiISLthZ926dQCAPn36KM2PjIxESEgIAGDFihXQ09NDQEAACgsL4ePjg7Vr14pl9fX1sXPnTowdOxaenp4wNzdHcHAw5s2bV1/dICIiIh2m1bAjCEKNZUxMTLBmzRqsWbOmyjJOTk7YvXu3OptGREREEqEzV2MRERERaQLDDhEREUkaww4RERFJGsMOERERSRrDDhEREUkaww4RERFJGsMOERERSRrDDhEREUkaww4RERFJGsMOERERSRrDDhEREUkaww4RERFJGsMOERERSRrDDhEREUkaww4RERFJGsMOERERSRrDDhEREUkaww4RERFJGsMOERERSRrDDhEREUkaww4RERFJGsMOERERSRrDDhEREUkaww4RERFJGsMOERERSRrDDhEREUkaww4RERFJGsMOERERSRrDDhEREUkaww4RERFJGsMOERERSRrDDhEREUkaww4RERFJGsMOERERSZpWw87Ro0cxaNAgODg4QCaT4eeff1ZaLggCZs2ahWbNmsHU1BReXl64du2aUpn79+8jKCgIlpaWsLa2RmhoKHJzc+uxF0RERKTLtBp28vLy0KlTJ6xZs6bS5UuWLMGXX36J8PBwJCYmwtzcHD4+PigoKBDLBAUF4fLly4iLi8POnTtx9OhRjBkzpr66QERERDrOQJsbHzhwIAYOHFjpMkEQsHLlSsycORP+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", "text/plain": [ "
" ] @@ -1211,41 +372,53 @@ } ], "source": [ - "breaks = data[\"server1\"][\"value\"][0][\"value\"][0][\"value\"]\n", - "counts = data[\"server1\"][\"value\"][0][\"value\"][1][\"value\"]\n", + "breaks1 = data[\"server1\"][\"value\"][0][\"value\"][0][\"value\"]\n", + "counts1 = data[\"server1\"][\"value\"][0][\"value\"][1][\"value\"]\n", + "plt.bar(breaks1[1:], counts1, width=1, edgecolor=\"black\", linewidth=0.5, color=\"red\", alpha=0.5, label=\"server 1\")\n", "\n", - "plt.bar(breaks[1:], counts, width=1, edgecolor=\"black\", linewidth=0.5, color=\"lightgrey\")\n", - "plt.xlabel(\"LAB_GLUC_ADJUSTED\")\n", + "breaks2 = data[\"server2\"][\"value\"][0][\"value\"][0][\"value\"]\n", + "counts2 = data[\"server2\"][\"value\"][0][\"value\"][1][\"value\"]\n", + "plt.bar(breaks2[1:], counts2, width=1, edgecolor=\"black\", linewidth=0.5, color=\"lightblue\", alpha=0.5, label=\"server 2\")\n", + "\n", + "plt.xlabel(\"mg/dL\")\n", "plt.ylabel(\"Frequency\")\n", - "plt.title(\"Histogram (server 1)\")\n", + "plt.title(\"Histogram of LAB_GLUC_ADJUSTED\")\n", + "plt.legend()\n", "plt.show()" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 9, "id": "0a98f514", "metadata": {}, + "outputs": [], + "source": [ + "data = session.aggregate(\"heatmapPlotDS(df2$LAB_TSC, df2$LAB_HDL, 3, 0.25, 1)\")" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "id": "578293b7", + "metadata": {}, "outputs": [ { - "name": "stdout", - "output_type": "stream", - "text": [ - "Command 2e62e66a-87e7-4eb9-917f-91197716327b-12 failed on server1: Error while evaluating 'dsBase::heatmapPlotDS(\"df2$LAB_TSC\", \"df2$LAB_HDL\", 3, 0.25, \"xxx\")' -> Error in dsBase::heatmapPlotDS(\"df2$LAB_TSC\", \"df2$LAB_HDL\", 3, 0.25, : \n", - " object 'x.new' not found\n", - "\n", - "True\n", - "False\n" - ] + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAjsAAAGzCAYAAADJ3dZzAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjgsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvwVt1zgAAAAlwSFlzAAAPYQAAD2EBqD+naQAA8H9JREFUeJzsvXm8ZUV1L/6tc8695w49AQ00jQgIRsQJxZ/QOL7QESLxYT5GcQrCR8EQiTHwHEgcEjASnPVJQpInRlGj0cQpMShBO/FFAorPGBXHiMjQDQ30PNzh1O+Pc6r2qlVrVdW5A+K9tT59+u5dtWrVmmrtqlV19jHWWosKFSpUqFChQoUlCq1fNAMVKlSoUKFChQqLCXWyU6FChQoVKlRY0lAnOxUqVKhQoUKFJQ11slOhQoUKFSpUWNJQJzsVKlSoUKFChSUNdbJToUKFChUqVFjSUCc7FSpUqFChQoUlDXWyU6FChQoVKlRY0lAnOxUqVKhQoUKFJQ11slOhQoUKBbBr1y4ccsgh+OhHP/qLZuVBDSeffDJe+9rX/qLZqFAhgDrZqVBhAeDrX/86LrzwQjzqUY/C5OQkHvrQh+L5z38+fvjDHxbTOOqoo2CMgTEGrVYLa9aswWMe8xicf/75uPHGG4vpPOMZz8CjH/1ose7WW2+FMQbveMc7iunNBd761rfiM5/5TBGu48kYg7e85S0izotf/GIYY7BixYoF5HI4eO9734uVK1fiBS94wS+Mh18U7Nq1C29+85tx+umn48ADD4QxBn/zN38j4r7uda/DlVdeic2bNz+wTFaokIA62alQYQHgiiuuwN///d/j1FNPxXvf+16cf/75+Ld/+zc84QlPwHe+851iOieccAKuueYafPjDH8bll1+O//E//gc+//nP4+STT8ZFF120iBIsLAwz2XEwNjaGv/3bv43Kd+/ejc9+9rMYGxtbIO6Gh+npabz3ve/Fy1/+crTb7V8YH78o2Lp1Ky699FLccssteNzjHpfEPfPMM7Fq1Sr8+Z//+QPEXYUKeaiTnQoVFgAuuugi/OxnP8P73vc+vPzlL8cb3vAGfPWrX8XMzAz+7M/+rJjO4Ycfjpe85CV4yUteggsuuADve9/78N///d94znOeg3e/+934i7/4i0WU4hcLz3rWs/C9730P//mf/xmUf/azn8XU1BR+7dd+7RfEGfCP//iPuOeee/D85z//Ae139+7dD4q+DjvsMNx111342c9+hre//e1JOq1WC7/1W7+FD3/4w6i/M13hwQJ1slOhwgLAKaecgtHR0aDs4Q9/OB71qEfhlltumRft8fFxXHPNNTjwwAPxp3/6p4vyANm2bRte/epX44gjjkC328Wxxx6LK664Ar1eL8B7xzvegVNOOQUHHXQQxsfHceKJJ+JTn/pUgGOMwe7du/GhD33Ib0+dc845WR42bNiAo48+Gh/72MeC8o9+9KN++4TDZz/7WZxxxhlYv349ut0ujjnmGFx22WWYnZ0N8NzW3s0334xTTjkF4+PjOProo3HVVVcV6eczn/kMjjrqKBxzzDFB+ebNm3HuuefiIQ95CLrdLg477DCceeaZuPXWWwO8f/7nf8ZTn/pUTE5OYuXKlTjjjDPw3e9+N8A555xzsGLFCvzkJz/Bs571LKxcuRIvfvGLceGFF2LFihXYs2dPxNcLX/hCrFu3LpB3Pn1p0O12sW7duiJdAcCv/dqv4Wc/+xm+9a1vFbepUGExoU52KlRYJLDWYsuWLVi7du28aa1YsQK/+Zu/iTvuuAPf+973svizs7PYunVr9Ln//vsj3D179uDpT386PvKRj+Dss8/G+973Pjz5yU/GJZdcEm2dvfe978XjH/94XHrppXjrW9+KTqeD5z3vefinf/onj3PNNdeg2+3iqU99Kq655hpcc801eMUrXlEk5wtf+EJ8/OMf9xO6rVu34ktf+hJe9KIXifh/8zd/gxUrVuCiiy7Ce9/7Xpx44ol405vehNe//vUR7v33349nPetZOPHEE/G2t70ND3nIQ3DBBRfg6quvzvL1ta99DU94whOi8uc+97n49Kc/jXPPPRd//ud/jle96lXYuXMnbrvttkAfZ5xxBlasWIErrrgCb3zjG/G9730PT3nKU6JJ0czMDE477TQccsgheMc73oHnPve5OOuss7B79+5Ax0Dfbp///OfxW7/1W35rbb59LRSceOKJAIB///d/XzCaFSrMC2yFChUWBa655hoLwH7gAx8owj/yyCPtGWecoda/+93vtgDsZz/72SSdpz/96RZA8vP2t7/d41922WV2cnLS/vCHPwzovP71r7ftdtvedtttvmzPnj0BztTUlH30ox9tf/VXfzUon5yctC996UtzIltrrf3pT3/qefrOd75jAdivfvWr1lprr7zySrtixQq7e/du+9KXvtROTk4GbTk/1lr7ile8wk5MTNh9+/ZFOnnnO9/py/bv329POOEEe8ghh9ipqSmVv+npaWuMsRdffHFQfv/990e65LBz5067Zs0ae9555wXlmzdvtqtXrw7KX/rSl1oA9vWvf32A2+v17OGHH26f+9znBuV/93d/ZwHYf/u3f1uwvkrg61//ugVgP/jBDybxRkdH7QUXXDA0/QoVFgNqZqdChUWA73//+3jlK1+JDRs24KUvfemC0HTfRNq5c2cW96ijjsJ1110XfT7ykY9EuJ/85Cfx1Kc+FQcccECQBdq4cSNmZ2fxb//2bx53fHzcX99///3Yvn07nvrUp+Kb3/zmAkgIPOpRj8JjH/tYf1D5Yx/7GM4880xMTEyI+JSfnTt3YuvWrXjqU5+KPXv24Pvf/36A2+l0ggzT6OgoXvGKV+Duu+/GzTffrPJ03333wVqLAw44IOp7dHQUmzZtEjNmAHDddddh27ZteOELXxjott1u46STTsJXvvKVqM0FF1wQ3Btj8LznPQ9f+MIXsGvXLl/+iU98Aocffjie8pSnLFhfCwnOnypUeDBA5xfNQIUKSw02b96MM844A6tXr8anPvWp4Ns727dvx969e/396OioeBZFAvegW7lyZRZ3cnISGzdujMr5VgYA/OhHP8K3v/1tHHzwwSKtu+++21//4z/+I97ylrfgW9/6Fvbv3+/LjTFZnkrhRS96Ed75znfiD/7gD/C1r30Nf/iHf6jifve738Ub3vAGfPnLX8aOHTuCuu3btwf369evx+TkZFD2K7/yKwD6ejn55JOTfFl2Vqrb7eKKK67AxRdfjEMPPRQnn3wyfuM3fgNnn322P9/yox/9CADwq7/6qyLNVatWBfedTgcPechDIryzzjoL73nPe/C5z30OL3rRi7Br1y584QtfwCte8Qqv+4Xqa6HAWrugflGhwnygTnYqVFhA2L59O379138d27Ztw1e/+lWsX78+qP/93/99fOhDH/L3T3/607Fp06Yi2u4r7Mcee+yC8QsAvV4Pv/Zrv6a+CM5NCL761a/if/7P/4mnPe1p+PM//3McdthhGBkZwQc/+MHoUPF84IUvfCEuueQSnHfeeTjooIPwzGc+U8Tbtm0bnv70p2PVqlW49NJLccwxx2BsbAzf/OY3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ndFs2bJlOHToEPbu3euYftttt9n/T5s2DdnZ2bj66qvR0NCAc889d7ibGXNlZWX2/9OnT0dRURHy8vKwZcsWJCUljWDLRt7TTz+NsrIy5OTk2NNGW3xQZLq7u3HjjTdCRLBhwwbHvJ7fQgSsYy0xMRE//elPsXr1alf+RtQPf/hD+/9p06Zh+vTpOPfcc1FTU4Orr756BFsWHzZu3IjFixdj3LhxjunDFSej6m2s9PR0JCQkBNxd09raiqysrBFqVewtX74cf/vb3/Daa6/hnHPOCVm2qKgIAOxfq8/KygraXz3zTnepqam44IILcPToUWRlZaGrqwttbW2OMr3jw6398eGHH2LXrl249dZbQ5YbbfHRsw2hxoysrCwcP37cMd8wDHzxxReujpueROfDDz/Ezp07HVd1gikqKoJhGPjggw8AuLNPepsyZQrS09Mdx8pojBMAeP3111FfXz/g+ALELk5GVbKTmJiIWbNmobq62p5mmiaqq6tRXFw8gi2LDRHB8uXL8fLLL2P37t0BlwKD8Xq9AIDs7GwAQHFxMf7zn/84DtKege3rX/96TNo9nDo7O9HQ0IDs7GzMmjULY8eOdcRHfX09mpqa7Phwa38888wzyMjIwPz580OWG23xkZ+fj6ysLEdMnDhxAvv27XPERFtbG+rq6uwyu3fvhmmadnJYXFyMPXv2oLu72y6zc+dOFBQUnJZvTfQkOkeOHMGuXbswYcKEAZfxer3Qdd1+K8dtfdLXxx9/jM8//9xxrIy2OOnx9NNPY9asWSgsLBywbMziJKKPM7vA5s2bxePxSFVVlbz33nty2223SWpqquNuEre44447JCUlRWpqahy39X355ZciInL06FF56KGH5MCBA9LY2CivvPKKTJkyRa688kq7jp5bi6+99lrxer2yY8cOmThx4ml1a3Fv99xzj9TU1EhjY6P861//kpKSEklPT5fjx4+LiHXreW5uruzevVsOHDggxcXFUlxcbC/vtv4Qse5IzM3NlRUrVjimj5b46OjokIMHD8rBgwcFgKxdu1YOHjxo31m0Zs0aSU1NlVdeeUXeeecduf7664Peej5jxgzZt2+f7N27V84//3zHLcVtbW2SmZkpP/7xj+XQoUOyefNmGT9+fNzeUhyqT7q6uuS6666Tc845R7xer2Ns6blj5o033pB169aJ1+uVhoYGef7552XixIly00032etwU590dHTIvffeK7W1tdLY2Ci7du2SmTNnyvnnny+nTp2y6xhNcdKjvb1dxo8fLxs2bAhYfjjjZNQlOyIiv//97yU3N1cSExNl9uzZ8uabb450k2ICQNDHM888IyIiTU1NcuWVV0paWpp4PB4577zz5L777nN8j4qIyAcffCBlZWWSlJQk6enpcs8990h3d/cIbNHQLVy4ULKzsyUxMVHOPvtsWbhwoRw9etSe/9VXX8nPfvYzOeuss2T8+PHyve99T5qbmx11uKk/REReffVVASD19fWO6aMlPl577bWgx0l5ebmIWLef//rXv5bMzEzxeDxy9dVXB/TV559/LosWLZIzzjhDkpOTZcmSJdLR0eEo8/bbb8u3vvUt8Xg8cvbZZ8uaNWuGaxMjFqpPGhsb+x1ber6fqa6uToqKiiQlJUXGjRsnF110kTz88MOOE7+Ie/rkyy+/lGuvvVYmTpwoY8eOlby8PFm6dGnAi+jRFCc9nnzySUlKSpK2traA5YczTjQRkfCvAxERERGdXkbVZ3aIiIho9GGyQ0RERK7GZIeIiIhcjckOERERuRqTHSIiInI1JjtERETkakx2iIiIyNWY7BAREZGrMdkhIiIiV2OyQ0RERK7GZIeIiIhc7f8AyZXXMQRR5L8AAAAASUVORK5CYII=", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" } ], "source": [ - "try:\n", - " session.aggregate('heatmapPlotDS(df2$LAB_TSC, df2$LAB_HDL, 3, 0.25, \"xxx\")')\n", - "except DSError:\n", - " print(session.get_errors()[\"server1\"])\n", - " print(session.get_errors()[\"server1\"].is_client_error())\n", - " print(session.get_errors()[\"server1\"].is_server_error())" + "# make heatmap with x and y\n", + "plt.imshow(data[\"server1\"], aspect=\"auto\")\n", + "plt.title(\"2-D Heat Map (server 1)\")\n", + "plt.show()" ] }, { @@ -1258,7 +431,7 @@ }, { "cell_type": "code", - "execution_count": 21, + "execution_count": 40, "id": "85481de0", "metadata": {}, "outputs": [], diff --git a/uv.lock b/uv.lock index c80ee96..c824777 100644 --- a/uv.lock +++ b/uv.lock @@ -311,7 +311,7 @@ wheels = [ [[package]] name = "datashield" version = "1.0.0" -source = { git = "https://github.com/datashield/datashield-python.git?rev=feat%2Fsessions#800b98450397a461a1bd71412724a78e4df60ca5" } +source = { git = "https://github.com/datashield/datashield-python.git?rev=feat%2Fsessions#596d762a8516e2fd8a7543170e3b70423ac0c077" } [[package]] name = "datashield-opal" @@ -1229,7 +1229,7 @@ wheels = [ [[package]] name = "typer" -version = "0.23.1" +version = "0.24.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "annotated-doc" }, @@ -1237,9 +1237,9 @@ dependencies = [ { name = "rich" }, { name = "shellingham" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/fd/07/b822e1b307d40e263e8253d2384cf98c51aa2368cc7ba9a07e523a1d964b/typer-0.23.1.tar.gz", hash = "sha256:2070374e4d31c83e7b61362fd859aa683576432fd5b026b060ad6b4cd3b86134", size = 120047, upload-time = "2026-02-13T10:04:30.984Z" } +sdist = { url = "https://files.pythonhosted.org/packages/5a/b6/3e681d3b6bb22647509bdbfdd18055d5adc0dce5c5585359fa46ff805fdc/typer-0.24.0.tar.gz", hash = "sha256:f9373dc4eff901350694f519f783c29b6d7a110fc0dcc11b1d7e353b85ca6504", size = 118380, upload-time = "2026-02-16T22:08:48.496Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/d5/91/9b286ab899c008c2cb05e8be99814807e7fbbd33f0c0c960470826e5ac82/typer-0.23.1-py3-none-any.whl", hash = "sha256:3291ad0d3c701cbf522012faccfbb29352ff16ad262db2139e6b01f15781f14e", size = 56813, upload-time = "2026-02-13T10:04:32.008Z" }, + { url = "https://files.pythonhosted.org/packages/85/d0/4da85c2a45054bb661993c93524138ace4956cb075a7ae0c9d1deadc331b/typer-0.24.0-py3-none-any.whl", hash = "sha256:5fc435a9c8356f6160ed6e85a6301fdd6e3d8b2851da502050d1f92c5e9eddc8", size = 56441, upload-time = "2026-02-16T22:08:47.535Z" }, ] [[package]] From 58840e16f749df4acb66d6d0eff5ca587c9f34d0 Mon Sep 17 00:00:00 2001 From: Yannick Marcon Date: Tue, 17 Feb 2026 18:08:45 +0100 Subject: [PATCH 4/7] chore: updated datashield with released version --- datashield_opal/impl.py | 10 ++++++++ examples/datashield.py.ipynb | 48 ++++++++++++++++++------------------ pyproject.toml | 2 +- uv.lock | 10 +++++--- 4 files changed, 42 insertions(+), 28 deletions(-) diff --git a/datashield_opal/impl.py b/datashield_opal/impl.py index 6a8dc57..b0c0b9f 100644 --- a/datashield_opal/impl.py +++ b/datashield_opal/impl.py @@ -140,6 +140,7 @@ def __init__(self, name: str, loginInfo: OpalClient.LoginInfo, profile: str = "d self.restore = restore self.verbose = False self.rsession = None + self.rsession_started = False # # Content listing @@ -188,7 +189,16 @@ def start_session(self, asynchronous: bool = True) -> RSession: return self.rsession self.rsession = OpalRSession(self.client, profile=self.profile, restore=self.restore, verbose=self.verbose) self.rsession.start(asynchronous=asynchronous) + self.rsession_started = not asynchronous or not self.rsession.is_pending() return self.rsession + + def is_session_started(self) -> bool: + if self.rsession is None: + return False + if self.rsession_started: + return True + self.rsession_started = not self.rsession.is_pending() + return self.rsession_started def get_session(self) -> RSession: if self.rsession is None: diff --git a/examples/datashield.py.ipynb b/examples/datashield.py.ipynb index 12e7872..14818f8 100644 --- a/examples/datashield.py.ipynb +++ b/examples/datashield.py.ipynb @@ -99,7 +99,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 2, "id": "56772b7c", "metadata": {}, "outputs": [ @@ -108,7 +108,7 @@ "output_type": "stream", "text": [ "Last message from server1: Ready\n", - "Events from server1: [['PENDING', '2026-02-17T14:01:01.399Z', 'Created'], ['RUNNING', '2026-02-17T14:01:01.427Z', 'Ready']]\n" + "Events from server1: [['PENDING', '2026-02-17T17:07:30.762Z', 'Created'], ['RUNNING', '2026-02-17T17:07:30.788Z', 'Ready']]\n" ] } ], @@ -121,7 +121,7 @@ }, { "cell_type": "code", - "execution_count": 61, + "execution_count": 3, "id": "8c3f1ce1", "metadata": {}, "outputs": [ @@ -131,7 +131,7 @@ "{'server1': ['client'], 'server2': ['client']}" ] }, - "execution_count": 61, + "execution_count": 3, "metadata": {}, "output_type": "execute_result" } @@ -143,7 +143,7 @@ }, { "cell_type": "code", - "execution_count": 62, + "execution_count": 4, "id": "c9f5ae1a", "metadata": {}, "outputs": [ @@ -157,7 +157,7 @@ " 'R6']}" ] }, - "execution_count": 62, + "execution_count": 4, "metadata": {}, "output_type": "execute_result" } @@ -168,7 +168,7 @@ }, { "cell_type": "code", - "execution_count": 63, + "execution_count": 5, "id": "36dbc72d", "metadata": {}, "outputs": [ @@ -178,7 +178,7 @@ "{'server1': ['client', 'df'], 'server2': ['client', 'df']}" ] }, - "execution_count": 63, + "execution_count": 5, "metadata": {}, "output_type": "execute_result" } @@ -190,7 +190,7 @@ }, { "cell_type": "code", - "execution_count": 64, + "execution_count": 6, "id": "ccdcfd91", "metadata": {}, "outputs": [ @@ -200,7 +200,7 @@ "{'server1': 'data.frame', 'server2': 'data.frame'}" ] }, - "execution_count": 64, + "execution_count": 6, "metadata": {}, "output_type": "execute_result" } @@ -211,7 +211,7 @@ }, { "cell_type": "code", - "execution_count": 65, + "execution_count": 7, "id": "9ae41ebc", "metadata": {}, "outputs": [ @@ -244,7 +244,7 @@ " 'PM_BMI_CONTINUOUS']}" ] }, - "execution_count": 65, + "execution_count": 7, "metadata": {}, "output_type": "execute_result" } @@ -255,7 +255,7 @@ }, { "cell_type": "code", - "execution_count": 66, + "execution_count": 8, "id": "ee31c50b", "metadata": {}, "outputs": [ @@ -274,7 +274,7 @@ " 'ValidityMessage': 'VALID ANALYSIS'}}" ] }, - "execution_count": 66, + "execution_count": 8, "metadata": {}, "output_type": "execute_result" } @@ -285,17 +285,17 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 9, "id": "d4cde00d", "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "{'server1': ['df2'], 'server2': ['df2']}" + "{'server1': ['client', 'df', 'df2'], 'server2': ['client', 'df', 'df2']}" ] }, - "execution_count": 4, + "execution_count": 9, "metadata": {}, "output_type": "execute_result" } @@ -307,7 +307,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 10, "id": "f6ed662c", "metadata": {}, "outputs": [], @@ -321,7 +321,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 11, "id": "51dc8812", "metadata": {}, "outputs": [ @@ -344,7 +344,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 12, "id": "48242294", "metadata": {}, "outputs": [], @@ -356,7 +356,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 13, "id": "50165862", "metadata": {}, "outputs": [ @@ -389,7 +389,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 14, "id": "0a98f514", "metadata": {}, "outputs": [], @@ -399,7 +399,7 @@ }, { "cell_type": "code", - "execution_count": 29, + "execution_count": 15, "id": "578293b7", "metadata": {}, "outputs": [ @@ -431,7 +431,7 @@ }, { "cell_type": "code", - "execution_count": 40, + "execution_count": 16, "id": "85481de0", "metadata": {}, "outputs": [], diff --git a/pyproject.toml b/pyproject.toml index 4efb143..f4908c6 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -23,7 +23,7 @@ classifiers = [ "Programming Language :: Python :: 3.13", ] dependencies = [ - "datashield @ git+https://github.com/datashield/datashield-python.git@feat/sessions", + "datashield>=0.2.0", "obiba_opal @ git+https://github.com/obiba/opal-python-client.git@master" ] diff --git a/uv.lock b/uv.lock index c824777..2a28b9a 100644 --- a/uv.lock +++ b/uv.lock @@ -310,8 +310,12 @@ wheels = [ [[package]] name = "datashield" -version = "1.0.0" -source = { git = "https://github.com/datashield/datashield-python.git?rev=feat%2Fsessions#596d762a8516e2fd8a7543170e3b70423ac0c077" } +version = "0.2.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/23/c6/55607d586a930a9ecf8ed16cfe1d70bffd54d97a6afc5c1280df3c8f6116/datashield-0.2.0.tar.gz", hash = "sha256:72a6f9642e6c3242cad1a7892c48f8bb5ee6995ef0549032e9e764af50fe575f", size = 29020, upload-time = "2026-02-17T17:02:39.065Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ca/e7/69bfb5e8104431a45454cfb4ddc8149ce17c7509665a77b490757f6005fb/datashield-0.2.0-py3-none-any.whl", hash = "sha256:ce15bb3cfcb323973ce4b0e16b9ee5d42ca3de47af8becd61e1271985bf5da8c", size = 19003, upload-time = "2026-02-17T17:02:39.737Z" }, +] [[package]] name = "datashield-opal" @@ -335,7 +339,7 @@ test = [ [package.metadata] requires-dist = [ - { name = "datashield", git = "https://github.com/datashield/datashield-python.git?rev=feat%2Fsessions" }, + { name = "datashield", specifier = ">=0.2.0" }, { name = "matplotlib", marker = "extra == 'dev'", specifier = ">=3.10.8" }, { name = "obiba-opal", git = "https://github.com/obiba/opal-python-client.git?rev=master" }, { name = "pandas", marker = "extra == 'dev'", specifier = ">=2.3.3" }, From 9dc2f0392a73e1f4a99199f34f608b6a4e0e946a Mon Sep 17 00:00:00 2001 From: Yannick Marcon Date: Wed, 18 Feb 2026 09:38:16 +0100 Subject: [PATCH 5/7] feat: check for credentials on new connection --- datashield_opal/impl.py | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/datashield_opal/impl.py b/datashield_opal/impl.py index b0c0b9f..2e7dfc1 100644 --- a/datashield_opal/impl.py +++ b/datashield_opal/impl.py @@ -142,6 +142,14 @@ def __init__(self, name: str, loginInfo: OpalClient.LoginInfo, profile: str = "d self.rsession = None self.rsession_started = False + def check_user(self) -> bool: + """Check if the user can authenticate by trying to retrieve the current subject profile.""" + try: + self._get("/system/subject-profile/_current").fail_on_error().send() + return True + except Exception: + return False + # # Content listing # @@ -191,7 +199,7 @@ def start_session(self, asynchronous: bool = True) -> RSession: self.rsession.start(asynchronous=asynchronous) self.rsession_started = not asynchronous or not self.rsession.is_pending() return self.rsession - + def is_session_started(self) -> bool: if self.rsession is None: return False @@ -435,7 +443,11 @@ class OpalDriver(DSDriver): def new_connection(cls, args: DSLoginInfo, restore: str = None) -> DSConnection: namedArgs = Namespace(opal=args.url, user=args.user, password=args.password, token=args.token) loginInfo = OpalClient.LoginInfo.parse(namedArgs) - return OpalConnection(args.name, loginInfo, args.profile, restore) + conn = OpalConnection(args.name, loginInfo, args.profile, restore) + if not conn.check_user(): + creds = f"user {args.user}" if args.user else "token" + raise OpalDSError(ValueError(f"Failed to authenticate on {args.url} with {creds}")) + return conn class OpalResult(DSResult): From e92d1e297d499e616e96ba22cf39ffc3f23b4409 Mon Sep 17 00:00:00 2001 From: Yannick Marcon Date: Wed, 18 Feb 2026 11:19:40 +0100 Subject: [PATCH 6/7] chore: updated resource test --- tests/test_api_analysis.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_api_analysis.py b/tests/test_api_analysis.py index 6d144a1..5e486f3 100644 --- a/tests/test_api_analysis.py +++ b/tests/test_api_analysis.py @@ -48,7 +48,7 @@ def test_assign_table(self): def test_assign_resources(self): try: self.session.assign_resource( - "client", resources={"server1": "RSRC.CNSIM1", "server2": "RSRC.CNSIM1"}, asynchronous=False + "client", resources={"server1": "RSRC.CNSIM1", "server2": "RSRC.CNSIM2"}, asynchronous=False ) rval = self.session.ls() assert len(rval) == 2 From 0843938b556284ef4748946ae6e4599129835ded Mon Sep 17 00:00:00 2001 From: Yannick Marcon Date: Wed, 18 Feb 2026 11:25:07 +0100 Subject: [PATCH 7/7] chore: updated released versions of datashield and obiba-opal --- pyproject.toml | 4 ++-- uv.lock | 12 ++++++++---- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index f4908c6..49c9e17 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "datashield-opal" -version = "1.0.0" +version = "0.2.0" description = "" authors = [ {name = "Yannick Marcon", email = "yannick.marcon@obiba.org"} @@ -24,7 +24,7 @@ classifiers = [ ] dependencies = [ "datashield>=0.2.0", - "obiba_opal @ git+https://github.com/obiba/opal-python-client.git@master" + "obiba_opal>=6.0.2" ] [project.optional-dependencies] diff --git a/uv.lock b/uv.lock index 2a28b9a..c81f2a0 100644 --- a/uv.lock +++ b/uv.lock @@ -319,7 +319,7 @@ wheels = [ [[package]] name = "datashield-opal" -version = "1.0.0" +version = "0.2.0" source = { editable = "." } dependencies = [ { name = "datashield" }, @@ -341,7 +341,7 @@ test = [ requires-dist = [ { name = "datashield", specifier = ">=0.2.0" }, { name = "matplotlib", marker = "extra == 'dev'", specifier = ">=3.10.8" }, - { name = "obiba-opal", git = "https://github.com/obiba/opal-python-client.git?rev=master" }, + { name = "obiba-opal", specifier = ">=6.0.2" }, { name = "pandas", marker = "extra == 'dev'", specifier = ">=2.3.3" }, { name = "pytest", marker = "extra == 'test'", specifier = ">=7.2.2" }, { name = "ruff", marker = "extra == 'dev'", specifier = ">=0.10.0" }, @@ -793,13 +793,17 @@ wheels = [ [[package]] name = "obiba-opal" -version = "6.0.0" -source = { git = "https://github.com/obiba/opal-python-client.git?rev=master#181169932656fd0afeef7051750e6b7338847c21" } +version = "6.0.2" +source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "requests" }, { name = "typer" }, { name = "urllib3" }, ] +sdist = { url = "https://files.pythonhosted.org/packages/0c/42/89cac16266502d501355523692fd1d872ffb85185661eabcb740acd90e83/obiba_opal-6.0.2.tar.gz", hash = "sha256:e66b28119d9eeef5217aca96450811592a86dc9519f455ecd7aa7c7639b06fda", size = 124112, upload-time = "2026-02-18T10:08:30.149Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/75/b1/a7b653911eeb8e3f44a18e138b2095fd7f93a7b691243b003d215ac6f615/obiba_opal-6.0.2-py3-none-any.whl", hash = "sha256:41c714a3612f81c52b42a8ebf038d876672bf6c7da48ad653466d9b81b397eb3", size = 73491, upload-time = "2026-02-18T10:08:31.526Z" }, +] [[package]] name = "packaging"