From e4145c5cb7451b1c142aec82cd42c23ae1e9f060 Mon Sep 17 00:00:00 2001 From: stonebig Date: Sat, 14 Sep 2024 08:44:34 +0200 Subject: [PATCH 001/305] WinPython 2024-04 final --- changelogs/WinPython-64bit-3.12.6.0.md | 550 ++++++++++++++++++ .../WinPython-64bit-3.12.6.0_History.md | 187 ++++++ changelogs/WinPythondot-64bit-3.11.9.0.md | 29 + .../WinPythondot-64bit-3.11.9.0_History.md | 27 + changelogs/WinPythondot-64bit-3.12.6.0.md | 29 + .../WinPythondot-64bit-3.12.6.0_History.md | 18 + changelogs/WinPythondot-64bit-3.13.0.1.md | 30 + .../WinPythondot-64bit-3.13.0.1_History.md | 17 + changelogs/WinPythonfree-64bit-3.13.0.1.md | 47 ++ .../WinPythonfree-64bit-3.13.0.1_History.md | 24 + changelogs/WinPythonslim-64bit-3.12.6.0.md | 528 +++++++++++++++++ .../WinPythonslim-64bit-3.12.6.0_History.md | 195 +++++++ changelogs/md5_sha1.txt | 14 +- 13 files changed, 1694 insertions(+), 1 deletion(-) create mode 100644 changelogs/WinPython-64bit-3.12.6.0.md create mode 100644 changelogs/WinPython-64bit-3.12.6.0_History.md create mode 100644 changelogs/WinPythondot-64bit-3.11.9.0.md create mode 100644 changelogs/WinPythondot-64bit-3.11.9.0_History.md create mode 100644 changelogs/WinPythondot-64bit-3.12.6.0.md create mode 100644 changelogs/WinPythondot-64bit-3.12.6.0_History.md create mode 100644 changelogs/WinPythondot-64bit-3.13.0.1.md create mode 100644 changelogs/WinPythondot-64bit-3.13.0.1_History.md create mode 100644 changelogs/WinPythonfree-64bit-3.13.0.1.md create mode 100644 changelogs/WinPythonfree-64bit-3.13.0.1_History.md create mode 100644 changelogs/WinPythonslim-64bit-3.12.6.0.md create mode 100644 changelogs/WinPythonslim-64bit-3.12.6.0_History.md diff --git a/changelogs/WinPython-64bit-3.12.6.0.md b/changelogs/WinPython-64bit-3.12.6.0.md new file mode 100644 index 00000000..04bfa915 --- /dev/null +++ b/changelogs/WinPython-64bit-3.12.6.0.md @@ -0,0 +1,550 @@ +## WinPython 3.12.6.0 + +The following packages are included in WinPython-64bit v3.12.6.0 . + +
+ +### Tools + +Name | Version | Description +-----|---------|------------ +[Nodejs](https://nodejs.org) | v20.15.1 | a JavaScript runtime built on Chrome's V8 JavaScript engine +[npmjs](https://www.npmjs.com/) | 10.7.0 | a package manager for JavaScript +[Pandoc](https://pandoc.org/) | 3.1.9 | a universal document converter + +### Python packages + +Name | Version | Description +-----|---------|------------ +[Python](http://www.python.org/) | 3.12.6 | Python programming language with standard library +[about_time](https://pypi.org/project/about_time) | 4.2.1 | Easily measure timing and throughput of code blocks, with beautiful human friendly representations. +[absl_py](https://pypi.org/project/absl_py) | 2.0.0 | Abseil Python Common Libraries, see https://github.com/abseil/abseil-py. +[accelerate](https://pypi.org/project/accelerate) | 0.28.0 | Accelerate +[adbc_driver_manager](https://pypi.org/project/adbc_driver_manager) | 0.11.0 | A generic entrypoint for ADBC drivers. +[adodbapi](https://pypi.org/project/adodbapi) | 2.6.1.3 | A pure Python package implementing PEP 249 DB-API using Microsoft ADO. +[affine](https://pypi.org/project/affine) | 2.3.1 | Matrices describing affine transformation of the plane. +[aiofiles](https://pypi.org/project/aiofiles) | 23.2.1 | File support for asyncio. +[aiohttp](https://pypi.org/project/aiohttp) | 3.9.5 | Async http client/server framework (asyncio) +[aiosignal](https://pypi.org/project/aiosignal) | 1.3.1 | aiosignal: a list of registered asynchronous callbacks +[aiosqlite](https://pypi.org/project/aiosqlite) | 0.20.0 | asyncio bridge to the standard sqlite3 module +[alabaster](https://pypi.org/project/alabaster) | 0.7.16 | A light, configurable Sphinx theme +[alembic](https://pypi.org/project/alembic) | 1.13.1 | A database migration tool for SQLAlchemy. +[alive_progress](https://pypi.org/project/alive_progress) | 3.1.5 | A new kind of Progress Bar, with real-time throughput, ETA, and very cool animations! +[altair](https://pypi.org/project/altair) | 5.4.1 | Vega-Altair: A declarative statistical visualization library for Python. +[aniso8601](https://pypi.org/project/aniso8601) | 9.0.1 | A library for parsing ISO 8601 strings. +[annotated_types](https://pypi.org/project/annotated_types) | 0.6.0 | Reusable constraint types to use with typing.Annotated +[ansicolors](https://pypi.org/project/ansicolors) | 1.1.8 | ANSI colors for Python +[anyio](https://pypi.org/project/anyio) | 4.4.0 | High level compatibility layer for multiple asynchronous event loop implementations +[anywidget](https://pypi.org/project/anywidget) | 0.9.12 | custom jupyter widgets made easy +[appdirs](https://pypi.org/project/appdirs) | 1.4.4 | A small Python module for determining appropriate platform-specific dirs, e.g. a "user data dir". +[argon2_cffi](https://pypi.org/project/argon2_cffi) | 23.1.0 | Argon2 for Python +[argon2_cffi_bindings](https://pypi.org/project/argon2_cffi_bindings) | 21.2.0 | Low-level CFFI bindings for Argon2 +[array_api_compat](https://pypi.org/project/array_api_compat) | 1.8 | A wrapper around NumPy and other array libraries to make them compatible with the Array API standard +[arrow](https://pypi.org/project/arrow) | 1.3.0 | Better dates & times for Python +[asgi_csrf](https://pypi.org/project/asgi_csrf) | 0.9 | ASGI middleware for protecting against CSRF attacks +[asgiref](https://pypi.org/project/asgiref) | 3.8.1 | ASGI specs, helper code, and adapters +[asn1crypto](https://pypi.org/project/asn1crypto) | 1.5.1 | Fast ASN.1 parser and serializer with definitions for private keys, public keys, certificates, CRL, OCSP, CMS, PKCS#3, PKCS#7, PKCS#8, PKCS#12, +[asteval](https://pypi.org/project/asteval) | 0.9.31 | Safe, minimalistic evaluator of python expression using ast module +[astroid](https://pypi.org/project/astroid) | 3.1.0 | An abstract syntax tree for Python with inference support. +[astropy](https://pypi.org/project/astropy) | 6.1.0 | Astronomy and astrophysics core library +[astropy_iers_data](https://pypi.org/project/astropy_iers_data) | 0.2024.4.29.0.28.48 | IERS Earth Rotation and Leap Second tables for the astropy core package +[asttokens](https://pypi.org/project/asttokens) | 2.4.1 | Annotate AST trees with source code positions +[async_lru](https://pypi.org/project/async_lru) | 2.0.4 | Simple LRU cache for asyncio +[atomicwrites](https://pypi.org/project/atomicwrites) | 1.4.0 | Atomic file writes. +[attrs](https://pypi.org/project/attrs) | 23.2.0 | Classes Without Boilerplate +[autograd](https://pypi.org/project/autograd) | 1.6.2 | Efficiently computes derivatives of numpy code. +[autopep8](https://pypi.org/project/autopep8) | 2.0.4 | A tool that automatically formats Python code to conform to the PEP 8 style guide +[azure_core](https://pypi.org/project/azure_core) | 1.30.2 | Microsoft Azure Core Library for Python +[azure_cosmos](https://pypi.org/project/azure_cosmos) | 4.7.0 | Microsoft Azure Cosmos Client Library for Python +[azure_identity](https://pypi.org/project/azure_identity) | 1.16.1 | Microsoft Azure Identity Library for Python +[babel](https://pypi.org/project/babel) | 2.15.0 | Internationalization utilities +[baresql](https://pypi.org/project/baresql) | 0.8.0 | playing SQL directly on Python datas +[bcrypt](https://pypi.org/project/bcrypt) | 4.0.1 | Modern password hashing for your software and your servers +[beautifulsoup4](https://pypi.org/project/beautifulsoup4) | 4.12.2 | Screen-scraping library +[binaryornot](https://pypi.org/project/binaryornot) | 0.4.4 | Ultra-lightweight pure Python package to check if a file is binary or text. +[black](https://pypi.org/project/black) | 24.8.0 | The uncompromising code formatter. +[bleach](https://pypi.org/project/bleach) | 6.1.0 | An easy safelist-based HTML-sanitizing tool. +[blinker](https://pypi.org/project/blinker) | 1.7.0 | Fast, simple object-to-object and broadcast signaling +[bokeh](https://pypi.org/project/bokeh) | 3.5.1 | Interactive plots and applications in the browser from Python +[branca](https://pypi.org/project/branca) | 0.7.2 | Generate complex HTML+JS pages with Python +[brotli](https://pypi.org/project/brotli) | 1.1.0 | Python bindings for the Brotli compression library +[build](https://pypi.org/project/build) | 1.2.1 | A simple, correct Python build frontend +[cachelib](https://pypi.org/project/cachelib) | 0.13.0 | A collection of cache libraries in the same API interface. +[cachetools](https://pypi.org/project/cachetools) | 5.3.3 | Extensible memoizing collections and decorators +[cartopy](https://pypi.org/project/cartopy) | 0.23.0 | A Python library for cartographic visualizations with Matplotlib +[certifi](https://pypi.org/project/certifi) | 2024.6.2 | Python package for providing Mozilla's CA Bundle. +[cffi](https://pypi.org/project/cffi) | 1.16.0 | Foreign Function Interface for Python calling C code. +[cftime](https://pypi.org/project/cftime) | 1.6.3 | Time-handling functionality from netcdf4-python +[chardet](https://pypi.org/project/chardet) | 5.2.0 | Universal encoding detector for Python 3 +[charset_normalizer](https://pypi.org/project/charset_normalizer) | 3.3.2 | The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet. +[clarabel](https://pypi.org/project/clarabel) | 0.9.0 | Clarabel Conic Interior Point Solver for Rust / Python +[click](https://pypi.org/project/click) | 8.1.7 | Composable command line interface toolkit +[click_default_group](https://pypi.org/project/click_default_group) | 1.2.4 | click_default_group +[click_plugins](https://pypi.org/project/click_plugins) | 1.1.1 | An extension module for click to enable registering CLI commands via setuptools entry-points. +[cligj](https://pypi.org/project/cligj) | 0.7.2 | Click params for commmand line interfaces to GeoJSON +[cloudpickle](https://pypi.org/project/cloudpickle) | 3.0.0 | Pickler class to extend the standard pickle.Pickler functionality +[clr_loader](https://pypi.org/project/clr_loader) | 0.2.6 | Generic pure Python loader for .NET runtimes +[clrmagic](https://pypi.org/project/clrmagic) | 0.0.1a2 | IPython cell magic to use .NET languages +[cma](https://pypi.org/project/cma) | 3.2.2 | CMA-ES, Covariance Matrix Adaptation Evolution Strategy for non-linear numerical optimization in Python +[colorama](https://pypi.org/project/colorama) | 0.4.6 | Cross-platform colored terminal text. +[colorcet](https://pypi.org/project/colorcet) | 3.1.0 | Collection of perceptually uniform colormaps +[colorlog](https://pypi.org/project/colorlog) | 6.8.2 | Add colours to the output of Python's logging module. +[comm](https://pypi.org/project/comm) | 0.2.2 | Jupyter Python Comm implementation, for usage in ipykernel, xeus-python etc. +[contourpy](https://pypi.org/project/contourpy) | 1.2.1 | Python library for calculating contours of 2D quadrilateral grids +[cookiecutter](https://pypi.org/project/cookiecutter) | 2.6.0 | A command-line utility that creates projects from project templates, e.g +[coverage](https://pypi.org/project/coverage) | 7.5.3 | Code coverage measurement for Python +[cryptography](https://pypi.org/project/cryptography) | 41.0.5 | cryptography is a package which provides cryptographic recipes and primitives to Python developers. +[cvxopt](https://pypi.org/project/cvxopt) | 1.3.2 | Convex optimization package +[cvxpy](https://pypi.org/project/cvxpy) | 1.5.0 | A domain-specific language for modeling convex optimization problems in Python. +[cycler](https://pypi.org/project/cycler) | 0.12.1 | Composable style cycles +[cython](https://pypi.org/project/cython) | 3.0.11 | The Cython compiler for writing C extensions in the Python language. +[cytoolz](https://pypi.org/project/cytoolz) | 0.12.3 | Cython implementation of Toolz: High performance functional utilities +[dask](https://pypi.org/project/dask) | 2024.7.1 | Parallel PyData with Task Scheduling +[dask_expr](https://pypi.org/project/dask_expr) | 1.1.9 | High Level Expressions for Dask +[datasette](https://pypi.org/project/datasette) | 0.64.8 | An open source multi-tool for exploring and publishing data +[datasette_graphql](https://pypi.org/project/datasette_graphql) | 2.2 | Datasette plugin providing an automatic GraphQL API for your SQLite databases +[datashader](https://pypi.org/project/datashader) | 0.16.3 | Data visualization toolchain based on aggregating into a grid +[db_py](https://pypi.org/project/db_py) | 0.5.4b1 | a db package that doesn't suck +[deap](https://pypi.org/project/deap) | 1.4.1 | Distributed Evolutionary Algorithms in Python +[debugpy](https://pypi.org/project/debugpy) | 1.8.0 | An implementation of the Debug Adapter Protocol for Python +[decorator](https://pypi.org/project/decorator) | 5.1.1 | Decorators for Humans +[defusedxml](https://pypi.org/project/defusedxml) | 0.7.1 | XML bomb protection for Python stdlib modules +[deprecated](https://pypi.org/project/deprecated) | 1.2.13 | Python @deprecated decorator to deprecate old python classes, functions or methods. +[diff_match_patch](https://pypi.org/project/diff_match_patch) | 20230430 | Diff Match and Patch +[dill](https://pypi.org/project/dill) | 0.3.7 | serialize all of Python +[dirty_cat](https://pypi.org/project/dirty_cat) | 0.4.1 | Machine learning with dirty categories. +[distlib](https://pypi.org/project/distlib) | 0.3.8 | Distribution utilities +[distributed](https://pypi.org/project/distributed) | 2024.7.1 | Distributed scheduler for Dask +[distro](https://pypi.org/project/distro) | 1.8.0 | Distro - an OS platform information API +[django](https://pypi.org/project/django) | 5.0.7 | A high-level Python web framework that encourages rapid development and clean, pragmatic design. +[dnspython](https://pypi.org/project/dnspython) | 2.6.1 | DNS toolkit +[docopt](https://pypi.org/project/docopt) | 0.6.2 | Pythonic argument parser, that will make you smile +[docstring_to_markdown](https://pypi.org/project/docstring_to_markdown) | 0.13 | On the fly conversion of Python docstrings to markdown +[docutils](https://pypi.org/project/docutils) | 0.20.1 | Docutils -- Python Documentation Utilities +[duckdb](https://pypi.org/project/duckdb) | 1.0.0 | DuckDB in-process database +[ecos](https://pypi.org/project/ecos) | 2.0.13 | This is the Python package for ECOS: Embedded Cone Solver. See Github page for more information. +[email_validator](https://pypi.org/project/email_validator) | 2.2.0 | A robust email address syntax and deliverability validation library. +[entrypoints](https://pypi.org/project/entrypoints) | 0.4 | Discover and load entry points from installed packages. +[et_xmlfile](https://pypi.org/project/et_xmlfile) | 1.1.0 | An implementation of lxml.xmlfile for the standard library +[executing](https://pypi.org/project/executing) | 2.0.1 | Get the currently executing AST node of a frame, and other information +[fast_histogram](https://pypi.org/project/fast_histogram) | 0.14 | Fast simple 1D and 2D histograms +[fastapi](https://pypi.org/project/fastapi) | 0.111.1 | FastAPI framework, high performance, easy to learn, fast to code, ready for production +[fastapi_cli](https://pypi.org/project/fastapi_cli) | 0.0.4 | Run and manage FastAPI apps from the command line with FastAPI CLI. 🚀 +[fastjsonschema](https://pypi.org/project/fastjsonschema) | 2.18.0 | Fastest Python implementation of JSON schema +[filelock](https://pypi.org/project/filelock) | 3.14.0 | A platform independent file lock. +[filterpy](https://pypi.org/project/filterpy) | 1.4.5 | Kalman filtering and optimal estimation library +[fiona](https://pypi.org/project/fiona) | 1.9.5 | Fiona reads and writes spatial data files +[flake8](https://pypi.org/project/flake8) | 7.1.1 | the modular source code checker: pep8 pyflakes and co +[flask](https://pypi.org/project/flask) | 3.0.3 | A simple framework for building complex web applications. +[flask_mail](https://pypi.org/project/flask_mail) | 0.9.1 | Flask extension for sending email +[flask_session](https://pypi.org/project/flask_session) | 0.5.0 | Server-side session support for Flask +[flask_sqlalchemy](https://pypi.org/project/flask_sqlalchemy) | 3.0.5 | Add SQLAlchemy support to your Flask application. +[flit](https://pypi.org/project/flit) | 3.9.0 | A simple packaging tool for simple packages. +[flit_core](https://pypi.org/project/flit_core) | 3.9.0 | Distribution-building parts of Flit. See flit package for more information +[folium](https://pypi.org/project/folium) | 0.17.0 | Make beautiful maps with Leaflet.js & Python +[fonttools](https://pypi.org/project/fonttools) | 4.51.0 | Tools to manipulate font files +[formlayout](https://pypi.org/project/formlayout) | 1.2.1a1 | The most easy way to create Qt form dialogs and widgets with Python +[fqdn](https://pypi.org/project/fqdn) | 1.5.1 | Validates fully-qualified domain names against RFC 1123, so that they are acceptable to modern bowsers +[frozenlist](https://pypi.org/project/frozenlist) | 1.4.1 | A list-like structure which implements collections.abc.MutableSequence +[fsspec](https://pypi.org/project/fsspec) | 2024.6.1 | File-system specification +[future](https://pypi.org/project/future) | 0.18.2 | Clean single-source support for Python 3 and 2 +[fuzzywuzzy](https://pypi.org/project/fuzzywuzzy) | 0.18.0 | Fuzzy string matching in python +[geographiclib](https://pypi.org/project/geographiclib) | 2.0 | The geodesic routines from GeographicLib +[geopandas](https://pypi.org/project/geopandas) | 0.14.4 | Geographic pandas extensions +[geopy](https://pypi.org/project/geopy) | 2.4.1 | Python Geocoding Toolbox +[gitdb](https://pypi.org/project/gitdb) | 4.0.10 | Git Object Database +[gitpython](https://pypi.org/project/gitpython) | 3.1.32 | GitPython is a Python library used to interact with Git repositories +[grapheme](https://pypi.org/project/grapheme) | 0.6.0 | Unicode grapheme helpers +[graphene](https://pypi.org/project/graphene) | 3.3 | GraphQL Framework for Python +[graphql_core](https://pypi.org/project/graphql_core) | 3.2.3 | GraphQL implementation for Python, a port of GraphQL.js, the JavaScript reference implementation for GraphQL. +[graphql_relay](https://pypi.org/project/graphql_relay) | 3.2.0 | Relay library for graphql-core +[greenlet](https://pypi.org/project/greenlet) | 3.0.3 | Lightweight in-process concurrent programming +[guidata](https://pypi.org/project/guidata) | 3.6.2 | Automatic GUI generation for easy dataset editing and display +[h11](https://pypi.org/project/h11) | 0.14.0 | A pure-Python, bring-your-own-I/O implementation of HTTP/1.1 +[h2](https://pypi.org/project/h2) | 4.1.0 | HTTP/2 State-Machine based protocol implementation +[h5py](https://pypi.org/project/h5py) | 3.10.0 | Read and write HDF5 files from Python +[hatchling](https://pypi.org/project/hatchling) | 1.25.0 | Modern, extensible Python build backend +[holoviews](https://pypi.org/project/holoviews) | 1.19.1 | A high-level plotting API for the PyData ecosystem built on HoloViews. +[hpack](https://pypi.org/project/hpack) | 4.0.0 | Pure-Python HPACK header compression +[html5lib](https://pypi.org/project/html5lib) | 1.1 | HTML parser based on the WHATWG HTML specification +[httpcore](https://pypi.org/project/httpcore) | 1.0.5 | A minimal low-level HTTP client. +[httpie](https://pypi.org/project/httpie) | 3.2.3 | HTTPie: modern, user-friendly command-line HTTP client for the API era. +[httptools](https://pypi.org/project/httptools) | 0.6.1 | A collection of framework independent HTTP protocol utils. +[httpx](https://pypi.org/project/httpx) | 0.27.0 | The next generation HTTP client. +[huggingface_hub](https://pypi.org/project/huggingface_hub) | 0.24.5 | Client library to download and publish models, datasets and other repos on the huggingface.co hub +[hupper](https://pypi.org/project/hupper) | 1.12 | Integrated process monitor for developing and reloading daemons. +[hvplot](https://pypi.org/project/hvplot) | 0.10.0 | A high-level plotting API for the PyData ecosystem built on HoloViews. +[hypercorn](https://pypi.org/project/hypercorn) | 0.16.0 | A ASGI Server based on Hyper libraries and inspired by Gunicorn +[hyperframe](https://pypi.org/project/hyperframe) | 6.0.1 | HTTP/2 framing layer for Python +[hypothesis](https://pypi.org/project/hypothesis) | 6.108.5 | A library for property-based testing +[idna](https://pypi.org/project/idna) | 3.7 | Internationalized Domain Names in Applications (IDNA) +[imageio](https://pypi.org/project/imageio) | 2.33.1 | Library for reading and writing a wide range of image, video, scientific, and volumetric data formats. +[imagesize](https://pypi.org/project/imagesize) | 1.4.1 | Getting image size from png/jpeg/jpeg2000/gif file +[imbalanced_learn](https://pypi.org/project/imbalanced_learn) | 0.12.3 | Toolbox for imbalanced dataset in machine learning. +[immutabledict](https://pypi.org/project/immutabledict) | 4.2.0 | Immutable wrapper around dictionaries (a fork of frozendict) +[importlib_metadata](https://pypi.org/project/importlib_metadata) | 7.1.0 | Read metadata from Python packages +[inflection](https://pypi.org/project/inflection) | 0.5.1 | A port of Ruby on Rails inflector to Python +[iniconfig](https://pypi.org/project/iniconfig) | 2.0.0 | brain-dead simple config-ini parsing +[intervaltree](https://pypi.org/project/intervaltree) | 3.0.2 | Editable interval tree data structure for Python 2 and 3 +[ipycanvas](https://pypi.org/project/ipycanvas) | 0.13.2 | Interactive widgets library exposing the browser's Canvas API +[ipykernel](https://pypi.org/project/ipykernel) | 6.29.5 | IPython Kernel for Jupyter +[ipyleaflet](https://pypi.org/project/ipyleaflet) | 0.19.2 | A Jupyter widget for dynamic Leaflet maps +[ipympl](https://pypi.org/project/ipympl) | 0.9.4 | Matplotlib Jupyter Extension +[ipython](https://pypi.org/project/ipython) | 8.26.0 | IPython: Productive Interactive Computing +[ipython_genutils](https://pypi.org/project/ipython_genutils) | 0.2.0 | Vestigial utilities from IPython +[ipython_sql](https://pypi.org/project/ipython_sql) | 0.5.0 | RDBMS access via IPython +[ipywidgets](https://pypi.org/project/ipywidgets) | 8.1.5 | Jupyter interactive widgets +[isoduration](https://pypi.org/project/isoduration) | 20.11.0 | Operations with ISO 8601 durations +[isort](https://pypi.org/project/isort) | 5.13.2 | A Python utility / library to sort Python imports. +[itsdangerous](https://pypi.org/project/itsdangerous) | 2.2.0 | Safely pass data to untrusted environments and back. +[janus](https://pypi.org/project/janus) | 1.0.0 | Mixed sync-async queue to interoperate between asyncio tasks and classic threads +[jaraco_classes](https://pypi.org/project/jaraco_classes) | 3.4.0 | Utility functions for Python class constructs +[jaraco_context](https://pypi.org/project/jaraco_context) | 5.3.0 | Useful decorators and context managers +[jaraco_functools](https://pypi.org/project/jaraco_functools) | 4.0.1 | Functools like those found in stdlib +[jedi](https://pypi.org/project/jedi) | 0.19.1 | An autocompletion tool for Python that can be used for text editors. +[jellyfish](https://pypi.org/project/jellyfish) | 1.0.3 | Approximate and phonetic matching of strings. +[jinja2](https://pypi.org/project/jinja2) | 3.1.2 | A very fast and expressive template engine. +[jiter](https://pypi.org/project/jiter) | 0.5.0 | Fast iterable JSON parser. +[joblib](https://pypi.org/project/joblib) | 1.4.2 | Lightweight pipelining with Python functions +[json5](https://pypi.org/project/json5) | 0.9.14 | A Python implementation of the JSON5 data format. +[jsonpointer](https://pypi.org/project/jsonpointer) | 2.4 | Identify specific nodes in a JSON document (RFC 6901) +[jsonschema](https://pypi.org/project/jsonschema) | 4.19.2 | An implementation of JSON Schema validation for Python +[jsonschema_specifications](https://pypi.org/project/jsonschema_specifications) | 2023.12.1 | The JSON Schema meta-schemas and vocabularies, exposed as a Registry +[julia](https://pypi.org/project/julia) | 0.6.2 | Julia/Python bridge with IPython support. +[jupyter](https://pypi.org/project/jupyter) | 1.0.0 | Jupyter metapackage. Install all the Jupyter components in one go. +[jupyter_bokeh](https://pypi.org/project/jupyter_bokeh) | 4.0.5 | A Jupyter extension for rendering Bokeh content. +[jupyter_client](https://pypi.org/project/jupyter_client) | 8.6.2 | Jupyter protocol implementation and client libraries +[jupyter_console](https://pypi.org/project/jupyter_console) | 6.6.3 | Jupyter terminal console +[jupyter_core](https://pypi.org/project/jupyter_core) | 5.7.2 | Jupyter core package. A base package on which Jupyter projects rely. +[jupyter_events](https://pypi.org/project/jupyter_events) | 0.10.0 | Jupyter Event System library +[jupyter_leaflet](https://pypi.org/project/jupyter_leaflet) | 0.19.2 | ipyleaflet extensions for JupyterLab and Jupyter Notebook +[jupyter_lsp](https://pypi.org/project/jupyter_lsp) | 2.2.5 | Multi-Language Server WebSocket proxy for Jupyter Notebook/Lab server +[jupyter_server](https://pypi.org/project/jupyter_server) | 2.14.2 | The backend—i.e. core services, APIs, and REST endpoints—to Jupyter web applications. +[jupyter_server_terminals](https://pypi.org/project/jupyter_server_terminals) | 0.5.3 | A Jupyter Server Extension Providing Terminals. +[jupyterlab](https://pypi.org/project/jupyterlab) | 4.2.5 | JupyterLab computational environment +[jupyterlab_pygments](https://pypi.org/project/jupyterlab_pygments) | 0.3.0 | Pygments theme using JupyterLab CSS variables +[jupyterlab_server](https://pypi.org/project/jupyterlab_server) | 2.27.3 | A set of server components for JupyterLab and JupyterLab like applications. +[jupyterlab_widgets](https://pypi.org/project/jupyterlab_widgets) | 3.0.13 | Jupyter interactive widgets for JupyterLab +[keras](https://pypi.org/project/keras) | 3.5.0 | Multi-backend Keras. +[keyring](https://pypi.org/project/keyring) | 25.2.1 | Store and access your passwords safely. +[kiwisolver](https://pypi.org/project/kiwisolver) | 1.4.5 | A fast implementation of the Cassowary constraint solver +[kornia](https://pypi.org/project/kornia) | 0.7.2 | Open Source Differentiable Computer Vision Library for PyTorch +[kornia_rs](https://pypi.org/project/kornia_rs) | 0.1.3 | Low level implementations for computer vision in Rust +[lazy_loader](https://pypi.org/project/lazy_loader) | 0.4 | Makes it easy to load subpackages and functions on demand. +[lightning](https://pypi.org/project/lightning) | 2.4.0 | The Deep Learning framework to train, deploy, and ship AI products Lightning fast. +[lightning_utilities](https://pypi.org/project/lightning_utilities) | 0.11.6 | Lightning toolbox for across the our ecosystem. +[linkify_it_py](https://pypi.org/project/linkify_it_py) | 2.0.2 | Links recognition library with FULL unicode support. +[llvmlite](https://pypi.org/project/llvmlite) | 0.43.0 | lightweight wrapper around basic LLVM functionality +[lmfit](https://pypi.org/project/lmfit) | 1.3.1 | Least-Squares Minimization with Bounds and Constraints +[locket](https://pypi.org/project/locket) | 1.0.0 | File-based locks for Python on Linux and Windows +[lxml](https://pypi.org/project/lxml) | 5.2.2 | Powerful and Pythonic XML processing library combining libxml2/libxslt with the ElementTree API. +[mako](https://pypi.org/project/mako) | 1.3.5 | A super-fast templating language that borrows the best ideas from the existing templating languages. +[markdown](https://pypi.org/project/markdown) | 3.5.1 | Python implementation of John Gruber's Markdown. +[markdown_it_py](https://pypi.org/project/markdown_it_py) | 2.2.0 | Python port of markdown-it. Markdown parsing, done right! +[markupsafe](https://pypi.org/project/markupsafe) | 2.1.1 | Safely add untrusted strings to HTML/XML markup. +[matplotlib](https://pypi.org/project/matplotlib) | 3.9.2 | Python plotting package +[matplotlib_inline](https://pypi.org/project/matplotlib_inline) | 0.1.7 | Inline Matplotlib backend for Jupyter +[maturin](https://pypi.org/project/maturin) | 1.7.0 | Build and publish crates with pyo3, cffi and uniffi bindings as well as rust binaries as python packages +[mccabe](https://pypi.org/project/mccabe) | 0.7.0 | McCabe checker, plugin for flake8 +[mdit_py_plugins](https://pypi.org/project/mdit_py_plugins) | 0.3.5 | Collection of plugins for markdown-it-py +[mdurl](https://pypi.org/project/mdurl) | 0.1.2 | Markdown URL utilities +[mercantile](https://pypi.org/project/mercantile) | 1.2.1 | Web mercator XYZ tile utilities +[mergedeep](https://pypi.org/project/mergedeep) | 1.3.4 | A deep merge function for 🐍. +[missingno](https://pypi.org/project/missingno) | 0.5.1 | Missing data visualization module for Python. +[mistune](https://pypi.org/project/mistune) | 2.0.5 | A sane Markdown parser with useful plugins and renderers +[mizani](https://pypi.org/project/mizani) | 0.11.4 | Scales for Python +[ml_dtypes](https://pypi.org/project/ml_dtypes) | 0.4.0 | +[mlxtend](https://pypi.org/project/mlxtend) | 0.22.0 | Machine Learning Library Extensions +[more_itertools](https://pypi.org/project/more_itertools) | 10.2.0 | More routines for operating on iterables, beyond itertools +[mpl_scatter_density](https://pypi.org/project/mpl_scatter_density) | 0.7 | Matplotlib helpers to make density scatter plots +[mpld3](https://pypi.org/project/mpld3) | 0.5.8 | D3 Viewer for Matplotlib +[mpmath](https://pypi.org/project/mpmath) | 1.3.0 | Python library for arbitrary-precision floating-point arithmetic +[msal](https://pypi.org/project/msal) | 1.30.0 | The Microsoft Authentication Library (MSAL) for Python library enables your app to access the Microsoft Cloud by supporting authentication of us +[msal_extensions](https://pypi.org/project/msal_extensions) | 1.2.0 | Microsoft Authentication Library extensions (MSAL EX) provides a persistence API that can save your data on disk, encrypted on Windows, macOS an +[msgpack](https://pypi.org/project/msgpack) | 1.0.4 | MessagePack serializer +[msvc_runtime](https://pypi.org/project/msvc_runtime) | 14.40.33807 | Install the Microsoft™ Visual C++™ runtime DLLs to the sys.prefix and Scripts directories +[multidict](https://pypi.org/project/multidict) | 6.0.5 | multidict implementation +[multipledispatch](https://pypi.org/project/multipledispatch) | 1.0.0 | Multiple dispatch +[mutagen](https://pypi.org/project/mutagen) | 1.47.0 | read and write audio tags for many formats +[mypy](https://pypi.org/project/mypy) | 1.11.1 | Optional static typing for Python +[mypy_extensions](https://pypi.org/project/mypy_extensions) | 1.0.0 | Type system extensions for programs checked with the mypy type checker. +[mysql_connector_python](https://pypi.org/project/mysql_connector_python) | 8.0.21 | MySQL driver written in Python +[namex](https://pypi.org/project/namex) | 0.0.8 | A simple utility to separate the implementation of your Python package and its public API surface. +[narwhals](https://pypi.org/project/narwhals) | 1.5.5 | Extremely lightweight compatibility layer between dataframe libraries +[nbclient](https://pypi.org/project/nbclient) | 0.10.0 | A client library for executing notebooks. Formerly nbconvert's ExecutePreprocessor. +[nbconvert](https://pypi.org/project/nbconvert) | 7.16.1 | Converting Jupyter Notebooks (.ipynb files) to other formats +[nbformat](https://pypi.org/project/nbformat) | 5.10.4 | The Jupyter Notebook format +[nest_asyncio](https://pypi.org/project/nest_asyncio) | 1.6.0 | Patch asyncio to allow nested event loops +[netcdf4](https://pypi.org/project/netcdf4) | 1.7.1.post2 | Provides an object-oriented python interface to the netCDF version 4 library +[networkx](https://pypi.org/project/networkx) | 3.3 | Python package for creating and manipulating graphs and networks +[nltk](https://pypi.org/project/nltk) | 3.8.1 | Natural Language Toolkit +[notebook](https://pypi.org/project/notebook) | 7.2.1 | Jupyter Notebook - A web-based notebook environment for interactive computing +[notebook_shim](https://pypi.org/project/notebook_shim) | 0.2.4 | A shim layer for notebook traits and config +[ntlm_auth](https://pypi.org/project/ntlm_auth) | 1.5.0 | Creates NTLM authentication structures +[numba](https://pypi.org/project/numba) | 0.60.0 | compiling Python code using LLVM +[numexpr](https://pypi.org/project/numexpr) | 2.10.1 | Fast numerical expression evaluator for NumPy +[numpy](https://pypi.org/project/numpy) | 2.0.1 | Fundamental package for array computing in Python +[numpydoc](https://pypi.org/project/numpydoc) | 1.6.0 | Sphinx extension to support docstrings in Numpy format +[openai](https://pypi.org/project/openai) | 1.42.0 | The official Python library for the openai API +[opencv_python](https://pypi.org/project/opencv_python) | 4.10.0.84 | Wrapper package for OpenCV python bindings. +[openpyxl](https://pypi.org/project/openpyxl) | 3.1.2 | A Python library to read/write Excel 2010 xlsx/xlsm files +[optree](https://pypi.org/project/optree) | 0.11.0 | Optimized PyTree Utilities. +[optuna](https://pypi.org/project/optuna) | 3.6.1 | A hyperparameter optimization framework +[orjson](https://pypi.org/project/orjson) | 3.9.15 | Fast, correct Python JSON library supporting dataclasses, datetimes, and numpy +[ortools](https://pypi.org/project/ortools) | 9.10.4067 | Google OR-Tools python libraries and modules +[outcome](https://pypi.org/project/outcome) | 1.3.0.post0 | Capture the outcome of Python function calls. +[overrides](https://pypi.org/project/overrides) | 7.7.0 | A decorator to automatically detect mismatch when overriding a method. +[packaging](https://pypi.org/project/packaging) | 24.1 | Core utilities for Python packages +[pandas](https://pypi.org/project/pandas) | 2.2.2 | Powerful data structures for data analysis, time series, and statistics +[pandocfilters](https://pypi.org/project/pandocfilters) | 1.5.0 | Utilities for writing pandoc filters in python +[panel](https://pypi.org/project/panel) | 1.5.0b4 | The powerful data exploration & web app framework for Python. +[papermill](https://pypi.org/project/papermill) | 2.6.0 | Parameterize and run Jupyter and nteract Notebooks +[param](https://pypi.org/project/param) | 2.1.1 | Make your Python code clearer and more reliable by declaring Parameters. +[paramiko](https://pypi.org/project/paramiko) | 2.8.0 | SSH2 protocol library +[parso](https://pypi.org/project/parso) | 0.8.4 | A Python Parser +[partd](https://pypi.org/project/partd) | 1.4.0 | Appendable key-value storage +[pathspec](https://pypi.org/project/pathspec) | 0.11.0 | Utility library for gitignore style pattern matching of file paths. +[patsy](https://pypi.org/project/patsy) | 0.5.6 | A Python package for describing statistical models and for building design matrices. +[pdfrw](https://pypi.org/project/pdfrw) | 0.4.post2 | PDF file reader/writer library +[pep8](https://pypi.org/project/pep8) | 1.7.1 | Python style guide checker +[pexpect](https://pypi.org/project/pexpect) | 4.8.0 | Pexpect allows easy control of interactive console applications. +[pg8000](https://pypi.org/project/pg8000) | 1.23.0 | PostgreSQL interface library +[pickleshare](https://pypi.org/project/pickleshare) | 0.7.5 | Tiny 'shelve'-like database with concurrency support +[pillow](https://pypi.org/project/pillow) | 10.4.0 | Python Imaging Library (Fork) +[pint](https://pypi.org/project/pint) | 0.23 | Physical quantities module +[pip](https://pypi.org/project/pip) | 24.2 | The PyPA recommended tool for installing Python packages. +[pkginfo](https://pypi.org/project/pkginfo) | 1.9.6 | Query metadata from sdists / bdists / installed packages. +[platformdirs](https://pypi.org/project/platformdirs) | 4.2.2 | A small Python package for determining appropriate platform-specific dirs, e.g. a `user data dir`. +[plotly](https://pypi.org/project/plotly) | 5.23.0 | An open-source, interactive data visualization library for Python +[plotnine](https://pypi.org/project/plotnine) | 0.13.6 | A Grammar of Graphics for Python +[plotpy](https://pypi.org/project/plotpy) | 2.6.2 | Curve and image plotting tools for Python/Qt applications +[pluggy](https://pypi.org/project/pluggy) | 1.5.0 | plugin and hook calling mechanisms for python +[ply](https://pypi.org/project/ply) | 3.11 | Python Lex & Yacc +[pmdarima](https://pypi.org/project/pmdarima) | 2.0.4 | Python's forecast::auto.arima equivalent +[polars](https://pypi.org/project/polars) | 1.6.0 | Blazingly fast DataFrame library +[portalocker](https://pypi.org/project/portalocker) | 2.7.0 | Wraps the portalocker recipe for easy usage +[ppci](https://pypi.org/project/ppci) | 0.5.9 | A compiler for ARM, X86, MSP430, xtensa and more implemented in pure Python +[prettytable](https://pypi.org/project/prettytable) | 3.3.0 | A simple Python library for easily displaying tabular data in a visually appealing ASCII table format +[priority](https://pypi.org/project/priority) | 2.0.0 | A pure-Python implementation of the HTTP/2 priority tree +[prometheus_client](https://pypi.org/project/prometheus_client) | 0.18.0 | Python client for the Prometheus monitoring system. +[prompt_toolkit](https://pypi.org/project/prompt_toolkit) | 3.0.47 | Library for building powerful interactive command lines in Python +[protobuf](https://pypi.org/project/protobuf) | 5.27.3 | +[psutil](https://pypi.org/project/psutil) | 5.9.8 | Cross-platform lib for process and system monitoring in Python. +[psygnal](https://pypi.org/project/psygnal) | 0.11.1 | Fast python callback/event system modeled after Qt Signals +[ptpython](https://pypi.org/project/ptpython) | 3.0.29 | Python REPL build on top of prompt_toolkit +[ptyprocess](https://pypi.org/project/ptyprocess) | 0.7.0 | Run a subprocess in a pseudo terminal +[pulp](https://pypi.org/project/pulp) | 2.6.0 | PuLP is an LP modeler written in python +[pure_eval](https://pypi.org/project/pure_eval) | 0.2.2 | Safely evaluate AST nodes without side effects +[pyarrow](https://pypi.org/project/pyarrow) | 17.0.0 | Python library for Apache Arrow +[pyaudio](https://pypi.org/project/pyaudio) | 0.2.14 | Cross-platform audio I/O with PortAudio +[pybars3](https://pypi.org/project/pybars3) | 0.9.7 | Handlebars.js templating for Python 3 and 2 +[pybind11](https://pypi.org/project/pybind11) | 2.13.1 | Seamless operability between C++11 and Python +[pycodestyle](https://pypi.org/project/pycodestyle) | 2.12.0 | Python style guide checker +[pycosat](https://pypi.org/project/pycosat) | 0.6.6 | bindings to picosat (a SAT solver) +[pycparser](https://pypi.org/project/pycparser) | 2.22 | C parser in Python +[pycryptodomex](https://pypi.org/project/pycryptodomex) | 3.20.0 | Cryptographic library for Python +[pyct](https://pypi.org/project/pyct) | 0.5.0 | Python package common tasks for users (e.g. copy examples, fetch data, ...) +[pydantic](https://pypi.org/project/pydantic) | 2.8.2 | Data validation using Python type hints +[pydantic_core](https://pypi.org/project/pydantic_core) | 2.20.1 | Core functionality for Pydantic validation and serialization +[pydeck](https://pypi.org/project/pydeck) | 0.9.1 | Widget for deck.gl maps +[pydocstyle](https://pypi.org/project/pydocstyle) | 6.3.0 | Python docstring style checker +[pydub](https://pypi.org/project/pydub) | 0.25.1 | Manipulate audio with an simple and easy high level interface +[pyepsg](https://pypi.org/project/pyepsg) | 0.4.0 | Easy access to the EPSG database via http://epsg.io/ +[pyerfa](https://pypi.org/project/pyerfa) | 2.0.1.4 | Python bindings for ERFA +[pyflakes](https://pypi.org/project/pyflakes) | 3.2.0 | passive checker of Python programs +[pygame](https://pypi.org/project/pygame) | 2.5.2 | Python Game Development +[pygments](https://pypi.org/project/pygments) | 2.18.0 | Pygments is a syntax highlighting package written in Python. +[pyjwt](https://pypi.org/project/pyjwt) | 2.8.0 | JSON Web Token implementation in Python +[pylint](https://pypi.org/project/pylint) | 3.1.0 | python code static checker +[pylint_venv](https://pypi.org/project/pylint_venv) | 3.0.3 | pylint-venv provides a Pylint init-hook to use the same Pylint installation with different virtual environments. +[pyls_spyder](https://pypi.org/project/pyls_spyder) | 0.4.0 | Spyder extensions for the python-lsp-server +[pymeta3](https://pypi.org/project/pymeta3) | 0.5.1 | Pattern-matching language based on OMeta for Python 3 and 2 +[pymongo](https://pypi.org/project/pymongo) | 4.7.2 | Python driver for MongoDB +[pymoo](https://pypi.org/project/pymoo) | 0.6.1.3 | Multi-Objective Optimization in Python +[pympler](https://pypi.org/project/pympler) | 1.0.1 | A development tool to measure, monitor and analyze the memory behavior of Python objects. +[pynacl](https://pypi.org/project/pynacl) | 1.5.0 | Python binding to the Networking and Cryptography (NaCl) library +[pynndescent](https://pypi.org/project/pynndescent) | 0.5.12 | Nearest Neighbor Descent +[pyodbc](https://pypi.org/project/pyodbc) | 5.1.0 | DB API module for ODBC +[pyomo](https://pypi.org/project/pyomo) | 6.8.0 | Pyomo: Python Optimization Modeling Objects +[pypandoc](https://pypi.org/project/pypandoc) | 1.5 | Thin wrapper for pandoc. +[pyparsing](https://pypi.org/project/pyparsing) | 3.1.2 | pyparsing module - Classes and methods to define and execute parsing grammars +[pypdf](https://pypi.org/project/pypdf) | 3.15.2 | A pure-python PDF library capable of splitting, merging, cropping, and transforming PDF files +[pypng](https://pypi.org/project/pypng) | 0.20220715.0 | Pure Python library for saving and loading PNG images +[pyproj](https://pypi.org/project/pyproj) | 3.6.1 | Python interface to PROJ (cartographic projections and coordinate transformations library) +[pyproject_hooks](https://pypi.org/project/pyproject_hooks) | 1.1.0 | Wrappers to call pyproject.toml-based build backend hooks. +[pyqt5](https://pypi.org/project/pyqt5) | 5.15.10 | Python bindings for the Qt cross platform application toolkit +[pyqt5_qt5](https://pypi.org/project/pyqt5_qt5) | 5.15.2 | The subset of a Qt installation needed by PyQt5. +[pyqt5_sip](https://pypi.org/project/pyqt5_sip) | 12.13.0 | The sip module support for PyQt5 +[pyqtgraph](https://pypi.org/project/pyqtgraph) | 0.13.7 | Scientific Graphics and GUI Library for Python +[pyqtwebengine](https://pypi.org/project/pyqtwebengine) | 5.15.6 | Python bindings for the Qt WebEngine framework +[pyqtwebengine_qt5](https://pypi.org/project/pyqtwebengine_qt5) | 5.15.2 | The subset of a Qt installation needed by PyQtWebEngine. +[pyserial](https://pypi.org/project/pyserial) | 3.5 | Python Serial Port Extension +[pyshp](https://pypi.org/project/pyshp) | 2.3.1 | Pure Python read/write support for ESRI Shapefile format +[pysimplegui](https://pypi.org/project/pysimplegui) | 4.60.4 | Python GUIs for Humans +[pysocks](https://pypi.org/project/pysocks) | 1.7.1 | A Python SOCKS client module. See https://github.com/Anorov/PySocks for more information. +[pytest](https://pypi.org/project/pytest) | 8.2.2 | pytest: simple powerful testing with Python +[python_barcode](https://pypi.org/project/python_barcode) | 0.15.1 | Create standard barcodes with Python. No external modules needed. (optional Pillow support included). +[python_dateutil](https://pypi.org/project/python_dateutil) | 2.8.2 | Extensions to the standard Python datetime module +[python_dotenv](https://pypi.org/project/python_dotenv) | 1.0.1 | Read key-value pairs from a .env file and set them as environment variables +[python_json_logger](https://pypi.org/project/python_json_logger) | 2.0.7 | A python library adding a json log formatter +[python_lsp_black](https://pypi.org/project/python_lsp_black) | 2.0.0 | Black plugin for the Python LSP Server +[python_lsp_jsonrpc](https://pypi.org/project/python_lsp_jsonrpc) | 1.1.2 | JSON RPC 2.0 server library +[python_lsp_server](https://pypi.org/project/python_lsp_server) | 1.12.0 | Python Language Server for the Language Server Protocol +[python_multipart](https://pypi.org/project/python_multipart) | 0.0.9 | A streaming multipart parser for Python +[python_slugify](https://pypi.org/project/python_slugify) | 8.0.4 | A Python slugify application that also handles Unicode +[pythonnet](https://pypi.org/project/pythonnet) | 3.0.3 | .NET and Mono integration for Python +[pythonqwt](https://pypi.org/project/pythonqwt) | 0.12.7 | Qt plotting widgets for Python +[pytoolconfig](https://pypi.org/project/pytoolconfig) | 1.3.1 | Python tool configuration +[pytorch_lightning](https://pypi.org/project/pytorch_lightning) | 2.3.3 | PyTorch Lightning is the lightweight PyTorch wrapper for ML researchers. Scale your models. Write less boilerplate. +[pytz](https://pypi.org/project/pytz) | 2024.1 | World timezone definitions, modern and historical +[pyviz_comms](https://pypi.org/project/pyviz_comms) | 3.0.3 | A JupyterLab extension for rendering HoloViz content. +[pywin32](https://pypi.org/project/pywin32) | 306 | Python for Window Extensions +[pywin32_ctypes](https://pypi.org/project/pywin32_ctypes) | 0.2.2 | A (partial) reimplementation of pywin32 using ctypes/cffi +[pywinpty](https://pypi.org/project/pywinpty) | 2.0.12 | Pseudo terminal support for Windows from Python. +[pywinusb](https://pypi.org/project/pywinusb) | 0.4.2 | A package that simplifies USB/HID communications on windows +[pyyaml](https://pypi.org/project/pyyaml) | 6.0.1 | YAML parser and emitter for Python +[pyzmq](https://pypi.org/project/pyzmq) | 26.0.3 | Python bindings for 0MQ +[qdarkstyle](https://pypi.org/project/qdarkstyle) | 3.2.3 | The most complete dark/light style sheet for C++/Python and Qt applications +[qpsolvers](https://pypi.org/project/qpsolvers) | 4.3.0 | Quadratic programming solvers in Python with a unified API. +[qrcode](https://pypi.org/project/qrcode) | 7.4.2 | QR Code image generator +[qstylizer](https://pypi.org/project/qstylizer) | 0.2.2 | Stylesheet Generator for PyQt{4-5}/PySide{1-2} +[qtawesome](https://pypi.org/project/qtawesome) | 1.3.1 | FontAwesome icons in PyQt and PySide applications +[qtconsole](https://pypi.org/project/qtconsole) | 5.5.2 | Jupyter Qt console +[qtpy](https://pypi.org/project/qtpy) | 2.4.1 | Provides an abstraction layer on top of the various Qt bindings (PyQt5/6 and PySide2/6). +[quantecon](https://pypi.org/project/quantecon) | 0.7.2 | Import the main names to top level. +[quart](https://pypi.org/project/quart) | 0.19.4 | A Python ASGI web microframework with the same API as Flask +[rapidfuzz](https://pypi.org/project/rapidfuzz) | 3.9.3 | rapid fuzzy string matching +[rasterio](https://pypi.org/project/rasterio) | 1.3.10 | Fast and direct raster I/O for use with Numpy and SciPy +[readme_renderer](https://pypi.org/project/readme_renderer) | 35.0 | readme_renderer is a library for rendering "readme" descriptions for Warehouse +[redis](https://pypi.org/project/redis) | 5.0.3 | Python client for Redis database and key-value store +[referencing](https://pypi.org/project/referencing) | 0.35.1 | JSON Referencing + Python +[regex](https://pypi.org/project/regex) | 2023.10.3 | Alternative regular expression module, to replace re. +[reportlab](https://pypi.org/project/reportlab) | 4.2.2 | The Reportlab Toolkit +[requests](https://pypi.org/project/requests) | 2.31.0 | Python HTTP for Humans. +[requests_ntlm](https://pypi.org/project/requests_ntlm) | 1.1.0 | This package allows for HTTP NTLM authentication using the requests library. +[requests_toolbelt](https://pypi.org/project/requests_toolbelt) | 1.0.0 | A utility belt for advanced users of python-requests +[rfc3339_validator](https://pypi.org/project/rfc3339_validator) | 0.1.4 | A pure python RFC3339 validator +[rfc3986](https://pypi.org/project/rfc3986) | 2.0.0 | Validating URI References per RFC 3986 +[rfc3986_validator](https://pypi.org/project/rfc3986_validator) | 0.1.1 | Pure python rfc3986 validator +[rich](https://pypi.org/project/rich) | 13.7.1 | Render rich text, tables, progress bars, syntax highlighting, markdown and more to the terminal +[rope](https://pypi.org/project/rope) | 1.12.0 | a python refactoring library... +[rpds_py](https://pypi.org/project/rpds_py) | 0.13.2 | Python bindings to Rust's persistent data structures (rpds) +[rtree](https://pypi.org/project/rtree) | 1.1.0 | R-Tree spatial index for Python GIS +[rx](https://pypi.org/project/rx) | 3.1.1 | Reactive Extensions (Rx) for Python +[safetensors](https://pypi.org/project/safetensors) | 0.4.3 | +[scikit_image](https://pypi.org/project/scikit_image) | 0.24.0 | Image processing in Python +[scikit_learn](https://pypi.org/project/scikit_learn) | 1.5.1 | A set of python modules for machine learning and data mining +[scipy](https://pypi.org/project/scipy) | 1.14.1 | Fundamental algorithms for scientific computing in Python +[scramp](https://pypi.org/project/scramp) | 1.4.1 | An implementation of the SCRAM protocol. +[scs](https://pypi.org/project/scs) | 3.2.4.post1 | Splitting conic solver +[seaborn](https://pypi.org/project/seaborn) | 0.13.2 | Statistical data visualization +[send2trash](https://pypi.org/project/send2trash) | 1.8.2 | Send file to trash natively under Mac OS X, Windows and Linux +[setuptools](https://pypi.org/project/setuptools) | 72.2.0 | Easily download, build, install, upgrade, and uninstall Python packages +[shapely](https://pypi.org/project/shapely) | 2.0.4 | Manipulation and analysis of geometric objects +[shellingham](https://pypi.org/project/shellingham) | 1.5.0.post1 | Tool to Detect Surrounding Shell +[simplegeneric](https://pypi.org/project/simplegeneric) | 0.8.1 | Simple generic functions (similar to Python's own len(), pickle.dump(), etc.) +[simplejson](https://pypi.org/project/simplejson) | 3.19.2 | Simple, fast, extensible JSON encoder/decoder for Python +[simpy](https://pypi.org/project/simpy) | 4.0.1 | Event discrete, process based simulation for Python. +[six](https://pypi.org/project/six) | 1.16.0 | Python 2 and 3 compatibility utilities +[smmap](https://pypi.org/project/smmap) | 5.0.0 | A pure Python implementation of a sliding window memory map manager +[sniffio](https://pypi.org/project/sniffio) | 1.3.0 | Sniff out which async library your code is running under +[snowballstemmer](https://pypi.org/project/snowballstemmer) | 2.2.0 | This package provides 29 stemmers for 28 languages generated from Snowball algorithms. +[snuggs](https://pypi.org/project/snuggs) | 1.4.7 | Snuggs are s-expressions for Numpy +[sortedcontainers](https://pypi.org/project/sortedcontainers) | 2.4.0 | Sorted Containers -- Sorted List, Sorted Dict, Sorted Set +[sounddevice](https://pypi.org/project/sounddevice) | 0.4.6 | Play and Record Sound with Python +[soupsieve](https://pypi.org/project/soupsieve) | 2.5 | A modern CSS selector implementation for Beautiful Soup. +[sphinx](https://pypi.org/project/sphinx) | 7.3.7 | Python documentation generator +[sphinx_rtd_theme](https://pypi.org/project/sphinx_rtd_theme) | 2.0.0 | Read the Docs theme for Sphinx +[sphinxcontrib_applehelp](https://pypi.org/project/sphinxcontrib_applehelp) | 1.0.8 | sphinxcontrib-applehelp is a Sphinx extension which outputs Apple help books +[sphinxcontrib_devhelp](https://pypi.org/project/sphinxcontrib_devhelp) | 1.0.6 | sphinxcontrib-devhelp is a sphinx extension which outputs Devhelp documents +[sphinxcontrib_htmlhelp](https://pypi.org/project/sphinxcontrib_htmlhelp) | 2.0.5 | sphinxcontrib-htmlhelp is a sphinx extension which renders HTML help files +[sphinxcontrib_jquery](https://pypi.org/project/sphinxcontrib_jquery) | 4.1 | Extension to include jQuery on newer Sphinx releases +[sphinxcontrib_jsmath](https://pypi.org/project/sphinxcontrib_jsmath) | 1.0.1 | A sphinx extension which renders display math in HTML via JavaScript +[sphinxcontrib_qthelp](https://pypi.org/project/sphinxcontrib_qthelp) | 1.0.7 | sphinxcontrib-qthelp is a sphinx extension which outputs QtHelp documents +[sphinxcontrib_serializinghtml](https://pypi.org/project/sphinxcontrib_serializinghtml) | 1.1.9 | sphinxcontrib-serializinghtml is a sphinx extension which outputs "serialized" HTML files (json and pickle) +[spyder](https://pypi.org/project/spyder) | 5.5.6 | The Scientific Python Development Environment +[spyder_kernels](https://pypi.org/project/spyder_kernels) | 2.5.2 | Jupyter kernels for Spyder's console +[sqlalchemy](https://pypi.org/project/sqlalchemy) | 2.0.30 | Database Abstraction Library +[sqlite_bro](https://pypi.org/project/sqlite_bro) | 0.13.1 | a graphic SQLite Client in 1 Python file +[sqlite_fts4](https://pypi.org/project/sqlite_fts4) | 1.0.3 | Python functions for working with SQLite FTS4 search +[sqlite_utils](https://pypi.org/project/sqlite_utils) | 3.37 | CLI tool and Python library for manipulating SQLite databases +[sqlparse](https://pypi.org/project/sqlparse) | 0.4.3 | A non-validating SQL parser. +[sspyrs](https://pypi.org/project/sspyrs) | 0.3 | Lightweight interface for SSRS reports to python +[stack_data](https://pypi.org/project/stack_data) | 0.6.3 | Extract data from python stack frames and tracebacks for informative displays +[starlette](https://pypi.org/project/starlette) | 0.37.2 | The little ASGI library that shines. +[statsmodels](https://pypi.org/project/statsmodels) | 0.14.2 | Statistical computations and models for Python +[streamlit](https://pypi.org/project/streamlit) | 1.37.1 | A faster way to build and share data apps +[streamz](https://pypi.org/project/streamz) | 0.6.3 | Streams +[swifter](https://pypi.org/project/swifter) | 1.3.4 | A package which efficiently applies any function to a pandas dataframe or series in the fastest available manner +[sympy](https://pypi.org/project/sympy) | 1.13.2 | Computer algebra system (CAS) in Python +[tabulate](https://pypi.org/project/tabulate) | 0.9.0 | Pretty-print tabular data +[tbats](https://pypi.org/project/tbats) | 1.1.0 | BATS and TBATS for time series forecasting +[tblib](https://pypi.org/project/tblib) | 3.0.0 | Traceback serialization library. +[tenacity](https://pypi.org/project/tenacity) | 8.5.0 | Retry code until it succeeds +[terminado](https://pypi.org/project/terminado) | 0.18.1 | Tornado websocket backend for the Xterm.js Javascript terminal emulator library. +[text_unidecode](https://pypi.org/project/text_unidecode) | 1.3 | The most basic Text::Unidecode port +[textdistance](https://pypi.org/project/textdistance) | 4.6.2 | Compute distance between the two texts. +[threadpoolctl](https://pypi.org/project/threadpoolctl) | 3.5.0 | threadpoolctl +[three_merge](https://pypi.org/project/three_merge) | 0.1.1 | Simple library for merging two strings with respect to a base one +[tifffile](https://pypi.org/project/tifffile) | 2024.7.2 | Read and write TIFF files +[tinycss2](https://pypi.org/project/tinycss2) | 1.3.0 | A tiny CSS parser +[tokenizers](https://pypi.org/project/tokenizers) | 0.19.1 | +[toml](https://pypi.org/project/toml) | 0.10.2 | Python Library for Tom's Obvious, Minimal Language +[tomli](https://pypi.org/project/tomli) | 2.0.1 | A lil' TOML parser +[tomli_w](https://pypi.org/project/tomli_w) | 1.0.0 | A lil' TOML writer +[tomlkit](https://pypi.org/project/tomlkit) | 0.12.3 | Style preserving TOML library +[toolz](https://pypi.org/project/toolz) | 0.12.0 | List processing tools and functional utilities +[torch](https://pypi.org/project/torch) | 2.4.1 | Tensors and Dynamic neural networks in Python with strong GPU acceleration +[torchaudio](https://pypi.org/project/torchaudio) | 2.4.1 | An audio package for PyTorch +[torchmetrics](https://pypi.org/project/torchmetrics) | 1.4.1 | PyTorch native Metrics +[tornado](https://pypi.org/project/tornado) | 6.4.1 | Tornado is a Python web framework and asynchronous networking library, originally developed at FriendFeed. +[tqdm](https://pypi.org/project/tqdm) | 4.66.4 | Fast, Extensible Progress Meter +[traitlets](https://pypi.org/project/traitlets) | 5.14.1 | Traitlets Python configuration system +[traittypes](https://pypi.org/project/traittypes) | 0.2.1 | Scipy trait types +[transformers](https://pypi.org/project/transformers) | 4.44.0 | State-of-the-art Machine Learning for JAX, PyTorch and TensorFlow +[trio](https://pypi.org/project/trio) | 0.26.2 | A friendly Python library for async concurrency and I/O +[trove_classifiers](https://pypi.org/project/trove_classifiers) | 2023.2.20 | Canonical source for classifiers on PyPI (pypi.org). +[twine](https://pypi.org/project/twine) | 4.0.1 | Collection of utilities for publishing packages on PyPI +[typer](https://pypi.org/project/typer) | 0.12.3 | Typer, build great CLIs. Easy to code. Based on Python type hints. +[types_python_dateutil](https://pypi.org/project/types_python_dateutil) | 2.9.0.20240316 | Typing stubs for python-dateutil +[typing_extensions](https://pypi.org/project/typing_extensions) | 4.12.2 | Backported and Experimental Type Hints for Python 3.8+ +[tzdata](https://pypi.org/project/tzdata) | 2024.1 | Provider of IANA time zone data +[tzlocal](https://pypi.org/project/tzlocal) | 5.2 | tzinfo object for the local timezone +[uc_micro_py](https://pypi.org/project/uc_micro_py) | 1.0.1 | Micro subset of unicode data files for linkify-it-py projects. +[ujson](https://pypi.org/project/ujson) | 5.8.0 | Ultra fast JSON encoder and decoder for Python +[umap_learn](https://pypi.org/project/umap_learn) | 0.5.6 | Uniform Manifold Approximation and Projection +[uncertainties](https://pypi.org/project/uncertainties) | 3.1.7 | Transparent calculations with uncertainties on the quantities involved (aka error propagation); fast calculation of derivatives +[uri_template](https://pypi.org/project/uri_template) | 1.3.0 | RFC 6570 URI Template Processor +[urllib3](https://pypi.org/project/urllib3) | 2.0.3 | HTTP library with thread-safe connection pooling, file post, and more. +[uvicorn](https://pypi.org/project/uvicorn) | 0.30.3 | The lightning-fast ASGI server. +[vega_datasets](https://pypi.org/project/vega_datasets) | 0.9.0 | A Python package for offline access to Vega datasets +[virtualenv](https://pypi.org/project/virtualenv) | 20.26.2 | Virtual Python Environment builder +[waitress](https://pypi.org/project/waitress) | 3.0.0 | Waitress WSGI server +[watchdog](https://pypi.org/project/watchdog) | 4.0.1 | Filesystem events monitoring +[watchfiles](https://pypi.org/project/watchfiles) | 0.21.0 | Simple, modern and high performance file watching and code reload in python. +[wcwidth](https://pypi.org/project/wcwidth) | 0.2.13 | Measures the displayed width of unicode strings in a terminal +[webcolors](https://pypi.org/project/webcolors) | 1.12 | A library for working with color names and color values formats defined by HTML and CSS. +[webencodings](https://pypi.org/project/webencodings) | 0.5.1 | Character encoding aliases for legacy web content +[websocket_client](https://pypi.org/project/websocket_client) | 1.8.0 | WebSocket client for Python with low level API options +[websockets](https://pypi.org/project/websockets) | 12.0 | An implementation of the WebSocket Protocol (RFC 6455 & 7692) +[werkzeug](https://pypi.org/project/werkzeug) | 3.0.3 | The comprehensive WSGI web application library. +[whatthepatch](https://pypi.org/project/whatthepatch) | 1.0.2 | A patch parsing and application library. +[wheel](https://pypi.org/project/wheel) | 0.44.0 | A built-package format for Python +[widgetsnbextension](https://pypi.org/project/widgetsnbextension) | 4.0.13 | Jupyter interactive widgets for Jupyter Notebook +[winpython](https://pypi.org/project/winpython) | 10.7.20240908 | WinPython distribution tools, including WPPM +[wordcloud](https://pypi.org/project/wordcloud) | 1.9.3 | A little word cloud generator +[wrapt](https://pypi.org/project/wrapt) | 1.16.0 | Module for decorators, wrappers and monkey patching. +[wsproto](https://pypi.org/project/wsproto) | 1.2.0 | WebSockets state-machine based protocol implementation +[xarray](https://pypi.org/project/xarray) | 2024.7.0 | N-D labeled arrays and datasets in Python +[xlsxwriter](https://pypi.org/project/xlsxwriter) | 3.1.9 | A Python module for creating Excel XLSX files. +[xlwings](https://pypi.org/project/xlwings) | 0.24.7 | Make Excel fly: Interact with Excel from Python and vice versa. +[xmltodict](https://pypi.org/project/xmltodict) | 0.13.0 | Makes working with XML feel like you are working with JSON +[xyzservices](https://pypi.org/project/xyzservices) | 2023.10.1 | Source of XYZ tiles providers +[yapf](https://pypi.org/project/yapf) | 0.40.1 | A formatter for Python code. +[yarl](https://pypi.org/project/yarl) | 1.7.2 | Yet another URL library +[yt_dlp](https://pypi.org/project/yt_dlp) | 2023.7.6 | A youtube-dl fork with additional features and patches +[zict](https://pypi.org/project/zict) | 3.0.0 | Mutable mapping tools +[zipp](https://pypi.org/project/zipp) | 3.17.0 | Backport of pathlib-compatible object wrapper for zip files +[zstandard](https://pypi.org/project/zstandard) | 0.23.0 | Zstandard bindings for Python + +
diff --git a/changelogs/WinPython-64bit-3.12.6.0_History.md b/changelogs/WinPython-64bit-3.12.6.0_History.md new file mode 100644 index 00000000..18527fdf --- /dev/null +++ b/changelogs/WinPython-64bit-3.12.6.0_History.md @@ -0,0 +1,187 @@ +## History of changes for WinPython-64bit 3.12.6.0 + +The following changes were made to WinPython-64bit distribution since version 3.12.4.1. + +
+### Tools + +Upgraded packages: + + * [Nodejs](https://nodejs.org) v20.12.2 → v20.15.1 (a JavaScript runtime built on Chrome's V8 JavaScript engine) + * [npmjs](https://www.npmjs.com/) 10.5.0 → 10.7.0 (a package manager for JavaScript) + +### Python packages + +New packages: + + * [immutabledict](https://pypi.org/project/immutabledict) 4.2.0 (Immutable wrapper around dictionaries (a fork of frozendict)) + * [jiter](https://pypi.org/project/jiter) 0.5.0 (Fast iterable JSON parser.) + * [narwhals](https://pypi.org/project/narwhals) 1.5.5 (Extremely lightweight compatibility layer between dataframe libraries) + * [types_python_dateutil](https://pypi.org/project/types_python_dateutil) 2.9.0.20240316 (Typing stubs for python-dateutil) + +Upgraded packages: + + * [altair](https://pypi.org/project/altair) 5.3.0 → 5.4.1 (Vega-Altair: A declarative statistical visualization library for Python.) + * [array_api_compat](https://pypi.org/project/array_api_compat) 1.7.1 → 1.8 (A wrapper around NumPy and other array libraries to make them compatible with the Array API standard) + * [arrow](https://pypi.org/project/arrow) 1.2.2 → 1.3.0 (Better dates & times for Python) + * [azure_core](https://pypi.org/project/azure_core) 1.30.1 → 1.30.2 (Microsoft Azure Core Library for Python) + * [azure_cosmos](https://pypi.org/project/azure_cosmos) 4.6.0 → 4.7.0 (Microsoft Azure Cosmos Client Library for Python) + * [azure_identity](https://pypi.org/project/azure_identity) 1.16.0 → 1.16.1 (Microsoft Azure Identity Library for Python) + * [black](https://pypi.org/project/black) 24.4.2 → 24.8.0 (The uncompromising code formatter.) + * [bokeh](https://pypi.org/project/bokeh) 3.4.1 → 3.5.1 (Interactive plots and applications in the browser from Python) + * [cython](https://pypi.org/project/cython) 3.0.10 → 3.0.11 (The Cython compiler for writing C extensions in the Python language.) + * [dask](https://pypi.org/project/dask) 2024.5.2 → 2024.7.1 (Parallel PyData with Task Scheduling) + * [dask_expr](https://pypi.org/project/dask_expr) 1.1.2 → 1.1.9 (High Level Expressions for Dask ) + * [datasette](https://pypi.org/project/datasette) 0.64.6 → 0.64.8 (An open source multi-tool for exploring and publishing data) + * [datashader](https://pypi.org/project/datashader) 0.16.2 → 0.16.3 (Data visualization toolchain based on aggregating into a grid) + * [decorator](https://pypi.org/project/decorator) 4.4.2 → 5.1.1 (Decorators for Humans) + * [diff_match_patch](https://pypi.org/project/diff_match_patch) 20200713 → 20230430 (Diff Match and Patch) + * [distributed](https://pypi.org/project/distributed) 2024.5.2 → 2024.7.1 (Distributed scheduler for Dask) + * [django](https://pypi.org/project/django) 5.0.6 → 5.0.7 (A high-level Python web framework that encourages rapid development and clean, pragmatic design.) + * [email_validator](https://pypi.org/project/email_validator) 2.1.1 → 2.2.0 (A robust email address syntax and deliverability validation library.) + * [fastapi](https://pypi.org/project/fastapi) 0.111.0 → 0.111.1 (FastAPI framework, high performance, easy to learn, fast to code, ready for production) + * [flake8](https://pypi.org/project/flake8) 7.0.0 → 7.1.1 (the modular source code checker: pep8 pyflakes and co) + * [folium](https://pypi.org/project/folium) 0.16.0 → 0.17.0 (Make beautiful maps with Leaflet.js & Python) + * [fsspec](https://pypi.org/project/fsspec) 2024.3.1 → 2024.6.1 (File-system specification) + * [guidata](https://pypi.org/project/guidata) 3.5.0 → 3.6.2 (Automatic GUI generation for easy dataset editing and display) + * [hatchling](https://pypi.org/project/hatchling) 1.24.2 → 1.25.0 (Modern, extensible Python build backend) + * [holoviews](https://pypi.org/project/holoviews) 1.19.0 → 1.19.1 (A high-level plotting API for the PyData ecosystem built on HoloViews.) + * [httpie](https://pypi.org/project/httpie) 3.2.2 → 3.2.3 (HTTPie: modern, user-friendly command-line HTTP client for the API era.) + * [huggingface_hub](https://pypi.org/project/huggingface_hub) 0.23.0 → 0.24.5 (Client library to download and publish models, datasets and other repos on the huggingface.co hub) + * [hypothesis](https://pypi.org/project/hypothesis) 6.100.5 → 6.108.5 (A library for property-based testing) + * [ipykernel](https://pypi.org/project/ipykernel) 6.29.4 → 6.29.5 (IPython Kernel for Jupyter) + * [ipyleaflet](https://pypi.org/project/ipyleaflet) 0.19.1 → 0.19.2 (A Jupyter widget for dynamic Leaflet maps) + * [ipython](https://pypi.org/project/ipython) 8.25.0 → 8.26.0 (IPython: Productive Interactive Computing) + * [ipywidgets](https://pypi.org/project/ipywidgets) 8.1.2 → 8.1.5 (Jupyter interactive widgets) + * [jupyter_leaflet](https://pypi.org/project/jupyter_leaflet) 0.19.1 → 0.19.2 (ipyleaflet extensions for JupyterLab and Jupyter Notebook) + * [jupyter_server](https://pypi.org/project/jupyter_server) 2.14.1 → 2.14.2 (The backend—i.e. core services, APIs, and REST endpoints—to Jupyter web applications.) + * [jupyterlab](https://pypi.org/project/jupyterlab) 4.2.2 → 4.2.5 (JupyterLab computational environment) + * [jupyterlab_server](https://pypi.org/project/jupyterlab_server) 2.27.2 → 2.27.3 (A set of server components for JupyterLab and JupyterLab like applications.) + * [jupyterlab_widgets](https://pypi.org/project/jupyterlab_widgets) 3.0.11 → 3.0.13 (Jupyter interactive widgets for JupyterLab) + * [keras](https://pypi.org/project/keras) 3.3.3 → 3.5.0 (Multi-backend Keras.) + * [lightning](https://pypi.org/project/lightning) 2.2.1 → 2.4.0 (The Deep Learning framework to train, deploy, and ship AI products Lightning fast.) + * [lightning_utilities](https://pypi.org/project/lightning_utilities) 0.10.0 → 0.11.6 (Lightning toolbox for across the our ecosystem.) + * [mako](https://pypi.org/project/mako) 1.2.0 → 1.3.5 (A super-fast templating language that borrows the best ideas from the existing templating languages.) + * [matplotlib](https://pypi.org/project/matplotlib) 3.9.0 → 3.9.2 (Python plotting package) + * [maturin](https://pypi.org/project/maturin) 1.5.1 → 1.7.0 (Build and publish crates with pyo3, cffi and uniffi bindings as well as rust binaries as python packages) + * [msal](https://pypi.org/project/msal) 1.24.1 → 1.30.0 (The Microsoft Authentication Library (MSAL) for Python library enables your app to access the Microsoft Cloud by supporting authentication of us) + * [msal_extensions](https://pypi.org/project/msal_extensions) 1.0.0 → 1.2.0 (Microsoft Authentication Library extensions (MSAL EX) provides a persistence API that can save your data on disk, encrypted on Windows, macOS an) + * [mypy](https://pypi.org/project/mypy) 1.10.0 → 1.11.1 (Optional static typing for Python) + * [netcdf4](https://pypi.org/project/netcdf4) 1.6.5 → 1.7.1.post2 (Provides an object-oriented python interface to the netCDF version 4 library) + * [numexpr](https://pypi.org/project/numexpr) 2.10.0 → 2.10.1 (Fast numerical expression evaluator for NumPy) + * [numpy](https://pypi.org/project/numpy) 1.26.4 → 2.0.1 (Fundamental package for array computing in Python) + * [openai](https://pypi.org/project/openai) 1.33.0 → 1.42.0 (The official Python library for the openai API) + * [opencv_python](https://pypi.org/project/opencv_python) 4.10.0.82 → 4.10.0.84 (Wrapper package for OpenCV python bindings.) + * [ortools](https://pypi.org/project/ortools) 9.8.3296 → 9.10.4067 (Google OR-Tools python libraries and modules) + * [panel](https://pypi.org/project/panel) 1.4.4 → 1.5.0b4 (The powerful data exploration & web app framework for Python.) + * [param](https://pypi.org/project/param) 2.1.0 → 2.1.1 (Make your Python code clearer and more reliable by declaring Parameters.) + * [pillow](https://pypi.org/project/pillow) 10.3.0 → 10.4.0 (Python Imaging Library (Fork)) + * [pip](https://pypi.org/project/pip) 24.0 → 24.2 (The PyPA recommended tool for installing Python packages.) + * [plotly](https://pypi.org/project/plotly) 5.22.0 → 5.23.0 (An open-source, interactive data visualization library for Python) + * [plotpy](https://pypi.org/project/plotpy) 2.3.0 → 2.6.2 (Curve and image plotting tools for Python/Qt applications) + * [polars](https://pypi.org/project/polars) 0.20.31 → 1.6.0 (Blazingly fast DataFrame library) + * [prompt_toolkit](https://pypi.org/project/prompt_toolkit) 3.0.43 → 3.0.47 (Library for building powerful interactive command lines in Python) + * [protobuf](https://pypi.org/project/protobuf) 4.25.1 → 5.27.3 () + * [ptpython](https://pypi.org/project/ptpython) 3.0.26 → 3.0.29 (Python REPL build on top of prompt_toolkit) + * [pyarrow](https://pypi.org/project/pyarrow) 16.1.0 → 17.0.0 (Python library for Apache Arrow) + * [pybind11](https://pypi.org/project/pybind11) 2.12.0 → 2.13.1 (Seamless operability between C++11 and Python) + * [pycodestyle](https://pypi.org/project/pycodestyle) 2.11.1 → 2.12.0 (Python style guide checker) + * [pydantic](https://pypi.org/project/pydantic) 2.7.1 → 2.8.2 (Data validation using Python type hints) + * [pydantic_core](https://pypi.org/project/pydantic_core) 2.18.2 → 2.20.1 (Core functionality for Pydantic validation and serialization) + * [pymoo](https://pypi.org/project/pymoo) 0.6.1.1 → 0.6.1.3 (Multi-Objective Optimization in Python) + * [pyomo](https://pypi.org/project/pyomo) 6.7.2 → 6.8.0 (Pyomo: Python Optimization Modeling Objects) + * [pytest](https://pypi.org/project/pytest) 8.2.0 → 8.2.2 (pytest: simple powerful testing with Python) + * [Python](http://www.python.org/) 3.12.4 → 3.12.6 (Python programming language with standard library) + * [python_lsp_server](https://pypi.org/project/python_lsp_server) 1.11.0 → 1.12.0 (Python Language Server for the Language Server Protocol) + * [python_slugify](https://pypi.org/project/python_slugify) 6.1.2 → 8.0.4 (A Python slugify application that also handles Unicode) + * [pythonqwt](https://pypi.org/project/pythonqwt) 0.12.1 → 0.12.7 (Qt plotting widgets for Python) + * [pytorch_lightning](https://pypi.org/project/pytorch_lightning) 2.2.1 → 2.3.3 (PyTorch Lightning is the lightweight PyTorch wrapper for ML researchers. Scale your models. Write less boilerplate.) + * [pytz](https://pypi.org/project/pytz) 2023.3 → 2024.1 (World timezone definitions, modern and historical) + * [pyviz_comms](https://pypi.org/project/pyviz_comms) 3.0.2 → 3.0.3 (A JupyterLab extension for rendering HoloViz content.) + * [quantecon](https://pypi.org/project/quantecon) 0.5.3 → 0.7.2 (Import the main names to top level.) + * [rapidfuzz](https://pypi.org/project/rapidfuzz) 3.5.2 → 3.9.3 (rapid fuzzy string matching) + * [redis](https://pypi.org/project/redis) 4.3.1 → 5.0.3 (Python client for Redis database and key-value store) + * [referencing](https://pypi.org/project/referencing) 0.31.1 → 0.35.1 (JSON Referencing + Python) + * [reportlab](https://pypi.org/project/reportlab) 4.2.0 → 4.2.2 (The Reportlab Toolkit) + * [safetensors](https://pypi.org/project/safetensors) 0.4.2 → 0.4.3 () + * [scikit_image](https://pypi.org/project/scikit_image) 0.23.2 → 0.24.0 (Image processing in Python) + * [scikit_learn](https://pypi.org/project/scikit_learn) 1.5.0 → 1.5.1 (A set of python modules for machine learning and data mining) + * [scipy](https://pypi.org/project/scipy) 1.13.1 → 1.14.1 (Fundamental algorithms for scientific computing in Python) + * [setuptools](https://pypi.org/project/setuptools) 69.5.1 → 72.2.0 (Easily download, build, install, upgrade, and uninstall Python packages) + * [sphinx](https://pypi.org/project/sphinx) 7.2.6 → 7.3.7 (Python documentation generator) + * [sphinxcontrib_applehelp](https://pypi.org/project/sphinxcontrib_applehelp) 1.0.2 → 1.0.8 (sphinxcontrib-applehelp is a Sphinx extension which outputs Apple help books) + * [sphinxcontrib_devhelp](https://pypi.org/project/sphinxcontrib_devhelp) 1.0.2 → 1.0.6 (sphinxcontrib-devhelp is a sphinx extension which outputs Devhelp documents) + * [sphinxcontrib_htmlhelp](https://pypi.org/project/sphinxcontrib_htmlhelp) 2.0.0 → 2.0.5 (sphinxcontrib-htmlhelp is a sphinx extension which renders HTML help files) + * [sphinxcontrib_qthelp](https://pypi.org/project/sphinxcontrib_qthelp) 1.0.3 → 1.0.7 (sphinxcontrib-qthelp is a sphinx extension which outputs QtHelp documents) + * [spyder](https://pypi.org/project/spyder) 5.5.5 → 5.5.6 (The Scientific Python Development Environment) + * [sqlalchemy](https://pypi.org/project/sqlalchemy) 2.0.28 → 2.0.30 (Database Abstraction Library) + * [sqlite_utils](https://pypi.org/project/sqlite_utils) 3.36 → 3.37 (CLI tool and Python library for manipulating SQLite databases) + * [streamlit](https://pypi.org/project/streamlit) 1.35.0 → 1.37.1 (A faster way to build and share data apps) + * [sympy](https://pypi.org/project/sympy) 1.12.1 → 1.13.2 (Computer algebra system (CAS) in Python) + * [tblib](https://pypi.org/project/tblib) 1.7.0 → 3.0.0 (Traceback serialization library.) + * [tenacity](https://pypi.org/project/tenacity) 8.1.0 → 8.5.0 (Retry code until it succeeds) + * [textdistance](https://pypi.org/project/textdistance) 4.5.0 → 4.6.2 (Compute distance between the two texts.) + * [tifffile](https://pypi.org/project/tifffile) 2023.7.18 → 2024.7.2 (Read and write TIFF files) + * [tinycss2](https://pypi.org/project/tinycss2) 1.1.1 → 1.3.0 (A tiny CSS parser) + * [tokenizers](https://pypi.org/project/tokenizers) 0.15.1 → 0.19.1 () + * [torch](https://pypi.org/project/torch) 2.2.2 → 2.4.1 (Tensors and Dynamic neural networks in Python with strong GPU acceleration) + * [torchaudio](https://pypi.org/project/torchaudio) 2.2.2 → 2.4.1 (An audio package for PyTorch) + * [torchmetrics](https://pypi.org/project/torchmetrics) 1.3.2 → 1.4.1 (PyTorch native Metrics) + * [tornado](https://pypi.org/project/tornado) 6.4 → 6.4.1 (Tornado is a Python web framework and asynchronous networking library, originally developed at FriendFeed.) + * [transformers](https://pypi.org/project/transformers) 4.38.2 → 4.44.0 (State-of-the-art Machine Learning for JAX, PyTorch and TensorFlow) + * [trio](https://pypi.org/project/trio) 0.25.1 → 0.26.2 (A friendly Python library for async concurrency and I/O) + * [typing_extensions](https://pypi.org/project/typing_extensions) 4.9.0 → 4.12.2 (Backported and Experimental Type Hints for Python 3.8+) + * [tzdata](https://pypi.org/project/tzdata) 2022.7 → 2024.1 (Provider of IANA time zone data) + * [tzlocal](https://pypi.org/project/tzlocal) 4.2 → 5.2 (tzinfo object for the local timezone) + * [umap_learn](https://pypi.org/project/umap_learn) 0.5.1 → 0.5.6 (Uniform Manifold Approximation and Projection) + * [uri_template](https://pypi.org/project/uri_template) 1.2.0 → 1.3.0 (RFC 6570 URI Template Processor) + * [uvicorn](https://pypi.org/project/uvicorn) 0.29.0 → 0.30.3 (The lightning-fast ASGI server.) + * [waitress](https://pypi.org/project/waitress) 2.1.2 → 3.0.0 (Waitress WSGI server) + * [watchdog](https://pypi.org/project/watchdog) 2.2.0 → 4.0.1 (Filesystem events monitoring) + * [wheel](https://pypi.org/project/wheel) 0.43.0 → 0.44.0 (A built-package format for Python) + * [widgetsnbextension](https://pypi.org/project/widgetsnbextension) 4.0.10 → 4.0.13 (Jupyter interactive widgets for Jupyter Notebook) + * [winpython](https://pypi.org/project/winpython) 8.2.20240618 → 10.7.20240908 (WinPython distribution tools, including WPPM) + * [wrapt](https://pypi.org/project/wrapt) 1.14.1 → 1.16.0 (Module for decorators, wrappers and monkey patching.) + * [xarray](https://pypi.org/project/xarray) 2024.6.0 → 2024.7.0 (N-D labeled arrays and datasets in Python) + * [zstandard](https://pypi.org/project/zstandard) 0.22.0 → 0.23.0 (Zstandard bindings for Python) + +Removed packages: + + * [altair_data_server](https://pypi.org/project/altair_data_server) 0.4.1 (A background data server for Altair charts.) + * [altair_transform](https://pypi.org/project/altair_transform) 0.2.0 (A python engine for evaluating Altair transforms.) + * [async_timeout](https://pypi.org/project/async_timeout) 4.0.3 (Timeout context manager for asyncio programs) + * [botorch](https://pypi.org/project/botorch) 0.9.5 (Bayesian Optimization in PyTorch) + * [dash](https://pypi.org/project/dash) 2.17.0 (A Python framework for building reactive web-apps. Developed by Plotly.) + * [dash_core_components](https://pypi.org/project/dash_core_components) 2.0.0 (Core component suite for Dash) + * [dash_html_components](https://pypi.org/project/dash_html_components) 2.0.0 (Vanilla HTML components for Dash) + * [dash_table](https://pypi.org/project/dash_table) 5.0.0 (Dash table) + * [dask_image](https://pypi.org/project/dask_image) 2024.5.3 (Distributed image processing) + * [gdal](https://pypi.org/project/gdal) 3.7.3 (GDAL: Geospatial Data Abstraction Library) + * [gpytorch](https://pypi.org/project/gpytorch) 1.11 (An implementation of Gaussian Processes in Pytorch) + * [imageio_ffmpeg](https://pypi.org/project/imageio_ffmpeg) 0.4.8 (FFMPEG wrapper for Python) + * [jaxtyping](https://pypi.org/project/jaxtyping) 0.2.22 (Type annotations and runtime checking for shape and dtype of JAX arrays, and PyTrees.) + * [jsonpatch](https://pypi.org/project/jsonpatch) 1.33 (Apply JSON-Patches (RFC 6902) ) + * [langchain](https://pypi.org/project/langchain) 0.2.5 (Building applications with LLMs through composability) + * [langchain_core](https://pypi.org/project/langchain_core) 0.2.7 (Building applications with LLMs through composability) + * [langchain_text_splitters](https://pypi.org/project/langchain_text_splitters) 0.2.1 (LangChain text splitting utilities) + * [langsmith](https://pypi.org/project/langsmith) 0.1.77 (Client library to connect to the LangSmith LLM Tracing and Evaluation Platform.) + * [linear_operator](https://pypi.org/project/linear_operator) 0.5.1 (A linear operator implementation, primarily designed for finite-dimensional positive definite operators (i.e. kernel matrices).) + * [moviepy](https://pypi.org/project/moviepy) 1.0.3 (Video editing with Python) + * [opt_einsum](https://pypi.org/project/opt_einsum) 3.3.0 (Optimizing numpys einsum function) + * [pims](https://pypi.org/project/pims) 0.6.1 (Python Image Sequence) + * [portpicker](https://pypi.org/project/portpicker) 1.5.0 (A library to choose unique available network ports.) + * [proglog](https://pypi.org/project/proglog) 0.1.10 (Log and progress bar manager for console, notebooks, web...) + * [pyro_api](https://pypi.org/project/pyro_api) 0.1.2 (Generic API for dispatch to Pyro backends.) + * [pyro_ppl](https://pypi.org/project/pyro_ppl) 1.9.0 (A Python library for probabilistic modeling and inference) + * [pytz_deprecation_shim](https://pypi.org/project/pytz_deprecation_shim) 0.1.0.post0 (Shims to make deprecation of pytz easier) + * [retrying](https://pypi.org/project/retrying) 1.3.4 (Retrying) + * [slicerator](https://pypi.org/project/slicerator) 1.1.0 (A lazy-loading, fancy-sliceable iterable.) + * [torchvision](https://pypi.org/project/torchvision) 0.17.2 (image and video datasets and models for torch deep learning) + * [typeguard](https://pypi.org/project/typeguard) 2.13.3 (Run-time type checker for Python) + * [wasmer](https://pypi.org/project/wasmer) 1.1.0 (Python extension to run WebAssembly binaries) + * [wasmer_compiler_cranelift](https://pypi.org/project/wasmer_compiler_cranelift) 1.1.0 (Python extension to run WebAssembly binaries) + * [wasmer_compiler_singlepass](https://pypi.org/project/wasmer_compiler_singlepass) 1.1.0 (Python extension to run WebAssembly binaries) + + +
+* * * diff --git a/changelogs/WinPythondot-64bit-3.11.9.0.md b/changelogs/WinPythondot-64bit-3.11.9.0.md new file mode 100644 index 00000000..9e748825 --- /dev/null +++ b/changelogs/WinPythondot-64bit-3.11.9.0.md @@ -0,0 +1,29 @@ +## WinPython 3.11.9.0dot + +The following packages are included in WinPython-64bit v3.11.9.0dot . + +
+ +### Tools + +Name | Version | Description +-----|---------|------------ + + +### Python packages + +Name | Version | Description +-----|---------|------------ +[Python](http://www.python.org/) | 3.11.9 | Python programming language with standard library +[build](https://pypi.org/project/build) | 1.2.1 | A simple, correct Python build frontend +[colorama](https://pypi.org/project/colorama) | 0.4.6 | Cross-platform colored terminal text. +[msvc_runtime](https://pypi.org/project/msvc_runtime) | 14.40.33807 | Install the Microsoft™ Visual C++™ runtime DLLs to the sys.prefix and Scripts directories +[packaging](https://pypi.org/project/packaging) | 24.1 | Core utilities for Python packages +[pip](https://pypi.org/project/pip) | 24.2 | The PyPA recommended tool for installing Python packages. +[pyproject_hooks](https://pypi.org/project/pyproject_hooks) | 1.1.0 | Wrappers to call pyproject.toml-based build backend hooks. +[setuptools](https://pypi.org/project/setuptools) | 72.2.0 | Easily download, build, install, upgrade, and uninstall Python packages +[sqlite_bro](https://pypi.org/project/sqlite_bro) | 0.13.1 | a graphic SQLite Client in 1 Python file +[wheel](https://pypi.org/project/wheel) | 0.44.0 | A built-package format for Python +[winpython](https://pypi.org/project/winpython) | 10.7.20240908 | WinPython distribution tools, including WPPM + +
diff --git a/changelogs/WinPythondot-64bit-3.11.9.0_History.md b/changelogs/WinPythondot-64bit-3.11.9.0_History.md new file mode 100644 index 00000000..ad7c0e81 --- /dev/null +++ b/changelogs/WinPythondot-64bit-3.11.9.0_History.md @@ -0,0 +1,27 @@ +## History of changes for WinPython-64bit 3.11.9.0dot + +The following changes were made to WinPython-64bit distribution since version 3.11.6.0dot. + +
+### Python packages + +New packages: + + * [build](https://pypi.org/project/build) 1.2.1 (A simple, correct Python build frontend) + * [colorama](https://pypi.org/project/colorama) 0.4.6 (Cross-platform colored terminal text.) + * [packaging](https://pypi.org/project/packaging) 24.1 (Core utilities for Python packages) + * [pyproject_hooks](https://pypi.org/project/pyproject_hooks) 1.1.0 (Wrappers to call pyproject.toml-based build backend hooks.) + +Upgraded packages: + + * [msvc_runtime](https://pypi.org/project/msvc_runtime) 14.36.32532 → 14.40.33807 (Install the Microsoft™ Visual C++™ runtime DLLs to the sys.prefix and Scripts directories) + * [pip](https://pypi.org/project/pip) 23.2.1 → 24.2 (The PyPA recommended tool for installing Python packages.) + * [Python](http://www.python.org/) 3.11.6 → 3.11.9 (Python programming language with standard library) + * [setuptools](https://pypi.org/project/setuptools) 68.2.2 → 72.2.0 (Easily download, build, install, upgrade, and uninstall Python packages) + * [sqlite_bro](https://pypi.org/project/sqlite_bro) 0.12.2 → 0.13.1 (a graphic SQLite Client in 1 Python file) + * [wheel](https://pypi.org/project/wheel) 0.40.0 → 0.44.0 (A built-package format for Python) + * [winpython](https://pypi.org/project/winpython) 7.0.20231126 → 10.7.20240908 (WinPython distribution tools, including WPPM) + + +
+* * * diff --git a/changelogs/WinPythondot-64bit-3.12.6.0.md b/changelogs/WinPythondot-64bit-3.12.6.0.md new file mode 100644 index 00000000..735c729d --- /dev/null +++ b/changelogs/WinPythondot-64bit-3.12.6.0.md @@ -0,0 +1,29 @@ +## WinPython 3.12.6.0dot + +The following packages are included in WinPython-64bit v3.12.6.0dot . + +
+ +### Tools + +Name | Version | Description +-----|---------|------------ + + +### Python packages + +Name | Version | Description +-----|---------|------------ +[Python](http://www.python.org/) | 3.12.6 | Python programming language with standard library +[build](https://pypi.org/project/build) | 1.2.1 | A simple, correct Python build frontend +[colorama](https://pypi.org/project/colorama) | 0.4.6 | Cross-platform colored terminal text. +[msvc_runtime](https://pypi.org/project/msvc_runtime) | 14.40.33807 | Install the Microsoft™ Visual C++™ runtime DLLs to the sys.prefix and Scripts directories +[packaging](https://pypi.org/project/packaging) | 24.1 | Core utilities for Python packages +[pip](https://pypi.org/project/pip) | 24.2 | The PyPA recommended tool for installing Python packages. +[pyproject_hooks](https://pypi.org/project/pyproject_hooks) | 1.1.0 | Wrappers to call pyproject.toml-based build backend hooks. +[setuptools](https://pypi.org/project/setuptools) | 72.2.0 | Easily download, build, install, upgrade, and uninstall Python packages +[sqlite_bro](https://pypi.org/project/sqlite_bro) | 0.13.1 | a graphic SQLite Client in 1 Python file +[wheel](https://pypi.org/project/wheel) | 0.44.0 | A built-package format for Python +[winpython](https://pypi.org/project/winpython) | 10.7.20240908 | WinPython distribution tools, including WPPM + +
diff --git a/changelogs/WinPythondot-64bit-3.12.6.0_History.md b/changelogs/WinPythondot-64bit-3.12.6.0_History.md new file mode 100644 index 00000000..25ef2ad3 --- /dev/null +++ b/changelogs/WinPythondot-64bit-3.12.6.0_History.md @@ -0,0 +1,18 @@ +## History of changes for WinPython-64bit 3.12.6.0dot + +The following changes were made to WinPython-64bit distribution since version 3.12.4.1dot. + +
+### Python packages + +Upgraded packages: + + * [pip](https://pypi.org/project/pip) 24.0 → 24.2 (The PyPA recommended tool for installing Python packages.) + * [Python](http://www.python.org/) 3.12.4 → 3.12.6 (Python programming language with standard library) + * [setuptools](https://pypi.org/project/setuptools) 69.5.1 → 72.2.0 (Easily download, build, install, upgrade, and uninstall Python packages) + * [wheel](https://pypi.org/project/wheel) 0.43.0 → 0.44.0 (A built-package format for Python) + * [winpython](https://pypi.org/project/winpython) 8.2.20240618 → 10.7.20240908 (WinPython distribution tools, including WPPM) + + +
+* * * diff --git a/changelogs/WinPythondot-64bit-3.13.0.1.md b/changelogs/WinPythondot-64bit-3.13.0.1.md new file mode 100644 index 00000000..46bda9b2 --- /dev/null +++ b/changelogs/WinPythondot-64bit-3.13.0.1.md @@ -0,0 +1,30 @@ +## WinPython 3.13.0.1dot + +The following packages are included in WinPython-64bit v3.13.0.1dot rc2. + +
+ +### Tools + +Name | Version | Description +-----|---------|------------ + + +### Python packages + +Name | Version | Description +-----|---------|------------ +[Python](http://www.python.org/) | 3.13.0 | Python programming language with standard library +[build](https://pypi.org/project/build) | 1.2.1 | A simple, correct Python build frontend +[colorama](https://pypi.org/project/colorama) | 0.4.6 | Cross-platform colored terminal text. +[interpreters_pep_734](https://pypi.org/project/interpreters_pep_734) | 0.1.0 | Use this module to try out multiple interpreters and a per-interpreter GIL in Python 3.13+. Do not use this for anything important yet. +[msvc_runtime](https://pypi.org/project/msvc_runtime) | 14.40.33807 | Install the Microsoft™ Visual C++™ runtime DLLs to the sys.prefix and Scripts directories +[packaging](https://pypi.org/project/packaging) | 24.1 | Core utilities for Python packages +[pip](https://pypi.org/project/pip) | 24.2 | The PyPA recommended tool for installing Python packages. +[pyproject_hooks](https://pypi.org/project/pyproject_hooks) | 1.1.0 | Wrappers to call pyproject.toml-based build backend hooks. +[setuptools](https://pypi.org/project/setuptools) | 72.2.0 | Easily download, build, install, upgrade, and uninstall Python packages +[sqlite_bro](https://pypi.org/project/sqlite_bro) | 0.13.1 | a graphic SQLite Client in 1 Python file +[wheel](https://pypi.org/project/wheel) | 0.44.0 | A built-package format for Python +[winpython](https://pypi.org/project/winpython) | 10.7.20240908 | WinPython distribution tools, including WPPM + +
diff --git a/changelogs/WinPythondot-64bit-3.13.0.1_History.md b/changelogs/WinPythondot-64bit-3.13.0.1_History.md new file mode 100644 index 00000000..78bf8e19 --- /dev/null +++ b/changelogs/WinPythondot-64bit-3.13.0.1_History.md @@ -0,0 +1,17 @@ +## History of changes for WinPython-64bit 3.13.0.1dot + +The following changes were made to WinPython-64bit distribution since version 3.13.0.0dot. + +
+### Python packages + +Upgraded packages: + + * [pip](https://pypi.org/project/pip) 24.0 → 24.2 (The PyPA recommended tool for installing Python packages.) + * [setuptools](https://pypi.org/project/setuptools) 69.5.1 → 72.2.0 (Easily download, build, install, upgrade, and uninstall Python packages) + * [wheel](https://pypi.org/project/wheel) 0.43.0 → 0.44.0 (A built-package format for Python) + * [winpython](https://pypi.org/project/winpython) 8.2.20240618 → 10.7.20240908 (WinPython distribution tools, including WPPM) + + +
+* * * diff --git a/changelogs/WinPythonfree-64bit-3.13.0.1.md b/changelogs/WinPythonfree-64bit-3.13.0.1.md new file mode 100644 index 00000000..f9e34344 --- /dev/null +++ b/changelogs/WinPythonfree-64bit-3.13.0.1.md @@ -0,0 +1,47 @@ +## WinPython 3.13.0.1free + +The following packages are included in WinPython-64bit v3.13.0.1free rc2. + +
+ +### Tools + +Name | Version | Description +-----|---------|------------ + + +### Python packages + +Name | Version | Description +-----|---------|------------ +[Python](http://www.python.org/) | 3.13.0 | Python programming language with standard library +[appdirs](https://pypi.org/project/appdirs) | 1.4.4 | A small Python module for determining appropriate platform-specific dirs, e.g. a "user data dir". +[asttokens](https://pypi.org/project/asttokens) | 2.4.1 | Annotate AST trees with source code positions +[build](https://pypi.org/project/build) | 1.2.1 | A simple, correct Python build frontend +[colorama](https://pypi.org/project/colorama) | 0.4.6 | Cross-platform colored terminal text. +[cython](https://pypi.org/project/cython) | 3.1.0a0 | The Cython compiler for writing C extensions in the Python language. +[decorator](https://pypi.org/project/decorator) | 5.1.1 | Decorators for Humans +[executing](https://pypi.org/project/executing) | 2.0.1 | Get the currently executing AST node of a frame, and other information +[interpreters_pep_734](https://pypi.org/project/interpreters_pep_734) | 0.1.0 | Use this module to try out multiple interpreters and a per-interpreter GIL in Python 3.13+. Do not use this for anything important yet. +[ipython](https://pypi.org/project/ipython) | 8.26.0 | IPython: Productive Interactive Computing +[jedi](https://pypi.org/project/jedi) | 0.19.1 | An autocompletion tool for Python that can be used for text editors. +[matplotlib_inline](https://pypi.org/project/matplotlib_inline) | 0.1.7 | Inline Matplotlib backend for Jupyter +[msvc_runtime](https://pypi.org/project/msvc_runtime) | 14.40.33807 | Install the Microsoft™ Visual C++™ runtime DLLs to the sys.prefix and Scripts directories +[packaging](https://pypi.org/project/packaging) | 24.1 | Core utilities for Python packages +[parso](https://pypi.org/project/parso) | 0.8.4 | A Python Parser +[pip](https://pypi.org/project/pip) | 24.2 | The PyPA recommended tool for installing Python packages. +[prompt_toolkit](https://pypi.org/project/prompt_toolkit) | 3.0.47 | Library for building powerful interactive command lines in Python +[ptpython](https://pypi.org/project/ptpython) | 3.0.29 | Python REPL build on top of prompt_toolkit +[pure_eval](https://pypi.org/project/pure_eval) | 0.2.2 | Safely evaluate AST nodes without side effects +[pygments](https://pypi.org/project/pygments) | 2.18.0 | Pygments is a syntax highlighting package written in Python. +[pyproject_hooks](https://pypi.org/project/pyproject_hooks) | 1.1.0 | Wrappers to call pyproject.toml-based build backend hooks. +[setuptools](https://pypi.org/project/setuptools) | 72.2.0 | Easily download, build, install, upgrade, and uninstall Python packages +[six](https://pypi.org/project/six) | 1.16.0 | Python 2 and 3 compatibility utilities +[sqlite_bro](https://pypi.org/project/sqlite_bro) | 0.13.1 | a graphic SQLite Client in 1 Python file +[stack_data](https://pypi.org/project/stack_data) | 0.6.3 | Extract data from python stack frames and tracebacks for informative displays +[traitlets](https://pypi.org/project/traitlets) | 5.14.1 | Traitlets Python configuration system +[wcwidth](https://pypi.org/project/wcwidth) | 0.2.13 | Measures the displayed width of unicode strings in a terminal +[wheel](https://pypi.org/project/wheel) | 0.44.0 | A built-package format for Python +[winpython](https://pypi.org/project/winpython) | 10.7.20240908 | WinPython distribution tools, including WPPM + +
diff --git a/changelogs/WinPythonfree-64bit-3.13.0.1_History.md b/changelogs/WinPythonfree-64bit-3.13.0.1_History.md new file mode 100644 index 00000000..549ef276 --- /dev/null +++ b/changelogs/WinPythonfree-64bit-3.13.0.1_History.md @@ -0,0 +1,24 @@ +## History of changes for WinPython-64bit 3.13.0.1free + +The following changes were made to WinPython-64bit distribution since version 3.13.0.0free. + +
+### Python packages + +New packages: + + * [cython](https://pypi.org/project/cython) 3.1.0a0 (The Cython compiler for writing C extensions in the Python language.) + +Upgraded packages: + + * [ipython](https://pypi.org/project/ipython) 8.25.0 → 8.26.0 (IPython: Productive Interactive Computing) + * [pip](https://pypi.org/project/pip) 24.1b1 → 24.2 (The PyPA recommended tool for installing Python packages.) + * [prompt_toolkit](https://pypi.org/project/prompt_toolkit) 3.0.43 → 3.0.47 (Library for building powerful interactive command lines in Python) + * [ptpython](https://pypi.org/project/ptpython) 3.0.26 → 3.0.29 (Python REPL build on top of prompt_toolkit) + * [setuptools](https://pypi.org/project/setuptools) 69.5.1 → 72.2.0 (Easily download, build, install, upgrade, and uninstall Python packages) + * [wheel](https://pypi.org/project/wheel) 0.43.0 → 0.44.0 (A built-package format for Python) + * [winpython](https://pypi.org/project/winpython) 8.2.20240618 → 10.7.20240908 (WinPython distribution tools, including WPPM) + + +
+* * * diff --git a/changelogs/WinPythonslim-64bit-3.12.6.0.md b/changelogs/WinPythonslim-64bit-3.12.6.0.md new file mode 100644 index 00000000..b770c938 --- /dev/null +++ b/changelogs/WinPythonslim-64bit-3.12.6.0.md @@ -0,0 +1,528 @@ +## WinPython 3.12.6.0slim + +The following packages are included in WinPython-64bit v3.12.6.0slim . + +
+ +### Tools + +Name | Version | Description +-----|---------|------------ +[Pandoc](https://pandoc.org/) | 3.1.9 | a universal document converter + +### Python packages + +Name | Version | Description +-----|---------|------------ +[Python](http://www.python.org/) | 3.12.6 | Python programming language with standard library +[about_time](https://pypi.org/project/about_time) | 4.2.1 | Easily measure timing and throughput of code blocks, with beautiful human friendly representations. +[absl_py](https://pypi.org/project/absl_py) | 2.0.0 | Abseil Python Common Libraries, see https://github.com/abseil/abseil-py. +[adbc_driver_manager](https://pypi.org/project/adbc_driver_manager) | 0.11.0 | A generic entrypoint for ADBC drivers. +[adodbapi](https://pypi.org/project/adodbapi) | 2.6.1.3 | A pure Python package implementing PEP 249 DB-API using Microsoft ADO. +[affine](https://pypi.org/project/affine) | 2.3.1 | Matrices describing affine transformation of the plane. +[aiofiles](https://pypi.org/project/aiofiles) | 23.2.1 | File support for asyncio. +[aiohttp](https://pypi.org/project/aiohttp) | 3.9.5 | Async http client/server framework (asyncio) +[aiosignal](https://pypi.org/project/aiosignal) | 1.3.1 | aiosignal: a list of registered asynchronous callbacks +[aiosqlite](https://pypi.org/project/aiosqlite) | 0.20.0 | asyncio bridge to the standard sqlite3 module +[alabaster](https://pypi.org/project/alabaster) | 0.7.16 | A light, configurable Sphinx theme +[alembic](https://pypi.org/project/alembic) | 1.13.1 | A database migration tool for SQLAlchemy. +[alive_progress](https://pypi.org/project/alive_progress) | 3.1.5 | A new kind of Progress Bar, with real-time throughput, ETA, and very cool animations! +[altair](https://pypi.org/project/altair) | 5.4.1 | Vega-Altair: A declarative statistical visualization library for Python. +[aniso8601](https://pypi.org/project/aniso8601) | 9.0.1 | A library for parsing ISO 8601 strings. +[annotated_types](https://pypi.org/project/annotated_types) | 0.6.0 | Reusable constraint types to use with typing.Annotated +[ansicolors](https://pypi.org/project/ansicolors) | 1.1.8 | ANSI colors for Python +[anyio](https://pypi.org/project/anyio) | 4.4.0 | High level compatibility layer for multiple asynchronous event loop implementations +[anywidget](https://pypi.org/project/anywidget) | 0.9.12 | custom jupyter widgets made easy +[appdirs](https://pypi.org/project/appdirs) | 1.4.4 | A small Python module for determining appropriate platform-specific dirs, e.g. a "user data dir". +[argon2_cffi](https://pypi.org/project/argon2_cffi) | 23.1.0 | Argon2 for Python +[argon2_cffi_bindings](https://pypi.org/project/argon2_cffi_bindings) | 21.2.0 | Low-level CFFI bindings for Argon2 +[array_api_compat](https://pypi.org/project/array_api_compat) | 1.8 | A wrapper around NumPy and other array libraries to make them compatible with the Array API standard +[arrow](https://pypi.org/project/arrow) | 1.3.0 | Better dates & times for Python +[asgi_csrf](https://pypi.org/project/asgi_csrf) | 0.9 | ASGI middleware for protecting against CSRF attacks +[asgiref](https://pypi.org/project/asgiref) | 3.8.1 | ASGI specs, helper code, and adapters +[asn1crypto](https://pypi.org/project/asn1crypto) | 1.5.1 | Fast ASN.1 parser and serializer with definitions for private keys, public keys, certificates, CRL, OCSP, CMS, PKCS#3, PKCS#7, PKCS#8, PKCS#12, +[asteval](https://pypi.org/project/asteval) | 0.9.31 | Safe, minimalistic evaluator of python expression using ast module +[astroid](https://pypi.org/project/astroid) | 3.1.0 | An abstract syntax tree for Python with inference support. +[astropy](https://pypi.org/project/astropy) | 6.1.0 | Astronomy and astrophysics core library +[astropy_iers_data](https://pypi.org/project/astropy_iers_data) | 0.2024.4.29.0.28.48 | IERS Earth Rotation and Leap Second tables for the astropy core package +[asttokens](https://pypi.org/project/asttokens) | 2.4.1 | Annotate AST trees with source code positions +[async_lru](https://pypi.org/project/async_lru) | 2.0.4 | Simple LRU cache for asyncio +[atomicwrites](https://pypi.org/project/atomicwrites) | 1.4.0 | Atomic file writes. +[attrs](https://pypi.org/project/attrs) | 23.2.0 | Classes Without Boilerplate +[autograd](https://pypi.org/project/autograd) | 1.6.2 | Efficiently computes derivatives of numpy code. +[autopep8](https://pypi.org/project/autopep8) | 2.0.4 | A tool that automatically formats Python code to conform to the PEP 8 style guide +[azure_core](https://pypi.org/project/azure_core) | 1.30.2 | Microsoft Azure Core Library for Python +[azure_cosmos](https://pypi.org/project/azure_cosmos) | 4.7.0 | Microsoft Azure Cosmos Client Library for Python +[azure_identity](https://pypi.org/project/azure_identity) | 1.16.1 | Microsoft Azure Identity Library for Python +[babel](https://pypi.org/project/babel) | 2.15.0 | Internationalization utilities +[baresql](https://pypi.org/project/baresql) | 0.8.0 | playing SQL directly on Python datas +[bcrypt](https://pypi.org/project/bcrypt) | 4.0.1 | Modern password hashing for your software and your servers +[beautifulsoup4](https://pypi.org/project/beautifulsoup4) | 4.12.2 | Screen-scraping library +[binaryornot](https://pypi.org/project/binaryornot) | 0.4.4 | Ultra-lightweight pure Python package to check if a file is binary or text. +[black](https://pypi.org/project/black) | 24.8.0 | The uncompromising code formatter. +[bleach](https://pypi.org/project/bleach) | 6.1.0 | An easy safelist-based HTML-sanitizing tool. +[blinker](https://pypi.org/project/blinker) | 1.7.0 | Fast, simple object-to-object and broadcast signaling +[bokeh](https://pypi.org/project/bokeh) | 3.5.1 | Interactive plots and applications in the browser from Python +[branca](https://pypi.org/project/branca) | 0.7.2 | Generate complex HTML+JS pages with Python +[brotli](https://pypi.org/project/brotli) | 1.1.0 | Python bindings for the Brotli compression library +[build](https://pypi.org/project/build) | 1.2.1 | A simple, correct Python build frontend +[cachelib](https://pypi.org/project/cachelib) | 0.13.0 | A collection of cache libraries in the same API interface. +[cachetools](https://pypi.org/project/cachetools) | 5.3.3 | Extensible memoizing collections and decorators +[cartopy](https://pypi.org/project/cartopy) | 0.23.0 | A Python library for cartographic visualizations with Matplotlib +[certifi](https://pypi.org/project/certifi) | 2024.6.2 | Python package for providing Mozilla's CA Bundle. +[cffi](https://pypi.org/project/cffi) | 1.16.0 | Foreign Function Interface for Python calling C code. +[cftime](https://pypi.org/project/cftime) | 1.6.3 | Time-handling functionality from netcdf4-python +[chardet](https://pypi.org/project/chardet) | 5.2.0 | Universal encoding detector for Python 3 +[charset_normalizer](https://pypi.org/project/charset_normalizer) | 3.3.2 | The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet. +[clarabel](https://pypi.org/project/clarabel) | 0.9.0 | Clarabel Conic Interior Point Solver for Rust / Python +[click](https://pypi.org/project/click) | 8.1.7 | Composable command line interface toolkit +[click_default_group](https://pypi.org/project/click_default_group) | 1.2.4 | click_default_group +[click_plugins](https://pypi.org/project/click_plugins) | 1.1.1 | An extension module for click to enable registering CLI commands via setuptools entry-points. +[cligj](https://pypi.org/project/cligj) | 0.7.2 | Click params for commmand line interfaces to GeoJSON +[cloudpickle](https://pypi.org/project/cloudpickle) | 3.0.0 | Pickler class to extend the standard pickle.Pickler functionality +[clr_loader](https://pypi.org/project/clr_loader) | 0.2.6 | Generic pure Python loader for .NET runtimes +[clrmagic](https://pypi.org/project/clrmagic) | 0.0.1a2 | IPython cell magic to use .NET languages +[cma](https://pypi.org/project/cma) | 3.2.2 | CMA-ES, Covariance Matrix Adaptation Evolution Strategy for non-linear numerical optimization in Python +[colorama](https://pypi.org/project/colorama) | 0.4.6 | Cross-platform colored terminal text. +[colorcet](https://pypi.org/project/colorcet) | 3.1.0 | Collection of perceptually uniform colormaps +[colorlog](https://pypi.org/project/colorlog) | 6.8.2 | Add colours to the output of Python's logging module. +[comm](https://pypi.org/project/comm) | 0.2.2 | Jupyter Python Comm implementation, for usage in ipykernel, xeus-python etc. +[contourpy](https://pypi.org/project/contourpy) | 1.2.1 | Python library for calculating contours of 2D quadrilateral grids +[cookiecutter](https://pypi.org/project/cookiecutter) | 2.6.0 | A command-line utility that creates projects from project templates, e.g +[cryptography](https://pypi.org/project/cryptography) | 41.0.5 | cryptography is a package which provides cryptographic recipes and primitives to Python developers. +[cvxopt](https://pypi.org/project/cvxopt) | 1.3.2 | Convex optimization package +[cvxpy](https://pypi.org/project/cvxpy) | 1.5.0 | A domain-specific language for modeling convex optimization problems in Python. +[cycler](https://pypi.org/project/cycler) | 0.12.1 | Composable style cycles +[cython](https://pypi.org/project/cython) | 3.0.11 | The Cython compiler for writing C extensions in the Python language. +[cytoolz](https://pypi.org/project/cytoolz) | 0.12.3 | Cython implementation of Toolz: High performance functional utilities +[dask](https://pypi.org/project/dask) | 2024.7.1 | Parallel PyData with Task Scheduling +[dask_expr](https://pypi.org/project/dask_expr) | 1.1.9 | High Level Expressions for Dask +[datasette](https://pypi.org/project/datasette) | 0.64.8 | An open source multi-tool for exploring and publishing data +[datasette_graphql](https://pypi.org/project/datasette_graphql) | 2.2 | Datasette plugin providing an automatic GraphQL API for your SQLite databases +[datashader](https://pypi.org/project/datashader) | 0.16.3 | Data visualization toolchain based on aggregating into a grid +[db_py](https://pypi.org/project/db_py) | 0.5.4b1 | a db package that doesn't suck +[deap](https://pypi.org/project/deap) | 1.4.1 | Distributed Evolutionary Algorithms in Python +[debugpy](https://pypi.org/project/debugpy) | 1.8.0 | An implementation of the Debug Adapter Protocol for Python +[decorator](https://pypi.org/project/decorator) | 5.1.1 | Decorators for Humans +[defusedxml](https://pypi.org/project/defusedxml) | 0.7.1 | XML bomb protection for Python stdlib modules +[deprecated](https://pypi.org/project/deprecated) | 1.2.13 | Python @deprecated decorator to deprecate old python classes, functions or methods. +[diff_match_patch](https://pypi.org/project/diff_match_patch) | 20230430 | Diff Match and Patch +[dill](https://pypi.org/project/dill) | 0.3.7 | serialize all of Python +[dirty_cat](https://pypi.org/project/dirty_cat) | 0.4.1 | Machine learning with dirty categories. +[distributed](https://pypi.org/project/distributed) | 2024.7.1 | Distributed scheduler for Dask +[distro](https://pypi.org/project/distro) | 1.8.0 | Distro - an OS platform information API +[django](https://pypi.org/project/django) | 5.0.7 | A high-level Python web framework that encourages rapid development and clean, pragmatic design. +[dnspython](https://pypi.org/project/dnspython) | 2.6.1 | DNS toolkit +[docopt](https://pypi.org/project/docopt) | 0.6.2 | Pythonic argument parser, that will make you smile +[docstring_to_markdown](https://pypi.org/project/docstring_to_markdown) | 0.13 | On the fly conversion of Python docstrings to markdown +[docutils](https://pypi.org/project/docutils) | 0.20.1 | Docutils -- Python Documentation Utilities +[duckdb](https://pypi.org/project/duckdb) | 1.0.0 | DuckDB in-process database +[ecos](https://pypi.org/project/ecos) | 2.0.13 | This is the Python package for ECOS: Embedded Cone Solver. See Github page for more information. +[email_validator](https://pypi.org/project/email_validator) | 2.2.0 | A robust email address syntax and deliverability validation library. +[entrypoints](https://pypi.org/project/entrypoints) | 0.4 | Discover and load entry points from installed packages. +[et_xmlfile](https://pypi.org/project/et_xmlfile) | 1.1.0 | An implementation of lxml.xmlfile for the standard library +[executing](https://pypi.org/project/executing) | 2.0.1 | Get the currently executing AST node of a frame, and other information +[fast_histogram](https://pypi.org/project/fast_histogram) | 0.14 | Fast simple 1D and 2D histograms +[fastapi](https://pypi.org/project/fastapi) | 0.111.1 | FastAPI framework, high performance, easy to learn, fast to code, ready for production +[fastapi_cli](https://pypi.org/project/fastapi_cli) | 0.0.4 | Run and manage FastAPI apps from the command line with FastAPI CLI. 🚀 +[fastjsonschema](https://pypi.org/project/fastjsonschema) | 2.18.0 | Fastest Python implementation of JSON schema +[filelock](https://pypi.org/project/filelock) | 3.14.0 | A platform independent file lock. +[filterpy](https://pypi.org/project/filterpy) | 1.4.5 | Kalman filtering and optimal estimation library +[fiona](https://pypi.org/project/fiona) | 1.9.5 | Fiona reads and writes spatial data files +[flake8](https://pypi.org/project/flake8) | 7.1.1 | the modular source code checker: pep8 pyflakes and co +[flask](https://pypi.org/project/flask) | 3.0.3 | A simple framework for building complex web applications. +[flask_mail](https://pypi.org/project/flask_mail) | 0.9.1 | Flask extension for sending email +[flask_session](https://pypi.org/project/flask_session) | 0.5.0 | Server-side session support for Flask +[flask_sqlalchemy](https://pypi.org/project/flask_sqlalchemy) | 3.0.5 | Add SQLAlchemy support to your Flask application. +[flit](https://pypi.org/project/flit) | 3.9.0 | A simple packaging tool for simple packages. +[flit_core](https://pypi.org/project/flit_core) | 3.9.0 | Distribution-building parts of Flit. See flit package for more information +[folium](https://pypi.org/project/folium) | 0.17.0 | Make beautiful maps with Leaflet.js & Python +[fonttools](https://pypi.org/project/fonttools) | 4.51.0 | Tools to manipulate font files +[formlayout](https://pypi.org/project/formlayout) | 1.2.1a1 | The most easy way to create Qt form dialogs and widgets with Python +[fqdn](https://pypi.org/project/fqdn) | 1.5.1 | Validates fully-qualified domain names against RFC 1123, so that they are acceptable to modern bowsers +[frozenlist](https://pypi.org/project/frozenlist) | 1.4.1 | A list-like structure which implements collections.abc.MutableSequence +[fsspec](https://pypi.org/project/fsspec) | 2024.6.1 | File-system specification +[future](https://pypi.org/project/future) | 0.18.2 | Clean single-source support for Python 3 and 2 +[fuzzywuzzy](https://pypi.org/project/fuzzywuzzy) | 0.18.0 | Fuzzy string matching in python +[geographiclib](https://pypi.org/project/geographiclib) | 2.0 | The geodesic routines from GeographicLib +[geopandas](https://pypi.org/project/geopandas) | 0.14.4 | Geographic pandas extensions +[geopy](https://pypi.org/project/geopy) | 2.4.1 | Python Geocoding Toolbox +[gitdb](https://pypi.org/project/gitdb) | 4.0.10 | Git Object Database +[gitpython](https://pypi.org/project/gitpython) | 3.1.32 | GitPython is a Python library used to interact with Git repositories +[grapheme](https://pypi.org/project/grapheme) | 0.6.0 | Unicode grapheme helpers +[graphene](https://pypi.org/project/graphene) | 3.3 | GraphQL Framework for Python +[graphql_core](https://pypi.org/project/graphql_core) | 3.2.3 | GraphQL implementation for Python, a port of GraphQL.js, the JavaScript reference implementation for GraphQL. +[graphql_relay](https://pypi.org/project/graphql_relay) | 3.2.0 | Relay library for graphql-core +[greenlet](https://pypi.org/project/greenlet) | 3.0.3 | Lightweight in-process concurrent programming +[guidata](https://pypi.org/project/guidata) | 3.6.2 | Automatic GUI generation for easy dataset editing and display +[h11](https://pypi.org/project/h11) | 0.14.0 | A pure-Python, bring-your-own-I/O implementation of HTTP/1.1 +[h2](https://pypi.org/project/h2) | 4.1.0 | HTTP/2 State-Machine based protocol implementation +[h5py](https://pypi.org/project/h5py) | 3.10.0 | Read and write HDF5 files from Python +[hatchling](https://pypi.org/project/hatchling) | 1.25.0 | Modern, extensible Python build backend +[holoviews](https://pypi.org/project/holoviews) | 1.19.1 | A high-level plotting API for the PyData ecosystem built on HoloViews. +[hpack](https://pypi.org/project/hpack) | 4.0.0 | Pure-Python HPACK header compression +[html5lib](https://pypi.org/project/html5lib) | 1.1 | HTML parser based on the WHATWG HTML specification +[httpcore](https://pypi.org/project/httpcore) | 1.0.5 | A minimal low-level HTTP client. +[httpie](https://pypi.org/project/httpie) | 3.2.3 | HTTPie: modern, user-friendly command-line HTTP client for the API era. +[httptools](https://pypi.org/project/httptools) | 0.6.1 | A collection of framework independent HTTP protocol utils. +[httpx](https://pypi.org/project/httpx) | 0.27.0 | The next generation HTTP client. +[huggingface_hub](https://pypi.org/project/huggingface_hub) | 0.24.5 | Client library to download and publish models, datasets and other repos on the huggingface.co hub +[hupper](https://pypi.org/project/hupper) | 1.12 | Integrated process monitor for developing and reloading daemons. +[hvplot](https://pypi.org/project/hvplot) | 0.10.0 | A high-level plotting API for the PyData ecosystem built on HoloViews. +[hypercorn](https://pypi.org/project/hypercorn) | 0.16.0 | A ASGI Server based on Hyper libraries and inspired by Gunicorn +[hyperframe](https://pypi.org/project/hyperframe) | 6.0.1 | HTTP/2 framing layer for Python +[hypothesis](https://pypi.org/project/hypothesis) | 6.108.5 | A library for property-based testing +[idna](https://pypi.org/project/idna) | 3.7 | Internationalized Domain Names in Applications (IDNA) +[imageio](https://pypi.org/project/imageio) | 2.33.1 | Library for reading and writing a wide range of image, video, scientific, and volumetric data formats. +[imagesize](https://pypi.org/project/imagesize) | 1.4.1 | Getting image size from png/jpeg/jpeg2000/gif file +[imbalanced_learn](https://pypi.org/project/imbalanced_learn) | 0.12.3 | Toolbox for imbalanced dataset in machine learning. +[importlib_metadata](https://pypi.org/project/importlib_metadata) | 7.1.0 | Read metadata from Python packages +[inflection](https://pypi.org/project/inflection) | 0.5.1 | A port of Ruby on Rails inflector to Python +[iniconfig](https://pypi.org/project/iniconfig) | 2.0.0 | brain-dead simple config-ini parsing +[intervaltree](https://pypi.org/project/intervaltree) | 3.0.2 | Editable interval tree data structure for Python 2 and 3 +[ipycanvas](https://pypi.org/project/ipycanvas) | 0.13.2 | Interactive widgets library exposing the browser's Canvas API +[ipykernel](https://pypi.org/project/ipykernel) | 6.29.5 | IPython Kernel for Jupyter +[ipyleaflet](https://pypi.org/project/ipyleaflet) | 0.19.2 | A Jupyter widget for dynamic Leaflet maps +[ipympl](https://pypi.org/project/ipympl) | 0.9.4 | Matplotlib Jupyter Extension +[ipython](https://pypi.org/project/ipython) | 8.26.0 | IPython: Productive Interactive Computing +[ipython_genutils](https://pypi.org/project/ipython_genutils) | 0.2.0 | Vestigial utilities from IPython +[ipython_sql](https://pypi.org/project/ipython_sql) | 0.5.0 | RDBMS access via IPython +[ipywidgets](https://pypi.org/project/ipywidgets) | 8.1.5 | Jupyter interactive widgets +[isoduration](https://pypi.org/project/isoduration) | 20.11.0 | Operations with ISO 8601 durations +[isort](https://pypi.org/project/isort) | 5.13.2 | A Python utility / library to sort Python imports. +[itsdangerous](https://pypi.org/project/itsdangerous) | 2.2.0 | Safely pass data to untrusted environments and back. +[janus](https://pypi.org/project/janus) | 1.0.0 | Mixed sync-async queue to interoperate between asyncio tasks and classic threads +[jaraco_classes](https://pypi.org/project/jaraco_classes) | 3.4.0 | Utility functions for Python class constructs +[jaraco_context](https://pypi.org/project/jaraco_context) | 5.3.0 | Useful decorators and context managers +[jaraco_functools](https://pypi.org/project/jaraco_functools) | 4.0.1 | Functools like those found in stdlib +[jedi](https://pypi.org/project/jedi) | 0.19.1 | An autocompletion tool for Python that can be used for text editors. +[jellyfish](https://pypi.org/project/jellyfish) | 1.0.3 | Approximate and phonetic matching of strings. +[jinja2](https://pypi.org/project/jinja2) | 3.1.2 | A very fast and expressive template engine. +[jiter](https://pypi.org/project/jiter) | 0.5.0 | Fast iterable JSON parser. +[joblib](https://pypi.org/project/joblib) | 1.4.2 | Lightweight pipelining with Python functions +[json5](https://pypi.org/project/json5) | 0.9.14 | A Python implementation of the JSON5 data format. +[jsonpointer](https://pypi.org/project/jsonpointer) | 2.4 | Identify specific nodes in a JSON document (RFC 6901) +[jsonschema](https://pypi.org/project/jsonschema) | 4.19.2 | An implementation of JSON Schema validation for Python +[jsonschema_specifications](https://pypi.org/project/jsonschema_specifications) | 2023.12.1 | The JSON Schema meta-schemas and vocabularies, exposed as a Registry +[julia](https://pypi.org/project/julia) | 0.6.2 | Julia/Python bridge with IPython support. +[jupyter](https://pypi.org/project/jupyter) | 1.0.0 | Jupyter metapackage. Install all the Jupyter components in one go. +[jupyter_bokeh](https://pypi.org/project/jupyter_bokeh) | 4.0.5 | A Jupyter extension for rendering Bokeh content. +[jupyter_client](https://pypi.org/project/jupyter_client) | 8.6.2 | Jupyter protocol implementation and client libraries +[jupyter_console](https://pypi.org/project/jupyter_console) | 6.6.3 | Jupyter terminal console +[jupyter_core](https://pypi.org/project/jupyter_core) | 5.7.2 | Jupyter core package. A base package on which Jupyter projects rely. +[jupyter_events](https://pypi.org/project/jupyter_events) | 0.10.0 | Jupyter Event System library +[jupyter_leaflet](https://pypi.org/project/jupyter_leaflet) | 0.19.2 | ipyleaflet extensions for JupyterLab and Jupyter Notebook +[jupyter_lsp](https://pypi.org/project/jupyter_lsp) | 2.2.5 | Multi-Language Server WebSocket proxy for Jupyter Notebook/Lab server +[jupyter_server](https://pypi.org/project/jupyter_server) | 2.14.2 | The backend—i.e. core services, APIs, and REST endpoints—to Jupyter web applications. +[jupyter_server_terminals](https://pypi.org/project/jupyter_server_terminals) | 0.5.3 | A Jupyter Server Extension Providing Terminals. +[jupyterlab](https://pypi.org/project/jupyterlab) | 4.2.5 | JupyterLab computational environment +[jupyterlab_pygments](https://pypi.org/project/jupyterlab_pygments) | 0.3.0 | Pygments theme using JupyterLab CSS variables +[jupyterlab_server](https://pypi.org/project/jupyterlab_server) | 2.27.3 | A set of server components for JupyterLab and JupyterLab like applications. +[jupyterlab_widgets](https://pypi.org/project/jupyterlab_widgets) | 3.0.13 | Jupyter interactive widgets for JupyterLab +[keras](https://pypi.org/project/keras) | 3.5.0 | Multi-backend Keras. +[keyring](https://pypi.org/project/keyring) | 25.2.1 | Store and access your passwords safely. +[kiwisolver](https://pypi.org/project/kiwisolver) | 1.4.5 | A fast implementation of the Cassowary constraint solver +[lazy_loader](https://pypi.org/project/lazy_loader) | 0.4 | Makes it easy to load subpackages and functions on demand. +[linkify_it_py](https://pypi.org/project/linkify_it_py) | 2.0.2 | Links recognition library with FULL unicode support. +[llvmlite](https://pypi.org/project/llvmlite) | 0.43.0 | lightweight wrapper around basic LLVM functionality +[lmfit](https://pypi.org/project/lmfit) | 1.3.1 | Least-Squares Minimization with Bounds and Constraints +[locket](https://pypi.org/project/locket) | 1.0.0 | File-based locks for Python on Linux and Windows +[lxml](https://pypi.org/project/lxml) | 5.2.2 | Powerful and Pythonic XML processing library combining libxml2/libxslt with the ElementTree API. +[mako](https://pypi.org/project/mako) | 1.3.5 | A super-fast templating language that borrows the best ideas from the existing templating languages. +[markdown](https://pypi.org/project/markdown) | 3.5.1 | Python implementation of John Gruber's Markdown. +[markdown_it_py](https://pypi.org/project/markdown_it_py) | 2.2.0 | Python port of markdown-it. Markdown parsing, done right! +[markupsafe](https://pypi.org/project/markupsafe) | 2.1.1 | Safely add untrusted strings to HTML/XML markup. +[matplotlib](https://pypi.org/project/matplotlib) | 3.9.2 | Python plotting package +[matplotlib_inline](https://pypi.org/project/matplotlib_inline) | 0.1.7 | Inline Matplotlib backend for Jupyter +[maturin](https://pypi.org/project/maturin) | 1.7.0 | Build and publish crates with pyo3, cffi and uniffi bindings as well as rust binaries as python packages +[mccabe](https://pypi.org/project/mccabe) | 0.7.0 | McCabe checker, plugin for flake8 +[mdit_py_plugins](https://pypi.org/project/mdit_py_plugins) | 0.3.5 | Collection of plugins for markdown-it-py +[mdurl](https://pypi.org/project/mdurl) | 0.1.2 | Markdown URL utilities +[mercantile](https://pypi.org/project/mercantile) | 1.2.1 | Web mercator XYZ tile utilities +[mergedeep](https://pypi.org/project/mergedeep) | 1.3.4 | A deep merge function for 🐍. +[missingno](https://pypi.org/project/missingno) | 0.5.1 | Missing data visualization module for Python. +[mistune](https://pypi.org/project/mistune) | 2.0.5 | A sane Markdown parser with useful plugins and renderers +[mizani](https://pypi.org/project/mizani) | 0.11.4 | Scales for Python +[ml_dtypes](https://pypi.org/project/ml_dtypes) | 0.4.0 | +[mlxtend](https://pypi.org/project/mlxtend) | 0.22.0 | Machine Learning Library Extensions +[more_itertools](https://pypi.org/project/more_itertools) | 10.2.0 | More routines for operating on iterables, beyond itertools +[mpl_scatter_density](https://pypi.org/project/mpl_scatter_density) | 0.7 | Matplotlib helpers to make density scatter plots +[mpld3](https://pypi.org/project/mpld3) | 0.5.8 | D3 Viewer for Matplotlib +[mpmath](https://pypi.org/project/mpmath) | 1.3.0 | Python library for arbitrary-precision floating-point arithmetic +[msal](https://pypi.org/project/msal) | 1.30.0 | The Microsoft Authentication Library (MSAL) for Python library enables your app to access the Microsoft Cloud by supporting authentication of us +[msal_extensions](https://pypi.org/project/msal_extensions) | 1.2.0 | Microsoft Authentication Library extensions (MSAL EX) provides a persistence API that can save your data on disk, encrypted on Windows, macOS an +[msgpack](https://pypi.org/project/msgpack) | 1.0.4 | MessagePack serializer +[msvc_runtime](https://pypi.org/project/msvc_runtime) | 14.40.33807 | Install the Microsoft™ Visual C++™ runtime DLLs to the sys.prefix and Scripts directories +[multidict](https://pypi.org/project/multidict) | 6.0.5 | multidict implementation +[multipledispatch](https://pypi.org/project/multipledispatch) | 1.0.0 | Multiple dispatch +[mutagen](https://pypi.org/project/mutagen) | 1.47.0 | read and write audio tags for many formats +[mypy](https://pypi.org/project/mypy) | 1.11.1 | Optional static typing for Python +[mypy_extensions](https://pypi.org/project/mypy_extensions) | 1.0.0 | Type system extensions for programs checked with the mypy type checker. +[mysql_connector_python](https://pypi.org/project/mysql_connector_python) | 8.0.21 | MySQL driver written in Python +[namex](https://pypi.org/project/namex) | 0.0.8 | A simple utility to separate the implementation of your Python package and its public API surface. +[narwhals](https://pypi.org/project/narwhals) | 1.5.5 | Extremely lightweight compatibility layer between dataframe libraries +[nbclient](https://pypi.org/project/nbclient) | 0.10.0 | A client library for executing notebooks. Formerly nbconvert's ExecutePreprocessor. +[nbconvert](https://pypi.org/project/nbconvert) | 7.16.1 | Converting Jupyter Notebooks (.ipynb files) to other formats +[nbformat](https://pypi.org/project/nbformat) | 5.10.4 | The Jupyter Notebook format +[nest_asyncio](https://pypi.org/project/nest_asyncio) | 1.6.0 | Patch asyncio to allow nested event loops +[netcdf4](https://pypi.org/project/netcdf4) | 1.7.1.post2 | Provides an object-oriented python interface to the netCDF version 4 library +[networkx](https://pypi.org/project/networkx) | 3.3 | Python package for creating and manipulating graphs and networks +[nltk](https://pypi.org/project/nltk) | 3.8.1 | Natural Language Toolkit +[notebook](https://pypi.org/project/notebook) | 7.2.1 | Jupyter Notebook - A web-based notebook environment for interactive computing +[notebook_shim](https://pypi.org/project/notebook_shim) | 0.2.4 | A shim layer for notebook traits and config +[ntlm_auth](https://pypi.org/project/ntlm_auth) | 1.5.0 | Creates NTLM authentication structures +[numba](https://pypi.org/project/numba) | 0.60.0 | compiling Python code using LLVM +[numexpr](https://pypi.org/project/numexpr) | 2.10.1 | Fast numerical expression evaluator for NumPy +[numpy](https://pypi.org/project/numpy) | 2.0.1 | Fundamental package for array computing in Python +[numpydoc](https://pypi.org/project/numpydoc) | 1.6.0 | Sphinx extension to support docstrings in Numpy format +[openai](https://pypi.org/project/openai) | 1.42.0 | The official Python library for the openai API +[opencv_python](https://pypi.org/project/opencv_python) | 4.10.0.84 | Wrapper package for OpenCV python bindings. +[openpyxl](https://pypi.org/project/openpyxl) | 3.1.2 | A Python library to read/write Excel 2010 xlsx/xlsm files +[optree](https://pypi.org/project/optree) | 0.11.0 | Optimized PyTree Utilities. +[optuna](https://pypi.org/project/optuna) | 3.6.1 | A hyperparameter optimization framework +[orjson](https://pypi.org/project/orjson) | 3.9.15 | Fast, correct Python JSON library supporting dataclasses, datetimes, and numpy +[outcome](https://pypi.org/project/outcome) | 1.3.0.post0 | Capture the outcome of Python function calls. +[overrides](https://pypi.org/project/overrides) | 7.7.0 | A decorator to automatically detect mismatch when overriding a method. +[packaging](https://pypi.org/project/packaging) | 24.1 | Core utilities for Python packages +[pandas](https://pypi.org/project/pandas) | 2.2.2 | Powerful data structures for data analysis, time series, and statistics +[pandocfilters](https://pypi.org/project/pandocfilters) | 1.5.0 | Utilities for writing pandoc filters in python +[panel](https://pypi.org/project/panel) | 1.5.0b4 | The powerful data exploration & web app framework for Python. +[papermill](https://pypi.org/project/papermill) | 2.6.0 | Parameterize and run Jupyter and nteract Notebooks +[param](https://pypi.org/project/param) | 2.1.1 | Make your Python code clearer and more reliable by declaring Parameters. +[paramiko](https://pypi.org/project/paramiko) | 2.8.0 | SSH2 protocol library +[parso](https://pypi.org/project/parso) | 0.8.4 | A Python Parser +[partd](https://pypi.org/project/partd) | 1.4.0 | Appendable key-value storage +[pathspec](https://pypi.org/project/pathspec) | 0.11.0 | Utility library for gitignore style pattern matching of file paths. +[patsy](https://pypi.org/project/patsy) | 0.5.6 | A Python package for describing statistical models and for building design matrices. +[pdfrw](https://pypi.org/project/pdfrw) | 0.4.post2 | PDF file reader/writer library +[pep8](https://pypi.org/project/pep8) | 1.7.1 | Python style guide checker +[pexpect](https://pypi.org/project/pexpect) | 4.8.0 | Pexpect allows easy control of interactive console applications. +[pg8000](https://pypi.org/project/pg8000) | 1.23.0 | PostgreSQL interface library +[pickleshare](https://pypi.org/project/pickleshare) | 0.7.5 | Tiny 'shelve'-like database with concurrency support +[pillow](https://pypi.org/project/pillow) | 10.4.0 | Python Imaging Library (Fork) +[pint](https://pypi.org/project/pint) | 0.23 | Physical quantities module +[pip](https://pypi.org/project/pip) | 24.2 | The PyPA recommended tool for installing Python packages. +[pkginfo](https://pypi.org/project/pkginfo) | 1.9.6 | Query metadata from sdists / bdists / installed packages. +[platformdirs](https://pypi.org/project/platformdirs) | 4.2.2 | A small Python package for determining appropriate platform-specific dirs, e.g. a `user data dir`. +[plotly](https://pypi.org/project/plotly) | 5.23.0 | An open-source, interactive data visualization library for Python +[plotnine](https://pypi.org/project/plotnine) | 0.13.6 | A Grammar of Graphics for Python +[plotpy](https://pypi.org/project/plotpy) | 2.6.2 | Curve and image plotting tools for Python/Qt applications +[pluggy](https://pypi.org/project/pluggy) | 1.5.0 | plugin and hook calling mechanisms for python +[ply](https://pypi.org/project/ply) | 3.11 | Python Lex & Yacc +[pmdarima](https://pypi.org/project/pmdarima) | 2.0.4 | Python's forecast::auto.arima equivalent +[polars](https://pypi.org/project/polars) | 1.6.0 | Blazingly fast DataFrame library +[portalocker](https://pypi.org/project/portalocker) | 2.7.0 | Wraps the portalocker recipe for easy usage +[ppci](https://pypi.org/project/ppci) | 0.5.9 | A compiler for ARM, X86, MSP430, xtensa and more implemented in pure Python +[prettytable](https://pypi.org/project/prettytable) | 3.3.0 | A simple Python library for easily displaying tabular data in a visually appealing ASCII table format +[priority](https://pypi.org/project/priority) | 2.0.0 | A pure-Python implementation of the HTTP/2 priority tree +[prometheus_client](https://pypi.org/project/prometheus_client) | 0.18.0 | Python client for the Prometheus monitoring system. +[prompt_toolkit](https://pypi.org/project/prompt_toolkit) | 3.0.47 | Library for building powerful interactive command lines in Python +[protobuf](https://pypi.org/project/protobuf) | 5.27.3 | +[psutil](https://pypi.org/project/psutil) | 5.9.8 | Cross-platform lib for process and system monitoring in Python. +[psygnal](https://pypi.org/project/psygnal) | 0.11.1 | Fast python callback/event system modeled after Qt Signals +[ptpython](https://pypi.org/project/ptpython) | 3.0.29 | Python REPL build on top of prompt_toolkit +[ptyprocess](https://pypi.org/project/ptyprocess) | 0.7.0 | Run a subprocess in a pseudo terminal +[pulp](https://pypi.org/project/pulp) | 2.6.0 | PuLP is an LP modeler written in python +[pure_eval](https://pypi.org/project/pure_eval) | 0.2.2 | Safely evaluate AST nodes without side effects +[pyarrow](https://pypi.org/project/pyarrow) | 17.0.0 | Python library for Apache Arrow +[pyaudio](https://pypi.org/project/pyaudio) | 0.2.14 | Cross-platform audio I/O with PortAudio +[pybars3](https://pypi.org/project/pybars3) | 0.9.7 | Handlebars.js templating for Python 3 and 2 +[pybind11](https://pypi.org/project/pybind11) | 2.13.1 | Seamless operability between C++11 and Python +[pycodestyle](https://pypi.org/project/pycodestyle) | 2.12.0 | Python style guide checker +[pycosat](https://pypi.org/project/pycosat) | 0.6.6 | bindings to picosat (a SAT solver) +[pycparser](https://pypi.org/project/pycparser) | 2.22 | C parser in Python +[pycryptodomex](https://pypi.org/project/pycryptodomex) | 3.20.0 | Cryptographic library for Python +[pyct](https://pypi.org/project/pyct) | 0.5.0 | Python package common tasks for users (e.g. copy examples, fetch data, ...) +[pydantic](https://pypi.org/project/pydantic) | 2.8.2 | Data validation using Python type hints +[pydantic_core](https://pypi.org/project/pydantic_core) | 2.20.1 | Core functionality for Pydantic validation and serialization +[pydeck](https://pypi.org/project/pydeck) | 0.9.1 | Widget for deck.gl maps +[pydocstyle](https://pypi.org/project/pydocstyle) | 6.3.0 | Python docstring style checker +[pydub](https://pypi.org/project/pydub) | 0.25.1 | Manipulate audio with an simple and easy high level interface +[pyerfa](https://pypi.org/project/pyerfa) | 2.0.1.4 | Python bindings for ERFA +[pyflakes](https://pypi.org/project/pyflakes) | 3.2.0 | passive checker of Python programs +[pygments](https://pypi.org/project/pygments) | 2.18.0 | Pygments is a syntax highlighting package written in Python. +[pyjwt](https://pypi.org/project/pyjwt) | 2.8.0 | JSON Web Token implementation in Python +[pylint](https://pypi.org/project/pylint) | 3.1.0 | python code static checker +[pylint_venv](https://pypi.org/project/pylint_venv) | 3.0.3 | pylint-venv provides a Pylint init-hook to use the same Pylint installation with different virtual environments. +[pyls_spyder](https://pypi.org/project/pyls_spyder) | 0.4.0 | Spyder extensions for the python-lsp-server +[pymeta3](https://pypi.org/project/pymeta3) | 0.5.1 | Pattern-matching language based on OMeta for Python 3 and 2 +[pymongo](https://pypi.org/project/pymongo) | 4.7.2 | Python driver for MongoDB +[pymoo](https://pypi.org/project/pymoo) | 0.6.1.3 | Multi-Objective Optimization in Python +[pympler](https://pypi.org/project/pympler) | 1.0.1 | A development tool to measure, monitor and analyze the memory behavior of Python objects. +[pynacl](https://pypi.org/project/pynacl) | 1.5.0 | Python binding to the Networking and Cryptography (NaCl) library +[pynndescent](https://pypi.org/project/pynndescent) | 0.5.12 | Nearest Neighbor Descent +[pyodbc](https://pypi.org/project/pyodbc) | 5.1.0 | DB API module for ODBC +[pyomo](https://pypi.org/project/pyomo) | 6.8.0 | Pyomo: Python Optimization Modeling Objects +[pypandoc](https://pypi.org/project/pypandoc) | 1.5 | Thin wrapper for pandoc. +[pyparsing](https://pypi.org/project/pyparsing) | 3.1.2 | pyparsing module - Classes and methods to define and execute parsing grammars +[pypdf](https://pypi.org/project/pypdf) | 3.15.2 | A pure-python PDF library capable of splitting, merging, cropping, and transforming PDF files +[pypng](https://pypi.org/project/pypng) | 0.20220715.0 | Pure Python library for saving and loading PNG images +[pyproj](https://pypi.org/project/pyproj) | 3.6.1 | Python interface to PROJ (cartographic projections and coordinate transformations library) +[pyproject_hooks](https://pypi.org/project/pyproject_hooks) | 1.1.0 | Wrappers to call pyproject.toml-based build backend hooks. +[pyqt5](https://pypi.org/project/pyqt5) | 5.15.10 | Python bindings for the Qt cross platform application toolkit +[pyqt5_qt5](https://pypi.org/project/pyqt5_qt5) | 5.15.2 | The subset of a Qt installation needed by PyQt5. +[pyqt5_sip](https://pypi.org/project/pyqt5_sip) | 12.13.0 | The sip module support for PyQt5 +[pyqtgraph](https://pypi.org/project/pyqtgraph) | 0.13.7 | Scientific Graphics and GUI Library for Python +[pyqtwebengine](https://pypi.org/project/pyqtwebengine) | 5.15.6 | Python bindings for the Qt WebEngine framework +[pyqtwebengine_qt5](https://pypi.org/project/pyqtwebengine_qt5) | 5.15.2 | The subset of a Qt installation needed by PyQtWebEngine. +[pyserial](https://pypi.org/project/pyserial) | 3.5 | Python Serial Port Extension +[pyshp](https://pypi.org/project/pyshp) | 2.3.1 | Pure Python read/write support for ESRI Shapefile format +[pysimplegui](https://pypi.org/project/pysimplegui) | 4.60.4 | Python GUIs for Humans +[pysocks](https://pypi.org/project/pysocks) | 1.7.1 | A Python SOCKS client module. See https://github.com/Anorov/PySocks for more information. +[pytest](https://pypi.org/project/pytest) | 8.2.2 | pytest: simple powerful testing with Python +[python_barcode](https://pypi.org/project/python_barcode) | 0.15.1 | Create standard barcodes with Python. No external modules needed. (optional Pillow support included). +[python_dateutil](https://pypi.org/project/python_dateutil) | 2.8.2 | Extensions to the standard Python datetime module +[python_dotenv](https://pypi.org/project/python_dotenv) | 1.0.1 | Read key-value pairs from a .env file and set them as environment variables +[python_json_logger](https://pypi.org/project/python_json_logger) | 2.0.7 | A python library adding a json log formatter +[python_lsp_black](https://pypi.org/project/python_lsp_black) | 2.0.0 | Black plugin for the Python LSP Server +[python_lsp_jsonrpc](https://pypi.org/project/python_lsp_jsonrpc) | 1.1.2 | JSON RPC 2.0 server library +[python_lsp_server](https://pypi.org/project/python_lsp_server) | 1.12.0 | Python Language Server for the Language Server Protocol +[python_multipart](https://pypi.org/project/python_multipart) | 0.0.9 | A streaming multipart parser for Python +[python_slugify](https://pypi.org/project/python_slugify) | 8.0.4 | A Python slugify application that also handles Unicode +[pythonnet](https://pypi.org/project/pythonnet) | 3.0.3 | .NET and Mono integration for Python +[pythonqwt](https://pypi.org/project/pythonqwt) | 0.12.7 | Qt plotting widgets for Python +[pytoolconfig](https://pypi.org/project/pytoolconfig) | 1.3.1 | Python tool configuration +[pytz](https://pypi.org/project/pytz) | 2024.1 | World timezone definitions, modern and historical +[pyviz_comms](https://pypi.org/project/pyviz_comms) | 3.0.3 | A JupyterLab extension for rendering HoloViz content. +[pywin32](https://pypi.org/project/pywin32) | 306 | Python for Window Extensions +[pywin32_ctypes](https://pypi.org/project/pywin32_ctypes) | 0.2.2 | A (partial) reimplementation of pywin32 using ctypes/cffi +[pywinpty](https://pypi.org/project/pywinpty) | 2.0.12 | Pseudo terminal support for Windows from Python. +[pywinusb](https://pypi.org/project/pywinusb) | 0.4.2 | A package that simplifies USB/HID communications on windows +[pyyaml](https://pypi.org/project/pyyaml) | 6.0.1 | YAML parser and emitter for Python +[pyzmq](https://pypi.org/project/pyzmq) | 26.0.3 | Python bindings for 0MQ +[qdarkstyle](https://pypi.org/project/qdarkstyle) | 3.2.3 | The most complete dark/light style sheet for C++/Python and Qt applications +[qrcode](https://pypi.org/project/qrcode) | 7.4.2 | QR Code image generator +[qstylizer](https://pypi.org/project/qstylizer) | 0.2.2 | Stylesheet Generator for PyQt{4-5}/PySide{1-2} +[qtawesome](https://pypi.org/project/qtawesome) | 1.3.1 | FontAwesome icons in PyQt and PySide applications +[qtconsole](https://pypi.org/project/qtconsole) | 5.5.2 | Jupyter Qt console +[qtpy](https://pypi.org/project/qtpy) | 2.4.1 | Provides an abstraction layer on top of the various Qt bindings (PyQt5/6 and PySide2/6). +[quantecon](https://pypi.org/project/quantecon) | 0.7.2 | Import the main names to top level. +[quart](https://pypi.org/project/quart) | 0.19.4 | A Python ASGI web microframework with the same API as Flask +[rapidfuzz](https://pypi.org/project/rapidfuzz) | 3.9.3 | rapid fuzzy string matching +[rasterio](https://pypi.org/project/rasterio) | 1.3.10 | Fast and direct raster I/O for use with Numpy and SciPy +[readme_renderer](https://pypi.org/project/readme_renderer) | 35.0 | readme_renderer is a library for rendering "readme" descriptions for Warehouse +[redis](https://pypi.org/project/redis) | 5.0.3 | Python client for Redis database and key-value store +[referencing](https://pypi.org/project/referencing) | 0.35.1 | JSON Referencing + Python +[regex](https://pypi.org/project/regex) | 2023.10.3 | Alternative regular expression module, to replace re. +[reportlab](https://pypi.org/project/reportlab) | 4.2.2 | The Reportlab Toolkit +[requests](https://pypi.org/project/requests) | 2.31.0 | Python HTTP for Humans. +[requests_ntlm](https://pypi.org/project/requests_ntlm) | 1.1.0 | This package allows for HTTP NTLM authentication using the requests library. +[requests_toolbelt](https://pypi.org/project/requests_toolbelt) | 1.0.0 | A utility belt for advanced users of python-requests +[rfc3339_validator](https://pypi.org/project/rfc3339_validator) | 0.1.4 | A pure python RFC3339 validator +[rfc3986](https://pypi.org/project/rfc3986) | 2.0.0 | Validating URI References per RFC 3986 +[rfc3986_validator](https://pypi.org/project/rfc3986_validator) | 0.1.1 | Pure python rfc3986 validator +[rich](https://pypi.org/project/rich) | 13.7.1 | Render rich text, tables, progress bars, syntax highlighting, markdown and more to the terminal +[rope](https://pypi.org/project/rope) | 1.12.0 | a python refactoring library... +[rpds_py](https://pypi.org/project/rpds_py) | 0.13.2 | Python bindings to Rust's persistent data structures (rpds) +[rtree](https://pypi.org/project/rtree) | 1.1.0 | R-Tree spatial index for Python GIS +[rx](https://pypi.org/project/rx) | 3.1.1 | Reactive Extensions (Rx) for Python +[scikit_image](https://pypi.org/project/scikit_image) | 0.24.0 | Image processing in Python +[scikit_learn](https://pypi.org/project/scikit_learn) | 1.5.1 | A set of python modules for machine learning and data mining +[scipy](https://pypi.org/project/scipy) | 1.14.1 | Fundamental algorithms for scientific computing in Python +[scramp](https://pypi.org/project/scramp) | 1.4.1 | An implementation of the SCRAM protocol. +[scs](https://pypi.org/project/scs) | 3.2.4.post1 | Splitting conic solver +[seaborn](https://pypi.org/project/seaborn) | 0.13.2 | Statistical data visualization +[send2trash](https://pypi.org/project/send2trash) | 1.8.2 | Send file to trash natively under Mac OS X, Windows and Linux +[setuptools](https://pypi.org/project/setuptools) | 72.2.0 | Easily download, build, install, upgrade, and uninstall Python packages +[shapely](https://pypi.org/project/shapely) | 2.0.4 | Manipulation and analysis of geometric objects +[shellingham](https://pypi.org/project/shellingham) | 1.5.0.post1 | Tool to Detect Surrounding Shell +[simplegeneric](https://pypi.org/project/simplegeneric) | 0.8.1 | Simple generic functions (similar to Python's own len(), pickle.dump(), etc.) +[simplejson](https://pypi.org/project/simplejson) | 3.19.2 | Simple, fast, extensible JSON encoder/decoder for Python +[simpy](https://pypi.org/project/simpy) | 4.0.1 | Event discrete, process based simulation for Python. +[six](https://pypi.org/project/six) | 1.16.0 | Python 2 and 3 compatibility utilities +[smmap](https://pypi.org/project/smmap) | 5.0.0 | A pure Python implementation of a sliding window memory map manager +[sniffio](https://pypi.org/project/sniffio) | 1.3.0 | Sniff out which async library your code is running under +[snowballstemmer](https://pypi.org/project/snowballstemmer) | 2.2.0 | This package provides 29 stemmers for 28 languages generated from Snowball algorithms. +[snuggs](https://pypi.org/project/snuggs) | 1.4.7 | Snuggs are s-expressions for Numpy +[sortedcontainers](https://pypi.org/project/sortedcontainers) | 2.4.0 | Sorted Containers -- Sorted List, Sorted Dict, Sorted Set +[sounddevice](https://pypi.org/project/sounddevice) | 0.4.6 | Play and Record Sound with Python +[soupsieve](https://pypi.org/project/soupsieve) | 2.5 | A modern CSS selector implementation for Beautiful Soup. +[sphinx](https://pypi.org/project/sphinx) | 7.3.7 | Python documentation generator +[sphinx_rtd_theme](https://pypi.org/project/sphinx_rtd_theme) | 2.0.0 | Read the Docs theme for Sphinx +[sphinxcontrib_applehelp](https://pypi.org/project/sphinxcontrib_applehelp) | 1.0.8 | sphinxcontrib-applehelp is a Sphinx extension which outputs Apple help books +[sphinxcontrib_devhelp](https://pypi.org/project/sphinxcontrib_devhelp) | 1.0.6 | sphinxcontrib-devhelp is a sphinx extension which outputs Devhelp documents +[sphinxcontrib_htmlhelp](https://pypi.org/project/sphinxcontrib_htmlhelp) | 2.0.5 | sphinxcontrib-htmlhelp is a sphinx extension which renders HTML help files +[sphinxcontrib_jquery](https://pypi.org/project/sphinxcontrib_jquery) | 4.1 | Extension to include jQuery on newer Sphinx releases +[sphinxcontrib_jsmath](https://pypi.org/project/sphinxcontrib_jsmath) | 1.0.1 | A sphinx extension which renders display math in HTML via JavaScript +[sphinxcontrib_qthelp](https://pypi.org/project/sphinxcontrib_qthelp) | 1.0.7 | sphinxcontrib-qthelp is a sphinx extension which outputs QtHelp documents +[sphinxcontrib_serializinghtml](https://pypi.org/project/sphinxcontrib_serializinghtml) | 1.1.9 | sphinxcontrib-serializinghtml is a sphinx extension which outputs "serialized" HTML files (json and pickle) +[spyder](https://pypi.org/project/spyder) | 5.5.6 | The Scientific Python Development Environment +[spyder_kernels](https://pypi.org/project/spyder_kernels) | 2.5.2 | Jupyter kernels for Spyder's console +[sqlalchemy](https://pypi.org/project/sqlalchemy) | 2.0.30 | Database Abstraction Library +[sqlite_bro](https://pypi.org/project/sqlite_bro) | 0.13.1 | a graphic SQLite Client in 1 Python file +[sqlite_fts4](https://pypi.org/project/sqlite_fts4) | 1.0.3 | Python functions for working with SQLite FTS4 search +[sqlite_utils](https://pypi.org/project/sqlite_utils) | 3.37 | CLI tool and Python library for manipulating SQLite databases +[sqlparse](https://pypi.org/project/sqlparse) | 0.4.3 | A non-validating SQL parser. +[sspyrs](https://pypi.org/project/sspyrs) | 0.3 | Lightweight interface for SSRS reports to python +[stack_data](https://pypi.org/project/stack_data) | 0.6.3 | Extract data from python stack frames and tracebacks for informative displays +[starlette](https://pypi.org/project/starlette) | 0.37.2 | The little ASGI library that shines. +[statsmodels](https://pypi.org/project/statsmodels) | 0.14.2 | Statistical computations and models for Python +[streamlit](https://pypi.org/project/streamlit) | 1.37.1 | A faster way to build and share data apps +[streamz](https://pypi.org/project/streamz) | 0.6.3 | Streams +[swifter](https://pypi.org/project/swifter) | 1.3.4 | A package which efficiently applies any function to a pandas dataframe or series in the fastest available manner +[sympy](https://pypi.org/project/sympy) | 1.13.2 | Computer algebra system (CAS) in Python +[tabulate](https://pypi.org/project/tabulate) | 0.9.0 | Pretty-print tabular data +[tbats](https://pypi.org/project/tbats) | 1.1.0 | BATS and TBATS for time series forecasting +[tblib](https://pypi.org/project/tblib) | 3.0.0 | Traceback serialization library. +[tenacity](https://pypi.org/project/tenacity) | 8.5.0 | Retry code until it succeeds +[terminado](https://pypi.org/project/terminado) | 0.18.1 | Tornado websocket backend for the Xterm.js Javascript terminal emulator library. +[text_unidecode](https://pypi.org/project/text_unidecode) | 1.3 | The most basic Text::Unidecode port +[textdistance](https://pypi.org/project/textdistance) | 4.6.2 | Compute distance between the two texts. +[threadpoolctl](https://pypi.org/project/threadpoolctl) | 3.5.0 | threadpoolctl +[three_merge](https://pypi.org/project/three_merge) | 0.1.1 | Simple library for merging two strings with respect to a base one +[tifffile](https://pypi.org/project/tifffile) | 2024.7.2 | Read and write TIFF files +[tinycss2](https://pypi.org/project/tinycss2) | 1.3.0 | A tiny CSS parser +[toml](https://pypi.org/project/toml) | 0.10.2 | Python Library for Tom's Obvious, Minimal Language +[tomli](https://pypi.org/project/tomli) | 2.0.1 | A lil' TOML parser +[tomli_w](https://pypi.org/project/tomli_w) | 1.0.0 | A lil' TOML writer +[tomlkit](https://pypi.org/project/tomlkit) | 0.12.3 | Style preserving TOML library +[toolz](https://pypi.org/project/toolz) | 0.12.0 | List processing tools and functional utilities +[tornado](https://pypi.org/project/tornado) | 6.4.1 | Tornado is a Python web framework and asynchronous networking library, originally developed at FriendFeed. +[tqdm](https://pypi.org/project/tqdm) | 4.66.4 | Fast, Extensible Progress Meter +[traitlets](https://pypi.org/project/traitlets) | 5.14.1 | Traitlets Python configuration system +[traittypes](https://pypi.org/project/traittypes) | 0.2.1 | Scipy trait types +[trio](https://pypi.org/project/trio) | 0.26.2 | A friendly Python library for async concurrency and I/O +[trove_classifiers](https://pypi.org/project/trove_classifiers) | 2023.2.20 | Canonical source for classifiers on PyPI (pypi.org). +[twine](https://pypi.org/project/twine) | 4.0.1 | Collection of utilities for publishing packages on PyPI +[typer](https://pypi.org/project/typer) | 0.12.3 | Typer, build great CLIs. Easy to code. Based on Python type hints. +[types_python_dateutil](https://pypi.org/project/types_python_dateutil) | 2.9.0.20240316 | Typing stubs for python-dateutil +[typing_extensions](https://pypi.org/project/typing_extensions) | 4.12.2 | Backported and Experimental Type Hints for Python 3.8+ +[tzdata](https://pypi.org/project/tzdata) | 2024.1 | Provider of IANA time zone data +[tzlocal](https://pypi.org/project/tzlocal) | 5.2 | tzinfo object for the local timezone +[uc_micro_py](https://pypi.org/project/uc_micro_py) | 1.0.1 | Micro subset of unicode data files for linkify-it-py projects. +[ujson](https://pypi.org/project/ujson) | 5.8.0 | Ultra fast JSON encoder and decoder for Python +[umap_learn](https://pypi.org/project/umap_learn) | 0.5.6 | Uniform Manifold Approximation and Projection +[uncertainties](https://pypi.org/project/uncertainties) | 3.1.7 | Transparent calculations with uncertainties on the quantities involved (aka error propagation); fast calculation of derivatives +[uri_template](https://pypi.org/project/uri_template) | 1.3.0 | RFC 6570 URI Template Processor +[urllib3](https://pypi.org/project/urllib3) | 2.0.3 | HTTP library with thread-safe connection pooling, file post, and more. +[uvicorn](https://pypi.org/project/uvicorn) | 0.30.3 | The lightning-fast ASGI server. +[vega_datasets](https://pypi.org/project/vega_datasets) | 0.9.0 | A Python package for offline access to Vega datasets +[waitress](https://pypi.org/project/waitress) | 3.0.0 | Waitress WSGI server +[watchdog](https://pypi.org/project/watchdog) | 4.0.1 | Filesystem events monitoring +[watchfiles](https://pypi.org/project/watchfiles) | 0.21.0 | Simple, modern and high performance file watching and code reload in python. +[wcwidth](https://pypi.org/project/wcwidth) | 0.2.13 | Measures the displayed width of unicode strings in a terminal +[webcolors](https://pypi.org/project/webcolors) | 1.12 | A library for working with color names and color values formats defined by HTML and CSS. +[webencodings](https://pypi.org/project/webencodings) | 0.5.1 | Character encoding aliases for legacy web content +[websocket_client](https://pypi.org/project/websocket_client) | 1.8.0 | WebSocket client for Python with low level API options +[websockets](https://pypi.org/project/websockets) | 12.0 | An implementation of the WebSocket Protocol (RFC 6455 & 7692) +[werkzeug](https://pypi.org/project/werkzeug) | 3.0.3 | The comprehensive WSGI web application library. +[whatthepatch](https://pypi.org/project/whatthepatch) | 1.0.2 | A patch parsing and application library. +[wheel](https://pypi.org/project/wheel) | 0.44.0 | A built-package format for Python +[widgetsnbextension](https://pypi.org/project/widgetsnbextension) | 4.0.13 | Jupyter interactive widgets for Jupyter Notebook +[winpython](https://pypi.org/project/winpython) | 10.7.20240908 | WinPython distribution tools, including WPPM +[wordcloud](https://pypi.org/project/wordcloud) | 1.9.3 | A little word cloud generator +[wrapt](https://pypi.org/project/wrapt) | 1.16.0 | Module for decorators, wrappers and monkey patching. +[wsproto](https://pypi.org/project/wsproto) | 1.2.0 | WebSockets state-machine based protocol implementation +[xarray](https://pypi.org/project/xarray) | 2024.7.0 | N-D labeled arrays and datasets in Python +[xlsxwriter](https://pypi.org/project/xlsxwriter) | 3.1.9 | A Python module for creating Excel XLSX files. +[xlwings](https://pypi.org/project/xlwings) | 0.24.7 | Make Excel fly: Interact with Excel from Python and vice versa. +[xmltodict](https://pypi.org/project/xmltodict) | 0.13.0 | Makes working with XML feel like you are working with JSON +[xyzservices](https://pypi.org/project/xyzservices) | 2023.10.1 | Source of XYZ tiles providers +[yapf](https://pypi.org/project/yapf) | 0.40.1 | A formatter for Python code. +[yarl](https://pypi.org/project/yarl) | 1.7.2 | Yet another URL library +[yt_dlp](https://pypi.org/project/yt_dlp) | 2023.7.6 | A youtube-dl fork with additional features and patches +[zict](https://pypi.org/project/zict) | 3.0.0 | Mutable mapping tools +[zipp](https://pypi.org/project/zipp) | 3.17.0 | Backport of pathlib-compatible object wrapper for zip files +[zstandard](https://pypi.org/project/zstandard) | 0.23.0 | Zstandard bindings for Python + +
diff --git a/changelogs/WinPythonslim-64bit-3.12.6.0_History.md b/changelogs/WinPythonslim-64bit-3.12.6.0_History.md new file mode 100644 index 00000000..1f2dbdde --- /dev/null +++ b/changelogs/WinPythonslim-64bit-3.12.6.0_History.md @@ -0,0 +1,195 @@ +## History of changes for WinPython-64bit 3.12.6.0slim + +The following changes were made to WinPython-64bit distribution since version 3.12.4.1. (non-slim) + +
+### Tools + +Removed packages: + + * [Nodejs](https://nodejs.org) v20.12.2 (a JavaScript runtime built on Chrome's V8 JavaScript engine) + * [npmjs](https://www.npmjs.com/) 10.5.0 (a package manager for JavaScript) + +### Python packages + +New packages: + + * [jiter](https://pypi.org/project/jiter) 0.5.0 (Fast iterable JSON parser.) + * [narwhals](https://pypi.org/project/narwhals) 1.5.5 (Extremely lightweight compatibility layer between dataframe libraries) + * [types_python_dateutil](https://pypi.org/project/types_python_dateutil) 2.9.0.20240316 (Typing stubs for python-dateutil) + +Upgraded packages: + + * [altair](https://pypi.org/project/altair) 5.3.0 → 5.4.1 (Vega-Altair: A declarative statistical visualization library for Python.) + * [array_api_compat](https://pypi.org/project/array_api_compat) 1.7.1 → 1.8 (A wrapper around NumPy and other array libraries to make them compatible with the Array API standard) + * [arrow](https://pypi.org/project/arrow) 1.2.2 → 1.3.0 (Better dates & times for Python) + * [azure_core](https://pypi.org/project/azure_core) 1.30.1 → 1.30.2 (Microsoft Azure Core Library for Python) + * [azure_cosmos](https://pypi.org/project/azure_cosmos) 4.6.0 → 4.7.0 (Microsoft Azure Cosmos Client Library for Python) + * [azure_identity](https://pypi.org/project/azure_identity) 1.16.0 → 1.16.1 (Microsoft Azure Identity Library for Python) + * [black](https://pypi.org/project/black) 24.4.2 → 24.8.0 (The uncompromising code formatter.) + * [bokeh](https://pypi.org/project/bokeh) 3.4.1 → 3.5.1 (Interactive plots and applications in the browser from Python) + * [cython](https://pypi.org/project/cython) 3.0.10 → 3.0.11 (The Cython compiler for writing C extensions in the Python language.) + * [dask](https://pypi.org/project/dask) 2024.5.2 → 2024.7.1 (Parallel PyData with Task Scheduling) + * [dask_expr](https://pypi.org/project/dask_expr) 1.1.2 → 1.1.9 (High Level Expressions for Dask ) + * [datasette](https://pypi.org/project/datasette) 0.64.6 → 0.64.8 (An open source multi-tool for exploring and publishing data) + * [datashader](https://pypi.org/project/datashader) 0.16.2 → 0.16.3 (Data visualization toolchain based on aggregating into a grid) + * [decorator](https://pypi.org/project/decorator) 4.4.2 → 5.1.1 (Decorators for Humans) + * [diff_match_patch](https://pypi.org/project/diff_match_patch) 20200713 → 20230430 (Diff Match and Patch) + * [distributed](https://pypi.org/project/distributed) 2024.5.2 → 2024.7.1 (Distributed scheduler for Dask) + * [django](https://pypi.org/project/django) 5.0.6 → 5.0.7 (A high-level Python web framework that encourages rapid development and clean, pragmatic design.) + * [email_validator](https://pypi.org/project/email_validator) 2.1.1 → 2.2.0 (A robust email address syntax and deliverability validation library.) + * [fastapi](https://pypi.org/project/fastapi) 0.111.0 → 0.111.1 (FastAPI framework, high performance, easy to learn, fast to code, ready for production) + * [flake8](https://pypi.org/project/flake8) 7.0.0 → 7.1.1 (the modular source code checker: pep8 pyflakes and co) + * [folium](https://pypi.org/project/folium) 0.16.0 → 0.17.0 (Make beautiful maps with Leaflet.js & Python) + * [fsspec](https://pypi.org/project/fsspec) 2024.3.1 → 2024.6.1 (File-system specification) + * [guidata](https://pypi.org/project/guidata) 3.5.0 → 3.6.2 (Automatic GUI generation for easy dataset editing and display) + * [hatchling](https://pypi.org/project/hatchling) 1.24.2 → 1.25.0 (Modern, extensible Python build backend) + * [holoviews](https://pypi.org/project/holoviews) 1.19.0 → 1.19.1 (A high-level plotting API for the PyData ecosystem built on HoloViews.) + * [httpie](https://pypi.org/project/httpie) 3.2.2 → 3.2.3 (HTTPie: modern, user-friendly command-line HTTP client for the API era.) + * [huggingface_hub](https://pypi.org/project/huggingface_hub) 0.23.0 → 0.24.5 (Client library to download and publish models, datasets and other repos on the huggingface.co hub) + * [hypothesis](https://pypi.org/project/hypothesis) 6.100.5 → 6.108.5 (A library for property-based testing) + * [ipykernel](https://pypi.org/project/ipykernel) 6.29.4 → 6.29.5 (IPython Kernel for Jupyter) + * [ipyleaflet](https://pypi.org/project/ipyleaflet) 0.19.1 → 0.19.2 (A Jupyter widget for dynamic Leaflet maps) + * [ipython](https://pypi.org/project/ipython) 8.25.0 → 8.26.0 (IPython: Productive Interactive Computing) + * [ipywidgets](https://pypi.org/project/ipywidgets) 8.1.2 → 8.1.5 (Jupyter interactive widgets) + * [jupyter_leaflet](https://pypi.org/project/jupyter_leaflet) 0.19.1 → 0.19.2 (ipyleaflet extensions for JupyterLab and Jupyter Notebook) + * [jupyter_server](https://pypi.org/project/jupyter_server) 2.14.1 → 2.14.2 (The backend—i.e. core services, APIs, and REST endpoints—to Jupyter web applications.) + * [jupyterlab](https://pypi.org/project/jupyterlab) 4.2.2 → 4.2.5 (JupyterLab computational environment) + * [jupyterlab_server](https://pypi.org/project/jupyterlab_server) 2.27.2 → 2.27.3 (A set of server components for JupyterLab and JupyterLab like applications.) + * [jupyterlab_widgets](https://pypi.org/project/jupyterlab_widgets) 3.0.11 → 3.0.13 (Jupyter interactive widgets for JupyterLab) + * [keras](https://pypi.org/project/keras) 3.3.3 → 3.5.0 (Multi-backend Keras.) + * [mako](https://pypi.org/project/mako) 1.2.0 → 1.3.5 (A super-fast templating language that borrows the best ideas from the existing templating languages.) + * [matplotlib](https://pypi.org/project/matplotlib) 3.9.0 → 3.9.2 (Python plotting package) + * [maturin](https://pypi.org/project/maturin) 1.5.1 → 1.7.0 (Build and publish crates with pyo3, cffi and uniffi bindings as well as rust binaries as python packages) + * [msal](https://pypi.org/project/msal) 1.24.1 → 1.30.0 (The Microsoft Authentication Library (MSAL) for Python library enables your app to access the Microsoft Cloud by supporting authentication of us) + * [msal_extensions](https://pypi.org/project/msal_extensions) 1.0.0 → 1.2.0 (Microsoft Authentication Library extensions (MSAL EX) provides a persistence API that can save your data on disk, encrypted on Windows, macOS an) + * [mypy](https://pypi.org/project/mypy) 1.10.0 → 1.11.1 (Optional static typing for Python) + * [netcdf4](https://pypi.org/project/netcdf4) 1.6.5 → 1.7.1.post2 (Provides an object-oriented python interface to the netCDF version 4 library) + * [numexpr](https://pypi.org/project/numexpr) 2.10.0 → 2.10.1 (Fast numerical expression evaluator for NumPy) + * [numpy](https://pypi.org/project/numpy) 1.26.4 → 2.0.1 (Fundamental package for array computing in Python) + * [openai](https://pypi.org/project/openai) 1.33.0 → 1.42.0 (The official Python library for the openai API) + * [opencv_python](https://pypi.org/project/opencv_python) 4.10.0.82 → 4.10.0.84 (Wrapper package for OpenCV python bindings.) + * [panel](https://pypi.org/project/panel) 1.4.4 → 1.5.0b4 (The powerful data exploration & web app framework for Python.) + * [param](https://pypi.org/project/param) 2.1.0 → 2.1.1 (Make your Python code clearer and more reliable by declaring Parameters.) + * [pillow](https://pypi.org/project/pillow) 10.3.0 → 10.4.0 (Python Imaging Library (Fork)) + * [pip](https://pypi.org/project/pip) 24.0 → 24.2 (The PyPA recommended tool for installing Python packages.) + * [plotly](https://pypi.org/project/plotly) 5.22.0 → 5.23.0 (An open-source, interactive data visualization library for Python) + * [plotpy](https://pypi.org/project/plotpy) 2.3.0 → 2.6.2 (Curve and image plotting tools for Python/Qt applications) + * [polars](https://pypi.org/project/polars) 0.20.31 → 1.6.0 (Blazingly fast DataFrame library) + * [prompt_toolkit](https://pypi.org/project/prompt_toolkit) 3.0.43 → 3.0.47 (Library for building powerful interactive command lines in Python) + * [protobuf](https://pypi.org/project/protobuf) 4.25.1 → 5.27.3 () + * [ptpython](https://pypi.org/project/ptpython) 3.0.26 → 3.0.29 (Python REPL build on top of prompt_toolkit) + * [pyarrow](https://pypi.org/project/pyarrow) 16.1.0 → 17.0.0 (Python library for Apache Arrow) + * [pybind11](https://pypi.org/project/pybind11) 2.12.0 → 2.13.1 (Seamless operability between C++11 and Python) + * [pycodestyle](https://pypi.org/project/pycodestyle) 2.11.1 → 2.12.0 (Python style guide checker) + * [pydantic](https://pypi.org/project/pydantic) 2.7.1 → 2.8.2 (Data validation using Python type hints) + * [pydantic_core](https://pypi.org/project/pydantic_core) 2.18.2 → 2.20.1 (Core functionality for Pydantic validation and serialization) + * [pymoo](https://pypi.org/project/pymoo) 0.6.1.1 → 0.6.1.3 (Multi-Objective Optimization in Python) + * [pyomo](https://pypi.org/project/pyomo) 6.7.2 → 6.8.0 (Pyomo: Python Optimization Modeling Objects) + * [pytest](https://pypi.org/project/pytest) 8.2.0 → 8.2.2 (pytest: simple powerful testing with Python) + * [Python](http://www.python.org/) 3.12.4 → 3.12.6 (Python programming language with standard library) + * [python_lsp_server](https://pypi.org/project/python_lsp_server) 1.11.0 → 1.12.0 (Python Language Server for the Language Server Protocol) + * [python_slugify](https://pypi.org/project/python_slugify) 6.1.2 → 8.0.4 (A Python slugify application that also handles Unicode) + * [pythonqwt](https://pypi.org/project/pythonqwt) 0.12.1 → 0.12.7 (Qt plotting widgets for Python) + * [pytz](https://pypi.org/project/pytz) 2023.3 → 2024.1 (World timezone definitions, modern and historical) + * [pyviz_comms](https://pypi.org/project/pyviz_comms) 3.0.2 → 3.0.3 (A JupyterLab extension for rendering HoloViz content.) + * [quantecon](https://pypi.org/project/quantecon) 0.5.3 → 0.7.2 (Import the main names to top level.) + * [rapidfuzz](https://pypi.org/project/rapidfuzz) 3.5.2 → 3.9.3 (rapid fuzzy string matching) + * [redis](https://pypi.org/project/redis) 4.3.1 → 5.0.3 (Python client for Redis database and key-value store) + * [referencing](https://pypi.org/project/referencing) 0.31.1 → 0.35.1 (JSON Referencing + Python) + * [reportlab](https://pypi.org/project/reportlab) 4.2.0 → 4.2.2 (The Reportlab Toolkit) + * [scikit_image](https://pypi.org/project/scikit_image) 0.23.2 → 0.24.0 (Image processing in Python) + * [scikit_learn](https://pypi.org/project/scikit_learn) 1.5.0 → 1.5.1 (A set of python modules for machine learning and data mining) + * [scipy](https://pypi.org/project/scipy) 1.13.1 → 1.14.1 (Fundamental algorithms for scientific computing in Python) + * [setuptools](https://pypi.org/project/setuptools) 69.5.1 → 72.2.0 (Easily download, build, install, upgrade, and uninstall Python packages) + * [sphinx](https://pypi.org/project/sphinx) 7.2.6 → 7.3.7 (Python documentation generator) + * [sphinxcontrib_applehelp](https://pypi.org/project/sphinxcontrib_applehelp) 1.0.2 → 1.0.8 (sphinxcontrib-applehelp is a Sphinx extension which outputs Apple help books) + * [sphinxcontrib_devhelp](https://pypi.org/project/sphinxcontrib_devhelp) 1.0.2 → 1.0.6 (sphinxcontrib-devhelp is a sphinx extension which outputs Devhelp documents) + * [sphinxcontrib_htmlhelp](https://pypi.org/project/sphinxcontrib_htmlhelp) 2.0.0 → 2.0.5 (sphinxcontrib-htmlhelp is a sphinx extension which renders HTML help files) + * [sphinxcontrib_qthelp](https://pypi.org/project/sphinxcontrib_qthelp) 1.0.3 → 1.0.7 (sphinxcontrib-qthelp is a sphinx extension which outputs QtHelp documents) + * [spyder](https://pypi.org/project/spyder) 5.5.5 → 5.5.6 (The Scientific Python Development Environment) + * [sqlalchemy](https://pypi.org/project/sqlalchemy) 2.0.28 → 2.0.30 (Database Abstraction Library) + * [sqlite_utils](https://pypi.org/project/sqlite_utils) 3.36 → 3.37 (CLI tool and Python library for manipulating SQLite databases) + * [streamlit](https://pypi.org/project/streamlit) 1.35.0 → 1.37.1 (A faster way to build and share data apps) + * [sympy](https://pypi.org/project/sympy) 1.12.1 → 1.13.2 (Computer algebra system (CAS) in Python) + * [tblib](https://pypi.org/project/tblib) 1.7.0 → 3.0.0 (Traceback serialization library.) + * [tenacity](https://pypi.org/project/tenacity) 8.1.0 → 8.5.0 (Retry code until it succeeds) + * [textdistance](https://pypi.org/project/textdistance) 4.5.0 → 4.6.2 (Compute distance between the two texts.) + * [tifffile](https://pypi.org/project/tifffile) 2023.7.18 → 2024.7.2 (Read and write TIFF files) + * [tinycss2](https://pypi.org/project/tinycss2) 1.1.1 → 1.3.0 (A tiny CSS parser) + * [tornado](https://pypi.org/project/tornado) 6.4 → 6.4.1 (Tornado is a Python web framework and asynchronous networking library, originally developed at FriendFeed.) + * [trio](https://pypi.org/project/trio) 0.25.1 → 0.26.2 (A friendly Python library for async concurrency and I/O) + * [typing_extensions](https://pypi.org/project/typing_extensions) 4.9.0 → 4.12.2 (Backported and Experimental Type Hints for Python 3.8+) + * [tzdata](https://pypi.org/project/tzdata) 2022.7 → 2024.1 (Provider of IANA time zone data) + * [tzlocal](https://pypi.org/project/tzlocal) 4.2 → 5.2 (tzinfo object for the local timezone) + * [umap_learn](https://pypi.org/project/umap_learn) 0.5.1 → 0.5.6 (Uniform Manifold Approximation and Projection) + * [uri_template](https://pypi.org/project/uri_template) 1.2.0 → 1.3.0 (RFC 6570 URI Template Processor) + * [uvicorn](https://pypi.org/project/uvicorn) 0.29.0 → 0.30.3 (The lightning-fast ASGI server.) + * [waitress](https://pypi.org/project/waitress) 2.1.2 → 3.0.0 (Waitress WSGI server) + * [watchdog](https://pypi.org/project/watchdog) 2.2.0 → 4.0.1 (Filesystem events monitoring) + * [wheel](https://pypi.org/project/wheel) 0.43.0 → 0.44.0 (A built-package format for Python) + * [widgetsnbextension](https://pypi.org/project/widgetsnbextension) 4.0.10 → 4.0.13 (Jupyter interactive widgets for Jupyter Notebook) + * [winpython](https://pypi.org/project/winpython) 8.2.20240618 → 10.7.20240908 (WinPython distribution tools, including WPPM) + * [wrapt](https://pypi.org/project/wrapt) 1.14.1 → 1.16.0 (Module for decorators, wrappers and monkey patching.) + * [xarray](https://pypi.org/project/xarray) 2024.6.0 → 2024.7.0 (N-D labeled arrays and datasets in Python) + * [zstandard](https://pypi.org/project/zstandard) 0.22.0 → 0.23.0 (Zstandard bindings for Python) + +Removed packages: + + * [accelerate](https://pypi.org/project/accelerate) 0.28.0 (Accelerate) + * [altair_data_server](https://pypi.org/project/altair_data_server) 0.4.1 (A background data server for Altair charts.) + * [altair_transform](https://pypi.org/project/altair_transform) 0.2.0 (A python engine for evaluating Altair transforms.) + * [async_timeout](https://pypi.org/project/async_timeout) 4.0.3 (Timeout context manager for asyncio programs) + * [botorch](https://pypi.org/project/botorch) 0.9.5 (Bayesian Optimization in PyTorch) + * [coverage](https://pypi.org/project/coverage) 7.5.3 (Code coverage measurement for Python) + * [dash](https://pypi.org/project/dash) 2.17.0 (A Python framework for building reactive web-apps. Developed by Plotly.) + * [dash_core_components](https://pypi.org/project/dash_core_components) 2.0.0 (Core component suite for Dash) + * [dash_html_components](https://pypi.org/project/dash_html_components) 2.0.0 (Vanilla HTML components for Dash) + * [dash_table](https://pypi.org/project/dash_table) 5.0.0 (Dash table) + * [dask_image](https://pypi.org/project/dask_image) 2024.5.3 (Distributed image processing) + * [distlib](https://pypi.org/project/distlib) 0.3.8 (Distribution utilities) + * [gdal](https://pypi.org/project/gdal) 3.7.3 (GDAL: Geospatial Data Abstraction Library) + * [gpytorch](https://pypi.org/project/gpytorch) 1.11 (An implementation of Gaussian Processes in Pytorch) + * [imageio_ffmpeg](https://pypi.org/project/imageio_ffmpeg) 0.4.8 (FFMPEG wrapper for Python) + * [jaxtyping](https://pypi.org/project/jaxtyping) 0.2.22 (Type annotations and runtime checking for shape and dtype of JAX arrays, and PyTrees.) + * [jsonpatch](https://pypi.org/project/jsonpatch) 1.33 (Apply JSON-Patches (RFC 6902) ) + * [kornia](https://pypi.org/project/kornia) 0.7.2 (Open Source Differentiable Computer Vision Library for PyTorch) + * [kornia_rs](https://pypi.org/project/kornia_rs) 0.1.3 (Low level implementations for computer vision in Rust) + * [langchain](https://pypi.org/project/langchain) 0.2.5 (Building applications with LLMs through composability) + * [langchain_core](https://pypi.org/project/langchain_core) 0.2.7 (Building applications with LLMs through composability) + * [langchain_text_splitters](https://pypi.org/project/langchain_text_splitters) 0.2.1 (LangChain text splitting utilities) + * [langsmith](https://pypi.org/project/langsmith) 0.1.77 (Client library to connect to the LangSmith LLM Tracing and Evaluation Platform.) + * [lightning](https://pypi.org/project/lightning) 2.2.1 (The Deep Learning framework to train, deploy, and ship AI products Lightning fast.) + * [lightning_utilities](https://pypi.org/project/lightning_utilities) 0.10.0 (PyTorch Lightning Sample project.) + * [linear_operator](https://pypi.org/project/linear_operator) 0.5.1 (A linear operator implementation, primarily designed for finite-dimensional positive definite operators (i.e. kernel matrices).) + * [moviepy](https://pypi.org/project/moviepy) 1.0.3 (Video editing with Python) + * [opt_einsum](https://pypi.org/project/opt_einsum) 3.3.0 (Optimizing numpys einsum function) + * [ortools](https://pypi.org/project/ortools) 9.8.3296 (Google OR-Tools python libraries and modules) + * [pims](https://pypi.org/project/pims) 0.6.1 (Python Image Sequence) + * [portpicker](https://pypi.org/project/portpicker) 1.5.0 (A library to choose unique available network ports.) + * [proglog](https://pypi.org/project/proglog) 0.1.10 (Log and progress bar manager for console, notebooks, web...) + * [pyepsg](https://pypi.org/project/pyepsg) 0.4.0 (Easy access to the EPSG database via http://epsg.io/) + * [pygame](https://pypi.org/project/pygame) 2.5.2 (Python Game Development) + * [pyro_api](https://pypi.org/project/pyro_api) 0.1.2 (Generic API for dispatch to Pyro backends.) + * [pyro_ppl](https://pypi.org/project/pyro_ppl) 1.9.0 (A Python library for probabilistic modeling and inference) + * [pytorch_lightning](https://pypi.org/project/pytorch_lightning) 2.2.1 (PyTorch Lightning is the lightweight PyTorch wrapper for ML researchers. Scale your models. Write less boilerplate.) + * [pytz_deprecation_shim](https://pypi.org/project/pytz_deprecation_shim) 0.1.0.post0 (Shims to make deprecation of pytz easier) + * [qpsolvers](https://pypi.org/project/qpsolvers) 4.3.0 (Quadratic programming solvers in Python with a unified API.) + * [retrying](https://pypi.org/project/retrying) 1.3.4 (Retrying) + * [safetensors](https://pypi.org/project/safetensors) 0.4.2 (Fast and Safe Tensor serialization) + * [slicerator](https://pypi.org/project/slicerator) 1.1.0 (A lazy-loading, fancy-sliceable iterable.) + * [tokenizers](https://pypi.org/project/tokenizers) 0.15.1 (Fast and Customizable Tokenizers) + * [torch](https://pypi.org/project/torch) 2.2.2 (Tensors and Dynamic neural networks in Python with strong GPU acceleration) + * [torchaudio](https://pypi.org/project/torchaudio) 2.2.2 (An audio package for PyTorch) + * [torchmetrics](https://pypi.org/project/torchmetrics) 1.3.2 (PyTorch native Metrics) + * [torchvision](https://pypi.org/project/torchvision) 0.17.2 (image and video datasets and models for torch deep learning) + * [transformers](https://pypi.org/project/transformers) 4.38.2 (State-of-the-art Machine Learning for JAX, PyTorch and TensorFlow) + * [typeguard](https://pypi.org/project/typeguard) 2.13.3 (Run-time type checker for Python) + * [virtualenv](https://pypi.org/project/virtualenv) 20.26.2 (Virtual Python Environment builder) + * [wasmer](https://pypi.org/project/wasmer) 1.1.0 (Python extension to run WebAssembly binaries) + * [wasmer_compiler_cranelift](https://pypi.org/project/wasmer_compiler_cranelift) 1.1.0 (Python extension to run WebAssembly binaries) + * [wasmer_compiler_singlepass](https://pypi.org/project/wasmer_compiler_singlepass) 1.1.0 (Python extension to run WebAssembly binaries) + + +
+* * * diff --git a/changelogs/md5_sha1.txt b/changelogs/md5_sha1.txt index 04a7c92f..6bb19755 100644 --- a/changelogs/md5_sha1.txt +++ b/changelogs/md5_sha1.txt @@ -1,5 +1,17 @@ -### WinPython 2024-03 release (June 22th, 2024) +### WinPython 2024-03 release (September 14th, 2024) + + MD5 | SHA-1 | SHA-256 | Binary | Size | blake2b-256 +---------------------------------|------------------------------------------|------------------------------------------------------------------|-----------------------------------|--------------------|----------------------------------------------------------------- +d3a0d99078b70e13b50b8c693ac23cc5 | 7b1e3f6ea970bddca752bd9ca9088ea30d869f96 | 47d8fb81b0402a61d31cd41f6e4f1a4fe0ee34fc4de781bbc0f23b2835b348f7 | Winpython64-3.11.9.0dot.exe | 25 830 003 Bytes | 353952b8317754ef4370a2502a99db84f4b4ee2df681e09f40e06dd90e72ac36 +1e903de80669230c7f9f571a3e8a6253 | 281f573e62a727bbf916f36cd8c627db20372635 | 5e1c9e8eedac716c4808075aace1863f74f67d4f8c78a77b4cc2e4d13c51a8c6 | Winpython64-3.12.6.0dot.exe | 24 376 540 Bytes | 7f903ca6b2c616596f5e9fa27dac0a9634b5fe23291b7e1ca8a05a99985846ca +2dbb301939001f07a115a2fd9252f721 | ce347726b7150cdd045928ef6b33194f70041d56 | 1f5532eceb35df957cd974d4650b35f8560f4499bcfbfd2d76c520658210ae21 | Winpython64-3.12.6.0slim.exe | 629 924 055 Bytes | d0c66369d569c8dafdfdb190501073b097049f916753feccf0baa4154564de06 +1665f6854db2c662173b0af67a6c5c08 | 655f9435c4e145a056fb265d9ccdb786240b7d0d | dbd0fcf0997295d44068878521bad4063748765fc4921a9ca40df15f6ac050a3 | Winpython64-3.12.6.0.7z | 887 408 957 Bytes | 351910364b96ef945ee26f87ebccdaa463712f5c5bb287c11d506ff526d7bc43 +b1ad8631fa563fc44593022d31404a6d | 7a7e7536299b3c561b856a3215e3e542056ef927 | e5b7fe7970903f0207836299ebac57c2dc6d7a95e6dbd9b7e9a25fd24fd157dd | Winpython64-3.13.0.1dotrc2.exe | 24 642 967 Bytes | e19c8a9273a458ed38d88e749a0d7d265098d50f2c79105128391593e6dcc905 +a4b43f8e4a7ce78ffd3ee865e37e1ec3 | 793650e4f33c2d247bf91dc29b2d3b8fddc95831 | 8e58df9400d4e713f2f51794f3f13d683e366d1f5438499bdd352139268a640c | Winpython64-3.13.0.1freerc2.exe | 33 311 716 Bytes | 07778110c64e4531281597e121084cba1a6f2d25ce2f28537567d6cdfcda6d36 + + +### WinPython 2024-03 release (June 22th, 2024) MD5 | SHA-1 | SHA-256 | Binary | Size | blake2b-256 ---------------------------------|------------------------------------------|------------------------------------------------------------------|-----------------------------------|--------------------|----------------------------------------------------------------- From d2f1cf786c2282b0ead13496a2a071bd2c0508bc Mon Sep 17 00:00:00 2001 From: stonebig Date: Sat, 14 Sep 2024 18:13:49 +0200 Subject: [PATCH 002/305] typo --- changelogs/md5_sha1.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/changelogs/md5_sha1.txt b/changelogs/md5_sha1.txt index 6bb19755..975ae48e 100644 --- a/changelogs/md5_sha1.txt +++ b/changelogs/md5_sha1.txt @@ -1,4 +1,4 @@ -### WinPython 2024-03 release (September 14th, 2024) +### WinPython 2024-04 release (September 14th, 2024) MD5 | SHA-1 | SHA-256 | Binary | Size | blake2b-256 From 60dafb72a4d41b35e5a15fc7655af517260ef74c Mon Sep 17 00:00:00 2001 From: stonebig Date: Sat, 14 Sep 2024 18:54:04 +0200 Subject: [PATCH 003/305] remove pyzo --- make.py | 34 ---------------------------------- 1 file changed, 34 deletions(-) diff --git a/make.py b/make.py index b6d653f1..76e6be1c 100644 --- a/make.py +++ b/make.py @@ -869,24 +869,6 @@ def _create_batch_scripts_initial(self): :end_pyqt5_tools_conf -rem ****************** -rem handle Pyzo configuration part -rem ****************** -if not exist "%HOME%\.pyzo" mkdir %HOME%\.pyzo -if exist "%HOME%\.pyzo\config.ssdf" goto after_pyzo_conf -set tmp_pyz="%HOME%\.pyzo\config.ssdf" -( - echo shellConfigs2 = list: - echo dict: - echo name = 'Python' - echo exe = '.\\python.exe' - echo ipython = 'no' - echo gui = 'none' -)>> "%tmp_pyz%" - -:after_pyzo_conf - - rem ****************** rem WinPython.ini part (removed from nsis) rem ****************** @@ -1033,22 +1015,6 @@ def _create_batch_scripts_initial(self): } -##################### -### handle Pyzo configuration part -##################### -$env:tmp_pyz = "$env:HOME\.pyzo" -if (-not (Test-Path "$env:tmp_pyz")) { md -Path "$env:tmp_pyz" } -$env:tmp_pyz = "$env:HOME\.pyzo\config.ssdf" -if (-not (Test-Path "$env:tmp_pyz")) { -shellConfigs2 = list:| Add-Content -Path $env:tmp_pyz - dict:| Add-Content -Path $env:tmp_pyz - name = 'Python'| Add-Content -Path $env:tmp_pyz - exe = '.\\python.exe'| Add-Content -Path $env:tmp_pyz - ipython = 'no'| Add-Content -Path $env:tmp_pyz - gui = 'none'| Add-Content -Path $env:tmp_pyz -} - - ##################### ### WinPython.ini part (removed from nsis) ##################### From f5e1ca89298cba3b5dbb15c36657900de6d0051e Mon Sep 17 00:00:00 2001 From: stonebig Date: Sat, 14 Sep 2024 19:15:18 +0200 Subject: [PATCH 004/305] move R config as a winpython.ini option --- make.py | 25 ++++--------------------- 1 file changed, 4 insertions(+), 21 deletions(-) diff --git a/make.py b/make.py index 76e6be1c..ee627f83 100644 --- a/make.py +++ b/make.py @@ -812,15 +812,6 @@ def _create_batch_scripts_initial(self): rem force default pyqt5 kit for Spyder if PyQt5 module is there if exist "%WINPYDIR%\Lib\site-packages\PyQt5\__init__.py" set QT_API=pyqt5 -rem ****************** -rem handle R if included -rem ****************** -if not exist "%WINPYDIRBASE%\t\R\bin" goto r_bad -set R_HOME=%WINPYDIRBASE%\t\R -if "%WINPYARCH%"=="WIN32" set R_HOMEbin=%R_HOME%\bin\i386 -if not "%WINPYARCH%"=="WIN32" set R_HOMEbin=%R_HOME%\bin\x64 -:r_bad - rem ****************** rem handle Julia if included @@ -887,6 +878,8 @@ def _create_batch_scripts_initial(self): echo #JUPYTERLAB_SETTINGS_DIR = %%HOME%%\.jupyter\lab echo #JUPYTERLAB_WORKSPACES_DIR = %%HOME%%\.jupyter\lab\workspaces echo #WINPYWORKDIR = %%HOMEDRIVE%%%%HOMEPATH%%\Documents\WinPython%%WINPYVER%%\Notebooks + echo #R_HOME=%%WINPYDIRBASE%%\t\R + echo #R_HOMEbin=%%R_HOME%%\bin\x64 )>> "%winpython_ini%" """, @@ -956,18 +949,6 @@ def _create_batch_scripts_initial(self): if (Test-Path "$env:WINPYDIR\Lib\site-packages\PyQt5\__init__.py") { $env:QT_API = "pyqt5" } - -##################### -### handle R if included -##################### -if (Test-Path "$env:WINPYDIR\..\t\R\bin") { - $env:R_HOME = "$env:WINPYDIR\..\t\R" - $env:R_HOMEbin = "$env:R_HOME\bin\x64" - if ("$env:WINPYARCH" -eq "WIN32") { - $env:R_HOMEbin = "$env:R_HOME\bin\i386" - } -} - ##################### ### handle Julia if included ##################### @@ -1033,6 +1014,8 @@ def _create_batch_scripts_initial(self): "#JUPYTERLAB_SETTINGS_DIR = %%HOME%%\.jupyter\lab" | Add-Content -Path $env:winpython_ini "#JUPYTERLAB_WORKSPACES_DIR = %%HOME%%\.jupyter\lab\workspaces" | Add-Content -Path $env:winpython_ini "#WINPYWORKDIR = %%HOMEDRIVE%%%%HOMEPATH%%\Documents\WinPython%%WINPYVER%%\Notebooks" | Add-Content -Path $env:winpython_ini + "#R_HOME=%%WINPYDIRBASE%%\t\R" | Add-Content -Path $env:winpython_ini + "#R_HOMEbin=%%R_HOME%%\bin\x64" | Add-Content -Path $env:winpython_ini } From 7037d4cf0a6849fe6df361587bc82e205287c792 Mon Sep 17 00:00:00 2001 From: stonebig Date: Sat, 14 Sep 2024 19:28:23 +0200 Subject: [PATCH 005/305] move Julia as winpython.ini option --- make.py | 29 ++++++++--------------------- 1 file changed, 8 insertions(+), 21 deletions(-) diff --git a/make.py b/make.py index ee627f83..d467b832 100644 --- a/make.py +++ b/make.py @@ -813,17 +813,6 @@ def _create_batch_scripts_initial(self): if exist "%WINPYDIR%\Lib\site-packages\PyQt5\__init__.py" set QT_API=pyqt5 -rem ****************** -rem handle Julia if included -rem ****************** -if not exist "%WINPYDIRBASE%\t\Julia\bin" goto julia_bad -set JULIA_HOME=%WINPYDIRBASE%\t\Julia\bin\ -set JULIA_EXE=julia.exe -set JULIA=%JULIA_HOME%%JULIA_EXE% -set JULIA_PKGDIR=%WINPYDIRBASE%\settings\.julia -:julia_bad - - rem ****************** rem handle PySide2 if included rem ****************** @@ -880,6 +869,10 @@ def _create_batch_scripts_initial(self): echo #WINPYWORKDIR = %%HOMEDRIVE%%%%HOMEPATH%%\Documents\WinPython%%WINPYVER%%\Notebooks echo #R_HOME=%%WINPYDIRBASE%%\t\R echo #R_HOMEbin=%%R_HOME%%\bin\x64 + echo #JULIA_HOME=%%WINPYDIRBASE%%\t\Julia\bin\ + echo #JULIA_EXE=julia.exe + echo #JULIA=%%JULIA_HOME%%%%JULIA_EXE%% + echo #JULIA_PKGDIR=%%WINPYDIRBASE%%\settings\.julia )>> "%winpython_ini%" """, @@ -949,16 +942,6 @@ def _create_batch_scripts_initial(self): if (Test-Path "$env:WINPYDIR\Lib\site-packages\PyQt5\__init__.py") { $env:QT_API = "pyqt5" } -##################### -### handle Julia if included -##################### -if (Test-Path "$env:WINPYDIR\..\t\Julia\bin") { - $env:JULIA_HOME = "$env:WINPYDIR\..\t\Julia\bin\" - $env:JULIA_EXE = "julia.exe" - $env:JULIA = "$env:JULIA_HOME$env:JULIA_EXE" - $env:JULIA_PKGDIR = "$env:WINPYDIR\..\settings\.julia" -} - ##################### ### handle PySide2 if included ##################### @@ -1016,6 +999,10 @@ def _create_batch_scripts_initial(self): "#WINPYWORKDIR = %%HOMEDRIVE%%%%HOMEPATH%%\Documents\WinPython%%WINPYVER%%\Notebooks" | Add-Content -Path $env:winpython_ini "#R_HOME=%%WINPYDIRBASE%%\t\R" | Add-Content -Path $env:winpython_ini "#R_HOMEbin=%%R_HOME%%\bin\x64" | Add-Content -Path $env:winpython_ini + "#JULIA_HOME=%%WINPYDIRBASE%%\t\Julia\bin\" | Add-Content -Path $env:winpython_ini + "#JULIA_EXE=julia.exe" | Add-Content -Path $env:winpython_ini + "#JULIA=%%JULIA_HOME%%%%JULIA_EXE%%" | Add-Content -Path $env:winpython_ini + "#JULIA_PKGDIR=%%WINPYDIRBASE%%\settings\.julia" | Add-Content -Path $env:winpython_ini } From 389f149fdd719b88a90a37561c0f1bd37ea2dfa9 Mon Sep 17 00:00:00 2001 From: stonebig Date: Sat, 14 Sep 2024 19:35:16 +0200 Subject: [PATCH 006/305] remo R being embedded option --- make.py | 9 --------- 1 file changed, 9 deletions(-) diff --git a/make.py b/make.py index d467b832..ef317d04 100644 --- a/make.py +++ b/make.py @@ -200,7 +200,6 @@ class WinPythonDistribution(object): """WinPython distribution""" MINGW32_PATH = r"\t\mingw32\bin" - R_PATH = r"\t\R\bin" JULIA_PATH = r"\t\Julia\bin" NODEJS_PATH = r"\n" # r'\t\n' @@ -290,10 +289,6 @@ def get_tool_path_dir(relpath): if get_tool_path_file(r"\t\SciTE.exe"): installed_tools += [("SciTE", "3.3.7")] - rpath = get_tool_path_dir(self.R_PATH) - if rpath is not None: - rver = utils.get_r_version(rpath) - installed_tools += [("R", rver)] juliapath = get_tool_path_dir(self.JULIA_PATH) if juliapath is not None: juliaver = utils.get_julia_version(juliapath) @@ -398,10 +393,6 @@ def prepath(self): # and osp.isdir(self.winpydir + self.MINGW32_PATH) # ): # path += [r".." + self.MINGW32_PATH] - # if self.distribution.architecture == 32: - # path += [r".." + self.R_PATH + r"\i386"] - # if self.distribution.architecture == 64: - # path += [r".." + self.R_PATH + r"\x64"] path += [r".." + self.JULIA_PATH] path += [r".." + self.NODEJS_PATH] From 225147e4dc223ef4023275b888e6ce64da0ed7c4 Mon Sep 17 00:00:00 2001 From: stonebig Date: Sat, 14 Sep 2024 19:39:21 +0200 Subject: [PATCH 007/305] remove wingw32 option for cython --- make.py | 7 ------- 1 file changed, 7 deletions(-) diff --git a/make.py b/make.py index ef317d04..f7d011ef 100644 --- a/make.py +++ b/make.py @@ -199,7 +199,6 @@ def build_7zip(srcname, dstname, data): class WinPythonDistribution(object): """WinPython distribution""" - MINGW32_PATH = r"\t\mingw32\bin" JULIA_PATH = r"\t\Julia\bin" NODEJS_PATH = r"\n" # r'\t\n' @@ -386,13 +385,7 @@ def prepath(self): "DLLs", "Scripts", r"..\t", - # r"..\t\mingw32\bin", ] - # if ( - # self.distribution.architecture == 32 - # and osp.isdir(self.winpydir + self.MINGW32_PATH) - # ): - # path += [r".." + self.MINGW32_PATH] path += [r".." + self.JULIA_PATH] path += [r".." + self.NODEJS_PATH] From 131b1374b1301ad68656b84ead8796be55f19a1c Mon Sep 17 00:00:00 2001 From: stonebig Date: Sat, 14 Sep 2024 19:57:04 +0200 Subject: [PATCH 008/305] clean-up useless comments --- make.py | 27 +++------------------------ 1 file changed, 3 insertions(+), 24 deletions(-) diff --git a/make.py b/make.py index f7d011ef..a3987f56 100644 --- a/make.py +++ b/make.py @@ -238,8 +238,6 @@ def __init__( self.flavor = flavor # python_fname = the .zip of the python interpreter PyPy ! - # impot re - # re.match(r'(pypy3*-v|python-)([0-9\.rcba]*)((\.|\-)(amd64|win64)?\.zip') try: # PyPy self.python_fname = self.get_package_fname( r"(pypy3|python-)([0-9]|[a-zA-Z]|.)*.zip" @@ -248,16 +246,9 @@ def __init__( self.python_fname = self.get_package_fname( r"python-([0-9\.rcba]*)((\.|\-)amd64)?\.(zip|zip)" ) - # osp.join(self.winpydir, self.python_name) = Directory of Python exec - # self.pythondir =osp.join(self.winpydir, self.python_name) self.python_name = Path(self.python_fname).name[:-4] - self.distname = "winUNKNOWN" # f'win{self.python_name}' # PyPy ? - # vlst = ( - # re.match(r'winpython-([0-9\.]*)', self.distname) - # .groups()[0] - # .split('.') - # ) - self.python_fullversion = "winUNKNOWN" # '.'.join(vlst[:3]) + self.distname = "winUNKNOWN" + self.python_fullversion = "winUNKNOWN" @property def package_index_wiki(self): @@ -396,19 +387,13 @@ def prepath(self): def postpath(self): """Return PATH contents to be append to the environment variable""" path = [] - # if osp.isfile(self.winpydir + self.THG_PATH): - # path += [r"..\t\TortoiseHg"] return path @property def toolsdirs(self): """Return tools directory list""" # formerly was joining prepared tool dir + the one of building env.. - return [ - # osp.join( - # osp.dirname(osp.abspath(__file__)), 't' - # ) - ] + self._toolsdirs + return [] + self._toolsdirs @property def docsdirs(self): @@ -649,8 +634,6 @@ def _create_launchers(self): "powershell.ico", command="Powershell.exe", args=r"start-process -WindowStyle Hidden -FilePath ([dollar]ENV:WINPYDIRICONS + '\scripts\cmd_ps.bat')", - #command="%WINPYDIRICONS%\\scripts\\cmd_ps.bat", - #args=r"", ) #self.create_launcher_shimmy( @@ -673,8 +656,6 @@ def _create_launchers(self): "python.ico", command="Powershell.exe", args=r"start-process -WindowStyle Hidden -FilePath ([dollar]ENV:WINPYDIRICONS + '\scripts\winidle.bat')", - #command="scripts\\Noshell.vbs scripts\\winidle.bat", - #args=r"", ) self.create_launcher_shimmy( @@ -714,8 +695,6 @@ def _create_launchers(self): self.create_launcher_shimmy( "Jupyter Lab.exe", "jupyter.ico", - #command="$SYSDIR\cmd.exe", - #args=r"/k winjupyter_lab.bat", command="winjupyter_lab.bat", args=r"", workdir=r".\scripts" From bbb6b4fb31ae9ed8ec358e2224d8174b02a9483e Mon Sep 17 00:00:00 2001 From: stonebig Date: Sat, 14 Sep 2024 20:09:54 +0200 Subject: [PATCH 009/305] further cleanup of mingw32 --- make.py | 9 --------- 1 file changed, 9 deletions(-) diff --git a/make.py b/make.py index a3987f56..188d8b7e 100644 --- a/make.py +++ b/make.py @@ -1160,15 +1160,6 @@ def _create_batch_scripts(self): The environment variables are set-up in 'env_.bat' and 'env_for_icons.bat'.""", ) - self.create_batch_script( - "make_cython_use_vc.bat", - r"""@echo off -call "%~dp0env.bat" -set pydistutils_cfg=%WINPYDIRBASE%\settings\pydistutils.cfg -echo [config]>%pydistutils_cfg% - """, - ) - self.create_batch_script( "make_winpython_movable.bat", r"""@echo off From a20aa52a0c2bb17207f37c0cf43be02b15ea48c4 Mon Sep 17 00:00:00 2001 From: stonebig Date: Sun, 15 Sep 2024 08:31:20 +0200 Subject: [PATCH 010/305] move Pyqt5_tools config as winpython.ini option --- make.py | 20 ++------------------ 1 file changed, 2 insertions(+), 18 deletions(-) diff --git a/make.py b/make.py index 188d8b7e..3001897b 100644 --- a/make.py +++ b/make.py @@ -803,15 +803,6 @@ def _create_batch_scripts_initial(self): :pyqt5_conf_exist -rem ****************** -rem handle pyqt5_tools if included -rem ****************** -set tmp_pyz=%WINPYDIR%\Lib\site-packages\pyqt5_tools -if not exist "%tmp_pyz%" goto end_pyqt5_tools_conf -set QT_PLUGIN_PATH=%WINPYDIR%\Lib\site-packages\pyqt5_tools\Qt\plugins -:end_pyqt5_tools_conf - - rem ****************** rem WinPython.ini part (removed from nsis) rem ****************** @@ -836,6 +827,7 @@ def _create_batch_scripts_initial(self): echo #JULIA_EXE=julia.exe echo #JULIA=%%JULIA_HOME%%%%JULIA_EXE%% echo #JULIA_PKGDIR=%%WINPYDIRBASE%%\settings\.julia + echo #QT_PLUGIN_PATH=%%WINPYDIR%%\Lib\site-packages\pyqt5_tools\Qt\plugins )>> "%winpython_ini%" """, @@ -933,15 +925,6 @@ def _create_batch_scripts_initial(self): } -##################### -### handle pyqt5_tools if included -##################### -$env:tmp_pyz = "$env:WINPYDIR\Lib\site-packages\pyqt5_tools" -if (Test-Path "$env:tmp_pyz") { - $env:QT_PLUGIN_PATH = "WINPYDIR\Lib\site-packages\pyqt5_tools\Qt\plugins" -} - - ##################### ### WinPython.ini part (removed from nsis) ##################### @@ -966,6 +949,7 @@ def _create_batch_scripts_initial(self): "#JULIA_EXE=julia.exe" | Add-Content -Path $env:winpython_ini "#JULIA=%%JULIA_HOME%%%%JULIA_EXE%%" | Add-Content -Path $env:winpython_ini "#JULIA_PKGDIR=%%WINPYDIRBASE%%\settings\.julia" | Add-Content -Path $env:winpython_ini + "#QT_PLUGIN_PATH=%%WINPYDIR%%\Lib\site-packages\pyqt5_tools\Qt\plugins" | Add-Content -Path $env:winpython_ini } From ab0c44fc8045bf0b9bea94f3bf57f43d7f33be41 Mon Sep 17 00:00:00 2001 From: stonebig Date: Sun, 15 Sep 2024 08:39:43 +0200 Subject: [PATCH 011/305] remove Pyside2 option --- make.py | 28 ---------------------------- 1 file changed, 28 deletions(-) diff --git a/make.py b/make.py index 3001897b..1fce5f5f 100644 --- a/make.py +++ b/make.py @@ -371,7 +371,6 @@ def prepath(self): """Return PATH contents to be prepend to the environment variable""" path = [ r"Lib\site-packages\PyQt5", - r"Lib\site-packages\PySide2", "", # Python root directory "DLLs", "Scripts", @@ -776,19 +775,6 @@ def _create_batch_scripts_initial(self): if exist "%WINPYDIR%\Lib\site-packages\PyQt5\__init__.py" set QT_API=pyqt5 -rem ****************** -rem handle PySide2 if included -rem ****************** -set tmp_pyz=%WINPYDIR%\Lib\site-packages\PySide2 -if not exist "%tmp_pyz%" goto pyside2_conf_exist -set tmp_pyz=%tmp_pyz%\qt.conf -if not exist "%tmp_pyz%" ( - echo [Paths] - echo Prefix = . - echo Binaries = . -)>> "%tmp_pyz%" -:pyside2_conf_exist - rem ****************** rem handle PyQt5 if included rem ****************** @@ -897,20 +883,6 @@ def _create_batch_scripts_initial(self): if (Test-Path "$env:WINPYDIR\Lib\site-packages\PyQt5\__init__.py") { $env:QT_API = "pyqt5" } -##################### -### handle PySide2 if included -##################### - -$env:tmp_pyz = "$env:WINPYDIR\Lib\site-packages\PySide2" -if (Test-Path "$env:tmp_pyz") { - $env:tmp_pyz = "$env:tmp_pyz\qt.conf" - if (-not (Test-Path "$env:tmp_pyz")) { - "[Paths]"| Add-Content -Path $env:tmp_pyz - "Prefix = ."| Add-Content -Path $env:tmp_pyz - "Binaries = ."| Add-Content -Path $env:tmp_pyz - } -} - ##################### ### handle PyQt5 if included ##################### From b750a498c3b605e7cb99bb7bb1d139887f296f4b Mon Sep 17 00:00:00 2001 From: stonebig Date: Sun, 15 Sep 2024 09:03:44 +0200 Subject: [PATCH 012/305] remove SCITe and distname code --- make.py | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/make.py b/make.py index 1fce5f5f..f07d487c 100644 --- a/make.py +++ b/make.py @@ -247,8 +247,6 @@ def __init__( r"python-([0-9\.rcba]*)((\.|\-)amd64)?\.(zip|zip)" ) self.python_name = Path(self.python_fname).name[:-4] - self.distname = "winUNKNOWN" - self.python_fullversion = "winUNKNOWN" @property def package_index_wiki(self): @@ -277,8 +275,6 @@ def get_tool_path_dir(relpath): if Path(path).is_dir(): return path - if get_tool_path_file(r"\t\SciTE.exe"): - installed_tools += [("SciTE", "3.3.7")] juliapath = get_tool_path_dir(self.JULIA_PATH) if juliapath is not None: juliaver = utils.get_julia_version(juliapath) @@ -1448,11 +1444,9 @@ def make( print( self.python_fname, self.python_name, - self.distname, - self.python_fullversion, # PyPy to delete or move ) if my_winpydir is None: - self.winpydir = str(Path(self.target) / self.distname) # PyPy to delete + raise RuntimeError("WinPython base directory to create is undefined") else: self.winpydir = str( Path(self.target) / my_winpydir From f9f86c0eef0f1c8f9c11bc9098ed3c27eb91ba08 Mon Sep 17 00:00:00 2001 From: stonebig Date: Sun, 15 Sep 2024 10:34:49 +0200 Subject: [PATCH 013/305] remove NSIS python code --- make.py | 115 +------------------------------------------------------- 1 file changed, 1 insertion(+), 114 deletions(-) diff --git a/make.py b/make.py index f07d487c..327f4a4e 100644 --- a/make.py +++ b/make.py @@ -41,26 +41,6 @@ def get_drives(): return drives -def get_nsis_exe(): - """Return NSIS executable""" - localdir = str(Path(sys.prefix).parent.parent) - for drive in get_drives(): - for dirname in ( - r"C:\Program Files", - r"C:\Program Files (x86)", - drive + r"PortableApps\NSISPortableANSI", - drive + r"PortableApps\NSISPortable", - str(Path(localdir) / "NSISPortableANSI"), - str(Path(localdir) / "NSISPortable"), - ): - for subdirname in (".", "App"): - exe = str(Path(dirname) / subdirname / "NSIS" / "makensis.exe") - if Path(exe).is_file(): - return exe - else: - raise RuntimeError("NSIS is not installed on this computer.") - - def get_7zip_exe(): """Return 7zip executable""" localdir = str(Path(sys.prefix).parent.parent) @@ -78,27 +58,6 @@ def get_7zip_exe(): raise RuntimeError("7ZIP is not installed on this computer.") -def replace_in_nsis_file(fname, data): - """Replace text in line starting with *start*, from this position: - data is a list of (start, text) tuples""" - fd = open(fname, "U") - lines = fd.readlines() - fd.close() - for idx, line in enumerate(lines): - for start, text in data: - if start not in ( - "Icon", - "OutFile", - ) and not start.startswith("!"): - start = "!define " + start - if line.startswith(start + " "): - lines[idx] = line[: len(start) + 1] + f'"{text}"' + "\n" - fd = open(fname, "w") - fd.writelines(lines) - print("iss for ", fname, "is", lines) - fd.close() - - def replace_in_7zip_file(fname, data): """Replace text in line starting with *start*, from this position: data is a list of (start, text) tuples""" @@ -120,35 +79,6 @@ def replace_in_7zip_file(fname, data): fd.close() -def build_nsis(srcname, dstname, data): - """Build NSIS script""" - NSIS_EXE = get_nsis_exe() # NSIS Compiler - portable_dir = str(Path(__file__).resolve().parent / "portable") - shutil.copy(str(Path(portable_dir) / srcname), dstname) - data = [ - ( - "!addincludedir", - str(Path(portable_dir) / "include"), - ) - ] + list(data) - replace_in_nsis_file(dstname, data) - try: - retcode = subprocess.call( - f'"{NSIS_EXE}" -V2 "{dstname}"', - shell=True, - stdout=sys.stderr, - ) - if retcode < 0: - print( - "Child was terminated by signal", - -retcode, - file=sys.stderr, - ) - except OSError as e: - print("Execution failed:", e, file=sys.stderr) - os.remove(dstname) - - def build_shimmy_launcher(launcher_name, command, icon_path, mkshim_program='mkshim400.py', workdir=''): """Build .exe launcher with mkshim_program and pywin32""" @@ -449,44 +379,6 @@ def create_launcher_shimmy( true_command = command.replace(r"$SYSDIR\cmd.exe","cmd.exe")+ " " + args build_shimmy_launcher(iconlauncherfullname, true_command, icon_fname, mkshim_program=mkshim_program, workdir=workdir) - def create_launcher( - self, - name, - icon, - command=None, - args=None, - workdir=r"$EXEDIR\scripts", - launcher="launcher_basic.nsi", - ): - """Create exe launcher with NSIS""" - assert name.endswith(".exe") - portable_dir = str(Path(__file__).resolve().parent / "portable") - icon_fname = str(Path(portable_dir) / "icons" / icon) - assert Path(icon_fname).is_file() - - # Customizing NSIS script - if command is None: - if args is not None and ".pyw" in args: - command = "${WINPYDIR}\pythonw.exe" - else: - command = "${WINPYDIR}\python.exe" - if args is None: - args = "" - if workdir is None: - workdir = "" - fname = str(Path(self.winpydir) / (Path(name).stem + ".nsi")) - - data = [ - ("WINPYDIR", f"$EXEDIR\{self.python_name}"), - ("WINPYVER", self.winpyver), - ("COMMAND", command), - ("PARAMETERS", args), - ("WORKDIR", workdir), - ("Icon", icon_fname), - ("OutFile", name), - ] - - build_nsis(launcher, fname, data) def create_python_batch( self, @@ -1495,10 +1387,8 @@ def make( # self._add_msvc_files() # replaced per msvc_runtime package self._create_batch_scripts_initial() self._create_batch_scripts() - # always create all launchers (as long as it is NSIS-based) + # always create all launchers (as long as it is not shimmy-based, to see for after) self._create_launchers() - # pre-patch current pip (until default python has pip 8.0.3) - # PyPY must ensure pip # "pypy3.exe -m ensurepip" utils.python_execmodule("ensurepip", self.distribution.target) @@ -1531,9 +1421,6 @@ def make( print(f"piping {' '.join(actions)}") self._print(f"piping {' '.join(actions)}") self.distribution.do_pip_action(actions) - # actions=["install","-r", req, "--no-index", - # "--trusted-host=None"]+ links, - # install_options=None) self._run_complement_batch_scripts() self.distribution.patch_standard_packages() if remove_existing and not self.simulation: From cb43356c9f45cb130693b84d3a0c0376515764ab Mon Sep 17 00:00:00 2001 From: stonebig Date: Sun, 15 Sep 2024 10:40:07 +0200 Subject: [PATCH 014/305] removing last bit of NSIS launcher code --- portable/launcher_basic.nsi | 44 ------------------------------------- winpython/__init__.py | 2 +- 2 files changed, 1 insertion(+), 45 deletions(-) delete mode 100644 portable/launcher_basic.nsi diff --git a/portable/launcher_basic.nsi b/portable/launcher_basic.nsi deleted file mode 100644 index cb1670b3..00000000 --- a/portable/launcher_basic.nsi +++ /dev/null @@ -1,44 +0,0 @@ -/* WinPython launcher template script -Copyright 2012 Pierre Raybaut -Licensed under the terms of the MIT License -(see winpython/__init__.py for details) -*/ -;================================================================ -; These lines are automatically filled when winpython/make.py creates launchers: -!addincludedir "" -!define COMMAND "" -!define PARAMETERS "" -!define WORKDIR "" -Icon "" -OutFile "" -;================================================================ -# Standard NSIS plugins -!include "WordFunc.nsh" -!include "FileFunc.nsh" - -SilentInstall silent -AutoCloseWindow true -ShowInstDetails nevershow -RequestExecutionLevel user - -Section "" -Call Execute -SectionEnd - -Function Execute -;Set working Directory =========================== -StrCmp ${WORKDIR} "" 0 workdir -System::Call "kernel32::GetCurrentDirectory(i ${NSIS_MAX_STRLEN}, t .r0)" -SetOutPath $0 -Goto end_workdir -workdir: -SetOutPath "${WORKDIR}" -end_workdir: -;Get Command line parameters ===================== -${GetParameters} $R1 -StrCmp "${PARAMETERS}" "" end_param 0 -StrCpy $R1 "${PARAMETERS} $R1" -end_param: -;===== Execution ================================= -Exec '"${COMMAND}" $R1' -FunctionEnd \ No newline at end of file diff --git a/winpython/__init__.py b/winpython/__init__.py index 8d20d091..ea978ba0 100644 --- a/winpython/__init__.py +++ b/winpython/__init__.py @@ -28,6 +28,6 @@ OTHER DEALINGS IN THE SOFTWARE. """ -__version__ = '10.7.20240908' +__version__ = '11.0.20240915' __license__ = __doc__ __project_url__ = 'http://winpython.github.io/' From 1e84f3831c7df359c84721c2a640a3418be640a5 Mon Sep 17 00:00:00 2001 From: stonebig Date: Sun, 15 Sep 2024 16:05:30 +0200 Subject: [PATCH 015/305] unused code --- diff.py | 4 ---- make.py | 16 ---------------- 2 files changed, 20 deletions(-) diff --git a/diff.py b/diff.py index 2d32efa8..ec658aba 100644 --- a/diff.py +++ b/diff.py @@ -18,10 +18,6 @@ # Local imports from winpython import utils -# pep503 defines normalized package names: www.python.org/dev/peps/pep-0503 -def normalize(name): - return re.sub(r"[-_.]+", "-", name).lower() - CHANGELOGS_DIR = str(Path(__file__).parent / "changelogs") assert Path(CHANGELOGS_DIR).is_dir() diff --git a/make.py b/make.py index 327f4a4e..5b5ce53b 100644 --- a/make.py +++ b/make.py @@ -843,20 +843,8 @@ def _create_batch_scripts_initial(self): self.create_batch_script( "cmd_ps.bat", r"""@echo off -rem safe bet call "%~dp0env_for_icons.bat" Powershell.exe -Command "& {Start-Process PowerShell.exe -ArgumentList '-ExecutionPolicy RemoteSigned -noexit -File ""%~dp0WinPython_PS_Prompt.ps1""'}" -exit -""", - do_changes=changes, - ) - - self.create_batch_script( - "WinPython_Interpreter_PS.bat", - r"""@echo off -rem no safe bet (for comparisons) -Powershell.exe -Command "& {Start-Process PowerShell.exe -ArgumentList '-ExecutionPolicy RemoteSigned -noexit -File ""%~dp0WinPython_PS_Prompt.ps1""'}" -exit """, do_changes=changes, ) @@ -909,10 +897,6 @@ def _create_batch_scripts_initial(self): if not exist "%HOME%\.spyder-py%WINPYVER:~0,1%" mkdir "%HOME%\.spyder-py%WINPYVER:~0,1%" if not exist "%HOME%\.spyder-py%WINPYVER:~0,1%\workingdir" echo %HOME%\Notebooks>"%HOME%\.spyder-py%WINPYVER:~0,1%\workingdir" -rem ******* make cython use mingwpy part ******* -if not exist "%WINPYDIRBASE%\settings\pydistutils.cfg" goto no_cython -if not exist "%HOME%\pydistutils.cfg" xcopy "%WINPYDIRBASE%\settings\pydistutils.cfg" "%HOME%" -:no_cython """, do_changes=changes, ) From 3d016016ccbe1f062338eb1a96c50e97c038d3e1 Mon Sep 17 00:00:00 2001 From: stonebig Date: Sun, 15 Sep 2024 22:44:23 +0200 Subject: [PATCH 016/305] build bat clean-up --- generate_a_winpython_distro.bat | 299 +++++++++++++------------------- run_complement_newbuild.bat | 128 +++++++------- 2 files changed, 190 insertions(+), 237 deletions(-) diff --git a/generate_a_winpython_distro.bat b/generate_a_winpython_distro.bat index b37bffea..89cc2720 100644 --- a/generate_a_winpython_distro.bat +++ b/generate_a_winpython_distro.bat @@ -3,17 +3,17 @@ rem to launch from a winpython package directory, where 'make.py' is rem ***************************** rem 2020-07-05: install msvc_runtime before packages that may want to compile -rem 2020-12-05 : add a constrints.txt file from a recent pip list +rem 2020-12-05 : add a constraints.txt file from a recent pip list rem 2021-03-20 : track successes packages combination are archived for future contraint update rem 2021-04-22 : path PyPy3 (as we don't try to copy PyPy3.exe to Python.exe) rem 2023-08-21a: add a pre_step with my_requirements_pre.txt + my_find_links_pre rem 2024-05-12a: use python -m pip instead of pip , and remove --upgrade %new_resolver% +rem 2024-09-15a: compactify for lisiblity rem ***************************** rem algorithm: rem 0.0 Initialize variables rem 1.0 Do 2021-04-22 : patch PyPy3 (as we don't try to copy PyPy3.exe to Python.exe) -rem 2021-04-22b: Patch PyPy3, give '%my_python_target_release%' to make (otherwise known only after unzip) rem 2 a Pre-clear of previous build infrastructure rem 2.0 Create a new build rem 2.1 Create basic build infrastructure @@ -25,33 +25,47 @@ rem 2.8 post-build (if specific workarounds) rem 2.9 archive success rem 3.0 Generate Changelog and binaries +rem "my_release_level" is optionaly set per the calling program +rem set my_release_level= +if "%my_release_level%"=="" set my_release_level= +rem "my_create_installer" is optionaly set per the calling program +if "%my_create_installer%"=="" set my_create_installer=True -rem this is pre-initialised per the program calling this .bat + +rem this is pre-initialised per the program calling this .bat rem set my_original_path=%path% rem set my_root_dir_for_builds=D:\WinP rem set my_python_target=34 rem set my_pyver=3.4 -rem set my_flavor=mkl +rem set my_flavor=slim rem set my_release=84 +rem set my_find_link=C:\WinP\packages.srcreq -rem set my_find_link=C:\WinP\packages.srcreq +rem set my_arch=64 +rem set my_preclear_build_directory=Yes -rem this is optionaly pre-initialised per the calling program (simpler to manage here) -rem set my_release_level= +rem set my_requirements_pre=C:\WinP\bd311\requirements_mkl_pre.txt +rem set my_find_links_pre=C:\WinP\packages_mkl.srcreq +rem set my_requirements=C:\Winpents=d:\my_req1.txt -echo ------------------ -echo 0.0 Initialize variables -echo ------------------ +rem set my_source_dirs=D:\WinPython\bd34\packages.src D:\WinPython\bd34\packages.win32.Slim +rem set my_toolsdirs=D:\WinPython\bd34\Tools.Slim +rem set my_docsdirs=D:\WinPython\bd34\docs.Slim + + + +echo ---------------------------------------- +echo 0.0 (%date% %time%) Initialize variables +echo ---------------------------------------- -if "%my_release_level%"=="" set my_release_level=b2 set my_basedir=%my_root_dir_for_builds%\bd%my_python_target% -rem since 2024-05-01, a building env need is reduced to a WinPythondot 3.8+ augmented with packages: flit + packaging +rem a building env need is a Python with packages: WinPython + build + flit + packaging + mkshim400.py set my_buildenv=C:\WinPdev\WPy64-310111 if "%my_constraints%"=="" set my_constraints=C:\WinP\constraints.txt @@ -60,63 +74,32 @@ rem 2021-04-22 : path PyPy3 (as we don't try to copy PyPy3.exe to Python.exe) if "%target_python_exe%"=="" set target_python_exe=python.exe -if %my_python_target%==38 ( - set my_python_target_release=3812 - set my_release=1 -) -if %my_python_target%==39 ( - set my_python_target_release=3915 - set my_release=1 -) - if %my_python_target%==310 ( set my_python_target_release=31011 set my_release=2 ) if %my_python_target%==311 ( - set my_python_target_release=3118 + set my_python_target_release=3119 set my_release=1 ) if %my_python_target%==312 ( - set my_python_target_release=3123 + set my_python_target_release=3126 set my_release=1 ) if %my_python_target%==313 ( set my_python_target_release=3130 - set my_release=0 + set my_release=2 ) - -rem **** 2018-10-30 create_installer ** -if "%my_create_installer%"=="" set my_create_installer=True - -rem set my_flavor=Slim - -rem set my_arch=32 -rem set my_preclear_build_directory=Yes - -rem 20230821 add a requirement_pre.txt + -rem set my_requirements_pre=C:\WinP\bd311\requirements_mkl_pre.txt -rem set my_find_links_pre=C:\WinP\packages_mkl.srcreq - -rem set my_requirements=C:\Winpents=d:\my_req1.txt -rem set my_find_links=D:\WinPython\packages.srcreq - -rem set my_source_dirs=D:\WinPython\bd34\packages.src D:\WinPython\bd34\packages.win32.Slim -rem set my_toolsdirs=D:\WinPython\bd34\Tools.Slim -rem set my_docsdirs=D:\WinPython\bd34\docs.Slim - rem set my_install_options=--no-index --pre set my_day=%date:/=-% set my_time=%time:~0,5% set my_time=%my_time::=_% - -rem was the bug set my_time=%my_time: =0% set my_archive_dir=%~dp0WinPython_build_logs @@ -125,26 +108,23 @@ if not exist %my_archive_dir% mkdir %my_archive_dir% set my_archive_log=%my_archive_dir%\build_%my_pyver%._.%my_release%%my_flavor%_%my_release_level%_of_%my_day%_at_%my_time%.txt -echo =============== +echo ---------------------------------------- echo preparing winPython for %my_pyver% (%my_python_target%)release %my_release%%my_flavor% (%my_release_level%) *** %my_arch% bit *** -echo %date% %time% -echo =============== -echo ===============>>%my_archive_log% -echo preparing winPython for %my_pyver% (%my_python_target%)release %my_release%%my_flavor% (%my_release_level%) *** %my_arch% bit ***>>%my_archive_log% -echo %date% %time%>>%my_archive_log% -echo ===============>>%my_archive_log% +echo ---------------------------------------- +echo ---------------------------------------- >>%my_archive_log% +echo (%date% %time%) preparing winPython for %my_pyver% (%my_python_target%)release %my_release%%my_flavor% (%my_release_level%) *** %my_arch% bit ***>>%my_archive_log% +echo ---------------------------------------- >>%my_archive_log% if not "%my_preclear_build_directory%"=="Yes" goto no_preclear -echo ------------------ -echo 1.0 Do a Pre-clear of previous build infrastructure -echo ------------------ -echo ------------------>>%my_archive_log% -echo 1.0 Do a Pre-clear of previous build infrastructure>>%my_archive_log% -echo %date% %time% >>%my_archive_log% -echo ------------------>>%my_archive_log% +echo ---------------------------------------- +echo 1.0 (%date% %time%) Do a Pre-clear of previous build infrastructure +echo ---------------------------------------- +echo ---------------------------------------- >>%my_archive_log% +echo 1.0 (%date% %time%) Do a Pre-clear of previous build infrastructure>>%my_archive_log% +echo ---------------------------------------- >>%my_archive_log% rem 2019-05-10 PATCH for build problem (asking permission to overwrite the file) del -y %userprofile%\.jupyter\jupyter_notebook_config.py @@ -178,14 +158,12 @@ echo %date% %time%>>%my_archive_log% :no_preclear -e -echo ----------------------------- -echo 2.0 Create a new build -echo ---------------------------- >>%my_archive_log% -echo 2.0 Create a new build>>%my_archive_log% -echo %date% %time% >>%my_archive_log% -echo ---------------------------- >>%my_archive_log% +echo ---------------------------------------- +echo 2.0 (%date% %time%) Create a new build +echo ---------------------------------------- >>%my_archive_log% +echo 2.0 (%date% %time%) Create a new build>>%my_archive_log% +echo ---------------------------------------- >>%my_archive_log% echo cd /D %~dp0>>%my_archive_log% @@ -197,49 +175,41 @@ set path=%my_original_path% echo call %my_buildenv%\scripts\env.bat>>%my_archive_log% call %my_buildenv%\scripts\env.bat -echo ----------------------------- -echo 2.1 Create basic build infrastructure -echo %date% %time% -echo ----------------------------- -echo ----------------------------->>%my_archive_log% -echo 2.1 Create basic build infrastructure>>%my_archive_log% -echo %date% %time% >>%my_archive_log% -echo ----------------------------->>%my_archive_log% +echo ---------------------------------------- +echo 2.1 (%date% %time%) Create basic build infrastructure +echo ---------------------------------------- +echo ---------------------------------------- >>%my_archive_log% +echo 2.1 (%date% %time%) Create basic build infrastructure>>%my_archive_log% +echo ---------------------------------------- >>%my_archive_log% -rem 2019-10-22 new age step1 -rem we don't use requirements -rem we don't create installer at first path -rem we use legacy python build cd /D %~dp0 +rem at First step 2.1 +rem we don't use any %my_requirements% +rem we don't create installer +rem we use legacy python build cd /D %~dp0 set my_buildenv_path=%path% echo python.exe -c "from make import *;make_all(%my_release%, '%my_release_level%', pyver='%my_pyver%', basedir=r'%my_basedir%', verbose=True, architecture=%my_arch%, flavor='%my_flavor%', install_options=r'%my_install_options%', find_links=r'%my_find_links%', source_dirs=r'%my_source_dirs%', toolsdirs=r'%my_toolsdirs%', docsdirs=r'%my_docsdirs%', create_installer='False', python_target_release='%my_python_target_release%')">>%my_archive_log% + echo python.exe -c "from make import *;make_all(%my_release%, '%my_release_level%', pyver='%my_pyver%', basedir=r'%my_basedir%', verbose=True, architecture=%my_arch%, flavor='%my_flavor%', install_options=r'%my_install_options%', find_links=r'%my_find_links%', source_dirs=r'%my_source_dirs%', toolsdirs=r'%my_toolsdirs%', docsdirs=r'%my_docsdirs%', create_installer='False', python_target_release='%my_python_target_release%')" + rem pause -python.exe -c "from make import *;make_all(%my_release%, '%my_release_level%', pyver='%my_pyver%', basedir=r'%my_basedir%', verbose=True, architecture=%my_arch%, flavor='%my_flavor%', install_options=r'%my_install_options%', find_links=r'%my_find_links%', source_dirs=r'%my_source_dirs%', toolsdirs=r'%my_toolsdirs%', docsdirs=r'%my_docsdirs%', create_installer='False', python_target_release='%my_python_target_release%')">>%my_archive_log% -rem old one -rem echo python.exe -c "from make import *;make_all(%my_release%, '%my_release_level%', pyver='%my_pyver%', basedir=r'%my_basedir%', verbose=True, architecture=%my_arch%, flavor='%my_flavor%', requirements=r'%my_requirements%', install_options=r'%my_install_options%', find_links=r'%my_find_links%', source_dirs=r'%my_source_dirs%', toolsdirs=r'%my_toolsdirs%', docsdirs=r'%my_docsdirs%', create_installer='%my_create_installer%')">>%my_archive_log% +python.exe -c "from make import *;make_all(%my_release%, '%my_release_level%', pyver='%my_pyver%', basedir=r'%my_basedir%', verbose=True, architecture=%my_arch%, flavor='%my_flavor%', install_options=r'%my_install_options%', find_links=r'%my_find_links%', source_dirs=r'%my_source_dirs%', toolsdirs=r'%my_toolsdirs%', docsdirs=r'%my_docsdirs%', create_installer='False', python_target_release='%my_python_target_release%')">>%my_archive_log% -echo ----------------------------- -echo 2.2 check infrastructure is in place -echo %date% %time% -echo ----------------------------- -echo ----------------------------->>%my_archive_log% -echo 2.2 check infrastructure is in place>>%my_archive_log% -echo %date% %time% >>%my_archive_log% -echo ----------------------------->>%my_archive_log% -rem 2019-10-22 new age step2 -rem we use final environment to install requirements -set path=%my_original_path% +echo ---------------------------------------- +echo 2.2 (%date% %time%) check infrastructure is in place +echo ---------------------------------------- +echo ---------------------------------------- >>%my_archive_log% +echo 2.2 (%date% %time%) check infrastructure is in place>>%my_archive_log% +echo ---------------------------------------- >>%my_archive_log% @echo on set my_WINPYDIRBASE=%my_root_dir_for_builds%\bd%my_python_target%\bu%my_flavor%\Wpy%my_arch%-%my_python_target_release%%my_release%%my_release_level% set WINPYDIRBASE=%my_WINPYDIRBASE% -rem D/2020-07-04: poka-yoke if not exist %my_WINPYDIRBASE%\scripts\env.bat ( echo please check and correct my_python_target_release=%my_python_target_release% echo my_arch=%my_arch% @@ -251,47 +221,35 @@ if not exist %my_WINPYDIRBASE%\scripts\env.bat ( pause exit ) -rem F/2020-07-04: poka-yoke + +rem we use final environment to install requirements +set path=%my_original_path% call %my_WINPYDIRBASE%\scripts\env.bat set -echo beg of step 2/3 -rem ok no pause - -echo ----------------------------- -echo 2.3 add mandatory packages for build -echo %date% %time% -echo ----------------------------- -echo ----------------------------->>%my_archive_log% -echo 2.3 add mandatory packages for build>>%my_archive_log% -echo %date% %time% >>%my_archive_log% -echo ----------------------------->>%my_archive_log% - -rem D/2024-04-10: do not override "/vcruntime140_1.dll" with msvc_runtime wheel -rem echo python.exe -c "import sys;from pathlib import Path;f=open(Path(sys.prefix) / 'pyenv.cfg', 'w');f.write('include-system-site-packages = true\n');f.close">>%my_archive_log% -rem F/2024-04-10 - -rem D/2020-07-05: install msvc_runtime before packages that may want to compile + + +echo ---------------------------------------- +echo 2.3 (%date% %time%) add mandatory packages for build 'msvc_runtime'.. still necessary ? +echo ---------------------------------------- +echo ---------------------------------------- >>%my_archive_log% +echo 2.3 (%date% %time%) add mandatory packages for build 'msvc_runtime'.. still necessary ?>>%my_archive_log% +echo ---------------------------------------- >>%my_archive_log% + echo python -m pip install msvc_runtime --pre --no-index --trusted-host=None --find-links=%my_find_links% --upgrade echo python -m pip install msvc_runtime --pre --no-index --trusted-host=None --find-links=%my_find_links% --upgrade>>%my_archive_log% python -m pip install msvc_runtime --pre --no-index --trusted-host=None --find-links=%my_find_links% --upgrade -rem F/2020-07-05: install msvc_runtime before packages that may want to compile - -rem D/2023-08-21a: add a pre_step with my_requirements_pre.txt + my_find_links_pre -echo ----------------------------- -echo 2.4 add packages pre_requirements (if any) -echo %date% %time% -echo ----------------------------- -echo ----------------------------->>%my_archive_log% -echo 2.4 add packages pre_requirements (if any) -echo %date% %time% >>%my_archive_log% -echo ----------------------------->>%my_archive_log%rem F/20230821 add a pre_step with my_requirements_pre.txt + my_find_links_pre +echo ---------------------------------------- +echo 2.4 (%date% %time%) add packages pre_requirements (if any) +echo ---------------------------------------- +echo ---------------------------------------- >>%my_archive_log% +echo 2.4 (%date% %time%) add packages pre_requirements (if any) +echo ---------------------------------------- >>%my_archive_log% if not "Z%my_requirements_pre%Z"=="ZZ" ( - rem 2023-08-21a: add a pre_step with my_requirements_pre.txt + my_find_links_pre if "%my_find_links_pre%"=="" set my_find_links_pre=%my_find_links% echo python -m pip install -r %my_requirements_pre% -c %my_constraints% --pre --no-index --trusted-host=None --find-links=%my_find_links_pre% @@ -303,65 +261,50 @@ python -m pip install -r %my_requirements_pre% -c %my_constraints% --pre --n echo no packages pre_requirements echo no packages pre_requirements>>%my_archive_log% ) -rem F/2023-08-21a: add a pre_step with my_requirements_pre.txt + my_find_links_pre -echo ----------------------------- -echo 2.5 add requirement packages -echo %date% %time% -echo ----------------------------- -echo ----------------------------->>%my_archive_log% -echo 2.5 add requirement packages_versions>>%my_archive_log% -echo %date% %time% >>%my_archive_log% -echo ----------------------------->>%my_archive_log% + +echo ---------------------------------------- +echo 2.5 (%date% %time%) add requirement packages +echo ---------------------------------------- +echo ---------------------------------------- >>%my_archive_log% +echo 2.5 (%date% %time%) add requirement packages_versions>>%my_archive_log% +echo ---------------------------------------- >>%my_archive_log% echo python -m pip install -r %my_requirements% -c %my_constraints% --pre --no-index --trusted-host=None --find-links=%my_find_links% echo python -m pip install -r %my_requirements% -c %my_constraints% --pre --no-index --trusted-host=None --find-links=%my_find_links% >>%my_archive_log% echo if pip doesn't work, check the path of %my_WINPYDIRBASE% - -rem 2020-12-05 : add a constraints.txt file from a recent pip list python -m pip install -r %my_requirements% -c %my_constraints% --pre --no-index --trusted-host=None --find-links=%my_find_links% >>%my_archive_log% -echo mid of step 2/3 - -echo ----------------------------- -echo 2.8 post-build (if specific workarounds) -echo %date% %time% -echo ----------------------------- -echo ----------------------------->>%my_archive_log% -echo 2.8 post-build (if specific workarounds)>>%my_archive_log% -echo %date% %time% >>%my_archive_log% -echo ----------------------------->>%my_archive_log% -rem finalize + +echo ---------------------------------------- +echo 2.8 (%date% %time%) post-build (if specific workarounds) +echo ---------------------------------------- +echo ---------------------------------------- >>%my_archive_log% +echo 2.8 (%date% %time%) post-build (if specific workarounds)>>%my_archive_log% +echo ---------------------------------------- >>%my_archive_log% + @echo on call %my_basedir%\run_complement_newbuild.bat %my_WINPYDIRBASE% -echo end of step 2/3 -echo end of step 2/3>>%my_archive_log% -rem pause -rem ***************************** -rem 2021-03-20 : track successes packages combination are archived for future contraint update -rem ***************************** -echo ----------------------------- -echo 2.9 archive success -echo %date% %time% -echo ----------------------------- -echo ----------------------------->>%my_archive_log% -echo 2.9 archive success >>%my_archive_log% -echo %date% %time% >>%my_archive_log% -echo ----------------------------->>%my_archive_log% -echo %target_python_exe% -m pip freeze>%my_archive_log%.packages_versions.txt>>%my_archive_log% +echo ---------------------------------------- +echo 2.9 (%date% %time%) archive success +echo ---------------------------------------- +echo ---------------------------------------- >>%my_archive_log% +echo 2.9 (%date% %time%) archive success >>%my_archive_log% +echo ---------------------------------------- >>%my_archive_log% + +echo %target_python_exe% -m pip freeze>%my_archive_log%.packages_versions.txt>>%my_archive_log% %target_python_exe% -m pip freeze>%my_archive_log%.packages_versions.txt -echo ----------------------------- -echo 3.0 Generate Changelog and binaries -echo ----------------------------- -echo ----------------------------->>%my_archive_log% -echo 3.0 Generate Changelog and binaries >>%my_archive_log% -echo %date% %time% >>%my_archive_log% -echo ----------------------------->>%my_archive_log% +echo ---------------------------------------- +echo 3.0 (%date% %time%) Generate Changelog and binaries +echo ---------------------------------------- +echo ---------------------------------------- >>%my_archive_log% +echo 3.0 (%date% %time%) Generate Changelog and binaries >>%my_archive_log% +echo ---------------------------------------- >>%my_archive_log% rem build final changelog and binaries, using create_installer='%my_create_installer%', remove_existing=False , remove : requirements, toolsdirs and docdirs @@ -374,23 +317,23 @@ call %my_buildenv%\scripts\env.bat set echo python.exe -c "from make import *;make_all(%my_release%, '%my_release_level%', pyver='%my_pyver%', basedir=r'%my_basedir%', verbose=True, architecture=%my_arch%, flavor='%my_flavor%', install_options=r'%my_install_options%', find_links=r'%my_find_links%', source_dirs=r'%my_source_dirs%', create_installer='%my_create_installer%', remove_existing=False, python_target_release='%my_python_target_release%')">>%my_archive_log% + echo python.exe -c "from make import *;make_all(%my_release%, '%my_release_level%', pyver='%my_pyver%', basedir=r'%my_basedir%', verbose=True, architecture=%my_arch%, flavor='%my_flavor%', install_options=r'%my_install_options%', find_links=r'%my_find_links%', source_dirs=r'%my_source_dirs%', create_installer='%my_create_installer%', remove_existing=False, python_target_release='%my_python_target_release%')" -rem pause + python.exe -c "from make import *;make_all(%my_release%, '%my_release_level%', pyver='%my_pyver%', basedir=r'%my_basedir%', verbose=True, architecture=%my_arch%, flavor='%my_flavor%', install_options=r'%my_install_options%', find_links=r'%my_find_links%', source_dirs=r'%my_source_dirs%', create_installer='%my_create_installer%', remove_existing=False, python_target_release='%my_python_target_release%')">>%my_archive_log% -echo =============== -echo END OF creation -echo =============== -echo ===============>>%my_archive_log% -echo END OF creation>>%my_archive_log% -echo %date% %time% >>%my_archive_log% -echo ===============>>%my_archive_log% + +echo ---------------------------------------- +echo (%date% %time%) END OF creation +echo ---------------------------------------- +echo ---------------------------------------- >>%my_archive_log% +echo (%date% %time%) END OF creation>>%my_archive_log% +echo ---------------------------------------- >>%my_archive_log% rem show logs start notepad.exe %my_archive_log% -rem 2021-03-20 : track successes packages combination are archived for future contraint update start notepad.exe %my_archive_log%.packages_versions.txt set path=%my_original_path% -rem pause \ No newline at end of file +rem pause diff --git a/run_complement_newbuild.bat b/run_complement_newbuild.bat index dd079a8c..ba88adeb 100644 --- a/run_complement_newbuild.bat +++ b/run_complement_newbuild.bat @@ -1,49 +1,53 @@ rem first line check echo keep me in ansi =utf-8 without BOM (notepad plus plus or win10 screwing up for compatibility) +rem ***************************** rem 2021-05-23: use "%PYTHON%" for the executable instead of "%WINPYDIR%\python.exe" rem 2022-10-19 patch cpython bug https://github.com/winpython/winpython/issues/1121 - -rem if build error, launch "WinPython Command Prompt.exe" dos ico, then try manual install of requirements.txt -rem that is: pip install --pre --no-index --trusted-host=None --find-links=C:\WinP\packages.srcreq -c C:\WinP\constraints.txt -r C:\WinP\bd39\requirements_test.txt Qt5_requirements64.txt Cod_requirements64.txt -rem python -m pip freeze>C:\WinP\bd39\req_test150.txt between intermediate steps -rem -rem ( drag & drop "requirements.txt" file in the dos window a the end of the line, to get full path) -rem then drag & drop "run_complement_newbuild.bat" file in the dos window and launch it +rem 2024-09-15a: compactify for lisiblity +rem ***************************** + +rem algorithm: +rem 0.0 Initialize target environment +rem 1.0 Do cosmetic complements +rem 2.0 Do active patches +rem 3.0 Don't do patches in reserve (examples) +rem 3.0 clean-ups (to move to upper stage) +rem 4.0 summary of packages @echo off -rem %1 is WINPYDIRBASE being prepared, (names winpydir of python build batch) (like "...bd37\buPyPy\WPy64-37100b2") +echo ---------------------------------------- +echo 0.0 (%date% %time%) Initialize variables +echo ---------------------------------------- + +rem %1 is the WINPYDIRBASE being prepared, (names winpydir of python build batch) (like "...bd37\buPyPy\WPy64-37100b2") rem this .bat is placed at root (buildir34, buildir34\FlavorJulia, ...) set origin=%~dp0 set new_winpydir=%1 -echo new_winpydir= ********%new_winpydir%*********************************************************** +echo new_winpydir=%new_winpydir% cd /d %new_winpydir% call scripts\env.bat @echo off -rem * ========================== -echo * When Python has no mingwpy -rem * ========================== -if not exist "%WINPYDIR%\Lib\site-packages\mingwpy" set pydistutils_cfg=%WINPYDIR%\..\settings\pydistutils.cfg -if not exist "%WINPYDIR%\Lib\site-packages\mingwpy" echo [config]>%pydistutils_cfg% - - +echo ---------------------------------------- +echo 1.0 (%date% %time%) Do cosmetic complements +echo ---------------------------------------- -rem * ================= echo finish install seaborn iris example -rem * ================= +rem ---------------------------------------- if exist "%WINPYDIR%\Lib\site-packages\seaborn" "%PYTHON%" -c "import seaborn as sns;sns.set();sns.load_dataset('iris')" -rem ** Active patchs************************************************************************************************* +echo ---------------------------------------- +echo 2.0 (%date% %time%) Do Active patchs +echo ---------------------------------------- -rem * =========================== rem 2022-10-19 patch cpython bug https://github.com/winpython/winpython/issues/1121 -rem * =========================== + set qt56p=%WINPYDIR%\Lib\idlelib\macosx.py if exist "%qt56p%" ( "%PYTHON%" -c "from winpython.utils import patch_sourcefile;patch_sourcefile(r'%WINPYDIR%\Lib\idlelib\macosx.py', 'from test.support ', '#stonebig patch cpython/pull/98313/files: from test.support' )" @@ -53,12 +57,17 @@ if exist "%qt56p%" ( ) -rem ** Example of live file replacement (not active)*********************************************************************************************** +goto the_end + +echo ---------------------------------------- +echo 2.0 (%date% %time%) not active patchs example (reserve) +echo ---------------------------------------- -rem * =========================== + + +rem ---------------------------------------- echo 2021-04-17 patch jupyter_lsp-1.1.4 rem see https://github.com/krassowski/jupyterlab-lsp/pull/580/files -rem * =========================== rem in DOS, the variable must be set befor the parenthesis block.... set this_source='%WINPYDIR%\Lib\site-packages\jupyter_lsp\virtual_documents_shadow.py' @@ -68,14 +77,37 @@ if exist "%WINPYDIR%\Lib\site-packages\jupyter_lsp-1.1.4.dist-info" ( "%PYTHON%" -c "from winpython.utils import patch_sourcefile;patch_sourcefile(r%this_source%, 'join(self.lines))', 'join(self.lines), encoding='+chr(39)+'utf-8'+chr(39)+')' )" ) -rem * =========================== +rem ---------------------------------------- rem 2020-05-15 patch jedi-0.17.0 -rem * =========================== if exist "%WINPYDIR%\Lib\site-packages\jedi-0.17.0.dist-info" copy/Y "C:\WinP\tempo_fixes\Jedi-0.17.0\api\__init__.py" "%WINPYDIR%\Lib\site-packages\Jedi-0.17.0\api\__init__.py" -rem * ================= +rem ---------------------------------------- + + + + + +echo 2019-10-22 Spyder tweaks moved at the end as suspicion of problem creating (on Python-3.8) +rem ---------------------------------------- +echo .spyder3\temp.py suspected of creating issue east of Italia +echo see https://groups.google.com/forum/#!topic/spyderlib/dH5VXlTc30s + +if exist "%WINPYDIR%\..\settings\.spyder-py3\temp.py" del "%WINPYDIR%\..\settings\.spyder-py3\temp.py" + +rem ---------------------------------------- +rem 2023-02-12: paching pip-23.0.0 pip\_vend_r\rich patch cpython bug https://github.com/pypa/pip/issues/11798 + +if exist "%WINPYDIR%\Lib\site-packages\pip-23.0.dist-info" ( + echo "coucou Pip-23.0 crashing _vendor/rich" + copy/Y "C:\WinP\tempo_fixes\pip\_vendor\rich\_win32_console.py" "%WINPYDIR%\site-packages\pip\_vendor\rich\_win32_console.py" +) + +:the_end +echo ---------------------------------------- +rem 3.0 (%date% %time%) clean-ups (to move to upper stage) +echo ---------------------------------------- echo JUPYTERLAB_DIR=%JUPYTERLAB_DIR% default is ~/.jupyter/lab echo JUPYTERLAB_SETTINGS_DIR=%JUPYTERLAB_SETTINGS_DIR% , default is ~/.jupyter/lab/user-settings/ @@ -83,49 +115,27 @@ echo JUPYTERLAB_WORKSPACES_DIR=%JUPYTERLAB_WORKSPACES_DIR% , default is ~/.jupyt "%WINPYDIR%\Scripts\jupyter.exe" lab path +rem ---------------------------------------- +echo clear jupyterlab staging (2018-03-09) + +if exist "%WINPYDIR%\share\jupyter\lab\staging" rmdir /S /Q "%WINPYDIR%\share\jupyter\lab\staging" +rem if exist "%WINPYDIR%\Lib\site-packages\jupyterlab" "%WINPYDIR%\Scripts\jupyter.exe" lab clean + + -rem jupyter labextension update --all (will rebuild if needed) -rem 2020-12-31 tweaks rem see https://jupyter.readthedocs.io/en/latest/use/jupyter-directories.html if exist "%WINPYDIR%\Lib\site-packages\jupyterlab" ( "%WINPYDIR%\Scripts\jupyter.exe" labextension list "%WINPYDIR%\Scripts\jupyter.exe" --paths ) -REM 2023-10-15: 'nbextension' was Jupyter3 days -rem if exist "%WINPYDIR%\Lib\site-packages\notebook" "%WINPYDIR%\Scripts\jupyter.exe" nbextension list - -rem * =================== -echo clear jupyterlab staging (2018-03-09) -rem * =================== -if exist "%WINPYDIR%\share\jupyter\lab\staging" rmdir /S /Q "%WINPYDIR%\share\jupyter\lab\staging" -rem if exist "%WINPYDIR%\Lib\site-packages\jupyterlab" "%WINPYDIR%\Scripts\jupyter.exe" lab clean +echo ---------------------------------------- +echo 4.0 (%date% %time%) Summary of packages +echo ---------------------------------------- -echo 2019-10-22 Spyder tweaks moved at the end as suspicion of problem creating (on Python-3.8) -rem * ============================ -echo .spyder3\temp.py suspected of creating issue east of Italia -echo see https://groups.google.com/forum/#!topic/spyderlib/dH5VXlTc30s -rem * ============================ -if exist "%WINPYDIR%\..\settings\.spyder-py3\temp.py" del "%WINPYDIR%\..\settings\.spyder-py3\temp.py" - -rem * ============================ -rem 2023-02-12: paching pip-23.0.0 pip\_vend_r\rich patch cpython bug https://github.com/pypa/pip/issues/11798 -rem * ============================ -if exist "%WINPYDIR%\Lib\site-packages\pip-23.0.dist-info" ( - echo "coucou Pip-23.0 crashing _vendor/rich" - copy/Y "C:\WinP\tempo_fixes\pip\_vendor\rich\_win32_console.py" "%WINPYDIR%\site-packages\pip\_vendor\rich\_win32_console.py" -) - -rem * ==================== -echo summary 20202-04-11 -rem * ==================== pip check -@echo on -goto the_end - -:the_end \ No newline at end of file From c76621c8f88369b126d11e71a98d672ee139e870 Mon Sep 17 00:00:00 2001 From: stonebig Date: Sun, 15 Sep 2024 22:56:07 +0200 Subject: [PATCH 017/305] add free-threading tweak --- run_complement_newbuild.bat | 26 +++++++++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/run_complement_newbuild.bat b/run_complement_newbuild.bat index ba88adeb..69b3da50 100644 --- a/run_complement_newbuild.bat +++ b/run_complement_newbuild.bat @@ -9,6 +9,7 @@ rem ***************************** rem algorithm: rem 0.0 Initialize target environment +rem 0.9 Python-3.13.0b3 free-threading tweak rem 1.0 Do cosmetic complements rem 2.0 Do active patches rem 3.0 Don't do patches in reserve (examples) @@ -31,6 +32,29 @@ cd /d %new_winpydir% call scripts\env.bat @echo off +echo ---------------------------------------- +echo 0.9 (%date% %time%) Python-3.13.0b3 free-threading tweak +echo ---------------------------------------- + +if exist "%WINPYDIR%\python3.13t.exe" ( + +rem "%PYTHON%" -m pip install --pre --no-index --trusted-host=None --find-links=C:\WinP\bd313\packages.win-amd64t --upgrade cython + + +rem make python3.13t binaries the default + move "%WINPYDIR%\python.exe" "%WINPYDIR%\python_classic.exe" + move "%WINPYDIR%\pythonw.exe" "%WINPYDIR%\pythonw_classic.exe" + copy/Y "%WINPYDIR%\python3.13t.exe" "%WINPYDIR%\python.exe" + copy/Y "%WINPYDIR%\pythonw3.13t.exe" "%WINPYDIR%\pythonw.exe" + +rem a bug when ipython "help(len)" +rem "%PYTHON%" -c "from winpython.utils import patch_sourcefile;patch_sourcefile(r'%WINPYDIR%\\Lib\_pyrepl\pager.py', 'tempfilepager(', 'tempfile_pager(' )" + +) else ( + echo "I DIDN'T patch python3.13 !" +) + + echo ---------------------------------------- echo 1.0 (%date% %time%) Do cosmetic complements echo ---------------------------------------- @@ -106,7 +130,7 @@ if exist "%WINPYDIR%\Lib\site-packages\pip-23.0.dist-info" ( :the_end echo ---------------------------------------- -rem 3.0 (%date% %time%) clean-ups (to move to upper stage) +echo 3.0 (%date% %time%) clean-ups (to move to upper stage) echo ---------------------------------------- echo JUPYTERLAB_DIR=%JUPYTERLAB_DIR% default is ~/.jupyter/lab From d2ed0d9dc709b1de88d82f53130ebbe73d7d5b75 Mon Sep 17 00:00:00 2001 From: stonebig Date: Sun, 15 Sep 2024 23:19:49 +0200 Subject: [PATCH 018/305] modernise style --- winpython/utils.py | 38 +++----------------------------------- 1 file changed, 3 insertions(+), 35 deletions(-) diff --git a/winpython/utils.py b/winpython/utils.py index 3adbed60..dcfd821f 100644 --- a/winpython/utils.py +++ b/winpython/utils.py @@ -63,13 +63,11 @@ def onerror(function, path, excinfo): raise -#============================================================================== -# https://stackoverflow.com/questions/580924/how-to-access-a-files-properties-on-windows def getFileProperties(fname): -#============================================================================== """ Read all properties of the given file return them as a dictionary. """ + # from https://stackoverflow.com/questions/580924/how-to-access-a-files-properties-on-windows import win32api propNames = ('Comments', 'InternalName', 'ProductName', 'CompanyName', 'LegalCopyright', 'ProductVersion', @@ -104,9 +102,6 @@ def getFileProperties(fname): pass return props -# ============================================================================= -# Shortcuts, start menu -# ============================================================================= def get_special_folder_path(path_name): @@ -215,11 +210,6 @@ def create_shortcut( pass -# ============================================================================= -# Misc. -# ============================================================================= - - def print_box(text): """Print text in a box""" line0 = "+" + ("-" * (len(text) + 2)) + "+" @@ -237,11 +227,6 @@ def is_python_distribution(path): return has_exec and has_site -# ============================================================================= -# Shell, Python queries -# ============================================================================= - - def decode_fs_string(string): """Convert string from file system charset to unicode""" charset = sys.getfilesystemencoding() @@ -365,13 +350,10 @@ def get_python_long_version(path): return ver -# ============================================================================= -# Patch chebang line (courtesy of Christoph Gohlke) -# ============================================================================= def patch_shebang_line( fname, pad=b' ', to_movable=True, targetdir="" ): - """Remove absolute path to python.exe in shebang lines, or re-add it""" + """Remove absolute path to python.exe in shebang lines in binary files, or re-add it""" import re import sys @@ -425,9 +407,6 @@ def patch_shebang_line( print("failed to patch", fname) -# ============================================================================= -# Patch shebang line in .py files -# ============================================================================= def patch_shebang_line_py( fname, to_movable=True, targetdir="" ): @@ -455,9 +434,6 @@ def patch_shebang_line_py( print(line, end='') -# ============================================================================= -# Guess encoding (shall rather be utf-8 per default) -# ============================================================================= def guess_encoding(csv_file): """guess the encoding of the given file""" # UTF_8_BOM = "\xEF\xBB\xBF" @@ -474,9 +450,7 @@ def guess_encoding(csv_file): except: return [locale.getdefaultlocale()[1], "utf-8"] -# ============================================================================= -# Patch sourcefile (instead of forking packages) -# ============================================================================= + def patch_sourcefile( fname, in_text, out_text, silent_mode=False ): @@ -502,9 +476,6 @@ def patch_sourcefile( fh.write(new_content) -# ============================================================================= -# Patch sourcelines (instead of forking packages) -# ============================================================================= def patch_sourcelines( fname, in_line_start, @@ -563,9 +534,6 @@ def patch_sourcelines( ) -# ============================================================================= -# Extract functions -# ============================================================================= def _create_temp_dir(): """Create a temporary directory and remove it at exit""" tmpdir = tempfile.mkdtemp(prefix='wppm_') From 0f309249c517d6856477c8f91c16919e29529a74 Mon Sep 17 00:00:00 2001 From: stonebig Date: Sun, 22 Sep 2024 10:46:20 +0200 Subject: [PATCH 019/305] replace winpythonini.vbs per winpythonini.py --- make.py | 61 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 60 insertions(+), 1 deletion(-) diff --git a/make.py b/make.py index 5b5ce53b..062fddf4 100644 --- a/make.py +++ b/make.py @@ -878,7 +878,10 @@ def _create_batch_scripts_initial(self): rem remove some potential last \ if "%WINPYWORKDIR1:~-1%"=="\" set WINPYWORKDIR1=%WINPYWORKDIR1:~0,-1% -FOR /F "delims=" %%i IN ('cscript /nologo "%~dp0WinpythonIni.vbs"') DO set winpythontoexec=%%i +rem 2024-09-22 pythonify +rem FOR /F "delims=" %%i IN ('cscript /nologo "%~dp0WinpythonIni.vbs"') DO set winpythontoexec=%%i +FOR /F "delims=" %%i IN ('""%WINPYDIR%\python.exe" "%~dp0WinpythonIni.py""') DO set winpythontoexec=%%i + %winpythontoexec%set winpythontoexec= rem 2024-08-18: we go initial directory WINPYWORKDIR if no direction and we are on icon directory @@ -967,6 +970,62 @@ def _create_batch_scripts_initial(self): """, ) + self.create_batch_script( + "WinPythonIni.py", # Replaces winpython.vbs + r""" +'prepares a dynamic list of variables settings from a .ini file' +import os +import subprocess + +def get_file(file_name): + if file_name.startswith("..\\"): + file_name = os.path.join(os.path.dirname(os.path.dirname(__file__)), file_name[3:]) + elif file_name.startswith(".\\"): + file_name = os.path.join(os.path.dirname(__file__), file_name[2:]) + with open(file_name, 'r') as file: + return file.read() + +def translate(line, env): + parts = line.split('%') + for i in range(1, len(parts), 2): + if parts[i] in env: + parts[i] = env[parts[i]] + return ''.join(parts) + +def main(): + import sys + args = sys.argv[1:] + file_name = args[0] if args else "..\\settings\\winpython.ini" + + my_lines = get_file(file_name).splitlines() + segment = "environment" + txt = "" + env = os.environ.copy() # later_version: env = os.environ + + for l in my_lines: + if l.startswith("["): + segment = l[1:].split("]")[0] + elif not l.startswith("#") and "=" in l: + data = l.split("=", 1) + if segment == "debug" and data[0].strip() == "state": + data[0] = "WINPYDEBUG" + if segment in ["environment", "debug"]: + txt += f"set {data[0].strip()}={translate(data[1].strip(), env)}&& " + env[data[0].strip()] = translate(data[1].strip(), env) + if segment == "debug" and data[0].strip() == "state": + txt += f"set WINPYDEBUG={data[1].strip()}&&" + + print(txt) + # later_version: + # p = subprocess.Popen(["start", "cmd", "/k", "set"], shell = True) # Needs to be shell since start isn't an executable, its a shell cmd + # p.wait() # I can wait until finished (although it too finishes after start finishes) + +if __name__ == "__main__": + main() + """, + ) + + def _create_batch_scripts(self): """Create batch scripts""" self._print("Creating batch scripts") From bd52bd9595a01b5316f878522f5b6e4b8db26cb6 Mon Sep 17 00:00:00 2001 From: stonebig Date: Sun, 22 Sep 2024 11:03:02 +0200 Subject: [PATCH 020/305] remove all '.vbs' from build system --- make.py | 69 +------------------------------------------ winpython/__init__.py | 2 +- 2 files changed, 2 insertions(+), 69 deletions(-) diff --git a/make.py b/make.py index 062fddf4..2ae061b9 100644 --- a/make.py +++ b/make.py @@ -878,8 +878,6 @@ def _create_batch_scripts_initial(self): rem remove some potential last \ if "%WINPYWORKDIR1:~-1%"=="\" set WINPYWORKDIR1=%WINPYWORKDIR1:~0,-1% -rem 2024-09-22 pythonify -rem FOR /F "delims=" %%i IN ('cscript /nologo "%~dp0WinpythonIni.vbs"') DO set winpythontoexec=%%i FOR /F "delims=" %%i IN ('""%WINPYDIR%\python.exe" "%~dp0WinpythonIni.py""') DO set winpythontoexec=%%i %winpythontoexec%set winpythontoexec= @@ -904,71 +902,6 @@ def _create_batch_scripts_initial(self): do_changes=changes, ) - self.create_batch_script( - "Noshell.vbs", - r""" -'from http://superuser.com/questions/140047/how-to-run-a-batch-file-without-launching-a-command-window/390129 -If WScript.Arguments.Count >= 1 Then - ReDim arr(WScript.Arguments.Count-1) - For i = 0 To WScript.Arguments.Count-1 - Arg = WScript.Arguments(i) - If InStr(Arg, " ") > 0 or InStr(Arg, "&") > 0 Then Arg = chr(34) & Arg & chr(34) - arr(i) = Arg - Next - - RunCmd = Join(arr) - CreateObject("Wscript.Shell").Run RunCmd, 0 , True -End If - """, - ) - - self.create_batch_script( - "WinPythonIni.vbs", - r""" -Set colArgs = WScript.Arguments -If colArgs.Count> 0 Then - Filename=colArgs(0) -else - Filename="..\settings\winpython.ini" -end if -my_lines = Split(GetFile(FileName) & vbNewLine , vbNewLine ) -segment = "environment" -txt="" -Set objWSH = CreateObject("WScript.Shell") -For each l in my_lines - if left(l, 1)="[" then - segment=split(mid(l, 2, 999) & "]","]")(0) - ElseIf left(l, 1) <> "#" and instr(l, "=")>0 then - data = Split(l & "=", "=") - if segment="debug" and trim(data(0))="state" then data(0)= "WINPYDEBUG" - if segment="environment" or segment= "debug" then - txt= txt & "set " & rtrim(data(0)) & "=" & translate(ltrim(data(1))) & "&& " - objWSH.Environment("PROCESS").Item(rtrim(data(0))) = translate(ltrim(data(1))) - end if - if segment="debug" and trim(data(0))="state" then txt= txt & "set WINPYDEBUG=" & trim(data(1)) & "&&" - End If -Next -wscript.echo txt - - -Function GetFile(ByVal FileName) - Set FS = CreateObject("Scripting.FileSystemObject") - If Left(FileName,3)="..\" then FileName = FS.GetParentFolderName(FS.GetParentFolderName(Wscript.ScriptFullName)) & mid(FileName,3,9999) - If Left(FileName,3)=".\" then FileName = FS.GetParentFolderName(FS.GetParentFolderName(Wscript.ScriptFullName)) & mid(FileName,3,9999) - On Error Resume Next - GetFile = FS.OpenTextFile(FileName).ReadAll -End Function - -Function translate(line) - set dos = objWSH.Environment("PROCESS") - tab = Split(line & "%", "%") - for i = 1 to Ubound(tab) step 2 - if tab(i)& "" <> "" and dos.Item(tab(i)) & "" <> "" then tab(i) = dos.Item(tab(i)) - next - translate = Join(tab, "") -end function - """, - ) self.create_batch_script( "WinPythonIni.py", # Replaces winpython.vbs @@ -1017,7 +950,7 @@ def main(): print(txt) # later_version: - # p = subprocess.Popen(["start", "cmd", "/k", "set"], shell = True) # Needs to be shell since start isn't an executable, its a shell cmd + # p = subprocess.Popen(["start", "cmd", "/k", "set"], shell = True) # p.wait() # I can wait until finished (although it too finishes after start finishes) if __name__ == "__main__": diff --git a/winpython/__init__.py b/winpython/__init__.py index ea978ba0..1d5bbe40 100644 --- a/winpython/__init__.py +++ b/winpython/__init__.py @@ -28,6 +28,6 @@ OTHER DEALINGS IN THE SOFTWARE. """ -__version__ = '11.0.20240915' +__version__ = '11.1.20240922' __license__ = __doc__ __project_url__ = 'http://winpython.github.io/' From 168f28e27b34b32656b6dd9dd3aeb338f50eaaa6 Mon Sep 17 00:00:00 2001 From: stonebig Date: Sun, 22 Sep 2024 11:33:04 +0200 Subject: [PATCH 021/305] remove dead innon installer thing --- portable/config.txt | 5 ----- 1 file changed, 5 deletions(-) delete mode 100644 portable/config.txt diff --git a/portable/config.txt b/portable/config.txt deleted file mode 100644 index aa4a72a7..00000000 --- a/portable/config.txt +++ /dev/null @@ -1,5 +0,0 @@ -;!@Install@!UTF-8! -Title="WinPython" -BeginPrompt="Do you want to install WinPython?" -InstallPath="." -;!@InstallEnd@! \ No newline at end of file From 3de0b7f9807b0c22dce51038d7c6a8465b6d2581 Mon Sep 17 00:00:00 2001 From: stonebig Date: Sun, 22 Sep 2024 11:39:59 +0200 Subject: [PATCH 022/305] remove unused icons --- portable/icons/qt.ico | Bin 100746 -> 0 bytes portable/icons/qtassistant.ico | Bin 111169 -> 0 bytes portable/icons/qtdesigner.ico | Bin 103488 -> 0 bytes portable/icons/qtlinguist.ico | Bin 109541 -> 0 bytes portable/icons/r.ico | Bin 1406 -> 0 bytes 5 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 portable/icons/qt.ico delete mode 100644 portable/icons/qtassistant.ico delete mode 100644 portable/icons/qtdesigner.ico delete mode 100644 portable/icons/qtlinguist.ico delete mode 100644 portable/icons/r.ico diff --git a/portable/icons/qt.ico b/portable/icons/qt.ico deleted file mode 100644 index 170f9df648eaad164fc83bba98f870ec4a6da068..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 100746 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 SSCIwaLkr48Cv`vYfBz2<(`noQ diff --git a/portable/icons/qtassistant.ico b/portable/icons/qtassistant.ico deleted file mode 100644 index a945814d7f3a3c2dbb41d1748bc85f22b198aa75..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 111169 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

JXCw8vKJ~+ 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 QD7gdr#V+#MbNR=A0YUF_g#Z8m diff --git a/portable/icons/qtdesigner.ico b/portable/icons/qtdesigner.ico deleted file mode 100644 index 45f8a2645aba7ad4aa639591747ebfcc9cf95ee7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 103488 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⪻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 Q5o01| Date: Sun, 22 Sep 2024 16:28:57 +0200 Subject: [PATCH 023/305] move winpython.ini creation from env.bat to winpythonini.py --- make.py | 67 ++++++++++++++++++++++++++++----------------------------- 1 file changed, 33 insertions(+), 34 deletions(-) diff --git a/make.py b/make.py index 2ae061b9..d2b2b8c3 100644 --- a/make.py +++ b/make.py @@ -675,35 +675,6 @@ def _create_batch_scripts_initial(self): echo Binaries = . )>> "%tmp_pyz%" :pyqt5_conf_exist - - -rem ****************** -rem WinPython.ini part (removed from nsis) -rem ****************** -if not exist "%WINPYDIRBASE%\settings" mkdir "%WINPYDIRBASE%\settings" -if not exist "%WINPYDIRBASE%\settings\AppData" mkdir "%WINPYDIRBASE%\settings\AppData" -if not exist "%WINPYDIRBASE%\settings\AppData\Roaming" mkdir "%WINPYDIRBASE%\settings\AppData\Roaming" -set winpython_ini=%WINPYDIRBASE%\settings\winpython.ini -if not exist "%winpython_ini%" ( - echo [debug] - echo state = disabled - echo [environment] - echo ## Uncomment lines to override environment variables - echo #HOME = %%HOMEDRIVE%%%%HOMEPATH%%\Documents\WinPython%%WINPYVER%% - echo #USERPROFILE = %%HOME%% - echo #JUPYTER_DATA_DIR = %%HOME%% - echo #JUPYTERLAB_SETTINGS_DIR = %%HOME%%\.jupyter\lab - echo #JUPYTERLAB_WORKSPACES_DIR = %%HOME%%\.jupyter\lab\workspaces - echo #WINPYWORKDIR = %%HOMEDRIVE%%%%HOMEPATH%%\Documents\WinPython%%WINPYVER%%\Notebooks - echo #R_HOME=%%WINPYDIRBASE%%\t\R - echo #R_HOMEbin=%%R_HOME%%\bin\x64 - echo #JULIA_HOME=%%WINPYDIRBASE%%\t\Julia\bin\ - echo #JULIA_EXE=julia.exe - echo #JULIA=%%JULIA_HOME%%%%JULIA_EXE%% - echo #JULIA_PKGDIR=%%WINPYDIRBASE%%\settings\.julia - echo #QT_PLUGIN_PATH=%%WINPYDIR%%\Lib\site-packages\pyqt5_tools\Qt\plugins -)>> "%winpython_ini%" - """, do_changes=changes, ) @@ -812,7 +783,6 @@ def _create_batch_scripts_initial(self): "#QT_PLUGIN_PATH=%%WINPYDIR%%\Lib\site-packages\pyqt5_tools\Qt\plugins" | Add-Content -Path $env:winpython_ini } - } ############################### ### Set-WindowSize @@ -902,21 +872,47 @@ def _create_batch_scripts_initial(self): do_changes=changes, ) - self.create_batch_script( - "WinPythonIni.py", # Replaces winpython.vbs + "WinPythonIni.py", # Replaces winpython.vbs, and a bit of env.bat r""" 'prepares a dynamic list of variables settings from a .ini file' import os import subprocess +from pathlib import Path + +winpython_inidefault=r''' +[debug] +state = disabled +[environment] +#HOME = %HOMEDRIVE%%HOMEPATH%\Documents\WinPython%WINPYVER% +#USERPROFILE = %HOME% +#JUPYTER_DATA_DIR = %HOME% +#JUPYTERLAB_SETTINGS_DIR = %HOME%\.jupyter\lab +#JUPYTERLAB_WORKSPACES_DIR = %HOME%\.jupyter\lab\workspaces +#WINPYWORKDIR = %HOMEDRIVE%%HOMEPATH%\Documents\WinPython%WINPYVER%\Notebooks +#R_HOME=%WINPYDIRBASE%\t\R +#R_HOMEbin=%R_HOME%\bin\x64 +#JULIA_HOME=%WINPYDIRBASE%\t\Julia\bin\ +#JULIA_EXE=julia.exe +#JULIA=%JULIA_HOME%%JULIA_EXE% +#JULIA_PKGDIR=%WINPYDIRBASE%\settings\.julia +#QT_PLUGIN_PATH=%WINPYDIR%\Lib\site-packages\pyqt5_tools\Qt\plugins +''' def get_file(file_name): if file_name.startswith("..\\"): file_name = os.path.join(os.path.dirname(os.path.dirname(__file__)), file_name[3:]) elif file_name.startswith(".\\"): file_name = os.path.join(os.path.dirname(__file__), file_name[2:]) - with open(file_name, 'r') as file: - return file.read() + try: + with open(file_name, 'r') as file: + return file.read() + except FileNotFoundError: + if file_name[-3:] == 'ini': + os.makedirs(Path(file_name).parent, exist_ok=True) + with open(file_name, 'w') as file: + file.write(winpython_inidefault) + return winpython_inidefault def translate(line, env): parts = line.split('%') @@ -935,6 +931,9 @@ def main(): txt = "" env = os.environ.copy() # later_version: env = os.environ + # default directories (from .bat) + os.makedirs(Path(env['WINPYDIRBASE']) / 'settings' / 'Appdata' / 'Roaming', exist_ok=True) + for l in my_lines: if l.startswith("["): segment = l[1:].split("]")[0] From 2eb59759613914d2b5c3335fa0754c4bccef9cb8 Mon Sep 17 00:00:00 2001 From: stonebig Date: Sun, 22 Sep 2024 18:53:18 +0200 Subject: [PATCH 024/305] move qt.conf handling to python script --- make.py | 73 +++++++++++++-------------------------------------------- 1 file changed, 16 insertions(+), 57 deletions(-) diff --git a/make.py b/make.py index d2b2b8c3..1cf6f6ee 100644 --- a/make.py +++ b/make.py @@ -662,19 +662,6 @@ def _create_batch_scripts_initial(self): rem force default pyqt5 kit for Spyder if PyQt5 module is there if exist "%WINPYDIR%\Lib\site-packages\PyQt5\__init__.py" set QT_API=pyqt5 - -rem ****************** -rem handle PyQt5 if included -rem ****************** -set tmp_pyz=%WINPYDIR%\Lib\site-packages\PyQt5 -if not exist "%tmp_pyz%" goto pyqt5_conf_exist -set tmp_pyz=%tmp_pyz%\qt.conf -if not exist "%tmp_pyz%" ( - echo [Paths] - echo Prefix = . - echo Binaries = . -)>> "%tmp_pyz%" -:pyqt5_conf_exist """, do_changes=changes, ) @@ -741,47 +728,8 @@ def _create_batch_scripts_initial(self): #rem force default pyqt5 kit for Spyder if PyQt5 module is there if (Test-Path "$env:WINPYDIR\Lib\site-packages\PyQt5\__init__.py") { $env:QT_API = "pyqt5" } - -##################### -### handle PyQt5 if included -##################### -$env:tmp_pyz = "$env:WINPYDIR\Lib\site-packages\PyQt5" -if (Test-Path "$env:tmp_pyz") { - $env:tmp_pyz = "$env:tmp_pyz\qt.conf" - if (-not (Test-Path "$env:tmp_pyz")) { - "[Paths]"| Add-Content -Path $env:tmp_pyz - "Prefix = ."| Add-Content -Path $env:tmp_pyz - "Binaries = ."| Add-Content -Path $env:tmp_pyz - } -} - - -##################### -### WinPython.ini part (removed from nsis) -##################### -if (-not (Test-Path "$env:WINPYDIR\..\settings")) { md -Path "$env:WINPYDIR\..\settings" } -if (-not (Test-Path "$env:WINPYDIR\..\settings\AppData")) { md -Path "$env:WINPYDIR\..\settings\AppData" } -if (-not (Test-Path "$env:WINPYDIR\..\settings\AppData\Roaming")) { md -Path "$env:WINPYDIR\..\settings\AppData\Roaming" } -$env:winpython_ini = "$env:WINPYDIR\..\settings\winpython.ini" -if (-not (Test-Path $env:winpython_ini)) { - "[debug]" | Add-Content -Path $env:winpython_ini - "state = disabled" | Add-Content -Path $env:winpython_ini - "[environment]" | Add-Content -Path $env:winpython_ini - "## Uncomment lines to override environment variables" | Add-Content -Path $env:winpython_ini - "#HOME = %%HOMEDRIVE%%%%HOMEPATH%%\Documents\WinPython%%WINPYVER%%" | Add-Content -Path $env:winpython_ini - "#USERPROFILE = %%HOME%%" | Add-Content -Path $env:winpython_ini - "#JUPYTER_DATA_DIR = %%HOME%%" | Add-Content -Path $env:winpython_ini - "#JUPYTERLAB_SETTINGS_DIR = %%HOME%%\.jupyter\lab" | Add-Content -Path $env:winpython_ini - "#JUPYTERLAB_WORKSPACES_DIR = %%HOME%%\.jupyter\lab\workspaces" | Add-Content -Path $env:winpython_ini - "#WINPYWORKDIR = %%HOMEDRIVE%%%%HOMEPATH%%\Documents\WinPython%%WINPYVER%%\Notebooks" | Add-Content -Path $env:winpython_ini - "#R_HOME=%%WINPYDIRBASE%%\t\R" | Add-Content -Path $env:winpython_ini - "#R_HOMEbin=%%R_HOME%%\bin\x64" | Add-Content -Path $env:winpython_ini - "#JULIA_HOME=%%WINPYDIRBASE%%\t\Julia\bin\" | Add-Content -Path $env:winpython_ini - "#JULIA_EXE=julia.exe" | Add-Content -Path $env:winpython_ini - "#JULIA=%%JULIA_HOME%%%%JULIA_EXE%%" | Add-Content -Path $env:winpython_ini - "#JULIA_PKGDIR=%%WINPYDIRBASE%%\settings\.julia" | Add-Content -Path $env:winpython_ini - "#QT_PLUGIN_PATH=%%WINPYDIR%%\Lib\site-packages\pyqt5_tools\Qt\plugins" | Add-Content -Path $env:winpython_ini -} +# PyQt5 qt.conf creation and winpython.ini creation done via Winpythonini.py (called per env_for_icons.bat for now) +# Start-Process -FilePath $env:PYTHON -ArgumentList ($env:WINPYDIRBASE + '\scripts\WinPythonIni.py') } ############################### @@ -798,11 +746,9 @@ def _create_batch_scripts_initial(self): $host.ui.rawui.WindowSize = $size } # Windows10 yelling at us with 150 40 6000 -# no more needed ? # Set-WindowSize 195 40 6000 ### Colorize to distinguish -#$host.ui.RawUI.BackgroundColor = "DarkBlue" $host.ui.RawUI.BackgroundColor = "Black" $host.ui.RawUI.ForegroundColor = "White" @@ -933,7 +879,20 @@ def main(): # default directories (from .bat) os.makedirs(Path(env['WINPYDIRBASE']) / 'settings' / 'Appdata' / 'Roaming', exist_ok=True) - + + # default qt.conf for Qt directories + qt_conf='''echo [Paths] + echo Prefix = . + echo Binaries = . + ''' + + pathlist = [Path(env['WINPYDIR']) / 'Lib' / 'site-packages' / i for i in ('PyQt5', 'PyQt6', 'Pyside6')] + for p in pathlist: + if p.is_dir(): + if not (p / 'qt.conf').is_file(): + with open(p / 'qt.conf', 'w') as file: + file.write(qt_conf) + for l in my_lines: if l.startswith("["): segment = l[1:].split("]")[0] From b66409ce41ad86fa34e47f135938ca8b8ab51659 Mon Sep 17 00:00:00 2001 From: stonebig Date: Mon, 23 Sep 2024 19:22:36 +0200 Subject: [PATCH 025/305] another 8 useless .bat lines --- make.py | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/make.py b/make.py index 1cf6f6ee..a64e4543 100644 --- a/make.py +++ b/make.py @@ -1083,11 +1083,7 @@ def _create_batch_scripts(self): r"""@echo off call "%~dp0env_for_icons.bat" rem cd/D "%WINPYWORKDIR%" -if exist "%WINPYDIR%\scripts\spyder3.exe" ( - "%WINPYDIR%\scripts\spyder3.exe" %* -w "%WINPYWORKDIR1%" -) else ( - "%WINPYDIR%\scripts\spyder.exe" %* -w "%WINPYWORKDIR1%" -) +"%WINPYDIR%\scripts\spyder.exe" %* -w "%WINPYWORKDIR1%" """, ) @@ -1096,11 +1092,7 @@ def _create_batch_scripts(self): r"""@echo off call "%~dp0env_for_icons.bat" cd/D "%WINPYWORKDIR1%" -if exist "%WINPYDIR%\scripts\spyder3.exe" ( - "%WINPYDIR%\scripts\spyder3.exe" --reset %* -) else ( - "%WINPYDIR%\scripts\spyder.exe" --reset %* -) +"%WINPYDIR%\scripts\spyder.exe" --reset %* """, ) From 8a0bdc306bd6f30af19c9fb59558723ae68eb748 Mon Sep 17 00:00:00 2001 From: stonebig Date: Mon, 23 Sep 2024 22:45:03 +0200 Subject: [PATCH 026/305] move winpython.ini changes from .bat to .py --- make.py | 76 +++++++++++++++++++-------------------------------------- 1 file changed, 25 insertions(+), 51 deletions(-) diff --git a/make.py b/make.py index a64e4543..3280f7e5 100644 --- a/make.py +++ b/make.py @@ -829,13 +829,18 @@ def _create_batch_scripts_initial(self): winpython_inidefault=r''' [debug] state = disabled +[inactive_environment_per_user] +## changing this segment to [active_environment_per_user] makes this segment of lines active or not +HOME = %HOMEDRIVE%%HOMEPATH%\Documents\WinPython%WINPYVER%\settings +USERPROFILE = %HOME% +JUPYTER_DATA_DIR = %HOME% +WINPYWORKDIR = %HOMEDRIVE%%HOMEPATH%\Documents\WinPython%WINPYVER%\Notebooks +[inactive_environment_common] +USERPROFILE = %HOME% [environment] -#HOME = %HOMEDRIVE%%HOMEPATH%\Documents\WinPython%WINPYVER% -#USERPROFILE = %HOME% -#JUPYTER_DATA_DIR = %HOME% +## Uncomment lines to override environment variables #JUPYTERLAB_SETTINGS_DIR = %HOME%\.jupyter\lab #JUPYTERLAB_WORKSPACES_DIR = %HOME%\.jupyter\lab\workspaces -#WINPYWORKDIR = %HOMEDRIVE%%HOMEPATH%\Documents\WinPython%WINPYVER%\Notebooks #R_HOME=%WINPYDIRBASE%\t\R #R_HOMEbin=%R_HOME%\bin\x64 #JULIA_HOME=%WINPYDIRBASE%\t\Julia\bin\ @@ -843,6 +848,8 @@ def _create_batch_scripts_initial(self): #JULIA=%JULIA_HOME%%JULIA_EXE% #JULIA_PKGDIR=%WINPYDIRBASE%\settings\.julia #QT_PLUGIN_PATH=%WINPYDIR%\Lib\site-packages\pyqt5_tools\Qt\plugins + + ''' def get_file(file_name): @@ -900,13 +907,18 @@ def main(): data = l.split("=", 1) if segment == "debug" and data[0].strip() == "state": data[0] = "WINPYDEBUG" - if segment in ["environment", "debug"]: + if segment in ["environment", "debug", "active_environment_per_user", "active_environment_common"]: txt += f"set {data[0].strip()}={translate(data[1].strip(), env)}&& " env[data[0].strip()] = translate(data[1].strip(), env) if segment == "debug" and data[0].strip() == "state": txt += f"set WINPYDEBUG={data[1].strip()}&&" print(txt) + + # set potential directory + for i in ('HOME', 'WINPYWORKDIR'): + if i in env: + os.makedirs(Path(env[i]), exist_ok=True) # later_version: # p = subprocess.Popen(["start", "cmd", "/k", "set"], shell = True) # p.wait() # I can wait until finished (although it too finishes after start finishes) @@ -964,62 +976,24 @@ def _create_batch_scripts(self): self.create_batch_script( "make_working_directory_be_not_winpython.bat", - r"""@echo off -set winpython_ini=%~dp0..\\settings\winpython.ini -( - echo [debug] - echo state = disabled - echo [environment] - echo ## Uncomment lines to override environment variables - echo HOME = %%HOMEDRIVE%%%%HOMEPATH%%\Documents\WinPython%%WINPYVER%%\settings - echo USERPROFILE = %%HOME%% - echo JUPYTER_DATA_DIR = %%HOME%% - echo #JUPYTERLAB_SETTINGS_DIR = %%HOME%%\.jupyter\lab - echo #JUPYTERLAB_WORKSPACES_DIR = %%HOME%%\.jupyter\lab\workspaces - echo WINPYWORKDIR = %%HOMEDRIVE%%%%HOMEPATH%%\Documents\WinPython%%WINPYVER%%\Notebooks -) > "%winpython_ini%" - call "%~dp0env_for_icons.bat" - mkdir %HOMEDRIVE%%HOMEPATH%\Documents\WinPython%WINPYVER%\settings - mkdir %HOMEDRIVE%%HOMEPATH%\Documents\WinPython%WINPYVER%\settings\AppData - mkdir %HOMEDRIVE%%HOMEPATH%\Documents\WinPython%WINPYVER%\settings\AppData\Roaming + r"""call "%~dp0env_for_icons.bat" +"%PYTHON%" -c "from winpython.utils import patch_sourcefile;patch_sourcefile(r'%~dp0..\\settings\winpython.ini', '[active_environment', '[inactive_environment' )" +"%PYTHON%" -c "from winpython.utils import patch_sourcefile;patch_sourcefile(r'%~dp0..\\settings\winpython.ini', '[inactive_environment_per_user]', '[active_environment_per_user]' )" """, ) self.create_batch_script( "make_working_directory_be_winpython.bat", - r"""@echo off -set winpython_ini=%~dp0..\\settings\winpython.ini -( - echo [debug] - echo state = disabled - echo [environment] - echo ## Uncomment lines to override environment variables - echo #HOME = %%HOMEDRIVE%%%%HOMEPATH%%\Documents\WinPython%%WINPYVER%%\settings - echo #USERPROFILE = %%HOME%% - echo #JUPYTER_DATA_DIR = %%HOME%% - echo #JUPYTERLAB_SETTINGS_DIR = %%HOME%%\.jupyter\lab - echo #JUPYTERLAB_WORKSPACES_DIR = %%HOME%%\.jupyter\lab\workspaces - echo #WINPYWORKDIR = %%HOMEDRIVE%%%%HOMEPATH%%\Documents\WinPython%%WINPYVER%%\Notebooks -) > "%winpython_ini%" + r"""call "%~dp0env_for_icons.bat" +"%PYTHON%" -c "from winpython.utils import patch_sourcefile;patch_sourcefile(r'%~dp0..\\settings\winpython.ini', '[active_environment', '[inactive_environment' )" """, ) self.create_batch_script( "make_working_directory_and_userprofile_be_winpython.bat", - r"""@echo off -set winpython_ini=%~dp0..\\settings\winpython.ini -( - echo [debug] - echo state = disabled - echo [environment] - echo ## Uncomment lines to override environment variables - echo #HOME = %%HOMEDRIVE%%%%HOMEPATH%%\Documents\WinPython%%WINPYVER%%\settings - echo USERPROFILE = %%HOME%% - echo #JUPYTER_DATA_DIR = %%HOME%% - echo #JUPYTERLAB_SETTINGS_DIR = %%HOME%%\.jupyter\lab - echo #JUPYTERLAB_WORKSPACES_DIR = %%HOME%%\.jupyter\lab\workspaces - echo #WINPYWORKDIR = %%HOMEDRIVE%%%%HOMEPATH%%\Documents\WinPython%%WINPYVER%%\Notebooks -) > "%winpython_ini%" + r"""call "%~dp0env_for_icons.bat" +"%PYTHON%" -c "from winpython.utils import patch_sourcefile;patch_sourcefile(r'%~dp0..\\settings\winpython.ini', '[active_environment', '[inactive_environment' )" +"%PYTHON%" -c "from winpython.utils import patch_sourcefile;patch_sourcefile(r'%~dp0..\\settings\winpython.ini', '[inactive_environment_common]', '[active_environment_common]' )" """, ) From 5e168f5b386452f61c8e48d69f07ba14a81b89d0 Mon Sep 17 00:00:00 2001 From: stonebig Date: Tue, 24 Sep 2024 19:12:04 +0200 Subject: [PATCH 027/305] remove unused get_drives() --- make.py | 36 ++++++++++-------------------------- 1 file changed, 10 insertions(+), 26 deletions(-) diff --git a/make.py b/make.py index 3280f7e5..07daa48b 100644 --- a/make.py +++ b/make.py @@ -27,35 +27,19 @@ assert Path(CHANGELOGS_DIR).is_dir() -def get_drives(): - """ - This function retrieves a list of existing drives on a Windows system. - - Returns: - list: A list of drive letters (e.g., ['C:', 'D:']) - """ - if hasattr(os, 'listdrives'): # For Python 3.12 and above - return os.listdrives() - else: - drives = [f"{d}:\\" for d in os.environ.get('HOMEDRIVE', '').split("\\") if d] - return drives - - def get_7zip_exe(): """Return 7zip executable""" localdir = str(Path(sys.prefix).parent.parent) - for drive in get_drives(): - for dirname in ( - r"C:\Program Files", - r"C:\Program Files (x86)", - str(Path(localdir) / "7-Zip"), - ): - for subdirname in (".", "App"): - exe = str(Path(dirname) / subdirname / "7-Zip" / "7z.exe") - if Path(exe).is_file(): - return exe - else: - raise RuntimeError("7ZIP is not installed on this computer.") + for dirname in ( + r"C:\Program Files", + r"C:\Program Files (x86)", + str(Path(localdir) / "7-Zip"), + ): + for subdirname in (".", "App"): + exe = str(Path(dirname) / subdirname / "7-Zip" / "7z.exe") + if Path(exe).is_file(): + return exe + raise RuntimeError("7ZIP is not installed on this computer.") def replace_in_7zip_file(fname, data): From ccd04f50671e141b67016e18ac56e135a1f3ecbc Mon Sep 17 00:00:00 2001 From: stonebig Date: Tue, 24 Sep 2024 20:08:37 +0200 Subject: [PATCH 028/305] papercut without change --- make.py | 57 ++++++++++++++++++--------------------------------------- 1 file changed, 18 insertions(+), 39 deletions(-) diff --git a/make.py b/make.py index 07daa48b..d882b557 100644 --- a/make.py +++ b/make.py @@ -7,7 +7,6 @@ """ WinPython build script - Created on Sun Aug 12 11:17:50 2012 """ @@ -22,7 +21,6 @@ from winpython import wppm, utils import diff - CHANGELOGS_DIR = str(Path(__file__).parent / "changelogs") assert Path(CHANGELOGS_DIR).is_dir() @@ -645,7 +643,6 @@ def _create_batch_scripts_initial(self): rem force default pyqt5 kit for Spyder if PyQt5 module is there if exist "%WINPYDIR%\Lib\site-packages\PyQt5\__init__.py" set QT_API=pyqt5 - """, do_changes=changes, ) @@ -653,9 +650,7 @@ def _create_batch_scripts_initial(self): self.create_batch_script( "WinPython_PS_Prompt.ps1", r""" -############################### ### WinPython_PS_Prompt.ps1 ### -############################### $0 = $myInvocation.MyCommand.Definition $dp0 = [System.IO.Path]::GetDirectoryName($0) # $env:PYTHONUTF8 = 1 would create issues in "movable" patching @@ -682,7 +677,6 @@ def _create_batch_scripts_initial(self): $env:PYTHON = "%WINPYDIR%\python.exe" $env:PYTHONPATHz = "%WINPYDIR%;%WINPYDIR%\Lib;%WINPYDIR%\DLLs" - $env:WINPYVER = '""" + self.winpyver + r"""' @@ -701,7 +695,6 @@ def _create_batch_scripts_initial(self): if ($env:WINPYARCH.subString($env:WINPYARCH.length-5, 5) -eq 'amd64') { $env:WINPYARCH = 'WIN-AMD64' } - if (-not $env:PATH.ToLower().Contains(";"+ $env:WINPYDIR.ToLower()+ ";")) { $env:PATH = """ + '"' @@ -714,11 +707,10 @@ def _create_batch_scripts_initial(self): # PyQt5 qt.conf creation and winpython.ini creation done via Winpythonini.py (called per env_for_icons.bat for now) # Start-Process -FilePath $env:PYTHON -ArgumentList ($env:WINPYDIRBASE + '\scripts\WinPythonIni.py') - } -############################### + ### Set-WindowSize -############################### + Function Set-WindowSize { Param([int]$x=$host.ui.rawui.windowsize.width, [int]$y=$host.ui.rawui.windowsize.heigth, @@ -735,7 +727,6 @@ def _create_batch_scripts_initial(self): ### Colorize to distinguish $host.ui.RawUI.BackgroundColor = "Black" $host.ui.RawUI.ForegroundColor = "White" - """, do_changes=changes, ) @@ -805,7 +796,7 @@ def _create_batch_scripts_initial(self): self.create_batch_script( "WinPythonIni.py", # Replaces winpython.vbs, and a bit of env.bat r""" -'prepares a dynamic list of variables settings from a .ini file' +# Prepares a dynamic list of variables settings from a .ini file import os import subprocess from pathlib import Path @@ -832,8 +823,6 @@ def _create_batch_scripts_initial(self): #JULIA=%JULIA_HOME%%JULIA_EXE% #JULIA_PKGDIR=%WINPYDIRBASE%\settings\.julia #QT_PLUGIN_PATH=%WINPYDIR%\Lib\site-packages\pyqt5_tools\Qt\plugins - - ''' def get_file(file_name): @@ -1111,8 +1100,6 @@ def _create_batch_scripts(self): "wpcp.bat", r"""@echo off call "%~dp0env_for_icons.bat" -rem cd/D "%WINPYWORKDIR1%" -rem "%WINPYDIR%\python.exe" -m winpython.controlpanel %* if not "%WINPYWORKDIR%"=="%WINPYWORKDIR1%" cd/d %WINPYWORKDIR1% cmd.exe /k "echo wppm & wppm" """, @@ -1154,7 +1141,6 @@ def _create_batch_scripts(self): ) else ( "code.exe" %* )) - """, ) @@ -1250,12 +1236,12 @@ def make( indent=True, ) - # PyPy: get Fullversion from the executable + # get Fullversion from the executable self.python_fullversion = utils.get_python_long_version( self.distribution.target ) - # PyPY: Assert that WinPython version and real python version do match + # Assert that WinPython version and real python version do match self._print( f"Python version{self.python_fullversion.replace('.','')}" + f"\nDistro Name {self.distribution.target}" @@ -1268,13 +1254,10 @@ def make( if remove_existing: if not self.simulation: - # self._add_msvc_files() # replaced per msvc_runtime package self._create_batch_scripts_initial() self._create_batch_scripts() - # always create all launchers (as long as it is not shimmy-based, to see for after) self._create_launchers() - # PyPY must ensure pip - # "pypy3.exe -m ensurepip" + # PyPy must ensure pip via: "pypy3.exe -m ensurepip" utils.python_execmodule("ensurepip", self.distribution.target) self.distribution.patch_standard_packages("pip") @@ -1287,9 +1270,7 @@ def make( self._print(f"piping {' '.join(actions)}") self.distribution.do_pip_action(actions) self.distribution.patch_standard_packages(req) - # no more directory base package install: use requirements.txt - # 2019-05-03 removed self._install_all_other_packages() - print("self.simulation zz", self.simulation) + print("self.simulation:", self.simulation) if not self.simulation: self._copy_dev_tools() self._copy_dev_docs() @@ -1313,8 +1294,7 @@ def make( self._print_done() # Writing package index self._print("Writing package index") - # winpyver2 = need the version without build part - # but with self.distribution.architecture + # winpyver2 = the version without build part but with self.distribution.architecture self.winpyver2 = f"{self.python_fullversion}.{self.build_number}" fname = str( Path(self.winpydir).parent @@ -1344,17 +1324,16 @@ def make( self._print_done() -def rebuild_winpython(basedir, targetdir, architecture=64, verbose=False): +def rebuild_winpython(codedir, targetdir, architecture=64, verbose=False): """Rebuild winpython package from source""" - basedir = basedir - packdir = targetdir - for name in os.listdir(packdir): + + for name in os.listdir(targetdir): if name.startswith("winpython-") and name.endswith((".exe", ".whl", ".gz")): - os.remove(str(Path(packdir) / name)) + os.remove(str(Path(targetdir) / name)) # utils.build_wininst is replaced per flit 2023-02-27 utils.buildflit_wininst( - str(Path(__file__).resolve().parent), - copy_to=packdir, + codedir, + copy_to=targetdir, verbose=verbose, ) @@ -1420,7 +1399,7 @@ def make_all( # Rebuild Winpython in this wheel dir rebuild_winpython( - basedir=basedir, + codedir=str(Path(__file__).resolve().parent), # winpython source dir targetdir=wheeldir, architecture=architecture, ) @@ -1490,11 +1469,11 @@ def make_all( # ,find_links=osp.join(basedir, 'packages.srcreq')) if str(create_installer).lower() != "false" and not simulation: if "7zip" in str(create_installer).lower(): - dist.create_installer_7zip(".exe") # 7-zip (no licence splash screen) + dist.create_installer_7zip(".exe") if ".7z" in str(create_installer).lower(): - dist.create_installer_7zip(".7z") # 7-zip (no licence splash screen) + dist.create_installer_7zip(".7z") if ".zip" in str(create_installer).lower(): - dist.create_installer_7zip(".zip") # 7-zip (no licence splash screen) + dist.create_installer_7zip(".zip") return dist From 8127aa092fa1e09032197d8ad8f18802deae36e6 Mon Sep 17 00:00:00 2001 From: firai Date: Wed, 30 Oct 2024 01:45:09 +0800 Subject: [PATCH 029/305] `patch_shebang_line()` match double quote after `python.exe`, outside of capture group --- winpython/utils.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/winpython/utils.py b/winpython/utils.py index dcfd821f..d78f4d5c 100644 --- a/winpython/utils.py +++ b/winpython/utils.py @@ -369,15 +369,15 @@ def patch_shebang_line( executable = sys.executable if sys.version_info[0] == 2: shebang_line = re.compile( - r"(#!.*pythonw?\.exe)" + r"(#!.*pythonw?\.exe)\"?" ) # Python2.7 else: shebang_line = re.compile( - b"(#!.*pythonw?\.exe)" + b"(#!.*pythonw?\.exe)\"?" ) # Python3+ if 'pypy3' in sys.executable: shebang_line = re.compile( - b"(#!.*pypy3w?\.exe)" + b"(#!.*pypy3w?\.exe)\"?" ) # Pypy3+ target_dir = target_dir.encode('utf-8') From f42184a87f0852f2fd19decab6582aa280aadc90 Mon Sep 17 00:00:00 2001 From: stonebig Date: Tue, 24 Dec 2024 18:14:28 +0100 Subject: [PATCH 030/305] revert to NSIS launcher and normalize to /python/python.exe --- generate_a_winpython_distro.bat | 22 ++-- make.py | 225 +++++++++++++++++++++++++++++++- winpython/__init__.py | 2 +- 3 files changed, 231 insertions(+), 18 deletions(-) diff --git a/generate_a_winpython_distro.bat b/generate_a_winpython_distro.bat index 89cc2720..c2af1bcb 100644 --- a/generate_a_winpython_distro.bat +++ b/generate_a_winpython_distro.bat @@ -25,9 +25,9 @@ rem 2.8 post-build (if specific workarounds) rem 2.9 archive success rem 3.0 Generate Changelog and binaries -rem "my_release_level" is optionaly set per the calling program +rem "my_release_level" is optionaly set per the calling program ********************************************* rem set my_release_level= -if "%my_release_level%"=="" set my_release_level= +if "%my_release_level%"=="" set my_release_level=b1 rem "my_create_installer" is optionaly set per the calling program if "%my_create_installer%"=="" set my_create_installer=True @@ -85,13 +85,13 @@ if %my_python_target%==311 ( ) if %my_python_target%==312 ( - set my_python_target_release=3126 - set my_release=1 + set my_python_target_release=3128 + set my_release=0 ) if %my_python_target%==313 ( - set my_python_target_release=3130 - set my_release=2 + set my_python_target_release=3131 + set my_release=0 ) @@ -230,15 +230,15 @@ set echo ---------------------------------------- -echo 2.3 (%date% %time%) add mandatory packages for build 'msvc_runtime'.. still necessary ? +echo 2.3 (%date% %time%) add mandatory packages for build 'msvc_runtime'.. still necessary ? 2024-12-22 dropped echo ---------------------------------------- echo ---------------------------------------- >>%my_archive_log% -echo 2.3 (%date% %time%) add mandatory packages for build 'msvc_runtime'.. still necessary ?>>%my_archive_log% +echo 2.3 (%date% %time%) add mandatory packages for build 'msvc_runtime'.. still necessary ? 2024-12-22 dropped>>%my_archive_log% echo ---------------------------------------- >>%my_archive_log% -echo python -m pip install msvc_runtime --pre --no-index --trusted-host=None --find-links=%my_find_links% --upgrade -echo python -m pip install msvc_runtime --pre --no-index --trusted-host=None --find-links=%my_find_links% --upgrade>>%my_archive_log% -python -m pip install msvc_runtime --pre --no-index --trusted-host=None --find-links=%my_find_links% --upgrade +rem echo python -m pip install msvc_runtime --pre --no-index --trusted-host=None --find-links=%my_find_links% --upgrade +rem echo python -m pip install msvc_runtime --pre --no-index --trusted-host=None --find-links=%my_find_links% --upgrade>>%my_archive_log% +rem python -m pip install msvc_runtime --pre --no-index --trusted-host=None --find-links=%my_find_links% --upgrade echo ---------------------------------------- diff --git a/make.py b/make.py index d882b557..ad0a61b4 100644 --- a/make.py +++ b/make.py @@ -24,6 +24,38 @@ CHANGELOGS_DIR = str(Path(__file__).parent / "changelogs") assert Path(CHANGELOGS_DIR).is_dir() +def get_drives(): + """ + This function retrieves a list of existing drives on a Windows system. + + Returns: + list: A list of drive letters (e.g., ['C:', 'D:']) + """ + if hasattr(os, 'listdrives'): # For Python 3.12 and above + return os.listdrives() + else: + drives = [f"{d}:\\" for d in os.environ.get('HOMEDRIVE', '').split("\\") if d] + return drives + + +def get_nsis_exe(): + """Return NSIS executable""" + localdir = str(Path(sys.prefix).parent.parent) + for drive in get_drives(): + for dirname in ( + r"C:\Program Files", + r"C:\Program Files (x86)", + drive + r"PortableApps\NSISPortableANSI", + drive + r"PortableApps\NSISPortable", + str(Path(localdir) / "NSISPortableANSI"), + str(Path(localdir) / "NSISPortable"), + ): + for subdirname in (".", "App"): + exe = str(Path(dirname) / subdirname / "NSIS" / "makensis.exe") + if Path(exe).is_file(): + return exe + else: + raise RuntimeError("NSIS is not installed on this computer.") def get_7zip_exe(): """Return 7zip executable""" @@ -39,6 +71,25 @@ def get_7zip_exe(): return exe raise RuntimeError("7ZIP is not installed on this computer.") +def replace_in_nsis_file(fname, data): + """Replace text in line starting with *start*, from this position: + data is a list of (start, text) tuples""" + fd = open(fname, "U") + lines = fd.readlines() + fd.close() + for idx, line in enumerate(lines): + for start, text in data: + if start not in ( + "Icon", + "OutFile", + ) and not start.startswith("!"): + start = "!define " + start + if line.startswith(start + " "): + lines[idx] = line[: len(start) + 1] + f'"{text}"' + "\n" + fd = open(fname, "w") + fd.writelines(lines) + print("iss for ", fname, "is", lines) + fd.close() def replace_in_7zip_file(fname, data): """Replace text in line starting with *start*, from this position: @@ -78,6 +129,33 @@ def build_shimmy_launcher(launcher_name, command, icon_path, mkshim_program='mks print(f"Building .exe launcher with {mkshim_program}:", mkshim_command) subprocess.run(mkshim_command, shell=True) +def build_nsis(srcname, dstname, data): + """Build NSIS script""" + NSIS_EXE = get_nsis_exe() # NSIS Compiler + portable_dir = str(Path(__file__).resolve().parent / "portable") + shutil.copy(str(Path(portable_dir) / srcname), dstname) + data = [ + ( + "!addincludedir", + str(Path(portable_dir) / "include"), + ) + ] + list(data) + replace_in_nsis_file(dstname, data) + try: + retcode = subprocess.call( + f'"{NSIS_EXE}" -V2 "{dstname}"', + shell=True, + stdout=sys.stderr, + ) + if retcode < 0: + print( + "Child was terminated by signal", + -retcode, + file=sys.stderr, + ) + except OSError as e: + print("Execution failed:", e, file=sys.stderr) + os.remove(dstname) def build_7zip(srcname, dstname, data): """7-Zip Setup Script""" @@ -159,6 +237,7 @@ def __init__( r"python-([0-9\.rcba]*)((\.|\-)amd64)?\.(zip|zip)" ) self.python_name = Path(self.python_fname).name[:-4] + self.python_namedir ="python" @property def package_index_wiki(self): @@ -258,7 +337,10 @@ def winpyver(self): @property def python_dir(self): """Return Python dirname (full path) of the target distribution""" - return str(Path(self.winpydir) / self.python_name) # python.exe path + if (Path(self.winpydir) / self.python_namedir).is_dir(): # 2024-12-22 + return str(Path(self.winpydir) / self.python_namedir) # /python path + else: + return str(Path(self.winpydir) / self.python_name) # python.exe path @property def winpy_arch(self): @@ -359,8 +441,46 @@ def create_launcher_shimmy( command = "${WINPYDIR}\python.exe" #not used iconlauncherfullname= str(Path(self.winpydir) / name) true_command = command.replace(r"$SYSDIR\cmd.exe","cmd.exe")+ " " + args - build_shimmy_launcher(iconlauncherfullname, true_command, icon_fname, mkshim_program=mkshim_program, workdir=workdir) - + # build_shimmy_launcher(iconlauncherfullname, true_command, icon_fname, mkshim_program=mkshim_program, workdir=workdir) + + def create_launcher( + self, + name, + icon, + command=None, + args=None, + workdir=r"$EXEDIR\scripts", + launcher="launcher_basic.nsi", + ): + """Create exe launcher with NSIS""" + assert name.endswith(".exe") + portable_dir = str(Path(__file__).resolve().parent / "portable") + icon_fname = str(Path(portable_dir) / "icons" / icon) + assert Path(icon_fname).is_file() + + # Customizing NSIS script + if command is None: + if args is not None and ".pyw" in args: + command = "${WINPYDIR}\pythonw.exe" + else: + command = "${WINPYDIR}\python.exe" + if args is None: + args = "" + if workdir is None: + workdir = "" + fname = str(Path(self.winpydir) / (Path(name).stem + ".nsi")) + + data = [ + ("WINPYDIR", f"$EXEDIR\{self.python_namedir}"), #2024-12-22 + ("WINPYVER", self.winpyver), + ("COMMAND", command), + ("PARAMETERS", args), + ("WORKDIR", workdir), + ("Icon", icon_fname), + ("OutFile", name), + ] + + build_nsis(launcher, fname, data) def create_python_batch( self, @@ -445,6 +565,9 @@ def _extract_python(self): targetdir=self.python_dir + r"\..", ) self._print_done() + # relocate to /python + if Path(self.python_namedir) != Path(self.winpydir) / self.python_namedir: #2024-12-22 to /python + os.rename(Path(self.python_dir), Path(self.winpydir) / self.python_namedir) def _copy_dev_tools(self): """Copy dev tools""" @@ -498,6 +621,13 @@ def _create_launchers(self): workdir=r".\scripts" ) + self.create_launcher( + "WinPython Command Prompt.exe", + "cmd.ico", + command="$SYSDIR\cmd.exe", + args=r"/k cmd.bat", + ) + self.create_launcher_shimmy( "WinPython Powershell Prompt.exe", "powershell.ico", @@ -505,6 +635,13 @@ def _create_launchers(self): args=r"start-process -WindowStyle Hidden -FilePath ([dollar]ENV:WINPYDIRICONS + '\scripts\cmd_ps.bat')", ) + self.create_launcher( + "WinPython Powershell Prompt.exe", + "powershell.ico", + command="wscript.exe", + args=r"Noshell.vbs cmd_ps.bat", + ) + #self.create_launcher_shimmy( # "WinPython Terminal.exe", # "terminal.ico", @@ -520,6 +657,13 @@ def _create_launchers(self): workdir=r".\scripts" ) + self.create_launcher( + "WinPython Interpreter.exe", + "python.ico", + command="$SYSDIR\cmd.exe", + args=r"/k winpython.bat", + ) + self.create_launcher_shimmy( "IDLE (Python GUI).exe", "python.ico", @@ -527,6 +671,13 @@ def _create_launchers(self): args=r"start-process -WindowStyle Hidden -FilePath ([dollar]ENV:WINPYDIRICONS + '\scripts\winidle.bat')", ) + self.create_launcher( + "IDLE (Python GUI).exe", + "python.ico", + command="wscript.exe", + args=r"Noshell.vbs winidle.bat", + ) + self.create_launcher_shimmy( "Spyder.exe", "spyder.ico", @@ -534,6 +685,13 @@ def _create_launchers(self): args=r"start-process -WindowStyle Hidden -FilePath ([dollar]ENV:WINPYDIRICONS + '\scripts\winspyder.bat')", ) + self.create_launcher( + "Spyder.exe", + "spyder.ico", + command="wscript.exe", + args=r"Noshell.vbs winspyder.bat", + ) + self.create_launcher_shimmy( "Spyder reset.exe", "spyder_reset.ico", @@ -542,6 +700,13 @@ def _create_launchers(self): #args=r"start-process -WindowStyle Hidden './scripts/spyder_reset.bat", ) + self.create_launcher( + "Spyder reset.exe", + "spyder_reset.ico", + command="wscript.exe", + args=r"Noshell.vbs spyder_reset.bat", + ) + self.create_launcher_shimmy( "WinPython Control Panel.exe", "winpython.ico", @@ -550,6 +715,13 @@ def _create_launchers(self): workdir=r".\scripts" ) + self.create_launcher( + "WinPython Control Panel.exe", + "winpython.ico", + command="$SYSDIR\cmd.exe", + args=r"/k wpcp.bat", + ) + # Jupyter launchers # this one needs a shell to kill fantom processes @@ -561,6 +733,14 @@ def _create_launchers(self): workdir=r".\scripts" ) + self.create_launcher( + "Jupyter Notebook.exe", + "jupyter.ico", + command="$SYSDIR\cmd.exe", + args=r"/k winipython_notebook.bat", # like VSCode + Rise way + # args=r'/k winjupyter_nbclassic.bat', # Jupyterlab in classic look + ) + self.create_launcher_shimmy( "Jupyter Lab.exe", "jupyter.ico", @@ -569,6 +749,13 @@ def _create_launchers(self): workdir=r".\scripts" ) + self.create_launcher( + "Jupyter Lab.exe", + "jupyter.ico", + command="$SYSDIR\cmd.exe", + args=r"/k winjupyter_lab.bat", + ) + self.create_launcher_shimmy( "VS Code.exe", "code.ico", @@ -577,6 +764,14 @@ def _create_launchers(self): workdir=r".\scripts" ) + # VSCode launcher + self.create_launcher( + "VS Code.exe", + "code.ico", + command="wscript.exe", + args=r"Noshell.vbs winvscode.bat", + ) + self._print_done() def _create_batch_scripts_initial(self): @@ -611,7 +806,7 @@ def _create_batch_scripts_initial(self): set WINPYDIR=%WINPYDIRBASE%""" + "\\" - + self.python_name + + self.python_namedir + r""" rem 2019-08-25 pyjulia needs absolutely a variable PYTHON=%WINPYDIR%python.exe set PYTHON=%WINPYDIR%\python.exe @@ -662,7 +857,7 @@ def _create_batch_scripts_initial(self): # avoid double_init (will only resize screen) if (-not ($env:WINPYDIR -eq [System.IO.Path]::GetFullPath( $env:WINPYDIRBASE+""" + '"\\' - + self.python_name + + self.python_namedir + '"' + r""")) ) { @@ -670,7 +865,7 @@ def _create_batch_scripts_initial(self): $env:WINPYDIR = $env:WINPYDIRBASE+""" + '"' + "\\" - + self.python_name + + self.python_namedir + '"' + r""" # 2019-08-25 pyjulia needs absolutely a variable PYTHON=%WINPYDIR%python.exe @@ -793,6 +988,24 @@ def _create_batch_scripts_initial(self): do_changes=changes, ) + self.create_batch_script( + "Noshell.vbs", + r""" +'from http://superuser.com/questions/140047/how-to-run-a-batch-file-without-launching-a-command-window/390129 +If WScript.Arguments.Count >= 1 Then + ReDim arr(WScript.Arguments.Count-1) + For i = 0 To WScript.Arguments.Count-1 + Arg = WScript.Arguments(i) + If InStr(Arg, " ") > 0 or InStr(Arg, "&") > 0 Then Arg = chr(34) & Arg & chr(34) + arr(i) = Arg + Next + + RunCmd = Join(arr) + CreateObject("Wscript.Shell").Run RunCmd, 0 , True +End If + """, + ) + self.create_batch_script( "WinPythonIni.py", # Replaces winpython.vbs, and a bit of env.bat r""" diff --git a/winpython/__init__.py b/winpython/__init__.py index 1d5bbe40..f359470b 100644 --- a/winpython/__init__.py +++ b/winpython/__init__.py @@ -28,6 +28,6 @@ OTHER DEALINGS IN THE SOFTWARE. """ -__version__ = '11.1.20240922' +__version__ = '11.2.20241222' __license__ = __doc__ __project_url__ = 'http://winpython.github.io/' From d69d56a4c29008c8ac507a45ba9a7b14f1226e29 Mon Sep 17 00:00:00 2001 From: stonebig Date: Thu, 26 Dec 2024 11:55:11 +0100 Subject: [PATCH 031/305] remove shimmy launchers --- make.py | 91 ++++--------------------------------------- winpython/__init__.py | 2 +- 2 files changed, 8 insertions(+), 85 deletions(-) diff --git a/make.py b/make.py index ad0a61b4..9eb64710 100644 --- a/make.py +++ b/make.py @@ -613,14 +613,7 @@ def _create_launchers(self): self._print("Creating launchers") - self.create_launcher_shimmy( - "WinPython Command Prompt.exe", - "cmd.ico", - command=".\\cmd.bat", - args=r"", - workdir=r".\scripts" - ) - + self.create_launcher( "WinPython Command Prompt.exe", "cmd.ico", @@ -628,12 +621,12 @@ def _create_launchers(self): args=r"/k cmd.bat", ) - self.create_launcher_shimmy( - "WinPython Powershell Prompt.exe", - "powershell.ico", - command="Powershell.exe", - args=r"start-process -WindowStyle Hidden -FilePath ([dollar]ENV:WINPYDIRICONS + '\scripts\cmd_ps.bat')", - ) + #self.create_launcher_shimmy( + # "WinPython Powershell Prompt.exe", + # "powershell.ico", + # command="Powershell.exe", + # args=r"start-process -WindowStyle Hidden -FilePath ([dollar]ENV:WINPYDIRICONS + '\scripts\cmd_ps.bat')", + #) self.create_launcher( "WinPython Powershell Prompt.exe", @@ -642,21 +635,6 @@ def _create_launchers(self): args=r"Noshell.vbs cmd_ps.bat", ) - #self.create_launcher_shimmy( - # "WinPython Terminal.exe", - # "terminal.ico", - # command="Powershell.exe", - # args=r"start-process -WindowStyle Hidden './scripts/WinPython_Terminal.bat", - #) - - self.create_launcher_shimmy( - "WinPython Interpreter.exe", - "python.ico", - command=".\\winpython.bat", - args=r"", - workdir=r".\scripts" - ) - self.create_launcher( "WinPython Interpreter.exe", "python.ico", @@ -664,13 +642,6 @@ def _create_launchers(self): args=r"/k winpython.bat", ) - self.create_launcher_shimmy( - "IDLE (Python GUI).exe", - "python.ico", - command="Powershell.exe", - args=r"start-process -WindowStyle Hidden -FilePath ([dollar]ENV:WINPYDIRICONS + '\scripts\winidle.bat')", - ) - self.create_launcher( "IDLE (Python GUI).exe", "python.ico", @@ -678,13 +649,6 @@ def _create_launchers(self): args=r"Noshell.vbs winidle.bat", ) - self.create_launcher_shimmy( - "Spyder.exe", - "spyder.ico", - command="Powershell.exe", - args=r"start-process -WindowStyle Hidden -FilePath ([dollar]ENV:WINPYDIRICONS + '\scripts\winspyder.bat')", - ) - self.create_launcher( "Spyder.exe", "spyder.ico", @@ -692,14 +656,6 @@ def _create_launchers(self): args=r"Noshell.vbs winspyder.bat", ) - self.create_launcher_shimmy( - "Spyder reset.exe", - "spyder_reset.ico", - command="Powershell.exe", - args=r"start-process -WindowStyle Hidden -FilePath ([dollar]ENV:WINPYDIRICONS + '\scripts\spyder_reset.bat')", - #args=r"start-process -WindowStyle Hidden './scripts/spyder_reset.bat", - ) - self.create_launcher( "Spyder reset.exe", "spyder_reset.ico", @@ -707,14 +663,6 @@ def _create_launchers(self): args=r"Noshell.vbs spyder_reset.bat", ) - self.create_launcher_shimmy( - "WinPython Control Panel.exe", - "winpython.ico", - command=".\\wpcp.bat", - args=r"", - workdir=r".\scripts" - ) - self.create_launcher( "WinPython Control Panel.exe", "winpython.ico", @@ -724,15 +672,6 @@ def _create_launchers(self): # Jupyter launchers - # this one needs a shell to kill fantom processes - self.create_launcher_shimmy( - "Jupyter Notebook.exe", - "jupyter.ico", - command="winipython_notebook.bat", - args=r"", - workdir=r".\scripts" - ) - self.create_launcher( "Jupyter Notebook.exe", "jupyter.ico", @@ -741,14 +680,6 @@ def _create_launchers(self): # args=r'/k winjupyter_nbclassic.bat', # Jupyterlab in classic look ) - self.create_launcher_shimmy( - "Jupyter Lab.exe", - "jupyter.ico", - command="winjupyter_lab.bat", - args=r"", - workdir=r".\scripts" - ) - self.create_launcher( "Jupyter Lab.exe", "jupyter.ico", @@ -756,14 +687,6 @@ def _create_launchers(self): args=r"/k winjupyter_lab.bat", ) - self.create_launcher_shimmy( - "VS Code.exe", - "code.ico", - command="winvscode.bat", - args=r"", - workdir=r".\scripts" - ) - # VSCode launcher self.create_launcher( "VS Code.exe", diff --git a/winpython/__init__.py b/winpython/__init__.py index f359470b..35dd1cdf 100644 --- a/winpython/__init__.py +++ b/winpython/__init__.py @@ -28,6 +28,6 @@ OTHER DEALINGS IN THE SOFTWARE. """ -__version__ = '11.2.20241222' +__version__ = '11.2.20241226' __license__ = __doc__ __project_url__ = 'http://winpython.github.io/' From 00ec29697ac1491a46a42e52b0998ac1d6fb6033 Mon Sep 17 00:00:00 2001 From: firai Date: Thu, 2 Jan 2025 11:13:29 +0800 Subject: [PATCH 032/305] Fix regex pattern syntax warning --- winpython/utils.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/winpython/utils.py b/winpython/utils.py index d78f4d5c..9d5701fd 100644 --- a/winpython/utils.py +++ b/winpython/utils.py @@ -369,15 +369,15 @@ def patch_shebang_line( executable = sys.executable if sys.version_info[0] == 2: shebang_line = re.compile( - r"(#!.*pythonw?\.exe)\"?" + r"""(#!.*pythonw?\.exe)"?""" ) # Python2.7 else: shebang_line = re.compile( - b"(#!.*pythonw?\.exe)\"?" + rb"""(#!.*pythonw?\.exe)"?""" ) # Python3+ if 'pypy3' in sys.executable: shebang_line = re.compile( - b"(#!.*pypy3w?\.exe)\"?" + rb"""(#!.*pypy3w?\.exe)"?""" ) # Pypy3+ target_dir = target_dir.encode('utf-8') From 9bfb1059dd24f2c4c8db3abf1275a0354e701ea4 Mon Sep 17 00:00:00 2001 From: stonebig Date: Fri, 3 Jan 2025 12:53:06 +0100 Subject: [PATCH 033/305] post rc1fix --- portable/launcher_basic.nsi | 44 +++++++++++++++++++++++++++++++++++++ winpython/__init__.py | 2 +- winpython/utils.py | 14 ++++++------ 3 files changed, 52 insertions(+), 8 deletions(-) create mode 100644 portable/launcher_basic.nsi diff --git a/portable/launcher_basic.nsi b/portable/launcher_basic.nsi new file mode 100644 index 00000000..cb1670b3 --- /dev/null +++ b/portable/launcher_basic.nsi @@ -0,0 +1,44 @@ +/* WinPython launcher template script +Copyright 2012 Pierre Raybaut +Licensed under the terms of the MIT License +(see winpython/__init__.py for details) +*/ +;================================================================ +; These lines are automatically filled when winpython/make.py creates launchers: +!addincludedir "" +!define COMMAND "" +!define PARAMETERS "" +!define WORKDIR "" +Icon "" +OutFile "" +;================================================================ +# Standard NSIS plugins +!include "WordFunc.nsh" +!include "FileFunc.nsh" + +SilentInstall silent +AutoCloseWindow true +ShowInstDetails nevershow +RequestExecutionLevel user + +Section "" +Call Execute +SectionEnd + +Function Execute +;Set working Directory =========================== +StrCmp ${WORKDIR} "" 0 workdir +System::Call "kernel32::GetCurrentDirectory(i ${NSIS_MAX_STRLEN}, t .r0)" +SetOutPath $0 +Goto end_workdir +workdir: +SetOutPath "${WORKDIR}" +end_workdir: +;Get Command line parameters ===================== +${GetParameters} $R1 +StrCmp "${PARAMETERS}" "" end_param 0 +StrCpy $R1 "${PARAMETERS} $R1" +end_param: +;===== Execution ================================= +Exec '"${COMMAND}" $R1' +FunctionEnd \ No newline at end of file diff --git a/winpython/__init__.py b/winpython/__init__.py index 35dd1cdf..31747b0c 100644 --- a/winpython/__init__.py +++ b/winpython/__init__.py @@ -28,6 +28,6 @@ OTHER DEALINGS IN THE SOFTWARE. """ -__version__ = '11.2.20241226' +__version__ = '11.2.20241228' __license__ = __doc__ __project_url__ = 'http://winpython.github.io/' diff --git a/winpython/utils.py b/winpython/utils.py index d78f4d5c..8aad5998 100644 --- a/winpython/utils.py +++ b/winpython/utils.py @@ -268,7 +268,7 @@ def exec_run_cmd(args, path=None): def get_r_version(path): """Return version of the R installed in *path*""" return ( - exec_shell_cmd('dir ..\README.R*', path) + exec_shell_cmd(r'dir ..\README.R*', path) .splitlines()[-3] .split("-")[-1] ) @@ -373,11 +373,11 @@ def patch_shebang_line( ) # Python2.7 else: shebang_line = re.compile( - b"(#!.*pythonw?\.exe)\"?" + rb"(#!.*pythonw?\.exe)\"?" ) # Python3+ if 'pypy3' in sys.executable: shebang_line = re.compile( - b"(#!.*pypy3w?\.exe)\"?" + rb"(#!.*pypy3w?\.exe)\"?" ) # Pypy3+ target_dir = target_dir.encode('utf-8') @@ -420,15 +420,15 @@ def patch_shebang_line_py( # WinPython doesn't break running executable files. return if to_movable: - exec_path = '#!.\python.exe' + exec_path = r'#!.\python.exe' if 'pypy3' in sys.executable: # PyPy ! - exec_path = '#!.\pypy3.exe' + exec_path = r'#!.\pypy3.exe' else: exec_path = '#!' + sys.executable for line in fileinput.input(fname, inplace=True): - if re.match('^#\!.*python\.exe$', line) is not None: + if re.match(r'^#\!.*python\.exe$', line) is not None: print(exec_path) - elif re.match('^#\!.*pypy3\.exe$', line) is not None:# PyPy ! + elif re.match(r'^#\!.*pypy3\.exe$', line) is not None:# PyPy ! print(exec_path) else: print(line, end='') From 6ba8293fabd79ea21ced616d6ae98928071ba89b Mon Sep 17 00:00:00 2001 From: stonebig Date: Fri, 3 Jan 2025 13:19:00 +0100 Subject: [PATCH 034/305] WinPython 2024-05 final same as rc --- changelogs/WinPythondot-64bit-3.12.8.0.md | 28 + .../WinPythondot-64bit-3.12.8.0_History.md | 23 + changelogs/WinPythondot-64bit-3.13.1.0.md | 28 + .../WinPythondot-64bit-3.13.1.0_History.md | 24 + changelogs/WinPythonslim-64bit-3.12.8.0.md | 542 ++++++++++++++++++ .../WinPythonslim-64bit-3.12.8.0_History.md | 154 +++++ changelogs/WinPythonslim-64bit-3.13.1.0.md | 504 ++++++++++++++++ .../WinPythonslim-64bit-3.13.1.0_History.md | 8 + changelogs/md5_sha1.txt | 15 + 9 files changed, 1326 insertions(+) create mode 100644 changelogs/WinPythondot-64bit-3.12.8.0.md create mode 100644 changelogs/WinPythondot-64bit-3.12.8.0_History.md create mode 100644 changelogs/WinPythondot-64bit-3.13.1.0.md create mode 100644 changelogs/WinPythondot-64bit-3.13.1.0_History.md create mode 100644 changelogs/WinPythonslim-64bit-3.12.8.0.md create mode 100644 changelogs/WinPythonslim-64bit-3.12.8.0_History.md create mode 100644 changelogs/WinPythonslim-64bit-3.13.1.0.md create mode 100644 changelogs/WinPythonslim-64bit-3.13.1.0_History.md diff --git a/changelogs/WinPythondot-64bit-3.12.8.0.md b/changelogs/WinPythondot-64bit-3.12.8.0.md new file mode 100644 index 00000000..6546f300 --- /dev/null +++ b/changelogs/WinPythondot-64bit-3.12.8.0.md @@ -0,0 +1,28 @@ +## WinPython 3.12.8.0dot + +The following packages are included in WinPython-64bit v3.12.8.0dot . + +

+ +### Tools + +Name | Version | Description +-----|---------|------------ + + +### Python packages + +Name | Version | Description +-----|---------|------------ +[Python](http://www.python.org/) | 3.12.8 | Python programming language with standard library +[build](https://pypi.org/project/build) | 1.2.2.post1 | A simple, correct Python build frontend +[colorama](https://pypi.org/project/colorama) | 0.4.6 | Cross-platform colored terminal text. +[packaging](https://pypi.org/project/packaging) | 24.2 | Core utilities for Python packages +[pip](https://pypi.org/project/pip) | 24.3.1 | The PyPA recommended tool for installing Python packages. +[pyproject_hooks](https://pypi.org/project/pyproject_hooks) | 1.1.0 | Wrappers to call pyproject.toml-based build backend hooks. +[setuptools](https://pypi.org/project/setuptools) | 75.6.0 | Easily download, build, install, upgrade, and uninstall Python packages +[sqlite_bro](https://pypi.org/project/sqlite_bro) | 0.13.1 | a graphic SQLite Client in 1 Python file +[wheel](https://pypi.org/project/wheel) | 0.44.0 | A built-package format for Python +[winpython](https://pypi.org/project/winpython) | 11.2.20241228 | WinPython distribution tools, including WPPM + +
diff --git a/changelogs/WinPythondot-64bit-3.12.8.0_History.md b/changelogs/WinPythondot-64bit-3.12.8.0_History.md new file mode 100644 index 00000000..9a86e325 --- /dev/null +++ b/changelogs/WinPythondot-64bit-3.12.8.0_History.md @@ -0,0 +1,23 @@ +## History of changes for WinPython-64bit 3.12.8.0dot + +The following changes were made to WinPython-64bit distribution since version 3.12.6.0dot. + +
+### Python packages + +Upgraded packages: + + * [build](https://pypi.org/project/build) 1.2.1 → 1.2.2.post1 (A simple, correct Python build frontend) + * [packaging](https://pypi.org/project/packaging) 24.1 → 24.2 (Core utilities for Python packages) + * [pip](https://pypi.org/project/pip) 24.2 → 24.3.1 (The PyPA recommended tool for installing Python packages.) + * [Python](http://www.python.org/) 3.12.6 → 3.12.8 (Python programming language with standard library) + * [setuptools](https://pypi.org/project/setuptools) 72.2.0 → 75.6.0 (Easily download, build, install, upgrade, and uninstall Python packages) + * [winpython](https://pypi.org/project/winpython) 10.7.20240908 → 11.2.20241228 (WinPython distribution tools, including WPPM) + +Removed packages: + + * [msvc_runtime](https://pypi.org/project/msvc_runtime) 14.40.33807 (Install the Microsoft™ Visual C++™ runtime DLLs to the sys.prefix and Scripts directories) + + +
+* * * diff --git a/changelogs/WinPythondot-64bit-3.13.1.0.md b/changelogs/WinPythondot-64bit-3.13.1.0.md new file mode 100644 index 00000000..da971e87 --- /dev/null +++ b/changelogs/WinPythondot-64bit-3.13.1.0.md @@ -0,0 +1,28 @@ +## WinPython 3.13.1.0dot + +The following packages are included in WinPython-64bit v3.13.1.0dot . + +
+ +### Tools + +Name | Version | Description +-----|---------|------------ + + +### Python packages + +Name | Version | Description +-----|---------|------------ +[Python](http://www.python.org/) | 3.13.1 | Python programming language with standard library +[build](https://pypi.org/project/build) | 1.2.2.post1 | A simple, correct Python build frontend +[colorama](https://pypi.org/project/colorama) | 0.4.6 | Cross-platform colored terminal text. +[packaging](https://pypi.org/project/packaging) | 24.2 | Core utilities for Python packages +[pip](https://pypi.org/project/pip) | 24.3.1 | The PyPA recommended tool for installing Python packages. +[pyproject_hooks](https://pypi.org/project/pyproject_hooks) | 1.1.0 | Wrappers to call pyproject.toml-based build backend hooks. +[setuptools](https://pypi.org/project/setuptools) | 75.6.0 | Easily download, build, install, upgrade, and uninstall Python packages +[sqlite_bro](https://pypi.org/project/sqlite_bro) | 0.13.1 | a graphic SQLite Client in 1 Python file +[wheel](https://pypi.org/project/wheel) | 0.44.0 | A built-package format for Python +[winpython](https://pypi.org/project/winpython) | 11.2.20241228 | WinPython distribution tools, including WPPM + +
diff --git a/changelogs/WinPythondot-64bit-3.13.1.0_History.md b/changelogs/WinPythondot-64bit-3.13.1.0_History.md new file mode 100644 index 00000000..a5bdd349 --- /dev/null +++ b/changelogs/WinPythondot-64bit-3.13.1.0_History.md @@ -0,0 +1,24 @@ +## History of changes for WinPython-64bit 3.13.1.0dot + +The following changes were made to WinPython-64bit distribution since version 3.13.0.1dot. + +
+### Python packages + +Upgraded packages: + + * [build](https://pypi.org/project/build) 1.2.1 → 1.2.2.post1 (A simple, correct Python build frontend) + * [packaging](https://pypi.org/project/packaging) 24.1 → 24.2 (Core utilities for Python packages) + * [pip](https://pypi.org/project/pip) 24.2 → 24.3.1 (The PyPA recommended tool for installing Python packages.) + * [Python](http://www.python.org/) 3.13.0 → 3.13.1 (Python programming language with standard library) + * [setuptools](https://pypi.org/project/setuptools) 72.2.0 → 75.6.0 (Easily download, build, install, upgrade, and uninstall Python packages) + * [winpython](https://pypi.org/project/winpython) 10.7.20240908 → 11.2.20241228 (WinPython distribution tools, including WPPM) + +Removed packages: + + * [interpreters_pep_734](https://pypi.org/project/interpreters_pep_734) 0.1.0 (Use this module to try out multiple interpreters and a per-interpreter GIL in Python 3.13+. Do not use this for anything important yet.) + * [msvc_runtime](https://pypi.org/project/msvc_runtime) 14.40.33807 (Install the Microsoft™ Visual C++™ runtime DLLs to the sys.prefix and Scripts directories) + + +
+* * * diff --git a/changelogs/WinPythonslim-64bit-3.12.8.0.md b/changelogs/WinPythonslim-64bit-3.12.8.0.md new file mode 100644 index 00000000..0d5a676a --- /dev/null +++ b/changelogs/WinPythonslim-64bit-3.12.8.0.md @@ -0,0 +1,542 @@ +## WinPython 3.12.8.0slim + +The following packages are included in WinPython-64bit v3.12.8.0slim . + +
+ +### Tools + +Name | Version | Description +-----|---------|------------ +[Pandoc](https://pandoc.org/) | 3.1.9 | a universal document converter + +### Python packages + +Name | Version | Description +-----|---------|------------ +[Python](http://www.python.org/) | 3.12.8 | Python programming language with standard library +[about_time](https://pypi.org/project/about_time) | 4.2.1 | Easily measure timing and throughput of code blocks, with beautiful human friendly representations. +[absl_py](https://pypi.org/project/absl_py) | 2.0.0 | Abseil Python Common Libraries, see https://github.com/abseil/abseil-py. +[adbc_driver_manager](https://pypi.org/project/adbc_driver_manager) | 1.3.0 | A generic entrypoint for ADBC drivers. +[adodbapi](https://pypi.org/project/adodbapi) | 2.6.1.3 | A pure Python package implementing PEP 249 DB-API using Microsoft ADO. +[affine](https://pypi.org/project/affine) | 2.3.1 | Matrices describing affine transformation of the plane. +[aiofiles](https://pypi.org/project/aiofiles) | 23.2.1 | File support for asyncio. +[aiohappyeyeballs](https://pypi.org/project/aiohappyeyeballs) | 2.4.4 | Happy Eyeballs for asyncio +[aiohttp](https://pypi.org/project/aiohttp) | 3.11.11 | Async http client/server framework (asyncio) +[aiosignal](https://pypi.org/project/aiosignal) | 1.3.1 | aiosignal: a list of registered asynchronous callbacks +[aiosqlite](https://pypi.org/project/aiosqlite) | 0.20.0 | asyncio bridge to the standard sqlite3 module +[alabaster](https://pypi.org/project/alabaster) | 0.7.16 | A light, configurable Sphinx theme +[alembic](https://pypi.org/project/alembic) | 1.13.1 | A database migration tool for SQLAlchemy. +[alive_progress](https://pypi.org/project/alive_progress) | 3.1.5 | A new kind of Progress Bar, with real-time throughput, ETA, and very cool animations! +[altair](https://pypi.org/project/altair) | 5.5.0 | Vega-Altair: A declarative statistical visualization library for Python. +[aniso8601](https://pypi.org/project/aniso8601) | 9.0.1 | A library for parsing ISO 8601 strings. +[annotated_types](https://pypi.org/project/annotated_types) | 0.6.0 | Reusable constraint types to use with typing.Annotated +[ansicolors](https://pypi.org/project/ansicolors) | 1.1.8 | ANSI colors for Python +[anthropic](https://pypi.org/project/anthropic) | 0.42.0 | The official Python library for the anthropic API +[anyio](https://pypi.org/project/anyio) | 4.7.0 | High level compatibility layer for multiple asynchronous event loop implementations +[anywidget](https://pypi.org/project/anywidget) | 0.9.12 | custom jupyter widgets made easy +[appdirs](https://pypi.org/project/appdirs) | 1.4.4 | A small Python module for determining appropriate platform-specific dirs, e.g. a "user data dir". +[argon2_cffi](https://pypi.org/project/argon2_cffi) | 23.1.0 | Argon2 for Python +[argon2_cffi_bindings](https://pypi.org/project/argon2_cffi_bindings) | 21.2.0 | Low-level CFFI bindings for Argon2 +[array_api_compat](https://pypi.org/project/array_api_compat) | 1.8 | A wrapper around NumPy and other array libraries to make them compatible with the Array API standard +[arrow](https://pypi.org/project/arrow) | 1.3.0 | Better dates & times for Python +[asgi_csrf](https://pypi.org/project/asgi_csrf) | 0.9 | ASGI middleware for protecting against CSRF attacks +[asgiref](https://pypi.org/project/asgiref) | 3.8.1 | ASGI specs, helper code, and adapters +[asn1crypto](https://pypi.org/project/asn1crypto) | 1.5.1 | Fast ASN.1 parser and serializer with definitions for private keys, public keys, certificates, CRL, OCSP, CMS, PKCS#3, PKCS#7, PKCS#8, PKCS#12, +[asteval](https://pypi.org/project/asteval) | 0.9.31 | Safe, minimalistic evaluator of python expression using ast module +[astroid](https://pypi.org/project/astroid) | 3.1.0 | An abstract syntax tree for Python with inference support. +[astropy](https://pypi.org/project/astropy) | 6.1.6 | Astronomy and astrophysics core library +[astropy_iers_data](https://pypi.org/project/astropy_iers_data) | 0.2024.12.23.0.33.24 | IERS Earth Rotation and Leap Second tables for the astropy core package +[asttokens](https://pypi.org/project/asttokens) | 2.4.1 | Annotate AST trees with source code positions +[async_lru](https://pypi.org/project/async_lru) | 2.0.4 | Simple LRU cache for asyncio +[atomicwrites](https://pypi.org/project/atomicwrites) | 1.4.0 | Atomic file writes. +[attrs](https://pypi.org/project/attrs) | 23.2.0 | Classes Without Boilerplate +[autograd](https://pypi.org/project/autograd) | 1.6.2 | Efficiently computes derivatives of numpy code. +[autopep8](https://pypi.org/project/autopep8) | 2.0.4 | A tool that automatically formats Python code to conform to the PEP 8 style guide +[azure_core](https://pypi.org/project/azure_core) | 1.30.2 | Microsoft Azure Core Library for Python +[azure_cosmos](https://pypi.org/project/azure_cosmos) | 4.7.0 | Microsoft Azure Cosmos Client Library for Python +[azure_identity](https://pypi.org/project/azure_identity) | 1.16.1 | Microsoft Azure Identity Library for Python +[babel](https://pypi.org/project/babel) | 2.16.0 | Internationalization utilities +[baresql](https://pypi.org/project/baresql) | 0.8.0 | playing SQL directly on Python datas +[bcrypt](https://pypi.org/project/bcrypt) | 4.0.1 | Modern password hashing for your software and your servers +[beautifulsoup4](https://pypi.org/project/beautifulsoup4) | 4.12.2 | Screen-scraping library +[binaryornot](https://pypi.org/project/binaryornot) | 0.4.4 | Ultra-lightweight pure Python package to check if a file is binary or text. +[black](https://pypi.org/project/black) | 24.10.0 | The uncompromising code formatter. +[bleach](https://pypi.org/project/bleach) | 6.1.0 | An easy safelist-based HTML-sanitizing tool. +[blinker](https://pypi.org/project/blinker) | 1.7.0 | Fast, simple object-to-object and broadcast signaling +[bokeh](https://pypi.org/project/bokeh) | 3.6.1 | Interactive plots and applications in the browser from Python +[branca](https://pypi.org/project/branca) | 0.8.0 | Generate complex HTML+JS pages with Python +[brotli](https://pypi.org/project/brotli) | 1.1.0 | Python bindings for the Brotli compression library +[build](https://pypi.org/project/build) | 1.2.2.post1 | A simple, correct Python build frontend +[cachelib](https://pypi.org/project/cachelib) | 0.13.0 | A collection of cache libraries in the same API interface. +[cachetools](https://pypi.org/project/cachetools) | 5.4.0 | Extensible memoizing collections and decorators +[cartopy](https://pypi.org/project/cartopy) | 0.23.0 | A Python library for cartographic visualizations with Matplotlib +[certifi](https://pypi.org/project/certifi) | 2024.6.2 | Python package for providing Mozilla's CA Bundle. +[cffi](https://pypi.org/project/cffi) | 1.17.1 | Foreign Function Interface for Python calling C code. +[cftime](https://pypi.org/project/cftime) | 1.6.3 | Time-handling functionality from netcdf4-python +[chardet](https://pypi.org/project/chardet) | 5.2.0 | Universal encoding detector for Python 3 +[charset_normalizer](https://pypi.org/project/charset_normalizer) | 3.4.0 | The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet. +[clarabel](https://pypi.org/project/clarabel) | 0.9.0 | Clarabel Conic Interior Point Solver for Rust / Python +[click](https://pypi.org/project/click) | 8.1.7 | Composable command line interface toolkit +[click_default_group](https://pypi.org/project/click_default_group) | 1.2.4 | click_default_group +[click_plugins](https://pypi.org/project/click_plugins) | 1.1.1 | An extension module for click to enable registering CLI commands via setuptools entry-points. +[cligj](https://pypi.org/project/cligj) | 0.7.2 | Click params for commmand line interfaces to GeoJSON +[cloudpickle](https://pypi.org/project/cloudpickle) | 3.0.0 | Pickler class to extend the standard pickle.Pickler functionality +[clr_loader](https://pypi.org/project/clr_loader) | 0.2.6 | Generic pure Python loader for .NET runtimes +[clrmagic](https://pypi.org/project/clrmagic) | 0.0.1a2 | IPython cell magic to use .NET languages +[cma](https://pypi.org/project/cma) | 3.2.2 | CMA-ES, Covariance Matrix Adaptation Evolution Strategy for non-linear numerical optimization in Python +[colorama](https://pypi.org/project/colorama) | 0.4.6 | Cross-platform colored terminal text. +[colorcet](https://pypi.org/project/colorcet) | 3.1.0 | Collection of perceptually uniform colormaps +[colorlog](https://pypi.org/project/colorlog) | 6.8.2 | Add colours to the output of Python's logging module. +[comm](https://pypi.org/project/comm) | 0.2.2 | Jupyter Python Comm implementation, for usage in ipykernel, xeus-python etc. +[contourpy](https://pypi.org/project/contourpy) | 1.3.1 | Python library for calculating contours of 2D quadrilateral grids +[cookiecutter](https://pypi.org/project/cookiecutter) | 2.6.0 | A command-line utility that creates projects from project templates, e.g +[cryptography](https://pypi.org/project/cryptography) | 41.0.5 | cryptography is a package which provides cryptographic recipes and primitives to Python developers. +[cvxopt](https://pypi.org/project/cvxopt) | 1.3.2 | Convex optimization package +[cvxpy](https://pypi.org/project/cvxpy) | 1.6.0 | A domain-specific language for modeling convex optimization problems in Python. +[cycler](https://pypi.org/project/cycler) | 0.12.1 | Composable style cycles +[cython](https://pypi.org/project/cython) | 3.0.11 | The Cython compiler for writing C extensions in the Python language. +[cytoolz](https://pypi.org/project/cytoolz) | 0.12.3 | Cython implementation of Toolz: High performance functional utilities +[dask](https://pypi.org/project/dask) | 2024.12.1 | Parallel PyData with Task Scheduling +[dask_expr](https://pypi.org/project/dask_expr) | 1.1.21 | High Level Expressions for Dask +[datasette](https://pypi.org/project/datasette) | 0.64.8 | An open source multi-tool for exploring and publishing data +[datasette_graphql](https://pypi.org/project/datasette_graphql) | 2.2 | Datasette plugin providing an automatic GraphQL API for your SQLite databases +[datashader](https://pypi.org/project/datashader) | 0.16.3 | Data visualization toolchain based on aggregating into a grid +[db_py](https://pypi.org/project/db_py) | 0.5.4b1 | a db package that doesn't suck +[deap](https://pypi.org/project/deap) | 1.4.1 | Distributed Evolutionary Algorithms in Python +[debugpy](https://pypi.org/project/debugpy) | 1.8.0 | An implementation of the Debug Adapter Protocol for Python +[decorator](https://pypi.org/project/decorator) | 5.1.1 | Decorators for Humans +[defusedxml](https://pypi.org/project/defusedxml) | 0.7.1 | XML bomb protection for Python stdlib modules +[deprecated](https://pypi.org/project/deprecated) | 1.2.13 | Python @deprecated decorator to deprecate old python classes, functions or methods. +[diff_match_patch](https://pypi.org/project/diff_match_patch) | 20230430 | Diff Match and Patch +[dill](https://pypi.org/project/dill) | 0.3.7 | serialize all of Python +[distributed](https://pypi.org/project/distributed) | 2024.12.1 | Distributed scheduler for Dask +[distro](https://pypi.org/project/distro) | 1.8.0 | Distro - an OS platform information API +[django](https://pypi.org/project/django) | 5.0.7 | A high-level Python web framework that encourages rapid development and clean, pragmatic design. +[dnspython](https://pypi.org/project/dnspython) | 2.6.1 | DNS toolkit +[docopt](https://pypi.org/project/docopt) | 0.6.2 | Pythonic argument parser, that will make you smile +[docstring_to_markdown](https://pypi.org/project/docstring_to_markdown) | 0.13 | On the fly conversion of Python docstrings to markdown +[docutils](https://pypi.org/project/docutils) | 0.20.1 | Docutils -- Python Documentation Utilities +[duckdb](https://pypi.org/project/duckdb) | 1.1.3 | DuckDB in-process database +[ecos](https://pypi.org/project/ecos) | 2.0.13 | This is the Python package for ECOS: Embedded Cone Solver. See Github page for more information. +[entrypoints](https://pypi.org/project/entrypoints) | 0.4 | Discover and load entry points from installed packages. +[et_xmlfile](https://pypi.org/project/et_xmlfile) | 1.1.0 | An implementation of lxml.xmlfile for the standard library +[eval_type_backport](https://pypi.org/project/eval_type_backport) | 0.2.2 | Like `typing._eval_type`, but lets older Python versions use newer typing features. +[executing](https://pypi.org/project/executing) | 2.0.1 | Get the currently executing AST node of a frame, and other information +[fast_histogram](https://pypi.org/project/fast_histogram) | 0.14 | Fast simple 1D and 2D histograms +[fastapi](https://pypi.org/project/fastapi) | 0.115.6 | FastAPI framework, high performance, easy to learn, fast to code, ready for production +[fastjsonschema](https://pypi.org/project/fastjsonschema) | 2.18.0 | Fastest Python implementation of JSON schema +[filelock](https://pypi.org/project/filelock) | 3.14.0 | A platform independent file lock. +[filterpy](https://pypi.org/project/filterpy) | 1.4.5 | Kalman filtering and optimal estimation library +[fiona](https://pypi.org/project/fiona) | 1.10.1 | Fiona reads and writes spatial data files +[flake8](https://pypi.org/project/flake8) | 7.1.1 | the modular source code checker: pep8 pyflakes and co +[flask](https://pypi.org/project/flask) | 3.0.3 | A simple framework for building complex web applications. +[flask_mail](https://pypi.org/project/flask_mail) | 0.9.1 | Flask extension for sending email +[flask_session](https://pypi.org/project/flask_session) | 0.5.0 | Server-side session support for Flask +[flask_sqlalchemy](https://pypi.org/project/flask_sqlalchemy) | 3.0.5 | Add SQLAlchemy support to your Flask application. +[flit](https://pypi.org/project/flit) | 3.9.0 | A simple packaging tool for simple packages. +[flit_core](https://pypi.org/project/flit_core) | 3.9.0 | Distribution-building parts of Flit. See flit package for more information +[folium](https://pypi.org/project/folium) | 0.18.0 | Make beautiful maps with Leaflet.js & Python +[fonttools](https://pypi.org/project/fonttools) | 4.55.3 | Tools to manipulate font files +[formlayout](https://pypi.org/project/formlayout) | 1.2.1a1 | The most easy way to create Qt form dialogs and widgets with Python +[fqdn](https://pypi.org/project/fqdn) | 1.5.1 | Validates fully-qualified domain names against RFC 1123, so that they are acceptable to modern bowsers +[frozenlist](https://pypi.org/project/frozenlist) | 1.5.0 | A list-like structure which implements collections.abc.MutableSequence +[fsspec](https://pypi.org/project/fsspec) | 2024.6.1 | File-system specification +[future](https://pypi.org/project/future) | 0.18.2 | Clean single-source support for Python 3 and 2 +[fuzzywuzzy](https://pypi.org/project/fuzzywuzzy) | 0.18.0 | Fuzzy string matching in python +[geographiclib](https://pypi.org/project/geographiclib) | 2.0 | The geodesic routines from GeographicLib +[geopandas](https://pypi.org/project/geopandas) | 0.14.4 | Geographic pandas extensions +[geopy](https://pypi.org/project/geopy) | 2.4.1 | Python Geocoding Toolbox +[gitdb](https://pypi.org/project/gitdb) | 4.0.10 | Git Object Database +[gitpython](https://pypi.org/project/gitpython) | 3.1.32 | GitPython is a Python library used to interact with Git repositories +[google_auth](https://pypi.org/project/google_auth) | 2.37.0 | Google Authentication Library +[grapheme](https://pypi.org/project/grapheme) | 0.6.0 | Unicode grapheme helpers +[graphene](https://pypi.org/project/graphene) | 3.3 | GraphQL Framework for Python +[graphql_core](https://pypi.org/project/graphql_core) | 3.2.3 | GraphQL implementation for Python, a port of GraphQL.js, the JavaScript reference implementation for GraphQL. +[graphql_relay](https://pypi.org/project/graphql_relay) | 3.2.0 | Relay library for graphql-core +[greenlet](https://pypi.org/project/greenlet) | 3.1.1 | Lightweight in-process concurrent programming +[griffe](https://pypi.org/project/griffe) | 1.5.4 | Signatures for entire Python programs +[groq](https://pypi.org/project/groq) | 0.13.1 | The official Python library for the groq API +[guidata](https://pypi.org/project/guidata) | 3.7.1 | Automatic GUI generation for easy dataset editing and display +[h11](https://pypi.org/project/h11) | 0.14.0 | A pure-Python, bring-your-own-I/O implementation of HTTP/1.1 +[h2](https://pypi.org/project/h2) | 4.1.0 | HTTP/2 State-Machine based protocol implementation +[h5py](https://pypi.org/project/h5py) | 3.12.1 | Read and write HDF5 files from Python +[hatchling](https://pypi.org/project/hatchling) | 1.27.0 | Modern, extensible Python build backend +[holoviews](https://pypi.org/project/holoviews) | 1.20.0 | A high-level plotting API for the PyData ecosystem built on HoloViews. +[hpack](https://pypi.org/project/hpack) | 4.0.0 | Pure-Python HPACK header compression +[html5lib](https://pypi.org/project/html5lib) | 1.1 | HTML parser based on the WHATWG HTML specification +[httpcore](https://pypi.org/project/httpcore) | 1.0.5 | A minimal low-level HTTP client. +[httpie](https://pypi.org/project/httpie) | 3.2.4 | HTTPie: modern, user-friendly command-line HTTP client for the API era. +[httpx](https://pypi.org/project/httpx) | 0.27.2 | The next generation HTTP client. +[huggingface_hub](https://pypi.org/project/huggingface_hub) | 0.27.0 | Client library to download and publish models, datasets and other repos on the huggingface.co hub +[hupper](https://pypi.org/project/hupper) | 1.12 | Integrated process monitor for developing and reloading daemons. +[hvplot](https://pypi.org/project/hvplot) | 0.11.2 | A high-level plotting API for the PyData ecosystem built on HoloViews. +[hypercorn](https://pypi.org/project/hypercorn) | 0.16.0 | A ASGI Server based on Hyper libraries and inspired by Gunicorn +[hyperframe](https://pypi.org/project/hyperframe) | 6.0.1 | HTTP/2 framing layer for Python +[hypothesis](https://pypi.org/project/hypothesis) | 6.108.5 | A library for property-based testing +[idna](https://pypi.org/project/idna) | 3.7 | Internationalized Domain Names in Applications (IDNA) +[imageio](https://pypi.org/project/imageio) | 2.33.1 | Library for reading and writing a wide range of image, video, scientific, and volumetric data formats. +[imagesize](https://pypi.org/project/imagesize) | 1.4.1 | Getting image size from png/jpeg/jpeg2000/gif file +[imbalanced_learn](https://pypi.org/project/imbalanced_learn) | 0.12.3 | Toolbox for imbalanced dataset in machine learning. +[importlib_metadata](https://pypi.org/project/importlib_metadata) | 7.1.0 | Read metadata from Python packages +[inflection](https://pypi.org/project/inflection) | 0.5.1 | A port of Ruby on Rails inflector to Python +[iniconfig](https://pypi.org/project/iniconfig) | 2.0.0 | brain-dead simple config-ini parsing +[intervaltree](https://pypi.org/project/intervaltree) | 3.0.2 | Editable interval tree data structure for Python 2 and 3 +[ipycanvas](https://pypi.org/project/ipycanvas) | 0.13.2 | Interactive widgets library exposing the browser's Canvas API +[ipykernel](https://pypi.org/project/ipykernel) | 6.29.5 | IPython Kernel for Jupyter +[ipyleaflet](https://pypi.org/project/ipyleaflet) | 0.19.2 | A Jupyter widget for dynamic Leaflet maps +[ipympl](https://pypi.org/project/ipympl) | 0.9.4 | Matplotlib Jupyter Extension +[ipython](https://pypi.org/project/ipython) | 8.26.0 | IPython: Productive Interactive Computing +[ipython_genutils](https://pypi.org/project/ipython_genutils) | 0.2.0 | Vestigial utilities from IPython +[ipython_sql](https://pypi.org/project/ipython_sql) | 0.5.0 | RDBMS access via IPython +[ipywidgets](https://pypi.org/project/ipywidgets) | 8.1.5 | Jupyter interactive widgets +[isoduration](https://pypi.org/project/isoduration) | 20.11.0 | Operations with ISO 8601 durations +[isort](https://pypi.org/project/isort) | 5.13.2 | A Python utility / library to sort Python imports. +[itsdangerous](https://pypi.org/project/itsdangerous) | 2.2.0 | Safely pass data to untrusted environments and back. +[janus](https://pypi.org/project/janus) | 1.0.0 | Mixed sync-async queue to interoperate between asyncio tasks and classic threads +[jaraco_classes](https://pypi.org/project/jaraco_classes) | 3.4.0 | Utility functions for Python class constructs +[jaraco_context](https://pypi.org/project/jaraco_context) | 5.3.0 | Useful decorators and context managers +[jaraco_functools](https://pypi.org/project/jaraco_functools) | 4.0.1 | Functools like those found in stdlib +[jedi](https://pypi.org/project/jedi) | 0.19.1 | An autocompletion tool for Python that can be used for text editors. +[jellyfish](https://pypi.org/project/jellyfish) | 1.1.3 | Approximate and phonetic matching of strings. +[jinja2](https://pypi.org/project/jinja2) | 3.1.2 | A very fast and expressive template engine. +[jiter](https://pypi.org/project/jiter) | 0.8.2 | Fast iterable JSON parser. +[joblib](https://pypi.org/project/joblib) | 1.4.2 | Lightweight pipelining with Python functions +[json5](https://pypi.org/project/json5) | 0.9.14 | A Python implementation of the JSON5 data format. +[jsonpatch](https://pypi.org/project/jsonpatch) | 1.33 | Apply JSON-Patches (RFC 6902) +[jsonpath_python](https://pypi.org/project/jsonpath_python) | 1.0.6 | A more powerful JSONPath implementation in modern python +[jsonpointer](https://pypi.org/project/jsonpointer) | 2.4 | Identify specific nodes in a JSON document (RFC 6901) +[jsonschema](https://pypi.org/project/jsonschema) | 4.19.2 | An implementation of JSON Schema validation for Python +[jsonschema_specifications](https://pypi.org/project/jsonschema_specifications) | 2023.12.1 | The JSON Schema meta-schemas and vocabularies, exposed as a Registry +[julia](https://pypi.org/project/julia) | 0.6.2 | Julia/Python bridge with IPython support. +[jupyter](https://pypi.org/project/jupyter) | 1.1.1 | Jupyter metapackage. Install all the Jupyter components in one go. +[jupyter_bokeh](https://pypi.org/project/jupyter_bokeh) | 4.0.5 | A Jupyter extension for rendering Bokeh content. +[jupyter_client](https://pypi.org/project/jupyter_client) | 8.6.2 | Jupyter protocol implementation and client libraries +[jupyter_console](https://pypi.org/project/jupyter_console) | 6.6.3 | Jupyter terminal console +[jupyter_core](https://pypi.org/project/jupyter_core) | 5.7.2 | Jupyter core package. A base package on which Jupyter projects rely. +[jupyter_events](https://pypi.org/project/jupyter_events) | 0.10.0 | Jupyter Event System library +[jupyter_leaflet](https://pypi.org/project/jupyter_leaflet) | 0.19.2 | ipyleaflet extensions for JupyterLab and Jupyter Notebook +[jupyter_lsp](https://pypi.org/project/jupyter_lsp) | 2.2.5 | Multi-Language Server WebSocket proxy for Jupyter Notebook/Lab server +[jupyter_server](https://pypi.org/project/jupyter_server) | 2.14.2 | The backend—i.e. core services, APIs, and REST endpoints—to Jupyter web applications. +[jupyter_server_terminals](https://pypi.org/project/jupyter_server_terminals) | 0.5.3 | A Jupyter Server Extension Providing Terminals. +[jupyterlab](https://pypi.org/project/jupyterlab) | 4.3.4 | JupyterLab computational environment +[jupyterlab_pygments](https://pypi.org/project/jupyterlab_pygments) | 0.3.0 | Pygments theme using JupyterLab CSS variables +[jupyterlab_server](https://pypi.org/project/jupyterlab_server) | 2.27.3 | A set of server components for JupyterLab and JupyterLab like applications. +[jupyterlab_widgets](https://pypi.org/project/jupyterlab_widgets) | 3.0.13 | Jupyter interactive widgets for JupyterLab +[keras](https://pypi.org/project/keras) | 3.7.0 | Multi-backend Keras +[keyring](https://pypi.org/project/keyring) | 25.2.1 | Store and access your passwords safely. +[kiwisolver](https://pypi.org/project/kiwisolver) | 1.4.7 | A fast implementation of the Cassowary constraint solver +[langchain](https://pypi.org/project/langchain) | 0.3.13 | Building applications with LLMs through composability +[langchain_core](https://pypi.org/project/langchain_core) | 0.3.28 | Building applications with LLMs through composability +[langchain_text_splitters](https://pypi.org/project/langchain_text_splitters) | 0.3.4 | LangChain text splitting utilities +[langsmith](https://pypi.org/project/langsmith) | 0.2.6 | Client library to connect to the LangSmith LLM Tracing and Evaluation Platform. +[lazy_loader](https://pypi.org/project/lazy_loader) | 0.4 | Makes it easy to load subpackages and functions on demand. +[linkify_it_py](https://pypi.org/project/linkify_it_py) | 2.0.2 | Links recognition library with FULL unicode support. +[llvmlite](https://pypi.org/project/llvmlite) | 0.44.0rc2 | lightweight wrapper around basic LLVM functionality +[lmfit](https://pypi.org/project/lmfit) | 1.3.1 | Least-Squares Minimization with Bounds and Constraints +[locket](https://pypi.org/project/locket) | 1.0.0 | File-based locks for Python on Linux and Windows +[logfire_api](https://pypi.org/project/logfire_api) | 2.11.0 | Shim for the Logfire SDK which does nothing unless Logfire is installed +[lxml](https://pypi.org/project/lxml) | 5.3.0 | Powerful and Pythonic XML processing library combining libxml2/libxslt with the ElementTree API. +[mako](https://pypi.org/project/mako) | 1.3.5 | A super-fast templating language that borrows the best ideas from the existing templating languages. +[markdown](https://pypi.org/project/markdown) | 3.5.1 | Python implementation of John Gruber's Markdown. +[markdown_it_py](https://pypi.org/project/markdown_it_py) | 2.2.0 | Python port of markdown-it. Markdown parsing, done right! +[markupsafe](https://pypi.org/project/markupsafe) | 2.1.1 | Safely add untrusted strings to HTML/XML markup. +[matplotlib](https://pypi.org/project/matplotlib) | 3.10.0 | Python plotting package +[matplotlib_inline](https://pypi.org/project/matplotlib_inline) | 0.1.7 | Inline Matplotlib backend for Jupyter +[maturin](https://pypi.org/project/maturin) | 1.7.0 | Build and publish crates with pyo3, cffi and uniffi bindings as well as rust binaries as python packages +[mccabe](https://pypi.org/project/mccabe) | 0.7.0 | McCabe checker, plugin for flake8 +[mdit_py_plugins](https://pypi.org/project/mdit_py_plugins) | 0.3.5 | Collection of plugins for markdown-it-py +[mdurl](https://pypi.org/project/mdurl) | 0.1.2 | Markdown URL utilities +[mercantile](https://pypi.org/project/mercantile) | 1.2.1 | Web mercator XYZ tile utilities +[mergedeep](https://pypi.org/project/mergedeep) | 1.3.4 | A deep merge function for 🐍. +[missingno](https://pypi.org/project/missingno) | 0.5.1 | Missing data visualization module for Python. +[mistralai](https://pypi.org/project/mistralai) | 1.2.5 | Python Client SDK for the Mistral AI API. +[mistune](https://pypi.org/project/mistune) | 2.0.5 | A sane Markdown parser with useful plugins and renderers +[mizani](https://pypi.org/project/mizani) | 0.11.4 | Scales for Python +[ml_dtypes](https://pypi.org/project/ml_dtypes) | 0.5.0 | +[mlxtend](https://pypi.org/project/mlxtend) | 0.22.0 | Machine Learning Library Extensions +[more_itertools](https://pypi.org/project/more_itertools) | 10.2.0 | More routines for operating on iterables, beyond itertools +[mpl_scatter_density](https://pypi.org/project/mpl_scatter_density) | 0.7 | Matplotlib helpers to make density scatter plots +[mpld3](https://pypi.org/project/mpld3) | 0.5.8 | D3 Viewer for Matplotlib +[mpmath](https://pypi.org/project/mpmath) | 1.3.0 | Python library for arbitrary-precision floating-point arithmetic +[msal](https://pypi.org/project/msal) | 1.30.0 | The Microsoft Authentication Library (MSAL) for Python library enables your app to access the Microsoft Cloud by supporting authentication of us +[msal_extensions](https://pypi.org/project/msal_extensions) | 1.2.0 | Microsoft Authentication Library extensions (MSAL EX) provides a persistence API that can save your data on disk, encrypted on Windows, macOS an +[msgpack](https://pypi.org/project/msgpack) | 1.0.4 | MessagePack serializer +[multidict](https://pypi.org/project/multidict) | 6.1.0 | multidict implementation +[multipledispatch](https://pypi.org/project/multipledispatch) | 1.0.0 | Multiple dispatch +[mutagen](https://pypi.org/project/mutagen) | 1.47.0 | read and write audio tags for many formats +[mypy](https://pypi.org/project/mypy) | 1.14.0 | Optional static typing for Python +[mypy_extensions](https://pypi.org/project/mypy_extensions) | 1.0.0 | Type system extensions for programs checked with the mypy type checker. +[mysql_connector_python](https://pypi.org/project/mysql_connector_python) | 8.0.21 | MySQL driver written in Python +[namex](https://pypi.org/project/namex) | 0.0.8 | A simple utility to separate the implementation of your Python package and its public API surface. +[narwhals](https://pypi.org/project/narwhals) | 1.15.2 | Extremely lightweight compatibility layer between dataframe libraries +[nbclient](https://pypi.org/project/nbclient) | 0.10.0 | A client library for executing notebooks. Formerly nbconvert's ExecutePreprocessor. +[nbconvert](https://pypi.org/project/nbconvert) | 7.16.1 | Converting Jupyter Notebooks (.ipynb files) to other formats +[nbformat](https://pypi.org/project/nbformat) | 5.10.4 | The Jupyter Notebook format +[nest_asyncio](https://pypi.org/project/nest_asyncio) | 1.6.0 | Patch asyncio to allow nested event loops +[netcdf4](https://pypi.org/project/netcdf4) | 1.7.1.post2 | Provides an object-oriented python interface to the netCDF version 4 library +[networkx](https://pypi.org/project/networkx) | 3.4.2 | Python package for creating and manipulating graphs and networks +[nltk](https://pypi.org/project/nltk) | 3.9.1 | Natural Language Toolkit +[notebook](https://pypi.org/project/notebook) | 7.3.1 | Jupyter Notebook - A web-based notebook environment for interactive computing +[notebook_shim](https://pypi.org/project/notebook_shim) | 0.2.4 | A shim layer for notebook traits and config +[ntlm_auth](https://pypi.org/project/ntlm_auth) | 1.5.0 | Creates NTLM authentication structures +[numba](https://pypi.org/project/numba) | 0.61.0rc2 | compiling Python code using LLVM +[numexpr](https://pypi.org/project/numexpr) | 2.10.1 | Fast numerical expression evaluator for NumPy +[numpy](https://pypi.org/project/numpy) | 2.1.3 | Fundamental package for array computing in Python +[numpydoc](https://pypi.org/project/numpydoc) | 1.6.0 | Sphinx extension to support docstrings in Numpy format +[openai](https://pypi.org/project/openai) | 1.58.1 | The official Python library for the openai API +[opencv_python](https://pypi.org/project/opencv_python) | 4.10.0.84 | Wrapper package for OpenCV python bindings. +[openpyxl](https://pypi.org/project/openpyxl) | 3.1.2 | A Python library to read/write Excel 2010 xlsx/xlsm files +[optree](https://pypi.org/project/optree) | 0.13.1 | Optimized PyTree Utilities. +[optuna](https://pypi.org/project/optuna) | 3.6.1 | A hyperparameter optimization framework +[orjson](https://pypi.org/project/orjson) | 3.10.12 | Fast, correct Python JSON library supporting dataclasses, datetimes, and numpy +[osqp](https://pypi.org/project/osqp) | 0.6.7.post1 | OSQP: The Operator Splitting QP Solver +[outcome](https://pypi.org/project/outcome) | 1.3.0.post0 | Capture the outcome of Python function calls. +[overrides](https://pypi.org/project/overrides) | 7.7.0 | A decorator to automatically detect mismatch when overriding a method. +[packaging](https://pypi.org/project/packaging) | 24.2 | Core utilities for Python packages +[pandas](https://pypi.org/project/pandas) | 2.2.3 | Powerful data structures for data analysis, time series, and statistics +[pandocfilters](https://pypi.org/project/pandocfilters) | 1.5.0 | Utilities for writing pandoc filters in python +[panel](https://pypi.org/project/panel) | 1.5.4 | The powerful data exploration & web app framework for Python. +[papermill](https://pypi.org/project/papermill) | 2.6.0 | Parameterize and run Jupyter and nteract Notebooks +[param](https://pypi.org/project/param) | 2.1.1 | Make your Python code clearer and more reliable by declaring Parameters. +[paramiko](https://pypi.org/project/paramiko) | 2.8.0 | SSH2 protocol library +[parso](https://pypi.org/project/parso) | 0.8.4 | A Python Parser +[partd](https://pypi.org/project/partd) | 1.4.0 | Appendable key-value storage +[pathspec](https://pypi.org/project/pathspec) | 0.11.0 | Utility library for gitignore style pattern matching of file paths. +[patsy](https://pypi.org/project/patsy) | 0.5.6 | A Python package for describing statistical models and for building design matrices. +[pdfrw](https://pypi.org/project/pdfrw) | 0.4.post2 | PDF file reader/writer library +[pep8](https://pypi.org/project/pep8) | 1.7.1 | Python style guide checker +[pexpect](https://pypi.org/project/pexpect) | 4.8.0 | Pexpect allows easy control of interactive console applications. +[pg8000](https://pypi.org/project/pg8000) | 1.23.0 | PostgreSQL interface library +[pickleshare](https://pypi.org/project/pickleshare) | 0.7.5 | Tiny 'shelve'-like database with concurrency support +[pillow](https://pypi.org/project/pillow) | 11.0.0 | Python Imaging Library (Fork) +[pint](https://pypi.org/project/pint) | 0.23 | Physical quantities module +[pip](https://pypi.org/project/pip) | 24.3.1 | The PyPA recommended tool for installing Python packages. +[pkginfo](https://pypi.org/project/pkginfo) | 1.11.2 | Query metadata from sdists / bdists / installed packages. +[platformdirs](https://pypi.org/project/platformdirs) | 4.2.2 | A small Python package for determining appropriate platform-specific dirs, e.g. a `user data dir`. +[plotly](https://pypi.org/project/plotly) | 5.24.1 | An open-source, interactive data visualization library for Python +[plotnine](https://pypi.org/project/plotnine) | 0.13.6 | A Grammar of Graphics for Python +[plotpy](https://pypi.org/project/plotpy) | 2.7.0 | Curve and image plotting tools for Python/Qt applications +[pluggy](https://pypi.org/project/pluggy) | 1.5.0 | plugin and hook calling mechanisms for python +[ply](https://pypi.org/project/ply) | 3.11 | Python Lex & Yacc +[polars](https://pypi.org/project/polars) | 1.18.0 | Blazingly fast DataFrame library +[portalocker](https://pypi.org/project/portalocker) | 2.7.0 | Wraps the portalocker recipe for easy usage +[ppci](https://pypi.org/project/ppci) | 0.5.9 | A compiler for ARM, X86, MSP430, xtensa and more implemented in pure Python +[prettytable](https://pypi.org/project/prettytable) | 3.3.0 | A simple Python library for easily displaying tabular data in a visually appealing ASCII table format +[priority](https://pypi.org/project/priority) | 2.0.0 | A pure-Python implementation of the HTTP/2 priority tree +[prometheus_client](https://pypi.org/project/prometheus_client) | 0.18.0 | Python client for the Prometheus monitoring system. +[prompt_toolkit](https://pypi.org/project/prompt_toolkit) | 3.0.48 | Library for building powerful interactive command lines in Python +[propcache](https://pypi.org/project/propcache) | 0.2.1 | Accelerated property cache +[protobuf](https://pypi.org/project/protobuf) | 5.27.3 | +[psutil](https://pypi.org/project/psutil) | 5.9.8 | Cross-platform lib for process and system monitoring in Python. +[psygnal](https://pypi.org/project/psygnal) | 0.11.1 | Fast python callback/event system modeled after Qt Signals +[ptpython](https://pypi.org/project/ptpython) | 3.0.29 | Python REPL build on top of prompt_toolkit +[ptyprocess](https://pypi.org/project/ptyprocess) | 0.7.0 | Run a subprocess in a pseudo terminal +[pulp](https://pypi.org/project/pulp) | 2.6.0 | PuLP is an LP modeler written in python +[pure_eval](https://pypi.org/project/pure_eval) | 0.2.2 | Safely evaluate AST nodes without side effects +[pyarrow](https://pypi.org/project/pyarrow) | 18.1.0 | Python library for Apache Arrow +[pyasn1](https://pypi.org/project/pyasn1) | 0.4.8 | ASN.1 types and codecs +[pyasn1_modules](https://pypi.org/project/pyasn1_modules) | 0.2.8 | A collection of ASN.1-based protocols modules. +[pyaudio](https://pypi.org/project/pyaudio) | 0.2.14 | Cross-platform audio I/O with PortAudio +[pybars3](https://pypi.org/project/pybars3) | 0.9.7 | Handlebars.js templating for Python 3 and 2 +[pybind11](https://pypi.org/project/pybind11) | 2.13.6 | Seamless operability between C++11 and Python +[pycodestyle](https://pypi.org/project/pycodestyle) | 2.12.0 | Python style guide checker +[pycosat](https://pypi.org/project/pycosat) | 0.6.6 | bindings to picosat (a SAT solver) +[pycparser](https://pypi.org/project/pycparser) | 2.22 | C parser in Python +[pycryptodomex](https://pypi.org/project/pycryptodomex) | 3.20.0 | Cryptographic library for Python +[pyct](https://pypi.org/project/pyct) | 0.5.0 | Python package common tasks for users (e.g. copy examples, fetch data, ...) +[pydantic](https://pypi.org/project/pydantic) | 2.10.4 | Data validation using Python type hints +[pydantic_ai](https://pypi.org/project/pydantic_ai) | 0.0.15 | Agent Framework / shim to use Pydantic with LLMs +[pydantic_ai_slim](https://pypi.org/project/pydantic_ai_slim) | 0.0.15 | Agent Framework / shim to use Pydantic with LLMs, slim package +[pydantic_core](https://pypi.org/project/pydantic_core) | 2.27.2 | Core functionality for Pydantic validation and serialization +[pydeck](https://pypi.org/project/pydeck) | 0.9.1 | Widget for deck.gl maps +[pydocstyle](https://pypi.org/project/pydocstyle) | 6.3.0 | Python docstring style checker +[pydub](https://pypi.org/project/pydub) | 0.25.1 | Manipulate audio with an simple and easy high level interface +[pyerfa](https://pypi.org/project/pyerfa) | 2.0.1.4 | Python bindings for ERFA +[pyflakes](https://pypi.org/project/pyflakes) | 3.2.0 | passive checker of Python programs +[pygments](https://pypi.org/project/pygments) | 2.18.0 | Pygments is a syntax highlighting package written in Python. +[pyjwt](https://pypi.org/project/pyjwt) | 2.8.0 | JSON Web Token implementation in Python +[pylint](https://pypi.org/project/pylint) | 3.1.0 | python code static checker +[pylint_venv](https://pypi.org/project/pylint_venv) | 3.0.3 | pylint-venv provides a Pylint init-hook to use the same Pylint installation with different virtual environments. +[pyls_spyder](https://pypi.org/project/pyls_spyder) | 0.4.0 | Spyder extensions for the python-lsp-server +[pymeta3](https://pypi.org/project/pymeta3) | 0.5.1 | Pattern-matching language based on OMeta for Python 3 and 2 +[pymongo](https://pypi.org/project/pymongo) | 4.10.1 | Python driver for MongoDB +[pymoo](https://pypi.org/project/pymoo) | 0.6.1.3 | Multi-Objective Optimization in Python +[pympler](https://pypi.org/project/pympler) | 1.0.1 | A development tool to measure, monitor and analyze the memory behavior of Python objects. +[pynacl](https://pypi.org/project/pynacl) | 1.5.0 | Python binding to the Networking and Cryptography (NaCl) library +[pynndescent](https://pypi.org/project/pynndescent) | 0.5.12 | Nearest Neighbor Descent +[pyodbc](https://pypi.org/project/pyodbc) | 5.2.0 | DB API module for ODBC +[pyomo](https://pypi.org/project/pyomo) | 6.8.0 | Pyomo: Python Optimization Modeling Objects +[pypandoc](https://pypi.org/project/pypandoc) | 1.5 | Thin wrapper for pandoc. +[pyparsing](https://pypi.org/project/pyparsing) | 3.1.2 | pyparsing module - Classes and methods to define and execute parsing grammars +[pypdf](https://pypi.org/project/pypdf) | 3.15.2 | A pure-python PDF library capable of splitting, merging, cropping, and transforming PDF files +[pypng](https://pypi.org/project/pypng) | 0.20220715.0 | Pure Python library for saving and loading PNG images +[pyproj](https://pypi.org/project/pyproj) | 3.6.1 | Python interface to PROJ (cartographic projections and coordinate transformations library) +[pyproject_hooks](https://pypi.org/project/pyproject_hooks) | 1.1.0 | Wrappers to call pyproject.toml-based build backend hooks. +[pyqt5](https://pypi.org/project/pyqt5) | 5.15.10 | Python bindings for the Qt cross platform application toolkit +[pyqt5_qt5](https://pypi.org/project/pyqt5_qt5) | 5.15.2 | The subset of a Qt installation needed by PyQt5. +[pyqt5_sip](https://pypi.org/project/pyqt5_sip) | 12.13.0 | The sip module support for PyQt5 +[pyqtgraph](https://pypi.org/project/pyqtgraph) | 0.13.7 | Scientific Graphics and GUI Library for Python +[pyqtwebengine](https://pypi.org/project/pyqtwebengine) | 5.15.6 | Python bindings for the Qt WebEngine framework +[pyqtwebengine_qt5](https://pypi.org/project/pyqtwebengine_qt5) | 5.15.2 | The subset of a Qt installation needed by PyQtWebEngine. +[pyserial](https://pypi.org/project/pyserial) | 3.5 | Python Serial Port Extension +[pyshp](https://pypi.org/project/pyshp) | 2.3.1 | Pure Python read/write support for ESRI Shapefile format +[pysimplegui](https://pypi.org/project/pysimplegui) | 4.60.4 | Python GUIs for Humans +[pysocks](https://pypi.org/project/pysocks) | 1.7.1 | A Python SOCKS client module. See https://github.com/Anorov/PySocks for more information. +[pytest](https://pypi.org/project/pytest) | 8.2.2 | pytest: simple powerful testing with Python +[python_barcode](https://pypi.org/project/python_barcode) | 0.15.1 | Create standard barcodes with Python. No external modules needed. (optional Pillow support included). +[python_dateutil](https://pypi.org/project/python_dateutil) | 2.8.2 | Extensions to the standard Python datetime module +[python_dotenv](https://pypi.org/project/python_dotenv) | 1.0.1 | Read key-value pairs from a .env file and set them as environment variables +[python_json_logger](https://pypi.org/project/python_json_logger) | 2.0.7 | A python library adding a json log formatter +[python_lsp_black](https://pypi.org/project/python_lsp_black) | 2.0.0 | Black plugin for the Python LSP Server +[python_lsp_jsonrpc](https://pypi.org/project/python_lsp_jsonrpc) | 1.1.2 | JSON RPC 2.0 server library +[python_lsp_server](https://pypi.org/project/python_lsp_server) | 1.12.0 | Python Language Server for the Language Server Protocol +[python_multipart](https://pypi.org/project/python_multipart) | 0.0.9 | A streaming multipart parser for Python +[python_slugify](https://pypi.org/project/python_slugify) | 8.0.4 | A Python slugify application that also handles Unicode +[pythonnet](https://pypi.org/project/pythonnet) | 3.0.3 | .NET and Mono integration for Python +[pythonqwt](https://pypi.org/project/pythonqwt) | 0.14.2 | Qt plotting widgets for Python +[pytoolconfig](https://pypi.org/project/pytoolconfig) | 1.3.1 | Python tool configuration +[pytz](https://pypi.org/project/pytz) | 2024.1 | World timezone definitions, modern and historical +[pyviz_comms](https://pypi.org/project/pyviz_comms) | 3.0.3 | A JupyterLab extension for rendering HoloViz content. +[pywin32](https://pypi.org/project/pywin32) | 308 | Python for Window Extensions +[pywin32_ctypes](https://pypi.org/project/pywin32_ctypes) | 0.2.2 | A (partial) reimplementation of pywin32 using ctypes/cffi +[pywinpty](https://pypi.org/project/pywinpty) | 2.0.14 | Pseudo terminal support for Windows from Python. +[pywinusb](https://pypi.org/project/pywinusb) | 0.4.2 | A package that simplifies USB/HID communications on windows +[pyyaml](https://pypi.org/project/pyyaml) | 6.0.2 | YAML parser and emitter for Python +[pyzmq](https://pypi.org/project/pyzmq) | 26.2.0 | Python bindings for 0MQ +[qdarkstyle](https://pypi.org/project/qdarkstyle) | 3.2.3 | The most complete dark/light style sheet for C++/Python and Qt applications +[qdldl](https://pypi.org/project/qdldl) | 0.1.7.post4 | QDLDL, a free LDL factorization routine. +[qrcode](https://pypi.org/project/qrcode) | 7.4.2 | QR Code image generator +[qstylizer](https://pypi.org/project/qstylizer) | 0.2.2 | Stylesheet Generator for PyQt{4-5}/PySide{1-2} +[qtawesome](https://pypi.org/project/qtawesome) | 1.3.1 | FontAwesome icons in PyQt and PySide applications +[qtconsole](https://pypi.org/project/qtconsole) | 5.5.2 | Jupyter Qt console +[qtpy](https://pypi.org/project/qtpy) | 2.4.1 | Provides an abstraction layer on top of the various Qt bindings (PyQt5/6 and PySide2/6). +[quantecon](https://pypi.org/project/quantecon) | 0.7.2 | Import the main names to top level. +[quart](https://pypi.org/project/quart) | 0.19.4 | A Python ASGI web microframework with the same API as Flask +[rapidfuzz](https://pypi.org/project/rapidfuzz) | 3.9.6 | rapid fuzzy string matching +[rasterio](https://pypi.org/project/rasterio) | 1.3.10 | Fast and direct raster I/O for use with Numpy and SciPy +[readme_renderer](https://pypi.org/project/readme_renderer) | 35.0 | readme_renderer is a library for rendering "readme" descriptions for Warehouse +[redis](https://pypi.org/project/redis) | 5.0.3 | Python client for Redis database and key-value store +[referencing](https://pypi.org/project/referencing) | 0.35.1 | JSON Referencing + Python +[regex](https://pypi.org/project/regex) | 2024.11.6 | Alternative regular expression module, to replace re. +[reportlab](https://pypi.org/project/reportlab) | 4.2.2 | The Reportlab Toolkit +[requests](https://pypi.org/project/requests) | 2.32.3 | Python HTTP for Humans. +[requests_ntlm](https://pypi.org/project/requests_ntlm) | 1.1.0 | This package allows for HTTP NTLM authentication using the requests library. +[requests_toolbelt](https://pypi.org/project/requests_toolbelt) | 1.0.0 | A utility belt for advanced users of python-requests +[rfc3339_validator](https://pypi.org/project/rfc3339_validator) | 0.1.4 | A pure python RFC3339 validator +[rfc3986](https://pypi.org/project/rfc3986) | 2.0.0 | Validating URI References per RFC 3986 +[rfc3986_validator](https://pypi.org/project/rfc3986_validator) | 0.1.1 | Pure python rfc3986 validator +[rich](https://pypi.org/project/rich) | 13.9.4 | Render rich text, tables, progress bars, syntax highlighting, markdown and more to the terminal +[rope](https://pypi.org/project/rope) | 1.12.0 | a python refactoring library... +[rpds_py](https://pypi.org/project/rpds_py) | 0.22.3 | Python bindings to Rust's persistent data structures (rpds) +[rsa](https://pypi.org/project/rsa) | 4.7.2 | Pure-Python RSA implementation +[rtree](https://pypi.org/project/rtree) | 1.1.0 | R-Tree spatial index for Python GIS +[rx](https://pypi.org/project/rx) | 3.1.1 | Reactive Extensions (Rx) for Python +[scikit_image](https://pypi.org/project/scikit_image) | 0.25.0 | Image processing in Python +[scikit_learn](https://pypi.org/project/scikit_learn) | 1.6.0 | A set of python modules for machine learning and data mining +[scipy](https://pypi.org/project/scipy) | 1.14.1 | Fundamental algorithms for scientific computing in Python +[scramp](https://pypi.org/project/scramp) | 1.4.1 | An implementation of the SCRAM protocol. +[scs](https://pypi.org/project/scs) | 3.2.7 | Splitting conic solver +[seaborn](https://pypi.org/project/seaborn) | 0.13.2 | Statistical data visualization +[send2trash](https://pypi.org/project/send2trash) | 1.8.2 | Send file to trash natively under Mac OS X, Windows and Linux +[setuptools](https://pypi.org/project/setuptools) | 75.6.0 | Easily download, build, install, upgrade, and uninstall Python packages +[shapely](https://pypi.org/project/shapely) | 2.0.4 | Manipulation and analysis of geometric objects +[simplegeneric](https://pypi.org/project/simplegeneric) | 0.8.1 | Simple generic functions (similar to Python's own len(), pickle.dump(), etc.) +[simplejson](https://pypi.org/project/simplejson) | 3.19.3 | Simple, fast, extensible JSON encoder/decoder for Python +[simpy](https://pypi.org/project/simpy) | 4.0.1 | Event discrete, process based simulation for Python. +[six](https://pypi.org/project/six) | 1.16.0 | Python 2 and 3 compatibility utilities +[smmap](https://pypi.org/project/smmap) | 5.0.0 | A pure Python implementation of a sliding window memory map manager +[sniffio](https://pypi.org/project/sniffio) | 1.3.0 | Sniff out which async library your code is running under +[snowballstemmer](https://pypi.org/project/snowballstemmer) | 2.2.0 | This package provides 29 stemmers for 28 languages generated from Snowball algorithms. +[snuggs](https://pypi.org/project/snuggs) | 1.4.7 | Snuggs are s-expressions for Numpy +[sortedcontainers](https://pypi.org/project/sortedcontainers) | 2.4.0 | Sorted Containers -- Sorted List, Sorted Dict, Sorted Set +[sounddevice](https://pypi.org/project/sounddevice) | 0.4.6 | Play and Record Sound with Python +[soupsieve](https://pypi.org/project/soupsieve) | 2.5 | A modern CSS selector implementation for Beautiful Soup. +[sphinx](https://pypi.org/project/sphinx) | 7.3.7 | Python documentation generator +[sphinx_rtd_theme](https://pypi.org/project/sphinx_rtd_theme) | 2.0.0 | Read the Docs theme for Sphinx +[sphinxcontrib_applehelp](https://pypi.org/project/sphinxcontrib_applehelp) | 1.0.8 | sphinxcontrib-applehelp is a Sphinx extension which outputs Apple help books +[sphinxcontrib_devhelp](https://pypi.org/project/sphinxcontrib_devhelp) | 1.0.6 | sphinxcontrib-devhelp is a sphinx extension which outputs Devhelp documents +[sphinxcontrib_htmlhelp](https://pypi.org/project/sphinxcontrib_htmlhelp) | 2.0.5 | sphinxcontrib-htmlhelp is a sphinx extension which renders HTML help files +[sphinxcontrib_jquery](https://pypi.org/project/sphinxcontrib_jquery) | 4.1 | Extension to include jQuery on newer Sphinx releases +[sphinxcontrib_jsmath](https://pypi.org/project/sphinxcontrib_jsmath) | 1.0.1 | A sphinx extension which renders display math in HTML via JavaScript +[sphinxcontrib_qthelp](https://pypi.org/project/sphinxcontrib_qthelp) | 1.0.7 | sphinxcontrib-qthelp is a sphinx extension which outputs QtHelp documents +[sphinxcontrib_serializinghtml](https://pypi.org/project/sphinxcontrib_serializinghtml) | 1.1.9 | sphinxcontrib-serializinghtml is a sphinx extension which outputs "serialized" HTML files (json and pickle) +[spyder](https://pypi.org/project/spyder) | 5.5.6 | The Scientific Python Development Environment +[spyder_kernels](https://pypi.org/project/spyder_kernels) | 2.5.2 | Jupyter kernels for Spyder's console +[sqlalchemy](https://pypi.org/project/sqlalchemy) | 2.0.35 | Database Abstraction Library +[sqlite_bro](https://pypi.org/project/sqlite_bro) | 0.13.1 | a graphic SQLite Client in 1 Python file +[sqlite_fts4](https://pypi.org/project/sqlite_fts4) | 1.0.3 | Python functions for working with SQLite FTS4 search +[sqlite_utils](https://pypi.org/project/sqlite_utils) | 3.37 | CLI tool and Python library for manipulating SQLite databases +[sqlparse](https://pypi.org/project/sqlparse) | 0.4.3 | A non-validating SQL parser. +[sspyrs](https://pypi.org/project/sspyrs) | 0.3 | Lightweight interface for SSRS reports to python +[stack_data](https://pypi.org/project/stack_data) | 0.6.3 | Extract data from python stack frames and tracebacks for informative displays +[starlette](https://pypi.org/project/starlette) | 0.41.3 | The little ASGI library that shines. +[statsmodels](https://pypi.org/project/statsmodels) | 0.14.4 | Statistical computations and models for Python +[streamlit](https://pypi.org/project/streamlit) | 1.41.1 | A faster way to build and share data apps +[streamz](https://pypi.org/project/streamz) | 0.6.3 | Streams +[sympy](https://pypi.org/project/sympy) | 1.13.2 | Computer algebra system (CAS) in Python +[tabulate](https://pypi.org/project/tabulate) | 0.9.0 | Pretty-print tabular data +[tblib](https://pypi.org/project/tblib) | 3.0.0 | Traceback serialization library. +[tenacity](https://pypi.org/project/tenacity) | 8.5.0 | Retry code until it succeeds +[termcolor](https://pypi.org/project/termcolor) | 2.5.0 | ANSI color formatting for output in terminal +[terminado](https://pypi.org/project/terminado) | 0.18.1 | Tornado websocket backend for the Xterm.js Javascript terminal emulator library. +[text_unidecode](https://pypi.org/project/text_unidecode) | 1.3 | The most basic Text::Unidecode port +[textdistance](https://pypi.org/project/textdistance) | 4.6.2 | Compute distance between the two texts. +[threadpoolctl](https://pypi.org/project/threadpoolctl) | 3.5.0 | threadpoolctl +[three_merge](https://pypi.org/project/three_merge) | 0.1.1 | Simple library for merging two strings with respect to a base one +[tifffile](https://pypi.org/project/tifffile) | 2024.7.2 | Read and write TIFF files +[tiktoken](https://pypi.org/project/tiktoken) | 0.8.0 | tiktoken is a fast BPE tokeniser for use with OpenAI's models +[tinycss2](https://pypi.org/project/tinycss2) | 1.3.0 | A tiny CSS parser +[toml](https://pypi.org/project/toml) | 0.10.2 | Python Library for Tom's Obvious, Minimal Language +[tomli](https://pypi.org/project/tomli) | 2.0.1 | A lil' TOML parser +[tomli_w](https://pypi.org/project/tomli_w) | 1.0.0 | A lil' TOML writer +[tomlkit](https://pypi.org/project/tomlkit) | 0.12.3 | Style preserving TOML library +[toolz](https://pypi.org/project/toolz) | 0.12.0 | List processing tools and functional utilities +[tornado](https://pypi.org/project/tornado) | 6.4.1 | Tornado is a Python web framework and asynchronous networking library, originally developed at FriendFeed. +[tqdm](https://pypi.org/project/tqdm) | 4.66.4 | Fast, Extensible Progress Meter +[traitlets](https://pypi.org/project/traitlets) | 5.14.1 | Traitlets Python configuration system +[traittypes](https://pypi.org/project/traittypes) | 0.2.1 | Scipy trait types +[trio](https://pypi.org/project/trio) | 0.27.0 | A friendly Python library for async concurrency and I/O +[trove_classifiers](https://pypi.org/project/trove_classifiers) | 2024.10.21.16 | Canonical source for classifiers on PyPI (pypi.org). +[twine](https://pypi.org/project/twine) | 4.0.1 | Collection of utilities for publishing packages on PyPI +[types_python_dateutil](https://pypi.org/project/types_python_dateutil) | 2.9.0.20240316 | Typing stubs for python-dateutil +[typing_extensions](https://pypi.org/project/typing_extensions) | 4.12.2 | Backported and Experimental Type Hints for Python 3.8+ +[typing_inspect](https://pypi.org/project/typing_inspect) | 0.9.0 | Runtime inspection utilities for typing module. +[tzdata](https://pypi.org/project/tzdata) | 2024.1 | Provider of IANA time zone data +[tzlocal](https://pypi.org/project/tzlocal) | 5.2 | tzinfo object for the local timezone +[uc_micro_py](https://pypi.org/project/uc_micro_py) | 1.0.1 | Micro subset of unicode data files for linkify-it-py projects. +[ujson](https://pypi.org/project/ujson) | 5.10.0 | Ultra fast JSON encoder and decoder for Python +[umap_learn](https://pypi.org/project/umap_learn) | 0.5.6 | Uniform Manifold Approximation and Projection +[uncertainties](https://pypi.org/project/uncertainties) | 3.1.7 | Transparent calculations with uncertainties on the quantities involved (aka error propagation); fast calculation of derivatives +[uri_template](https://pypi.org/project/uri_template) | 1.3.0 | RFC 6570 URI Template Processor +[urllib3](https://pypi.org/project/urllib3) | 2.0.3 | HTTP library with thread-safe connection pooling, file post, and more. +[uvicorn](https://pypi.org/project/uvicorn) | 0.30.3 | The lightning-fast ASGI server. +[vega_datasets](https://pypi.org/project/vega_datasets) | 0.9.0 | A Python package for offline access to Vega datasets +[waitress](https://pypi.org/project/waitress) | 3.0.0 | Waitress WSGI server +[watchdog](https://pypi.org/project/watchdog) | 4.0.1 | Filesystem events monitoring +[wcwidth](https://pypi.org/project/wcwidth) | 0.2.13 | Measures the displayed width of unicode strings in a terminal +[webcolors](https://pypi.org/project/webcolors) | 1.12 | A library for working with color names and color values formats defined by HTML and CSS. +[webencodings](https://pypi.org/project/webencodings) | 0.5.1 | Character encoding aliases for legacy web content +[websocket_client](https://pypi.org/project/websocket_client) | 1.8.0 | WebSocket client for Python with low level API options +[websockets](https://pypi.org/project/websockets) | 13.1 | An implementation of the WebSocket Protocol (RFC 6455 & 7692) +[werkzeug](https://pypi.org/project/werkzeug) | 3.0.3 | The comprehensive WSGI web application library. +[whatthepatch](https://pypi.org/project/whatthepatch) | 1.0.2 | A patch parsing and application library. +[wheel](https://pypi.org/project/wheel) | 0.44.0 | A built-package format for Python +[widgetsnbextension](https://pypi.org/project/widgetsnbextension) | 4.0.13 | Jupyter interactive widgets for Jupyter Notebook +[winpython](https://pypi.org/project/winpython) | 11.2.20241228 | WinPython distribution tools, including WPPM +[wordcloud](https://pypi.org/project/wordcloud) | 1.9.4 | A little word cloud generator +[wrapt](https://pypi.org/project/wrapt) | 1.16.0 | Module for decorators, wrappers and monkey patching. +[wsproto](https://pypi.org/project/wsproto) | 1.2.0 | WebSockets state-machine based protocol implementation +[xarray](https://pypi.org/project/xarray) | 2024.11.0 | N-D labeled arrays and datasets in Python +[xlsxwriter](https://pypi.org/project/xlsxwriter) | 3.1.9 | A Python module for creating Excel XLSX files. +[xlwings](https://pypi.org/project/xlwings) | 0.24.7 | Make Excel fly: Interact with Excel from Python and vice versa. +[xmltodict](https://pypi.org/project/xmltodict) | 0.13.0 | Makes working with XML feel like you are working with JSON +[xyzservices](https://pypi.org/project/xyzservices) | 2023.10.1 | Source of XYZ tiles providers +[yapf](https://pypi.org/project/yapf) | 0.40.1 | A formatter for Python code. +[yarl](https://pypi.org/project/yarl) | 1.18.3 | Yet another URL library +[yt_dlp](https://pypi.org/project/yt_dlp) | 2023.7.6 | A youtube-dl fork with additional features and patches +[zict](https://pypi.org/project/zict) | 3.0.0 | Mutable mapping tools +[zipp](https://pypi.org/project/zipp) | 3.17.0 | Backport of pathlib-compatible object wrapper for zip files +[zstandard](https://pypi.org/project/zstandard) | 0.23.0 | Zstandard bindings for Python + +
diff --git a/changelogs/WinPythonslim-64bit-3.12.8.0_History.md b/changelogs/WinPythonslim-64bit-3.12.8.0_History.md new file mode 100644 index 00000000..a109c52b --- /dev/null +++ b/changelogs/WinPythonslim-64bit-3.12.8.0_History.md @@ -0,0 +1,154 @@ +## History of changes for WinPython-64bit 3.12.8.0slim + +The following changes were made to WinPython-64bit distribution since version 3.12.6.0slim. + +
+### Python packages + +New packages: + + * [aiohappyeyeballs](https://pypi.org/project/aiohappyeyeballs) 2.4.4 (Happy Eyeballs for asyncio) + * [anthropic](https://pypi.org/project/anthropic) 0.42.0 (The official Python library for the anthropic API) + * [eval_type_backport](https://pypi.org/project/eval_type_backport) 0.2.2 (Like `typing._eval_type`, but lets older Python versions use newer typing features.) + * [google_auth](https://pypi.org/project/google_auth) 2.37.0 (Google Authentication Library) + * [griffe](https://pypi.org/project/griffe) 1.5.4 (Signatures for entire Python programs) + * [groq](https://pypi.org/project/groq) 0.13.1 (The official Python library for the groq API) + * [jsonpatch](https://pypi.org/project/jsonpatch) 1.33 (Apply JSON-Patches (RFC 6902) ) + * [jsonpath_python](https://pypi.org/project/jsonpath_python) 1.0.6 (A more powerful JSONPath implementation in modern python) + * [langchain](https://pypi.org/project/langchain) 0.3.13 (Building applications with LLMs through composability) + * [langchain_core](https://pypi.org/project/langchain_core) 0.3.28 (Building applications with LLMs through composability) + * [langchain_text_splitters](https://pypi.org/project/langchain_text_splitters) 0.3.4 (LangChain text splitting utilities) + * [langsmith](https://pypi.org/project/langsmith) 0.2.6 (Client library to connect to the LangSmith LLM Tracing and Evaluation Platform.) + * [logfire_api](https://pypi.org/project/logfire_api) 2.11.0 (Shim for the Logfire SDK which does nothing unless Logfire is installed) + * [mistralai](https://pypi.org/project/mistralai) 1.2.5 (Python Client SDK for the Mistral AI API.) + * [osqp](https://pypi.org/project/osqp) 0.6.7.post1 (OSQP: The Operator Splitting QP Solver) + * [propcache](https://pypi.org/project/propcache) 0.2.1 (Accelerated property cache) + * [pyasn1](https://pypi.org/project/pyasn1) 0.4.8 (ASN.1 types and codecs) + * [pyasn1_modules](https://pypi.org/project/pyasn1_modules) 0.2.8 (A collection of ASN.1-based protocols modules.) + * [pydantic_ai](https://pypi.org/project/pydantic_ai) 0.0.15 (Agent Framework / shim to use Pydantic with LLMs) + * [pydantic_ai_slim](https://pypi.org/project/pydantic_ai_slim) 0.0.15 (Agent Framework / shim to use Pydantic with LLMs, slim package) + * [qdldl](https://pypi.org/project/qdldl) 0.1.7.post4 (QDLDL, a free LDL factorization routine.) + * [rsa](https://pypi.org/project/rsa) 4.7.2 (Pure-Python RSA implementation) + * [termcolor](https://pypi.org/project/termcolor) 2.5.0 (ANSI color formatting for output in terminal) + * [tiktoken](https://pypi.org/project/tiktoken) 0.8.0 (tiktoken is a fast BPE tokeniser for use with OpenAI's models) + * [typing_inspect](https://pypi.org/project/typing_inspect) 0.9.0 (Runtime inspection utilities for typing module.) + +Upgraded packages: + + * [adbc_driver_manager](https://pypi.org/project/adbc_driver_manager) 0.11.0 → 1.3.0 (A generic entrypoint for ADBC drivers.) + * [aiohttp](https://pypi.org/project/aiohttp) 3.9.5 → 3.11.11 (Async http client/server framework (asyncio)) + * [altair](https://pypi.org/project/altair) 5.4.1 → 5.5.0 (Vega-Altair: A declarative statistical visualization library for Python.) + * [anyio](https://pypi.org/project/anyio) 4.4.0 → 4.7.0 (High level compatibility layer for multiple asynchronous event loop implementations) + * [astropy](https://pypi.org/project/astropy) 6.1.0 → 6.1.6 (Astronomy and astrophysics core library) + * [astropy_iers_data](https://pypi.org/project/astropy_iers_data) 0.2024.4.29.0.28.48 → 0.2024.12.23.0.33.24 (IERS Earth Rotation and Leap Second tables for the astropy core package) + * [babel](https://pypi.org/project/babel) 2.15.0 → 2.16.0 (Internationalization utilities) + * [black](https://pypi.org/project/black) 24.8.0 → 24.10.0 (The uncompromising code formatter.) + * [bokeh](https://pypi.org/project/bokeh) 3.5.1 → 3.6.1 (Interactive plots and applications in the browser from Python) + * [branca](https://pypi.org/project/branca) 0.7.2 → 0.8.0 (Generate complex HTML+JS pages with Python) + * [build](https://pypi.org/project/build) 1.2.1 → 1.2.2.post1 (A simple, correct Python build frontend) + * [cachetools](https://pypi.org/project/cachetools) 5.3.3 → 5.4.0 (Extensible memoizing collections and decorators) + * [cffi](https://pypi.org/project/cffi) 1.16.0 → 1.17.1 (Foreign Function Interface for Python calling C code.) + * [charset_normalizer](https://pypi.org/project/charset_normalizer) 3.3.2 → 3.4.0 (The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet.) + * [contourpy](https://pypi.org/project/contourpy) 1.2.1 → 1.3.1 (Python library for calculating contours of 2D quadrilateral grids) + * [cvxpy](https://pypi.org/project/cvxpy) 1.5.0 → 1.6.0 (A domain-specific language for modeling convex optimization problems in Python.) + * [dask](https://pypi.org/project/dask) 2024.7.1 → 2024.12.1 (Parallel PyData with Task Scheduling) + * [dask_expr](https://pypi.org/project/dask_expr) 1.1.9 → 1.1.21 (High Level Expressions for Dask ) + * [distributed](https://pypi.org/project/distributed) 2024.7.1 → 2024.12.1 (Distributed scheduler for Dask) + * [duckdb](https://pypi.org/project/duckdb) 1.0.0 → 1.1.3 (DuckDB in-process database) + * [fastapi](https://pypi.org/project/fastapi) 0.111.1 → 0.115.6 (FastAPI framework, high performance, easy to learn, fast to code, ready for production) + * [fiona](https://pypi.org/project/fiona) 1.9.5 → 1.10.1 (Fiona reads and writes spatial data files) + * [folium](https://pypi.org/project/folium) 0.17.0 → 0.18.0 (Make beautiful maps with Leaflet.js & Python) + * [fonttools](https://pypi.org/project/fonttools) 4.51.0 → 4.55.3 (Tools to manipulate font files) + * [frozenlist](https://pypi.org/project/frozenlist) 1.4.1 → 1.5.0 (A list-like structure which implements collections.abc.MutableSequence) + * [greenlet](https://pypi.org/project/greenlet) 3.0.3 → 3.1.1 (Lightweight in-process concurrent programming) + * [guidata](https://pypi.org/project/guidata) 3.6.2 → 3.7.1 (Automatic GUI generation for easy dataset editing and display) + * [h5py](https://pypi.org/project/h5py) 3.10.0 → 3.12.1 (Read and write HDF5 files from Python) + * [hatchling](https://pypi.org/project/hatchling) 1.25.0 → 1.27.0 (Modern, extensible Python build backend) + * [holoviews](https://pypi.org/project/holoviews) 1.19.1 → 1.20.0 (A high-level plotting API for the PyData ecosystem built on HoloViews.) + * [httpie](https://pypi.org/project/httpie) 3.2.3 → 3.2.4 (HTTPie: modern, user-friendly command-line HTTP client for the API era.) + * [httpx](https://pypi.org/project/httpx) 0.27.0 → 0.27.2 (The next generation HTTP client.) + * [huggingface_hub](https://pypi.org/project/huggingface_hub) 0.24.5 → 0.27.0 (Client library to download and publish models, datasets and other repos on the huggingface.co hub) + * [hvplot](https://pypi.org/project/hvplot) 0.10.0 → 0.11.2 (A high-level plotting API for the PyData ecosystem built on HoloViews.) + * [jellyfish](https://pypi.org/project/jellyfish) 1.0.3 → 1.1.3 (Approximate and phonetic matching of strings.) + * [jiter](https://pypi.org/project/jiter) 0.5.0 → 0.8.2 (Fast iterable JSON parser.) + * [jupyter](https://pypi.org/project/jupyter) 1.0.0 → 1.1.1 (Jupyter metapackage. Install all the Jupyter components in one go.) + * [jupyterlab](https://pypi.org/project/jupyterlab) 4.2.5 → 4.3.4 (JupyterLab computational environment) + * [keras](https://pypi.org/project/keras) 3.5.0 → 3.7.0 (Multi-backend Keras) + * [kiwisolver](https://pypi.org/project/kiwisolver) 1.4.5 → 1.4.7 (A fast implementation of the Cassowary constraint solver) + * [llvmlite](https://pypi.org/project/llvmlite) 0.43.0 → 0.44.0rc2 (lightweight wrapper around basic LLVM functionality) + * [lxml](https://pypi.org/project/lxml) 5.2.2 → 5.3.0 (Powerful and Pythonic XML processing library combining libxml2/libxslt with the ElementTree API.) + * [matplotlib](https://pypi.org/project/matplotlib) 3.9.2 → 3.10.0 (Python plotting package) + * [ml_dtypes](https://pypi.org/project/ml_dtypes) 0.4.0 → 0.5.0 () + * [multidict](https://pypi.org/project/multidict) 6.0.5 → 6.1.0 (multidict implementation) + * [mypy](https://pypi.org/project/mypy) 1.11.1 → 1.14.0 (Optional static typing for Python) + * [narwhals](https://pypi.org/project/narwhals) 1.5.5 → 1.15.2 (Extremely lightweight compatibility layer between dataframe libraries) + * [networkx](https://pypi.org/project/networkx) 3.3 → 3.4.2 (Python package for creating and manipulating graphs and networks) + * [nltk](https://pypi.org/project/nltk) 3.8.1 → 3.9.1 (Natural Language Toolkit) + * [notebook](https://pypi.org/project/notebook) 7.2.1 → 7.3.1 (Jupyter Notebook - A web-based notebook environment for interactive computing) + * [numba](https://pypi.org/project/numba) 0.60.0 → 0.61.0rc2 (compiling Python code using LLVM) + * [numpy](https://pypi.org/project/numpy) 2.0.1 → 2.1.3 (Fundamental package for array computing in Python) + * [openai](https://pypi.org/project/openai) 1.42.0 → 1.58.1 (The official Python library for the openai API) + * [optree](https://pypi.org/project/optree) 0.11.0 → 0.13.1 (Optimized PyTree Utilities.) + * [orjson](https://pypi.org/project/orjson) 3.9.15 → 3.10.12 (Fast, correct Python JSON library supporting dataclasses, datetimes, and numpy) + * [packaging](https://pypi.org/project/packaging) 24.1 → 24.2 (Core utilities for Python packages) + * [pandas](https://pypi.org/project/pandas) 2.2.2 → 2.2.3 (Powerful data structures for data analysis, time series, and statistics) + * [panel](https://pypi.org/project/panel) 1.5.0b4 → 1.5.4 (The powerful data exploration & web app framework for Python.) + * [pillow](https://pypi.org/project/pillow) 10.4.0 → 11.0.0 (Python Imaging Library (Fork)) + * [pip](https://pypi.org/project/pip) 24.2 → 24.3.1 (The PyPA recommended tool for installing Python packages.) + * [pkginfo](https://pypi.org/project/pkginfo) 1.9.6 → 1.11.2 (Query metadata from sdists / bdists / installed packages.) + * [plotly](https://pypi.org/project/plotly) 5.23.0 → 5.24.1 (An open-source, interactive data visualization library for Python) + * [plotpy](https://pypi.org/project/plotpy) 2.6.2 → 2.7.0 (Curve and image plotting tools for Python/Qt applications) + * [polars](https://pypi.org/project/polars) 1.6.0 → 1.18.0 (Blazingly fast DataFrame library) + * [prompt_toolkit](https://pypi.org/project/prompt_toolkit) 3.0.47 → 3.0.48 (Library for building powerful interactive command lines in Python) + * [pyarrow](https://pypi.org/project/pyarrow) 17.0.0 → 18.1.0 (Python library for Apache Arrow) + * [pybind11](https://pypi.org/project/pybind11) 2.13.1 → 2.13.6 (Seamless operability between C++11 and Python) + * [pydantic](https://pypi.org/project/pydantic) 2.8.2 → 2.10.4 (Data validation using Python type hints) + * [pydantic_core](https://pypi.org/project/pydantic_core) 2.20.1 → 2.27.2 (Core functionality for Pydantic validation and serialization) + * [pymongo](https://pypi.org/project/pymongo) 4.7.2 → 4.10.1 (Python driver for MongoDB ) + * [pyodbc](https://pypi.org/project/pyodbc) 5.1.0 → 5.2.0 (DB API module for ODBC) + * [Python](http://www.python.org/) 3.12.6 → 3.12.8 (Python programming language with standard library) + * [pythonqwt](https://pypi.org/project/pythonqwt) 0.12.7 → 0.14.2 (Qt plotting widgets for Python) + * [pywin32](https://pypi.org/project/pywin32) 306 → 308 (Python for Window Extensions) + * [pywinpty](https://pypi.org/project/pywinpty) 2.0.12 → 2.0.14 (Pseudo terminal support for Windows from Python.) + * [pyyaml](https://pypi.org/project/pyyaml) 6.0.1 → 6.0.2 (YAML parser and emitter for Python) + * [pyzmq](https://pypi.org/project/pyzmq) 26.0.3 → 26.2.0 (Python bindings for 0MQ) + * [rapidfuzz](https://pypi.org/project/rapidfuzz) 3.9.3 → 3.9.6 (rapid fuzzy string matching) + * [regex](https://pypi.org/project/regex) 2023.10.3 → 2024.11.6 (Alternative regular expression module, to replace re.) + * [requests](https://pypi.org/project/requests) 2.31.0 → 2.32.3 (Python HTTP for Humans.) + * [rich](https://pypi.org/project/rich) 13.7.1 → 13.9.4 (Render rich text, tables, progress bars, syntax highlighting, markdown and more to the terminal) + * [rpds_py](https://pypi.org/project/rpds_py) 0.13.2 → 0.22.3 (Python bindings to Rust's persistent data structures (rpds)) + * [scikit_image](https://pypi.org/project/scikit_image) 0.24.0 → 0.25.0 (Image processing in Python) + * [scikit_learn](https://pypi.org/project/scikit_learn) 1.5.1 → 1.6.0 (A set of python modules for machine learning and data mining) + * [scs](https://pypi.org/project/scs) 3.2.4.post1 → 3.2.7 (Splitting conic solver) + * [setuptools](https://pypi.org/project/setuptools) 72.2.0 → 75.6.0 (Easily download, build, install, upgrade, and uninstall Python packages) + * [simplejson](https://pypi.org/project/simplejson) 3.19.2 → 3.19.3 (Simple, fast, extensible JSON encoder/decoder for Python) + * [sqlalchemy](https://pypi.org/project/sqlalchemy) 2.0.30 → 2.0.35 (Database Abstraction Library) + * [starlette](https://pypi.org/project/starlette) 0.37.2 → 0.41.3 (The little ASGI library that shines.) + * [statsmodels](https://pypi.org/project/statsmodels) 0.14.2 → 0.14.4 (Statistical computations and models for Python) + * [streamlit](https://pypi.org/project/streamlit) 1.37.1 → 1.41.1 (A faster way to build and share data apps) + * [trio](https://pypi.org/project/trio) 0.26.2 → 0.27.0 (A friendly Python library for async concurrency and I/O) + * [trove_classifiers](https://pypi.org/project/trove_classifiers) 2023.2.20 → 2024.10.21.16 (Canonical source for classifiers on PyPI (pypi.org).) + * [ujson](https://pypi.org/project/ujson) 5.8.0 → 5.10.0 (Ultra fast JSON encoder and decoder for Python) + * [websockets](https://pypi.org/project/websockets) 12.0 → 13.1 (An implementation of the WebSocket Protocol (RFC 6455 & 7692)) + * [winpython](https://pypi.org/project/winpython) 10.7.20240908 → 11.2.20241228 (WinPython distribution tools, including WPPM) + * [wordcloud](https://pypi.org/project/wordcloud) 1.9.3 → 1.9.4 (A little word cloud generator) + * [xarray](https://pypi.org/project/xarray) 2024.7.0 → 2024.11.0 (N-D labeled arrays and datasets in Python) + * [yarl](https://pypi.org/project/yarl) 1.7.2 → 1.18.3 (Yet another URL library) + +Removed packages: + + * [dirty_cat](https://pypi.org/project/dirty_cat) 0.4.1 (Machine learning with dirty categories.) + * [email_validator](https://pypi.org/project/email_validator) 2.2.0 (A robust email address syntax and deliverability validation library.) + * [fastapi_cli](https://pypi.org/project/fastapi_cli) 0.0.4 (Run and manage FastAPI apps from the command line with FastAPI CLI. 🚀) + * [httptools](https://pypi.org/project/httptools) 0.6.1 (A collection of framework independent HTTP protocol utils.) + * [msvc_runtime](https://pypi.org/project/msvc_runtime) 14.40.33807 (Install the Microsoft™ Visual C++™ runtime DLLs to the sys.prefix and Scripts directories) + * [pmdarima](https://pypi.org/project/pmdarima) 2.0.4 (Python's forecast::auto.arima equivalent) + * [shellingham](https://pypi.org/project/shellingham) 1.5.0.post1 (Tool to Detect Surrounding Shell) + * [swifter](https://pypi.org/project/swifter) 1.3.4 (A package which efficiently applies any function to a pandas dataframe or series in the fastest available manner) + * [tbats](https://pypi.org/project/tbats) 1.1.0 (BATS and TBATS for time series forecasting) + * [typer](https://pypi.org/project/typer) 0.12.3 (Typer, build great CLIs. Easy to code. Based on Python type hints.) + * [watchfiles](https://pypi.org/project/watchfiles) 0.21.0 (Simple, modern and high performance file watching and code reload in python.) + + +
+* * * diff --git a/changelogs/WinPythonslim-64bit-3.13.1.0.md b/changelogs/WinPythonslim-64bit-3.13.1.0.md new file mode 100644 index 00000000..dfaa9887 --- /dev/null +++ b/changelogs/WinPythonslim-64bit-3.13.1.0.md @@ -0,0 +1,504 @@ +## WinPython 3.13.1.0slim + +The following packages are included in WinPython-64bit v3.13.1.0slim . + +
+ +### Tools + +Name | Version | Description +-----|---------|------------ +[Pandoc](https://pandoc.org/) | 3.1.9 | a universal document converter + +### Python packages + +Name | Version | Description +-----|---------|------------ +[Python](http://www.python.org/) | 3.13.1 | Python programming language with standard library +[absl_py](https://pypi.org/project/absl_py) | 2.0.0 | Abseil Python Common Libraries, see https://github.com/abseil/abseil-py. +[adbc_driver_manager](https://pypi.org/project/adbc_driver_manager) | 1.3.0 | A generic entrypoint for ADBC drivers. +[adodbapi](https://pypi.org/project/adodbapi) | 2.6.1.3 | A pure Python package implementing PEP 249 DB-API using Microsoft ADO. +[aiofiles](https://pypi.org/project/aiofiles) | 23.2.1 | File support for asyncio. +[aiohappyeyeballs](https://pypi.org/project/aiohappyeyeballs) | 2.4.4 | Happy Eyeballs for asyncio +[aiohttp](https://pypi.org/project/aiohttp) | 3.11.11 | Async http client/server framework (asyncio) +[aiosignal](https://pypi.org/project/aiosignal) | 1.3.1 | aiosignal: a list of registered asynchronous callbacks +[aiosqlite](https://pypi.org/project/aiosqlite) | 0.20.0 | asyncio bridge to the standard sqlite3 module +[alabaster](https://pypi.org/project/alabaster) | 0.7.16 | A light, configurable Sphinx theme +[alembic](https://pypi.org/project/alembic) | 1.13.1 | A database migration tool for SQLAlchemy. +[altair](https://pypi.org/project/altair) | 5.5.0 | Vega-Altair: A declarative statistical visualization library for Python. +[aniso8601](https://pypi.org/project/aniso8601) | 9.0.1 | A library for parsing ISO 8601 strings. +[annotated_types](https://pypi.org/project/annotated_types) | 0.6.0 | Reusable constraint types to use with typing.Annotated +[ansicolors](https://pypi.org/project/ansicolors) | 1.1.8 | ANSI colors for Python +[anthropic](https://pypi.org/project/anthropic) | 0.42.0 | The official Python library for the anthropic API +[anyio](https://pypi.org/project/anyio) | 4.7.0 | High level compatibility layer for multiple asynchronous event loop implementations +[anywidget](https://pypi.org/project/anywidget) | 0.9.12 | custom jupyter widgets made easy +[appdirs](https://pypi.org/project/appdirs) | 1.4.4 | A small Python module for determining appropriate platform-specific dirs, e.g. a "user data dir". +[argon2_cffi](https://pypi.org/project/argon2_cffi) | 23.1.0 | Argon2 for Python +[argon2_cffi_bindings](https://pypi.org/project/argon2_cffi_bindings) | 21.2.0 | Low-level CFFI bindings for Argon2 +[array_api_compat](https://pypi.org/project/array_api_compat) | 1.8 | A wrapper around NumPy and other array libraries to make them compatible with the Array API standard +[arrow](https://pypi.org/project/arrow) | 1.3.0 | Better dates & times for Python +[asgi_csrf](https://pypi.org/project/asgi_csrf) | 0.9 | ASGI middleware for protecting against CSRF attacks +[asgiref](https://pypi.org/project/asgiref) | 3.8.1 | ASGI specs, helper code, and adapters +[asn1crypto](https://pypi.org/project/asn1crypto) | 1.5.1 | Fast ASN.1 parser and serializer with definitions for private keys, public keys, certificates, CRL, OCSP, CMS, PKCS#3, PKCS#7, PKCS#8, PKCS#12, +[asteval](https://pypi.org/project/asteval) | 0.9.31 | Safe, minimalistic evaluator of python expression using ast module +[astroid](https://pypi.org/project/astroid) | 3.1.0 | An abstract syntax tree for Python with inference support. +[astropy](https://pypi.org/project/astropy) | 6.1.6 | Astronomy and astrophysics core library +[astropy_iers_data](https://pypi.org/project/astropy_iers_data) | 0.2024.12.23.0.33.24 | IERS Earth Rotation and Leap Second tables for the astropy core package +[asttokens](https://pypi.org/project/asttokens) | 2.4.1 | Annotate AST trees with source code positions +[async_lru](https://pypi.org/project/async_lru) | 2.0.4 | Simple LRU cache for asyncio +[atomicwrites](https://pypi.org/project/atomicwrites) | 1.4.0 | Atomic file writes. +[attrs](https://pypi.org/project/attrs) | 23.2.0 | Classes Without Boilerplate +[autopep8](https://pypi.org/project/autopep8) | 2.0.4 | A tool that automatically formats Python code to conform to the PEP 8 style guide +[azure_core](https://pypi.org/project/azure_core) | 1.30.2 | Microsoft Azure Core Library for Python +[azure_cosmos](https://pypi.org/project/azure_cosmos) | 4.7.0 | Microsoft Azure Cosmos Client Library for Python +[azure_identity](https://pypi.org/project/azure_identity) | 1.16.1 | Microsoft Azure Identity Library for Python +[babel](https://pypi.org/project/babel) | 2.16.0 | Internationalization utilities +[baresql](https://pypi.org/project/baresql) | 0.8.0 | playing SQL directly on Python datas +[bcrypt](https://pypi.org/project/bcrypt) | 4.0.1 | Modern password hashing for your software and your servers +[beautifulsoup4](https://pypi.org/project/beautifulsoup4) | 4.12.2 | Screen-scraping library +[binaryornot](https://pypi.org/project/binaryornot) | 0.4.4 | Ultra-lightweight pure Python package to check if a file is binary or text. +[black](https://pypi.org/project/black) | 24.10.0 | The uncompromising code formatter. +[bleach](https://pypi.org/project/bleach) | 6.1.0 | An easy safelist-based HTML-sanitizing tool. +[blinker](https://pypi.org/project/blinker) | 1.7.0 | Fast, simple object-to-object and broadcast signaling +[bokeh](https://pypi.org/project/bokeh) | 3.6.1 | Interactive plots and applications in the browser from Python +[branca](https://pypi.org/project/branca) | 0.8.0 | Generate complex HTML+JS pages with Python +[brotli](https://pypi.org/project/brotli) | 1.1.0 | Python bindings for the Brotli compression library +[build](https://pypi.org/project/build) | 1.2.2.post1 | A simple, correct Python build frontend +[cachelib](https://pypi.org/project/cachelib) | 0.13.0 | A collection of cache libraries in the same API interface. +[cachetools](https://pypi.org/project/cachetools) | 5.4.0 | Extensible memoizing collections and decorators +[certifi](https://pypi.org/project/certifi) | 2024.6.2 | Python package for providing Mozilla's CA Bundle. +[cffi](https://pypi.org/project/cffi) | 1.17.1 | Foreign Function Interface for Python calling C code. +[chardet](https://pypi.org/project/chardet) | 5.2.0 | Universal encoding detector for Python 3 +[charset_normalizer](https://pypi.org/project/charset_normalizer) | 3.4.0 | The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet. +[clarabel](https://pypi.org/project/clarabel) | 0.9.0 | Clarabel Conic Interior Point Solver for Rust / Python +[click](https://pypi.org/project/click) | 8.1.7 | Composable command line interface toolkit +[click_default_group](https://pypi.org/project/click_default_group) | 1.2.4 | click_default_group +[cloudpickle](https://pypi.org/project/cloudpickle) | 3.0.0 | Pickler class to extend the standard pickle.Pickler functionality +[colorama](https://pypi.org/project/colorama) | 0.4.6 | Cross-platform colored terminal text. +[colorcet](https://pypi.org/project/colorcet) | 3.1.0 | Collection of perceptually uniform colormaps +[colorlog](https://pypi.org/project/colorlog) | 6.8.2 | Add colours to the output of Python's logging module. +[comm](https://pypi.org/project/comm) | 0.2.2 | Jupyter Python Comm implementation, for usage in ipykernel, xeus-python etc. +[contourpy](https://pypi.org/project/contourpy) | 1.3.1 | Python library for calculating contours of 2D quadrilateral grids +[cookiecutter](https://pypi.org/project/cookiecutter) | 2.6.0 | A command-line utility that creates projects from project templates, e.g +[cryptography](https://pypi.org/project/cryptography) | 41.0.5 | cryptography is a package which provides cryptographic recipes and primitives to Python developers. +[cvxopt](https://pypi.org/project/cvxopt) | 1.3.2 | Convex optimization package +[cycler](https://pypi.org/project/cycler) | 0.12.1 | Composable style cycles +[cython](https://pypi.org/project/cython) | 3.0.11 | The Cython compiler for writing C extensions in the Python language. +[dask](https://pypi.org/project/dask) | 2024.12.1 | Parallel PyData with Task Scheduling +[dask_expr](https://pypi.org/project/dask_expr) | 1.1.21 | High Level Expressions for Dask +[datasette](https://pypi.org/project/datasette) | 0.64.8 | An open source multi-tool for exploring and publishing data +[datasette_graphql](https://pypi.org/project/datasette_graphql) | 2.2 | Datasette plugin providing an automatic GraphQL API for your SQLite databases +[datashader](https://pypi.org/project/datashader) | 0.16.3 | Data visualization toolchain based on aggregating into a grid +[db_py](https://pypi.org/project/db_py) | 0.5.4b1 | a db package that doesn't suck +[debugpy](https://pypi.org/project/debugpy) | 1.8.0 | An implementation of the Debug Adapter Protocol for Python +[decorator](https://pypi.org/project/decorator) | 5.1.1 | Decorators for Humans +[defusedxml](https://pypi.org/project/defusedxml) | 0.7.1 | XML bomb protection for Python stdlib modules +[diff_match_patch](https://pypi.org/project/diff_match_patch) | 20230430 | Diff Match and Patch +[dill](https://pypi.org/project/dill) | 0.3.7 | serialize all of Python +[distributed](https://pypi.org/project/distributed) | 2024.12.1 | Distributed scheduler for Dask +[distro](https://pypi.org/project/distro) | 1.8.0 | Distro - an OS platform information API +[django](https://pypi.org/project/django) | 5.0.7 | A high-level Python web framework that encourages rapid development and clean, pragmatic design. +[dnspython](https://pypi.org/project/dnspython) | 2.6.1 | DNS toolkit +[docopt](https://pypi.org/project/docopt) | 0.6.2 | Pythonic argument parser, that will make you smile +[docstring_to_markdown](https://pypi.org/project/docstring_to_markdown) | 0.13 | On the fly conversion of Python docstrings to markdown +[docutils](https://pypi.org/project/docutils) | 0.20.1 | Docutils -- Python Documentation Utilities +[duckdb](https://pypi.org/project/duckdb) | 1.1.3 | DuckDB in-process database +[entrypoints](https://pypi.org/project/entrypoints) | 0.4 | Discover and load entry points from installed packages. +[et_xmlfile](https://pypi.org/project/et_xmlfile) | 1.1.0 | An implementation of lxml.xmlfile for the standard library +[eval_type_backport](https://pypi.org/project/eval_type_backport) | 0.2.2 | Like `typing._eval_type`, but lets older Python versions use newer typing features. +[executing](https://pypi.org/project/executing) | 2.0.1 | Get the currently executing AST node of a frame, and other information +[fast_histogram](https://pypi.org/project/fast_histogram) | 0.14 | Fast simple 1D and 2D histograms +[fastapi](https://pypi.org/project/fastapi) | 0.115.6 | FastAPI framework, high performance, easy to learn, fast to code, ready for production +[fastjsonschema](https://pypi.org/project/fastjsonschema) | 2.18.0 | Fastest Python implementation of JSON schema +[filelock](https://pypi.org/project/filelock) | 3.14.0 | A platform independent file lock. +[filterpy](https://pypi.org/project/filterpy) | 1.4.5 | Kalman filtering and optimal estimation library +[flake8](https://pypi.org/project/flake8) | 7.1.1 | the modular source code checker: pep8 pyflakes and co +[flask](https://pypi.org/project/flask) | 3.0.3 | A simple framework for building complex web applications. +[flask_mail](https://pypi.org/project/flask_mail) | 0.9.1 | Flask extension for sending email +[flask_session](https://pypi.org/project/flask_session) | 0.5.0 | Server-side session support for Flask +[flask_sqlalchemy](https://pypi.org/project/flask_sqlalchemy) | 3.0.5 | Add SQLAlchemy support to your Flask application. +[flit](https://pypi.org/project/flit) | 3.9.0 | A simple packaging tool for simple packages. +[flit_core](https://pypi.org/project/flit_core) | 3.9.0 | Distribution-building parts of Flit. See flit package for more information +[folium](https://pypi.org/project/folium) | 0.18.0 | Make beautiful maps with Leaflet.js & Python +[fonttools](https://pypi.org/project/fonttools) | 4.55.3 | Tools to manipulate font files +[formlayout](https://pypi.org/project/formlayout) | 1.2.1a1 | The most easy way to create Qt form dialogs and widgets with Python +[fqdn](https://pypi.org/project/fqdn) | 1.5.1 | Validates fully-qualified domain names against RFC 1123, so that they are acceptable to modern bowsers +[frozenlist](https://pypi.org/project/frozenlist) | 1.5.0 | A list-like structure which implements collections.abc.MutableSequence +[fsspec](https://pypi.org/project/fsspec) | 2024.6.1 | File-system specification +[future](https://pypi.org/project/future) | 0.18.2 | Clean single-source support for Python 3 and 2 +[fuzzywuzzy](https://pypi.org/project/fuzzywuzzy) | 0.18.0 | Fuzzy string matching in python +[geographiclib](https://pypi.org/project/geographiclib) | 2.0 | The geodesic routines from GeographicLib +[geopy](https://pypi.org/project/geopy) | 2.4.1 | Python Geocoding Toolbox +[gitdb](https://pypi.org/project/gitdb) | 4.0.10 | Git Object Database +[gitpython](https://pypi.org/project/gitpython) | 3.1.32 | GitPython is a Python library used to interact with Git repositories +[google_auth](https://pypi.org/project/google_auth) | 2.37.0 | Google Authentication Library +[graphene](https://pypi.org/project/graphene) | 3.3 | GraphQL Framework for Python +[graphql_core](https://pypi.org/project/graphql_core) | 3.2.3 | GraphQL implementation for Python, a port of GraphQL.js, the JavaScript reference implementation for GraphQL. +[graphql_relay](https://pypi.org/project/graphql_relay) | 3.2.0 | Relay library for graphql-core +[greenlet](https://pypi.org/project/greenlet) | 3.1.1 | Lightweight in-process concurrent programming +[griffe](https://pypi.org/project/griffe) | 1.5.4 | Signatures for entire Python programs +[groq](https://pypi.org/project/groq) | 0.13.1 | The official Python library for the groq API +[guidata](https://pypi.org/project/guidata) | 3.7.1 | Automatic GUI generation for easy dataset editing and display +[h11](https://pypi.org/project/h11) | 0.14.0 | A pure-Python, bring-your-own-I/O implementation of HTTP/1.1 +[h2](https://pypi.org/project/h2) | 4.1.0 | HTTP/2 State-Machine based protocol implementation +[h5py](https://pypi.org/project/h5py) | 3.12.1 | Read and write HDF5 files from Python +[hatchling](https://pypi.org/project/hatchling) | 1.27.0 | Modern, extensible Python build backend +[holoviews](https://pypi.org/project/holoviews) | 1.20.0 | A high-level plotting API for the PyData ecosystem built on HoloViews. +[hpack](https://pypi.org/project/hpack) | 4.0.0 | Pure-Python HPACK header compression +[html5lib](https://pypi.org/project/html5lib) | 1.1 | HTML parser based on the WHATWG HTML specification +[httpcore](https://pypi.org/project/httpcore) | 1.0.5 | A minimal low-level HTTP client. +[httpie](https://pypi.org/project/httpie) | 3.2.4 | HTTPie: modern, user-friendly command-line HTTP client for the API era. +[httpx](https://pypi.org/project/httpx) | 0.27.2 | The next generation HTTP client. +[huggingface_hub](https://pypi.org/project/huggingface_hub) | 0.27.0 | Client library to download and publish models, datasets and other repos on the huggingface.co hub +[hupper](https://pypi.org/project/hupper) | 1.12 | Integrated process monitor for developing and reloading daemons. +[hvplot](https://pypi.org/project/hvplot) | 0.11.2 | A high-level plotting API for the PyData ecosystem built on HoloViews. +[hypercorn](https://pypi.org/project/hypercorn) | 0.16.0 | A ASGI Server based on Hyper libraries and inspired by Gunicorn +[hyperframe](https://pypi.org/project/hyperframe) | 6.0.1 | HTTP/2 framing layer for Python +[hypothesis](https://pypi.org/project/hypothesis) | 6.108.5 | A library for property-based testing +[idna](https://pypi.org/project/idna) | 3.7 | Internationalized Domain Names in Applications (IDNA) +[imageio](https://pypi.org/project/imageio) | 2.33.1 | Library for reading and writing a wide range of image, video, scientific, and volumetric data formats. +[imagesize](https://pypi.org/project/imagesize) | 1.4.1 | Getting image size from png/jpeg/jpeg2000/gif file +[imbalanced_learn](https://pypi.org/project/imbalanced_learn) | 0.12.3 | Toolbox for imbalanced dataset in machine learning. +[importlib_metadata](https://pypi.org/project/importlib_metadata) | 7.1.0 | Read metadata from Python packages +[inflection](https://pypi.org/project/inflection) | 0.5.1 | A port of Ruby on Rails inflector to Python +[iniconfig](https://pypi.org/project/iniconfig) | 2.0.0 | brain-dead simple config-ini parsing +[intervaltree](https://pypi.org/project/intervaltree) | 3.0.2 | Editable interval tree data structure for Python 2 and 3 +[ipycanvas](https://pypi.org/project/ipycanvas) | 0.13.2 | Interactive widgets library exposing the browser's Canvas API +[ipykernel](https://pypi.org/project/ipykernel) | 6.29.5 | IPython Kernel for Jupyter +[ipyleaflet](https://pypi.org/project/ipyleaflet) | 0.19.2 | A Jupyter widget for dynamic Leaflet maps +[ipympl](https://pypi.org/project/ipympl) | 0.9.4 | Matplotlib Jupyter Extension +[ipython](https://pypi.org/project/ipython) | 8.26.0 | IPython: Productive Interactive Computing +[ipython_genutils](https://pypi.org/project/ipython_genutils) | 0.2.0 | Vestigial utilities from IPython +[ipython_sql](https://pypi.org/project/ipython_sql) | 0.5.0 | RDBMS access via IPython +[ipywidgets](https://pypi.org/project/ipywidgets) | 8.1.5 | Jupyter interactive widgets +[isoduration](https://pypi.org/project/isoduration) | 20.11.0 | Operations with ISO 8601 durations +[isort](https://pypi.org/project/isort) | 5.13.2 | A Python utility / library to sort Python imports. +[itsdangerous](https://pypi.org/project/itsdangerous) | 2.2.0 | Safely pass data to untrusted environments and back. +[janus](https://pypi.org/project/janus) | 1.0.0 | Mixed sync-async queue to interoperate between asyncio tasks and classic threads +[jaraco_classes](https://pypi.org/project/jaraco_classes) | 3.4.0 | Utility functions for Python class constructs +[jaraco_context](https://pypi.org/project/jaraco_context) | 5.3.0 | Useful decorators and context managers +[jaraco_functools](https://pypi.org/project/jaraco_functools) | 4.0.1 | Functools like those found in stdlib +[jedi](https://pypi.org/project/jedi) | 0.19.1 | An autocompletion tool for Python that can be used for text editors. +[jellyfish](https://pypi.org/project/jellyfish) | 1.1.3 | Approximate and phonetic matching of strings. +[jinja2](https://pypi.org/project/jinja2) | 3.1.2 | A very fast and expressive template engine. +[jiter](https://pypi.org/project/jiter) | 0.8.2 | Fast iterable JSON parser. +[joblib](https://pypi.org/project/joblib) | 1.4.2 | Lightweight pipelining with Python functions +[json5](https://pypi.org/project/json5) | 0.9.14 | A Python implementation of the JSON5 data format. +[jsonpatch](https://pypi.org/project/jsonpatch) | 1.33 | Apply JSON-Patches (RFC 6902) +[jsonpath_python](https://pypi.org/project/jsonpath_python) | 1.0.6 | A more powerful JSONPath implementation in modern python +[jsonpointer](https://pypi.org/project/jsonpointer) | 2.4 | Identify specific nodes in a JSON document (RFC 6901) +[jsonschema](https://pypi.org/project/jsonschema) | 4.19.2 | An implementation of JSON Schema validation for Python +[jsonschema_specifications](https://pypi.org/project/jsonschema_specifications) | 2023.12.1 | The JSON Schema meta-schemas and vocabularies, exposed as a Registry +[julia](https://pypi.org/project/julia) | 0.6.2 | Julia/Python bridge with IPython support. +[jupyter](https://pypi.org/project/jupyter) | 1.1.1 | Jupyter metapackage. Install all the Jupyter components in one go. +[jupyter_bokeh](https://pypi.org/project/jupyter_bokeh) | 4.0.5 | A Jupyter extension for rendering Bokeh content. +[jupyter_client](https://pypi.org/project/jupyter_client) | 8.6.2 | Jupyter protocol implementation and client libraries +[jupyter_console](https://pypi.org/project/jupyter_console) | 6.6.3 | Jupyter terminal console +[jupyter_core](https://pypi.org/project/jupyter_core) | 5.7.2 | Jupyter core package. A base package on which Jupyter projects rely. +[jupyter_events](https://pypi.org/project/jupyter_events) | 0.10.0 | Jupyter Event System library +[jupyter_leaflet](https://pypi.org/project/jupyter_leaflet) | 0.19.2 | ipyleaflet extensions for JupyterLab and Jupyter Notebook +[jupyter_lsp](https://pypi.org/project/jupyter_lsp) | 2.2.5 | Multi-Language Server WebSocket proxy for Jupyter Notebook/Lab server +[jupyter_server](https://pypi.org/project/jupyter_server) | 2.14.2 | The backend—i.e. core services, APIs, and REST endpoints—to Jupyter web applications. +[jupyter_server_terminals](https://pypi.org/project/jupyter_server_terminals) | 0.5.3 | A Jupyter Server Extension Providing Terminals. +[jupyterlab](https://pypi.org/project/jupyterlab) | 4.3.4 | JupyterLab computational environment +[jupyterlab_pygments](https://pypi.org/project/jupyterlab_pygments) | 0.3.0 | Pygments theme using JupyterLab CSS variables +[jupyterlab_server](https://pypi.org/project/jupyterlab_server) | 2.27.3 | A set of server components for JupyterLab and JupyterLab like applications. +[jupyterlab_widgets](https://pypi.org/project/jupyterlab_widgets) | 3.0.13 | Jupyter interactive widgets for JupyterLab +[keras](https://pypi.org/project/keras) | 3.7.0 | Multi-backend Keras +[keyring](https://pypi.org/project/keyring) | 25.2.1 | Store and access your passwords safely. +[kiwisolver](https://pypi.org/project/kiwisolver) | 1.4.7 | A fast implementation of the Cassowary constraint solver +[langchain](https://pypi.org/project/langchain) | 0.3.13 | Building applications with LLMs through composability +[langchain_core](https://pypi.org/project/langchain_core) | 0.3.28 | Building applications with LLMs through composability +[langchain_text_splitters](https://pypi.org/project/langchain_text_splitters) | 0.3.4 | LangChain text splitting utilities +[langsmith](https://pypi.org/project/langsmith) | 0.2.6 | Client library to connect to the LangSmith LLM Tracing and Evaluation Platform. +[lazy_loader](https://pypi.org/project/lazy_loader) | 0.4 | Makes it easy to load subpackages and functions on demand. +[linkify_it_py](https://pypi.org/project/linkify_it_py) | 2.0.2 | Links recognition library with FULL unicode support. +[llvmlite](https://pypi.org/project/llvmlite) | 0.44.0rc2 | lightweight wrapper around basic LLVM functionality +[lmfit](https://pypi.org/project/lmfit) | 1.3.1 | Least-Squares Minimization with Bounds and Constraints +[locket](https://pypi.org/project/locket) | 1.0.0 | File-based locks for Python on Linux and Windows +[logfire_api](https://pypi.org/project/logfire_api) | 2.11.0 | Shim for the Logfire SDK which does nothing unless Logfire is installed +[lxml](https://pypi.org/project/lxml) | 5.3.0 | Powerful and Pythonic XML processing library combining libxml2/libxslt with the ElementTree API. +[mako](https://pypi.org/project/mako) | 1.3.5 | A super-fast templating language that borrows the best ideas from the existing templating languages. +[markdown](https://pypi.org/project/markdown) | 3.5.1 | Python implementation of John Gruber's Markdown. +[markdown_it_py](https://pypi.org/project/markdown_it_py) | 2.2.0 | Python port of markdown-it. Markdown parsing, done right! +[markupsafe](https://pypi.org/project/markupsafe) | 2.1.1 | Safely add untrusted strings to HTML/XML markup. +[matplotlib](https://pypi.org/project/matplotlib) | 3.10.0 | Python plotting package +[matplotlib_inline](https://pypi.org/project/matplotlib_inline) | 0.1.7 | Inline Matplotlib backend for Jupyter +[maturin](https://pypi.org/project/maturin) | 1.7.0 | Build and publish crates with pyo3, cffi and uniffi bindings as well as rust binaries as python packages +[mccabe](https://pypi.org/project/mccabe) | 0.7.0 | McCabe checker, plugin for flake8 +[mdit_py_plugins](https://pypi.org/project/mdit_py_plugins) | 0.3.5 | Collection of plugins for markdown-it-py +[mdurl](https://pypi.org/project/mdurl) | 0.1.2 | Markdown URL utilities +[mercantile](https://pypi.org/project/mercantile) | 1.2.1 | Web mercator XYZ tile utilities +[mergedeep](https://pypi.org/project/mergedeep) | 1.3.4 | A deep merge function for 🐍. +[missingno](https://pypi.org/project/missingno) | 0.5.1 | Missing data visualization module for Python. +[mistralai](https://pypi.org/project/mistralai) | 1.2.5 | Python Client SDK for the Mistral AI API. +[mistune](https://pypi.org/project/mistune) | 2.0.5 | A sane Markdown parser with useful plugins and renderers +[mizani](https://pypi.org/project/mizani) | 0.11.4 | Scales for Python +[ml_dtypes](https://pypi.org/project/ml_dtypes) | 0.5.0 | +[mlxtend](https://pypi.org/project/mlxtend) | 0.22.0 | Machine Learning Library Extensions +[more_itertools](https://pypi.org/project/more_itertools) | 10.2.0 | More routines for operating on iterables, beyond itertools +[mpl_scatter_density](https://pypi.org/project/mpl_scatter_density) | 0.7 | Matplotlib helpers to make density scatter plots +[mpld3](https://pypi.org/project/mpld3) | 0.5.8 | D3 Viewer for Matplotlib +[mpmath](https://pypi.org/project/mpmath) | 1.3.0 | Python library for arbitrary-precision floating-point arithmetic +[msal](https://pypi.org/project/msal) | 1.30.0 | The Microsoft Authentication Library (MSAL) for Python library enables your app to access the Microsoft Cloud by supporting authentication of us +[msal_extensions](https://pypi.org/project/msal_extensions) | 1.2.0 | Microsoft Authentication Library extensions (MSAL EX) provides a persistence API that can save your data on disk, encrypted on Windows, macOS an +[msgpack](https://pypi.org/project/msgpack) | 1.0.4 | MessagePack serializer +[multidict](https://pypi.org/project/multidict) | 6.1.0 | multidict implementation +[multipledispatch](https://pypi.org/project/multipledispatch) | 1.0.0 | Multiple dispatch +[mutagen](https://pypi.org/project/mutagen) | 1.47.0 | read and write audio tags for many formats +[mypy](https://pypi.org/project/mypy) | 1.14.0 | Optional static typing for Python +[mypy_extensions](https://pypi.org/project/mypy_extensions) | 1.0.0 | Type system extensions for programs checked with the mypy type checker. +[mysql_connector_python](https://pypi.org/project/mysql_connector_python) | 8.0.21 | MySQL driver written in Python +[namex](https://pypi.org/project/namex) | 0.0.8 | A simple utility to separate the implementation of your Python package and its public API surface. +[narwhals](https://pypi.org/project/narwhals) | 1.15.2 | Extremely lightweight compatibility layer between dataframe libraries +[nbclient](https://pypi.org/project/nbclient) | 0.10.0 | A client library for executing notebooks. Formerly nbconvert's ExecutePreprocessor. +[nbconvert](https://pypi.org/project/nbconvert) | 7.16.1 | Converting Jupyter Notebooks (.ipynb files) to other formats +[nbformat](https://pypi.org/project/nbformat) | 5.10.4 | The Jupyter Notebook format +[nest_asyncio](https://pypi.org/project/nest_asyncio) | 1.6.0 | Patch asyncio to allow nested event loops +[networkx](https://pypi.org/project/networkx) | 3.4.2 | Python package for creating and manipulating graphs and networks +[nltk](https://pypi.org/project/nltk) | 3.9.1 | Natural Language Toolkit +[notebook](https://pypi.org/project/notebook) | 7.3.1 | Jupyter Notebook - A web-based notebook environment for interactive computing +[notebook_shim](https://pypi.org/project/notebook_shim) | 0.2.4 | A shim layer for notebook traits and config +[ntlm_auth](https://pypi.org/project/ntlm_auth) | 1.5.0 | Creates NTLM authentication structures +[numba](https://pypi.org/project/numba) | 0.61.0rc2 | compiling Python code using LLVM +[numpy](https://pypi.org/project/numpy) | 2.1.3 | Fundamental package for array computing in Python +[numpydoc](https://pypi.org/project/numpydoc) | 1.6.0 | Sphinx extension to support docstrings in Numpy format +[openai](https://pypi.org/project/openai) | 1.58.1 | The official Python library for the openai API +[opencv_python](https://pypi.org/project/opencv_python) | 4.10.0.84 | Wrapper package for OpenCV python bindings. +[openpyxl](https://pypi.org/project/openpyxl) | 3.1.2 | A Python library to read/write Excel 2010 xlsx/xlsm files +[optree](https://pypi.org/project/optree) | 0.13.1 | Optimized PyTree Utilities. +[optuna](https://pypi.org/project/optuna) | 3.6.1 | A hyperparameter optimization framework +[orjson](https://pypi.org/project/orjson) | 3.10.12 | Fast, correct Python JSON library supporting dataclasses, datetimes, and numpy +[outcome](https://pypi.org/project/outcome) | 1.3.0.post0 | Capture the outcome of Python function calls. +[overrides](https://pypi.org/project/overrides) | 7.7.0 | A decorator to automatically detect mismatch when overriding a method. +[packaging](https://pypi.org/project/packaging) | 24.2 | Core utilities for Python packages +[pandas](https://pypi.org/project/pandas) | 2.2.3 | Powerful data structures for data analysis, time series, and statistics +[pandocfilters](https://pypi.org/project/pandocfilters) | 1.5.0 | Utilities for writing pandoc filters in python +[panel](https://pypi.org/project/panel) | 1.5.4 | The powerful data exploration & web app framework for Python. +[papermill](https://pypi.org/project/papermill) | 2.6.0 | Parameterize and run Jupyter and nteract Notebooks +[param](https://pypi.org/project/param) | 2.1.1 | Make your Python code clearer and more reliable by declaring Parameters. +[paramiko](https://pypi.org/project/paramiko) | 2.8.0 | SSH2 protocol library +[parso](https://pypi.org/project/parso) | 0.8.4 | A Python Parser +[partd](https://pypi.org/project/partd) | 1.4.0 | Appendable key-value storage +[pathspec](https://pypi.org/project/pathspec) | 0.11.0 | Utility library for gitignore style pattern matching of file paths. +[patsy](https://pypi.org/project/patsy) | 0.5.6 | A Python package for describing statistical models and for building design matrices. +[pdfrw](https://pypi.org/project/pdfrw) | 0.4.post2 | PDF file reader/writer library +[pep8](https://pypi.org/project/pep8) | 1.7.1 | Python style guide checker +[pexpect](https://pypi.org/project/pexpect) | 4.8.0 | Pexpect allows easy control of interactive console applications. +[pg8000](https://pypi.org/project/pg8000) | 1.23.0 | PostgreSQL interface library +[pickleshare](https://pypi.org/project/pickleshare) | 0.7.5 | Tiny 'shelve'-like database with concurrency support +[pillow](https://pypi.org/project/pillow) | 11.0.0 | Python Imaging Library (Fork) +[pint](https://pypi.org/project/pint) | 0.23 | Physical quantities module +[pip](https://pypi.org/project/pip) | 24.3.1 | The PyPA recommended tool for installing Python packages. +[pkginfo](https://pypi.org/project/pkginfo) | 1.11.2 | Query metadata from sdists / bdists / installed packages. +[platformdirs](https://pypi.org/project/platformdirs) | 4.2.2 | A small Python package for determining appropriate platform-specific dirs, e.g. a `user data dir`. +[plotly](https://pypi.org/project/plotly) | 5.24.1 | An open-source, interactive data visualization library for Python +[plotnine](https://pypi.org/project/plotnine) | 0.13.6 | A Grammar of Graphics for Python +[plotpy](https://pypi.org/project/plotpy) | 2.7.0 | Curve and image plotting tools for Python/Qt applications +[pluggy](https://pypi.org/project/pluggy) | 1.5.0 | plugin and hook calling mechanisms for python +[ply](https://pypi.org/project/ply) | 3.11 | Python Lex & Yacc +[polars](https://pypi.org/project/polars) | 1.18.0 | Blazingly fast DataFrame library +[portalocker](https://pypi.org/project/portalocker) | 2.7.0 | Wraps the portalocker recipe for easy usage +[ppci](https://pypi.org/project/ppci) | 0.5.9 | A compiler for ARM, X86, MSP430, xtensa and more implemented in pure Python +[prettytable](https://pypi.org/project/prettytable) | 3.3.0 | A simple Python library for easily displaying tabular data in a visually appealing ASCII table format +[priority](https://pypi.org/project/priority) | 2.0.0 | A pure-Python implementation of the HTTP/2 priority tree +[prometheus_client](https://pypi.org/project/prometheus_client) | 0.18.0 | Python client for the Prometheus monitoring system. +[prompt_toolkit](https://pypi.org/project/prompt_toolkit) | 3.0.48 | Library for building powerful interactive command lines in Python +[propcache](https://pypi.org/project/propcache) | 0.2.1 | Accelerated property cache +[protobuf](https://pypi.org/project/protobuf) | 5.27.3 | +[psutil](https://pypi.org/project/psutil) | 5.9.8 | Cross-platform lib for process and system monitoring in Python. +[psygnal](https://pypi.org/project/psygnal) | 0.11.1 | Fast python callback/event system modeled after Qt Signals +[ptpython](https://pypi.org/project/ptpython) | 3.0.29 | Python REPL build on top of prompt_toolkit +[ptyprocess](https://pypi.org/project/ptyprocess) | 0.7.0 | Run a subprocess in a pseudo terminal +[pure_eval](https://pypi.org/project/pure_eval) | 0.2.2 | Safely evaluate AST nodes without side effects +[pyarrow](https://pypi.org/project/pyarrow) | 18.1.0 | Python library for Apache Arrow +[pyasn1](https://pypi.org/project/pyasn1) | 0.4.8 | ASN.1 types and codecs +[pyasn1_modules](https://pypi.org/project/pyasn1_modules) | 0.2.8 | A collection of ASN.1-based protocols modules. +[pybars3](https://pypi.org/project/pybars3) | 0.9.7 | Handlebars.js templating for Python 3 and 2 +[pybind11](https://pypi.org/project/pybind11) | 2.13.6 | Seamless operability between C++11 and Python +[pycodestyle](https://pypi.org/project/pycodestyle) | 2.12.0 | Python style guide checker +[pycparser](https://pypi.org/project/pycparser) | 2.22 | C parser in Python +[pycryptodomex](https://pypi.org/project/pycryptodomex) | 3.20.0 | Cryptographic library for Python +[pyct](https://pypi.org/project/pyct) | 0.5.0 | Python package common tasks for users (e.g. copy examples, fetch data, ...) +[pydantic](https://pypi.org/project/pydantic) | 2.10.4 | Data validation using Python type hints +[pydantic_ai](https://pypi.org/project/pydantic_ai) | 0.0.15 | Agent Framework / shim to use Pydantic with LLMs +[pydantic_ai_slim](https://pypi.org/project/pydantic_ai_slim) | 0.0.15 | Agent Framework / shim to use Pydantic with LLMs, slim package +[pydantic_core](https://pypi.org/project/pydantic_core) | 2.27.2 | Core functionality for Pydantic validation and serialization +[pydeck](https://pypi.org/project/pydeck) | 0.9.1 | Widget for deck.gl maps +[pydocstyle](https://pypi.org/project/pydocstyle) | 6.3.0 | Python docstring style checker +[pydub](https://pypi.org/project/pydub) | 0.25.1 | Manipulate audio with an simple and easy high level interface +[pyerfa](https://pypi.org/project/pyerfa) | 2.0.1.4 | Python bindings for ERFA +[pyflakes](https://pypi.org/project/pyflakes) | 3.2.0 | passive checker of Python programs +[pygments](https://pypi.org/project/pygments) | 2.18.0 | Pygments is a syntax highlighting package written in Python. +[pyjwt](https://pypi.org/project/pyjwt) | 2.8.0 | JSON Web Token implementation in Python +[pylint](https://pypi.org/project/pylint) | 3.1.0 | python code static checker +[pylint_venv](https://pypi.org/project/pylint_venv) | 3.0.3 | pylint-venv provides a Pylint init-hook to use the same Pylint installation with different virtual environments. +[pyls_spyder](https://pypi.org/project/pyls_spyder) | 0.4.0 | Spyder extensions for the python-lsp-server +[pymeta3](https://pypi.org/project/pymeta3) | 0.5.1 | Pattern-matching language based on OMeta for Python 3 and 2 +[pymongo](https://pypi.org/project/pymongo) | 4.10.1 | Python driver for MongoDB +[pympler](https://pypi.org/project/pympler) | 1.0.1 | A development tool to measure, monitor and analyze the memory behavior of Python objects. +[pynacl](https://pypi.org/project/pynacl) | 1.5.0 | Python binding to the Networking and Cryptography (NaCl) library +[pynndescent](https://pypi.org/project/pynndescent) | 0.5.12 | Nearest Neighbor Descent +[pyodbc](https://pypi.org/project/pyodbc) | 5.2.0 | DB API module for ODBC +[pyomo](https://pypi.org/project/pyomo) | 6.8.0 | Pyomo: Python Optimization Modeling Objects +[pypandoc](https://pypi.org/project/pypandoc) | 1.5 | Thin wrapper for pandoc. +[pyparsing](https://pypi.org/project/pyparsing) | 3.1.2 | pyparsing module - Classes and methods to define and execute parsing grammars +[pypdf](https://pypi.org/project/pypdf) | 3.15.2 | A pure-python PDF library capable of splitting, merging, cropping, and transforming PDF files +[pypng](https://pypi.org/project/pypng) | 0.20220715.0 | Pure Python library for saving and loading PNG images +[pyproject_hooks](https://pypi.org/project/pyproject_hooks) | 1.1.0 | Wrappers to call pyproject.toml-based build backend hooks. +[pyqt5](https://pypi.org/project/pyqt5) | 5.15.10 | Python bindings for the Qt cross platform application toolkit +[pyqt5_qt5](https://pypi.org/project/pyqt5_qt5) | 5.15.2 | The subset of a Qt installation needed by PyQt5. +[pyqt5_sip](https://pypi.org/project/pyqt5_sip) | 12.16.1 | The sip module support for PyQt5 +[pyqtgraph](https://pypi.org/project/pyqtgraph) | 0.13.7 | Scientific Graphics and GUI Library for Python +[pyqtwebengine](https://pypi.org/project/pyqtwebengine) | 5.15.6 | Python bindings for the Qt WebEngine framework +[pyqtwebengine_qt5](https://pypi.org/project/pyqtwebengine_qt5) | 5.15.2 | The subset of a Qt installation needed by PyQtWebEngine. +[pyserial](https://pypi.org/project/pyserial) | 3.5 | Python Serial Port Extension +[pysimplegui](https://pypi.org/project/pysimplegui) | 4.60.4 | Python GUIs for Humans +[pysocks](https://pypi.org/project/pysocks) | 1.7.1 | A Python SOCKS client module. See https://github.com/Anorov/PySocks for more information. +[pytest](https://pypi.org/project/pytest) | 8.2.2 | pytest: simple powerful testing with Python +[python_barcode](https://pypi.org/project/python_barcode) | 0.15.1 | Create standard barcodes with Python. No external modules needed. (optional Pillow support included). +[python_dateutil](https://pypi.org/project/python_dateutil) | 2.8.2 | Extensions to the standard Python datetime module +[python_dotenv](https://pypi.org/project/python_dotenv) | 1.0.1 | Read key-value pairs from a .env file and set them as environment variables +[python_json_logger](https://pypi.org/project/python_json_logger) | 2.0.7 | A python library adding a json log formatter +[python_lsp_black](https://pypi.org/project/python_lsp_black) | 2.0.0 | Black plugin for the Python LSP Server +[python_lsp_jsonrpc](https://pypi.org/project/python_lsp_jsonrpc) | 1.1.2 | JSON RPC 2.0 server library +[python_lsp_server](https://pypi.org/project/python_lsp_server) | 1.12.0 | Python Language Server for the Language Server Protocol +[python_multipart](https://pypi.org/project/python_multipart) | 0.0.9 | A streaming multipart parser for Python +[python_slugify](https://pypi.org/project/python_slugify) | 8.0.4 | A Python slugify application that also handles Unicode +[pythonqwt](https://pypi.org/project/pythonqwt) | 0.14.2 | Qt plotting widgets for Python +[pytoolconfig](https://pypi.org/project/pytoolconfig) | 1.3.1 | Python tool configuration +[pytz](https://pypi.org/project/pytz) | 2024.1 | World timezone definitions, modern and historical +[pyviz_comms](https://pypi.org/project/pyviz_comms) | 3.0.3 | A JupyterLab extension for rendering HoloViz content. +[pywin32](https://pypi.org/project/pywin32) | 308 | Python for Window Extensions +[pywin32_ctypes](https://pypi.org/project/pywin32_ctypes) | 0.2.2 | A (partial) reimplementation of pywin32 using ctypes/cffi +[pywinpty](https://pypi.org/project/pywinpty) | 2.0.14 | Pseudo terminal support for Windows from Python. +[pywinusb](https://pypi.org/project/pywinusb) | 0.4.2 | A package that simplifies USB/HID communications on windows +[pyyaml](https://pypi.org/project/pyyaml) | 6.0.2 | YAML parser and emitter for Python +[pyzmq](https://pypi.org/project/pyzmq) | 26.2.0 | Python bindings for 0MQ +[qdarkstyle](https://pypi.org/project/qdarkstyle) | 3.2.3 | The most complete dark/light style sheet for C++/Python and Qt applications +[qrcode](https://pypi.org/project/qrcode) | 7.4.2 | QR Code image generator +[qstylizer](https://pypi.org/project/qstylizer) | 0.2.2 | Stylesheet Generator for PyQt{4-5}/PySide{1-2} +[qtawesome](https://pypi.org/project/qtawesome) | 1.3.1 | FontAwesome icons in PyQt and PySide applications +[qtconsole](https://pypi.org/project/qtconsole) | 5.5.2 | Jupyter Qt console +[qtpy](https://pypi.org/project/qtpy) | 2.4.1 | Provides an abstraction layer on top of the various Qt bindings (PyQt5/6 and PySide2/6). +[quantecon](https://pypi.org/project/quantecon) | 0.7.2 | Import the main names to top level. +[quart](https://pypi.org/project/quart) | 0.19.4 | A Python ASGI web microframework with the same API as Flask +[rapidfuzz](https://pypi.org/project/rapidfuzz) | 3.9.6 | rapid fuzzy string matching +[readme_renderer](https://pypi.org/project/readme_renderer) | 35.0 | readme_renderer is a library for rendering "readme" descriptions for Warehouse +[redis](https://pypi.org/project/redis) | 5.0.3 | Python client for Redis database and key-value store +[referencing](https://pypi.org/project/referencing) | 0.35.1 | JSON Referencing + Python +[regex](https://pypi.org/project/regex) | 2024.11.6 | Alternative regular expression module, to replace re. +[reportlab](https://pypi.org/project/reportlab) | 4.2.2 | The Reportlab Toolkit +[requests](https://pypi.org/project/requests) | 2.32.3 | Python HTTP for Humans. +[requests_ntlm](https://pypi.org/project/requests_ntlm) | 1.1.0 | This package allows for HTTP NTLM authentication using the requests library. +[requests_toolbelt](https://pypi.org/project/requests_toolbelt) | 1.0.0 | A utility belt for advanced users of python-requests +[rfc3339_validator](https://pypi.org/project/rfc3339_validator) | 0.1.4 | A pure python RFC3339 validator +[rfc3986](https://pypi.org/project/rfc3986) | 2.0.0 | Validating URI References per RFC 3986 +[rfc3986_validator](https://pypi.org/project/rfc3986_validator) | 0.1.1 | Pure python rfc3986 validator +[rich](https://pypi.org/project/rich) | 13.9.4 | Render rich text, tables, progress bars, syntax highlighting, markdown and more to the terminal +[rope](https://pypi.org/project/rope) | 1.12.0 | a python refactoring library... +[rpds_py](https://pypi.org/project/rpds_py) | 0.22.3 | Python bindings to Rust's persistent data structures (rpds) +[rsa](https://pypi.org/project/rsa) | 4.7.2 | Pure-Python RSA implementation +[rtree](https://pypi.org/project/rtree) | 1.1.0 | R-Tree spatial index for Python GIS +[rx](https://pypi.org/project/rx) | 3.1.1 | Reactive Extensions (Rx) for Python +[scikit_image](https://pypi.org/project/scikit_image) | 0.25.0 | Image processing in Python +[scikit_learn](https://pypi.org/project/scikit_learn) | 1.6.0 | A set of python modules for machine learning and data mining +[scipy](https://pypi.org/project/scipy) | 1.14.1 | Fundamental algorithms for scientific computing in Python +[scramp](https://pypi.org/project/scramp) | 1.4.1 | An implementation of the SCRAM protocol. +[seaborn](https://pypi.org/project/seaborn) | 0.13.2 | Statistical data visualization +[send2trash](https://pypi.org/project/send2trash) | 1.8.2 | Send file to trash natively under Mac OS X, Windows and Linux +[setuptools](https://pypi.org/project/setuptools) | 75.6.0 | Easily download, build, install, upgrade, and uninstall Python packages +[simplegeneric](https://pypi.org/project/simplegeneric) | 0.8.1 | Simple generic functions (similar to Python's own len(), pickle.dump(), etc.) +[simplejson](https://pypi.org/project/simplejson) | 3.19.3 | Simple, fast, extensible JSON encoder/decoder for Python +[simpy](https://pypi.org/project/simpy) | 4.0.1 | Event discrete, process based simulation for Python. +[six](https://pypi.org/project/six) | 1.16.0 | Python 2 and 3 compatibility utilities +[smmap](https://pypi.org/project/smmap) | 5.0.0 | A pure Python implementation of a sliding window memory map manager +[sniffio](https://pypi.org/project/sniffio) | 1.3.0 | Sniff out which async library your code is running under +[snowballstemmer](https://pypi.org/project/snowballstemmer) | 2.2.0 | This package provides 29 stemmers for 28 languages generated from Snowball algorithms. +[sortedcontainers](https://pypi.org/project/sortedcontainers) | 2.4.0 | Sorted Containers -- Sorted List, Sorted Dict, Sorted Set +[sounddevice](https://pypi.org/project/sounddevice) | 0.4.6 | Play and Record Sound with Python +[soupsieve](https://pypi.org/project/soupsieve) | 2.5 | A modern CSS selector implementation for Beautiful Soup. +[sphinx](https://pypi.org/project/sphinx) | 7.3.7 | Python documentation generator +[sphinx_rtd_theme](https://pypi.org/project/sphinx_rtd_theme) | 2.0.0 | Read the Docs theme for Sphinx +[sphinxcontrib_applehelp](https://pypi.org/project/sphinxcontrib_applehelp) | 1.0.8 | sphinxcontrib-applehelp is a Sphinx extension which outputs Apple help books +[sphinxcontrib_devhelp](https://pypi.org/project/sphinxcontrib_devhelp) | 1.0.6 | sphinxcontrib-devhelp is a sphinx extension which outputs Devhelp documents +[sphinxcontrib_htmlhelp](https://pypi.org/project/sphinxcontrib_htmlhelp) | 2.0.5 | sphinxcontrib-htmlhelp is a sphinx extension which renders HTML help files +[sphinxcontrib_jquery](https://pypi.org/project/sphinxcontrib_jquery) | 4.1 | Extension to include jQuery on newer Sphinx releases +[sphinxcontrib_jsmath](https://pypi.org/project/sphinxcontrib_jsmath) | 1.0.1 | A sphinx extension which renders display math in HTML via JavaScript +[sphinxcontrib_qthelp](https://pypi.org/project/sphinxcontrib_qthelp) | 1.0.7 | sphinxcontrib-qthelp is a sphinx extension which outputs QtHelp documents +[sphinxcontrib_serializinghtml](https://pypi.org/project/sphinxcontrib_serializinghtml) | 1.1.9 | sphinxcontrib-serializinghtml is a sphinx extension which outputs "serialized" HTML files (json and pickle) +[spyder](https://pypi.org/project/spyder) | 5.5.6 | The Scientific Python Development Environment +[spyder_kernels](https://pypi.org/project/spyder_kernels) | 2.5.2 | Jupyter kernels for Spyder's console +[sqlalchemy](https://pypi.org/project/sqlalchemy) | 2.0.35 | Database Abstraction Library +[sqlite_bro](https://pypi.org/project/sqlite_bro) | 0.13.1 | a graphic SQLite Client in 1 Python file +[sqlite_fts4](https://pypi.org/project/sqlite_fts4) | 1.0.3 | Python functions for working with SQLite FTS4 search +[sqlite_utils](https://pypi.org/project/sqlite_utils) | 3.37 | CLI tool and Python library for manipulating SQLite databases +[sqlparse](https://pypi.org/project/sqlparse) | 0.4.3 | A non-validating SQL parser. +[sspyrs](https://pypi.org/project/sspyrs) | 0.3 | Lightweight interface for SSRS reports to python +[stack_data](https://pypi.org/project/stack_data) | 0.6.3 | Extract data from python stack frames and tracebacks for informative displays +[starlette](https://pypi.org/project/starlette) | 0.41.3 | The little ASGI library that shines. +[statsmodels](https://pypi.org/project/statsmodels) | 0.14.4 | Statistical computations and models for Python +[streamlit](https://pypi.org/project/streamlit) | 1.41.1 | A faster way to build and share data apps +[streamz](https://pypi.org/project/streamz) | 0.6.3 | Streams +[sympy](https://pypi.org/project/sympy) | 1.13.2 | Computer algebra system (CAS) in Python +[tabulate](https://pypi.org/project/tabulate) | 0.9.0 | Pretty-print tabular data +[tblib](https://pypi.org/project/tblib) | 3.0.0 | Traceback serialization library. +[tenacity](https://pypi.org/project/tenacity) | 8.5.0 | Retry code until it succeeds +[terminado](https://pypi.org/project/terminado) | 0.18.1 | Tornado websocket backend for the Xterm.js Javascript terminal emulator library. +[text_unidecode](https://pypi.org/project/text_unidecode) | 1.3 | The most basic Text::Unidecode port +[textdistance](https://pypi.org/project/textdistance) | 4.6.2 | Compute distance between the two texts. +[threadpoolctl](https://pypi.org/project/threadpoolctl) | 3.5.0 | threadpoolctl +[three_merge](https://pypi.org/project/three_merge) | 0.1.1 | Simple library for merging two strings with respect to a base one +[tifffile](https://pypi.org/project/tifffile) | 2024.7.2 | Read and write TIFF files +[tinycss2](https://pypi.org/project/tinycss2) | 1.3.0 | A tiny CSS parser +[toml](https://pypi.org/project/toml) | 0.10.2 | Python Library for Tom's Obvious, Minimal Language +[tomli](https://pypi.org/project/tomli) | 2.0.1 | A lil' TOML parser +[tomli_w](https://pypi.org/project/tomli_w) | 1.0.0 | A lil' TOML writer +[tomlkit](https://pypi.org/project/tomlkit) | 0.12.3 | Style preserving TOML library +[toolz](https://pypi.org/project/toolz) | 0.12.0 | List processing tools and functional utilities +[tornado](https://pypi.org/project/tornado) | 6.4.1 | Tornado is a Python web framework and asynchronous networking library, originally developed at FriendFeed. +[tqdm](https://pypi.org/project/tqdm) | 4.66.4 | Fast, Extensible Progress Meter +[traitlets](https://pypi.org/project/traitlets) | 5.14.1 | Traitlets Python configuration system +[traittypes](https://pypi.org/project/traittypes) | 0.2.1 | Scipy trait types +[trio](https://pypi.org/project/trio) | 0.27.0 | A friendly Python library for async concurrency and I/O +[trove_classifiers](https://pypi.org/project/trove_classifiers) | 2024.10.21.16 | Canonical source for classifiers on PyPI (pypi.org). +[twine](https://pypi.org/project/twine) | 4.0.1 | Collection of utilities for publishing packages on PyPI +[types_python_dateutil](https://pypi.org/project/types_python_dateutil) | 2.9.0.20240316 | Typing stubs for python-dateutil +[typing_extensions](https://pypi.org/project/typing_extensions) | 4.12.2 | Backported and Experimental Type Hints for Python 3.8+ +[typing_inspect](https://pypi.org/project/typing_inspect) | 0.9.0 | Runtime inspection utilities for typing module. +[tzdata](https://pypi.org/project/tzdata) | 2024.1 | Provider of IANA time zone data +[tzlocal](https://pypi.org/project/tzlocal) | 5.2 | tzinfo object for the local timezone +[uc_micro_py](https://pypi.org/project/uc_micro_py) | 1.0.1 | Micro subset of unicode data files for linkify-it-py projects. +[ujson](https://pypi.org/project/ujson) | 5.10.0 | Ultra fast JSON encoder and decoder for Python +[umap_learn](https://pypi.org/project/umap_learn) | 0.5.6 | Uniform Manifold Approximation and Projection +[uncertainties](https://pypi.org/project/uncertainties) | 3.1.7 | Transparent calculations with uncertainties on the quantities involved (aka error propagation); fast calculation of derivatives +[uri_template](https://pypi.org/project/uri_template) | 1.3.0 | RFC 6570 URI Template Processor +[urllib3](https://pypi.org/project/urllib3) | 2.0.3 | HTTP library with thread-safe connection pooling, file post, and more. +[uvicorn](https://pypi.org/project/uvicorn) | 0.30.3 | The lightning-fast ASGI server. +[vega_datasets](https://pypi.org/project/vega_datasets) | 0.9.0 | A Python package for offline access to Vega datasets +[waitress](https://pypi.org/project/waitress) | 3.0.0 | Waitress WSGI server +[watchdog](https://pypi.org/project/watchdog) | 4.0.1 | Filesystem events monitoring +[wcwidth](https://pypi.org/project/wcwidth) | 0.2.13 | Measures the displayed width of unicode strings in a terminal +[webcolors](https://pypi.org/project/webcolors) | 1.12 | A library for working with color names and color values formats defined by HTML and CSS. +[webencodings](https://pypi.org/project/webencodings) | 0.5.1 | Character encoding aliases for legacy web content +[websocket_client](https://pypi.org/project/websocket_client) | 1.8.0 | WebSocket client for Python with low level API options +[websockets](https://pypi.org/project/websockets) | 13.1 | An implementation of the WebSocket Protocol (RFC 6455 & 7692) +[werkzeug](https://pypi.org/project/werkzeug) | 3.0.3 | The comprehensive WSGI web application library. +[whatthepatch](https://pypi.org/project/whatthepatch) | 1.0.2 | A patch parsing and application library. +[wheel](https://pypi.org/project/wheel) | 0.44.0 | A built-package format for Python +[widgetsnbextension](https://pypi.org/project/widgetsnbextension) | 4.0.13 | Jupyter interactive widgets for Jupyter Notebook +[winpython](https://pypi.org/project/winpython) | 11.2.20241228 | WinPython distribution tools, including WPPM +[wordcloud](https://pypi.org/project/wordcloud) | 1.9.4 | A little word cloud generator +[wsproto](https://pypi.org/project/wsproto) | 1.2.0 | WebSockets state-machine based protocol implementation +[xarray](https://pypi.org/project/xarray) | 2024.11.0 | N-D labeled arrays and datasets in Python +[xlsxwriter](https://pypi.org/project/xlsxwriter) | 3.1.9 | A Python module for creating Excel XLSX files. +[xmltodict](https://pypi.org/project/xmltodict) | 0.13.0 | Makes working with XML feel like you are working with JSON +[xyzservices](https://pypi.org/project/xyzservices) | 2023.10.1 | Source of XYZ tiles providers +[yapf](https://pypi.org/project/yapf) | 0.40.1 | A formatter for Python code. +[yarl](https://pypi.org/project/yarl) | 1.18.3 | Yet another URL library +[yt_dlp](https://pypi.org/project/yt_dlp) | 2023.7.6 | A youtube-dl fork with additional features and patches +[zict](https://pypi.org/project/zict) | 3.0.0 | Mutable mapping tools +[zipp](https://pypi.org/project/zipp) | 3.17.0 | Backport of pathlib-compatible object wrapper for zip files +[zstandard](https://pypi.org/project/zstandard) | 0.23.0 | Zstandard bindings for Python + +
diff --git a/changelogs/WinPythonslim-64bit-3.13.1.0_History.md b/changelogs/WinPythonslim-64bit-3.13.1.0_History.md new file mode 100644 index 00000000..f8f8e86d --- /dev/null +++ b/changelogs/WinPythonslim-64bit-3.13.1.0_History.md @@ -0,0 +1,8 @@ +## History of changes for WinPython-64bit 3.13.1.0slim + +The following changes were made to WinPython-64bit distribution since version 3.13.1.0slim. + +
+ +
+* * * diff --git a/changelogs/md5_sha1.txt b/changelogs/md5_sha1.txt index 975ae48e..ae493f03 100644 --- a/changelogs/md5_sha1.txt +++ b/changelogs/md5_sha1.txt @@ -1,3 +1,18 @@ +### WinPython 2024-04 release (January 3rd, 2025) + + MD5 | SHA-1 | SHA-256 | Binary | Size | blake2b-256 +---------------------------------|------------------------------------------|------------------------------------------------------------------|-----------------------------------|--------------------|----------------------------------------------------------------- +3378af265aefee3129171e3165448cfb | cfa99a4fed09996492fd72e2a0d8a441a46050b3 | 2727f61b2702232337a46e39c006f24bd1084395cdf27d076c55d39756c406cc | Winpython64-3.12.8.0dot.exe | 23 442 531 Bytes | efde9241b8922abab035f388e1125069a43bb9d3d48ec5d1667b7d81b4d47061 +139c4bbd020a3082ba164c3e7d32ef59 | a09a8a71047e2b0a5c4f39585249de862c279130 | fabb3f7af4e00fd1b45874d37a63ed2239f62c0935834aa91b83645ba04cd7ba | Winpython64-3.12.8.0dot.7z | 23 227 496 Bytes | 186585ae19af5abf541f88a2a7d6acccc894565280c4e5ca93afdff408160a97 +6e72ee9a3e348c2b3babb90762e85e29 | 65e1f774b02f20c8d386c058a3ed1f797a22d20e | c4c59403370e62169bbeba06f140f0da76b2ee5a5a51ebcfdb3d3ad663b2688a | Winpython64-3.12.8.0slim.exe | 672 113 338 Bytes | 219537f13844cdae7ecc4d00053830e7572a66b46b7f4cdc2c41b6131e6213c9 +07fcf9589f8470a53abfa0320d77ba2a | 3c24c434e4b95d131ef4b6b9703cbaf2a96d41c3 | c872dcb59302af13ce098e6904dff8fe778cd950b8219189d8634bade609bdbb | Winpython64-3.12.8.0slim.7z | 671 899 744 Bytes | 7111b4bf2ee2497296ab0d022606fbcad7d291f8ff10a0cf768dfc44a42423f4 +2d60b1a863fed5cf63d7430d0904a461 | e2a2838cecec6bdeb9d48b998e1b41b362649063 | 338a117a537b9b061314fc38f1a957c34b851d8399edc9705261810da6f2e167 | Winpython64-3.13.1.0dot.exe | 25 157 185 Bytes | 09ec69f4e2e2487b6636cb5f4b242091f9c1b0f9b1c3b2e78b2d4fa0fee0c56d +7699b8f3727548585c17fa806dfc4d14 | 6e5cc08f958f3c92674a18451a3e1d2a6e49894b | 582985c573c900d1120fc0eae54290c607e578eb055679673170f9ef943c13a2 | Winpython64-3.13.1.0dot.7z | 24 942 148 Bytes | da0233c851631a8d12c86e0d6781e092d562874d8a7c1b337ccd1fac7c235efb +db2769c756bc3eb4bd40a941dc667d72 | 5bfcc0492025b606681563c3c73d8b2e5b415313 | 47b9a4ce75efb29d78dda80716d6c35f9a13621efd3a89ef8242a114ef8001a3 | Winpython64-3.13.1.0dot.zip | 39 640 324 Bytes | 1c37c1a2f32e43770f6d105948d7866acd5331c1a19b1c70c5d276604db2a45c +efe121af4dca37595c871fec340a2bda | 44e6d681f5c6ffb7f1e1fef27ecd800cf04d0fff | ed86375c2d6a9de8bddf9889058e299f50ea26432e00e9a74d1d20771e388c55 | Winpython64-3.13.1.0slim.exe | 600 808 320 Bytes | 9f2ed14f54002545e6999321bb981ccb74e280b6786fa289aba7bc09877d71a9 +a24d30ebbf06848279f3a46ed60d42d7 | 982e4c1eb1fcb03432ac4f5eac0d252a9fd65776 | 87fb127b075f0de76f854da6e17bc02819e093cd6b87f7a94d4831c7c490a286 | Winpython64-3.13.1.0slim.7z | 600 593 165 Bytes | 882600d3c84c9734cdace8f1445c60777a91b6678541ee6755b816509ecfb234 + + ### WinPython 2024-04 release (September 14th, 2024) From 6730f09eb8cffc446fd7a78eed5bdf86df3cebfe Mon Sep 17 00:00:00 2001 From: stonebig Date: Fri, 3 Jan 2025 14:16:55 +0100 Subject: [PATCH 035/305] typo --- changelogs/md5_sha1.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/changelogs/md5_sha1.txt b/changelogs/md5_sha1.txt index ae493f03..330882ef 100644 --- a/changelogs/md5_sha1.txt +++ b/changelogs/md5_sha1.txt @@ -1,4 +1,4 @@ -### WinPython 2024-04 release (January 3rd, 2025) +### WinPython 2024-05 release (January 3rd, 2025) MD5 | SHA-1 | SHA-256 | Binary | Size | blake2b-256 ---------------------------------|------------------------------------------|------------------------------------------------------------------|-----------------------------------|--------------------|----------------------------------------------------------------- From 7387a11be55fdf6778b517ed464f15af6e7b7ac7 Mon Sep 17 00:00:00 2001 From: stonebig Date: Sat, 4 Jan 2025 20:34:12 +0100 Subject: [PATCH 036/305] reduce icon files causing troubles --- portable/icons/powershell.ico | Bin 80863 -> 34494 bytes portable/icons/spyder.ico | Bin 311358 -> 102134 bytes portable/icons/spyder_reset.ico | Bin 301209 -> 34494 bytes portable/icons/winpython.ico | Bin 88271 -> 34494 bytes 4 files changed, 0 insertions(+), 0 deletions(-) diff --git a/portable/icons/powershell.ico b/portable/icons/powershell.ico index 2878c9652aa18abe7f500f1cc925391e029eb484..ad1e14898b7c865aa91635599d449b0f8a69bea1 100644 GIT binary patch literal 34494 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

3+3yK0~B?OXu^J h&Up=?_bZ(DBN4>BACVv~!5qZJzF%>f%hl-5|2NE=>lgq4 literal 80863 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­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 Z0MK>03PJX-VT`WLe?%T$BS75yzW{)Yd}{yz diff --git a/portable/icons/spyder.ico b/portable/icons/spyder.ico index 4aafb0878d6b45d44652cb88697ce63cf8f4ed01..8b051eab5bb7a3715c42419978b09615c70e175d 100644 GIT binary patch delta 8552 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 diff --git a/portable/icons/spyder_reset.ico b/portable/icons/spyder_reset.ico index 029782063dc33cd4232e7f21dda74f3beb57d429..61edabdce0bb9382534c4ee9f40f7282899d51f1 100644 GIT binary patch literal 34494 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 J*hc@0zW}O-8GQf% literal 301209 zcmeF42Y405*Ty#?kwAciX6T_v6QqdJg%FC;5fqS)RHYbtQAm(3RX{p|H0ixVNa#hn zNDUBr0D;hJ$hW_I8UO3Lx8~lPd&BPY46}9S%zNHbW_ELtBsVFA#O5aDl;-7@q{;Gr zc=-Px7pU(pmB}MXAtCX{UT#wBUhYz>R{wvzXp$t29FR;32#CKPC`rZBc}T^I#b3`W zNnd^8A?3^&f9xyQ{XL{ing0KHgxvMwpFAXA&ddFG^pKyQeE?(VFSce1ZPz4yEIMb5nIm*Ml>xqoW7?CZ2u zGb}G~qJH$sj8)R^@vPdUX4R(67G>~zzkatJ4I>7`9J)W?+p?j3@*QZ~zRrzbeVTQB z)%;$m1J}xz$zP^=?`5MO9Sw`R6dd#9bi|%+Gh3|K_VD1S*ozN}_L%a!cY~o5S8x5T zT+J#wTUF1{zNlBV`|sTEoX2Zt#Mj0C@PGF6#cprf)H&MfM8&9ip;vpBSl_7F0srp1 z`po=jVY(kbj}6JX{c5TZ(iK2xT~VveWu>`BEH()J9+SkaWBV~@X5PvP^GZH_ueo4=)*5O)&w6PbE#YB zVpTlW3_QTz&xPC%ghk3%OCCr&Xuf~%t9`PapZ`<91nGJG*;mixZ#S~o%jEQ&UY4tK;c-8=tYMes7XO%2 z)1zd{kgadVuFY0*sC%cdsCi*m3y-SZBD{%P^zlpGChsd-G;&SR=TY*lZD;ufO_Snw z7u@x1_R!xyCVPjo>p~?zY2Vr0Wj(_$1n>K*LhDRH5B%j$j`a5J@8;*(YR0F*7mnO6 zoYg<_P30Ehr@R6>Uh6p|EcVT-39(zfI{P$g)~)KJivw?*f6sS{S9rP$u^V>Gt{6P< z$sa|-mJNLUVBd|Ho3n$vR*5{_GPp~NBM&#1mQm*Ls zqLbVEbjk2e;W|>==fUz*w_n{4YdPT6-HnI62glyscxCcEt zTxw<4u$ZTRJvrU-l2@|Ady1TEmRqVB6x;6P=zA@Hc(CX8jPJI8ld9tG)EB<`v}q>a zkkId+t+==8>ew5XR#nNBGu5INazCS^I~A5{40`f@f_r_+bSp3a!|AA*V zy^0)mfApZhAv3ye`R2*7%0A1xZoRwVM(oGuYJXP3r``;yUdMx@mX3Q+V)e~o_iMQY z2DCgM794yvb+LYpC*EDRxQ=w~;q0=#mUMfuW6Y&#>4tjtxzOwM?eIa#YWJ--DrVg` z9&;u?Z@D-4an$klk9|&e&fei$-yfTP7uxH|^Q+?;ec=A3tdrL*2fkP!Q!&NlobER~ z=RDpYRxoqhTJ=3TjeR)gOaD>5KF{5Fai#ga(=G~>Dm;%IobSfb0UcX^dM(%Lg-buG z*Y1Zg2UfS)*T395?cQ7Q-izJe=D+gQ56>?2Iev6!{n3YV?i^D5Meb`OXO`=;;zg4b z#Usx?i1@Ydm64++o?PFmiPZ7XpTE~F_0C7TpRe3}V|u0;cD+uS;n4>Rt^BCw zrb~B_3~_oU;8c0oPGI@i$1$UIs~Rkk$K+q%SSznx9$~r zdANUXw*rGsy=W=h`ND1u{Kw`fkRn^_e15fJLM{$?cHu9XMi&Z6eWh{bAC5R%Ce5!0 z>Q;fJtq%Lue7ezPchNEe8%_|JCiEokNIc+aAKX`>AlOO=$sb^ zzPej&R*%uM+orD8U_z-@E0U+ny0gIKA8s%H{m_b{4g6C1y9Ic?yj}U#)xR1qtGTsB zK+9KuuRWS&^{|-(H-7)@-d{bAe$pY|<6FDtOV_r%ssCNs9P_q&R-RiVQ^nlJ8u

  • n)E=pmQC)E4kNy+?DmUb-$ zJo&3dsS;Iuyf;ovovqbnw|f2&HMdQh+HZKCPse_ge$u-Kw=b@6GH<^5$9Ffby+3Qt z(ARQ%-#wjjZHPx-x6Va3yv#PVx?9daeLU+FAJ}Zgz8v2lYW8c%Cp*@+Jvn;uxF=&L zraMv3Cos#M9ETV7|1kNJi{IaWGOXO4+eadj5B~W{{~76|EVJ5WsTMmaTX2?{je{?3 zA5go)pSOyQc0){$Ftb$p#WpAdc^*E2mv4=l}WOf^W;_Cu!j{h?K;NZV5k8eFW=gJBz zf4hJA;rAy;ja+ap|B(y}e~!p7@j}N>=2y>^Z}zI-d`AlBpHN_a>#qy%owxX#+T|DCD;}8R)TNh?KFTF^ zFVwRCtp%G$P1wC~d|vrwrCnZ-_?h=q`_wE%{Yk5h>rVY#SY-rlZ?ziS7U!CD|-w)qgUMG4&ft)-z!3!OcyBD+jHOdhJ)FS;v!K z-EZcVviZc`>rec0e$Mq8p&NT-ExDjZmCe3R>(N zvb{l%EnaOt_^nfT+DvbTc?>%8$Kql?jPbkF^2&nW?ySkRc;e{b220kJAKojfN5>Kk zyS(h(`C*Up6Z2kk_Zk||*R8mFz}62}cj{JmND8;`OqYImbhwgx&U0CdZK+ne+RA#_ z`gWL>d{E?_Nrgu5+cRNEt}188AN=8qCF}C#KEL=x=b+n<&Mm9^xb?Rjd&2fKeeoio??eIZ*n9X{5z?9crgEa{oG z)36gO>UO@d#5=&JjaPWKTkB@*&ecA2Tk|*L^Y-`ou>bXs3(P;(J>SulceW4PJZ8V= z99bBtaINwSvi+8Qa??EX1Akg@#XiQvQGMFUQq64zj-w(xNdifnoSl&9qiQc{-!TV&TsgB_eWXkcXKPSKa;!E=7{I+ zlLeoYUHkOni`o;%_y4YF^BTq04cR<$`kqR6Jq9d3ak+c@TVH(R7xLrif>MvZZUw97 zZv9o8y6!(6=+v=p;F|hrho!IiFw@C_cg|H_d}4Y_uZh3*of0&EVU4X)hPH*>LKcUH zL~QaO^!2Vo$FlbraOGH<{DD75l`FEm;g;KZ>sD$}dDHK6k9LY~7an-cOY#|hX=Kdn zf(<>oUm19}#mT(W+e}$GW}Dm448P?ZQoY{YZSQ=(w%CYXxrUBzS-oyw@5?6^l$^C$ z%8>I*sprjXU3(w;>TZJ-UOzlO{^@~k6|c|zp-0cr+vgoGK5%Hp5pH)6pFY!U&*@3| zLOgtWt$L`PUKHzM}28TSa?TtC*Gdg0@oO!7m zt_!|haC5!2H;*0ZFyci&zmPQDJtHSK?fO;d>xX}QUdro1x#VfGWxBrb+~%uq${br< zI@{&R^?Tobf85vKr2lzFkXux)Po+(RXT@A!U9(G#RhM&3`l$4sZn2pKB+F*}UTUh3&h^PqZE(&7XO!?5P1y%5)1p+~InIf%RuJXcinUoym}4 z?#oBhx_o}D(999d{3bN^OYRqvW0;q8=(=a&kMG@I+T+OK!voUK8gPD1ztc;Ge3&b5 z$~#9ouX-mwkHHemZYlh3PS+O69uRXhQmx zLEmo({Ha&1g1$VER$4spQ06D~c6w(@_v~~~^T!Lzw)w)V#i8n(mOMK17f+ZYgg1mt4?v%DV_t!%Lc1eBVd=mU*Rm;@&%|ZTckPOsO7oxdGF2cF?a1B zosJDmasA_UKE00Lu5w`fPT44bbDwi`>eoebmb&ME<(;Fcd*!>4|LMxSI~Ff3(&dW^ zhf75D{5|@MTeY(;EAKN$THulM>A`RJKXC7UbzuAL2bwPW_+H)6HDk(Nl5>wKGmkX$ zz7v>oX!_RQeiRcjW$cXmoqS|<)$j_bkpJn8hM!E@HQeXZ%@$U3ic8nNyo8-bfj}YWv6DExvvAe0Ai|0(qsE z%jSJLZbgOI*N>t$OLdms?O*JNe5H1LnBqpa;6AfDW!yINsccYHzHy5z5p?+LsIBX( z%^sdL+uEJd`mH-Qr=PWcZ%mm@QUMs-tTVGd`*U-d{p+gj_+yXk1={qL7WZ)LQd9=)(<*188sy3G zY~NM)dgE7n-K)lgUOa$NL}Y_^~|THJxcZU`QVXUuH|-Y@XiHAYv1h}bgzH#;U62N zY&UD~Liao?hNsEi-L3JyGdZMV2O5l9b$f2_QfIEdX+31X(}>MILMw*#xqoqQr!_t6 z|J-<+H2ShVU#r-@VT~KC?day!r~B&N87F2x zlRS9#$;)L{=J4OSp-bm16Ibl|^jzaE8*h8gxgSwF`?UbC@F9`M{%l_Q@;jw6Ro(cq zUa8C7!v0)X!!2Cu7Iyx0yE{SqqhFW$y4ipMUOg_9Z1z*crm*%qdc2hL{GPv*%vv|< z*vu1w!_yp{I{ZYbqbIk${DXt}Ln}%^C3hp)+fjHfUL*!aKWTivON>Xs;E$ z=KeYI_Zn_fC!D*`>fE!(xBfi*?yWN$_B1^sPa*#L@#gN!?!JRotY30C)1)-D_cl4S zr(nIUk!8NwBvlFcyXA~R%X;U%SNFo1Yu#d>M!FvxTxZ+mZ6VXE?T$!R``gj48l1ZN zYSH40d4t?W%qh8R|0lz~qUoxNX9(+?b)t$++YtR04>$-}iUZ2}?|GS+{zF)BF z7kA&@lP7I@9=T(1kCI^gFI>?%`Xo+?`1~GH2;~AX9Lvb9diOx$lFG z5hrTpZu&{_&9Y8cW!~}47olyR|CVlF&urzTDmibAzh` z4;~q_U%unqkB1)oUH*KR4}ZAqeysA5-jOG&msxzi-3QCO3f#N7Xzir(!Bs|;nY8+k z53c6Vd~2V7a72x(c-ig^-S&>y(O~V(8_m-0zYr+Tp6@L@)Mj>_tiP7qf8yeXEEP9N zk6Trhq&y>Q&z<&t)tq_nou2-3(!?o$SDy33`OdE)T3)yP2Y#E~zpCs-I%J>TEVkg4 zfj1g#YS;Jt7=L**tMW+&7q827YF3|%XLp}$u>P0pn_32s+dQdDpO~TYSSEV}T(6$F z^{wd68E@nom%Y)=WzXtne71D-mUd^x#0JxOZ7FB3BCR?X4fu8BmD`h^yjfg1L%uhk z-JexoD*RsCE<0a7__m0Y_28tke&GenwrTEDr{DfLH8-D@T7SKK_Q$b{PyEp9@4lDD z9?CW3_llhgt=Mq4$>23>GLN_!Ib%@CR-XfO&Z4bG_e;^d%e!km8(yFG;k`y>$_$9w zB^;7H7 zXM+#c-JAc9DI=zDzcFc-=bYa=FFreHK|_yg_1BKvd!>Ky)@6MQbpCX2n}WHdNwfPG z8{Yct&=uKbZQW>`wqC^15!2UPTp9Ms`W-`VrkylZn*aC4O9Nlc?~&>JPu>AlUeqsf zf7mjwlNp{3Z+GLfq8_cHqUxS4-v8GJjhDWEL`C{wyf zp?0CcV>eYST*^J9`l&h|dVKZdhHh?)())$%UbDBq+rcmI zKXUJW`j!8H$H)Kraf8=NC_= zef8qz?65=Lkv%qLPd;yC+Vsc1yk7X{!`Yv0JTJ${##{QdzO_keJ89!2zkrC@-OChg zJo44~F7@k69Saq@eE38+xBZ15jo(aWxhtU7vdq=`esQ+mqO5!U%k{gRYL{ouwTCvh zkmm1=d0pXr>kszC+0kMFO07V``Lepygd zp9k5}MWIa%U9{i$G>NjglvuUduE3g^Yfz!RHI4DCtni4;#kJNZX`H|I**y>9p--v%dP34-F6eo#V9^w*&!<`$vSZMO$A46LDf{basq3}}d-smNK7IJSP1PPo=RVM@ z@&1p0@4P$4M_yfvs9Nxyqmw!uxG|^r4ficx_tU=jQO@Dvp+6q}qM)=TC~f80JFEK7 zkaNXS^ZuGp_U6OhN-BPmkjKujlui z9O-*%dCtg;tFmpq*J1K7?*NY(shUl!wd`_JBio;YCjadjveT_(?c(|8 zto$nX%tDc0gA0X%+@1#q=J9Eip@2{JA5Z_)sO5!BCFgy#via8D&0n{8p0f4H zQPtC)s$H?O`;t%62c_TgdeYNYLtEX>yEDVi&F|Pa<=A2nv`;1Fz1tG`Ro4LInaH;;oNsKdhAU0(0lTl zA6I2^>zK9Q^T=Y6(X)EBPL(CuzNmh`XZzv1i9h?C?KA$0XXA>oD>JO~&LLe6zxC(u zGdiqX*;K~T%jeASdarscsV|-DCw5?n5YS@wo{l3gEW%4SXx$D$sJu{c3gX4oax??9<4{E zpW7x^uACo5Hmj7zuic4aueX1Ea(2%;ZkH=Pf09Mc@1ox8Jgr^*e7n2PD|BOz_lVZ# zw}tp-F8h6%ss7<5=Cs`Z{hGoaecgRNd0g+y)|Gy751;nnquw8kDLgiNxeaA|+!(#m ztBP-yvR4iq3EYr*Vy$)eIus7Lv^#5L&PI3kZSwXDNpa^^i+~&-_I#P5%ZNrHedd(N z^g)V2X+Es#@$H$5cioG1YhHcim?!QV+EvZznYrA=p()cwrz||w>tLQr9?PCJ@CzAv z=XQ&L%sVSr3Vwchc>629m0I1K6H}r`y-{A9q(f4RkdB=H?vTX=%-??x5YbjP$>3H|WX6euu9S(c8iu^Tu=^`__dq>s0{A^#~ zZ_@eD<=JCyxEE^^+F)(62kwQp{Jj3ykq^8Yr9F44XzG~BGsZ4&{`5ANt9QP9E#l1P z5IKR__OgG|T!%i0EaN-2c(+UgSH4%i#M31~^FJy0cf%mJsng_`xb;>@@fOng&#Mo9 znsLyYj{fdB+_sk7m(KlVq0_UP-rib7DslRgzq}it^UOVYyl-UcpjIhj*39>cKGe7O zp_`3&c!o>&JkJD9To>_8NU3@cm-N`+TVhI^>x^Oa_iiOW4{N)5!?lbZ%D1W6Ct!<| zDc4`#t;U6vC~|v7`56I){OH_zFP7@w0jGAjXrAp{ze{q_j$Ie((zb> z-|Kw5c*?*UW50KMSB`%_&rEalZougNHMcJRcv+j<%|bdPA3NMTe8l{Va|@Mjz2|o8 zQF+h3S2e?+UHQ}Q&AVY=#3pHUs(Fn&M=YJaaZT{-XrS9X0zVkut zv3>z#JtqEGv-7yczr|#Jl44KkFZ(W%qH8_9e<`egSDJs&jY)Z+2FV9(b~y7yEc^SAMxrq zZ}=!FsH@b%t?@UHbKRX#)-Rw%c;gl!`3^*%8n$9w(d_4D|Ixf(j>&;vOmvre=DSj? zeOQl5UL!WwYqmRN>9irgBp-h+Uzr|mZTh*jPPs8_aH;OGUoBsA^4X!3(y_&xej8eS zN5p}`{gRz--lut+RNLyc+Bu|2xh^tW)+BrN+1;s^myG!{b(c=v+U;E@d6g|UYvBGv z-(-4}>z(pmUBB5;`ONxGjUM%?aOvRRo&9!CXj|*UHrcOw)@wAO?v^Fzsx z&w+}qTSzfYAx)_-?t`~0Il z-J*tds1m!TXV!Wn`niP^uaa~A?x8*nCYCFH&hyvfKj-;$ZpHJSbNo9^3+}SSR~qlN z?a`5PW4umAE;&6UU#*sXFMIlh1h$G^7T7KQ_^MZjf9oN==YB1Ds#)oSig>yO`OHc6 zVeiqiYge4SxP}xk@{`#=JglC_Bl6R)efD|IN%hl<;%~CtTXE*W(Xhrvua)gNFnnbC z{L|}r74di>FO?ll_WZk(9p;Y9=-26w0e2#&eOX9aBIRAkvmR_?Gn|K?i5F1^Y8$4Bnr6~CR4{LB}b$NL5i&pPtMoqOiYnE9nt@8E`~haZ(0 z;r@8Q*j}r>Qcvsux&Mg+X=^-fG(KWiSf|Vn&i^g1w(R@bBVbX3v{_coo^j+rvq2kz z-+!@h^UQ2MQqSJG9=WY68oMyG-_0`7D^3sf_M3hw#l+P^ey#gFxcKCdjiFU<=dPRY zqrTPpe^~9n#cfZQt^}77#D>!V?-{(i43;C*3$=cUX*RFWZB}g zQI(6N47mG9Dn7*L=dpiYOnw?Wyq*fzahg>avXGhG<3!dTKHjMwnqt*GH@>}zU*WNt3pZ#*F z2=Abo*XJGgFOpVz=ANy?*&*}fDRSu}?;bBGMaoYWo^mW^_#YnOq0+vu^4&e|-+S4s zO5E3P-KW8g3&|0s^pQ18uwEpyT(Jfx3>s;uW zx#HhZuOuJOY`?cCx%ti9MiL#Dy_GfQw?Ql zq>xb|R}cN+dv$oFxEo6NR3791j(13O-oSm+#!gzWy~s}~q)nwFOJA-3^+}(C?@N)n z<^6i+p8vK<^73=vS8!LRVMVK@mx9s;&1^mTo7csb#GS6*rt>bpiC!T=xq@bPUHIV- z#TQFnLqhuaCENF6_VHblh81m}HpKT?%9&l--9A1r`&#dS5#PUaWWux_^DhmV_G9P3 zxl)l-byDv?wqwHTl~-e>IX}-EKe~LL-txyMQuV5Js;mfX^P5#Oo(piI1{{g!N@7yh>b_;!;kqc^@_tWwTp@Ca zkPCc&6JK=h>-MkYfRYz*B?Rus1r7;5S}g2=XIO6F$W&Pt$2>XHH$cEkDHMpzBHA` zI^V|QHP=Vz_q~1bWWLP1rh9nT!U4D# z05=6sZEXwj?dFi{rE*^voMhaI;dAspoio;5fSYoGqc){K?a3v#Tz2TZ*L}V-a{!LU zb2Y&>Ah#ppiNCxb=FH>PWz+3aZ~(5##a}LQ{I%8);-AkZ*E;u|Gv@2Lm;t@OS-HSn zYw0h1|8ikhdae6dSK@%o{pHs1pJ()S9-Zs1#B~F*{%c*xoIn8g<+kws735l9=P?jp z4dAWkBhH5x>q2nZthqq^yRG!{{pWQZ>oFjSaNxXb1L;k@Bg6MUe*75!&o>RvlE~O~ zpX_`-+0ias!4R*_Vz7$`z{hMWv*9^=lVZsP`vL?BiEri|8?J=lsN#$Tz7hAjxw8uETk@c%bNmI$CBM_Q&51e=L`pa-012meb}1LQgMWzKnhL>{;x?hYw@#+_@7Q z6%`eGr#-2ZaKK9h9Q?Vyco{Yom(4j-I2M!#F!)@ozov~qIVR86@;igTS{#C%# z+@gFoG&D4pwi(0GqetWVzj*OtoDCtLunBX<<-mLJ`EZ}#9d$bY4`%2UJkb?gU$}7L zzsjOTi(->PVO;PIA8Jbf-~z|t8@Q}rzdr8SRjXG0;|rE9T^g$_mSCiO&e*=8HpMgO zi!os**abF;KCxR|O<|A}Vg!05--oM8E*s*FIM2Osi1lXHMahL(_ol78ckll5 zUWZuf$if;o{1tL))$pBlOXNgeW#ODT^T4Fce=x&`flE^0xUn(7P3HgRa$oSC_c+WI zoGDJiN%+rNyrJ=Mp7;*O*^FUh>>AG|mHDsm`N|p_FeeTg!^qjM5#M-^tK}mNonu`H zKc7(k*b5uhYz@iId14mwC$xX~Pdl_{tUpIyQ}Q>V`^ZgBfImqnR?hgm&>y*gAzvwU zCwxA(;>_z~=*rmImGJ$x%4_ifYzKX#u~bf_E$7>JGY*d>^pJ$u$_JHYobH*}^so^s6A?t=|>ZI17Em31)mEMmS^ zjU8k2Y}VrDYR`$W5*x_Rz{Qey!2RS_tci)XTnz&)dGQP6ipKcQHRig`obNL>Hu4YF zVGWIk^J2|M3y-(q9C;CQJxlq|GfB;Fux_X2BbDcbzjOs|nCtspVJ!BN5kE#QV`&V4 z2ds0m*-JJ@wrfuAgTEv{;$BC}W=&uCesk9QU12QNjNg)H#Ct(YVgUTdUnUj);|Gl8 z3it=%`(0toy6-ptZ)KUwS;BqpO-lTS&&-94<^K47G3R$?{v(??zMt_+<9>5|Kl46kwqr-)rt|-Q->fL-y2^dxowIXB_l#au}E26Jt|74iWwMssRoeiPof0{@MT0sW#g-S_{` z2JmIP!?osnprrQx%NTcDf&b?Ce*7Hwnd1-MhI{b+?JGj2Kl>e@^^S_3GbEnk~i5)#>8mXRr!za*Vp_1 z=iAlXAwF_WeDlvYQA!?LvyVUF+fQ|0u6*pO{KxmBLv_9{j=4sj>&m*ZMs|2le!@E& z-f!U}1Wwj)UOWS?;yV~?-|YlSB5wwI8Tm)U*K;WM2?@3Tt{%9 z8s86B49VcC=UtKi_;vIle7(9xU+}_{;_N>haT$J2R=sx)3Z|KV$ z*<9%!SK>c9*M0y0|1B@?ulT!mcq!(zw(|8#d!bEY34crPO1w5#R#)ObW5V~NAGOaH z$6QNlzF+C<8NWU98ztw(KA2)#Nipvc_TftW=iAMa@y4M0x#j~iNVY@l<`(6;rq!aoH=&GH*gm3X-)Aqq1VBNHn25vPx40*ADtPe#IQeSwhpsF8#DgR}d7)_7P8 z0HcKZb*<+`yYzvtXMI}u`o!?3uGXh9{=+eF#eWe)@hPm6F@M6x5MS{(O8Y<`N*iI{ zUiRVae~Zoh(wg5G(c-!CoWN7$^}4S&?B7k~gM zFn8ryVI$~I%Qg~XA3Td4I;+0}Tj3j&{Izx;{Af?<>-9Ap>$#6@Si^r)HYMzX+=TT8 zVlpvA9Y3%Sd^kE)+J^9N=GMGJqEAzDIr2I-i4R~5*799EM;pq#USGpW80VEdFqi+z zXUyG?3mS@lcn+RY;D@je5kIgGa#&#x=JKEW8Hc%YIpRL?y@uehHMQV9`KB_jSH@yT zj3p`eVNd>>!cAcsal71)p2b>;x%?*&B9353ruuZmb?loQ5c#d)JHGGv1!v*E$Qg|Jer&^(ec*E$Q)2RkH85*)AHIvzxo;n? zYjMI^_)nf|ira95yg=>qmB-4tKw{*~!j3KFKlig z&zd)RH94`dzXgCt+%LG~Xd6I2`nHt+#4T)F=ed1&ZV1=J=0E(z_cP~%Glq)b2KTf6 z&AS6b_9EKArW~D1u&#@2mhzwRGyh>Tq$~Zr?QJ8m`ERc8hx1BqnEIO-!9T|5NZydY z5UWK0=B@#W_~uAi^}fu1|7#Dd;4|Nc;ropFa`Jw4|JV)Zg|FADX_K~zFG|}{w`I#? zo&UD?(YDl&x~;_Y|K|99*3re^=P6}}&*U2B&IPpEP_}2QeVzY0|IOtRzTeclUXk}} zwTTTl+gw2Bzs`RxuBy+O@JXoBg zKYlBMxd5A~cCEQ?E&uiP|HO$Kj^;nSGiS{Q`>>RM=FSE9#?IWhVyO(w$+0nP&fK+6 z?&E&m8<>;tSt^r$zhT>QH2+Qcet1AG01vFu8*>3ub87g;-x^rczNu#zUqb%ok!KyX zR%L1|Z^Ly*^B-QrZ;_K|)#UvN!9KC)0>m!HWr_b+-b?&IFXU1Q!9jo4u-_NhIGX>0 z8(O?4KNr3~A^Ewv?*;5N7XVWwpDo=78@>fZK70Yco5gwozJu7{=wh#2QE)IZYe(^4 z*4S@SW38-2kMbG{Mc{h6)*&V;_PV@r8&?0)QlHdzyPWI+&RQpJYQ-AmIr1f2`Z(HRj!hrNIPD78L@eTOdf3dt-IeZf z1pmR!+%+Ft@(?{F)?5JF6Z3Fa;JGmwi9O_CY_7y@b7XY{|B=I(@5jf$6>P*DnJu}8 z+(!6frO#LHE8h!P(zdaCv19TE`Z2~WSGcD0KVi9_sWl(?XRmMd@mb{K%q0!wUT~Ca z*oiIY0-|46w}H2r|Khv!gv364ztZ0-_u-wb^L{PAtjtH0{j2xMm$aU@_8jXrU`Ri% z;On(ye4F_%zCX5x|2%{5NB@R=FX!#$`_-J~ofrC5b6y-H3wapt(A3W+aZ2eP=pPF1n6pqmcdIKB$DZ1p_1~^Zf%Kz(1*^bz!El1`3S~w%4vAF

    Y0Yhni=2mO>n-z-z{jzapmNuZZc&?~ITq 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 From 97958df43a4a0cd0c0937b0a71e7a6311b678168 Mon Sep 17 00:00:00 2001 From: stonebig Date: Sat, 4 Jan 2025 20:44:35 +0100 Subject: [PATCH 037/305] adding the new launcher technology proposed per Datalab by WinPython Creator Pierre Raybaut @PierreRaybaut --- portable/launchers_src/LICENSE | 63 +++++++++++ portable/launchers_src/build_one_launcher.bat | 107 ++++++++++++++++++ .../launcher_template_CONSOLE.cpp | 75 ++++++++++++ .../launcher_template_WINDOWS.cpp | 75 ++++++++++++ 4 files changed, 320 insertions(+) create mode 100644 portable/launchers_src/LICENSE create mode 100644 portable/launchers_src/build_one_launcher.bat create mode 100644 portable/launchers_src/launcher_template_CONSOLE.cpp create mode 100644 portable/launchers_src/launcher_template_WINDOWS.cpp diff --git a/portable/launchers_src/LICENSE b/portable/launchers_src/LICENSE new file mode 100644 index 00000000..b3fb976c --- /dev/null +++ b/portable/launchers_src/LICENSE @@ -0,0 +1,63 @@ +DataLab-WinPython license terms +=============================== + +DataLab-WinPython is a Python distribution for Windows: +- Based on WinPython, a portable distribution of Python for Windows (see section I. below). +- Including DataLab, an open-source platform for signal and image processing (see section II. below). + +I. - WinPython License Agreement (MIT License) +---------------------------------------------- + +Copyright (c) 2012 Pierre Raybaut, 2016+ WinPython team + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. + +II. - DataLab License Agreement (BSD 3-Clause License) +------------------------------------------------------ + +Copyright (c) 2023, DataLab Platform Developers. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/portable/launchers_src/build_one_launcher.bat b/portable/launchers_src/build_one_launcher.bat new file mode 100644 index 00000000..233f68de --- /dev/null +++ b/portable/launchers_src/build_one_launcher.bat @@ -0,0 +1,107 @@ +@echo on +set icon_name=%1 +set LAUNCH_TARGET=%2 +set launcher_name=%3 +set subsystem=%4 + +set icon_name=%icon_name:"=% +set LAUNCH_TARGET=%LAUNCH_TARGET:"=% +set launcher_name=%launcher_name:"=% +set subsystem=%subsystem:"=% + +set ROOT_PATH=%~dp0..\ +set SCRIPT_PATH=%~dp0 +set TEMPO_PATH=%ROOT_PATH%launchers_temp +set OUTPUT_DIR=%ROOT_PATH%launchers_final + +set "ICON_FILE=%ROOT_PATH%icons\%icon_name%" +set LAUNCHER_EXE=%OUTPUT_DIR%\%launcher_name%.exe + + +:: Paths to template WINDOWS or CONSOLE +set SOURCE_FILE=%SCRIPT_PATH%launcher_template_%subsystem%.cpp +echo SOURCE_FILE=%SOURCE_FILE% + +set "RESOURCE_FILE=%TEMPO_PATH%\%icon_name%.rc" +set "RESOURCE_OBJ=%TEMPO_PATH%\%icon_name%.res" + + +:: create pDirectory if needed +if not exist "%OUTPUT_DIR%" mkdir "%OUTPUT_DIR%" +if not exist "%TEMPO_PATH%" mkdir "%TEMPO_PATH%" + +cd/d %TEMPO_PATH% + +:: Check if MSVC environment is already initialized +if not defined VSINSTALLDIR ( + echo Initializing MSVC environment... + call %VCVARS_PATH% + if errorlevel 1 ( + echo [ERROR] Failed to initialize MSVC environment. + exit /b 1 + ) +) + +@echo on + +:: Walk through .bat files in the current directory + echo Processing %icon_name%.. + :: Stonebig: Remove previous .exe file + echo launcher_exe_action del /q "%LAUNCHER_EXE%" + if exist "%LAUNCHER_EXE%" ( + move "%LAUNCHER_EXE%" "%LAUNCHER_EXE%.old.exe" + del /q "%LAUNCHER_EXE%.old.exe" + ) + :: Stonebig: Remove intermediate .res and.rc file + if exist "%RESOURCE_OBJ%" ( + move "%RESOURCE_OBJ%" "%RESOURCE_OBJ%.old.exe" + del /q "%RESOURCE_OBJ%.old.exe" + ) + if exist "%RESOURCE_FILE%" ( + move "%RESOURCE_FILE%" "%RESOURCE_FILE%.old.exe" + del /q "%RESOURCE_FILE%.old.exe" + ) + :: Remove intermediate .obj file + del /q "launcher_template_%subsystem%.obj" + + :: Check if the icon exists + if exist "%ICON_FILE%" ( + echo Icon found: "%ICON_FILE%" + ) else ( + echo No icon found for "%ICON_FILE%" stoping + pause + exit + ) + + + :: Create resource file + echo Creating resource file... + > "%RESOURCE_FILE%" echo IDI_ICON1 ICON "%ICON_FILE%" + :: Compile resource + echo Compiling resource... + rc /fo "%RESOURCE_OBJ%" "%RESOURCE_FILE%" + + :: Compile the launcher executable + echo Compiling launcher executable... + cl /EHsc /O2 /DUNICODE /W4 "%SOURCE_FILE%" "%RESOURCE_OBJ%" ^ + /Fe"%LAUNCHER_EXE%%" ^ + /DLAUNCH_TARGET=\"%LAUNCH_TARGET%\" ^ + User32.lib ^ + /link /SUBSYSTEM:%subsystem% + + + if errorlevel 1 ( + echo [ERROR] Failed to build launcher for %LAUNCH_TARGET% + exit /b 1 + ) + + if exist "%LAUNCHER_EXE%" ( + echo [SUCCESS] Launcher created: "%LAUNCHER_EXE%"" + ) else ( + echo [ERROR] Failed to build launcher "%LAUNCHER_EXE%" from "%icon_name%" to call "%LAUNCH_TARGET%" + exit /b 1 + ) + +echo All launchers processed. +rem exit /b 0 + diff --git a/portable/launchers_src/launcher_template_CONSOLE.cpp b/portable/launchers_src/launcher_template_CONSOLE.cpp new file mode 100644 index 00000000..4f1d96b4 --- /dev/null +++ b/portable/launchers_src/launcher_template_CONSOLE.cpp @@ -0,0 +1,75 @@ +/* +DataLab-WinPython launcher script +--------------------------------- + +Licensed under the terms of the BSD 3-Clause +(see ../LICENSE for details) + +*/ + +#include +#include + +int main() { + // Get the path to the current executable + wchar_t exePath[MAX_PATH]; + GetModuleFileNameW(NULL, exePath, MAX_PATH); + + // Determine the directory of the executable + std::wstring exeDir = exePath; + exeDir = exeDir.substr(0, exeDir.find_last_of(L"\\/")); + + // Define the path to the "scripts" directory + std::wstring scriptsDir = exeDir + L"\\scripts"; + + // Check if the "scripts" directory exists + DWORD attributes = GetFileAttributesW(scriptsDir.c_str()); + if (attributes == INVALID_FILE_ATTRIBUTES || !(attributes & FILE_ATTRIBUTE_DIRECTORY)) { + MessageBoxW(NULL, L"The 'scripts' directory does not exist. Please ensure it is in the same folder as the launcher.", + L"Launcher Error", MB_ICONERROR); + return 1; + } + + // Set the working directory to the "scripts" folder + if (!SetCurrentDirectoryW(scriptsDir.c_str())) { + MessageBoxW(NULL, L"Failed to set the working directory to 'scripts'.", + L"Launcher Error", MB_ICONERROR); + return 1; + } + + // Define the command to run + std::wstring target = L"cmd.exe /c \"" LAUNCH_TARGET L"\""; + + // Configure the process startup info + STARTUPINFO si = { sizeof(si) }; + si.dwFlags = STARTF_USESHOWWINDOW; // Prevent the window from appearing + si.wShowWindow = SW_HIDE; // Hide the command window + + PROCESS_INFORMATION pi = {}; + + // Start the process without CREATE_NO_WINDOW flag to show the command window + if (!CreateProcessW( + NULL, // Application name (NULL because we pass the command in the command line) + &target[0], // Command line + NULL, // Process security attributes + NULL, // Thread security attributes + FALSE, // Inherit handles + 0, // No special flags + NULL, // Environment block (NULL to inherit parent) + NULL, // Current directory (NULL to use the parent process's current directory) + &si, // Startup info + &pi // Process information + )) { + MessageBoxW(NULL, L"Failed to launch the script.", L"Launcher Error", MB_ICONERROR); + return 1; + } + + // Wait for the script to finish + WaitForSingleObject(pi.hProcess, INFINITE); + + // Cleanup + CloseHandle(pi.hProcess); + CloseHandle(pi.hThread); + + return 0; +} diff --git a/portable/launchers_src/launcher_template_WINDOWS.cpp b/portable/launchers_src/launcher_template_WINDOWS.cpp new file mode 100644 index 00000000..511e2574 --- /dev/null +++ b/portable/launchers_src/launcher_template_WINDOWS.cpp @@ -0,0 +1,75 @@ +/* +DataLab-WinPython launcher script +--------------------------------- + +Licensed under the terms of the BSD 3-Clause +(see ../LICENSE for details) + +*/ + +#include +#include + +int WINAPI WinMain(HINSTANCE /*hInstance*/, HINSTANCE /*hPrevInstance*/, LPSTR /*lpCmdLine*/, int /*nShowCmd*/) { + // Get the path to the current executable + wchar_t exePath[MAX_PATH]; + GetModuleFileNameW(NULL, exePath, MAX_PATH); + + // Determine the directory of the executable + std::wstring exeDir = exePath; + exeDir = exeDir.substr(0, exeDir.find_last_of(L"\\/")); + + // Define the path to the "scripts" directory + std::wstring scriptsDir = exeDir + L"\\scripts"; + + // Check if the "scripts" directory exists + DWORD attributes = GetFileAttributesW(scriptsDir.c_str()); + if (attributes == INVALID_FILE_ATTRIBUTES || !(attributes & FILE_ATTRIBUTE_DIRECTORY)) { + MessageBoxW(NULL, L"The 'scripts' directory does not exist. Please ensure it is in the same folder as the launcher.", + L"Launcher Error", MB_ICONERROR); + return 1; + } + + // Set the working directory to the "scripts" folder + if (!SetCurrentDirectoryW(scriptsDir.c_str())) { + MessageBoxW(NULL, L"Failed to set the working directory to 'scripts'.", + L"Launcher Error", MB_ICONERROR); + return 1; + } + + // Define the command to run + std::wstring target = L"cmd.exe /c \"" LAUNCH_TARGET L"\""; + + // Configure the process startup info + STARTUPINFO si = { sizeof(si) }; + si.dwFlags = STARTF_USESHOWWINDOW; // Prevent the window from appearing + si.wShowWindow = SW_HIDE; // Hide the command window + + PROCESS_INFORMATION pi = {}; + + // Start the process with CREATE_NO_WINDOW flag + if (!CreateProcessW( + NULL, // Application name (NULL because we pass the command in the command line) + &target[0], // Command line + NULL, // Process security attributes + NULL, // Thread security attributes + FALSE, // Inherit handles + CREATE_NO_WINDOW, // Flags to prevent creating a window + NULL, // Environment block (NULL to inherit parent) + NULL, // Current directory (NULL to use the parent process's current directory) + &si, // Startup info + &pi // Process information + )) { + MessageBoxW(NULL, L"Failed to launch the script.", L"Launcher Error", MB_ICONERROR); + return 1; + } + + // Wait for the script to finish + WaitForSingleObject(pi.hProcess, INFINITE); + + // Cleanup + CloseHandle(pi.hProcess); + CloseHandle(pi.hThread); + + return 0; +} From 3a774047cd128d4996e20d5c92070c9633a77a55 Mon Sep 17 00:00:00 2001 From: stonebig Date: Sat, 4 Jan 2025 21:08:41 +0100 Subject: [PATCH 038/305] generating new launchers (as a separate step) --- portable/build_my_launchers.bat | 26 ++++++++++++++++++ .../launchers_final/IDLE (Python GUI).exe | Bin 0 -> 119296 bytes portable/launchers_final/Jupyter Lab.exe | Bin 0 -> 150528 bytes portable/launchers_final/Jupyter Notebook.exe | Bin 0 -> 150528 bytes portable/launchers_final/Spyder reset.exe | Bin 0 -> 134144 bytes portable/launchers_final/Spyder.exe | Bin 0 -> 201728 bytes portable/launchers_final/VS Code.exe | Bin 0 -> 190464 bytes .../WinPython Command Prompt.exe | Bin 0 -> 148480 bytes .../WinPython Control Panel.exe | Bin 0 -> 150528 bytes .../launchers_final/WinPython Interpreter.exe | Bin 0 -> 135680 bytes .../WinPython Powershell Prompt.exe | Bin 0 -> 134144 bytes 11 files changed, 26 insertions(+) create mode 100644 portable/build_my_launchers.bat create mode 100644 portable/launchers_final/IDLE (Python GUI).exe create mode 100644 portable/launchers_final/Jupyter Lab.exe create mode 100644 portable/launchers_final/Jupyter Notebook.exe create mode 100644 portable/launchers_final/Spyder reset.exe create mode 100644 portable/launchers_final/Spyder.exe create mode 100644 portable/launchers_final/VS Code.exe create mode 100644 portable/launchers_final/WinPython Command Prompt.exe create mode 100644 portable/launchers_final/WinPython Control Panel.exe create mode 100644 portable/launchers_final/WinPython Interpreter.exe create mode 100644 portable/launchers_final/WinPython Powershell Prompt.exe diff --git a/portable/build_my_launchers.bat b/portable/build_my_launchers.bat new file mode 100644 index 00000000..51ebeb0e --- /dev/null +++ b/portable/build_my_launchers.bat @@ -0,0 +1,26 @@ +rem build lmaunchers in WINDOWS and CONSOLE version +rem tweaked from @datalab-winpython provided code +@echo off + +set VCVARS_PATH="C:\Program Files (x86)\Microsoft Visual Studio\2022\BuildTools\VC\Auxiliary\Build\vcvars64.bat" + +rem pick the right ones and rename them in launchers_final +set do_launcher=%~dp0launchers_src\build_one_launcher.bat + +::WINDOWS launchers +call %do_launcher% "powershell.ico" "cmd_ps.bat" "WinPython Powershell Prompt" WINDOWS + +pause +call %do_launcher% "python.ico" "winidle.bat" "IDLE (Python GUI)" WINDOWS +call %do_launcher% "spyder.ico" "winspyder.bat" "Spyder" WINDOWS +call %do_launcher% "spyder_reset.ico" "spyder_reset.bat" "Spyder reset" WINDOWS +call %do_launcher% "code.ico" "winvscode.bat" "VS Code" WINDOWS + +:: CONSOLE launchers +call %do_launcher% "cmd.ico" "cmd.bat" "WinPython Command Prompt" CONSOLE +call %do_launcher% "python.ico" "winpython.bat" "WinPython Interpreter" CONSOLE +call %do_launcher% "jupyter.ico" "winipython_notebook.bat" "Jupyter Notebook" CONSOLE +call %do_launcher% "jupyter.ico" "winjupyter_lab.bat" "Jupyter Lab" CONSOLE +call %do_launcher% "winpython.ico" "wpcp.bat" "WinPython Control Panel" CONSOLE +pause + diff --git a/portable/launchers_final/IDLE (Python GUI).exe b/portable/launchers_final/IDLE (Python GUI).exe new file mode 100644 index 0000000000000000000000000000000000000000..c1e0c9dc452c9d6f29f91bfd398b6e1403291494 GIT binary patch literal 119296 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


    a+K$4q#O?#%;kWiMh!b z_nHJ4>T&BNz^}}WdrAzJiKj~Isoqx2h`UzX;m11<7iGu?cj>9JN_xao{T@5GHOJ*t}iCHc(xZ;7YP-JU9D?F^p+OW{fs?!vEEYZ!2jF1ucbNO-?RF?0rT=RdFk_6dd2m~ zQ0(s%bLpWW+f1^LvZCgP42Yaf1L_19m$4P{E=jmpQy%lTte-vst5aj}it@IBSl5Y)csEBn%B{FoR(HExp`x7bB`p!`l( zVkSS=qR(ed_?t3!GsQQULm7P8p4kB3Hs2ayvjw_h{W}wrhZI8<(u4E~Lt4x{hSk}b zm^tK|oUGB8`RL(G*%0FhVQ_b;B1oY51O7lBPEarg00RkkgBp8uN>>jSrFmQ~B~!Oq zNU_$9FW6Jt=;C+i_faJ1&WBm){@t$&1*UwV@@h&u`FZ1LyEd~!9gIpk=aR`>!bphi z&-p`%eJv-kP4v8I+vuR?c%Ir&F*H*SPA!IQK#L1B8nhuZVGR zMUN3~IF=UHem?o(M4aEq+O>hV5AmvfV?pY{Hh1jM^k}kWdWtP0dirHX?kal}XW<$N}GLp<2zClZ#~Dq|qoVb2$nKNr4Tg?m(_GSQTyPOblwNcQNF zoOtmxRsx1|@}9;s2?Q%ojSpf{cpA%y%}$<@5=9A~4wh}S{&hhcUMdZXip1eAJ{s=s zZ}>ULK^?JCZ!rI=I?}-y07dIy1F3pOs)(N|a%O>NMd9qEV-*S1#g!kHYi!OTUT=}> zm2I9CTtIMnX{9*=V8ZAsABC_UafR3r?>;jW`24O@^+*xk-c9^)bNgyBi^2aW3NPEU z=}>xg7+~g`N1Ms*9)Zqz-wRgWW{*_@CY{jNg;XOf0NJt}^n$L46OI7UwIcK7J+dA= zO`;n%-w+GldUnlIsV+56ra|)bU8p>)fv-D~3zoZ|)~Dnq^xS%LJ}D|RxW_8|)vbFK znw;%vu;Vg)a(zdib9_BzMjiNenFp;h%Xc4MM&v_T(q8j;+M3v{JoaDXriwzam^FZ{v;(7grvNI=W@y z<4Mxz_j*PD&>ksY7uk=>cpAp6gD%e!;go6u-z=Cl**NEnhz>)2C=%Ge(B~ON7eoZ( z$W+F=D=bq-^Gw+jaqvB}-~(# zHj3j_HRW5D(_TOn4GJyIAJnJCa!w4fLKS{*g7o|D({sJu9~&Lzuu=II�jE_dCk} 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 literal 0 HcmV?d00001 diff --git a/portable/launchers_final/Jupyter Lab.exe b/portable/launchers_final/Jupyter Lab.exe new file mode 100644 index 0000000000000000000000000000000000000000..98bb8bde1e2eb892eff87091b02f875179517de6 GIT binary patch literal 150528 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

    ({Zm;CDV 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 literal 0 HcmV?d00001 diff --git a/portable/launchers_final/Spyder.exe b/portable/launchers_final/Spyder.exe new file mode 100644 index 0000000000000000000000000000000000000000..43874aa73321e432f55941c8898c345d0c23ea50 GIT binary patch literal 201728 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 literal 0 HcmV?d00001 diff --git a/portable/launchers_final/WinPython Command Prompt.exe b/portable/launchers_final/WinPython Command Prompt.exe new file mode 100644 index 0000000000000000000000000000000000000000..e4e824c5310020148f960c4e867df83185c00bae GIT binary patch literal 148480 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

    lk*B!y!%cot|Xw* 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 z

    C<8ye(E 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 literal 0 HcmV?d00001 diff --git a/portable/launchers_final/WinPython Interpreter.exe b/portable/launchers_final/WinPython Interpreter.exe new file mode 100644 index 0000000000000000000000000000000000000000..dfa43135546a85d8df192d519033d667cdbcbb7e GIT binary patch literal 135680 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 literal 0 HcmV?d00001 diff --git a/portable/launchers_final/WinPython Powershell Prompt.exe b/portable/launchers_final/WinPython Powershell Prompt.exe new file mode 100644 index 0000000000000000000000000000000000000000..d4512f326d5e8f652ed91f95879bb6e7fda4bb18 GIT binary patch literal 134144 zcmd?Sdwf*I`S`z^%_a+E*&r+i0a-C-YNp z_vOXOnKNh3GtWFT^UQOb*_x}D+Z;BVEuSlsvDsE~mw!R^_rL#f*=@FgqgD^Jz0_~h z2`lZu_x92?Z>_v4y^Ox3ryL!I##+h@Zj_+zwZMDsI!+iy|RKx8*$d&1| zjkXQQ8(3y*Cg*Az%fHJ<@~2oOgDOYTc{W>t%Idw_f@BI&`Il#_Ysh_+{gzw{NbV-( zvN@8p-B4$@jg`dXc3b6A?#u1AvVoG3{a2A^n@gn?lkBz;xxAy?J2kt_LNxnwtIei? z+IRgsBQ|SMjFut8NkCFvU+t0bya`pKaWEh=c z6|;2;l5?S05%=p9<$6j|uKA3)RzcN9+N$dQ;eV71o-uF!yqSEdXaa3)%XqlsXysaLYMmA_=b8*ioYfJ02WUO>fG9+XXHBQA{^r@^llikFdYh(8t94qfCDvAiW`wQ_ zO`kEn)f^3*+h{(@u-j<9D1SE!kxHgo^!915<>(pFcS3wk{~{V#=UH+P1fmd9(-H>@ z7nW+ttBN(pZb7F#R3c1k9ZsI(PgxXc)slCW2DL;-AuqJRx&;^ZZF(;y zFYlq`kAWnV+zCi18M{+67D2^-LB)w(>2p>oD(WUw?*qv*KBXBoijbEGA)krphalub z0z>c8lGhbOMX=S9-xGwBx0Y!77PA_B1=)b6gJcwPX+pwU$mI*oxDHb7A1y?>g~7DZ zTq1w1f5FQbm_8W{`Wnq}-_mTeF{U)*GMAPdpc$IWGbqnoIF!l_XFV^qq(h@xz+TfT z5RUl%^rL=%zV-dIqkIq8OC-BJ#3&T-As1O^sFHSOfvO~n>rv`^4L16p__lk2)ECQM z002+&jh3`)i56GtbTI3ENlM0#OD3z2k~5^F-c4csT`6uJ0`R_8d(6GMM39B>mGD2I zbcLq33sq(ufiRFX&4`xz%ww2&n&Cajf?{Rt0@z00mqGVg)MVc8JOUZPN54b}^3m&5 z)3jalRIfR_f~fwtNb;JJn&eF1)QIuiqHn0A;gfn+6is*Da}9O**J{b8xyT@)mHEO- zl6L~|VU|Cee|^UL&?_>~|DhR8k^?ED$yuGALDhS?cSYKpg9+!?4Y+Dvo)zM01{&NZI4C zht}9Y1?rt>d23`_SGq7qgg}>OOx>#nTTL+P8Q<=?a=mId)C$t(se8Zj+*4C)-f<9m z=u^9*dX`AsmkY5H2MQOQr|C6&HDkzBshi=gH5^dvcbKL}y0pZaleO{|up!ws%CqD_ zN}2D_b)MqtVAOD4`I;naY6TG}YLkBQ465lgAL&+oz#2g=xYXD(-k-0s*%Dp!LJayp zQ|xKHS^6Qd_^?8^P^hUnUPM=X3Gmbu%BUuKCri)JLZikPT6rwkQkhR$SYbYTAd{g` zd$@G&9A5aF!N&*W%EDLpoVgWdoif63AE@H1_OF*5t=iuVh-c)*+~o8>NM6vtUY4>- z`BMS7GQM_&dGL7#g-aK~&}Kc)H%qx5LHzj8D&ZT@=CW6*+3>EV z6*8`0U2U_aPto*fY3*vYiL8-{6_}Sn z-Hql)OxTU7A4pp0_(@rf9;(#zHzWEs)6Jk-sU}ilZJBWU;APc1tNgp6#D{Q|^`U*X z{HVSyHaMgQT{San^Y`zJI<{#uJEA9Ui_C1Dqz@_9^a;hf=Hlks7q&Y*u>qbH+!K2{ zqmGWKpK8`$lNv-lK$m~L{80gq_N2oa}n!b zV{>f2`5clF{k@l)Ihbw(J2KwC{Drc6l?-E*9U^7#w8}Dm2AGq_ zP+};g_Po5)Ty}!Z7S=aJ^=32}!#(Q5Ovb!peFCN#E5 zW?5^tnPu5#u0ju^nJy5m&^uH+KcjjxF6fY12KH}DOK4|Vww<$7%bc&vE$KXy;_Xf^ zf33E8NLg(gmQCf*m9`BcPrn>VIyuD7;}bH>YqA(CJ}9!ePh|5Tj3?uL|9QdVl`cWY zxEyIi-@@R|c(+MDh@Y(`ZYZtfU9@zX2H@H#QHXPx z0aqz(bB^Jy-TWI<#Pl=z8=K?#XE&#Zn2(gHhkpL`<^=N7A3u*8q!t-#Ueu5KWCk6i z?~4BbKDF?N<}3@7vZmefQu^c_-kN`5Cc!xoquuYx^KaF2>||f8-{Qa_8}7Zf(v6{@N7+=#s0z)n?9ST&uZU64hH))?6*}xpUQfEJBO4neI_# zmpMh&hVAswfX3bNLT!onk20@?V`R(Jk9(3F+p=A;{KoC^BJ*q(3pn!@7PMT0>8~s= zN{qXk!mOLS;)Q0>7`g>fVh7ZnL$-Mv8B&+#3GWawNY#>Eqh68acK^=d&HHy|I;@Vg z>>rx`2?Gi7$$3`|n7wlL6MIhopK`h-&>D|viCH4H)f8vE`!H>2dUdgutnSQs_wuAS zYiCJ%qm?#lO04IXT-&++Zx6s?&QBY9E zi2Yl6JXJ7)-%oG#H@9w7f(}B?N?Xuo<4&`m73Pr{^L=XExbb;=>&7)C5D|YverwNN z*64pp`xCBG^Pg4%B~Avjzq!h}l}bGiHB0&HZ?wL{V}7pX4UkkXkL-B-IEa zDl@e5QK?m}F-=Pa&%Zszvu=GMdKg+&Ep~<=_sfO#X1vD$Q{M^OQyQ9RVVXflii(!; z{_k^EO+oZWl1y`V;-Ed|GBk(T0x#C|$4a+CDXn3x5NvuYloJ#LBXABI=*zD^zdR+etH7D;QDO68ENYLzwfUGX!unc7&*(UG0& zzTUa+O{{7J%D@FhiB-arZJvj76V+NP3^xLsjH7pduXu{|w`JGSQMS7q0yF2|vNt{= zac4<>e5ihz&$xH*ft&xC=*nB*MJEsb4@Mqk*HJPcW*zehk*Jc$;WJ$3@2#}?(-V(? zZHx?@&geD9ox?4C3^JB9s37BwN>3(QU0Ptzyp&}yVkXb9#$ndpG}2>z>pJ4w;{Wn3 zQ#Xde^UBZ_)|@Z)H~ZIno(StLVSRh3;maFuofQc+blw`9bu)rnSnu?&S5waOMD>8J z%=%En7ZYdQ8c$CDclCg6$(k;`J2~~6_%&L>{cHrLG^X>yj7MvCKEQ*m-ew!uTwu4w z%Er|dd_K=54Ai0$fL}RcIPvs zSW9GudYGhV^}mM9A5Njq+nveYS9g$1j;yx|4EH3;`Iw6ATeX%CeA)n5+*BW*j_@S* z2`s(ZH@fwLR*#yvx>Mu37xyMQT4^?syK@AOOfFs=M+%MA zu@$uQNQY0v11cEO-wd(Vw4{p1WNi7i#QTLw=Xuir)v&(I zX0vPiw`nK3f23f$f5?pvSuj9Ly#I!lbYE=&{J=XOU834YJ$nbw@5k-j3wZ+)*Opc? zsW4H4#iwPAGtloUEn%2rnytUxWsB-xV$P36HQg># zEUYEAWbmZakFB)D_hSaMo2eop|4w;3BB~<_T!~QJVID$>L`My^UF5Pyk_GyCKxTG%w)_x+ zw-Q*9P2UCEH+;?qhaqRgM()cij=@U$VRZxscuixm4#IUypJ6mL3pe&@O}k^GMa=Xm z9p#SSQH|v9bGYJ8S`~M`A$)4J3|=8lSrn#=P#!C-SS8F&NQW*0gNH4n>xBdW?V2mJ zUj(MLNV!@1-YoQmkz5(NyvJP?1mhaLJEC_)#A)@hc@CqsM*o4UMn6BI�^^|M$L& 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 literal 0 HcmV?d00001 From 8f47c40d8b78d89e1509b588d7a51ed3c1a04b2e Mon Sep 17 00:00:00 2001 From: stonebig Date: Sat, 4 Jan 2025 21:17:30 +0100 Subject: [PATCH 039/305] remove decrepited shimmy technic --- make.py | 7 --- mkshim400.py | 162 --------------------------------------------------- 2 files changed, 169 deletions(-) delete mode 100644 mkshim400.py diff --git a/make.py b/make.py index 9eb64710..c00db8ae 100644 --- a/make.py +++ b/make.py @@ -620,13 +620,6 @@ def _create_launchers(self): command="$SYSDIR\cmd.exe", args=r"/k cmd.bat", ) - - #self.create_launcher_shimmy( - # "WinPython Powershell Prompt.exe", - # "powershell.ico", - # command="Powershell.exe", - # args=r"start-process -WindowStyle Hidden -FilePath ([dollar]ENV:WINPYDIRICONS + '\scripts\cmd_ps.bat')", - #) self.create_launcher( "WinPython Powershell Prompt.exe", diff --git a/mkshim400.py b/mkshim400.py deleted file mode 100644 index bef89df4..00000000 --- a/mkshim400.py +++ /dev/null @@ -1,162 +0,0 @@ -import sys -import base64 -import argparse -import os -from pathlib import Path - -max_limit_string = '400' #100 is classic, till 400 is new attempt -max_limit = int(max_limit_string) -#use keyword [doublequote] in the command_line if you need to get a doublequote, [simplequote] otherwise -# example: -# python mkshim240.py -f my_IDLE_ps.exe -c "Powershell.exe start-process -WindowStyle Hidden [simplequote]./scripts/winidle.bat[simplequote]" -# python mkshim240.py -f "C:\WinP\bd312\bu\WPy64-31250b6\IDLEtest4.exe" -c "Powershell.exe start-process -FilePath (Join-Path (Get-Location).Path -ChildPath 'scripts\winidletest.bat')" - -# 2024-08-25 v01 -# - fork from initial https://github.com/pfmoore/shimmy commit -# 2024-09-01 v03 -# the new ICONS : -# - do create a WINPYDIRICONS environment variable with the location of the launcher, -# - and do not play anymore with a workingdir to set it to .\scripts -# - so we have a similar behavior by double-clicking the icon or Drag&Droping something on it -# python mkshim400.py -f "IDLE_test_v02.exe" -c "Powershell.exe start-process -FilePath (Join-Path -Path $ENV:WINPYDIRICONS -ChildPath 'scripts\winidletest.bat')" -# python mkshim400.py -f "IDLE_test_v02b.exe" -c "Powershell.exe start-process -WindowStyle Hidden -FilePath ([dollar]ENV:WINPYDIRICONS + '\scripts\winidle.bat')" -# -# 2024-09-03 v04: same stub can also optionnaly change the working-directory -# python mkshim400.py -f "ControlPannel_test_v03.exe" -c ".\wpcp.bat" --subdir ".\scripts" -# -# 2024-09-05 v05: -i icon_filename to add the icon -# python mkshim400.py -f "ControlPannel_test_v03.exe" -c ".\wpcp.bat" --subdir ".\scripts" -i "python.ico" - - -def parse_args(): - parser = argparse.ArgumentParser(description="Create executable shims") # re-add wording change of 2014-08-01 - parser.add_argument("-f", "--filename", default="shim.exe", - help="The filename of the generated shim") - parser.add_argument("-c", "--command", - help="The command to run (use %s for where the args should go)") - parser.add_argument("--stub", - help="The name of the stub executable") - parser.add_argument("-d", "--subdir", default="", - help="swith working directory to this subdirectory from there for the running executable") - parser.add_argument("-i", "--icon", default="", - help="the filename of the icon file '.ico' to add") - args = parser.parse_args() - if len(args.command) >= max_limit: - raise ValueError("The command cannot be over {max_limit} characters long") - if len(args.subdir)>1 and not args.subdir[:2] in [".\\" , "."]: - raise ValueError(f"sub-directory '{args.subdir}' from icon position must start per '.\\' or '.', not '{args.subdir[:2]}' ") - return args - -def checkPath(path, mode): - """ from https://gist.github.com/flyx/2965682 """ - import os, os.path - if not os.path.exists(path) or not os.path.isfile(path): - raise ValueError("{0} does not exist or isn't a file.".format(path)) - if not os.access(path, mode): - raise ValueError("Insufficient permissions: {0}".format(path)) - -def updateExecutableIcon(executablePath, iconPath): - """ from https://gist.github.com/flyx/2965682 """ - import win32api, win32con - import struct - import math - """ - Updates the icon of a Windows executable file. - """ - - checkPath(executablePath, os.W_OK) - checkPath(iconPath, os.R_OK) - - handle = win32api.BeginUpdateResource(executablePath, False) - - icon = open(iconPath, "rb") - - fileheader = icon.read(6) - - # Read icon data - image_type, image_count = struct.unpack("xxHH", fileheader) - print ("Icon file has type {0} and contains {1} images.".format(image_type, image_count)) - - icon_group_desc = struct.pack("= 1: - print("SHIMMY THIS:", cmd_pre, "subdirectory:", args.subdir) - else: - print("SHIMMY THIS:", cmd_pre) - - # v03-20240903: same stub can optionnaly change the working-directory - if len(args.subdir) >= 1: - marker = ('Y' * max_limit).encode('utf-16le') - i = stub_bytes.index(marker) - cmd = (args.subdir+('\0' * max_limit))[:max_limit] - cmd_bytes = cmd.encode('utf-16le') - stub_bytes= b"".join([ stub_bytes[:i] , cmd_bytes , stub_bytes[i+len(marker):] ]) - - marker = ('X' * max_limit).encode('utf-16le') - cmd = (cmd_pre + ('\0' * max_limit))[:max_limit] - i = stub_bytes.index(marker) - cmd_bytes = cmd.encode('utf-16le') - with open(args.filename, "wb") as f: - f.write(stub_bytes[:i]) - f.write(cmd_bytes) - f.write(stub_bytes[i+len(marker):]) - - # Embed the icon with pywin32, if provided - if Path(args.icon).is_file(): - updateExecutableIcon(args.filename, args.icon) - -stub = """\ -TVqQAAMAAAAEAAAA//8AALgAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAA4fug4AtAnNIbgBTM0hVGhpcyBwcm9ncmFtIGNhbm5vdCBiZSBydW4gaW4gRE9TIG1vZGUuDQ0KJAAAAAAAAAD2fQbZshxoirIcaIqyHGiKpndsi7kcaIqmd2uLtxxoiqZ3bYs8HGiKpndpi7EcaIqyHGmK6xxoinGfa4u7HGiKcZ9si6AcaIpxn22LlBxoiqeYbIuzHGiKp5hqi7McaIpSaWNoshxoigAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFBFAABkhgUAcYXYZgAAAAAAAAAA8AAiAAsCDigAUAEAAOgAAAAAAAAgGwAAABAAAAAAAEABAAAAABAAAAACAAAGAAAAAAAAAAYAAAAAAAAAAHACAAAEAAAAAAAAAwBggQAAEAAAAAAAABAAAAAAAAAAABAAAAAAAAAQAAAAAAAAAAAAABAAAAAAAAAAAAAAABj9AQAoAAAAAAAAAAAAAAAAQAIAGBIAAAAAAAAAAAAAAGACAHAGAACA6AEAHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEDnAQBAAQAAAAAAAAAAAAAAYAEAUAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC50ZXh0AAAAQE8BAAAQAAAAUAEAAAQAAAAAAAAAAAAAAAAAACAAAGAucmRhdGEAAAqlAAAAYAEAAKYAAABUAQAAAAAAAAAAAAAAAABAAABALmRhdGEAAAAQJQAAABACAAAUAAAA+gEAAAAAAAAAAAAAAAAAQAAAwC5wZGF0YQAAGBIAAABAAgAAFAAAAA4CAAAAAAAAAAAAAAAAAEAAAEAucmVsb2MAAHAGAAAAYAIAAAgAAAAiAgAAAAAAAAAAAAAAAABAAABCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEiJTCQISItEJAgPtwCFwHRcSItEJAgPtwCD+CJ1C0iLRCQISIPAAutJSItEJAgPtwCD+Fx1J7gCAAAASGvAAUiLTCQID7cEAYP4InUQSItEJAhIg8AESIlEJAjrDkiLRCQISIPAAkiJRCQI65hIi0QkCMPMzMzMzMzMzMzMzMzMSIlMJAhIg+woSItEJDAPtwCLyOgIWAAAhcB0EEiLRCQwSIPAAkiJRCQw691Ii0QkMA+3AIP4InUYSItEJDBIg8ACSIvI6Db///9IiUQkMOsvSItEJDAPtwCFwHQjSItEJDAPtwCLyOi0VwAAhcB1EEiLRCQwSIPAAkiJRCQw69FIi0QkMA+3AIvI6JFXAACFwHQQSItEJDBIg8ACSIlEJDDr3UiLRCQwSIPEKMPMzMzMzMzMzMzMzMzMzMzMzMzMSIlMJAhWV0iB7HgDAABIiwVrBwIASDPESImEJGADAADHRCRgAAAAAMdEJGQAAAAASI0Nif4BAOhkWQAASImEJJAAAABIi4wkkAMAAOhPWQAASIuMJJAAAABIjUQBAkiJRCRoSItEJGhI0eBIi8joqVcAAEiJRCRYSIN8JFgAdT5Ii0QkaEjR4EiJhCSYAAAAuQIAAADoViEAAEiLjCSYAAAATIvBSI0VdAQCAEiLyOgMBQAAuAEAAADpfQMAAEiNFccEAgBIjQ30/QEA6D8VAABIiYQkgAAAAEiDvCSAAAAAAHReSIuEJIAAAABIg8AESI0Nyf0BAEiLlCSAAAAASCvRSIvKSNH5SIlEJDBIi4QkkAMAAEiJRCQoSI0Fn/0BAEiJRCQgTIvJTI0FaAQCAEiLVCRoSItMJFjoMQUAAJDrK0iLhCSQAwAASIlEJCBMjQ1q/QEATI0FUwQCAEiLVCRoSItMJFjoBAUAAJBBuAQBAABIjZQkUAEAADPJ/xV1TQEAZrpcAEiNjCRQAQAA6MwTAABIiYQkiAAAAEiDvCSIAAAAAHQNM8BIi4wkiAAAAGaJAUiNhCQwAQAASI0N/QMCAEiL+EiL8bkcAAAA86RIjZQkUAEAAEiNjCQwAQAA/xXiTAEAhcB0Ausr/xXmTAEAiUQkcLkCAAAA6PAfAACLTCRwRIvBSI0V0gMCAEiLyOiqAwAAkLgCAAAASGvAAEiNDcn/AQAPtwQBg/hZD4TZAAAAuAIAAABIa8AASI0NrP8BAA+3BAGD+C4PhbwAAADHRCRQAAAAAOsKi0QkUP/AiUQkUEhjRCRQSI0Nf/8BAA+3BEGFwHQli0QkUP/ASJhIjQ1o/wEASGNUJFBIjT1c/wEAD7cEQWaJBFfrvUiNFUv/AQBIjYwkUAEAAOhyVQAASI2MJFABAADoOVwAAIXAdRdIjZQkUAEAAEiNDXYDAgDoOQMAAJDrM/8V+EsBAIlEJHS5AgAAAOgCHwAAi0wkdESLyUyNhCRQAQAASI0VbAMCAEiLyOi0AgAAkEG4aAAAADPSSI2MJMAAAADoDj4BAMeEJMAAAABoAAAAQbgYAAAAM9JIjYwkoAAAAOjuPQEAuQIAAADopB4AAEyLRCRYSI0VkAMCAEiLyOhgAgAASI2EJKAAAABIiUQkSEiNhCTAAAAASIlEJEBIx0QkOAAAAABIx0QkMAAAAADHRCQoAAAAAMdEJCAAAAAARTPJRTPASItUJFgzyf8VQUsBAIlEJGBIi0wkWOhLVAAAg3wkYAB1Mf8VDksBAIlEJHi5AgAAAOgYHgAAi0wkeESLwUiNFSoDAgBIi8jo0gEAALgBAAAA60a6/////0iLjCSgAAAA/xXYSgEASI1UJGRIi4wkoAAAAP8VzUoBAEiLjCSgAAAA/xWnSgEASIuMJKgAAAD/FZlKAQCLRCRkSIuMJGADAABIM8zoFQMAAEiBxHgDAABfXsPMzMzMzMzMzMzMzEiJVCQQiUwkCEiD7Dj/FU1KAQBIiUQkIEiLTCQg6L76//9IiUQkIEiLTCQg6G/7//9Ig8Q4w8zMzMzMzMzMzMxIjQUJHwIAw8zMzMzMzMzMTIlMJCBMiUQkGEiJVCQQSIlMJAhIg+w46NP///9Ii0wkWEiJTCQgTItMJFBMi0QkSEiLVCRASIsI6FJRAABIg8Q4w8zMzMzMzMzMzMzMzMxMiUwkIEyJRCQYSIlUJBBIiUwkCEiD7Djog////0iLTCRYSIlMJCBMi0wkUEyLRCRISItUJEBIiwjojlEAAEiDxDjDzMzMzMzMzMzMzMzMzEyJTCQgTIlEJBhIiVQkEEiJTCQISIPsSOgz////SItMJHBIiUwkKEiLTCRoSIlMJCBMi0wkYEyLRCRYSItUJFBIiwjowFEAAIlEJDCDfCQwAH0Kx0QkNP/////rCItEJDCJRCQ0i0QkNEiDxEjDzMxIiVQkEEiJTCQITIlEJBhMiUwkIEiD7DhIjUQkUEiJRCQoTItMJChFM8BIi1QkSEiLTCRA6Af///+JRCQgSMdEJCgAAAAAi0QkIEiDxDjDzEiJTCQISIlUJBBMiUQkGEyJTCQgSIPsOEiNRCRISIlEJCi5AQAAAOi0GwAATItMJChFM8BIi1QkQEiLyOhf/v//iUQkIEjHRCQoAAAAAItEJCBIg8Q4w8zMzMzMzMzMzEyJRCQYSIlUJBBIiUwkCEyJTCQgSIPsSEiNRCRoSIlEJDhIi0QkOEiJRCQgRTPJTItEJGBIi1QkWEiLTCRQ6J3+//+JRCQwSMdEJDgAAAAAi0QkMEiDxEjDzMzMSIPsKE2LQThIi8pJi9HoDQAAALgBAAAASIPEKMPMzMxAU0WLGEiL2kGD4/hMi8lB9gAETIvRdBNBi0AITWNQBPfYTAPRSGPITCPRSWPDSosUEEiLQxCLSAhIi0MI9kQBAw90Cw+2RAEDg+DwTAPITDPKSYvJW+kZAAAAzMzMzMzMzMzMzMzMzMzMZmYPH4QAAAAAAEg7DRkAAgB1EEjBwRBm98H//3UBw0jByRDpqgIAAMzMQFNIg+wguQEAAADoSFoAAOj3BwAAi8joiGUAAOjfBwAAi9joQGcAALkBAAAAiRjoWAUAAITAdHPoRwoAAEiNDXwKAADo8wYAAOi2BwAAi8joq1wAAIXAdVLotgcAAOjtBwAAhcB0DEiNDZIHAADoRVoAAOiwBwAA6KsHAADofgcAAIvI6D9mAADolgcAAITAdAXoeWEAAOhkBwAA6BsJAACFwHUGSIPEIFvDuQcAAADovwcAAMzMzEiD7CjocwcAADPASIPEKMNIg+wo6EcJAADoKgcAAIvISIPEKOlbZgAAzMzMSIlcJAhIiXQkEFdIg+wwuQEAAADoUwQAAITAD4Q2AQAAQDL2QIh0JCDoAgQAAIrYiw3WDgIAg/kBD4QjAQAAhcl1SscFvw4CAAEAAABIjRXgSAEASI0NoUgBAOg4YQAAhcB0Crj/AAAA6dkAAABIjRV/SAEASI0NaEgBAOizYAAAxwWBDgIAAgAAAOsIQLYBQIh0JCCKy+gwBQAA6NcGAABIi9hIgzgAdB5Ii8joggQAAITAdBJFM8BBjVACM8lIiwP/FfRHAQDoswYAAEiL2EiDOAB0FEiLyOhWBAAAhMB0CEiLC+iOYwAA6O1fAABIi/joOWQAAEiLGOgpZAAATIvHSIvTiwjo8Pr//4vY6M0HAACEwHRVQIT2dQXoO2MAADPSsQHoxgQAAIvD6xmL2OirBwAAhMB0O4B8JCAAdQXoB2MAAIvDSItcJEBIi3QkSEiDxDBfw7kHAAAA6C8GAACQuQcAAADoJAYAAIvL6EFjAACQi8vo8WIAAJBIg+wo6OsEAABIg8Qo6XL+///MzEBTSIPsIEiL2TPJ/xUbRQEASIvL/xUKRQEA/xUURQEASIvIugkEAMBIg8QgW0j/JQhFAQBIiUwkCEiD7Di5FwAAAP8V/EQBAIXAdAe5AgAAAM0pSI0NUggCAOjNAQAASItEJDhIiQU5CQIASI1EJDhIg8AISIkFyQgCAEiLBSIJAgBIiQWTBwIASItEJEBIiQWXCAIAxwVtBwIACQQAwMcFZwcCAAEAAADHBXEHAgABAAAAuAgAAABIa8AASI0NaQcCAEjHBAECAAAAuAgAAABIa8AASIsNsfwBAEiJTAQguAgAAABIa8ABSIsN3PwBAEiJTAQgSI0N8EYBAOj//v//kEiDxDjDzEiD7Ci5CAAAAOgGAAAAkEiDxCjDiUwkCEiD7Ci5FwAAAP8VFUQBAIXAdAiLRCQwi8jNKUiNDWoHAgDodQAAAEiLRCQoSIkFUQgCAEiNRCQoSIPACEiJBeEHAgBIiwU6CAIASIkFqwYCAMcFkQYCAAkEAMDHBYsGAgABAAAAxwWVBgIAAQAAALgIAAAASGvAAEiNDY0GAgCLVCQwSIkUAUiNDT5GAQDoTf7//5BIg8Qow8zMzEiJXCQgV0iD7EBIi9n/FT1DAQBIi7v4AAAASI1UJFBIi89FM8D/FS1DAQBIhcB0MkiDZCQ4AEiNTCRYSItUJFBMi8hIiUwkMEyLx0iNTCRgSIlMJCgzyUiJXCQg/xX+QgEASItcJGhIg8RAX8PMzMxAU1ZXSIPsQEiL2f8Vz0IBAEiLs/gAAAAz/0UzwEiNVCRgSIvO/xW9QgEASIXAdDlIg2QkOABIjUwkaEiLVCRgTIvISIlMJDBMi8ZIjUwkcEiJTCQoM8lIiVwkIP8VjkIBAP/Hg/8CfLFIg8RAX15bw8zMzEiD7CjoqwgAAIXAdCFlSIsEJTAAAABIi0gI6wVIO8h0FDPA8EgPsQ24CgIAde4ywEiDxCjDsAHr98zMzEiD7CiFyXUHxgWhCgIAAeiYBQAA6EsNAACEwHUEMsDrFOgiZwAAhMB1CTPJ6FsNAADr6rABSIPEKMPMzEBTSIPsIIA9aAoCAACL2XVng/kBd2roIQgAAIXAdCiF23UkSI0NUgoCAOhBZQAAhcB1EEiNDVoKAgDoMWUAAIXAdC4ywOszZg9vBZVEAQBIg8j/8w9/BSEKAgBIiQUqCgIA8w9/BSoKAgBIiQUzCgIAxgX9CQIAAbABSIPEIFvDuQUAAADoXgIAAMzMSIPsGEyLwbhNWgAAZjkFFeH//3V4SGMNSOH//0iNFQXh//9IA8qBOVBFAAB1X7gLAgAAZjlBGHVUTCvCD7dRFEiDwhhIA9EPt0EGSI0MgEyNDMpIiRQkSTvRdBiLSgxMO8FyCotCCAPBTDvAcghIg8Io698z0kiF0nUEMsDrFIN6JAB9BDLA6wqwAesGMsDrAjLASIPEGMNAU0iD7CCK2egLBwAAM9KFwHQLhNt1B0iHFSoJAgBIg8QgW8NAU0iD7CCAPR8JAgAAitl0BITSdQzovmUAAIrL6OcLAACwAUiDxCBbw8zMzEBTSIPsIEiDPfoIAgD/SIvZdQfomGMAAOsPSIvTSI0N5AgCAOj7YwAAM9KFwEgPRNNIi8JIg8QgW8PMzEiD7Cjou////0j32BvA99j/yEiDxCjDzEiJXCQYVUiL7EiD7DBIiwWY+AEASLsyot8tmSsAAEg7w3V0SINlEABIjU0Q/xVSQAEASItFEEiJRfD/FTxAAQCLwEgxRfD/FShAAQCLwEiNTRhIMUXw/xUQQAEAi0UYSI1N8EjB4CBIM0UYSDNF8EgzwUi5////////AABII8FIuTOi3y2ZKwAASDvDSA9EwUiJBRX4AQBIi1wkUEj30EiJBUb4AQBIg8QwXcMzwMPMuAEAAADDzMy4AEAAAMPMzEiNDSUIAgBI/yW+PwEAzMywAcPMwgAAzEiNBR0IAgDDSIPsKOjj9P//SIMIJOjm////SIMIAkiDxCjDzDPAOQX09wEAD5TAw0iNBeUTAgDDSI0F1RMCAMODJeUHAgAAw0iJXCQIVUiNrCRA+///SIHswAUAAIvZuRcAAAD/FSI/AQCFwHQEi8vNKbkDAAAA6MT///8z0kiNTfBBuNAEAADo9zABAEiNTfD/Fb0+AQBIi53oAAAASI2V2AQAAEiLy0UzwP8Vqz4BAEiFwHQ8SINkJDgASI2N4AQAAEiLldgEAABMi8hIiUwkMEyLw0iNjegEAABIiUwkKEiNTfBIiUwkIDPJ/xVyPgEASIuFyAQAAEiNTCRQSImF6AAAADPSSI2FyAQAAEG4mAAAAEiDwAhIiYWIAAAA6GAwAQBIi4XIBAAASIlEJGDHRCRQFQAAQMdEJFQBAAAA/xV2PgEAi9gzyUiNRCRQSIlEJEBIjUXwSIlEJEj/FRE+AQBIjUwkQP8V/j0BAIXAdQ2D+wF0CI1IA+jB/v//SIucJNAFAABIgcTABQAAXcPpP/7//8zMzEiD7Cgzyf8VKD4BAEiFwHQ5uU1aAABmOQh1L0hjSDxIA8iBOVBFAAB1ILgLAgAAZjlBGHUVg7mEAAAADnYMg7n4AAAAAA+VwOsCMsBIg8Qow8zMzEiNDQkAAABI/yV6PQEAzMxIiVwkCFdIg+wgSIsZSIv5gTtjc23gdRyDexgEdRaLUyCNguD6bOaD+AJ2FYH6AECZAXQNSItcJDAzwEiDxCBfw+j+CAAASIkYSItfCOgGCQAASIkY6GJiAADMzEiJXCQIV0iD7CBIjR17ygEASI09dMoBAOsSSIsDSIXAdAb/FfQ+AQBIg8MISDvfculIi1wkMEiDxCBfw0iJXCQIV0iD7CBIjR1PygEASI09SMoBAOsSSIsDSIXAdAb/Fbg+AQBIg8MISDvfculIi1wkMEiDxCBfw0iJXCQQSIl0JBhVV0FWSIvsSIPsEDPAM8kPokSLwUSL0kGB8mluZUlBgfBudGVsRIvLRIvwM8m4AQAAAA+iRQvQiUXwQYHxR2VudYld9EUL0YlN+Iv5iVX8dVtIgw0J9QEA/yXwP/8PSMcF8fQBAACAAAA9wAYBAHQoPWAGAgB0IT1wBgIAdBoFsPn8/4P4IHckSLkBAAEAAQAAAEgPo8FzFESLBbsEAgBBg8gBRIkFsAQCAOsHRIsFpwQCAEUzyUGL8UWL2UWL0UGD/gd8ZUGNQQczyQ+iiUXwi/KJXfREi8uJTfiJVfwPuuMJcwtBg8gCRIkFawQCAIP4AXwZuAcAAACNSPoPokSL2olF8Ild9IlN+IlV/LgkAAAARDvwfBMzyQ+iRIvTiUXwiV30iU34iVX8SIsFGfQBALsGAAAASIPg/scFDvQBAAEAAADHBQj0AQACAAAASIkF9fMBAA+65xRzG0iD4O/HBenzAQACAAAASIkF2vMBAIkd4PMBAA+65xsPgysBAAAzyQ8B0EjB4iBIC9BIiVUgD7rnHA+D9gAAAEiLRSAiwzrDD4XoAAAAiwWo8wEAsuCDyAjHBZXzAQADAAAAiQWT8wEAQfbBIHRdg8ggxwV88wEABQAAAIkFevMBALkAAAPQSIsFYvMBAEQjyUiD4P1IiQVU8wEARDvJdTJIi0UgIsI6wnUhSIsFPvMBAIMNQ/MBAEBIg+DbiR018wEASIkFJvMBAOsHSIsFHfMBAA+65hdzDEgPuvAYSIkFC/MBAEEPuuMTc0pIi0UgIsI6wnVAQYvKQYvCSMHpECX/AAQAg+EHiQXuAgIASIHJKAAAAUj30UgjDdHyAQBIiQ3K8gEAg/gBdgtIg+G/SIkNuvIBAEEPuuIVcxRIi0UgSA+64BNzCUgPujWf8gEAB0iLXCQ4M8BIi3QkQEiDxBBBXl9dw8zMM8A5BWgOAgAPlcDDzMzMzMzMzMzMzMzMTIvBRA+3yjPJgz1o8gEAAn0vSYvQQQ+3AEmDwAJmhcB180mD6AJMO8J0CmZFOQh18UmLwMNmRTkISQ9EyEiLwcNIi9HrEmZFOQhJD0TQZkE5CHRXSYPAAkGNQAGoDnXmZkE7yXUkuAEA//9mD27I6wRJg8AQ80EPbwBmDzpjyBV170hjwUmNBEDDZkEPbsnzQQ9vAGYPOmPIQXMHSGPBSY0UQHQGSYPAEOvkSIvCw8xIiVwkCEiJdCQQSIl8JBgPtxoz9kiL+kyLwWY783UISIvB6dQBAACDPZrxAQACQbr/DwAARY1a8Q+N1gAAAGYPbsMPV9LyD3DIAGYPcNkASYvASSPCSTvDdyzzQQ9vAGYPb8hmD3XDZg91yg9WyGYP18GFwHUGSYPAEOvTD7zISNHpTY0ESGZBOzAPhGkBAABmQTsYdW1Ji9BMi89Ji8FJI8JJO8N3REiLwkkjwkk7w3c580EPbwHzD28KZg91yGYPdcJmD3XKD1bIZg/XwYXAdQpIg8IQSYPBEOvAD7zISNHpSAPJSAPRTAPJQQ+3AWY78HQYZjkCdQpIg8ICSYPBAuuZSYPAAulD////SYvA6ecAAABIi8dJI8JJO8N3BvMPbwLrPA9XwEiLz7oIAAAAD7fDRA+3y2YPc9gCZg/EwAdIjUECZjvzdAMPtxhmQTvxSA9EwUiLyEiD6gF10g+3H0mLwEkjwkk7w3df80EPbwhmDzpjwQ12BkmDwBDr4nN4Zg86Y8ENSGPBTY0EQEmL0EyLz0iLwkkjwkk7w3c+SYvBSSPCSTvDdzPzD28K80EPbxFmDzpj0Q1xHA+IS////0iDwhBJg8EQ68lmQTswdChmQTkYdLdJg8AC64RBD7cBZjvwD4Qi////ZjkCdehIg8ICSYPBAuubM8BIi1wkCEiLdCQQSIt8JBjDzEiJXCQISIlsJBBIiXQkGFdBVEFVQVZBV0iD7EBIi/FNi/lJi8hJi+hMi+roOAMAAE2LZwhNizdJi184TSv09kYEZkGLf0gPhfEAAABIiXQkMEiJbCQ46c4AAACLz0gDyYvvi0TLBEw78A+CuAAAAItEywhMO/APg6sAAACDfMsQAA+EoAAAAIN8ywwBdBuLRMsMSYvVSQPESI1MJDD/0IXAD4iPAAAAfn6BPmNzbeB1KEiDPSs5AQAAdB5IjQ0iOQEA6D0lAQCFwHQOugEAAABIi87/FQs5AQBIjUUBQbgBAAAASAPASYvViwzDSQPM6EACAABEiw5IjUUBSAPATIvGSYvNixTDSYtHQEkD1EiJRCQoSYtHKEiJRCQg/xVKNgEA6D0CAAD/xzs7D4Iq////6b4AAAAzwOm8AAAASYtvIEkr7OmfAAAARIvPTQPJQotEywRMO/APgokAAABCi0TLCEw78HN/9kYEIHQ/M9JFhcB0NIvKSAPJi0TLBEg76HIfi0TLCEg76HMWQotEyxA5RMsQdQtCi0TLDDlEywx0B//CQTvQcsw7E3VIi8dI/8CLz0gDwEgDyYM8wwB0EIsEw0g76HUf9kYEIHUn6xeNRwFJi9VBiUdIRItEywyxAU0DxEH/0P/HRIsDQTv4D4JV////uAEAAABMjVwkQEmLWzBJi2s4SYtzQEmL40FfQV5BXUFcX8PMSIPsKOjnAgAAhMB1BDLA6xLobgIAAITAdQfoGQMAAOvssAFIg8Qow0iD7CiEyXUK6JcCAADo/gIAALABSIPEKMPMzMxIhcl0Z4hUJBBIg+xIgTljc23gdVODeRgEdU2LQSAtIAWTGYP4AndASItBMEiFwHQ3SGNQBIXSdBFIA1E4SItJKOgqAAAA6yDrHvYAEHQZSItBKEiLCEiFyXQNSIsBSItAEP8VQDYBAEiDxEjDzMzMSP/izEiD7Cjo5wAAAEiDwCBIg8Qow8zMSIPsKOjTAAAASIPAKEiDxCjDzMzMzMzMzMzMzMzMzMzMzMzMzMxmZg8fhAAAAAAAzMzMzMzMZmYPH4QAAAAAAMzMzMzMzGZmDx+EAAAAAABIiUwkCEiJVCQYRIlEJBBJx8EgBZMZ6QUAAADMzMzMzMPMzMzMzMzMzMzMzMzMzMzDzMzMSIsFhTUBAEiNFRb0//9IO8J0I2VIiwQlMAAAAEiLiZgAAABIO0gQcgZIO0gIdge5DQAAAM0pw8xIg+woSIXJdBFIjQUk/AEASDvIdAXoMjwAAEiDxCjDzEiD7CjoEwAAAEiFwHQFSIPEKMPo8FgAAMzMzMxIiVwkCEiJdCQQV0iD7CCDPeLrAQD/dQczwOmQAAAA/xW7MgEAiw3N6wEAi/joWgMAAEiDyv8z9kg7wnRnSIXAdAVIi/DrXYsNq+sBAOiCAwAAhcB0TrqAAAAAjUqB6OFYAACLDY/rAQBIi9hIhcB0JEiL0OhbAwAAhcB0EkiLw8dDeP7///9Ii95Ii/DrDYsNY+sBADPS6DgDAABIi8vobDsAAIvP/xXsMgEASIvGSItcJDBIi3QkOEiDxCBfw8xIg+woSI0N+f7//+gsAgAAiQUi6wEAg/j/dCVIjRUW+wEAi8jo6wIAAIXAdA7HBXn7AQD+////sAHrB+gIAAAAMsBIg8Qow8xIg+woiw3m6gEAg/n/dAzoKAIAAIMN1eoBAP+wAUiDxCjDzMxAU0iD7CAz20iNFT37AQBFM8BIjQybSI0MyrqgDwAA6NgCAACFwHQR/wVG+wEA/8OD+wFy07AB6wfoCgAAADLASIPEIFvDzMxAU0iD7CCLHSD7AQDrHUiNBe/6AQD/y0iNDJtIjQzI/xUXMgEA/w0B+wEAhdt137ABSIPEIFvDzEiJXCQISIlsJBBIiXQkGFdBVEFVQVZBV0iD7CCL+UyNPffQ//9Jg87/TYvhSYvoTIvqSYuE/2AqAgCQSTvGD4SuAAAASIXAD4WnAAAATTvBD4SUAAAAi3UASYuc90gqAgCQSIXbdAtJO94PhcEAAADra02LvPcocQEAM9JJi89BuAAIAAD/FbkxAQBIi9hIhcB1fv8VmzABAIP4V3UtRI1DB0mLz0iNFUhCAQDoq2EAAIXAdBZFM8Az0kmLz/8VgTEBAEiL2EiFwHVGSYvGTI09R9D//0mHhPdIKgIASIPFBEk77A+FbP///02HtP9gKgIAM8BIi1wkUEiLbCRYSIt0JGBIg8QgQV9BXkFdQVxfw0iLw0yNPQHQ//9Jh4T3SCoCAEiFwHQJSIvL/xUDMQEASYvVSIvL/xX/MAEASIXAdKhIi8hJh4z/YCoCAOulzEBTSIPsIEiL2UyNDaxBAQAzyUyNBZtBAQBIjRWcQQEA6Iv+//9IhcB0D0iLy0iDxCBbSP8l8zEBAEiDxCBbSP8lfzABAMzMzEBTSIPsIIvZTI0NfUEBALkBAAAATI0FaUEBAEiNFWpBAQDoQf7//4vLSIXAdAxIg8QgW0j/JaoxAQBIg8QgW0j/JU4wAQDMzEBTSIPsIIvZTI0NRUEBALkCAAAATI0FMUEBAEiNFTJBAQDo+f3//4vLSIXAdAxIg8QgW0j/JWIxAQBIg8QgW0j/JfYvAQDMzEiJXCQIV0iD7CBIi9pMjQ0QQQEAi/lIjRUHQQEAuQMAAABMjQXzQAEA6Kr9//9Ii9OLz0iFwHQI/xUWMQEA6wb/FbYvAQBIi1wkMEiDxCBfw8zMzEiJXCQISIl0JBBXSIPsIEGL8EyNDc9AAQCL2kyNBb5AAQBIi/lIjRW8QAEAuQQAAADoTv3//4vTSIvPSIXAdAtEi8b/FbcwAQDrBv8VPy8BAEiLXCQwSIt0JDhIg8QgX8PMzMzMzMzMzMzMzMzMzMzMzMzMzMxmZg8fhAAAAAAAzMzMzMzMZmYPH4QAAAAAAMzMzMzMzGZmDx+EAAAAAADMzMzMzMxmZg8fhAAAAAAASIvESIlYCEiJaBBIiXAYSIl4IEFWSIPsIIsFYfgBADPbvwMAAACFwHUHuAACAADrBTvHD0zHSGPIuggAAACJBTz4AQDoZ2IAADPJSIkFNvgBAOjRYgAASDkdKvgBAHUvuggAAACJPRX4AQBIi8/oPWIAADPJSIkFDPgBAOinYgAASDkdAPgBAHUFg8j/63VIi+tIjTWv5gEATI01kOYBAEmNTjBFM8C6oA8AAOgjZwAASIsF0PcBAEyNBVH7AQBIi9VIwfoGTIk0A0iLxYPgP0iNDMBJiwTQSItMyChIg8ECSIP5AncGxwb+////SP/FSYPGWEiDwwhIg8ZYSIPvAXWeM8BIi1wkMEiLbCQ4SIt0JEBIi3wkSEiDxCBBXsPMi8FIjQ0H5gEASGvAWEgDwcPMzMxAU0iD7CDo9WsAAOiYaAAAM9tIiw079wEASIsMC+jmawAASIsFK/cBAEiLDANIg8Ew/xVtLQEASIPDCEiD+xh10UiLDQz3AQDop2EAAEiDJf/2AQAASIPEIFvDzEiDwTBI/yUtLQEAzEiDwTBI/yUpLQEAzEiJXCQITIlMJCBXSIPsIEmL2UmL+EiLCujL////kEiLz+iGCQAAi/hIiwvoxP///4vHSItcJDBIg8QgX8PMzMxIiVwkCEyJTCQgV0iD7CBJi9lJi/hIiwroi////5BIi8/oFggAAIv4SIsL6IT///+Lx0iLXCQwSIPEIF/DzMzMQFVTVldBVEFWQVdIjawkEPz//0iB7PAEAABIiwVn5AEASDPESImF4AMAAEUz5EmL2UmL+EiL8kyL+U2FyXUY6CRgAADHABYAAADo+V4AAIPI/+k5AQAASIX/dAVIhfZ03kiLlVAEAABIjUwkQOjuBgAATYv3RIlkJDlmRIlkJD1EiGQkP0iJdCQgSIl8JChMiWQkMEGD5gJ1CkSIZCQ4SIX2dQXGRCQ4AUiNRCQgTIlkJHBIiYXIAwAASI1MJGBIjUQkSEyJZYhIiUQkaEiLhVgEAABIiUWATIllkESJZZhEiGWgZkSJZaJEiWWwRIhltEyJpbgDAABMiaXAAwAATIl8JGBIiVwkeESJpdADAADoPxAAAEhj2EiF9nRLQfbHAXQiSIX/dQiFwA+FhgAAAEiLRCQwSDvHdSmF23gqSDvfdiXrcU2F9nRnSIX/dBmFwHkGZkSJJusPSItEJDBIO8d0Z2ZEiSRGSIuNwAMAAOiMXwAATImlwAMAAEQ4ZCRYdAxIi0wkQIOhqAMAAP2Lw0iLjeADAABIM8zoyeL//0iBxPAEAABBX0FeQVxfXltdw0iF/3UFg8v/661Ii0QkMEg7x3Weu/7///9mRIlkfv7rlszMSIlcJAhIiWwkEEiJdCQYV0iD7CBIuP////////9/SIv5SDvQdg/oaV4AAMcADAAAADLA61wz9kiNLBJIObEIBAAAdQlIgf0ABAAAdglIO6kABAAAdwSwAes3SIvN6JZrAABIi9hIhcB0HUiLjwgEAADotl4AAEiJnwgEAABAtgFIia8ABAAAM8nonl4AAECKxkiLXCQwSItsJDhIi3QkQEiDxCBfw8zMSIlcJAhIiWwkEEiJdCQYV0iD7CBIuP////////8/SIv5SDvQdg/owV0AAMcADAAAADLA619Ii+oz9kjB5QJIObEIBAAAdQlIgf0ABAAAdglIO6kABAAAdwSwAes3SIvN6OtqAABIi9hIhcB0HUiLjwgEAADoC14AAEiJnwgEAABAtgFIia8ABAAAM8no810AAECKxkiLXCQwSItsJDhIi3QkQEiDxCBfw8zMzEWLyEGD6QJ0MkGD6QF0KUGD+Ql0I0GD+A10HYPhBEG47/8AAA+VwGaD6mNmQYXQdAxIhckPlMDDsAHDMsDDzMxIiVwkCEyNUVhBi9hJi4IIBAAARIvaSIXAdQe4AAIAAOsNTIvQSIuBWAQAAEjR6E2NQv9MA8BMiUFIi0E4hcB/BUWF23Qv/8gz0olBOEGLw/fzgMIwRIvYgPo5fgxBisE0AcDgBQQHAtBIi0FIiBBI/0lI68VEK0FISItcJAhEiUFQSP9BSMPMSIlcJAhIi4FgBAAATIvRSIPBWEGL2ESL2kiFwHUHuAABAADrDkiLyEmLglgEAABIwegCSI1A/0yNBEFNiUJISYvAQYtKOIXJfwVFhdt0PzPSjUH/QYlCOEGLw/fzZoPCMESL2GaD+jl2D0GKwTQBwOAFBAcCwg++0EmLQkgPvspmiQhJg0JI/kmLQkjrtEiLXCQITCvASdH4RYlCUEmDQkgCw8xIiVwkCEiLgWAEAABMi9FIg8FYQYvYTIvaSIXAdQe4AAIAAOsNSIvISYuCWAQAAEjR6EyNQf9MA8BNiUJIQYtCOIXAfwVNhdt0Mf/IM9JBiUI4SYvDSPfzgMIwTIvYgPo5fgxBisE0AcDgBQQHAtBJi0JIiBBJ/0pI68JFK0JISItcJAhFiUJQSf9CSMPMzMxIiVwkCEiLgWAEAABMi9FIg8FYQYvYTIvaSIXAdQe4AAEAAOsOSIvISYuCWAQAAEjB6AJIjUD/TI0EQU2JQkhJi8BBi0o4hcl/BU2F23RAM9KNQf9BiUI4SYvDSPfzZoPCMEyL2GaD+jl2D0GKwTQBwOAFBAcCwg++0EmLQkgPvspmiQhJg0JI/kmLQkjrs0iLXCQITCvASdH4RYlCUEmDQkgCw0WFwA+OgQAAAEiLxEiJWAhIiWgQSIlwGEiJeCBBVkiD7CBJi9lED77yQYvoSIvxM/9IiwaLSBTB6Qz2wQF0CkiLBkiDeAgAdBBIixZBi87oEIEAAIP4/3QG/wOLA+sGgwv/g8j/g/j/dAb/xzv9fMFIi1wkMEiLbCQ4SIt0JEBIi3wkSEiDxCBBXsPMRYXAD46HAAAASIvESIlYCEiJaBBIiXAYSIl4IEFWSIPsIEmL2UQPvvJBi+hIi/Ez/0iLBotIFMHpDPbBAXQKSIsGSIN4CAB0FkiLFkEPt87o334AALn//wAAZjvBdAb/A4sD6waDC/+DyP+D+P90Bv/HO/18u0iLXCQwSItsJDhIi3QkQEiLfCRISIPEIEFew8zMzEWFwH5wSIlcJAhIiXwkEEWLEUiL2Q+++kUz20iLE0iLQghIOUIQdRSAehgAdAVB/8LrBEGDyv9FiRHrIUGNQgFBiQFIiwNI/0AQSIsDSIsIZok5SIsDSIMAAkWLEUGD+v90CEH/w0U72HywSItcJAhIi3wkEMPMzEiJXCQISIl0JBBXSIPsIMZBGABIi/lIjXEISIXSdAUPEALrEIM9XfABAAB1DQ8QBTzgAQDzD38G607olW0AAEiJB0iL1kiLiJAAAABIiQ5Ii4iIAAAASIlPEEiLyOgacAAASIsPSI1XEOhCcAAASIsPi4GoAwAAqAJ1DYPIAomBqAMAAMZHGAFIi1wkMEiLx0iLdCQ4SIPEIF/DzEiJXCQQSIl0JBhVV0FWSI2sJDD8//9IgezQBAAASIsFaNwBAEgzxEiJhcADAABIiwFIi9lIizhIi8/oaX8AAEiLUwhIjUwkIECK8EiLEugR////SItTIEiNRCQoSIsLRTP2TIsSSIsJSItTGEyLCkiLUxBMiwJIiY2oAwAASI1MJEBMiXQkUEyJdCRoTIl0JHBEiXQkeGZEiXWARIl1kESIdZRMibWYAwAATIm1oAMAAEyJRCRASIlEJEhMiUwkWEyJVCRgRIm1sAMAAOj7AwAASIuNoAMAAIvY6CVYAABMibWgAwAARDh0JDh0DEiLTCQgg6GoAwAA/UiL10CKzuhsfwAAi8NIi43AAwAASDPM6Ffb//9MjZwk0AQAAEmLWyhJi3MwSYvjQV5fXcPMzMxIiVwkEEiJdCQYVVdBVkiNrCQw/P//SIHs0AQAAEiLBTjbAQBIM8RIiYXAAwAASIsBSIvZSIs4SIvP6Dl+AABIi1MISI1MJCBAivBIixLo4f3//0iLUyBIjUQkKEiLC0Uz9kyLEkiLCUiLUxhMiwpIi1MQTIsCSImNqAMAAEiNTCRATIl0JFBMiXQkaEyJdCRwRIl0JHhEiHWAZkSJdYJEiXWQRIh1lEyJtZgDAABMibWgAwAATIlEJEBIiUQkSEyJTCRYTIlUJGBEibWwAwAA6NsEAABIi42gAwAAi9jo8VYAAEyJtaADAABEOHQkOHQMSItMJCCDoagDAAD9SIvXQIrO6Dh+AACLw0iLjcADAABIM8zoI9r//0yNnCTQBAAASYtbKEmLczBJi+NBXl9dw8zMzMzMzMzMzMzMSIsCSIuQ+AAAAEiLAkQPtggPtgGEwHQeD7bQDx9EAAAPtsJBOtF0Dg+2QQFI/8EPttCEwHXqSP/BhMB0VQ+2AYTAdBEsRajfdAsPtkEBSP/BhMB17w+2Qf9Mi8FI/8k8MHULD7ZB/0j/yTwwdPVBOsFIjVH/SA9F0Q8fgAAAAABBD7YASI1SAYgCTY1AAYTAde7DzMzMzMzMzMzMzMzMzEyLCkQPtgFJi5EQAQAAQYA8EGV0GkmLAQ8fhAAAAAAARA+2QQFI/8FC9gRABHXxQQ+2wIA8EHh1BUQPtkECSYuB+AAAAEiNUQJID0XRSIsID7YBiAJIjUIBDx+AAAAAAA+2CEEPttBEiABIjUABRA+2wYTSderDzEiJXCQQSIlsJBhWV0FWSIPsIEiLWRBMi/JIi/lIhdt1DOjCVAAASIvYSIlHEIsrSI1UJECDIwC+AQAAAEiLTxhIg2QkQABIK85EjUYJ6FpiAABBiQZIi0cQSIXAdQnohVQAAEiJRxCDOCJ0EUiLRCRASDtHGHIGSIlHGOsDQDL2gzsAdQaF7XQCiStIi1wkSECKxkiLbCRQSIPEIEFeX17DzMzMSIlcJBBIiXQkGEiJfCQgQVZIg+wgSItZEEyL8kiL+UiF23UM6BtUAABIi9hIiUcQizNIjVQkMIMjAEG4CgAAAEiLTxhIg2QkMABIg+kC6OFhAABBiQZIi0cQSIXAdQno4FMAAEiJRxCDOCJ0E0iLRCQwSDtHGHIISIlHGLAB6wIywIM7AHUGhfZ0AokzSItcJDhIi3QkQEiLfCRISIPEIEFew8xIiVwkCEiJfCQQQVZIg+wgSIvZg8//SIuJaAQAAEiFyXUj6HlTAADHABYAAADoTlIAAIvHSItcJDBIi3wkOEiDxCBBXsPo6h8AAITAdORIg3sYAHUV6EZTAADHABYAAADoG1IAAIPI/+vK/4NwBAAAg7twBAAAAg+EjgEAAEyNNewwAQCDY1AAg2MsAOlSAQAASP9DGIN7KAAPjFkBAABID75TQY1C4Dxadw5IjULgg+B/QYtMxgTrAjPJi0MsjQzIg+F/QYsEzolDLIP4CA+ETv///4XAD4T3AAAAg+gBD4TVAAAAg+gBD4SXAAAAg+gBdGeD6AF0WYPoAXQog+gBdBaD+AEPhSf///9Ii8vokQsAAOnDAAAASIvL6OwGAADptgAAAID6KnQRSI1TOEiLy+iC/f//6aAAAABIg0MgCEiLQyCLSPiFyQ9Iz4lLOOswg2M4AOmJAAAAgPoqdAZIjVM068lIg0MgCEiLQyCLSPiJSzSFyXkJg0swBPfZiUs0sAHrVorCgPogdCg8I3QePCt0FDwtdAo8MHVHg0swCOtBg0swBOs7g0swAes1g0swIOsvg0swAuspg2M0AINjMACDYzwAxkNAAIl7OMZDVADrEEiLy+gdBQAAhMAPhE/+//9Ii0MYigiIS0GEyQ+Fnf7//0j/Qxj/g3AEAACDu3AEAAACD4V5/v//i0Mo6SH+///MSIvESIlYCEiJaBBIiXAYSIl4IEFWSIPsIIPP/zP2SIvZSDmxaAQAAA+ENAIAAEg5cRh1F+hTUQAAxwAWAAAA6ChQAAALx+n8AQAA/4FwBAAAg7lwBAAAAg+E5gEAAL0gAAAATI018i4BAIlzUIlzLOmjAQAASINDGAI5cygPjK4BAABED7dDQkEPt8BmK8Vmg/hadw5JjUDgg+B/QYtMxgTrAovOi0MsjQzIg+F/QYsEzolDLIP4CA+EpAEAAIXAD4QHAQAAg+gBD4TqAAAAg+gBD4SiAAAAg+gBdGuD6AF0XoPoAXQog+gBdBaD+AEPhX0BAABIi8voFwwAAOkSAQAASIvL6F4GAADpBQEAAGZBg/gqdBFIjVM4SIvL6Cb8///p7QAAAEiDQyAISItDIItI+IXJD0jPiUs46dIAAACJczjp0AAAAGZBg/gqdAZIjVM068VIg0MgCEiLQyCLSPiJSzSFyQ+JpgAAAINLMAT32YlLNOmYAAAAZkQ7xXQzZkGD+CN0J2ZBg/grdBpmQYP4LXQNZkGD+DB1fINLMAjrdoNLMATrcINLMAHraglrMOtlg0swAutfSIlzMECIc0CJeziJczxAiHNU60vGQ1QBSIuDaAQAAItQFMHqDPbCAXQNSIuDaAQAAEg5cAh0GkiLk2gEAABBD7fI6Kx0AAC5//8AAGY7wXQF/0Mo6wOJeyiwAYTAdFpIi0MYD7cIZolLQmaFyQ+FSf7//0iDQxgC/4NwBAAAg7twBAAAAg+FJv7//4tDKEiLXCQwSItsJDhIi3QkQEiLfCRISIPEIEFew+glTwAAxwAWAAAA6PpNAACLx+vRzMxIi8RIiVgISIloEEiJcBhIiXggQVZIg+wgg8//M/ZIi9lIObFoBAAAD4QqAgAASDlxGHUX6NtOAADHABYAAADosE0AAAvH6fIBAAD/gXAEAACDuXAEAAACD4TcAQAAvSAAAABMjTV6LAEAiXNQiXMs6ZkBAABIg0MYAjlzKA+MpAEAAA+3U0IPt8JmK8Vmg/hadw5IjULgg+B/QYtMxgTrAovOi0MsjQzIg+F/QYsEzolDLIP4CA+EnAEAAIXAD4QAAQAAg+gBD4TjAAAAg+gBD4SgAAAAg+gBdGqD6AF0XYPoAXQog+gBdBaD+AEPhXUBAABIi8vogQwAAOkKAQAASIvL6HwFAADp/QAAAGaD+ip0EUiNUzhIi8vosfn//+nmAAAASINDIAhIi0Mgi0j4hckPSM+JSzjpywAAAIlzOOnJAAAAZoP6KnQGSI1TNOvGSINDIAhIi0Mgi0j4iUs0hckPiaAAAACDSzAE99mJSzTpkgAAAGY71XQvZoP6I3QkZoP6K3QYZoP6LXQMZoP6MHV7g0swCOt1g0swBOtvg0swAetpCWsw62SDSzAC615IiXMwQIhzQIl7OIlzPECIc1TrSsZDVAFIi4toBAAASItBCEg5QRB1EEA4cRh0Bf9DKOskiXso6x//QyhI/0EQSIuDaAQAAEiLCGaJEUiLg2gEAABIgwACsAGEwHRaSItDGA+3CGaJS0JmhckPhVP+//9Ig0MYAv+DcAQAAIO7cAQAAAIPhTD+//+LQyhIi1wkMEiLbCQ4SIt0JEBIi3wkSEiDxCBBXsPot0wAAMcAFgAAAOiMSwAAi8fr0UBTSIPsIDPSSIvZ6GAAAACEwHRESIuDaAQAAA++U0GLSBTB6Qz2wQF0DkiLg2gEAABIg3gIAHQTi8pIi5NoBAAA6CZzAACD+P90Bf9DKOsEg0so/7AB6xLoS0wAAMcAFgAAAOggSwAAMsBIg8QgW8NAU0iD7CBMD75BQUiL2cZBVABBg/j/fBdIi0EISIsASIsAQg+3DECB4QCAAADrAjPJhcl0ZUiLg2gEAACLUBTB6gz2wgF0DkiLg2gEAABIg3gIAHQUSIuTaAQAAEGLyOiYcgAAg/j/dAX/QyjrBINLKP9Ii0MYighI/8CIS0FIiUMYhMl1FOitSwAAxwAWAAAA6IJKAAAywOsCsAFIg8QgW8PMzEiD7CiKQUE8RnUZ9gEID4VSAQAAx0EsBwAAAEiDxCjpdAQAADxOdSf2AQgPhTUBAADHQSwIAAAA6FdLAADHABYAAADoLEoAADLA6RkBAACDeTwAdeM8SQ+EsAAAADxMD4SfAAAAPFQPhI4AAAA8aHRsPGp0XDxsdDQ8dHQkPHd0FDx6D4XdAAAAx0E8BgAAAOnRAAAAx0E8DAAAAOnFAAAAx0E8BwAAAOm5AAAASItBGIA4bHUOSP/ASIlBGLgEAAAA6wW4AwAAAIlBPOmVAAAAx0E8BQAAAOmJAAAASItBGIA4aHUOSP/ASIlBGLgBAAAA69W4AgAAAOvOx0E8DQAAAOtix0E8CAAAAOtZSItRGIoCPDN1F4B6ATJ1EUiNQgLHQTwKAAAASIlBGOs4PDZ1F4B6ATR1EUiNQgLHQTwLAAAASIlBGOsdLFg8IHcXSLoBEIIgAQAAAEgPo8JzB8dBPAkAAACwAUiDxCjDzMzMSIPsKA+3QUJmg/hGdRn2AQgPhXUBAADHQSwHAAAASIPEKOmFBQAAZoP4TnUn9gEID4VWAQAAx0EsCAAAAOjiSQAAxwAWAAAA6LdIAAAywOk6AQAAg3k8AHXjZoP4SQ+ExAAAAGaD+EwPhLEAAABmg/hUD4SeAAAAZoP4aHR4ZoP4anRmZoP4bHQ6ZoP4dHQoZoP4d3QWZoP4eg+F7AAAAMdBPAYAAADp4AAAAMdBPAwAAADp1AAAAMdBPAcAAADpyAAAAEiLQRhmgzhsdQ9Ig8ACSIlBGLgEAAAA6wW4AwAAAIlBPOmiAAAAx0E8BQAAAOmWAAAASItBGGaDOGh1D0iDwAJIiUEYuAEAAADr07gCAAAA68zHQTwNAAAA623HQTwIAAAA62RIi1EYD7cCZoP4M3UYZoN6AjJ1EUiNQgTHQTwKAAAASIlBGOs/ZoP4NnUYZoN6AjR1EUiNQgTHQTwLAAAASIlBGOshZoPoWGaD+CB3F0i6ARCCIAEAAABID6PCcwfHQTwJAAAAsAFIg8Qow8xIg+woD7dBQmaD+EZ1GfYBCA+FdQEAAMdBLAcAAABIg8Qo6dEGAABmg/hOdSf2AQgPhVYBAADHQSwIAAAA6E5IAADHABYAAADoI0cAADLA6ToBAACDeTwAdeNmg/hJD4TEAAAAZoP4TA+EsQAAAGaD+FQPhJ4AAABmg/hodHhmg/hqdGZmg/hsdDpmg/h0dChmg/h3dBZmg/h6D4XsAAAAx0E8BgAAAOngAAAAx0E8DAAAAOnUAAAAx0E8BwAAAOnIAAAASItBGGaDOGx1D0iDwAJIiUEYuAQAAADrBbgDAAAAiUE86aIAAADHQTwFAAAA6ZYAAABIi0EYZoM4aHUPSIPAAkiJQRi4AQAAAOvTuAIAAADrzMdBPA0AAADrbcdBPAgAAADrZEiLURgPtwJmg/gzdRhmg3oCMnURSI1CBMdBPAoAAABIiUEY6z9mg/g2dRhmg3oCNHURSI1CBMdBPAsAAABIiUEY6yFmg+hYZoP4IHcXSLoBEIIgAQAAAEgPo8JzB8dBPAkAAACwAUiDxCjDzEiJXCQQSIlsJBhIiXQkIFdBVkFXSIPsMIpBQUiL2UG/AQAAAEC2eEC1WEG2QTxkf1YPhLwAAABBOsYPhMYAAAA8Q3QtPEQPjsMAAAA8Rw+OsgAAADxTdFdAOsV0ZzxadBw8YQ+EnQAAADxjD4WeAAAAM9LouAwAAOmOAAAA6CIIAADphAAAADxnfns8aXRkPG50WTxvdDc8cHQbPHN0EDx1dFRAOsZ1Z7oQAAAA603ofBEAAOtVx0E4EAAAAMdBPAsAAABFise6EAAAAOsxi0kwi8HB6AVBhMd0Bw+66QeJSzC6CAAAAEiLy+sQ6LcQAADrGINJMBC6CgAAAEUzwOicDQAA6wXoiQgAAITAdQcywOlVAQAAgHtAAA+FSAEAAItTMDPAZolEJFAz/4hEJFKLwsHoBEGEx3Qui8LB6AZBhMd0B8ZEJFAt6xpBhNd0B8ZEJFAr6w6LwtHoQYTHdAjGRCRQIEmL/4pLQYrBQCrFqN91D4vCwegFQYTHdAVFisfrA0UywIrBQSrGqN8PlMBFhMB1BITAdBvGRDxQMEA6zXQFQTrOdQNAivVAiHQ8UUiDxwKLazQra1Ar7/bCDHUVTI1LKESLxUiNi2gEAACyIOiG6v//TI2zaAQAAEmLBkiNcyiLSBTB6QxBhM90DkmLBkiDeAgAdQQBPuscSI1DEEyLzkSLx0iJRCQgSI1UJFBJi87oyxUAAItLMIvBwegDQYTHdBjB6QJBhM91EEyLzkSLxbIwSYvO6B7q//8z0kiLy+jkEQAAgz4AfBuLSzDB6QJBhM90EEyLzkSLxbIgSYvO6PTp//9BisdIi1wkWEiLbCRgSIt0JGhIg8QwQV9BXl/DSIlcJBBIiWwkGFZXQVVBVkFXSIPsQEiLBXvIAQBIM8RIiUQkOA+3QUK+eAAAAEiL2Y1u4ESNfolmg/hkd2UPhN0AAABmg/hBD4TmAAAAZoP4Q3Q5ZoP4RA+G3wAAAGaD+EcPhswAAABmg/hTdG9mO8V0f2aD+Fp0IGaD+GEPhLEAAABmg/hjD4WwAAAAM9Lo4AoAAOmgAAAA6PYFAADplgAAAGaD+GcPhocAAABmg/hpdG5mg/hudGFmg/hvdD1mg/hwdB9mg/hzdBJmg/h1dFRmO8Z1Z7oQAAAA603oYg8AAOtVx0E4EAAAAMdBPAsAAABFise6EAAAAOsxi0kwi8HB6AVBhMd0Bw+66QeJSzC6CAAAAEiLy+sQ6AUOAADrGINJMBC6CgAAAEUzwOhqDAAA6wXokwcAAITAdQcywOlzAQAAgHtAAA+FZgEAAItLMDPAiUQkMDP/ZolEJDSLwcHoBESNbyBBhMd0MovBwegGQYTHdAqNRy1miUQkMOsbQYTPdAe4KwAAAOvti8HR6EGEx3QJZkSJbCQwSYv/D7dTQkG53/8AAA+3wmYrxWZBhcF1D4vBwegFQYTHdAVFisfrA0UywI1Cv2ZBhcFBuTAAAAAPlMBFhMB1BITAdB1mRIlMfDBmO9V0BmaD+kF1Aw+39WaJdHwySIPHAotzNCtzUCv39sEMdRZMjUsoRIvGSI2LaAQAAEGK1ehF6P//TI2zaAQAAEmLBkiNayiLSBTB6QxBhM90D0mLBkiDeAgAdQUBfQDrHEiNQxBMi81Ei8dIiUQkIEiNVCQwSYvO6PUTAACLSzCLwcHoA0GEx3QYwekCQYTPdRBMi81Ei8ayMEmLzujc5///M9JIi8voOhAAAIN9AAB8HItLMMHpAkGEz3QRTIvNRIvGQYrVSYvO6LDn//9BisdIi0wkOEgzzOi0xf//TI1cJEBJi1s4SYtrQEmL40FfQV5BXV9ew8zMzEiJXCQQSIlsJBhIiXQkIFdBVEFVQVZBV0iD7EBIiwWVxQEASDPESIlEJDgPt0FCvngAAABIi9mNbuBEjX6JZoP4ZHdlD4TdAAAAZoP4QQ+E5gAAAGaD+EN0OWaD+EQPht8AAABmg/hHD4bMAAAAZoP4U3RvZjvFdH9mg/hadCBmg/hhD4SxAAAAZoP4Yw+FsAAAADPS6PoHAADpoAAAAOgQAwAA6ZYAAABmg/hnD4aHAAAAZoP4aXRuZoP4bnRhZoP4b3Q9ZoP4cHQfZoP4c3QSZoP4dXRUZjvGdWe6EAAAAOtN6HwMAADrVcdBOBAAAADHQTwLAAAARYrHuhAAAADrMYtJMIvBwegFQYTHdAcPuukHiUswuggAAABIi8vrEOgfCwAA6xiDSTAQugoAAABFM8DohAkAAOsF6K0EAACEwHUHMsDpVQEAAIB7QAAPhUgBAACLUzAzwIlEJDAz/2aJRCQ0i8LB6AREjW8gQYTHdDKLwsHoBkGEx3QKjUctZolEJDDrG0GE13QHuCsAAADr7YvC0ehBhMd0CWZEiWwkMEmL/w+3S0JBud//AAAPt8FmK8VmQYXBdQ+LwsHoBUGEx3QFRYrH6wNFMsCNQb9BvDAAAABmQYXBD5TARYTAdQSEwHQdZkSJZHwwZjvNdAZmg/lBdQMPt/VmiXR8MkiDxwKLazRMjXMoK2tQSI2zaAQAACvv9sIMdRFNi85Ei8VBitVIi87o7eX//0iNQxBNi85Ei8dIiUQkIEiNVCQwSIvO6JEPAACLSzCLwcHoA0GEx3QZwekCQYTPdRFNi85Ei8VBitRIi87oq+X//zPSSIvL6HkOAABMjUsoQYM5AHwbRItTMEHB6gJFhNd0DkSLxUGK1UiLzuh85f//QYrHSItMJDhIM8zo7ML//0yNXCRASYtbOEmLa0BJi3NISYvjQV9BXkFdQVxfw8zMzMzMzMzMzMzMzMzMg/kLdy5IY8FIjRURqv//i4yCGFYAAEgDyv/huAEAAADDuAIAAADDuAQAAADDuAgAAADDM8DDZpAHVgAA+1UAAAFWAAAHVgAADVYAAA1WAAANVgAADVYAABNWAAANVgAAB1YAAA1WAABIg0EgCEiLQSBMi0D4TYXAdEdNi0gITYXJdD6LUTyD6gJ0IIPqAXQXg/oJdBKDeTwNdBCKQUEsY6jvD5XC6wayAesCMtJMiUlIQQ+3AITSdBjGQVQB0ejrFEiNFdgfAQC4BgAAAEiJUUjGQVQAiUFQsAHDzEiJXCQISIl0JBBXSIPsIEiDQSAISIvZSItBIEiLePhIhf90LEiLdwhIhfZ0I0SLQTwPt1FCSIsJ6Gfg//9IiXNID7cPhMB0GMZDVAHR6esUSI0NbR8BAEiJS0i5BgAAAMZDVACJS1CwAUiLXCQwSIt0JDhIg8QgX8PMzMxIiVwkEFdIg+xQg0kwEEiL2YtBOIXAeRaKQUEsQSTf9tgbwIPg+YPADYlBOOscdRqAeUFndAgzwIB5QUd1DMdBOAEAAAC4AQAAAEiNeVgFXQEAAEhj0EiLz+h23v//QbgAAgAAhMB1IUiDu2AEAAAAdQVBi8DrCkiLg1gEAABI0egFo/7//4lDOEiLhwgEAABIhcBID0THSIlDSEiDQyAISItDIEiLi2AEAADyDxBA+PIPEUQkYEiFyXUFSYvQ6wpIi5NYBAAASNHqSIXJdQlMjYtYAgAA6xpMi4tYBAAASIv5TIuDWAQAAEnR6UwDyUnR6EiLQwgPvktBx0QkSAEAAABIiUQkQEiLA0iJRCQ4i0M4iUQkMIlMJChIjUwkYEiJVCQgSIvX6CReAACLQzDB6AWoAXQTg3s4AHUNSItTCEiLS0jov+b//4pDQSxHqN91F4tDMMHoBagBdQ1Ii1MISItLSOj/5f//SItLSIoBPC11DYNLMEBI/8FIiUtIigEsSTwldxhIuiEAAAAhAAAASA+jwnMIg2Mw98ZDQXNIg8r/SP/CgDwRAHX3iVNQsAFIi1wkaEiDxFBfw8xIiVwkEEiJfCQYQVZIg+xQg0kwEEiL2YtBOEG+3/8AAIXAeRwPt0FCZoPoQWZBI8Zm99gbwIPg+YPADYlBOOsedRxmg3lCZ3QJM8Bmg3lCR3UMx0E4AQAAALgBAAAASI15WAVdAQAASGPQSIvP6Kbc//9BuAACAACEwHUhSIO7YAQAAAB1BUGLwOsKSIuDWAQAAEjR6AWj/v//iUM4SIuHCAQAAEiFwEgPRMdIiUNISINDIAhIi0MgSIuLYAQAAPIPEED48g8RRCRgSIXJdQVJi9DrCkiLk1gEAABI0epIhcl1CUyNi1gCAADrGkyLi1gEAABIi/lMi4NYBAAASdHpTAPJSdHoSItDCA++S0LHRCRIAQAAAEiJRCRASIsDSIlEJDiLQziJRCQwiUwkKEiNTCRgSIlUJCBIi9foVFwAAItDMMHoBagBdBODezgAdQ1Ii1MISItLSOjv5P//D7dDQmaD6EdmQYXGdReLQzDB6AWoAXUNSItTCEiLS0joKuT//0iLS0iKATwtdQ2DSzBASP/BSIlLSIoBLEk8JXcdSLohAAAAIQAAAEgPo8JzDYNjMPe4cwAAAGaJQ0JIg8r/SP/CgDwRAHX3SIt8JHCwAYlTUEiLXCRoSIPEUEFew8xAU0iD7DBIi9mLSTyD6QJ0HIPpAXQdg/kJdBiDezwNdF6KQ0EsY6jvD5XA6wIywITAdExIg0MgCEiLQyBIi5NgBAAARA+3SPhIhdJ1DEG4AAIAAEiNU1jrCkyLg1gEAABJ0ehIi0MISI1LUEiJRCQg6PtIAACFwHQuxkNAAesoSI1DWEyLgAgEAABNhcBMD0TASINDIAhIi0sgilH4QYgQx0NQAQAAAEiNS1iwAUiLkQgEAABIhdJID0TRSIlTSEiDxDBbw8zMzEiJXCQQSIl0JBhXSIPsIMZBVAFIjXlYSINBIAhIi9lIi0EgRItBPA+3UUJIiwkPt3D46I3b//9Ii48IBAAAhMB1L0yLSwhIjVQkMECIdCQwSIXJiEQkMUgPRM9JiwFMY0AI6LlGAACFwHkQxkNAAesKSIXJSA9Ez2aJMUiLjwgEAACwAUiLdCRASIXJx0NQAQAAAEgPRM9IiUtISItcJDhIg8QgX8PMzEiLxEiJWAhIiWgQSIlwGEiJeCBBVkiD7CBIi9lBiuiLSTxEi/Locvn//0iLyEiL8EiD6QF0fkiD6QF0WEiD6QJ0NEiD+QR0F+gPOAAAxwAWAAAA6OQ2AAAywOkFAQAAi0MwSINDIAjB6ASoAUiLQyBIi3j461yLQzBIg0MgCMHoBKgBSItDIHQGSGN4+OtDi3j46z6LQzBIg0MgCMHoBKgBSItDIHQHSA+/ePjrJA+3ePjrHotDMEiDQyAIwegEqAFIi0MgdAdID754+OsED7Z4+ItLMIvBwegEqAF0DkiF/3kJSPffg8lAiUswg3s4AH0Jx0M4AQAAAOsTSGNTOIPh94lLMEiNS1joutj//0iF/3UEg2Mw38ZDVABEis1Fi8ZIi8tIg/4IdQpIi9foVtv//+sHi9foIdr//4tDMMHoB6gBdB2De1AAdAlIi0tIgDkwdA5I/0tISItLSMYBMP9DULABSItcJDBIi2wkOEiLdCRASIt8JEhIg8QgQV7DzEiLxEiJWAhIiWgQSIlwGEiJeCBBVkiD7CBIi9lBiuiLSTxEi/Lo8vf//0iLyEiL8EiD6QF0fkiD6QF0WEiD6QJ0NEiD+QR0F+iPNgAAxwAWAAAA6GQ1AAAywOkLAQAAi0MwSINDIAjB6ASoAUiLQyBIi3j461yLQzBIg0MgCMHoBKgBSItDIHQGSGN4+OtDi3j46z6LQzBIg0MgCMHoBKgBSItDIHQHSA+/ePjrJA+3ePjrHotDMEiDQyAIwegEqAFIi0MgdAdID754+OsED7Z4+ItLMIvBwegEqAF0DkiF/3kJSPffg8lAiUswg3s4AH0Jx0M4AQAAAOsTSGNTOIPh94lLMEiNS1jo4tf//0iF/3UEg2Mw38ZDVAFEis1Fi8ZIi8tIg/4IdQpIi9foZtr//+sHi9foKdn//4tDMMHoB6gBdCODe1AAuDAAAAB0CUiLS0hmOQF0D0iDQ0j+SItLSGaJAf9DULABSItcJDBIi2wkOEiLdCRASIt8JEhIg8QgQV7DzMzMSIlcJAhXSIPsIEiDQSAISIvZSItBIEiLePjoEVwAAIXAdRToLDUAAMcAFgAAAOgBNAAAMsDrRItLPOhV9v//SIPoAXQrSIPoAXQcSIPoAnQPSIP4BHXMSGNDKEiJB+sVi0MoiQfrDg+3QyhmiQfrBYpDKIgHxkNAAbABSItcJDBIg8QgX8PMzEBTSIPsIEiDQSAISIvZSItBIESLQzhBg/j/SItI+Lj///9/i1M8RA9EwEiJS0iD6gJ0HIPqAXQdg/oJdBiDezwNdDCKQ0EsY6jvD5XA6wIywITAdB5Ihcl1C0iNDTsWAQBIiUtISWPQxkNUAejHCwAA6xhIhcl1C0iNDS0WAQBIiUtISWPQ6DEJAACJQ1CwAUiDxCBbw8zMSIlcJAhIiXQkEFdIg+wgSINBIAhIi/lIi0Egi3E4g/7/RItBPA+3UUJIi1j4uP///39IiVlID0TwSIsJ6LPW//+EwHQhSIXbdQtIjR2zFQEASIlfSEhj1kiLy8ZHVAHoPAsAAOtMSIXbdQtIjR2iFQEASIlfSEUzyYX2fjKAOwB0LUiLRwgPthNIiwhIiwFIjUsBRA+3BFBBgeAAgAAASA9Ey0H/wUiNWQFEO858zkGLwYlHULABSItcJDBIi3QkOEiDxCBfw8xIg+woi0EUwegMqAEPhYEAAADo8VkAAExjyEyNFQu5AQBMjR3EzAEATYvBQY1BAoP4AXYbSYvBSYvRSMH6BoPgP0iNDMBJiwTTSI0UyOsDSYvSgHo5AHUnQY1BAoP4AXYXSYvASMH4BkGD4D9JiwTDS40MwEyNFMhB9kI9AXQU6OgyAADHABYAAADovTEAADLA6wKwAUiDxCjDzMxIiVwkEEiJdCQYV0iD7FBIiwXatgEASDPESIlEJECAeVQASIvZD4SWAAAAg3lQAA+OjAAAAEiLcUgz/0iLQwhIjVQkNEQPtw5IjUwkMINkJDAASI12AkG4BgAAAEiJRCQg6A5CAACFwHVRRItEJDBFhcB0R0yNk2gEAABJiwJMjUsoi0gUwekM9sEBdA9JiwJIg3gIAHUFRQEB6xZIjUMQSYvKSI1UJDRIiUQkIOgGAwAA/8c7e1B1gutHg0so/+tBRItBUEyNkWgEAABJiwJMjUkoSItRSItIFMHpDPbBAXQPSYsCSIN4CAB1BUUBAesRSI1DEEmLykiJRCQg6LYCAACwAUiLTCRASDPM6L+1//9Ii1wkaEiLdCRwSIPEUF/DzMzMSIlcJBBIiWwkGFZXQVZIg+wwRTP2SIvZRDhxVA+FiwAAAEQ5cVAPjoEAAABIi3FIQYv+TItLCEiNTCRQZkSJdCRQSIvWSYsBTGNACOh3PwAASGPohcB+T0iLg2gEAAAPt0wkUItQFMHqDPbCAXQNSIuDaAQAAEw5cAh0FkiLk2gEAADoRFYAALn//wAAZjvBdAX/QyjrBINLKP9IA/X/xzt7UHWO60aDSyj/60BEi0FQTI2RaAQAAEmLAkyNSShIi1FIi0gUwekM9sEBdA5JiwJMOXAIdQVFAQHrEUiNQxBJi8pIiUQkIOifAgAASItcJFiwAUiLbCRgSIPEMEFeX17DzMxIiVwkEEiJbCQYSIl0JCBXSIPsMDPtSIvZQDhpVA+FiwAAADlpUA+OggAAAEiLcUiL/UyLSwhIjUwkQGaJbCRASIvWSYsBTGNACOh1PgAATGPAhcB+UkiLi2gEAAAPt1QkQEiLQQhIOUEQdRFAOGkYdAX/QyjrJYNLKP/rH/9DKEj/QRBIi4NoBAAASIsIZokRSIuDaAQAAEiDAAJJA/D/xzt7UHWM6yeDSyj/6yFEi0NQSI1BEEiLU0hMjUkoSIHBaAQAAEiJRCQg6BkAAABIi1wkSLABSItsJFBIi3QkWEiDxDBfw8zMRYXAD4SbAAAASIlcJAhIiWwkEEiJdCQYV0FWQVdIg+wgTIv5SWPwSIsJSYv5SItBCEg5QRB1EYB5GAB0BUEBMetKQYMJ/+tESCtBEEyL9kiLCUg7xkwPQvBLjRw2TIvD6OvwAABJiwdIARhJiwdMAXAQSYsHgHgYAHQEATfrDUw79nQFgw//6wNEATdIi1wkQEiLbCRISIt0JFBIg8QgQV9BXl/DzMzMSIvESIlYCEiJaBBIiXAYSIl4IEFUQVZBV0iD7CBMi3wkYEmL+Ulj6EiL8kyL8UmLH0iF23UL6N0uAABIi9hJiQdEiyODIwBIA+7rc0mLBg++FotIFMHpDPbBAXQKSYsGSIN4CAB0TovKSYsW6GtVAACD+P91P0mLB0iFwHUI6JUuAABJiQeDOCp1O0mLBotIFMHpDPbBAXQKSYsGSIN4CAB0EkmLFrk/AAAA6CxVAACD+P90BP8H6wODD/9I/8ZIO/V1iOsDgw//gzsAdQhFheR0A0SJI0iLXCRASItsJEhIi3QkUEiLfCRYSIPEIEFfQV5BXMPMzMxIi8RIiVgISIloEEiJcBhIiXggQVRBVkFXSIPsIEyLfCRgSYv5TWPgSIvyTIvxSYsfSIXbdQvo5S0AAEiL2EmJB4srTo0kZoMjAOt8SYsGD7cOi1AUweoM9sIBdApJiwZIg3gIAHRWSYsW6NFSAAC5//8AAGY7wXVESYsHSIXAdQjomi0AAEmJB4M4KnVFSYsGi0gUwekM9sEBdApJiwZIg3gIAHQXSYsWuT8AAADojVIAALn//wAAZjvBdAT/B+sDgw//SIPGAkk79A+Fe////+sDgw//gzsAdQaF7XQCiStIi1wkQEiLbCRISIt0JFBIi3wkWEiDxCBBX0FeQVzDQFVIi+xIg+xgSItFMEiJRcBMiU0YTIlFKEiJVRBIiU0gSIXSdRXo9SwAAMcAFgAAAOjKKwAAg8j/60pNhcB05kiNRRBIiVXISIlF2EyNTchIjUUYSIlV0EiJReBMjUXYSI1FIEiJRehIjVXQSI1FKEiJRfBIjU0wSI1FwEiJRfjo88v//0iDxGBdw8xAVUiL7EiD7GBIi0UwSIlFwEyJTRhMiUUoSIlVEEiJTSBIhdJ1FehpLAAAxwAWAAAA6D4rAACDyP/rSk2FwHTmSI1FEEiJVchIiUXYTI1NyEiNRRhIiVXQSIlF4EyNRdhIjUUgSIlF6EiNVdBIjUUoSIlF8EiNTTBIjUXASIlF+Ogny///SIPEYF3DzOmby///zMzMSIlcJAhXSIPsIIM9b8MBAABIY9mNewF1IYH/AAEAAHd4SIsF6LEBAA+3BFiD4AhIi1wkMEiDxCBfw+iNQAAASI1UJDhIi4iQAAAASIlMJDhIi8joHEMAAEiLRCQ4gf8AAQAAdxVIiwgPtwRZg+AISItcJDBIg8QgX8ODeAgBfhlFM8CLy0GNUAjoslMAAEiLXCQwSIPEIF/DSItcJDAzwEiDxCBfw8zMx0QkEAAAAACLRCQQ6d8rAADMzMzpozgAAMzMzGaDOQBMi8F0C0mDwAJmQYM4AHX1TCvCD7cCZkGJBBBIjVICZoXAde9Ii8HDiwWCrwEATIvJg/gFD4yTAAAATIvBuCAAAABBg+AfSSvASffYTRvSTCPQSYvBSTvSTA9C0kkDykw7yXQNgDgAdAhI/8BIO8F180iLyEkryUk7yg+F9AAAAEyLwkiLyE0rwkmD4OBMA8BJO8B0HMXx78nF9XQJxf3XwYXAxfh3dQlIg8EgSTvIdeRJjQQR6wyAOQAPhLEAAABI/8FIO8h17+mkAAAAg/gBD4yFAAAAg+EPuBAAAABIK8FI99lNG9JMI9BJi8FJO9JMD0LSS40MCkw7yXQNgDgAdAhI/8BIO8F180iLyEkryUk7ynVfTIvCSIvITSvCD1fJSYPg8EwDwEk7wHQZZg9vwWYPdAFmD9fAhcB1CUiDwRBJO8h150mNBBHrCIA5AHQgSP/BSDvIdfPrFkiNBBFMO8h0DYA5AHQISP/BSDvIdfNJK8lIi8HDiwUyrgEATIvBSIvRg/gFD4yCAAAAQfbAAXQRM8lmOQoPhPkAAABIg8IC6/GD4R+4IAAAAEgrwUj32U0byTPJTCPISdHpS40ESEw7wHQOZjkKdAlIg8ICSDvQdfJJK9BI0fpJO9EPhboAAABJjRRQxfHvycX1dQrF/dfBhcDF+Hd1BkiDwiDr52Y5Cg+EjgAAAEiDwgLr8YP4AXx2QfbAAXQNM8lmOQp0dkiDwgLr9YPhD7gQAAAASCvBSPfZTRvJM8lMI8hJ0elLjQRITDvAdA5mOQp0CUiDwgJIO9B18kkr0EjR+kk70XU7SY0UUA9XyfMPbwJmD3XBZg/XwIXAdQZIg8IQ6+pmOQp0E0iDwgLr9TPJZjkKdAZIg8IC6/VJK9BI0fpIi8LDzMzMiwUGrQEATIvSTIvBg/gFD4zMAAAAQfbAAXQpSI0EUUiL0Ug7yA+EoQEAADPJZjkKD4SWAQAASIPCAkg70HXu6YgBAACD4R+4IAAAAEgrwUmL0Ej32U0b20wj2EnR6007000PQtozyUuNBFhMO8B0DmY5CnQJSIPCAkg70HXySSvQSNH6STvTD4VFAQAATY0MUEmLwkkrw0iD4OBIA8JJjRRATDvKdB3F8e/JxMF1dQnF/dfBhcDF+Hd1CUmDwSBMO8p140uNBFDrCmZBOQl0CUmDwQJMO8h18UmL0enrAAAAg/gBD4zGAAAAQfbAAXQpSI0EUUmL0Ew7wA+EzAAAADPJZjkKD4TBAAAASIPCAkg70HXu6bMAAACD4Q+4EAAAAEgrwUmL0Ej32U0b20wj2EnR6007000PQtozyUuNBFhMO8B0DmY5CnQJSIPCAkg70HXySSvQSNH6STvTdXRJi8JNjQxQSSvDD1fJSIPg8EgDwkmNFEDrFWYPb8FmQQ91AWYP18CFwHUJSYPBEEw7ynXmS40EUOsOZkE5CQ+EN////0mDwQJMO8h17ekp////SI0EUUmL0Ew7wHQQM8lmOQp0CUiDwgJIO9B18kkr0EjR+kiLwsPMzEiJXCQISIlsJBBIiXQkGFdIg+wgSItREEiL+YtJGP8VOPMAADPbi/CFwHUW/xUC8gAAi8joEyYAAOh+JgAAixjrbEg7dxh3BkiJdyDrYEiNbgE4Xyh0DEiLTxDo9CYAAIhfKEiNDHUCAAAA6LAzAABIiUcQSIvLSPfYG9L30oPiDEgPRM2F0g+UwIhHKEiJTxiF0nQEi9rrFUiLVxD/FbnyAACLwEiFwHSCSIlHIEiLbCQ4i8NIi1wkMEiLdCRASIPEIF/DzMzMSIvESIlYCEiJaBBIiXAYSIl4IEFWSIPsQDPbRYvwSIv6SIvxSIXJdSI4Wih0DEiLShDoVSYAAIhfKEiJXxBIiV8YSIlfIOkiAQAAZjkZdVRIOVoYdUY4Wih0DEiLShDoKCYAAIhfKLkBAAAA6OcyAABIiUcQSIvLSPfYG9L30oPiDA+UwYXSD5TAiEcoSIlPGIXSdAeL2unRAAAASItHEIgY655IiVwkOEGDyf9IiVwkMEyLxolcJCgz0kGLzkiJXCQg6OxSAABIY+iFwHUZ/xWX8AAAi8joqCQAAOgTJQAAixjphQAAAEiLTxhIO+l2QjhfKHQMSItPEOiNJQAAiF8oSIvN6E4yAABIiUcQSIvLSPfYG9L30oPiDEgPRM2F0g+UwIhHKEiJTxiF0g+FYv///0iLRxBBg8n/SIlcJDhMi8ZIiVwkMDPSiUwkKEGLzkiJRCQg6FlSAABIY8iFwA+Eaf///0j/yUiJTyBIi2wkWIvDSItcJFBIi3QkYEiLfCRoSIPEQEFew8zMSIvESIlYEEiJcBhIiXggVUiNqHj+//9IgeyAAgAASIsFY6gBAEgzxEiJhXABAAAz9kiFyXUf6A0kAACJMOgmJAAAxwAWAAAA6PsiAACDy//p1QAAAP8VpfAAAIXAdQ//FXvvAACLyOiMIwAA69+5BQEAAEiJdCRASI1EJGBIiUwkKEiJRCQgSI1EJGBIiUwkOEiNTCQgSIlEJDBAiHQkSOgH/f//hcB0E0A4dCRIdJ1Ii0wkMOhGJAAA65FIi3wkMA+3B2aD+Fx0BmaD+C91CmY7RwJ1BIve60EPvg/oCk4AALk9AAAAZolEJFJmiUwkUEiL10iNTCRQx0QkVDoAAAD/FcnuAACFwHXL/xXP7gAAi8jo4CIAAIPL/0A4dCRIdAhIi8/o1iMAAIvDSIuNcAEAAEgzzOgtp///TI2cJIACAABJi1sYSYtzIEmLeyhJi+Ndw0iJXCQISIlsJBBIiXQkGFdIg+wgSIvyi/noPjkAAEUzyUiL2EiFwA+EPgEAAEiLCEiLwUyNgcAAAABJO8h0DTk4dAxIg8AQSTvAdfNJi8FIhcAPhBMBAABMi0AITYXAD4QGAQAASYP4BXUNTIlICEGNQPzp9QAAAEmD+AF1CIPI/+nnAAAASItrCEiJcwiDeAQID4W6AAAASIPBMEiNkZAAAADrCEyJSQhIg8EQSDvKdfOBOI0AAMCLexB0eoE4jgAAwHRrgTiPAADAdFyBOJAAAMB0TYE4kQAAwHQ+gTiSAADAdC+BOJMAAMB0IIE4tAIAwHQRgTi1AgDAi9d1QLqNAAAA6za6jgAAAOsvuoUAAADrKLqKAAAA6yG6hAAAAOsauoEAAADrE7qGAAAA6wy6gwAAAOsFuoIAAACJUxC5CAAAAEmLwP8Vh+8AAIl7EOsQi0gETIlICEmLwP8Vcu8AAEiJawjpE////zPASItcJDBIi2wkOEiLdCRASIPEIF/DzMyLBY63AQDDzIkNhrcBAMPMSIsVmaUBAIvKSDMVeLcBAIPhP0jTykiF0g+VwMPMzMxIiQ1htwEAw0iLFXGlAQBMi8GLykgzFU23AQCD4T9I08pIhdJ1AzPAw0mLyEiLwkj/JeruAADMzEyLBUGlAQBMi8lBi9C5QAAAAIPiPyvKSdPJTTPITIkNDLcBAMPMzMxIi8RIiVgISIloEEiJcBhIiXggQVRBVkFXSIPsIEyLfCRgTYvhSYvYTIvySIv5SYMnAEnHAQEAAABIhdJ0B0iJGkmDxghAMu2APyJ1D0CE7UC2IkAPlMVI/8frN0n/B0iF23QHigeIA0j/ww++N0j/x4vO6MRiAACFwHQSSf8HSIXbdAeKB4gDSP/DSP/HQIT2dBxAhO11sECA/iB0BkCA/gl1pEiF23QJxkP/AOsDSP/PQDL2igeEwA+E1AAAADwgdAQ8CXUHSP/Higfr8YTAD4S9AAAATYX2dAdJiR5Jg8YISf8EJLoBAAAAM8DrBUj/x//Aig+A+Vx09ID5InUwhMJ1GECE9nQKOE8BdQVI/8frCTPSQIT2QA+UxtHo6xD/yEiF23QGxgNcSP/DSf8HhcB17IoHhMB0RkCE9nUIPCB0PTwJdDmF0nQtSIXbdAeIA0j/w4oHD77I6N1hAACFwHQSSf8HSP/HSIXbdAeKB4gDSP/DSf8HSP/H6Wb///9Ihdt0BsYDAEj/w0n/B+ki////TYX2dARJgyYASf8EJEiLXCRASItsJEhIi3QkUEiLfCRYSIPEIEFfQV5BXMPMQFNIg+wgSLj/////////H0yLykg7yHM9M9JIg8j/SffwTDvIcy9IweEDTQ+vyEiLwUj30Ek7wXYcSQPJugEAAADoGh8AADPJSIvY6IgfAABIi8PrAjPASIPEIFvDzMzMSIlcJAhVVldBVkFXSIvsSIPsMDP/RIvxhckPhFMBAACNQf+D+AF2FuizHgAAjV8WiRjoiR0AAIv76TUBAADoKV0AAEiNHaa0AQBBuAQBAABIi9MzyejKVAAASIs177UBAEiJHci1AQBIhfZ0BUA4PnUDSIvzSI1FSEiJfUBMjU1ASIlEJCBFM8BIiX1IM9JIi87oSf3//0yLfUBBuAEAAABIi1VISYvP6PP+//9Ii9hIhcB1GOgmHgAAuwwAAAAzyYkY6LAeAADpav///06NBPhIi9NIjUVISIvOTI1NQEiJRCQg6Pf8//9Bg/4BdRaLRUD/yEiJHUW1AQCJBTe1AQAzyetpSI1VOEiJfThIi8vo81IAAIvwhcB0GUiLTTjoVB4AAEiLy0iJfTjoSB4AAIv+6z9Ii1U4SIvPSIvCSDk6dAxIjUAISP/BSDk4dfSJDeO0AQAzyUiJfThIiRXetAEA6BEeAABIi8tIiX046AUeAABIi1wkYIvHSIPEMEFfQV5fXl3DzMxIiVwkCFdIg+wgM/9IOT1dtAEAdAQzwOtI6MZbAADo4V8AAEiL2EiFwHUFg8//6ydIi8voNAAAAEiFwHUFg8//6w5IiQU/tAEASIkFILQBADPJ6JkdAABIi8vokR0AAIvHSItcJDBIg8QgX8NIiVwkCEiJbCQQSIl0JBhXQVZBV0iD7DBMi/Ez9ovOTYvGQYoW6ySA+j1IjUEBSA9EwUiLyEiDyP9I/8BBODQAdfdJ/8BMA8BBihCE0nXYSP/BuggAAADosBwAAEiL2EiFwHRsTIv4QYoGhMB0X0iDzf9I/8VBODQudfdI/8U8PXQ1ugEAAABIi83ofRwAAEiL+EiFwHQlTYvGSIvVSIvI6GsNAAAzyYXAdUhJiT9Jg8cI6M0cAABMA/Xrq0iLy+hEAAAAM8nouRwAAOsDSIvzM8norRwAAEiLXCRQSIvGSIt0JGBIi2wkWEiDxDBBX0FeX8NFM8lIiXQkIEUzwDPS6OcaAADMzMxIhcl0O0iJXCQIV0iD7CBIiwFIi9lIi/nrD0iLyOhaHAAASI1/CEiLB0iFwHXsSIvL6EYcAABIi1wkMEiDxCBfw8zMzEiJXCQISIl0JBBXSIPsQEiLPaqyAQBIhf8PhZQAAACDyP9Ii1wkUEiLdCRYSIPEQF/DSINkJDgAQYPJ/0iDZCQwAEyLwINkJCgAM9JIg2QkIAAzyegHSQAASGPwhcB0v7oBAAAASIvO6FMbAABIi9hIhcB0T0iDZCQ4AEGDyf9Ig2QkMAAz0kyLBzPJiXQkKEiJRCQg6MZIAACFwHQmM9JIi8vosGIAADPJ6IkbAABIg8cISIsHSIXAD4Vz////6V7///9Ii8vobBsAAOlO////zMzMSIPsKEiLCUg7De6xAQB0BejT/v//SIPEKMPMzEiD7ChIiwlIOw3KsQEAdAXot/7//0iDxCjDzMxIg+woSIsFobEBAEiFwHUmSDkFnbEBAHUEM8DrGega/f//hcB0CejJ/v//hcB16kiLBXaxAQBIg8Qow8xIg+woSI0NZbEBAOh8////SI0NYbEBAOiM////SIsNZbEBAOhM/v//SIsNUbEBAEiDxCjpPP7//0iD7ChIiwVFsQEASIXAdTlIiwUhsQEASIXAdSZIOQUdsQEAdQQzwOsZ6Jr8//+FwHQJ6En+//+FwHXqSIsF9rABAEiJBQexAQBIg8Qow8zM6XP8///MzMxIiVwkCEiJbCQQSIl0JBhXSIPsIDPtSIv6SCv5SIvZSIPHB4v1SMHvA0g7ykgPR/1Ihf90GkiLA0iFwHQG/xVF5wAASIPDCEj/xkg793XmSItcJDBIi2wkOEiLdCRASIPEIF/DSIlcJAhXSIPsIEiL+kiL2Ug7ynQbSIsDSIXAdAr/FQHnAACFwHULSIPDCEg73+vjM8BIi1wkMEiDxCBfw8zMzEiJXCQITIlMJCBXSIPsIEmL2UmL+IsK6BBhAACQSIvP6BMAAACQiwvoU2EAAEiLXCQwSIPEIF/DQFNIg+wgSIvZgD0ksAEAAA+FnwAAALgBAAAAhwUDsAEASIsBiwiFyXU0SIsF25wBAIvIg+E/SIsV768BAEg70HQTSDPCSNPIRTPAM9Izyf8VV+YAAEiNDSCwAQDrDIP5AXUNSI0NKrABAOhdBwAAkEiLA4M4AHUTSI0VzeYAAEiNDabmAADomf7//0iNFcrmAABIjQ275gAA6Ib+//9Ii0MIgzgAdQ7GBYavAQABSItDEMYAAUiDxCBbw+gwCQAAkMzMzDPAgfljc23gD5TAw0iJXCQIRIlEJBiJVCQQVUiL7EiD7FCL2UWFwHVKM8n/FQ/kAABIhcB0PblNWgAAZjkIdTNIY0g8SAPIgTlQRQAAdSS4CwIAAGY5QRh1GYO5hAAAAA52EIO5+AAAAAB0B4vL6KEAAABIjUUYxkUoAEiJReBMjU3USI1FIEiJRehMjUXgSI1FKEiJRfBIjVXYuAIAAABIjU3QiUXUiUXY6FX+//+DfSAAdAtIi1wkYEiDxFBdw4vL6AEAAADMQFNIg+wgi9noy18AAIP4AXQoZUiLBCVgAAAAi5C8AAAAweoI9sIBdRH/FfniAABIi8iL0/8V9uIAAIvL6AsAAACLy/8Vz+MAAMzMzEBTSIPsIEiDZCQ4AEyNRCQ4i9lIjRXC+QAAM8n/FbLjAACFwHQfSItMJDhIjRXC+QAA/xVc4wAASIXAdAiLy/8Vj+QAAEiLTCQ4SIXJdAb/FTfjAABIg8QgW8PMSIkN8a0BAMO6AgAAADPJRI1C/+mE/v//M9IzyUSNQgHpd/7//8zMzEUzwEGNUALpaP7//0iD7ChMiwWZmgEASIvRQYvAuUAAAACD4D8ryEw5BaKtAQB1EkjTykkz0EiJFZOtAQBIg8Qow+hNBwAAzEUzwDPS6SL+///MzEiD7CiNgQDA//+p/z///3USgfkAwAAAdAqHDSG2AQAzwOsV6BQWAADHABYAAADo6RQAALgWAAAASIPEKMPMzMxIg+wo/xW64gAASIkFW60BAP8VReEAAEiJBVatAQCwAUiDxCjDzMzMSI0FJa0BAMNIjQUlrQEAw0iJXCQISIl0JBBMiUwkIFdIg+wwSYv5iwrorl0AAJBIjR1GswEASI01p5sBAEiJXCQgSI0FO7MBAEg72HQZSDkzdA5Ii9ZIi8vopmkAAEiJA0iDwwjr1osP6MJdAABIi1wkQEiLdCRISIPEMF/DzMy4AQAAAIcFyawBAMNMi9xIg+wouAQAAABNjUsQTY1DCIlEJDhJjVMYiUQkQEmNSwjoW////0iDxCjDzMxAU0iD7CCL2ejXKQAARIuAqAMAAEGL0IDiAvbaG8mD+/90NoXbdDmD+wF0IIP7AnQV6OIUAADHABYAAADotxMAAIPI/+sdQYPg/esEQYPIAkSJgKgDAADrB4MNKKIBAP+NQQJIg8QgW8PMzMyLBSqsAQDDzEiD7CiD+QF2FeiWFAAAxwAWAAAA6GsTAACDyP/rCIcNBKwBAIvBSIPEKMPMSI0F+asBAMNIiVwkCEyJTCQgV0iD7CBJi9lJi/iLCuhcXAAAkEiLz+hTAAAAi/iLC+ieXAAAi8dIi1wkMEiDxCBfw8xIiVwkCEyJTCQgV0iD7CBJi9lJi/iLCuggXAAAkEiLz+jHAQAAi/iLC+hiXAAAi8dIi1wkMEiDxCBfw8xIiVwkEEiJbCQYSIl0JCBXQVZBV0iD7CBIiwEz7UyL+UiLGEiF2w+EaAEAAEyLFeWXAQBMi0sISYvySDMzTTPKSItbEEGLyoPhP0kz2kjTy0jTzknTyUw7yw+FpwAAAEgr3rgAAgAASMH7A0g72EiL+0gPR/iNRSBIA/tID0T4SDv7ch5EjUUISIvXSIvO6P1nAAAzyUyL8OjzEwAATYX2dShIjXsEQbgIAAAASIvXSIvO6NlnAAAzyUyL8OjPEwAATYX2D4TKAAAATIsVR5cBAE2NDN5JjRz+SYv2SIvLSSvJSIPBB0jB6QNMO8tID0fNSIXJdBBJi8JJi/nzSKtMixUSlwEAQbhAAAAASY15CEGLyEGLwoPgPyvISYtHCEiLEEGLwEjTykkz0kmJEUiLFeOWAQCLyoPhPyvBishJiwdI085IM/JIiwhIiTFBi8hIixXBlgEAi8KD4D8ryEmLB0jTz0gz+kiLEEiJeghIixWjlgEAi8KD4D9EK8BJiwdBishI08tIM9pIiwgzwEiJWRDrA4PI/0iLXCRISItsJFBIi3QkWEiDxCBBX0FeX8NIiVwkCEiJbCQQSIl0JBhXQVZBV0iD7CBIiwFIi/FIixhIhdt1CIPI/+nPAAAATIsFM5YBAEGLyEmL+EgzO4PhP0iLWwhI089JM9hI08tIjUf/SIP4/Q+HnwAAAEGLyE2L8IPhP0yL/0iL60iD6whIO99yVUiLA0k7xnTvSTPATIkzSNPI/xV93wAATIsF1pUBAEiLBkGLyIPhP0iLEEyLCkiLQghNM8hJM8BJ08lI08hNO891BUg7xXSwTYv5SYv5SIvoSIvY66JIg///dA9Ii8/oCRIAAEyLBYqVAQBIiwZIiwhMiQFIiwZIiwhMiUEISIsGSIsITIlBEDPASItcJEBIi2wkSEiLdCRQSIPEIEFfQV5fw8zMSIvRSI0NtqgBAOllAAAAzEyL3EmJSwhIg+w4SY1DCEmJQ+hNjUsYuAIAAABNjUPoSY1TIIlEJFBJjUsQiUQkWOi3/P//SIPEOMPMzEiFyXUEg8j/w0iLQRBIOQF1EkiLBeuUAQBIiQFIiUEISIlBEDPAw8xIiVQkEEiJTCQIVUiL7EiD7EBIjUUQSIlF6EyNTShIjUUYSIlF8EyNRei4AgAAAEiNVeBIjU0giUUoiUXg6Ar8//9Ig8RAXcNIjQV9lgEASIkFDq4BALABw8zMzEiD7ChIjQ3lpwEA6Gz///9IjQ3xpwEA6GD///+wAUiDxCjDzEiD7Cjo2/X//7ABSIPEKMNAU0iD7CBIix0/lAEASIvL6D8OAABIi8voI2YAAEiLy+j/ZgAASIvL6J/u//9Ii8voP/n//7ABSIPEIFvDzMzMM8np4ab//8xAU0iD7CBIiw2XrQEAg8j/8A/BAYP4AXUfSIsNhK0BAEiNHT2XAQBIO8t0DOhLEAAASIkdbK0BALABSIPEIFvDSIPsKEiLDTGtAQDoLBAAAEiLDS2tAQBIgyUdrQEAAOgYEAAASIsN2aYBAEiDJRGtAQAA6AQQAABIiw3NpgEASIMlvaYBAADo8A8AAEiDJbimAQAAsAFIg8Qow8xIjRUx8wAASI0NKvIAAOmNZAAAzEiD7CiEyXQWSIM9HKUBAAB0BejBGQAAsAFIg8Qow0iNFf/yAABIjQ348QAASIPEKOnXZAAAzMzMSIPsKOi/IwAASItAGEiFwHQI/xWk3AAA6wDoYQAAAJBAU0iD7CAz20iFyXQMSIXSdAdNhcB1G4gZ6L4OAAC7FgAAAIkY6JINAACLw0iDxCBbw0yLyUwrwUOKBAhBiAFJ/8GEwHQGSIPqAXXsSIXSddmIGeiEDgAAuyIAAADrxMxIg+wo6DtlAABIhcB0CrkWAAAA6HxlAAD2BQWUAQACdCq5FwAAAP8VKNoAAIXAdAe5BwAAAM0pQbgBAAAAuhUAAEBBjUgC6P0KAAC5AwAAAOiX9///zMzM6T8OAADMzMxIi8RIiVgISIloEEiJcBhIiXggQVVBVkFXSIPsQEiDOgBFi/BBD7bpSIvadRXo6g0AAMcAFgAAAOi/DAAA6csBAABFhfZ0CUGNQP6D+CJ33UiL0UiNTCQg6Le0//9Mizsz9kEPtj9EjW4ISY1HAesJSIsDD7Y4SP/ATI1EJChIiQNBi9WLz+ghCQAAhcB14YvFg80CQID/LQ9F6I1H1aj9dQxIiwNAijhI/8BIiQNBg83/QffG7////w+FmQAAAI1H0DwJdwlAD77Hg8DQ6yONR588GXcJQA++x4PAqesTjUe/PBl3CUAPvseDwMnrA0GLxYXAdAe4CgAAAOtRSIsDihBIjUgBSIkLjUKoqN90L0WF9rgIAAAAQQ9Fxkj/yUiJC0SL8ITSdC84EXQr6OoMAADHABYAAADovwsAAOsZQIo5SI1BAUiJA7gQAAAARYX2QQ9FxkSL8DPSQYvFQff2RIvAjU/QgPkJdwlAD77Pg8HQ6yONR588GXcJQA++z4PBqesTjUe/PBl3CUAPvs+DwcnrA0GLzUE7zXQyQTvOcy1BO/ByDXUEO8p2B7kMAAAA6wtBD6/2A/G5CAAAAEiLA0CKOEj/wEiJAwvp65VIiwNI/8hIiQNAhP90FUA4OHQQ6DYMAADHABYAAADoCwsAAED2xQh1LIB8JDgATIk7dAxIi0QkIIOgqAMAAP1Ii0sISIXJdAZIiwNIiQEzwOnAAAAAi/1Bvv///3+D5wFBvwAAAIBA9sUEdQ+F/3RLQPbFAnRAQTv3dkCD5QLoywsAAMcAIgAAAIX/dThBi/WAfCQ4AHQMSItMJCCDoagDAAD9SItDCEiFwHQGSIsLSIkIi8brX0E79nfAQPbFAnTP997ry4XtdCeAfCQ4AHQMSItMJCCDoagDAAD9SItTCEiF0nQGSIsLSIkKQYvH6yWAfCQ4AHQMSItMJCCDoagDAAD9SItTCEiF0nQGSIsLSIkKQYvGSItcJGBIi2wkaEiLdCRwSIt8JHhIg8RAQV9BXkFdw8zMSIlcJAhIiWwkGFZXQVRBVkFXSIPsQEUz5EEPtvFFi/BIi/pMOSJ1FejrCgAAxwAWAAAA6MAJAADpeQUAAEWF9nQJQY1A/oP4InfdSIvRSI1MJCDouLH//0yLP0GL7EyJfCR4QQ+3H0mNRwLrCkiLBw+3GEiDwAK6CAAAAEiJBw+3y+gVZAAAhcB14ovGuf3/AACDzgJmg/stD0XwjUPVZoXBdQ1IiwcPtxhIg8ACSIkHuOYJAABBg8r/uRD/AAC6YAYAAEG7MAAAAEG48AYAAESNSIBB98bv////D4VhAgAAZkE72w+CtwEAAGaD+zpzCw+3w0Erw+mhAQAAZjvZD4OHAQAAZjvaD4KUAQAAuWoGAABmO9lzCg+3wyvC6XsBAABmQTvYD4J2AQAAufoGAABmO9lzCw+3w0ErwOlcAQAAZkE72Q+CVwEAALlwCQAAZjvZcwsPt8NBK8HpPQEAAGY72A+COQEAALjwCQAAZjvYcw0Pt8Mt5gkAAOkdAQAAuWYKAABmO9kPghQBAACNQQpmO9hzCg+3wyvB6f0AAAC55goAAGY72Q+C9AAAAI1BCmY72HLgjUh2ZjvZD4LgAAAAjUEKZjvYcsy5ZgwAAGY72Q+CygAAAI1BCmY72HK2jUh2ZjvZD4K2AAAAjUEKZjvYcqKNSHZmO9kPgqIAAACNQQpmO9hyjrlQDgAAZjvZD4KMAAAAjUEKZjvYD4J0////jUh2ZjvZcniNQQpmO9gPgmD///+NSEZmO9lyZI1BCmY72A+CTP///7lAEAAAZjvZck6NQQpmO9gPgjb///+54BcAAGY72XI4jUEKZjvYD4Ig////D7fDuRAYAABmK8Fmg/gJdxvpCv///7ga/wAAZjvYD4L8/v//g8j/g/j/dSQPt8uNQb+NUZ+D+Bl2CoP6GXYFQYvC6wyD+hmNQeAPR8GDwMmFwHQHuAoAAADrZ0iLB0G43/8AAA+3EEiNSAJIiQ+NQqhmQYXAdDxFhfa4CAAAAEEPRcZIg8H+SIkPRIvwZoXSdDpmORF0NegGCAAAxwAWAAAA6NsGAABBg8r/QbswAAAA6xkPtxlIjUECSIkHuBAAAABFhfZBD0XGRIvwM9JBi8JB9/ZBvBD/AABBv2AGAABEi8pEi8BmQTvbD4KoAQAAZoP7OnMLD7fLQSvL6ZIBAABmQTvcD4NzAQAAZkE73w+CgwEAALhqBgAAZjvYcwsPt8tBK8/paQEAALjwBgAAZjvYD4JgAQAAjUgKZjvZcwoPt8sryOlJAQAAuGYJAABmO9gPgkABAACNSApmO9ly4I1BdmY72A+CLAEAAI1ICmY72XLMjUF2ZjvYD4IYAQAAjUgKZjvZcriNQXZmO9gPggQBAACNSApmO9lypI1BdmY72A+C8AAAAI1ICmY72XKQuGYMAABmO9gPgtoAAACNSApmO9kPgnb///+NQXZmO9gPgsIAAACNSApmO9kPgl7///+NQXZmO9gPgqoAAACNSApmO9kPgkb///+4UA4AAGY72A+CkAAAAI1ICmY72Q+CLP///41BdmY72HJ8jUgKZjvZD4IY////jUFGZjvYcmiNSApmO9kPggT///+4QBAAAGY72HJSjUgKZjvZD4Lu/v//uOAXAABmO9hyPI1ICmY72Q+C2P7//w+3w41RJmYrwmaD+Al3IQ+3yyvK6xW4Gv8AAGY72HMID7fLQSvM6wODyf+D+f91JA+3041Cv4P4GY1Cn3YKg/gZdgVBi8rrDIP4GY1K4A9HyoPpN0E7ynQ3QTvOczJBO+hyDnUFQTvJdge5DAAAAOsLQQ+v7gPpuQgAAABIiwcPtxhIg8ACSIkHC/Hp7v3//0iLB0Uz5EyLfCR4SIPA/kiJB2aF23QVZjkYdBDoiQUAAMcAFgAAAOheBAAAQPbGCHUsTIk/RDhkJDh0DEiLRCQgg6CoAwAA/UiLTwhIhcl0BkiLB0iJATPA6cAAAACL3kG+////f4PjAUG/AAAAgED2xgR1D4XbdEtA9sYCdEBBO+92QIPmAugeBQAAxwAiAAAAhdt1OIPN/0Q4ZCQ4dAxIi0wkIIOhqAMAAP1Ii1cISIXSdAZIiw9IiQqLxetfQTvud8BA9sYCdM/33evLhfZ0J0Q4ZCQ4dAxIi0wkIIOhqAMAAP1Ii1cISIXSdAZIiw9IiQpBi8frJUQ4ZCQ4dAxIi0wkIIOhqAMAAP1Ii1cISIXSdAZIiw9IiQpBi8ZMjVwkQEmLWzBJi2tASYvjQV9BXkFcX17DzMzMSIlcJAhIiWwkEEiJdCQYV0iD7CBIY/kz24vyjW8BTYXAdClJiwCB/QABAAB3C0iLAA+3BHgjwusog3gIAX4Ji8/oaiwAAOsZM8DrFejrUgAAgf0AAQAAdwYPtxx4I96Lw0iLXCQwSItsJDhIi3QkQEiDxCBfw8zMzMzMzMzMzMzMzMzMzMxmZg8fhAAAAAAASCvRTYXAdGr3wQcAAAB0HQ+2AToECnVdSP/BSf/IdFKEwHROSPfBBwAAAHXjSbuAgICAgICAgEm6//7+/v7+/v6NBAol/w8AAD34DwAAd8BIiwFIOwQKdbdIg8EISYPoCHYPTY0MAkj30EkjwUmFw3TPM8DDSBvASIPIAcPMzMxNhcB1GDPAww+3AWaFwHQTZjsCdQ5Ig8ECSIPCAkmD6AF15Q+3AQ+3CivBw0iJXCQQSIl0JBhVV0FWSI2sJBD7//9IgezwBQAASIsFMIcBAEgzxEiJheAEAABBi/iL8ovZg/n/dAXogY///zPSSI1MJHBBuJgAAADos8AAADPSSI1NEEG40AQAAOiiwAAASI1EJHBIiUQkSEiNTRBIjUUQSIlEJFD/FVXOAABMi7UIAQAASI1UJEBJi85FM8D/FUXOAABIhcB0NkiDZCQ4AEiNTCRYSItUJEBMi8hIiUwkME2LxkiNTCRgSIlMJChIjU0QSIlMJCAzyf8VEs4AAEiLhQgFAABIiYUIAQAASI2FCAUAAEiDwAiJdCRwSImFqAAAAEiLhQgFAABIiUWAiXwkdP8VMc4AADPJi/j/Fd/NAABIjUwkSP8VzM0AAIXAdRCF/3UMg/v/dAeLy+iMjv//SIuN4AQAAEgzzOjxhf//TI2cJPAFAABJi1soSYtzMEmL40FeX13DzEiJDZGZAQDDSIlcJAhIiWwkEEiJdCQYV0iD7DBBi9lJi/hIi/JIi+no8xcAAEiFwHQ9SIuAuAMAAEiFwHQxSItUJGBEi8tIiVQkIEyLx0iL1kiLzf8VPs8AAEiLXCRASItsJEhIi3QkUEiDxDBfw0yLFYKFAQBEi8tBi8pMi8dMMxUSmQEAg+E/SdPKSIvWTYXSdA9Ii0wkYEmLwkiJTCQg665Ii0QkYEiLzUiJRCQg6CMAAADMzMxIg+w4SINkJCAARTPJRTPAM9Izyeg3////SIPEOMPMzEiD7Ci5FwAAAP8VycwAAIXAdAe5BQAAAM0pQbgBAAAAuhcEAMBBjUgB6J79////FZTMAABIi8i6FwQAwEiDxChI/yWJzAAAzDPATI0Nn+QAAEmL0USNQAg7CnQr/8BJA9CD+C1y8o1B7YP4EXcGuA0AAADDgcFE////uBYAAACD+Q5BD0bAw0GLRMEEw8zMzEiJXCQIV0iD7CCL+einFgAASIXAdQlIjQUHhgEA6wRIg8AkiTjojhYAAEiNHe+FAQBIhcB0BEiNWCCLz+h3////iQNIi1wkMEiDxCBfw8zMSIPsKOhfFgAASIXAdQlIjQW/hQEA6wRIg8AkSIPEKMNIg+wo6D8WAABIhcB1CUiNBZuFAQDrBEiDwCBIg8Qow0BTSIPsIEyLwkiL2UiFyXQOM9JIjULgSPfzSTvAckNJD6/YuAEAAABIhdtID0TY6xXo/ur//4XAdChIi8voulUAAIXAdBxIiw2jnwEATIvDuggAAAD/FVXMAABIhcB00esN6Hn////HAAwAAAAzwEiDxCBbw8zMzEiFyXQ3U0iD7CBMi8Ez0kiLDWKfAQD/FSTMAACFwHUX6EP///9Ii9j/FbLKAACLyOh7/v//iQNIg8QgW8PMzMxIiVwkCEiJbCQQSIl0JBhXQVRBVUFWQVdIg+wgRIv5TI01Ymr//02L4UmL6EyL6kuLjP4QLQIATIsVCoMBAEiDz/9Bi8JJi9JIM9GD4D+KyEjTykg71w+EWwEAAEiF0nQISIvC6VABAABNO8QPhNkAAACLdQBJi5z2cCwCAEiF23QOSDvfD4SsAAAA6aIAAABNi7T2AHoBADPSSYvOQbgACAAA/xUHywAASIvYSIXAdU//FenJAACD+Fd1Qo1YsEmLzkSLw0iNFZTbAADo9/r//4XAdClEi8NIjRWh6AAASYvO6OH6//+FwHQTRTPAM9JJi87/FbfKAABIi9jrAjPbTI01gWn//0iF23UNSIvHSYeE9nAsAgDrHkiLw0mHhPZwLAIASIXAdAlIi8v/FW7KAABIhdt1VUiDxQRJO+wPhS7///9MixX9gQEAM9tIhdt0SkmL1UiLy/8VSsoAAEiFwHQyTIsF3oEBALpAAAAAQYvIg+E/K9GKykiL0EjTykkz0EuHlP4QLQIA6y1MixW1gQEA67hMixWsgQEAQYvCuUAAAACD4D8ryEjTz0kz+kuHvP4QLQIAM8BIi1wkUEiLbCRYSIt0JGBIg8QgQV9BXkFdQVxfw8zMQFNIg+wgSIvZTI0NOOgAALkcAAAATI0FKOgAAEiNFSXoAADoAP7//0iFwHQWSIvTSMfB+v///0iDxCBbSP8lzcoAALglAgDASIPEIFvDzMxIg+woTI0NYecAADPJTI0FVOcAAEiNFVXnAADouP3//0iFwHQLSIPEKEj/JZDKAAC4AQAAAEiDxCjDzMxIiVwkCEiJbCQQSIl0JBhXSIPsUEGL2UmL+IvyTI0NKecAAEiL6UyNBRfnAABIjRUY5wAAuQEAAADoXv3//0iFwHRSTIuEJKAAAABEi8tIi4wkmAAAAIvWTIlEJEBMi8dIiUwkOEiLjCSQAAAASIlMJDCLjCSIAAAAiUwkKEiLjCSAAAAASIlMJCBIi83/FfHJAADrMjPSSIvN6KkCAACLyESLy4uEJIgAAABMi8eJRCQoi9ZIi4QkgAAAAEiJRCQg/xXdyAAASItcJGBIi2wkaEiLdCRwSIPEUF/DQFNIg+wgSIvZTI0NeOYAALkDAAAATI0FZOYAAEiNFRXZAADomPz//0iFwHQPSIvLSIPEIFtI/yVsyQAASIPEIFtI/yX4xwAAQFNIg+wgi9lMjQ055gAAuQQAAABMjQUl5gAASI0V5tgAAOhR/P//i8tIhcB0DEiDxCBbSP8lJskAAEiDxCBbSP8lyscAAMzMQFNIg+wgi9lMjQ355QAAuQUAAABMjQXl5QAASI0VrtgAAOgJ/P//i8tIhcB0DEiDxCBbSP8l3sgAAEiDxCBbSP8lcscAAMzMSIlcJAhXSIPsIEiL2kyNDbTlAACL+UiNFYPYAAC5BgAAAEyNBZflAADouvv//0iL04vPSIXAdAj/FZLIAADrBv8VMscAAEiLXCQwSIPEIF/DzMzMSIlcJAhIiXQkEFdIg+wgQYvwTI0NY+UAAIvaTI0FUuUAAEiL+UiNFTjYAAC5EgAAAOhe+///i9NIi89IhcB0C0SLxv8VM8gAAOsG/xW7xgAASItcJDBIi3QkOEiDxCBfw8zMzEiJXCQISIlsJBBIiXQkGFdIg+xQQYvZSYv4i/JMjQ395AAASIvpTI0F6+QAAEiNFezkAAC5FAAAAOjy+v//SIXAdFJMi4QkoAAAAESLy0iLjCSYAAAAi9ZMiUQkQEyLx0iJTCQ4SIuMJJAAAABIiUwkMIuMJIgAAACJTCQoSIuMJIAAAABIiUwkIEiLzf8VhccAAOsyM9JIi83oPQAAAIvIRIvLi4QkiAAAAEyLx4lEJCiL1kiLhCSAAAAASIlEJCD/FXnGAABIi1wkYEiLbCRoSIt0JHBIg8RQX8NIiVwkCFdIg+wgi/pMjQ1J5AAASIvZSI0VP+QAALkWAAAATI0FK+QAAOgm+v//SIvLSIXAdAqL1/8V/sYAAOsF6CdTAABIi1wkMEiDxCBfw0iJfCQISI09kJEBAEiNBZmSAQBIO8dIiwUvfQEASBvJSPfRg+Ei80irSIt8JAiwAcPMzMxAU0iD7CCEyXUvSI0dt5ABAEiLC0iFyXQQSIP5/3QG/xVLxQAASIMjAEiDwwhIjQU0kQEASDvYddiwAUiDxCBbw8zMzEiJXCQIV0iD7DCDZCQgALkIAAAA6KNAAACQuwMAAACJXCQkOx17jgEAdG1IY/tIiwV3jgEASIsM+EiFyXUC61SLQRTB6A2oAXQZSIsNW44BAEiLDPnoflMAAIP4/3QE/0QkIEiLBUKOAQBIiwz4SIPBMP8VhMQAAEiLDS2OAQBIiwz56MT4//9IiwUdjgEASIMk+AD/w+uHuQgAAADobkAAAItEJCBIi1wkQEiDxDBfw8zMzEiJXCQITIlMJCBXSIPsIEmL+UmL2EiLCujjlv//kEiLUwhIiwNIiwBIhcB0WotIFIvBwegNqAF0TovBJAM8AnUF9sHAdQoPuuELcgT/Aus3SItDEIA4AHUPSIsDSIsIi0EU0eioAXQfSIsDSIsI6OUBAACD+P90CEiLQwj/AOsHSItDGIMI/0iLD+h9lv//SItcJDBIg8QgX8PMzEiJXCQITIlMJCBWV0FWSIPsYEmL8UmL+IsK6E0/AACQSIsdNY0BAEhjBSaNAQBMjTTDSIlcJDhJO94PhIgAAABIiwNIiUQkIEiLF0iFwHQhi0gUi8HB6A2oAXQVi8EkAzwCdQX2wcB1Dg+64QtyCP8CSIPDCOu7SItXEEiLTwhIiwdMjUQkIEyJRCRASIlEJEhIiUwkUEiJVCRYSItEJCBIiUQkKEiJRCQwTI1MJChMjUQkQEiNVCQwSI2MJIgAAADonv7//+upiw7o8T4AAEiLnCSAAAAASIPEYEFeX17DiEwkCFVIi+xIg+xAg2UoAEiNRSiDZSAATI1N4EiJRehMjUXoSI1FEEiJRfBIjVXkSI1FIEiJRfhIjU0YuAgAAACJReCJReTo1P7//4B9EACLRSAPRUUoSIPEQF3DzMzMSIlcJAhIiXQkEFdIg+wgSIvZi0kUi8EkAzwCdUv2wcB0Ros7K3sIg2MQAEiLcwhIiTOF/34ySIvL6IIcAACLyESLx0iL1uj9WgAAO/h0CvCDSxQQg8j/6xGLQxTB6AKoAXQF8INjFP0zwEiLXCQwSIt0JDhIg8QgX8PMzEBTSIPsIEiL2UiFyXUKSIPEIFvpDP///+hn////hcB1IYtDFMHoC6gBdBNIi8voERwAAIvI6IJRAACFwHUEM8DrA4PI/0iDxCBbw8yxAenR/v//zEBTSIPsIItBFEiL2cHoDagBdCeLQRTB6AaoAXQdSItJCOjG9f//8IFjFL/+//8zwEiJQwhIiQOJQxBIg8QgW8NIi8RIiVgISIloEEiJcBhIiXggQVZIgeyQAAAASI1IiP8V/sAAAEUz9mZEOXQkYg+EmgAAAEiLRCRoSIXAD4SMAAAASGMYSI1wBL8AIAAASAPeOTgPTDiLz+hiPgAAOz0wkgEAD089KZIBAIX/dGBBi+5Igzv/dEdIgzv+dEH2BgF0PPYGCHUNSIsL/xVzwQAAhcB0KkiLxUyNBfWNAQBIi81IwfkGg+A/SYsMyEiNFMBIiwNIiUTRKIoGiETROEj/xUj/xkiDwwhIg+8BdaNMjZwkkAAAAEmLWxBJi2sYSYtzIEmLeyhJi+NBXsPMzMxIi8RIiVgISIloEEiJcBhIiXggQVZIg+wgM/ZFM/ZIY85IjT18jQEASIvBg+E/SMH4BkiNHMlIizzHSItE3yhIg8ACSIP4AXYKgEzfOIDpjwAAAMZE3ziBi86F9nQWg+kBdAqD+QG59P///+sMufX////rBbn2/////xVNwAAASIvoSI1IAUiD+QF2C0iLyP8Vf8AAAOsCM8CFwHQgD7bISIls3yiD+QJ1B4BM3zhA6zGD+QN1LIBM3zgI6yWATN84QEjHRN8o/v///0iLBUqJAQBIhcB0C0mLBAbHQBj+/////8ZJg8YIg/4DD4Ut////SItcJDBIi2wkOEiLdCRASIt8JEhIg8QgQV7DQFNIg+wguQcAAADoEDsAADPbM8noqzwAAIXAdQzo4v3//+jN/v//swG5BwAAAOhBOwAAisNIg8QgW8PMSIlcJAhXSIPsIDPbSI09SYwBAEiLDDtIhcl0CugXPAAASIMkOwBIg8MISIH7AAQAAHLZSItcJDCwAUiDxCBfw0BTSIPsIEiL2UiD+eB3PEiFybgBAAAASA9E2OsV6M7d//+FwHQlSIvL6IpIAACFwHQZSIsNc5IBAEyLwzPS/xUovwAASIXAdNTrDehM8v//xwAMAAAAM8BIg8QgW8PMzEiD7DhIiUwkIEiJVCQoSIXSdANIiQpBsQFIjVQkIDPJ6Pvj//9Ig8Q4w8zMSIPsOEiJTCQgSIlUJChIhdJ0A0iJCkGxAUiNVCQgM8no0+b//0iDxDjDzMxIiVwkCEiJbCQQSIl0JBhXSIPsUDPtSYvwSIv6SIvZSIXSD4Q4AQAATYXAD4QvAQAAQDgqdRFIhckPhCgBAABmiSnpIAEAAEmL0UiNTCQw6IiY//9Ii0QkOIF4DOn9AAB1IkyNDQOPAQBMi8ZIi9dIi8vorVoAAEiLyIPI/4XJD0jI6xlIOag4AQAAdSpIhdt0Bg+2B2aJA7kBAAAAQDhsJEh0DEiLRCQwg6CoAwAA/YvB6bIAAAAPtg9IjVQkOOgUWgAAhcB0UkiLTCQ4RItJCEGD+QF+L0E78Xwqi0kMi8VIhdtMi8e6CQAAAA+VwIlEJChIiVwkIOg3MwAASItMJDiFwHUPSGNBCEg78HI+QDhvAXQ4i0kI64OLxUG5AQAAAEiF20yLxw+VwIlEJChBjVEISItEJDhIiVwkIItIDOjvMgAAhcAPhUv////okvD//4PJ/8cAKgAAAOk9////SIktBY4BADPASItcJGBIi2wkaEiLdCRwSIPEUF/DzMxFM8npeP7//0iJXCQIZkSJTCQgVVZXSIvsSIPsYEmL8EiL+kiL2UiF0nUTTYXAdA5Ihcl0AiERM8DpvwAAAEiF23QDgwn/SIH+////f3YW6BDw//+7FgAAAIkY6OTu///plgAAAEiLVUBIjU3g6OqW//9Ii0Xoi0gMgfnp/QAAdS4Pt1U4TI1FKEiDZSgASIvP6MJaAABIhdt0AokDg/gED46+AAAA6Lnv//+LGOs7SIO4OAEAAAB1bQ+3RTi5/wAAAGY7wXZGSIX/dBJIhfZ0DUyLxjPSSIvP6FatAADoge///7sqAAAAiRiAffgAdAtIi03gg6GoAwAA/YvDSIucJIAAAABIg8RgX15dw0iF/3QHSIX2dHeIB0iF23RGxwMBAAAA6z6DZSgASI1FKEiJRCQ4TI1FOEiDZCQwAEG5AQAAAIl0JCgz0kiJfCQg6NEcAACFwHQRg30oAHWBSIXbdAKJAzPb64L/FW66AACD+HoPhWf///9Ihf90EkiF9nQNTIvGM9JIi8/opqwAAOjR7v//uyIAAACJGOil7f//6Ub///9Ig+w4SINkJCAA6FX+//9Ig8Q4w0iJXCQITIlMJCBXSIPsIEmL2UmL+IsK6Jg2AACQSIsHSIsISIuBiAAAAPD/AIsL6NQ2AABIi1wkMEiDxCBfw8xIiVwkCEyJTCQgV0iD7CBJi9lJi/iLCuhYNgAAkEiLDzPSSIsJ6KYCAACQiwvoljYAAEiLXCQwSIPEIF/DzMzMSIlcJAhMiUwkIFdIg+wgSYvZSYv4iwroGDYAAJBIi0cISIsQSIsPSIsSSIsJ6F4CAACQiwvoTjYAAEiLXCQwSIPEIF/DzMzMSIlcJAhMiUwkIFdIg+wgSYvZSYv4iwro0DUAAJBIiwdIiwhIi4mIAAAASIXJdB6DyP/wD8EBg/gBdRJIjQUidQEASDvIdAboMO7//5CLC+jsNQAASItcJDBIg8QgX8PMQFVIi+xIg+xQSIlN2EiNRdhIiUXoTI1NILoBAAAATI1F6LgFAAAAiUUgiUUoSI1F2EiJRfBIjUXgSIlF+LgEAAAAiUXQiUXUSI0F3YoBAEiJReCJUShIjQ0XzwAASItF2EiJCEiNDZl0AQBIi0XYiZCoAwAASItF2EiJiIgAAACNSkJIi0XYSI1VKGaJiLwAAABIi0XYZomIwgEAAEiNTRhIi0XYSIOgoAMAAADoJv7//0yNTdBMjUXwSI1V1EiNTRjokf7//0iDxFBdw8zMzEiFyXQaU0iD7CBIi9noDgAAAEiLy+gy7f//SIPEIFvDQFVIi+xIg+xASI1F6EiJTehIiUXwSI0VaM4AALgFAAAAiUUgiUUoSI1F6EiJRfi4BAAAAIlF4IlF5EiLAUg7wnQMSIvI6OLs//9Ii03oSItJcOjV7P//SItN6EiLSVjoyOz//0iLTehIi0lg6Lvs//9Ii03oSItJaOiu7P//SItN6EiLSUjooez//0iLTehIi0lQ6JTs//9Ii03oSItJeOiH7P//SItN6EiLiYAAAADod+z//0iLTehIi4nAAwAA6Gfs//9MjU0gTI1F8EiNVShIjU0Y6Nb9//9MjU3gTI1F+EiNVeRIjU0Y6Dn9//9Ig8RAXcPMzMxIiVwkCFdIg+wgSIv5SIvaSIuJkAAAAEiFyXQs6JM+AABIi4+QAAAASDsNFYkBAHQXSI0FdHEBAEg7yHQLg3kQAHUF6Gw8AABIiZ+QAAAASIXbdAhIi8vozDsAAEiLXCQwSIPEIF/DzEiJXCQISIl0JBBXSIPsIP8Vl7YAAIsNIXEBAIvYg/n/dB/ote///0iL+EiFwHQMSIP4/3VzM/8z9utwiw37cAEASIPK/+ja7///hcB057rIAwAAuQEAAADo9+r//4sN2XABAEiL+EiFwHUQM9Losu///zPJ6FPr///rukiL1+ih7///hcB1EosNr3ABADPS6JDv//9Ii8/r20iLz+gP/f//M8noJOv//0iL94vL/xWxtgAASPffSBvASCPGdBBIi1wkMEiLdCQ4SIPEIF/D6OXb///MQFNIg+wgiw1ccAEAg/n/dBvo8u7//0iL2EiFwHQISIP4/3R9622LDTxwAQBIg8r/6Bvv//+FwHRousgDAAC5AQAAAOg46v//iw0acAEASIvYSIXAdRAz0ujz7v//M8nolOr//+s7SIvT6OLu//+FwHUSiw3wbwEAM9Lo0e7//0iLy+vbSIvL6FD8//8zyehl6v//SIXbdAlIi8NIg8QgW8PoPtv//8zMSIlcJAhIiXQkEFdIg+wg/xUbtQAAiw2lbwEAi9iD+f90H+g57v//SIv4SIXAdAxIg/j/dXMz/zP263CLDX9vAQBIg8r/6F7u//+FwHTnusgDAAC5AQAAAOh76f//iw1dbwEASIv4SIXAdRAz0ug27v//M8no1+n//+u6SIvX6CXu//+FwHUSiw0zbwEAM9LoFO7//0iLz+vbSIvP6JP7//8zyeio6f//SIv3i8v/FTW1AABIi1wkMEj330gbwEgjxkiLdCQ4SIPEIF/DSIPsKEiNDS38///o9Oz//4kF3m4BAIP4/3UEMsDrFegQ////SIXAdQkzyegMAAAA6+mwAUiDxCjDzMzMSIPsKIsNrm4BAIP5/3QM6Pzs//+DDZ1uAQD/sAFIg8Qow8zMQFNIg+wgSIsFJ4YBAEiL2kg5AnQWi4GoAwAAhQXbdQEAdQjoJDwAAEiJA0iDxCBbw8zMzEBTSIPsIEiLBQuGAQBIi9pIOQJ0FouBqAMAAIUFp3UBAHUI6BwnAABIiQNIg8QgW8PMzMxMi9xJiVsISYlrEEmJcxhXQVRBVUFWQVdIg+xwi4QkyAAAAEUz9oXARIgySIvaTIv5SIuUJOAAAABJjUu4QYv+SYvpD0n4SYvw6M6O//+NRwtIY8hIO/F3FejG5///QY1+Iok46Jvm///p3wIAAEmLD7r/BwAASIvBSMHoNEgjwkg7wg+FgQAAAIuEJOgAAABMi82JRCRITIvGi4Qk2AAAAEiL00yJdCRASYvPiUQkOEiLhCTAAAAARIh0JDCJfCQoSIlEJCDotQIAAIv4hcB0CESIM+l0AgAAumUAAABIi8vo3qIAAEiFwA+EWwIAAIqMJNAAAACA8QHA4QWAwVCICESIcAPpQAIAALgtAAAASIXJeQiIA0j/w0mLD4qEJNAAAABIjWsBNAFBvP8DAABED7boQbkwAAAAQYv1SLgAAAAAAADwf8HmBUm6////////DwCDxgdIhch1GESIC0mLB0kjwkj32E0b5EGB5P4DAADrA8YDMTPbTI11AYX/dQSKw+sRSItEJFhIi4j4AAAASIsBigCIRQBNhRcPhpEAAABFD7fBSLoAAAAAAAAPAIX/fi9JiwdBishII8JJI8JI0+hmQQPBZoP4OXYDZgPGQYgG/89J/8ZIweoEZkGDwPx5zWZFhcB4SkSLjCToAAAASYvP6PwGAABBuTAAAACEwHQwSY1O/4oRjUK6qN91CESICUj/yevvSDvNdBOA+jl1BkCAxjrrA41yAUCIMesD/kH/hf9+FUSLx0GK0UmLzovf6K6jAABMA/Mz2zhdAEkPRe5BwOUFQYDFUESIbQBMjU0CSYsHSMHoNCX/BwAAi8hJK8xIi9F5BkmLzEgryLgrAAAARTP2SIXSTYvBjVACD0jCiEUBQcYBMEiB+egDAAB8L0i4z/dT46WbxCBNjUEBSPfpSMH6B0iLwkjB6D9IA9CNQjBBiAFIacIY/P//SAPITTvBdQZIg/lkfC5IuAvXo3A9CtejSPfpSAPRSMH6BkiLwkjB6D9IA9CNQjBBiABJ/8BIa8KcSAPITTvBdQZIg/kKfCtIuGdmZmZmZmZmSPfpSMH6AkiLwkjB6D9IA9CNQjBBiABJ/8BIa8L2SAPIgMEwQYgIRYhwAUGL/kQ4dCRodAxIi0wkUIOhqAMAAP1MjVwkcIvHSYtbMEmLazhJi3NASYvjQV9BXkFdQVxfw0yL3EmJWwhJiWsQSYlzGFdIg+xQi6wkiAAAAEmL8EiLhCSAAAAATY1D6EiLCUiL+kSNVQJJ/8KNVQFMO9BJD0LCSYlDyOiWVQAARTPARIvIg3wkQC1Ii9aLhCSoAAAAQQ+UwIlEJCgzyUSJTCQghe1MjUwkQA+fwUgr0Ukr0EiD/v9ID0TWSQPISAPPRI1FAei3TwAAhcB0BcYHAOs9SIuEJKAAAABEi8VEiowkkAAAAEiL1kiJRCQ4SIvPSI1EJEDGRCQwAEiJRCQoi4QkmAAAAIlEJCDoFQAAAEiLXCRgSItsJGhIi3QkcEiDxFBfw0iLxEiJWAhIiWgQSIlwGEiJeCBBV0iD7FAzwElj2EWFwEWK+UiL6kiL+Q9Pw4PACUiYSDvQdy7oeOP//7siAAAAiRjoTOL//4vDSItcJGBIi2wkaEiLdCRwSIt8JHhIg8RQQV/DSIuUJJgAAABIjUwkMOg1iv//gLwkkAAAAABIi7QkiAAAAHQpM9KDPi0PlMJIA9eF234aSYPI/0n/wEKAPAIAdfZJ/8BIjUoB6JKkAACDPi1Ii9d1B8YHLUiNVwGF234bikIBiAJI/8JIi0QkOEiLiPgAAABIiwGKCIgKD7aMJJAAAABMjQWxzgAASAPaSIPxAUgD2Ugr+0iLy0iD/f9IjRQvSA9E1ejI0///hcAPhaQAAABIjUsCRYT/dAPGA0VIi0YIgDgwdFdEi0YEQYPoAXkHQffYxkMBLUGD+GR8G7gfhetRQffowfoFi8LB6B8D0ABTAmvCnEQDwEGD+Ap8G7hnZmZmQffowfoCi8LB6B8D0ABTA2vC9kQDwEQAQwSDvCSAAAAAAnUUgDkwdQ9IjVEBQbgDAAAA6KKjAACAfCRIAHQMSItEJDCDoKgDAAD9M8Dpjv7//0iDZCQgAEUzyUUzwDPSM8no4+D//8zMzEiLxEiJWAhIiWgQSIlwGEiJeCBBVkiD7EBIi1QkeEiL2UiNSNhNi/FBi/DoqIj//4B8JHAASWNOBHQajUH/O8Z1EzPAQYM+LQ+UwEgDw2bHRAH/MABBgz4tdQbGAy1I/8NJY0YESIPP/4XAf0l1DUmLRgiAODB1BLAB6wIywIB8JHAAdAqEwHQGSI1rAesfSI1rAUyLx0n/wEKAPAMAdfZJ/8BIi9NIi83owqIAAMYDMEiL3esDSAPYhfZ+eEiNawFMi8dJ/8BCgDwDAHX2Sf/ASIvTSIvN6JSiAABIi0QkKEiLiPgAAABIiwGKCIgLQYtGBIXAeT732IB8JHAAdQQ7xn0Ci/CF9nQbSP/HgDwvAHX3SGPOTI1HAUgDzUiL1ehLogAATGPGujAAAABIi83oe54AAIB8JDgAdAxIi0QkIIOgqAMAAP1Ii1wkUDPASItsJFhIi3QkYEiLfCRoSIPEQEFew8zMzEyL3EmJWwhJiWsQSYl7GEFWSIPsUEiLhCSAAAAASYvoSIsJTY1D6EiL+kmJQ8iLlCSIAAAAD1fADxFEJEDoclEAAESLdCRERTPAg3wkQC1Ei8iLhCSgAAAASIvVQQ+UwIlEJChJK9BEiUwkIEH/zkyNTCRASIP9/0mNHDhEi4QkiAAAAEgPRNVIi8vokEsAAIXAdAjGBwDpkwAAAItEJET/yIP4/HxGO4QkiAAAAH09RDvwfQyKA0j/w4TAdfeIQ/5Ii4QkqAAAAEyNTCRARIuEJIgAAABIi9VIiUQkKEiLz8ZEJCAB6K39///rQkiLhCSoAAAASIvVRIqMJJAAAABIi89Ei4QkiAAAAEiJRCQ4SI1EJEDGRCQwAUiJRCQoi4QkmAAAAIlEJCDolfv//0iLXCRgSItsJGhIi3wkcEiDxFBBXsPMzMxIi8RIiVgISIloEEiJcBhIiXggQVRBVkFXSIPsIEiLGUm8////////DwBII9pFD7/wSSPcSIv5QYvORTP/SNPrSIvqRYXJdQxmg/sID5PA6aMAAADo32IAAIXAdXJMiwdBi85Ji8BII8VJI8RI0+hmg/gIdge6AQAAAOtPcwVBitfrSLoBAAAAi8JI0+BIK8JJI8BJhcR1M0GD/jB0GUnB6ARIuP///////wAATCPFTCPASdPo6xFIuAAAAAAAAPB/TIXAQQ+VwEEi0IrC6yg9AAIAAHUMZoXbdKNMOT98nuuTPQABAAB1DGaF23SQTDk/fYvrgDLASItcJEBIi2wkSEiLdCRQSIt8JFhIg8QgQV9BXkFcw8zMSIvESIlYCEiJaBBIiXAYSIl4IEFWSIPsYE2L0UmL+EiL2kyL8UiF0nUY6Ond//+7FgAAAIkY6L3c//+Lw+nEAgAASIX/dONNhdJ03kyLjCSQAAAATYXJdNGLjCSYAAAAg/lBdA2NQbuD+AJ2BUUy2+sDQbMBTIuEJKgAAABB9sAID4XjAAAASYsWvv8HAABIi8JIweg0SCPGSDvGD4XIAAAASLn///////8PAEiLwkG4DAAAAEgjwXUEM8nrLUi5AAAAAAAACABIhdJ5Ckg7wXUFSYvI6xRIi8JII8FI99hIG8lIg+H8SIPBCEjB6j9IjUIESDv4cwXGAwDrZUmDyv+E0nQRxgMtSP/DxgMASTv6dANI/89BD7bTTI0NF8gAAIPyAQPSi8JIA8FNiwTBSf/CQ4A8EAB19jPASTv6D5bARI0EAkiL10wDwUiLy0+LBMHo5c3//4XAD4XCAQAARTPAQYvA6ZwBAABJi9BBgOAgSMHqBIPiAYPKAkH22Bv2I7QkuAAAAIPpQQ+EOwEAAIPpBA+E9QAAAIPpAXRcg+kBdBeD6RoPhB8BAACD6QQPhNkAAACD+QF0QEiLhCSwAAAATIvHSIlEJEhJi86LhCSgAAAAiXQkQIlUJDhIi9NEiFwkMIlEJChMiUwkIE2Lyuir+///6QwBAACLrCSgAAAATI1EJFBJiw4PV8BMiUwkIIvVTYvKDxFEJFDoNE0AAESLRCRURTPJg3wkUC1Ii9eJdCQoQQ+UwYlEJCBJK9FEA8VJg8r/STv6SY0MGUgPRNdMjUwkUOhlRwAAhcB0CMYDAOmfAAAASIuEJLAAAABMjUwkUEiJRCQoRIvFSIvXxkQkIABIi8vorPn//+t4SIuEJLAAAABMi8eJdCRISYvOSIlEJECLhCSgAAAAiVQkOEiL00SIXCQwiUQkKEyJTCQgTYvK6Kv2///rO0iLhCSwAAAATIvHiXQkSEmLzkiJRCRAi4QkoAAAAIlUJDhIi9NEiFwkMIlEJChMiUwkIE2Lyuju8v//TI1cJGBJi1sQSYtrGEmLcyBJi3soSYvjQV7DSINkJCAARTPJRTPAM9Izyeji2f//zMxIiVwkEEiJbCQYVldBVkiD7EBIiwXnXgEASDPESIlEJDCLQhRIi/oPt/HB6AyoAXQZg0IQ/g+ICgEAAEiLAmaJMEiDAgLpDgEAAEiLz+gqAQAASI0tR2ABAEyNNQB0AQCD+P90NUiLz+gPAQAAg/j+dChIi8/oAgEAAEhj2EiLz0jB+wbo8wAAAIPgP0iNDMBJiwTeSI0UyOsDSIvVikI5/sg8AQ+GkgAAAEiLz+jKAAAAg/j/dDNIi8/ovQAAAIP4/nQmSIvP6LAAAABIY9hIi89IwfsG6KEAAACD4D9IjQzASYsE3kiNLMgz2zhdOH1LRA+3zkSNQwVIjVQkJEiNTCQg6Bjr//+FwHUpOVwkIH5GSI1sJCQPvk0ASIvX6IEAAACD+P90Df/DSP/FO1wkIHzk6yO4//8AAOsfg0cQ/nkMSIvXi87osGAAAOsNSIsHZokwSIMHAg+3xkiLTCQwSDPM6Hhd//9Ii1wkaEiLbCRwSIPEQEFeX17DzEiD7ChIhcl1FehW2f//xwAWAAAA6CvY//+DyP/rA4tBGEiDxCjDzMyDahABD4iWXwAASIsCiAhI/wIPtsHDzMxIiw09XQEAM8BIg8kBSDkNoHYBAA+UwMNAU0iD7CBIi9m5AgAAAOiJd///SDvYdCa5AQAAAOh6d///SDvYdRNIi8voef///4vI6K5gAACFwHUEMsDrArABSIPEIFvDzMxIiVwkCFdIg+wgSIvZ6Kb///+EwA+EoQAAALkBAAAA6DB3//9IO9h1CUiNPSx2AQDrFrkCAAAA6Bh3//9IO9h1ekiNPRx2AQD/BXZuAQCLQxSpwAQAAHVj8IFLFIICAABIiwdIhcB1ObkAEAAA6Lbl//8zyUiJB+jg2P//SIsHSIXAdR1IjUscx0MQAgAAAEiJSwhIiQvHQyACAAAAsAHrHEiJQwhIiwdIiQPHQxAAEAAAx0MgABAAAOviMsBIi1wkMEiDxCBfw4TJdDRTSIPsIItCFEiL2sHoCagBdB1Ii8rouuH///CBYxR//f//g2MgAEiDYwgASIMjAEiDxCBbw8zMzEiJXCQISIl0JBBIiXwkGFVIi+xIgeyAAAAASIsFv1sBAEgzxEiJRfCL8khj+UmL0EiNTcjof37//41HATPbPQABAAB3DUiLRdBIiwgPtwR5639Ii1XQi8fB+AhBugEAAAAPtshIiwJmORxIfRCITcBFjUoBQIh9wYhdwusKQIh9wEWLyohdwTPARIlUJDCJRehMjUXAZolF7EiNTdCLQgxBi9KJRCQoSI1F6EiJRCQg6AcmAACFwHUUOF3gdAtIi0XIg6CoAwAA/TPA6xYPt0XoI8Y4XeB0C0iLTciDoagDAAD9SItN8EgzzOjRWv//TI2cJIAAAABJi1sQSYtzGEmLeyBJi+Ndw0iJdCQQSIl8JCBVSIvsSIPscEGDyP+L+UE7yA+EBAEAAEiNTeDohn3//0iLReiB/wABAABzKoB9+ABIi4gYAQAAQA+210QPtgQRD4TVAAAASItF4IOgqAMAAP3pxQAAAMZFEgCDeAgBfimL90iNVejB/ghAD7bO6DA/AACFwHQTQIh1ELkCAAAAQIh9EcZFEgDrGOgg1v//uQEAAADHACoAAABAiH0QxkURAEiLVehMjU0QM8DHRCRAAQAAAGaJRSBBuAACAACIRSKLQgxIi5I4AQAAiUQkOEiNRSDHRCQwAwAAAEiJRCQoiUwkIEiNTejoEmEAAIXAdQVEi8frFUQPtkUgg/gBdAsPtkUhQcHgCEQLwIB9+AB0C0iLTeCDoagDAAD9TI1cJHBBi8BJi3MYSYt7KEmL413DzMxIg+wogz3xbAEAAHQLM9LosP7//4vI6wuNQZ+D+Bl3A4PB4IvBSIPEKMPMzEiLxEiJWAhIiWgQSIlwGEiJeCBBVkiD7DAz20GL6EiL+kiL8UiFyXUiOFoodAxIi0oQ6LHV//+IXyhIiV8QSIlfGEiJXyDpDgEAADgZdVVIOVoYdUY4Wih0DEiLShDohdX//4hfKLkCAAAA6ETi//9IiUcQSIvLSPfYG9L30oPiDA+UwYXSD5TAiEcoSIlPGIXSdAeL2um+AAAASItHEGaJGOueQYPJ/4lcJChMi8ZIiVwkIIvNQY1RCujhFgAATGPwhcB1Fv8V/J8AAIvI6A3U///oeNT//4sY631Ii08YTDvxdkM4Xyh0DEiLTxDo9dT//4hfKEuNDDboteH//0iJRxBIi8tI99gb0vfSg+IMSQ9EzoXSD5TAiEcoSIlPGIXSD4Vs////SItHEEGDyf+JTCQoTIvGi81IiUQkIEGNUQroWRYAAEhjyIXAD4R0////SP/JSIlPIEiLbCRIi8NIi1wkQEiLdCRQSIt8JFhIg8QwQV7DzMxIi8RIiVgISIlwEEiJeBhVQVZBV0iNaKFIgeygAAAARTP/TIvySIvxTIl9FzPSTIl9H0iNTcdMiX0nTIl9L0GL/0yJfTdEiH0/TIl950yJfe9MiX33TIl9/0yJfQdEiH0P6Gp6//9Ii0XPu+n9AAA5WAx1FkQ4fd90C0iLRceDoKgDAAD9RIvD6zboSdb//4XAdRlEOH3fdAtIi0XHg6CoAwAA/UG4AQAAAOsURDh933QLSItFx4OgqAMAAP1Fi8dIjVUXSIvO6Lz9//+FwA+FhAAAADPSSI1Nx+jxef//SItFzzlYDHUTRDh933RCSItFx4OgqAMAAP3rNejY1f//hcB1GEQ4fd90C0iLRceDoKgDAAD9uwEAAADrFEQ4fd90C0iLRceDoKgDAAD9QYvfRIvDSI1V50mLzuhJ/f//SIt994XAdRFIi00nSIvX/xXsnQAAi9jrA0GL30Q4fQ90CEiLz+gH0///RDh9P3QJSItNJ+j40v//TI2cJKAAAACLw0mLWyBJi3MoSYt7MEmL40FfQV5dw8xIiVwkCFeNgRgC//9Fi9mD+AFJi9hBD5bCM/+B+TXEAAB3HI2B1Dv//4P4CXcMQbinAgAAQQ+jwHIzg/kq6yaB+ZjWAAB0JoH5qd4AAHYYgfmz3gAAdhaB+ej9AAB0DoH56f0AAHQGD7ryB+sCi9dIi0QkSEWE0kyLTCRATIvATA9Fx0wPRc90B0iFwHQCiThMiUQkSEyLw0yJTCRARYvLSItcJBBfSP8li54AAMzMzEg7ynMEg8j/wzPASDvKD5fAw8zMSIlcJAhIiVQkEFVWV0FUQVVBVkFXSIvsSIPsYDP/SIvZSIXSdRboUdH//41fFokY6CfQ//+Lw+mgAQAAD1fASIk6SIsB8w9/ReBIiX3wSIXAdFZIjVVQZsdFUCo/SIvIQIh9UugjYgAASIsLSIXAdRBMjU3gRTPAM9LojQEAAOsMTI1F4EiL0OgHAwAAi/CFwHUJSIPDCEiLA+uyTItl6EyLfeDp+AAAAEyLfeBMi89Mi2XoSYvXSYvESIl9UEkrx0yLx0yL8EnB/gNJ/8ZIjUgHSMHpA007/EgPR89Ig87/SIXJdCVMixJIi8ZI/8BBODwCdfdJ/8FIg8IITAPISf/ATDvBdd9MiU1QQbgBAAAASYvRSYvO6CCx//9Ii9hIhcB0dkqNFPBNi/dIiVXYSIvCSIlVWE07/HRWSIvLSSvPSIlN0E2LBkyL7kn/xUM4PCh190gr0En/xUgDVVBNi81Ii8joo18AAIXAD4WDAAAASItFWEiLTdBIi1XYSokEMUkDxUmDxghIiUVYTTv0dbRIi0VIi/dIiRgzyehz0P//SYvcTYv3SSvfSIPDB0jB6wNNO/xID0ffSIXbdBRJiw7oTtD//0j/x02NdghIO/t17EmLz+g60P//i8ZIi5wkoAAAAEiDxGBBX0FeQV1BXF9eXcNFM8lIiXwkIEUzwDPSM8nodM7//8zMzMxIiVwkCEiJbCQQSIl0JBhXQVRBVUFWQVdIg+wwSIPN/0mL+TP2TYvwTIvqTIvhSP/FQDg0KXX3ugEAAABJi8ZIA+pI99BIO+h2II1CC0iLXCRgSItsJGhIi3QkcEiDxDBBX0FeQV1BXF/DTY14AUwD/UmLz+gXz///SIvYTYX2dBlNi85Ni8VJi9dIi8jobl4AAIXAD4XYAAAATSv+So0MM0mL10yLzU2LxOhRXgAAhcAPhbsAAABIi08IRI14CEyLdxBJO84PhZ0AAABIOTd1K0GL141IBOi0zv//M8lIiQfoIs///0iLD0iFyXRCSI1BIEiJTwhIiUcQ621MKzdIuP////////9/ScH+A0w78HceSIsPS40sNkiL1U2Lx+jkIgAASIXAdSIzyejYzv//SIvL6NDO//++DAAAADPJ6MTO//+LxukC////So0M8EiJB0iJTwhIjQzoSIlPEDPJ6KPO//9Ii08ISIkZTAF/COvLRTPJSIl0JCBFM8Az0jPJ6OrM///MzEiJXCQgVVZXQVRBVUFWQVdIjawk0P3//0iB7DADAABIiwXiUQEASDPESImFIAIAAE2L4EiL8Ui7AQgAAAAgAABIO9F0IooCLC88LXcKSA++wEgPo8NyEEiLzuhhYgAASIvQSDvGdd5EigJBgPg6dR5IjUYBSDvQdBVNi8xFM8Az0kiLzujv/f//6VYCAABBgOgvM/9BgPgtdwxJD77ASA+jw7ABcgNAisdIK9ZIiX2gSP/CSIl9qPbYSIl9sEiNTCQwSIl9uE0b7UiJfcBMI+pAiH3IM9LoBXT//0iLRCQ4Qb/p/QAARDl4DHUYQDh8JEh0DEiLRCQwg6CoAwAA/UWLx+s66N/P//+FwHUbQDh8JEh0DEiLRCQwg6CoAwAA/UG4AQAAAOsWQDh8JEh0DEiLRCQwg6CoAwAA/USLx0iNVaBIi87oTvf//0iLTbBMjUXQhcCJfCQoSIl8JCBID0XPRTPJM9L/FYSZAABIi9hIg/j/dRdNi8xFM8Az0kiLzujz/P//i/jpRwEAAE2LdCQITSs0JEnB/gMz0kiJfCRwSI1MJFBIiXwkeEiJfYBIiX2ISIl9kECIfZjoIXP//0iLRCRYRDl4DHUYQDh8JGh0DEiLRCRQg6CoAwAA/UWLx+s66AHP//+FwHUbQDh8JGh0DEiLRCRQg6CoAwAA/UG4AQAAAOsWQDh8JGh0DEiLRCRQg6CoAwAA/USLx0iNVCRwSI1N/OjKpf//TIt9gIXASYvPSA9Fz4A5LnURikEBhMB0IDwudQZAOHkCdBZNi8xNi8VIi9boHfz//4v4hcB1WzP/QDh9mHQISYvP6A/M//9IjVXQSIvL/xV6mAAAQb/p/QAAhcAPhQ3///9JiwQkSYtUJAhIK9BIwfoDTDvydClJK9ZKjQzwTI0Nqfn//0G4CAAAAOgeVwAA6w6AfZgAdAhJi8/otsv//0iLy/8VFZgAAIB9yAB0CUiLTbDonsv//4vHSIuNIAIAAEgzzOj1Tv//SIucJIgDAABIgcQwAwAAQV9BXkFdQVxfXl3DzMzpV/n//8zMzEiJXCQISIlsJBBIiXQkGFdIg+xAM9tBi+hIi/pIi/FIhcl1GThaKHQDiFooSIlaEEiJWhhIiVog6b0AAABmORl1MEg5Whh1IjhaKHQDiFoo6HvK//+5IgAAAIkIiF8oSIlfGIvZ6ZAAAABIi0IQiBjrwkiJXCQ4QYPJ/0iJXCQwTIvGiVwkKDPSi81IiVwkIOj79///SGPQhcB1Fv8VppUAAIvI6LfJ///oIsr//4sY60hIi08YSDvRdgo4Xyh0kIhfKOuLSItHEEGDyf9IiVwkOEyLxkiJXCQwM9KJTCQoi81IiUQkIOik9///SGPIhcB0qUj/yUiJTyBIi2wkWIvDSItcJFBIi3QkYEiDxEBfw8zMzEiJXCQQSIl8JBhVSI2sJHD+//9IgeyQAgAASIsFu00BAEgzxEiJhYABAABBi/hIi9pBuAUBAABIjVQkcP8VEpUAAIXAdRT/FeiUAACLyOj5yP//M8DpoAAAAEiDZCRgAEiNTCQgSIvHSIlcJEAz0kiJRCRISIlEJFhIiVwkUMZEJGgA6Cxw//9Ii0QkKEG46f0AAEQ5QAx1FYB8JDgAdEdIi0QkIIOgqAMAAP3rOegJzP//hcB1GjhEJDh0DEiLRCQgg6CoAwAA/UG4AQAAAOsWgHwkOAB0DEiLRCQgg6CoAwAA/UUzwEiNVCRASI1MJHDo9v3//4tEJGBIi42AAQAASDPM6LNM//9MjZwkkAIAAEmLWxhJi3sgSYvjXcPMzEiJXCQITIlMJCBXSIPsIEmL+UmL2IsK6IgQAACQSIsDSIsISIuBiAAAAEiDwBhIiw0XZgEASIXJdG9IhcB0XUG4AgAAAEWLyEGNUH4PEAAPEQEPEEgQDxFJEA8QQCAPEUEgDxBIMA8RSTAPEEBADxFBQA8QSFAPEUlQDxBAYA8RQWBIA8oPEEhwDxFJ8EgDwkmD6QF1tooAiAHrJzPSQbgBAQAA6MOFAADo7sf//8cAFgAAAOjDxv//QbgCAAAAQY1QfkiLA0iLCEiLgYgAAABIBRkBAABIiw13ZQEASIXJdF5IhcB0TA8QAA8RAQ8QSBAPEUkQDxBAIA8RQSAPEEgwDxFJMA8QQEAPEUFADxBIUA8RSVAPEEBgDxFBYEgDyg8QSHAPEUnwSAPCSYPoAXW26x0z0kG4AAEAAOgshQAA6FfH///HABYAAADoLMb//0iLQwhIiwhIixGDyP/wD8ECg/gBdRtIi0MISIsISI0FqE4BAEg5AXQISIsJ6LPH//9IiwNIixBIi0MISIsISIuCiAAAAEiJAUiLA0iLCEiLgYgAAADw/wCLD+hJDwAASItcJDBIg8QgX8PMzEBTSIPsQIvZM9JIjUwkIOjEbf//gyWNZAEAAIP7/nUSxwV+ZAEAAQAAAP8V2JMAAOsVg/v9dRTHBWdkAQABAAAA/xW5kwAAi9jrF4P7/HUSSItEJCjHBUlkAQABAAAAi1gMgHwkOAB0DEiLTCQgg6GoAwAA/YvDSIPEQFvDzMzMSIlcJAhIiWwkEEiJdCQYV0iD7CBIjVkYSIvxvQEBAABIi8tEi8Uz0ugDhAAAM8BIjX4MSIlGBLkGAAAASImGIAIAAA+3wGbzq0iNPZBNAQBIK/6KBB+IA0j/w0iD7QF18kiNjhkBAAC6AAEAAIoEOYgBSP/BSIPqAXXySItcJDBIi2wkOEiLdCRASIPEIF/DSIlcJBBIiXQkGFVIjawkgPn//0iB7IAHAABIiwXPSQEASDPESImFcAYAAEiL2YtJBIH56f0AAA+EPQEAAEiNVCRQ/xW4kgAAhcAPhCoBAAAzwEiNTCRwvgABAACIAf/ASP/BO8Zy9YpEJFZIjVQkVsZEJHAg6yBED7ZCAQ+2yOsLO85zDMZEDHAg/8FBO8h28EiDwgKKAoTAddyLQwRMjUQkcINkJDAARIvOiUQkKLoBAAAASI2FcAIAADPJSIlEJCDoBRQAAINkJEAATI1MJHCLQwREi8ZIi5MgAgAAM8mJRCQ4SI1FcIl0JDBIiUQkKIl0JCDoJlAAAINkJEAATI1MJHCLQwRBuAACAABIi5MgAgAAM8mJRCQ4SI2FcAEAAIl0JDBIiUQkKIl0JCDo7U8AALgBAAAASI2VcAIAAPYCAXQLgEwYGBCKTAVv6xX2AgJ0DoBMGBggiowFbwEAAOsCMsmIjBgYAQAASIPCAkj/wEiD7gF1x+tDM9K+AAEAAI1KAUSNQp9BjUAgg/gZdwqATAsYEI1CIOsSQYP4GXcKgEwLGCCNQuDrAjLAiIQLGAEAAP/CSP/BO9Zyx0iLjXAGAABIM8zoBEj//0yNnCSABwAASYtbGEmLcyBJi+Ndw8zMzEiJXCQITIlMJCBMiUQkGFVWV0iL7EiD7EBAivKL2UmL0UmLyOiXAQAAi8vo3Pz//0iLTTCL+EyLgYgAAABBO0AEdQczwOm4AAAAuSgCAADo/ND//0iL2EiFwA+ElQAAAEiLRTC6BAAAAEiLy0iLgIgAAABEjUJ8DxAADxEBDxBIEA8RSRAPEEAgDxFBIA8QSDAPEUkwDxBAQA8RQUAPEEhQDxFJUA8QQGAPEUFgSQPIDxBIcEkDwA8RSfBIg+oBdbYPEAAPEQEPEEgQDxFJEEiLQCBIiUEgi88hE0iL0+gRAgAAi/iD+P91Jej9wv//xwAWAAAAg8//SIvL6ITD//+Lx0iLXCRgSIPEQF9eXcNAhPZ1Beh/rf//SItFMEiLiIgAAACDyP/wD8EBg/gBdRxIi0UwSIuIiAAAAEiNBSpKAQBIO8h0Beg4w///xwMBAAAASIvLSItFMDPbSImIiAAAAEiLRTCLiKgDAACFDepPAQB1hEiNRTBIiUXwTI1N5EiNRThIiUX4TI1F8I1DBUiNVeiJReRIjU3giUXo6K75//9AhPYPhE3///9Ii0U4SIsISIkNo0kBAOk6////zMxIiVwkEEiJdCQYV0iD7CBIi/JIi/mLBYFPAQCFgagDAAB0E0iDuZAAAAAAdAlIi5mIAAAA62S5BQAAAOj0CQAAkEiLn4gAAABIiVwkMEg7HnQ+SIXbdCKDyP/wD8EDg/gBdRZIjQVCSQEASItMJDBIO8h0BehLwv//SIsGSImHiAAAAEiJRCQw8P8ASItcJDC5BQAAAOjuCQAASIXbdBNIi8NIi1wkOEiLdCRASIPEIF/D6Pmy//+QSIPsKIA9NV8BAAB1TEiNDSBMAQBIiQ0RXwEASI0F0kgBAEiNDftKAQBIiQUEXwEASIkN7V4BAOjY1v//TI0N8V4BAEyLwLIBuf3////oNv3//8YF514BAAGwAUiDxCjDSIPsKOjX1f//SIvISI0VwV4BAEiDxCjpzP7//0iJXCQYVVZXQVRBVUFWQVdIg+xASIsF/UQBAEgzxEiJRCQ4SIvy6O35//8z24v4hcAPhFMCAABMjS2KTAEARIvzSYvFjWsBOTgPhE4BAABEA/VIg8AwQYP+BXLrgf/o/QAAD4QtAQAAD7fP/xWfjQAAhcAPhBwBAAC46f0AADv4dS5IiUYESImeIAIAAIleGGaJXhxIjX4MD7fDuQYAAABm86tIi87offr//+niAQAASI1UJCCLz/8Va40AAIXAD4TEAAAAM9JIjU4YQbgBAQAA6PJ9AACDfCQgAol+BEiJniACAAAPhZQAAABIjUwkJjhcJCZ0LDhZAXQnD7ZBAQ+2ETvQdxQrwo16AY0UKIBMNxgEA/1IK9V19EiDwQI4GXXUSI1GGrn+AAAAgAgISAPFSCvNdfWLTgSB6aQDAAB0LoPpBHQgg+kNdBI7zXQFSIvD6yJIiwU1sgAA6xlIiwUksgAA6xBIiwUTsgAA6wdIiwUCsgAASImGIAIAAOsCi+uJbgjpC////zkdMV0BAA+F9QAAAIPI/+n3AAAAM9JIjU4YQbgBAQAA6Bp9AABBi8ZNjU0QTI09/EoBAEG+BAAAAEyNHEBJweMETQPLSYvRQTgZdD44WgF0OUQPtgIPtkIBRDvAdyRFjVABQYH6AQEAAHMXQYoHRAPFQQhEMhhEA9UPtkIBRDvAduBIg8ICOBp1wkmDwQhMA/1MK/V1rol+BIluCIHvpAMAAHQpg+8EdBuD7w10DTv9dSJIix1OsQAA6xlIix09sQAA6xBIix0ssQAA6wdIix0bsQAATCveSImeIAIAAEiNVgy5BgAAAEuNPCsPt0QX+GaJAkiNUgJIK8117+kZ/v//SIvO6Ab4//8zwEiLTCQ4SDPM6FdC//9Ii5wkkAAAAEiDxEBBX0FeQV1BXF9eXcPMzMxIiVwkCEiJdCQQV0iD7ECL2kGL+UiL0UGL8EiNTCQg6BBl//9Ii0QkMA+200CEfAIZdRqF9nQQSItEJChIiwgPtwRRI8brAjPAhcB0BbgBAAAAgHwkOAB0DEiLTCQgg6GoAwAA/UiLXCRQSIt0JFhIg8RAX8PMzMyL0UG5BAAAADPJRTPA6Xb////MzIH5NcQAAHcgjYHUO///g/gJdwxBuqcCAABBD6PCcgWD+Sp1LzPS6yuB+ZjWAAB0IIH5qd4AAHYbgfmz3gAAduSB+ej9AAB03IH56f0AAHUDg+IISP8ljooAAMzMSIvESIlYCEiJaBBIiXAYSIl4IEFWSIPsQP8VdYoAAEUz9kiL2EiFwA+EpAAAAEiL8GZEOTB0HEiDyP9I/8BmRDk0RnX2SI00RkiDxgJmRDk2deRMiXQkOEgr80yJdCQwSIPGAkjR/kyLw0SLzkSJdCQoM9JMiXQkIDPJ6JTq//9IY+iFwHRLSIvN6CnK//9Ii/hIhcB0LkyJdCQ4RIvOTIl0JDBMi8OJbCQoM9IzyUiJRCQg6Fvq//+FwHQISIv3SYv+6wNJi/ZIi8/oHL3//+sDSYv2SIXbdAlIi8v/FbmJAABIi1wkUEiLxkiLdCRgSItsJFhIi3wkaEiDxEBBXsPMzMxIiVwkGIlUJBBVVldBVEFVQVZBV0iD7DAz9ovaTIv5SIXJdRToJ7z//8cAFgAAAEiDyP/puwIAALo9AAAASYv/6ON4AABMi+hIhcAPhIECAABJO8cPhHgCAABMizUHUwEATDs1GFMBAECKaAFAiGwkcHUSSYvO6KUCAABMi/BIiQXjUgEAQbwBAAAATYX2D4W1AAAAhdt0P0g5NdFSAQB0NugWof//SIXAD4QjAgAATIs1slIBAEw7NcNSAQAPhYEAAABJi87oVQIAAEyL8EiJBZNSAQDrbUCE7Q+EAQIAALoIAAAASYvM6IO7//8zyUiJBXJSAQDo7bv//0yLNWZSAQBNhfZ1CUiDzf/p0wEAAEg5NVlSAQB1K7oIAAAASYvM6Eq7//8zyUiJBUFSAQDotLv//0g5NTVSAQB0ykyLNSRSAQBNhfZ0vkmLBk2L5U0r50mL3kiFwHQ0TYvESIvQSYvP6HRQAACFwHUQSIsDQYA8BD10D0E4NAR0CUiDwwhIiwPr0Ekr3kjB+wPrCkkr3kjB+wNI99tIhdt4V0k5NnRSSYsM3ug9u///QITtdBVNiTze6ZUAAABJi0TeCEmJBN5I/8NJOTTede5BuAgAAABIi9NJi87oDA8AADPJSIvY6AK7//9Ihdt0ZkiJHXZRAQDrXUCE7Q+E6AAAAEj320iNUwJIO9NzCUiDzf/p1QAAAEi4/////////x9IO9Bz6EG4CAAAAEmLzui5DgAAM8lMi/Dor7r//02F9nTLTYk83kmJdN4ITIk1GlEBAEiL/jl0JHgPhI4AAABIg83/TIv1Sf/GQzg0N3X3ugEAAABJjU4C6Pe5//9Ii9hIhcB0R02Lx0mNVgJIi8jo5Kr//4XAdXdIi8NJjU0BSSvHSAPI9lwkcEgb0kgj0UCIcf9Ii8voweX//4XAdQ3okLn//4v1xwAqAAAASIvL6Bi6///rF+h5uf//SIPO/8cAFgAAAIvui/WL7ov1SIvP6Pe5//+LxkiLnCSAAAAASIPEMEFfQV5BXUFcX15dw0UzyUiJdCQgRTPAM9IzyegxuP//zEiJXCQISIl0JBBIiXwkGEFWSIPsMEiL+UiFyXUYM8BIi1wkQEiLdCRISIt8JFBIg8QwQV7DM8lIi8dIOQ90DUj/wUiNQAhIgzgAdfNI/8G6CAAAAOj3uP//SIvYSIXAdH5IiwdIhcB0UUyL80wr90iDzv9I/8aAPDAAdfe6AQAAAEiNTgHoxrj//zPJSYkEPugzuf//SYsMPkiFyXRBTIsHSI1WAeiqqf//hcB1G0iDxwhIiwdIhcB1tTPJ6Ae5//9Ii8PpVv///0iDZCQgAEUzyUUzwDPSM8noUrf//8zo0Kn//8zMzMzp8/v//8zMzEBTSIPsIDPbSI0VAVYBAEUzwEiNDJtIjQzKuqAPAADoYL3//4XAdBH/BRJYAQD/w4P7DnLTsAHrCTPJ6CQAAAAywEiDxCBbw0hjwUiNDIBIjQW6VQEASI0MyEj/JReEAADMzMxAU0iD7CCLHdBXAQDrHUiNBZdVAQD/y0iNDJtIjQzI/xX/gwAA/w2xVwEAhdt137ABSIPEIFvDzEhjwUiNDIBIjQVmVQEASI0MyEj/JcuDAADMzMxAU0iD7CAz24lcJDBlSIsEJWAAAABIi0ggOVkIfBFIjUwkMOgQuv//g3wkMAF0BbsBAAAAi8NIg8QgW8NIiVwkCEiJbCQQSIl0JBhXSIPsILpIAAAAjUr46Eu3//8z9kiL2EiFwHRbSI2oABIAAEg7xXRMSI14MEiNT9BFM8C6oA8AAOhEvP//SINP+P9IjU8OgGcN+IvGSIk3x0cIAAAKCsZHDApAiDH/wEj/wYP4BXLzSIPHSEiNR9BIO8V1uEiL8zPJ6Fe3//9Ii1wkMEiLxkiLdCRASItsJDhIg8QgX8PMzMxIhcl0SkiJXCQISIl0JBBXSIPsIEiNsQASAABIi9lIi/lIO850EkiLz/8VvYIAAEiDx0hIO/517kiLy+j8tv//SItcJDBIi3QkOEiDxCBfw0iJXCQISIl0JBBIiXwkGEFXSIPsMIvxgfkAIAAAcinoMLb//7sJAAAAiRjoBLX//4vDSItcJEBIi3QkSEiLfCRQSIPEMEFfwzP/jU8H6Ar+//+Qi9+LBXlTAQBIiVwkIDvwfDZMjT1pTwEASTk833QC6yLokP7//0mJBN9IhcB1BY14DOsUiwVIUwEAg8BAiQU/UwEASP/D68G5BwAAAOgM/v//i8frikhj0UyNBSJPAQBIi8KD4j9IwfgGSI0M0kmLBMBIjQzISP8lvYEAAMxIY9FMjQX6TgEASIvCg+I/SMH4BkiNDNJJiwTASI0MyEj/JZ2BAADMSIlcJAhIiXQkEEiJfCQYQVZIg+wgSGPZhcl4cjsdulIBAHNqSIvDTI01rk4BAIPgP0iL80jB/gZIjTzASYsE9vZE+DgBdEdIg3z4KP90P+h4k///g/gBdSeF23QWK9h0CzvYdRu59P///+sMufX////rBbn2////M9L/FSyCAABJiwT2SINM+Cj/M8DrFujJtP//xwAJAAAA6J60//+DIACDyP9Ii1wkMEiLdCQ4SIt8JEBIg8QgQV7DzMxIg+wog/n+dRXocrT//4MgAOiKtP//xwAJAAAA606FyXgyOw34UQEAcypIY8lMjQXsTQEASIvBg+E/SMH4BkiNFMlJiwTA9kTQOAF0B0iLRNAo6xzoJ7T//4MgAOg/tP//xwAJAAAA6BSz//9Ig8j/SIPEKMPMzMyLBSZUAQC5AEAAAIXAD0TBiQUWVAEAM8DDzMzMSIXJD4QAAQAAU0iD7CBIi9lIi0kYSDsN2EABAHQF6IG0//9Ii0sgSDsNzkABAHQF6G+0//9Ii0soSDsNxEABAHQF6F20//9Ii0swSDsNukABAHQF6Eu0//9Ii0s4SDsNsEABAHQF6Dm0//9Ii0tASDsNpkABAHQF6Ce0//9Ii0tISDsNnEABAHQF6BW0//9Ii0toSDsNqkABAHQF6AO0//9Ii0twSDsNoEABAHQF6PGz//9Ii0t4SDsNlkABAHQF6N+z//9Ii4uAAAAASDsNiUABAHQF6Mqz//9Ii4uIAAAASDsNfEABAHQF6LWz//9Ii4uQAAAASDsNb0ABAHQF6KCz//9Ig8QgW8PMzEiFyXRmU0iD7CBIi9lIiwlIOw25PwEAdAXoerP//0iLSwhIOw2vPwEAdAXoaLP//0iLSxBIOw2lPwEAdAXoVrP//0iLS1hIOw3bPwEAdAXoRLP//0iLS2BIOw3RPwEAdAXoMrP//0iDxCBbw0iJXCQISIl0JBBXSIPsIDP/SI0E0UiL2UiL8ki5/////////x9II/FIO9hID0f3SIX2dBRIiwvo8LL//0j/x0iNWwhIO/517EiLXCQwSIt0JDhIg8QgX8NIhckPhP4AAABIiVwkCEiJbCQQVkiD7CC9BwAAAEiL2YvV6IH///9IjUs4i9Xodv///411BYvWSI1LcOho////SI2L0AAAAIvW6Fr///9IjYswAQAAjVX76Ev///9Ii4tAAQAA6Guy//9Ii4tIAQAA6F+y//9Ii4tQAQAA6FOy//9IjYtgAQAAi9XoGf///0iNi5gBAACL1egL////SI2L0AEAAIvW6P3+//9IjYswAgAAi9bo7/7//0iNi5ACAACNVfvo4P7//0iLi6ACAADoALL//0iLi6gCAADo9LH//0iLi7ACAADo6LH//0iLi7gCAADo3LH//0iLXCQwSItsJDhIg8QgXsNIg+wo6PfF//9IjVQkMEiLiJAAAABIiUwkMEiLyOiGyP//SItEJDBIiwBIg8Qow8xAVUFUQVVBVkFXSIPsYEiNbCQwSIldYEiJdWhIiX1wSIsF/jQBAEgzxUiJRSBEi+pFi/lIi9FNi+BIjU0A6LpX//+LvYgAAACF/3UHSItFCIt4DPedkAAAAEWLz02LxIvPG9KDZCQoAEiDZCQgAIPiCP/C6Nzy//9MY/CFwHUHM//pzgAAAEmL9kgD9kiNRhBIO/BIG8lII8h0U0iB+QAEAAB3MUiNQQ9IO8F3Cki48P///////w9Ig+Dw6JRrAABIK+BIjVwkMEiF23RvxwPMzAAA6xPojr3//0iL2EiFwHQOxwDd3QAASIPDEOsCM9tIhdt0R0yLxjPSSIvL6NJtAABFi89EiXQkKE2LxEiJXCQgugEAAACLz+g28v//hcB0GkyLjYAAAABEi8BIi9NBi83/FSR9AACL+OsCM/9Ihdt0EUiNS/CBOd3dAAB1BehIsP//gH0YAHQLSItFAIOgqAMAAP2Lx0iLTSBIM83okTP//0iLXWBIi3VoSIt9cEiNZTBBX0FeQV1BXF3DzMzM8P9BEEiLgeAAAABIhcB0A/D/AEiLgfAAAABIhcB0A/D/AEiLgegAAABIhcB0A/D/AEiLgQABAABIhcB0A/D/AEiNQThBuAYAAABIjRWbNgEASDlQ8HQLSIsQSIXSdAPw/wJIg3joAHQMSItQ+EiF0nQD8P8CSIPAIEmD6AF1y0iLiSABAADpeQEAAMxIiVwkCEiJbCQQSIl0JBhXSIPsIEiLgfgAAABIi9lIhcB0eUiNDY47AQBIO8F0bUiLg+AAAABIhcB0YYM4AHVcSIuL8AAAAEiFyXQWgzkAdRHoKq///0iLi/gAAADoevr//0iLi+gAAABIhcl0FoM5AHUR6Aiv//9Ii4v4AAAA6GT7//9Ii4vgAAAA6PCu//9Ii4v4AAAA6OSu//9Ii4MAAQAASIXAdEeDOAB1QkiLiwgBAABIgen+AAAA6MCu//9Ii4sQAQAAv4AAAABIK8/orK7//0iLixgBAABIK8/ona7//0iLiwABAADoka7//0iLiyABAADopQAAAEiNsygBAAC9BgAAAEiNezhIjQVONQEASDlH8HQaSIsPSIXJdBKDOQB1DehWrv//SIsO6E6u//9Ig3/oAHQTSItP+EiFyXQKgzkAdQXoNK7//0iDxghIg8cgSIPtAXWxSIvLSItcJDBIi2wkOEiLdCRASIPEIF/pCq7//8zMSIXJdBxIjQVkmQAASDvIdBC4AQAAAPAPwYFcAQAA/8DDuP///3/DzEiFyXQwU0iD7CBIjQU3mQAASIvZSDvIdBeLgVwBAACFwHUN6OT6//9Ii8vosK3//0iDxCBbw8zMSIXJdBpIjQUEmQAASDvIdA6DyP/wD8GBXAEAAP/Iw7j///9/w8zMzEiD7ChIhckPhJYAAABBg8n/8EQBSRBIi4HgAAAASIXAdATwRAEISIuB8AAAAEiFwHQE8EQBCEiLgegAAABIhcB0BPBEAQhIi4EAAQAASIXAdATwRAEISI1BOEG4BgAAAEiNFfkzAQBIOVDwdAxIixBIhdJ0BPBEAQpIg3joAHQNSItQ+EiF0nQE8EQBCkiDwCBJg+gBdclIi4kgAQAA6DX///9Ig8Qow0iJXCQIV0iD7CDo/cD//0iNuJAAAACLiKgDAACLBY45AQCFyHQISIsfSIXbdSy5BAAAAOgQ9P//kEiLFahJAQBIi8/oKAAAAEiL2LkEAAAA6Ef0//9Ihdt0DkiLw0iLXCQwSIPEIF/D6Fed//+QzMxIiVwkCFdIg+wgSIv6SIXSdEZIhcl0QUiLGUg72nUFSIvH6zZIiTlIi8/oLfz//0iF23TrSIvL6Kz+//+DexAAdd1IjQWXMQEASDvYdNFIi8vokvz//+vHM8BIi1wkMEiDxCBfw8zMzEiJXCQISIlsJBBIiXQkGFdIg+wgSYvoSIvaSIvxSIXSdB0z0kiNQuBI9/NJO8BzD+gzq///xwAMAAAAM8DrQUiF9nQK6A9CAABIi/jrAjP/SA+v3UiLzkiL0+g1QgAASIvwSIXAdBZIO/tzEUgr30iNDDhMi8Mz0ui7aAAASIvGSItcJDBIi2wkOEiLdCRASIPEIF/DzMzMSIPsKP8VJngAAEiFwEiJBcxKAQAPlcBIg8Qow0iDJbxKAQAAsAHDzEiJXCQISIl0JBBXSIPsIEiL8kiL+Ug7ynRUSIvZSIsDSIXAdAr/FT14AACEwHQJSIPDEEg73nXlSDvedDFIO990KEiDw/hIg3v4AHQQSIsDSIXAdAgzyf8VC3gAAEiD6xBIjUMISDvHddwywOsCsAFIi1wkMEiLdCQ4SIPEIF/DSIlcJAhXSIPsIEiL2kiL+Ug7ynQaSItD+EiFwHQIM8n/FcJ3AABIg+sQSDvfdeZIi1wkMLABSIPEIF/DSIkN/UkBAMNAU0iD7CBIi9noIgAAAEiFwHQUSIvL/xWIdwAAhcB0B7gBAAAA6wIzwEiDxCBbw8xAU0iD7CAzyeiv8f//kEiLHb8tAQCLy4PhP0gzHatJAQBI08szyejl8f//SIvDSIPEIFvDSIlcJAhMiUwkIFdIg+wgSYv5iwrob/H//5BIix1/LQEAi8uD4T9IMx2DSQEASNPLiw/opfH//0iLw0iLXCQwSIPEIF/DzMzMTIvcSIPsKLgDAAAATY1LEE2NQwiJRCQ4SY1TGIlEJEBJjUsI6I////9Ig8Qow8zMSIkNIUkBAEiJDSJJAQBIiQ0jSQEASIkNJEkBAMPMzMxIiVwkIFZXQVRBVUFWSIPsQIvZRTPtRCFsJHhBtgFEiHQkcIP5AnQhg/kEdEyD+QZ0F4P5CHRCg/kLdD2D+Q90CI1B64P4AXd9g+kCD4SvAAAAg+kED4SLAAAAg+kJD4SUAAAAg+kGD4SCAAAAg/kBdHQz/+mPAAAA6LK+//9Mi+hIhcB1GIPI/0iLnCSIAAAASIPEQEFeQV1BXF9ew0iLAEiLDfCKAABIweEESAPI6wk5WAR0C0iDwBBIO8F18jPASIXAdRLoHaj//8cAFgAAAOjypv//665IjXgIRTL2RIh0JHDrIkiNPStIAQDrGUiNPRpIAQDrEEiNPSFIAQDrB0iNPQBIAQBIg6QkgAAAAABFhPZ0C7kDAAAA6NDv//+QSIs3RYT2dBJIiwXYKwEAi8iD4T9IM/BI085Ig/4BD4SUAAAASIX2D4QDAQAAQbwQCQAAg/sLdz1BD6PcczdJi0UISImEJIAAAABIiUQkMEmDZQgAg/sIdVPoNbz//4tAEIlEJHiJRCQg6CW8///HQBCMAAAAg/sIdTJIiwX+iQAASMHgBEkDRQBIiw33iQAASMHhBEgDyEiJRCQoSDvBdB1Ig2AIAEiDwBDr60iLBTQrAQBIiQfrBkG8EAkAAEWE9nQKuQMAAADoVu///0iD/gF1BzPA6Y7+//+D+wh1Geivu///i1AQi8tIi8ZMiwWUdAAAQf/Q6w6Ly0iLxkiLFYN0AAD/0oP7C3fIQQ+j3HPCSIuEJIAAAABJiUUIg/sIdbHobLv//4tMJHiJSBDro0WE9nQIjU4D6Obu//+5AwAAAOjwj///kMzMzEiJXCQQV0iD7CC4//8AAA+32mY7yHRIuAABAABmO8hzEkiLBRQzAQAPt8kPtwRII8PrLjP/ZolMJEBMjUwkMGaJfCQwSI1UJECNTwFEi8Ho0D0AAIXAdAcPt0QkMOvQM8BIi1wkOEiDxCBfw0iJXCQISIlsJBBIiXQkGFdBVkFXSIPsIEyL8UiFyXR0M9tMjT1HEf//v+MAAACNBB9BuFUAAACZSYvOK8LR+Ehj6EiL1UiL9UgD0kmLlNfwqQEA6Fw8AACFwHQTeQWNff/rA41dATvffsSDyP/rC0gD9kGLhPf4qQEAhcB4Fj3kAAAAcw9ImEgDwEGLhMeQjwEA6wIzwEiLXCRASItsJEhIi3QkUEiDxCBBX0FeX8PMSIlcJAhXSIPsIEiL2UiFyXUV6Eml///HABYAAADoHqT//4PI/+tRi0EUg8//wegNqAF0OugDr///SIvLi/joya///0iLy+ixy///i8joMj0AAIXAeQWDz//rE0iLSyhIhcl0CuiPpf//SINjKABIi8vocj4AAIvHSItcJDBIg8QgX8PMSIlcJBBIiUwkCFdIg+wgSIvZSIXJdR7owKT//8cAFgAAAOiVo///g8j/SItcJDhIg8QgX8OLQRTB6AyoAXQH6CA+AADr4eiRQ///kEiLy+go////i/hIi8voikP//4vH68jMzEiJXCQITIlMJCBXSIPsIEmL+UmL2IsK6LDu//+QSIsDSGMISIvRSIvBSMH4BkyNBcQ9AQCD4j9IjRTSSYsEwPZE0DgBdCToje///0iLyP8VjHEAADPbhcB1Huj5o///SIvY/xWIbwAAiQPoCaT//8cACQAAAIPL/4sP6HXu//+Lw0iLXCQwSIPEIF/DiUwkCEiD7DhIY9GD+v51DejXo///xwAJAAAA62yFyXhYOxVFQQEAc1BIi8pMjQU5PQEAg+E/SIvCSMH4BkiNDMlJiwTA9kTIOAF0LUiNRCRAiVQkUIlUJFhMjUwkUEiNVCRYSIlEJCBMjUQkIEiNTCRI6P3+///rE+huo///xwAJAAAA6EOi//+DyP9Ig8Q4w8zMzEiJXCQIVVZXQVRBVUFWQVdIjWwk2UiB7AABAABIiwVVJwEASDPESIlFF0hj8k2L+EiLxkiJTfdIiUXvSI0Ndg7//4PgP0WL6U0D6EyJRd9Mi+ZMiW2vScH8BkyNNMBKi4ThIC4CAEqLRPAoSIlFt/8VU3AAADPSSI1MJFCJRafozEn//0iLTCRYRTPbRIldl0GL24ldm0mL/4tRDEGLy4lMJECJVatNO/0Pg+IDAABIi8ZJi/dIwfgGSIlF54oPQb8BAAAAiEwkRESJXCRIgfrp/QAAD4VwAQAATI091w3//0GL002LjMcgLgIASYvzS40E8UQ4XDA+dAv/wkj/xkiD/gV87kiF9g+O4AAAAEuLhOcgLgIATItFr0wrx0IPtkzwPkYPvrw5ICICAEH/x0WL70Qr6k1j1U070A+PeAIAAEiNRf9Ji9NMK8hPjQTxSI1N/0gDykj/wkKKRAE+iAFIO9Z86kWF7X4VSI1N/02LwkgDzkiL1+hsYwAARTPbSYvTTI0FLw3//0uLjOAgLgIASAPKSP/CRohc8T5IO9Z86EiNRf9MiV2/SIlFx0yNTb9Bi8NIjVXHQYP/BEiNTCRID5TA/8BEi8BEi/joAwsAAEiD+P8PhNcAAABBjUX/TIttr0hj8EgD9+nmAAAAD7YHSYvVSCvXSg++tDggIgIAjU4BSGPBSDvCD4/kAQAAg/kETIldz0GLw0iJfdcPlMBMjU3P/8BIjVXXRIvASI1MJEiL2OibCgAASIP4/3RzSAP3RIv76YoAAABIjQVnDP//SouU4CAuAgBCikzyPfbBBHQbQopE8j6A4fuIRQeKB0KITPI9SI1VB4hFCOsf6KHv//8Ptg8z0mY5FEh9LUj/xkk79Q+DsgEAAEiL10G4AgAAAEiNTCRI6Eew//+D+P91IoB9jwDpiwEAAE2Lx0iNTCRISIvX6Cmw//+D+P8PhK8BAACLTadIjUUPM9tMjUQkSEiJXCQ4SI1+AUiJXCQwRYvPx0QkKAUAAAAz0kiJRCQg6BHO//+L8IXAD4TSAQAASItNt0yNTCRMRIvASIlcJCBIjVUP/xXcbAAARTPbhcAPhKMBAABEi3wkQIvfK13fQQPfiV2bOXQkTA+C8QAAAIB8JEQKdUlIi023QY1DDUyNTCRMZolEJERFjUMBTIlcJCBIjVQkRP8VimwAAEUz24XAD4TxAAAAg3wkTAEPgq4AAABB/8f/w0SJfCRAiV2bSIv3STv9D4PgAAAASItF54tVq+kE/f//QYvTTYXAfi1IK/5IjR3tCv//igQ3/8JKi4zjIC4CAEgDzkj/xkKIRPE+SGPCSTvAfOCLXZtBA9jrTEWLy0iF0n5CTItt702Lw02L1UGD5T9JwfoGTo0c7QAAAABNA91BigQ4Qf/BS4uM1yAuAgBJA8hJ/8BCiETZPkljwUg7wnzeRTPbA9qJXZtEOF2Pi0wkQOtJigdMjQVjCv//S4uM4CAuAgD/w4ldm0KIRPE+S4uE4CAuAgBCgEzwPQQ4VY/rzP8VUGoAAIlFl4tMJECAfY8A6wiLTCRARDhdj3QMSItEJFCDoKgDAAD9SItF9/IPEEWX8g8RAIlICEiLTRdIM8zomSL//0iLnCRAAQAASIHEAAEAAEFfQV5BXUFcX15dw/8V8GkAAIlFl4tMJEA4XY/rqUiJXCQISIlsJBhWV0FWuFAUAADopFkAAEgr4EiLBWoiAQBIM8RIiYQkQBQAAExj0kiL+UmLwkGL6UjB+AZIjQ2oNwEAQYPiP0kD6EmL8EiLBMFLjRTSTIt00CgzwEiJB4lHCEw7xXNvSI1cJEBIO/VzJIoGSP/GPAp1Cf9HCMYDDUj/w4gDSP/DSI2EJD8UAABIO9hy10iDZCQgAEiNRCRAK9hMjUwkMESLw0iNVCRASYvO/xVjagAAhcB0EotEJDABRwQ7w3IPSDv1cpvrCP8VD2kAAIkHSIvHSIuMJEAUAABIM8zogiH//0yNnCRQFAAASYtbIEmLazBJi+NBXl9ew8zMSIlcJAhIiWwkGFZXQVa4UBQAAOigWAAASCvgSIsFZiEBAEgzxEiJhCRAFAAATGPSSIv5SYvCQYvpSMH4BkiNDaQ2AQBBg+I/SQPoSYvwSIsEwUuNFNJMi3TQKDPASIkHiUcITDvFD4OCAAAASI1cJEBIO/VzMQ+3BkiDxgJmg/gKdRCDRwgCuQ0AAABmiQtIg8MCZokDSIPDAkiNhCQ+FAAASDvYcspIg2QkIABIjUQkQEgr2EyNTCQwSNH7SI1UJEAD20mLzkSLw/8VSGkAAIXAdBKLRCQwAUcEO8NyD0g79XKI6wj/FfRnAACJB0iLx0iLjCRAFAAASDPM6Gcg//9MjZwkUBQAAEmLWyBJi2swSYvjQV5fXsPMzMxIiVwkCEiJbCQYVldBVEFWQVe4cBQAAOiAVwAASCvgSIsFRiABAEgzxEiJhCRgFAAATGPSSIvZSYvCRYvxSMH4BkiNDYQ1AQBBg+I/TQPwTYv4SYv4SIsEwUuNFNJMi2TQKDPASIkDTTvGiUMID4POAAAASI1EJFBJO/5zLQ+3D0iDxwJmg/kKdQy6DQAAAGaJEEiDwAJmiQhIg8ACSI2MJPgGAABIO8FyzkiDZCQ4AEiNTCRQSINkJDAATI1EJFBIK8HHRCQoVQ0AAEiNjCQABwAASNH4SIlMJCBEi8i56f0AADPS6CLJ//+L6IXAdEkz9oXAdDNIg2QkIABIjZQkAAcAAIvOTI1MJEBEi8VIA9FJi8xEK8b/Fd9nAACFwHQYA3QkQDv1cs2Lx0Erx4lDBEk7/uk0/////xWFZgAAiQNIi8NIi4wkYBQAAEgzzOj4Hv//TI2cJHAUAABJi1swSYtrQEmL40FfQV5BXF9ew0iJXCQQSIl0JBiJTCQIV0FUQVVBVkFXSIPsIEWL8EyL+khj2YP7/nUY6I6a//+DIADoppr//8cACQAAAOmPAAAAhcl4czsdETgBAHNrSIvDSIvzSMH+BkyNLf4zAQCD4D9MjSTASYtE9QBC9kTgOAF0RovL6Lfk//+Dz/9Ji0T1AEL2ROA4AXUV6E6a///HAAkAAADoI5r//4MgAOsPRYvGSYvXi8voQQAAAIv4i8vopOT//4vH6xvo/5n//4MgAOgXmv//xwAJAAAA6OyY//+DyP9Ii1wkWEiLdCRgSIPEIEFfQV5BXUFcX8PMSIlcJCBVVldBVEFVQVZBV0iL7EiD7GAz20WL8Exj4UiL+kWFwA+EngIAAEiF0nUf6JuZ//+JGOi0mf//xwAWAAAA6ImY//+DyP/pfAIAAEmLxEiNDRczAQCD4D9Ni+xJwf0GTI08wEqLDOlCD750+TmNRv88AXcJQYvG99CoAXSvQvZE+TggdA4z0kGLzESNQgLokTQAAEGLzEiJXeDoJSEAAIXAD4QLAQAASI0FvjIBAEqLBOhCOFz4OA+N9QAAAOj2rf//SIuIkAAAAEg5mTgBAAB1FkiNBZMyAQBKiwToQjhc+DkPhMoAAABIjQV9MgEASosM6EiNVfBKi0z5KP8VYmYAAIXAD4SoAAAAQIT2D4SBAAAAQP7OQID+AQ+HLgEAAE6NJDdIiV3QTIv3STv8D4MQAQAAi3XUQQ+3Bg+3yGaJRfDo5TMAAA+3TfBmO8F1NoPGAol11GaD+Qp1G7kNAAAA6MYzAAC5DQAAAGY7wXUW/8aJddT/w0mDxgJNO/QPg8AAAADrsf8V2GMAAIlF0OmwAAAARYvOSI1N0EyLx0GL1Oju9P//8g8QAItYCOmXAAAASI0FszEBAEqLDOhCOFz5OH1Ni85AhPZ0MoPpAXQZg/kBdXlFi85IjU3QTIvHQYvU6J36///rvUWLzkiNTdBMi8dBi9Topfv//+upRYvOSI1N0EyLx0GL1Ohx+f//65VKi0z5KEyNTdQzwEWLxkghRCQgSIvXSIlF0IlF2P8VaGQAAIXAdQn/FSZjAACJRdCLXdjyDxBF0PIPEUXgSItF4EjB6CCFwHVki0XghcB0LYP4BXUb6IGX///HAAkAAADoVpf//8cABQAAAOnC/f//i03g6POW///ptf3//0iNBdcwAQBKiwToQvZE+DhAdAWAPxp0H+hBl///xwAcAAAA6BaX//+DIADphf3//4tF5CvD6wIzwEiLnCS4AAAASIPEYEFfQV5BXUFcX15dw8xAU0iD7EBIY9lIjUwkIOjxPf//jUMBPQABAAB3E0iLRCQoSIsID7cEWSUAgAAA6wIzwIB8JDgAdAxIi0wkIIOhqAMAAP1Ig8RAW8PMQFNIg+wwSIvZSI1MJCDoKTIAAEiD+AR3GotUJCC5/f8AAIH6//8AAA9H0UiF23QDZokTSIPEMFvDzMzMSIlcJBBIiWwkGFdBVEFVQVZBV0iD7CBIizpFM+1Ni+FJi+hMi/JMi/lIhckPhO4AAABIi9lNhcAPhKEAAABEOC91CEG4AQAAAOsdRDhvAXUIQbgCAAAA6w+KRwL22E0bwEn32EmDwANNi8xIjUwkUEiL1+iIMQAASIvQSIP4/3R1SIXAdGeLTCRQgfn//wAAdjlIg/0BdkeBwQAA//9BuADYAACLwYlMJFDB6ApI/81mQQvAZokDuP8DAABmI8hIg8MCuADcAABmC8hmiQtIA/pIg8MCSIPtAQ+FX////0kr30mJPkjR+0iLw+sbSYv9ZkSJK+vpSYk+6IaV///HACoAAABIg8j/SItcJFhIi2wkYEiDxCBBX0FeQV1BXF/DSYvdRDgvdQhBuAEAAADrHUQ4bwF1CEG4AgAAAOsPikcC9thNG8BJ99hJg8ADTYvMSIvXM8nopjAAAEiD+P90mUiFwHSDSIP4BHUDSP/DSAP4SP/D663MzEiD7ChIhcl1DkmDIAC4AQAAAOmXAAAAhdJ1BIgR6+r3woD///91BIgR6+L3wgD4//91C0G5AQAAAEGywOs598IAAP//dRiNggAo//89/wcAAHZIQbkCAAAAQbLg6xn3wgAA4P91NYH6//8QAHctQbkDAAAAQbLwTYvZisLB6gYkPwyAQYgEC0mD6wF17UEK0kmNQQGIEU0hGOsTSYMgAOholP//xwAqAAAASIPI/0iDxCjDzEiJXCQISIlsJBBIiXQkGFdBVkFXSIPsIE2L8UyL+UiFyXUY6DCU//+7FgAAAIkY6AST//+Lw+kHAQAASIXSdOMzwMYBAEWFwEEPT8D/wEiYSDvQdwzo/pP//7siAAAA68xNhfZ0vUmLeQhIjVkBxgEw6xWKB4TAdAVI/8frArAwiANI/8NB/8hFhcB/5sYDAA+IgAAAAIN8JGgAQYsxdQiAPzUPncDrWOizFwAAhcB1KYA/NX9TfF6DfCRgAEiNRwF0RusDSP/AigiA+TB09oTJdTaKR/8kAesmPQACAAB1CoA/MHQwg/4t6xc9AAEAAHUMgD8wdB+D/i11GusLMsCEwHQS6wPGAzBI/8uKAzw5dPT+wIgDQYA/MXUGQf9GBOseSYPI/0n/wEOAfDgBAHX1Sf/ASY1XAUmLz+ioVAAAM8BIi1wkQEiLbCRISIt0JFBIg8QgQV9BXl/DzMzMzMzMzMzMzMzMzEiJVCQQU1VWV0FUQVZBV0iB7CACAABEixFMi/JIi/FFhdIPhO0DAACLOoX/D4TjAwAAQf/KjUf/hcAPheIAAABEi2IEM+1Bg/wBdSaLWQRMjUQkREiDwQSJLkUzyYlsJEC6zAEAAOgFFgAAi8PppQMAAEWF0nU2i1kETI1EJESJKUUzyUiDwQSJbCRAuswBAADo2hUAADPSi8NB9/SF0olWBEAPlcWJLulqAwAAQb//////SIv9TIv1RTvXdChJi8xCi0SWBDPSScHmIEUD10kLxkjB5yBI9/GLwEyL8kgD+EU713XbRTPJiWwkQEyNRCREiS66zAEAAEiNTgTobhUAAEmLzkSJdgRIwekgSIvHhcmJTghAD5XF/8WJLun1AgAAQTvCD4fqAgAARYvCSWPSRCvARYvKSWPYSDvTfElIg8EESI0EnQAAAABNi95MK9hMK95IjQyRiwFBOQQLdRFB/8lI/8pIg+kESDvTfenrF0GLwUErwEhj0EljwYtMhgRBOUyWBHMDQf/ARYXAD4SBAgAAjUf/uyAAAABFi0yGBI1H/kGLbIYEQQ+9wYmsJGACAAB0C0G7HwAAAEQr2OsDRIvbQSvbRImcJHACAACJXCQgRYXbdDdBi8GL1YvL0+pBi8vT4ESLytPlRAvIiawkYAIAAIP/AnYVjUf9i8tBi0SGBNPoC+iJrCRgAgAAM+1FjXD/RIvlRYX2D4i/AQAAi8NBv/////9Bi9lMiawkGAIAAEWNLD5IiVwkOEiJRCQwRTvqdwdCi1SuBOsCi9VBjUX/iZQkeAIAAItMhgRBjUX+RItchgRIiUwkKIlUJCyLlCRwAgAAhdJ0NEiLTCQwRYvDSItEJChJ0+iLykjT4EwLwEHT40GD/QNyGItMJCBBjUX9i0SGBNPoRAvY6wVMi0QkKDPSSYvASPfzRIvCTIvISTvHdhdIuAEAAAD/////SQPBTYvPSA+vw0wDwE07x3cqi5QkYAIAAIvCSQ+vwUmLyEjB4SBJC8tIO8F2Dkn/yUgrwkwDw007x3bjTYXJD4SqAAAATIvVRIvdhf90TkiLnCRoAgAASIPDBA8fAIsDSI1bBEkPr8FMA9BDjQQzRYvCi8hJweogi0SGBEmL0kn/wkE7wEwPQ9JBK8BB/8OJRI4ERDvfcsZIi1wkOIuEJHgCAABJO8JzQkSL1YX/dDhMi5wkaAIAAEyLxUmDwwRDjQQyQf/Ci0yGBEiNFIZBiwNNjVsETAPATAPBRIlCBEnB6CBEO9dy10n/yUWNVf9JweQgQf/NQYvBTAPgQYPuAQ+Jav7//0yLrCQYAgAAQY1SAYvKOxZzEmYPH0QAAIvB/8GJbIYEOw5y9IkWhdJ0Dv/KOWyWBHUGiRaF0nXySYvE6wIzwEiBxCACAABBX0FeQVxfXl1bw8zMzEBVU1ZXQVRBVkFXSI2sJBD5//9IgezwBwAASIsFwxIBAEgzxEiJheAGAABIiUwkOE2L8UiNTCRoTIlNgE2L4EyJRZCL8ugyLAAAi0QkaEG/AQAAAIPgHzwfdQfGRCRwAOsPSI1MJGjofCwAAESIfCRwSItcJDi/IAAAAIvHTYl0JAhIhduNTw0PSMFFM8Az0kGJBCRIjUwkeOh6KwAASIvDQbr/BwAASMHoNEm5////////DwBJI8J1OEmF2XQK90QkeAAAAAF0KUGDZCQEAEyNBarFAABIi5VQBwAASYvO6AN///+FwA+FQREAAOkHEQAASTvCdAQzwOs8SIvDSSPBdQVBi8frKkiF23kWSLkAAAAAAAAIAEg7wXUHuAQAAADrD0iLw0jB6DP30EEjx4PIAkWJfCQEQSvHD4ScEAAAQSvHD4SHEAAAQSvHD4RyEAAAQTvHD4RdEAAASLj/////////f0SIfCQwSCPY/8ZIiVwkOPIPEEQkOPIPEUQkWEiLVCRYTIvCiXQkYEnB6DS+AgAAAEmLyEkjykiLwUj32Ei4AAAAAAAAEABIG9tJI9FII9hIA9pI99kbwEUjwkSNJAZFA+DoOSwAAOhoKwAA8g8syIldpI2BAQAAgIPg/vfYG8BIwesgI8GJXaiJRCRAi8P32BvS99pBA9eJVaBBgfw0BAAAD4IaAgAAM8DHhUgDAAAAABAAiYVEAwAAibVAAwAAhdsPhAwBAABFM8BCi0SFpEI5hIVEAwAAD4X2AAAARQPHRDvGdeWDZCQ4AEWNnCTO+///RYvDjUL/QYPjH0HB6AWL90mL30Er84vOSNPjQSvfD71EhaREi+NB99R0BP/A6wIzwCv4Qo0EAoP4cw+HgQAAAEUz9kQ730EPl8ZEA/JFA/BBg/5zd2tBjXj/RY1W/0Q713RIQYvCQSvAjUj/O8JzB0SLTIWk6wNFM8k7ynMGi1SNpOsCM9JBI9SLztPqRCPLQYvLQdPhQQvRQolUlaRB/8pEO9d0BYtVoOu4M8lFhcB0EoNkjaQAQQPPQTvIdfPrA0Uz9kSJdaBFi+dEib1wAQAAx4V0AQAABAAAAOkZAwAAg2QkOABFjZwkzfv//0WLw41C/0GD4x9BwegFi/dJi99BK/OLzkjT40Er3w+9RIWkRIvjQffUdAT/wOsCM8Ar+EKNBAKD+HMPh4EAAABFM/ZEO99BD5fGRAPyRQPwQYP+c3drQY14/0WNVv9EO9d0SEGLwkErwI1I/zvCcwdEi0yFpOsDRTPJO8pzBotUjaTrAjPSQSPUi87T6kQjy0GLy0HT4UEL0UKJVJWkQf/KRDvXdAWLVaDruDPJRYXAdBKDZI2kAEEDz0E7yHXz6wNFM/ZEiXWgRYvnRIm9cAEAAMeFdAEAAAIAAADpKwIAAEGD/DYPhEABAAAzwMeFSAMAAAAAEACJhUQDAACJtUADAACF2w+EIAEAAEUzwEKLRIWkQjmEhUQDAAAPhQoBAABFA8dEO8Z15YNkJDgAD73DdAT/wOsCM8BFM/Yr+Dv+QQ+SxkGDy/9EA/JBg/5zD4aFAAAARTP2vjYEAABEiXWgQSv0SI2NRAMAAIv+M9LB7wWL30jB4wJMi8Poz0cAAIPmH0GLx0CKztPgiYQdRAMAAESNZwFFi8RJweACRImlQAMAAESJpXABAABNhcAPhFgBAAC7zAEAAEiNjXQBAABMO8MPhyIBAABIjZVEAwAA6DpLAADpKwEAAEGNRv9BO8MPhHH///9Ei9BEjUD/O8JzB0aLTJWk6wNFM8lEO8JzB0KLTIWk6wIzycHpHkGLwcHgAgvIQYvAQolMlaRFO8MPhDL///+LVaDrvPfbSBvAg2QkOACD4AQPvUQFpHQE/8DrAjPARTP2K/hBO/9BD5LGQYPL/0QD8kGD/nN2QkUz9r41BAAARIl1oEEr9EiNjUQDAACL/jPSwe8Fi99IweMCTIvD6MZGAACD5h9Bi8dAis7T4ImEHUQDAADp8v7//0GNRv9BO8N0uESL0ESNQP87wnMHRotMlaTrA0UzyUQ7wnMHQotMhaTrAjPJwekfQ40ECQvIQYvAQolMlaRFO8MPhHv///+LVaDrvkyLwzPS6FpGAADohYj//8cAIgAAAOhah///RIulcAEAAItMJEC4zczMzIXJD4jZBAAA9+GLwkiNFbfz/v/B6AOJRCRQi8iJRCRIhcAPhMgDAABBuCYAAABBO8iLwUEPR8CJRCRM/8iL+A+2jIKiywEAD7a0gqPLAQCL2UjB4wIz0kyLw40EDkiNjUQDAACJhUADAADoy0UAAEiNDVTz/v9IweYCD7eEuaDLAQBIjZGQwgEASI2NRAMAAEyLxkgDy0iNFILoW0kAAESLlUADAABFO9cPh5oAAACLhUQDAACFwHUPRTPkRImlcAEAAOn6AgAAQTvHD4TxAgAARYXkD4ToAgAARTPATIvQRTPJQouMjXQBAABBi8BJD6/KSAPITIvBQomMjXQBAABJweggRQPPRTvMdddFhcAPhKYCAACDvXABAABzcxqLhXABAABEiYSFdAEAAESLpXABAABFA+frhEUz5ESJpXABAAAywOl8AgAARTvnD4etAAAAi510AQAATYvCScHgAkWL4kSJlXABAABNhcB0QLjMAQAASI2NdAEAAEw7wHcOSI2VRAMAAOhvSAAA6xpMi8Az0uijRAAA6M6G///HACIAAADoo4X//0SLpXABAACF2w+EA////0E73w+EAwIAAEWF5A+E+gEAAEUzwEyL00UzyUKLjI10AQAAQYvASQ+vykgDyEyLwUKJjI10AQAAScHoIEUDz0U7zHXX6Q3///9FO9RIjZV0AQAAQYvcSI2NRAMAAEgPQ8pMjYVEAwAAQQ9C2kiJTCRYD5LAiVwkREiNlXQBAABJD0PQhMBIiVQkOEUPRdRFM+RFM8lEiaUQBQAAhdsPhBYBAABCizSJhfZ1IUU7zA+F+QAAAEIhtI0UBQAARY1hAUSJpRAFAADp4QAAAEUz20WLwUWF0g+EvgAAAEGL2ffbQYP4c3RdQYv4RTvEdRKDpL0UBQAAAEGNQAGJhRAFAABBjQQYRQPHixSCQYvDSA+v1kgD0IuEvRQFAABIA9BBjQQYTIvaiZS9FAUAAESLpRAFAABJwesgQTvCdAdIi1QkOOudRYXbdE1Bg/hzD4TNAQAAQYvQRTvEdRKDpJUUBQAAAEGNQAGJhRAFAACLhJUUBQAARQPHQYvLSAPIiYyVFAUAAESLpRAFAABIwekgRIvZhcl1s4tcJERBg/hzD4R8AQAASItMJFhIi1QkOEUDz0Q7yw+F6v7//0WLxEnB4AJEiaVwAQAATYXAdEC4zAEAAEiNjXQBAABMO8B3DkiNlRQFAADoW0YAAOsaTIvAM9Loj0IAAOi6hP//xwAiAAAA6I+D//9Ei6VwAQAAQYrHhMAPhAgBAACLTCRISI0V8u/+/ytMJExBuCYAAACJTCRID4VC/P//i0QkUItMJECNBIADwCvIdH2NQf+LhII4zAEAhcAPhMYAAABBO8d0ZkWF5HRhRTPARIvQRTPJQouMjXQBAABBi8BJD6/KSAPITIvBQomMjXQBAABJweggRQPPRTvMdddFhcB0I4O9cAEAAHNzfIuFcAEAAESJhIV0AQAARIulcAEAAEUD5+tlRIulcAEAAEiLdYBIi95FhfYPhMIEAABFM8BFM8lCi0SNpEiNDIBBi8BMjQRIRolEjaRFA89JweggRTvOdd9FhcAPhJIEAACDfaBzD4NlBAAAi0WgRIlEhaREAX2g6XcEAABFM+REiaVwAQAA65n32UyNBeDu/v/34YlMJEyLwsHoA4lEJDiL0IlEJESFwA+EjwMAALkmAAAAO9GLwg9HwTPSiUQkUP/Ii/hBD7aMgKLLAQBBD7a0gKPLAQCL2UjB4wJMi8ONBA5IjY1EAwAAiYVAAwAA6O1AAABIjQ127v7/SMHmAg+3hLmgywEASI2RkMIBAEiNjUQDAABMi8ZIA8tIjRSC6H1EAABEi5VAAwAARTvXD4eCAAAAi4VEAwAAhcB1DEUz9kSJdaDpwgIAAEE7xw+EuQIAAEWF9g+EsAIAAEUzwEyL0EUzyUKLTI2kQYvASQ+vykgDyEyLwUKJTI2kScHoIEUDz0U7znXdRYXAD4R3AgAAg32gc3MRi0WgRIlEhaREi3WgRQP365lFM/ZEiXWgMsDpWQIAAEU79w+HmwAAAItdpE2LwknB4AJFi/JEiVWgTYXAdDq4zAEAAEiNTaRMO8B3DkiNlUQDAADoskMAAOsaTIvAM9Lo5j8AAOgRgv//xwAiAAAA6OaA//9Ei3WghdsPhCf///9BO98PhOwBAABFhfYPhOMBAABFM8BMi9NFM8lCi0yNpEGLwEkPr8pIA8hMi8FCiUyNpEnB6CBFA89FO8513eku////RTvWSI1VpEGL3kiNjUQDAABID0PKTI2FRAMAAEEPQtpIiU2ID5LAiVwkSEiNVaRJD0PQhMBIiVQkWEUPRdZFM/ZFM8lEibUQBQAAhdsPhBUBAABCizSJhfZ1IUU7zg+F+AAAAEIhtI0UBQAARY1xAUSJtRAFAADp4AAAAEUz20WLwUWF0g+EvgAAAEGL2ffbQYP4c3RdQYv4RTvGdRKDpL0UBQAAAEGNQAGJhRAFAABCjQQDRQPHixSCi4S9FAUAAEgPr9ZIA9BBi8NIA9BCjQQDTIvaiZS9FAUAAESLtRAFAABJwesgQTvCdAdIi1QkWOudRYXbdE1Bg/hzD4RnAQAAQYvQRTvGdRKDpJUUBQAAAEGNQAGJhRAFAACLhJUUBQAARQPHQYvLSAPIiYyVFAUAAESLtRAFAABIwekgRIvZhcl1s4tcJEhBg/hzD4QWAQAASItNiEiLVCRYRQPPRDvLD4Xr/v//RYvGScHgAkSJdaBNhcB0OrjMAQAASI1NpEw7wHcOSI2VFAUAAOi1QQAA6xpMi8Az0ujpPQAA6BSA///HACIAAADo6X7//0SLdaBBiseEwA+ErAAAAItUJERMjQVP6/7/K1QkULkmAAAAiVQkRA+Ffvz//4tMJEyLRCQ4jQSAA8AryA+E1/v//41B/0GLhIA4zAEAhcB0akE7xw+Ev/v//0WF9g+Etvv//0UzwESL0EUzyUKLTI2kQYvASQ+vykgDyEyLwUKJTI2kScHoIEUDz0U7znXdRYXAdB6DfaBzcyGLRaBEiUSFpESLdaBFA/dEiXWg6Wf7//9Ei3Wg6V77//9Ii3WAg2WgAEiL3usjg6VAAwAAAEyNhUQDAACDZaAASI1NpEUzybrMAQAA6J4CAABIjZVwAQAASI1NoOge7P//i3wkQIP4Cg+FkAAAAEED/8YGMUiNXgFFheQPhI4AAABFM8BFM8lCi4SNdAEAAEiNDIBBi8BMjQRIRomEjXQBAABFA89JweggRTvMddlFhcB0XIO9cAEAAHNzF4uFcAEAAESJhIV0AQAARAG9cAEAAOs8g6VAAwAAAEyNhUQDAACDpXABAAAASI2NdAEAAEUzybrMAQAA6PMBAADrEYXAdQVBK//rCAQwSI1eAYgGSItFkItMJGCJeASF/3gKgfn///9/dwIDz0iLhVAHAABI/8iL+Ug7x0gPQvhIA/5IO98PhAsBAABEi1WgQbwJAAAARYXSD4T4AAAARTPARTPJQotEjaRIacgAypo7QYvASAPITIvBQolMjaRJweggRQPPRTvKddpFhcB0N4N9oHNzDotFoESJRIWkRAF9oOsjg6VAAwAAAEyNhUQDAACDZaAASI1NpEUzybrMAQAA6C0BAABIjZVwAQAASI1NoOit6v//RItVoESL30WF0kyLwEG5CAAAAEEPlMZEK9u4zczMzEH34MHqA4rCwOACjQwQAslEKsFBjXAwRIvCRTvZcxIzyUEPtsZAgP4wD0TIRIrx6wdBi8FAiDQYg8j/RAPIRDvIdbhIi8dEiHQkMEgrw0k7xEkPT8RIA9hIO98Phf/+//9FM//GAwBEOHwkMEEPlcfrQUyNBd20AADpEu///0yNBcm0AADpBu///0yNBbW0AADp+u7//0iLlVAHAABMjQWatAAASYvO6PZt//+FwHU4RTP/gHwkcAB0CkiNTCRo6JIaAABBi8dIi43gBgAASDPM6KgA//9IgcTwBwAAQV9BXkFcX15bXcNIg2QkIABFM8lFM8Az0jPJ6IF7///MSIlcJAhIiXQkEFdIg+wgSYvZSYvwSIv6TYXJdQQzwOtWSIXJdRXoVXz//7sWAAAAiRjoKXv//4vD6zxIhfZ0Ekg7+3INTIvDSIvW6MA9AADry0yLxzPS6PQ5AABIhfZ0xUg7+3MM6BV8//+7IgAAAOu+uBYAAABIi1wkMEiLdCQ4SIPEIF/DzEiD7Cjo5yAAAIvISIPEKOnQIAAASIlcJBBIiXQkGIhMJAhXSIPsIEiLykiL2uhiov//i0sUTGPI9sHAD4SOAAAAizsz9kiLUwgrewhIjUIBSIkDi0Mg/8iJQxCF/34bRIvHQYvJ6LLg//+L8EiLSwg794pEJDCIAetrQY1BAoP4AXYiSYvJSI0V6xQBAEmLwUjB+AaD4T9IiwTCSI0MyUiNFMjrB0iNFQwBAQD2QjggdLoz0kGLyUSNQgLoaBYAAEiD+P91pvCDSxQQsAHrGUG4AQAAAEiNVCQwQYvJ6Drg//+D+AEPlMBIi1wkOEiLdCRASIPEIF/DSIlcJBBIiXQkGGaJTCQIV0iD7CBIi8pIi9rofaH//4tLFExjyPbBwA+EkQAAAIs7M/ZIi1MIK3sISI1CAkiJA4tDIIPoAolDEIX/fh1Ei8dBi8nozN///4vwSItLCDv3D7dEJDBmiQHra0GNQQKD+AF2IkmLyUiNFQMUAQBJi8FIwfgGg+E/SIsEwkiNDMlIjRTI6wdIjRUkAAEA9kI4IHS4M9JBi8lEjUIC6IAVAABIg/j/daTwg0sUELAB6xlBuAIAAABIjVQkMEGLyehS3///g/gCD5TASItcJDhIi3QkQEiDxCBfw0BTSIPsIItRFMHqA/bCAXQEsAHrXotBFKjAdAlIi0EISDkBdEyLSRjoS8X//0iL2EiD+P90O0G5AQAAAEyNRCQ4M9JIi8j/FVRHAACFwHQhSI1UJDBIi8v/FTpHAACFwHQPSItEJDBIOUQkOA+UwOsCMsBIg8QgW8PMzMxIiVwkCFdIg+wgi/lIi9pIi8roIaD//4tDFKgGdRXoeXn//8cACQAAAPCDSxQQg8j/63mLQxTB6AyoAXQN6Fp5///HACIAAADr34tDFKgBdBxIi8voK////4NjEACEwHTISItDCEiJA/CDYxT+8INLFALwg2MU94NjEACLQxSpwAQAAHUUSIvL6AOg//+EwHUISIvL6A8hAABIi9NAis/oFP3//4TAdIFAD7bHSItcJDBIg8QgX8PMSIlcJAhXSIPsIIv5SIvaSIvK6Gmf//+LQxSoBnUX6MF4///HAAkAAADwg0sUELj//wAA63yLQxTB6AyoAXQN6KB4///HACIAAADr3YtDFKgBdBxIi8vocf7//4NjEACEwHTGSItDCEiJA/CDYxT+8INLFALwg2MU94NjEACLQxSpwAQAAHUUSIvL6Emf//+EwHUISIvL6FUgAABIi9MPt8/oPv3//4TAD4R7////D7fHSItcJDBIg8QgX8NIg+wog/n+dQ3oGnj//8cACQAAAOtChcl4LjsNiBUBAHMmSGPJSI0VfBEBAEiLwYPhP0jB+AZIjQzJSIsEwg+2RMg4g+BA6xLo23f//8cACQAAAOiwdv//M8BIg8Qow8xAVUFUQVVBVkFXSIPsYEiNbCRQSIldQEiJdUhIiX1QSIsFwvsAAEgzxUiJRQhIY11gTYv5SIlVAEWL6EiL+YXbfhRIi9NJi8no8x8AADvDjVgBfAKL2ESLdXhFhfZ1B0iLB0SLcAz3nYAAAABEi8tNi8dBi84b0oNkJCgASINkJCAAg+II/8LojLn//0xj4IXAD4Q2AgAASYvESbjw////////D0gDwEiNSBBIO8FIG9JII9F0U0iB+gAEAAB3LkiNQg9IO8J3A0mLwEiD4PDoRDIAAEgr4EiNdCRQSIX2D4TOAQAAxwbMzAAA6xZIi8roN4T//0iL8EiFwHQOxwDd3QAASIPGEOsCM/ZIhfYPhJ8BAABEiWQkKESLy02Lx0iJdCQgugEAAABBi87o57j//4XAD4R6AQAASINkJEAARYvMSINkJDgATIvGSINkJDAAQYvVTIt9AINkJCgASYvPSINkJCAA6AV8//9IY/iFwA+EPQEAALoABAAARIXqdFKLRXCFwA+EKgEAADv4D48gAQAASINkJEAARYvMSINkJDgATIvGSINkJDAAQYvViUQkKEmLz0iLRWhIiUQkIOite///i/iFwA+F6AAAAOnhAAAASIvPSAPJSI1BEEg7yEgbyUgjyHRTSDvKdzVIjUEPSDvBdwpIuPD///////8PSIPg8OgQMQAASCvgSI1cJFBIhdsPhJoAAADHA8zMAADrE+gGg///SIvYSIXAdA7HAN3dAABIg8MQ6wIz20iF23RySINkJEAARYvMSINkJDgATIvGSINkJDAAQYvViXwkKEmLz0iJXCQg6AN7//+FwHQxSINkJDgAM9JIIVQkMESLz4tFcEyLw0GLzoXAdWUhVCQoSCFUJCDo7KL//4v4hcB1YEiNS/CBOd3dAAB1Beitdf//M/9IhfZ0EUiNTvCBOd3dAAB1BeiVdf//i8dIi00ISDPN6O/4/v9Ii11ASIt1SEiLfVBIjWUQQV9BXkFdQVxdw4lEJChIi0VoSIlEJCDrlUiNS/CBOd3dAAB1p+hNdf//66DMzMxIiVwkCEiJdCQQV0iD7HBIi/JJi9lIi9FBi/hIjUwkUOiDG///i4QkwAAAAEiNTCRYiUQkQEyLy4uEJLgAAABEi8eJRCQ4SIvWi4QksAAAAIlEJDBIi4QkqAAAAEiJRCQoi4QkoAAAAIlEJCDod/z//4B8JGgAdAxIi0wkUIOhqAMAAP1MjVwkcEmLWxBJi3MYSYvjX8PMzMzMzMzMzMzMQVRBVUFWSIHsUAQAAEiLBRz4AABIM8RIiYQkEAQAAE2L4U2L8EyL6UiFyXUaSIXSdBXo2XP//8cAFgAAAOiucv//6TgDAABNhfZ05k2F5HThSIP6Ag+CJAMAAEiJnCRIBAAASImsJEAEAABIibQkOAQAAEiJvCQwBAAATIm8JCgEAABMjXr/TQ+v/kwD+TPJSIlMJCBmZmYPH4QAAAAAADPSSYvHSSvFSff2SI1YAUiD+wgPh4sAAABNO/12ZUuNNC5Ji91Ii/5JO/d3IA8fAEiL00iLz0mLxP8V8UAAAIXASA9P30kD/kk7/3bjTYvGSYvXSTvfdB5JK98PH0QAAA+2Ag+2DBOIBBOICkiNUgFJg+gBdepNK/5NO/13pEiLTCQgSIPpAUiJTCQgD4glAgAATItszDBMi7zMIAIAAOlc////SNHrSYvNSQ+v3kmLxEqNNCtIi9b/FXJAAACFwH4pTYvOTIvGTDvudB4PHwBBD7YASYvQSCvTD7YKiAJBiAhJ/8BJg+kBdeVJi9dJi81Ji8T/FTZAAACFwH4qTYvGSYvXTTvvdB9Ni81NK8+QD7YCQQ+2DBFBiAQRiApIjVIBSYPoAXXoSYvXSIvOSYvE/xX5PwAAhcB+LU2LxkmL10k793QiTIvOTSvPDx9AAA+2AkEPtgwRQYgEEYgKSI1SAUmD6AF16EmL3UmL/2aQSDvzdh1JA95IO95zFUiL1kiLy0mLxP8VpD8AAIXAfuXrHkkD3kk733cWSIvWSIvLSYvE/xWHPwAAhcB+5Q8fAEiL70kr/kg7/nYTSIvWSIvPSYvE/xVmPwAAhcB/4kg7+3I4TYvGSIvXdB5Mi8tMK88PtgJBD7YMEUGIBBGICkiNUgFJg+gBdehIO/dIi8NID0XGSIvw6WX///9IO/VzIEkr7kg77nYYSIvWSIvNSYvE/xUJPwAAhcB05eseDx8ASSvuSTvtdhNIi9ZIi81Ji8T/Fek+AACFwHTlSYvPSIvFSCvLSSvFSDvBSItMJCB8K0w77XMVTIlszDBIiazMIAIAAEj/wUiJTCQgSTvfD4P//f//TIvr6XT9//9JO99zFUiJXMwwTIm8zCACAABI/8FIiUwkIEw77Q+D1P3//0yL/elJ/f//SIu8JDAEAABIi7QkOAQAAEiLrCRABAAASIucJEgEAABMi7wkKAQAAEiLjCQQBAAASDPM6IH0/v9IgcRQBAAAQV5BXUFcw8zMzEiJXCQIV0iD7CBFM9JJi9hMi9pNhcl1LEiFyXUsSIXSdBToSXD//7sWAAAAiRjoHW///0SL00iLXCQwQYvCSIPEIF/DSIXJdNlNhdt01E2FyXUFRIgR695Ihdt1BUSIEevASCvZSIvRTYvDSYv5SYP5/3UUigQTiAJI/8KEwHQoSYPoAXXu6yCKBBOIAkj/woTAdAxJg+gBdAZIg+8BdehIhf91A0SIEk2FwHWJSYP5/3UORohUGf9FjVBQ6XX///9EiBHop2///7siAAAA6Vn////MSIPsWEiLBbHzAABIM8RIiUQkQDPATIvKSIP4IEyLwXN3xkQEIABI/8BIg/ggfPCKAusfD7bQSMHqAw+2wIPgBw+2TBQgD6vBSf/BiEwUIEGKAYTAdd3rH0EPtsG6AQAAAEEPtsmD4QdIwegD0+KEVAQgdR9J/8BFighFhMl12TPASItMJEBIM8zoDvP+/0iDxFjDSYvA6+nom/b+/8zMzMzMzMzMzMzMzMzMzEiJXCQISIl0JBBXTIvSSI01O9r+/0GD4g9Ii/pJK/pIi9pMi8EPV9tJjUL/8w9vD0iD+A53c4uEhrwoAQBIA8b/4GYPc9kB62BmD3PZAutZZg9z2QPrUmYPc9kE60tmD3PZBetEZg9z2QbrPWYPc9kH6zZmD3PZCOsvZg9z2QnrKGYPc9kK6yFmD3PZC+saZg9z2QzrE2YPc9kN6wxmD3PZDusFZg9z2Q8PV8BBuQ8AAABmD3TBZg/XwIXAD4QzAQAAD7zQTYXSdQZFjVny6xRFM9uLwrkQAAAASSvKSDvBQQ+Sw0GLwSvCQTvBD4fPAAAAi4yG+CgBAEgDzv/hZg9z+QFmD3PZAem0AAAAZg9z+QJmD3PZAumlAAAAZg9z+QNmD3PZA+mWAAAAZg9z+QRmD3PZBOmHAAAAZg9z+QVmD3PZBet7Zg9z+QZmD3PZButvZg9z+QdmD3PZB+tjZg9z+QhmD3PZCOtXZg9z+QlmD3PZCetLZg9z+QpmD3PZCus/Zg9z+QtmD3PZC+szZg9z+QxmD3PZDOsnZg9z+Q1mD3PZDesbZg9z+Q5mD3PZDusPZg9z+Q9mD3PZD+sDD1fJRYXbD4XmAAAA8w9vVxBmD2/CZg90w2YP18CFwHU1SIvTSYvISItcJBBIi3QkGF/pX/3//02F0nXQRDhXAQ+ErAAAAEiLXCQQSIt0JBhf6UD9//8PvMiLwUkrwkiDwBBIg/gQd7lEK8lBg/kPd3lCi4yOOCkBAEgDzv/hZg9z+gHrZWYPc/oC615mD3P6A+tXZg9z+gTrUGYPc/oF60lmD3P6ButCZg9z+gfrO2YPc/oI6zRmD3P6CestZg9z+grrJmYPc/oL6x9mD3P6DOsYZg9z+g3rEWYPc/oO6wpmD3P6D+sDD1fSZg/r0WYPb8pBD7YAhMB0NA8fhAAAAAAAD77AZg9uwGYPYMBmD2DAZg9wwABmD3TBZg/XwIXAdRpBD7ZAAUn/wITAddQzwEiLXCQQSIt0JBhfw0iLXCQQSYvASIt0JBhfww8fAPIlAQD5JQEAACYBAAcmAQAOJgEAFSYBABwmAQAjJgEAKiYBADEmAQA4JgEAPyYBAEYmAQBNJgEAVCYBAK4mAQC9JgEAzCYBANsmAQDqJgEA9iYBAAInAQAOJwEAGicBACYnAQAyJwEAPicBAEonAQBWJwEAYicBAG4nAQDsJwEA8ycBAPonAQABKAEACCgBAA8oAQAWKAEAHSgBACQoAQArKAEAMigBADkoAQBAKAEARygBAE4oAQBVKAEARTPA6QAAAABIiVwkCFdIg+xASIvaSIv5SIXJdRToBmv//8cAFgAAAOjbaf//M8DrYEiF23TnSDv7c/JJi9BIjUwkIOjYEf//SItMJDBIjVP/g3kIAHQkSP/KSDv6dwoPtgL2RAgZBHXuSIvLSCvKSIvTg+EBSCvRSP/KgHwkOAB0DEiLTCQgg6GoAwAA/UiLwkiLXCRQSIPEQF/DSIPsKOgPqf//M8mEwA+UwYvBSIPEKMPMgz3tAQEAAA+EQxMAAEUzyekDAAAAzMzMSIvESIlYCEiJaBBIiXAYV0iD7GBIi/JIi+lJi9FIjUjYSYv46CsR//9Ihf91BzPb6aAAAABIhe10BUiF9nUX6Bhq///HABYAAADo7Wj//7v///9/63+7////f0g7+3YS6Pdp///HABYAAADozGj//+tjSItEJEhIi5AwAQAASIXSdRdMjUwkSEyLx0iL1kiLzejyEgAAi9jrO4tAFEiNTCRIiUQkOEyLzYl8JDBBuAEQAABIiXQkKIl8JCDo1xYAAIXAdQ3okmn//8cAFgAAAOsDjVj+gHwkWAB0DEiLRCRAg6CoAwAA/UyNXCRgi8NJi1sQSYtrGEmLcyBJi+Nfw0yL2kyL0U2FwHUDM8DDQQ+3Ck2NUgJBD7cTTY1bAo1Bv4P4GUSNSSCNQr9ED0fJg/gZjUogQYvBD0fKK8F1C0WFyXQGSYPoAXXEw8xIg+woSIXJdRnoAmn//8cAFgAAAOjXZ///SIPI/0iDxCjDTIvBM9JIiw3yCAEASIPEKEj/JWc2AADMzMxIiVwkCFdIg+wgSIvaSIv5SIXJdQpIi8roG3b//+sfSIXbdQfoQ2n//+sRSIP74HYt6J5o///HAAwAAAAzwEiLXCQwSIPEIF/D6NpT//+FwHTfSIvL6Ja+//+FwHTTSIsNfwgBAEyLy0yLxzPS/xX5NQAASIXAdNHrxMzMSP8lqTUAAMxIiVwkCEyJTCQgV0iD7CBJi/lJi9iLCuiIsv//kEiLA0hjCEiL0UiLwUjB+AZMjQWcAQEAg+I/SI0U0kmLBMD2RNA4AXQJ6M0AAACL2OsO6Pxn///HAAkAAACDy/+LD+hosv//i8NIi1wkMEiDxCBfw8zMzIlMJAhIg+w4SGPRg/r+dRXop2f//4MgAOi/Z///xwAJAAAA63SFyXhYOxUtBQEAc1BIi8pMjQUhAQEAg+E/SIvCSMH4BkiNDMlJiwTA9kTIOAF0LUiNRCRAiVQkUIlUJFhMjUwkUEiNVCRYSIlEJCBMjUQkIEiNTCRI6A3////rG+g2Z///gyAA6E5n///HAAkAAADoI2b//4PI/0iDxDjDzMzMSIlcJAhXSIPsIEhj+YvP6ISy//9Ig/j/dQQz2+taSIsFkwABALkCAAAAg/8BdQlAhLjIAAAAdQ07+XUg9oCAAAAAAXQX6E6y//+5AQAAAEiL2OhBsv//SDvDdL6Lz+g1sv//SIvI/xU8MgAAhcB1qv8VOjIAAIvYi8/oXbH//0iL10yNBS8AAQCD4j9Ii89IwfkGSI0U0kmLDMjGRNE4AIXbdAyLy+gdZv//g8j/6wIzwEiLXCQwSIPEIF/DzMzMg0kY/zPASIkBSIlBCIlBEEiJQRxIiUEoh0EUw0iJXCQQSIl0JBiJTCQIV0FUQVVBVkFXSIPsIEWL8EyL+khj2YP7/nUY6A5m//+DIADoJmb//8cACQAAAOmSAAAAhcl4djsdkQMBAHNuSIvDSIvzSMH+BkyNLX7/AACD4D9MjSTASYtE9QBC9kTgOAF0SYvL6Dew//9Ig8//SYtE9QBC9kTgOAF1FejNZf//xwAJAAAA6KJl//+DIADrEEWLxkmL14vL6EQAAABIi/iLy+gisP//SIvH6xzofGX//4MgAOiUZf//xwAJAAAA6Glk//9Ig8j/SItcJFhIi3QkYEiDxCBBX0FeQV1BXF/DzEiJXCQISIl0JBBXSIPsIEhj2UGL+IvLSIvy6K2w//9Ig/j/dRHoQmX//8cACQAAAEiDyP/rU0SLz0yNRCRISIvWSIvI/xWqMgAAhcB1D/8VkDAAAIvI6KFk///r00iLRCRISIP4/3TISIvTTI0Fev4AAIPiP0iLy0jB+QZIjRTSSYsMyIBk0Tj9SItcJDBIi3QkOEiDxCBfw8zMzOlv/v//zMzM6Vf////MzMxmiUwkCEiD7CjoehIAAIXAdB9MjUQkOLoBAAAASI1MJDDo0hIAAIXAdAcPt0QkMOsFuP//AABIg8Qow8xIiVwkEFVWV0FWQVdIg+xASIsFjegAAEgzxEiJRCQwRTPSTI0dmwQBAE2FyUiNPfM6AABIi8JMi/pND0XZSIXSQY1qAUgPRfpEi/VND0XwSPfYSBv2SCPxTYX2dQxIx8D+////6U4BAABmRTlTBnVoRA+2D0j/x0WEyXgXSIX2dANEiQ5FhMlBD5XCSYvC6SQBAABBisEk4DzAdQVBsALrHkGKwSTwPOB1BUGwA+sQQYrBJPg88A+F6QAAAEGwBEEPtsC5BwAAACvIi9XT4kGK2CvVQSPR6ylFikMEQYsTQYpbBkGNQP48Ag+HtgAAAEA63Q+CrQAAAEE62A+DpAAAAA+260k77kSLzU0PQ87rHg+2D0j/x4rBJMA8gA+FgwAAAIvCg+E/weAGi9EL0EiLx0krx0k7wXLXTDvNcxxBD7bAQSrZZkGJQwQPtsNmQYlDBkGJE+kD////jYIAKP//Pf8HAAB2PoH6AAARAHM2QQ+2wMdEJCCAAAAAx0QkJAAIAADHRCQoAAABADtUhBhyFEiF9nQCiRb32k2JE0gbwEgjxesSTYkT6Ndi///HACoAAABIg8j/SItMJDBIM8zowOb+/0iLXCR4SIPEQEFfQV5fXl3DzMzMQFNIg+wgQQ+68BOLwkEjwESLykiL2ang/PD8dCVIhcl0CzPSM8no6REAAIkD6Hpi//+7FgAAAIkY6E5h//+Lw+sbQYvQQYvJSIXbdAnowhEAAIkD6wXouREAADPASIPEIFvDzEBTSIPsIEiL2egyBwAAiQPoHwgAAIlDBDPASIPEIFvDQFNIg+wgSIvZiwnoWAgAAItLBOiYCQAASINkJDAASI1MJDDouP///4XAdRWLRCQwOQN1DYtEJDQ5QwR1BDPA6wW4AQAAAEiDxCBbw0BTSIPsIINkJDgASIvZg2QkPABIjUwkOOh3////hcB1JEiLRCQ4SI1MJDiDTCQ4H0iJA+h8////hcB1CeiTEAAAM8DrBbgBAAAASIPEIFvDRTPA8g8RRCQISItUJAhIuf////////9/SIvCSCPBSLkAAAAAAABAQ0g70EEPlcBIO8FyF0i5AAAAAAAA8H9IO8F2fkiLyum9FQAASLkAAAAAAADwP0g7wXMrSIXAdGJNhcB0F0i4AAAAAAAAAIBIiUQkCPIPEEQkCOtG8g8QBemYAADrPEiLwrkzAAAASMHoNCrIuAEAAABI0+BI/8hI99BII8JIiUQkCPIPEEQkCE2FwHUNSDvCdAjyD1gFq5gAAMPMzMzMzMzMzMzMSIPsWGYPf3QkIIM9+wABAAAPhekCAABmDyjYZg8o4GYPc9M0ZkgPfsBmD/sdv5gAAGYPKOhmD1Qtg5gAAGYPLy17mAAAD4SFAgAAZg8o0PMP5vNmD1ftZg8vxQ+GLwIAAGYP2xWnmAAA8g9cJS+ZAABmDy81t5kAAA+E2AEAAGYPVCUJmgAATIvISCMFj5gAAEwjDZiYAABJ0eFJA8FmSA9uyGYPLyWlmQAAD4LfAAAASMHoLGYP6xXzmAAAZg/rDeuYAABMjQ1kqgAA8g9cyvJBD1kMwWYPKNFmDyjBTI0NK5oAAPIPEB0zmQAA8g8QDfuYAADyD1na8g9ZyvIPWcJmDyjg8g9YHQOZAADyD1gNy5gAAPIPWeDyD1na8g9ZyPIPWB3XmAAA8g9YyvIPWdzyD1jL8g8QLUOYAADyD1kN+5cAAPIPWe7yD1zp8kEPEATBSI0VxqEAAPIPEBTC8g8QJQmYAADyD1nm8g9YxPIPWNXyD1jCZg9vdCQgSIPEWMNmZmZmZmYPH4QAAAAAAPIPEBX4lwAA8g9cBQCYAADyD1jQZg8oyPIPXsryDxAl/JgAAPIPEC0UmQAAZg8o8PIPWfHyD1jJZg8o0fIPWdHyD1ni8g9Z6vIPWCXAmAAA8g9YLdiYAADyD1nR8g9Z4vIPWdLyD1nR8g9Z6vIPEBVclwAA8g9Y5fIPXObyDxA1PJcAAGYPKNhmD9sdwJgAAPIPXMPyD1jgZg8ow2YPKMzyD1ni8g9ZwvIPWc7yD1ne8g9YxPIPWMHyD1jDZg9vdCQgSIPEWMNmD+sVQZcAAPIPXBU5lwAA8g8Q6mYP2xWdlgAAZkgPftBmD3PVNGYP+i27lwAA8w/m9enx/f//ZpB1HvIPEA0WlgAARIsFT5gAAOgqEwAA60gPH4QAAAAAAPIPEA0YlgAARIsFNZgAAOgMEwAA6ypmZg8fhAAAAAAASDsF6ZUAAHQXSDsF0JUAAHTOSAsF95UAAGZID27AZpBmD290JCBIg8RYww8fRAAASDPAxeFz0DTE4fl+wMXh+x3blQAAxfrm88X52y2flQAAxfkvLZeVAAAPhEECAADF0e/txfkvxQ+G4wEAAMX52xXLlQAAxftcJVOWAADF+S8125YAAA+EjgEAAMX52w29lQAAxfnbHcWVAADF4XPzAcXh1MnE4fl+yMXZ2yUPlwAAxfkvJceWAAAPgrEAAABIwegsxenrFRWWAADF8esNDZYAAEyNDYanAADF81zKxMFzWQzBTI0NVZcAAMXzWcHF+xAdWZYAAMX7EC0hlgAAxOLxqR04lgAAxOLxqS3PlQAA8g8Q4MTi8akdEpYAAMX7WeDE4tG5yMTi4bnMxfNZDTyVAADF+xAtdJUAAMTiyavp8kEPEATBSI0VAp8AAPIPEBTCxetY1cTiybkFQJUAAMX7WMLF+W90JCBIg8RYw5DF+xAVSJUAAMX7XAVQlQAAxetY0MX7XsrF+xAlUJYAAMX7EC1olgAAxftZ8cXzWMnF81nRxOLpqSUjlgAAxOLpqS06lgAAxetZ0cXbWeLF61nSxetZ0cXTWerF21jlxdtc5sX52x02lgAAxftcw8XbWODF21kNlpQAAMXbWSWelAAAxeNZBZaUAADF41kdfpQAAMX7WMTF+1jBxftYw8X5b3QkIEiDxFjDxenrFa+UAADF61wVp5QAAMXRc9I0xenbFQqUAADF+SjCxdH6LS6VAADF+ub16UD+//8PH0QAAHUuxfsQDYaTAABEiwW/lQAA6JoQAADF+W90JCBIg8RYw2ZmZmZmZmYPH4QAAAAAAMX7EA14kwAARIsFlZUAAOhsEAAAxflvdCQgSIPEWMOQSDsFSZMAAHQnSDsFMJMAAHTOSAsFV5MAAGZID27IRIsFY5UAAOg2EAAA6wQPH0AAxflvdCQgSIPEWMPMgeEAAwAAi8HDzMzMQbpAgAAAM9IPrlwkCESLTCQIQQ+3wWZBI8JBjUrAZjvBdQhBuAAMAADrHmaD+EB1CEG4AAgAAOsQZkE7wkSLwrkABAAARA9EwUGLwUG6AGAAAEEjwnQpPQAgAAB0Gz0AQAAAdA1BO8K5AAMAAA9FyusQuQACAADrCbkAAQAA6wKLykG6AQAAAEGL0cHqCEGLwcHoB0Ej0kEjwsHiBcHgBAvQQYvBwegJQSPCweADC9BBi8HB6ApBI8LB4AIL0EGLwcHoC0EjwkHB6QwDwEUjygvQQQvRC9FBC9CLwovKweAWg+E/JQAAAMDB4RgLwQvCw8zMzA+uXCQIi0wkCIPhP4vRi8HB6AKD4AHR6sHgA4PiAcHiBQvQi8HB6AOD4AHB4AIL0IvBwegEg+ABA8AL0IvBg+ABwekFweAEC9AL0YvCweAYC8LDzEiJXCQQSIl0JBhIiXwkIESLwYvBQcHoAiX//z/AQYHgAADADzP2RAvAvwAEAAC4AAwAAEHB6BYjyEG7AAgAADvPdB9BO8t0EjvIdAZED7fO6xZBuQCAAADrDkG5QAAAAOsGQblAgAAAQYvAuQADAAC7AAEAAEG6AAIAACPBdCI7w3QXQTvCdAs7wXUVuQBgAADrEbkAQAAA6wq5ACAAAOsDD7fOQfbAAXQHugAQAADrAw+31kGLwNHoqAF1BEQPt95Bi8BmQQvTwegCqAF1Aw+3/kGLwGYL18HoA6gBdQRED7fWQYvAZkEL0sHoBKgBdAe4gAAAAOsDD7fGZgvQQcHoBUH2wAF1Aw+33kiLdCQYZgvTSItcJBBmC9FIi3wkIGZBC9EPrlwkCItMJAgPt8KB4T8A//8lwP8AAAvIiUwkCA+uVCQIw8yL0UG5AQAAAMHqGIPiPw+uXCQIi8JEi8LR6EUjwQ+2yIvCwegCQSPJweEEQcHgBUQLwQ+2yEEjyYvCwegDweEDRAvBD7bIQSPJi8LB6ATB4QJEC8HB6gUPtsgPtsJBI8lBI8FEC8EDwEQLwItEJAiD4MBBg+A/QQvAiUQkCA+uVCQIw8xIiVwkCFdIg+wgSIvZugEAAAABFdztAAC/ABAAAIvP6PBX//8zyUiJQwjoXVj//0iDewgAdAfwg0sUQOsV8IFLFAAEAABIjUMcvwIAAABIiUMIiXsgSItDCINjEABIiQNIi1wkMEiDxCBfw8wzwDgBdA5IO8J0CUj/wIA8CAB18sPMzMxMi9pMi9FNhcB1AzPAw0EPtgpBD7YTjUG/g/gZRI1JII1Cv0QPR8lJ/8JJ/8ONSiCD+BlBi8EPR8orwXULRYXJdAZJg+gBdcbDzMzMSIPsKIM9me4AAAB1NkiFyXUa6A1X///HABYAAADo4lX//7j///9/SIPEKMNIhdJ04UmB+P///3932EiDxCjpcf///0UzyUiDxCjpAQAAAMxIiVwkCEiJdCQQV0iD7EBJi9hIi/pIi/FIhcl1F+iyVv//xwAWAAAA6IdV//+4////f+tpSIXSdORIgfv///9/d9tIhdt1BDPA61JJi9FIjUwkIOh0/f7/SItEJChMi4AQAQAAD7YGSP/GQg+2FAAPtgdI/8dCD7YMAIvCK8F1CoXSdAZIg+sBddqAfCQ4AHQMSItMJCCDoagDAAD9SItcJFBIi3QkWEiDxEBfw8zMzEBVU1ZXQVRBVUFWQVdIgeyIAAAASI1sJFBIiwUk2gAASDPFSIlFKEhjnaAAAABFM+RMi62oAAAATYv5RIlFAEiL+UiJVQiF234QSIvTSYvJ6Ef+//9Ii9jrCYP7/w+M2wIAAEhjtbAAAACF9n4QSIvWSYvN6CP+//9Ii/DrCYP+/w+MtwIAAESLtbgAAABFhfZ1B0iLB0SLcAyF23QIhfYPhaYAAAA73g+EiQIAAIP+AQ+PiwAAAIP7AX9ISI1VEEGLzv8ViyIAAIXAD4RtAgAAhdt+OYN9EAJyKUiNRRZEOGUWdB9EOGABdBlBig86CHIJOkgBD4Y8AgAASIPAAkQ4IHXhuAMAAADpMgIAAIX2fjqDfRACcipIjUUWRDhlFnQgRDhgAXQaQYpNADoIcgk6SAEPhv4BAABIg8ACRDggdeC4AQAAAOn0AQAARIlkJChEi8tNi8dMiWQkILoJAAAAQYvO6AuX//9MY+CFwA+EygEAAEmLzEm48P///////w9IA8lIjVEQSDvKSBvJSCPKdFBIgfkABAAAdy5IjUEPSDvBdwNJi8BIg+Dw6MMPAABIK+BIjXwkUEiF/w+EWQEAAMcHzMwAAOsT6Llh//9Ii/hIhcB0DscA3d0AAEiDxxDrAjP/SIX/D4QtAQAARIlkJChEi8tNi8dIiXwkILoBAAAAQYvO6GmW//+FwA+ECAEAAINkJCgARIvOSINkJCAATYvFugkAAABBi87oQ5b//0xj+IXAD4TfAAAASYvXSAPSSI1KEEg70Ugb0kgj0XRWSIH6AAQAAHcxSI1CD0g7wncKSLjw////////D0iD4PDo/g4AAEgr4EiNXCRQSIXbdH7HA8zMAADrFkiLyuj1YP//SIvYSIXAdA7HAN3dAABIg8MQ6wIz20iF23RTRIl8JChEi85Ni8VIiVwkILoBAAAAQYvO6KmV//+FwHQySINkJEAARYvMSINkJDgATIvHSINkJDAAi1UASItNCESJfCQoSIlcJCDoY1b//4vw6wIz9kiF23QVSI1L8IE53d0AAHUJ6KNT///rAjP2SIX/dBFIjU/wgTnd3QAAdQXoiVP//4vG6wm4AgAAAOsCM8BIi00oSDPN6NjW/v9IjWU4QV9BXkFdQVxfXltdw8zMzEiJXCQISIl0JBBXSIPsYEiL8kmL2UiL0UGL+EiNTCRA6Jf5/v+LhCSoAAAASI1MJEiJRCQ4TIvLi4QkoAAAAESLx4lEJDBIi9ZIi4QkmAAAAEiJRCQoi4QkkAAAAIlEJCDoOvz//4B8JFgAdAxIi0wkQIOhqAMAAP1Ii1wkcEiLdCR4SIPEYF/DzMzMQFNIg+xASIsFq+AAADPbSIP4/nUuSIlcJDBEjUMDiVwkKEiNDU+MAABFM8lEiUQkILoAAABA/xWcHwAASIkFdeAAAEiD+P8PlcOLw0iDxEBbw8zMSIPsKEiLDVngAABIg/n9dwb/FT0dAABIg8Qow0iLxEiJWAhIiWgQSIlwGFdIg+xASINg2ABJi/hNi8iL8kSLwkiL6UiL0UiLDRfgAAD/FbEdAACL2IXAdWr/Ff0cAACD+AZ1X0iLDfnfAABIg/n9dwb/Fd0cAABIg2QkMABIjQ2giwAAg2QkKABBuAMAAABFM8lEiUQkILoAAABA/xXiHgAASINkJCAATIvPSIvISIkFr98AAESLxkiL1f8VQx0AAIvYSItsJFiLw0iLXCRQSIt0JGBIg8RAX8PMzEBTSIPsIOjdBgAAi9jo8AYAAEUzyfbDP3RLi8uLw4vTg+IBweIERIvCQYPICIDhBEQPRMJBi8iDyQQkCIvDQQ9EyIvRg8oCJBCLww9E0USLykGDyQEkIEQPRMr2wwJ0BUEPuukTQYvBSIPEIFvDzMzpAwAAAMzMzEiJXCQQSIl0JBhBVEFWQVdIg+wgRIvii9lBgeQfAwgD6EsGAABEi9BEi8hBwekDQYPhEESLwEG+AAIAAEGL0YPKCEUjxkEPRNGLyoPJBCUABAAAD0TKQYvCQbkACAAAi9GDygJBI8EPRNFBi8JBuwAQAACLyoPJAUEjww9EykGLwr4AAQAAi9EPuuoTI8YPRNFBi8JBvwBgAABBI8d0Ij0AIAAAdBk9AEAAAHQNQTvHdQ+BygADAADrB0EL1usCC9ZBgeJAgAAAQYPqQHQdQYHqwH8AAHQMQYP6QHUSD7rqGOsMgcoAAAAD6wQPuuoZRYvEQffQRCPCQSPcRAvDRDvCD4SgAQAAQYvIg+EQweEDQYvAi9FBC9YkCA9E0UGLwIvKD7rpCiQED0TKQYvAi9FBC9EkAg9E0UGLwIvKQQvLJAEPRMpBi8CL2QveJQAACAAPRNlBi8AlAAMAAHQjO8Z0G0E7xnQQiVwkQD0AAwAAdRNBC9/rCg+66w7rBA+66w2JXCRAQYHgAAAAA0GB+AAAAAF0HUGB+AAAAAJ0D0GB+AAAAAN1FQ+66w/rC4PLQOsGgctAgAAAiVwkQIA9Vd0AAAB0NvbDQHQxi8vorwQAAOsyxgU+3QAAAItcJECD47+Ly+iYBAAAvgABAABBvgACAABBvwBgAADrCoPjv4vL6HsEAACLy8HpA4PhEIvDi9GDyghBI8YPRNGLw4vKg8kEJQAEAAAPRMqLw4vRg8oCJQAIAAAPRNGLw4vKg8kBJQAQAAAPRMqLw4vRD7rqEyPGD0TRi8NBI8d0Ij0AIAAAdBk9AEAAAHQNQTvHdQ+BygADAADrB0EL1usCC9aB40CAAACD60B0G4HrwH8AAHQLg/tAdRIPuuoY6wyBygAAAAPrBA+66hmLwkiLXCRISIt0JFBIg8QgQV9BXkFcw8zMSIvEU0iD7FDyDxCEJIAAAACL2fIPEIwkiAAAALrA/wAAiUjISIuMJJAAAADyDxFA4PIPEUjo8g8RWNhMiUDQ6EQHAABIjUwkIOgqLP//hcB1B4vL6N8GAADyDxBEJEBIg8RQW8PMzMxIiVwkCEiJdCQQV0iD7CCL2UiL8oPjH4v59sEIdBRAhPZ5D7kBAAAA6G8HAACD4/frV7kEAAAAQIT5dBFID7rmCXMK6FQHAACD4/vrPED2xwF0FkgPuuYKcw+5CAAAAOg4BwAAg+P+6yBA9scCdBpID7rmC3MTQPbHEHQKuRAAAADoFgcAAIPj/UD2xxB0FEgPuuYMcw25IAAAAOj8BgAAg+PvSIt0JDgzwIXbSItcJDAPlMBIg8QgX8PMzEiLxFVTVldBVkiNaMlIgezwAAAADylwyEiLBa3QAABIM8RIiUXvi/JMi/G6wP8AALmAHwAAQYv5SYvY6CQGAACLTV9IiUQkQEiJXCRQ8g8QRCRQSItUJEDyDxFEJEjo4f7///IPEHV3hcB1QIN9fwJ1EYtFv4Pg4/IPEXWvg8gDiUW/RItFX0iNRCRISIlEJChIjVQkQEiNRW9Ei85IjUwkYEiJRCQg6DACAADoeyr//4TAdDSF/3QwSItEJEBNi8byDxBEJEiLz/IPEF1vi1VnSIlEJDDyDxFEJCjyDxF0JCDo9f3//+sci8/oJAUAAEiLTCRAusD/AADoZQUAAPIPEEQkSEiLTe9IM8zom8/+/w8otCTgAAAASIHE8AAAAEFeX15bXcPMSLgAAAAAAAAIAEgLyEiJTCQI8g8QRCQIw8zMzMzMzMzMzMzMQFNIg+wQRTPAM8lEiQWW6wAARY1IAUGLwQ+iiQQkuAAQABiJTCQII8iJXCQEiVQkDDvIdSwzyQ8B0EjB4iBIC9BIiVQkIEiLRCQgRIsFVusAACQGPAZFD0TBRIkFR+sAAESJBUTrAAAzwEiDxBBbw0iD7DhIjQVlnQAAQbkbAAAASIlEJCDoBQAAAEiDxDjDSIvESIPsaA8pcOgPKPFBi9EPKNhBg+gBdCpBg/gBdWlEiUDYD1fS8g8RUNBFi8jyDxFAyMdAwCEAAADHQLgIAAAA6y3HRCRAAQAAAA9XwPIPEUQkOEG5AgAAAPIPEVwkMMdEJCgiAAAAx0QkIAQAAABIi4wkkAAAAPIPEXQkeEyLRCR46Jv9//8PKMYPKHQkUEiDxGjDzMzMzMzMzMzMzMzMzMzMzGZmDx+EAAAAAABIg+wID64cJIsEJEiDxAjDiUwkCA+uVCQIww+uXCQIucD///8hTCQID65UJAjDZg8uBXqcAABzFGYPLgV4nAAAdgrySA8tyPJIDyrBw8zMzEiD7EiDZCQwAEiLRCR4SIlEJChIi0QkcEiJRCQg6AYAAABIg8RIw8xIi8RIiVgQSIlwGEiJeCBIiUgIVUiL7EiD7CBIi9pBi/Ez0r8NAADAiVEESItFEIlQCEiLRRCJUAxB9sAQdA1Ii0UQv48AAMCDSAQBQfbAAnQNSItFEL+TAADAg0gEAkH2wAF0DUiLRRC/kQAAwINIBARB9sAEdA1Ii0UQv44AAMCDSAQIQfbACHQNSItFEL+QAADAg0gEEEiLTRBIiwNIwegHweAE99AzQQiD4BAxQQhIi00QSIsDSMHoCcHgA/fQM0EIg+AIMUEISItNEEiLA0jB6ArB4AL30DNBCIPgBDFBCEiLTRBIiwNIwegLA8D30DNBCIPgAjFBCIsDSItNEEjB6Az30DNBCIPgATFBCOjnAgAASIvQqAF0CEiLTRCDSQwQ9sIEdAhIi00Qg0kMCPbCCHQISItFEINIDAT2whB0CEiLRRCDSAwC9sIgdAhIi0UQg0gMAYsDuQBgAABII8F0Pkg9ACAAAHQmSD0AQAAAdA5IO8F1MEiLRRCDCAPrJ0iLRRCDIP5Ii0UQgwgC6xdIi0UQgyD9SItFEIMIAesHSItFEIMg/EiLRRCB5v8PAADB5gWBIB8A/v9Ii0UQCTBIi0UQSIt1OINIIAGDfUAAdDNIi0UQuuH///8hUCBIi0UwiwhIi0UQiUgQSItFEINIYAFIi0UQIVBgSItFEIsOiUhQ60hIi00QQbjj////i0EgQSPAg8gCiUEgSItFMEiLCEiLRRBIiUgQSItFEINIYAFIi1UQi0JgQSPAg8gCiUJgSItFEEiLFkiJUFDo7AAAADPSTI1NEIvPRI1CAf8V0hMAAEiLTRCLQQioEHQISA+6MweLQQioCHQISA+6MwmLQQioBHQISA+6MwqLQQioAnQISA+6MwuLQQioAXQFSA+6MwyLAYPgA3Qwg+gBdB+D6AF0DoP4AXUoSIELAGAAAOsfSA+6Mw1ID7orDusTSA+6Mw5ID7orDesHSIEj/5///4N9QAB0B4tBUIkG6wdIi0FQSIkGSItcJDhIi3QkQEiLfCRISIPEIF3DzMzMSIPsKIP5AXQVjUH+g/gBdxjogkb//8cAIgAAAOsL6HVG///HACEAAABIg8Qow8zMQFNIg+wg6D38//+L2IPjP+hN/P//i8NIg8QgW8PMzMxIiVwkGEiJdCQgV0iD7CBIi9pIi/noDvz//4vwiUQkOIvL99GByX+A//8jyCP7C8+JTCQwgD2d1AAAAHQl9sFAdCDo8fv//+shxgWI1AAAAItMJDCD4b/o3Pv//4t0JDjrCIPhv+jO+///i8ZIi1wkQEiLdCRISIPEIF/DQFNIg+wgSIvZ6J77//+D4z8Lw4vISIPEIFvpnfv//8xIg+wo6IP7//+D4D9Ig8Qow8zMzMzMzMzMzMzMTGNBPEUzyUwDwUyL0kEPt0AURQ+3WAZIg8AYSQPARYXbdB6LUAxMO9JyCotICAPKTDvRcg5B/8FIg8AoRTvLcuIzwMPMzMzMzMzMzMzMzMxIiVwkCFdIg+wgSIvZSI09jLD+/0iLz+g0AAAAhcB0Ikgr30iL00iLz+iC////SIXAdA+LQCTB6B/30IPgAesCM8BIi1wkMEiDxCBfw8zMzLhNWgAAZjkBdR5IY1E8SAPRgTpQRQAAdQ8zwLkLAgAAZjlKGA+UwMMzwMPMzMzMzMzMzMzMzGZmDx+EAAAAAABIg+wQTIkUJEyJXCQITTPbTI1UJBhMK9BND0LTZUyLHCUQAAAATTvTcxZmQYHiAPBNjZsA8P//QcYDAE0703XwTIsUJEyLXCQISIPEEMPMzEiJXCQIRTPJTIvBhNJ1Q0iL0UGD4A9Ig+LwQYPK/w9XwEGLyEHT4mYPdAJmD9fAQSPCdRNIg8IQD1fAZg90AmYP18CFwHTtD7zASAPC6aUAAACDPX/IAAACD42uAAAAD7bCQYPK/4vITYvYweEISYPj8AvIQYPgD0GLwmYPbsFBi8jyD3DIAA9XwGZBD3QDZg/X2EHT4mYPcNEAZg9vwtPgZkEPdANmD9fQQSPSI9h1LQ+9yg9XyWYPb8JJA8uF0kwPRclJg8MQZkEPdAtmQQ90A2YP19lmD9fQhdt004vD99gjw//II9APvcpJA8uF0kwPRclJi8FIi1wkCMNBOBBND0TIQYA4AHTqSf/AQfbAD3XqD7bCZg9uwGZBDzpjAEBzDUxjyU0DyGZBDzpjAEB0wkmDwBDr4g+2wkyLwUSL0EmD4PBBweIIg+EPRAvQRTPJg8j/0+BmQQ9uwvIPcMgAD1fAZkEPdABmD3DRAGYPb8pmQQ90CA9WyGYP19Ej0HUgSYPAEGYPb8oPV8BmQQ90CGZBD3QAD1bIZg/X0YXSdOAPvNJJA9BEOBJMD0TKSYvBw8zMzMzMzMzMzMzMzMzMzMzMzMxmZg8fhAAAAAAA/+DMzMzMzMzMzMzMzMzMzMzMzMzMzGZmDx+EAAAAAAD/JSoQAADMzMzMzMzMzMzMzMzMzMzMZmYPH4QAAAAAAMzMzMzMzGZmDx+EAAAAAABXi8JIi/lJi8jzqkmLwV/DSIvBTIvJTI0Vg63+/w+20km7AQEBAQEBAQFMD6/aZkkPbsNJg/gPD4eDAAAADx8ASQPIR4uMgqDoAQBNA8pB/+FMiVnxRIlZ+WZEiVn9RIhZ/8NMiVnyRIlZ+mZEiVn+w2ZmZmZmZmYPH4QAAAAAAEyJWfNEiVn7RIhZ/8MPHwBMiVn0RIlZ/MNMiVn1ZkSJWf1EiFn/w0yJWfdEiFn/w0yJWfZmRIlZ/sNMiVn4w5BmD2zASYP4IHcM8w9/AfNCD39EAfDDgz3bxQAAAw+C3QEAAEw7BdbFAAB2Fkw7BdXFAAB3DfYFxNUAAAIPhf7+///E430YwAFMi8lJg+EfSYPpIEkryUkr0U0DwUmB+AABAAB2ZUw7BZzFAAAPh84AAABmZmZmZmYPH4QAAAAAAMX9fwHF/X9BIMX9f0FAxf1/QWDF/X+BgAAAAMX9f4GgAAAAxf1/gcAAAADF/X+B4AAAAEiBwQABAABJgegAAQAASYH4AAEAAHO2TY1IH0mD4eBNi9lJwesFR4ucmuDoAQBNA9pB/+PEoX5/hAkA////xKF+f4QJIP///8Shfn+ECUD////EoX5/hAlg////xKF+f0QJgMShfn9ECaDEoX5/RAnAxKF+f0QB4MX+fwDF+HfDZmZmZmYPH4QAAAAAAMX95wHF/edBIMX950FAxf3nQWDF/eeBgAAAAMX954GgAAAAxf3ngcAAAADF/eeB4AAAAEiBwQABAABJgegAAQAASYH4AAEAAHO2TY1IH0mD4eBNi9lJwesFR4ucmgTpAQBNA9pB/+PEoX3nhAkA////xKF954QJIP///8ShfeeECUD////EoX3nhAlg////xKF950QJgMShfedECaDEoX3nRAnAxKF+f0QB4MX+fwAPrvjF+HfDZmYPH4QAAAAAAEw7BfnDAAB2DfYF8NMAAAIPhSr9//9Mi8lJg+EPSYPpEEkryUkr0U0DwUmB+IAAAAB2S2ZmZmZmDx+EAAAAAABmD38BZg9/QRBmD39BIGYPf0EwZg9/QUBmD39BUGYPf0FgZg9/QXBIgcGAAAAASYHogAAAAEmB+IAAAABzwk2NSA9Jg+HwTYvZScHrBEeLnJoo6QEATQPaQf/j80IPf0QJgPNCD39ECZDzQg9/RAmg80IPf0QJsPNCD39ECcDzQg9/RAnQ80IPf0QJ4PNCD39EAfDzD38Aw8zMzMzMzMzMzMzMzMzMZmYPH4QAAAAAAMzMzMzMzGZmDx+EAAAAAABXVkiL+UiL8kmLyPOkXl/DSIvBTI0Vxqn+/0mD+A8PhwwBAABmZmZmDx+EAAAAAABHi4yCUOkBAE0DykH/4cOQTIsCi0oIRA+3SgxED7ZSDkyJAIlICGZEiUgMRIhQDsNMiwIPt0oIRA+2SgpMiQBmiUgIRIhICsMPtwpmiQjDkIsKRA+3QgRED7ZKBokIZkSJQAREiEgGw0yLAotKCEQPt0oMTIkAiUgIZkSJSAzDD7cKRA+2QgJmiQhEiEACw5BMiwKLSghED7ZKDEyJAIlICESISAzDTIsCD7dKCEyJAGaJSAjDTIsCD7ZKCEyJAIhICMNMiwKLSghMiQCJSAjDiwpED7dCBIkIZkSJQATDiwpED7ZCBIkIRIhABMNIiwpIiQjDD7YKiAjDiwqJCMOQSYP4IHcX8w9vCvNCD29UAvDzD38J80IPf1QB8MNOjQwCSDvKTA9GyUk7yQ+CPwQAAIM9kMEAAAMPguICAABJgfgAIAAAdhZJgfgAABgAdw32BXnRAAACD4Vz/v//xf5vAsShfm9sAuBJgfgAAQAAD4bDAAAATIvJSYPhH0mD6SBJK8lJK9FNA8FJgfgAAQAAD4aiAAAASYH4AAAYAA+HPQEAAGZmZmZmDx+EAAAAAADF/m8Kxf5vUiDF/m9aQMX+b2Jgxf1/CcX9f1Egxf1/WUDF/X9hYMX+b4qAAAAAxf5vkqAAAADF/m+awAAAAMX+b6LgAAAAxf1/iYAAAADF/X+RoAAAAMX9f5nAAAAAxf1/oeAAAABIgcEAAQAASIHCAAEAAEmB6AABAABJgfgAAQAAD4N4////TY1IH0mD4eBNi9lJwesFR4ucmpDpAQBNA9pB/+PEoX5vjAoA////xKF+f4wJAP///8Shfm+MCiD////EoX5/jAkg////xKF+b4wKQP///8Shfn+MCUD////EoX5vjApg////xKF+f4wJYP///8Shfm9MCoDEoX5/TAmAxKF+b0wKoMShfn9MCaDEoX5vTArAxKF+f0wJwMShfn9sAeDF/n8Axfh3w2aQxf5vCsX+b1Igxf5vWkDF/m9iYMX95wnF/edRIMX951lAxf3nYWDF/m+KgAAAAMX+b5KgAAAAxf5vmsAAAADF/m+i4AAAAMX954mAAAAAxf3nkaAAAADF/eeZwAAAAMX956HgAAAASIHBAAEAAEiBwgABAABJgegAAQAASYH4AAEAAA+DeP///02NSB9Jg+HgTYvZScHrBUeLnJq06QEATQPaQf/jxKF+b4wKAP///8ShfeeMCQD////EoX5vjAog////xKF954wJIP///8Shfm+MCkD////EoX3njAlA////xKF+b4wKYP///8ShfeeMCWD////EoX5vTAqAxKF950wJgMShfm9MCqDEoX3nTAmgxKF+b0wKwMShfedMCcDEoX5/bAHgxf5/AA+u+MX4d8NmZmZmZmZmDx+EAAAAAABJgfgACAAAdg32BaDOAAACD4Wa+///8w9vAvNCD29sAvBJgfiAAAAAD4aOAAAATIvJSYPhD0mD6RBJK8lJK9FNA8FJgfiAAAAAdnEPH0QAAPMPbwrzD29SEPMPb1og8w9vYjBmD38JZg9/URBmD39ZIGYPf2Ew8w9vSkDzD29SUPMPb1pg8w9vYnBmD39JQGYPf1FQZg9/WWBmD39hcEiBwYAAAABIgcKAAAAASYHogAAAAEmB+IAAAABzlE2NSA9Jg+HwTYvZScHrBEeLnJrY6QEATQPaQf/j80IPb0wKgPNCD39MCYDzQg9vTAqQ80IPf0wJkPNCD29MCqDzQg9/TAmg80IPb0wKsPNCD39MCbDzQg9vTArA80IPf0wJwPNCD29MCtDzQg9/TAnQ80IPb0wK4PNCD39MCeDzQg9/bAHw8w9/AMNmDx+EAAAAAAAPEBJIK9FJA8gPEEQR8EiD6RBJg+gQ9sEPdBhMi8lIg+HwDxDIDxAEEUEPEQlMi8FMK8BNi8hJwekHdHEPKQHrFmZmZmZmZmYPH4QAAAAAAA8pQRAPKQkPEEQR8A8QTBHgSIHpgAAAAA8pQXAPKUlgDxBEEVAPEEwRQEn/yQ8pQVAPKUlADxBEETAPEEwRIA8pQTAPKUkgDxBEERAPEAwRda4PKUEQSYPgfw8owU2LyEnB6QR0GmZmDx+EAAAAAAAPEQFIg+kQDxAEEUn/yXXwSYPgD3QDDxEQDxEBw8zMzMzMzMzMzGZmDx+EAAAAAABAVUiD7CBIi+pIiwFIi9GLCOjGFP//kEiDxCBdw8xAVUiL6kiLATPJgTgFAADAD5TBi8Fdw8xAU1VIg+woSIvqSIlNOEiJTTCAfVgAdGxIi0UwSIsISIlNKEiLRSiBOGNzbeB1VUiLRSiDeBgEdUtIi0UogXggIAWTGXQaSItFKIF4ICEFkxl0DUiLRSiBeCAiBZMZdSTo0c/+/0iLTShIiUggSItFMEiLWAjovM/+/0iJWCjoOyj//5DHRSAAAAAAi0UgSIPEKF1bw8xAVUiD7CBIi+pIi01ISIsJSIPEIF3pFtb+/8xAVUiD7CBIi+pIi0VIiwhIg8QgXelMf///zEBVSIPsIEiL6kiLAYsI6LQe//+QSIPEIF3DzEBVSIPsIEiL6kiLRViLCEiDxCBd6Rd////MQFVIg+wgSIvquQgAAABIg8QgXen+fv//zEBVSIPsIEiL6kiLhZgAAACLCEiDxCBd6eF+///MQFVIg+wgSIvquQcAAABIg8QgXenIfv//zEBVSIPsIEiL6rkFAAAASIPEIF3pr37//8xAVUiD7CBIi+q5BAAAAEiDxCBd6ZZ+///MQFVIg+wgSIvqM8lIg8QgXemAfv//zEBVSIPsIEiL6oB9cAB0C7kDAAAA6GZ+//+QSIPEIF3DzEBVSIPsIEiL6kiLTTBIg8QgXen31P7/zEBVSIPsIEiL6kiLRUiLCEiDxCBd6U2A///MQFVIg+wgSIvqi01QSIPEIF3pNoD//8xAVUiD7CBIi+pIiwGBOAUAAMB0DIE4HQAAwHQEM8DrBbgBAAAASIPEIF3DzMzMzMzMzMzMzMzMzMxAVUiD7CBIi+pIiwEzyYE4BQAAwA+UwYvBSIPEIF3DzAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJD/AQAAAAAAov8BAAAAAAC8/wEAAAAAAMr/AQAAAAAA2v8BAAAAAADw/wEAAAAAAAYAAgAAAAAAGAACAAAAAAAuAAIAAAAAAEIAAgAAAAAAXAACAAAAAABwAAIAAAAAAIwAAgAAAAAAqgACAAAAAAC+AAIAAAAAANIAAgAAAAAA7gACAAAAAAAIAQIAAAAAAB4BAgAAAAAANAECAAAAAABOAQIAAAAAAGQBAgAAAAAAeAECAAAAAACKAQIAAAAAAPoEAgAAAAAArAECAAAAAAC6AQIAAAAAAMoBAgAAAAAA4gECAAAAAAD6AQIAAAAAABICAgAAAAAAOgICAAAAAABGAgIAAAAAAFQCAgAAAAAAYgICAAAAAABsAgIAAAAAAHoCAgAAAAAAjAICAAAAAACeAgIAAAAAALACAgAAAAAAyAICAAAAAADgAgIAAAAAAPACAgAAAAAA/AICAAAAAAAKAwIAAAAAACADAgAAAAAAMgMCAAAAAAA+AwIAAAAAAEoDAgAAAAAAXAMCAAAAAABsAwIAAAAAAHoDAgAAAAAAkAMCAAAAAACcAwIAAAAAALADAgAAAAAAwAMCAAAAAADSAwIAAAAAANwDAgAAAAAA6AMCAAAAAAD0AwIAAAAAAAoEAgAAAAAAJAQCAAAAAAA+BAIAAAAAAE4EAgAAAAAAYAQCAAAAAAByBAIAAAAAAIYEAgAAAAAAnAQCAAAAAACuBAIAAAAAAL4EAgAAAAAA0gQCAAAAAADeBAIAAAAAAOwEAgAAAAAAAAAAAAAAAADoIABAAQAAAOggAEABAAAAEFIBQAEAAAAwUgFAAQAAADBSAUABAAAAAAAAAAAAAAAwVgFAAQAAAAAAAAAAAAAAiBkAQAEAAAAAAAAAAAAAAAAAAAAAAAAAwBgAQAEAAAB4GQBAAQAAABAyAEABAAAAFCoBQAEAAAB44ABAAQAAAEBJAUABAAAAAAAAAAAAAAAAAAAAAAAAAFh/AEABAAAAvEIBQAEAAABEMwBAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQCMCQAEAAADgIwJAAQAAAP////////////////////+4KwBAAQAAAAAAAAAAAAAAYGoBQAEAAAAIAAAAAAAAAHBqAUABAAAABwAAAAAAAAB4agFAAQAAAAgAAAAAAAAAiGoBQAEAAAAJAAAAAAAAAJhqAUABAAAACgAAAAAAAACoagFAAQAAAAoAAAAAAAAAuGoBQAEAAAAMAAAAAAAAAMhqAUABAAAACQAAAAAAAADUagFAAQAAAAYAAAAAAAAA4GoBQAEAAAAJAAAAAAAAAPBqAUABAAAACQAAAAAAAAAAawFAAQAAAAkAAAAAAAAAEGsBQAEAAAAHAAAAAAAAABhrAUABAAAACgAAAAAAAAAoawFAAQAAAAsAAAAAAAAAOGsBQAEAAAAJAAAAAAAAAEJrAUABAAAAAAAAAAAAAABEawFAAQAAAAQAAAAAAAAAUGsBQAEAAAAHAAAAAAAAAFhrAUABAAAAAQAAAAAAAABcawFAAQAAAAIAAAAAAAAAYGsBQAEAAAACAAAAAAAAAGRrAUABAAAAAQAAAAAAAABoawFAAQAAAAIAAAAAAAAAbGsBQAEAAAACAAAAAAAAAHBrAUABAAAAAgAAAAAAAAB4awFAAQAAAAgAAAAAAAAAhGsBQAEAAAACAAAAAAAAAIhrAUABAAAAAQAAAAAAAACMawFAAQAAAAIAAAAAAAAAkGsBQAEAAAACAAAAAAAAAJRrAUABAAAAAQAAAAAAAACYawFAAQAAAAEAAAAAAAAAnGsBQAEAAAABAAAAAAAAAKBrAUABAAAAAwAAAAAAAACkawFAAQAAAAEAAAAAAAAAqGsBQAEAAAABAAAAAAAAAKxrAUABAAAAAQAAAAAAAACwawFAAQAAAAIAAAAAAAAAtGsBQAEAAAABAAAAAAAAALhrAUABAAAAAgAAAAAAAAC8awFAAQAAAAEAAAAAAAAAwGsBQAEAAAACAAAAAAAAAMRrAUABAAAAAQAAAAAAAADIawFAAQAAAAEAAAAAAAAAzGsBQAEAAAABAAAAAAAAANBrAUABAAAAAgAAAAAAAADUawFAAQAAAAIAAAAAAAAA2GsBQAEAAAACAAAAAAAAANxrAUABAAAAAgAAAAAAAADgawFAAQAAAAIAAAAAAAAA5GsBQAEAAAACAAAAAAAAAOhrAUABAAAAAgAAAAAAAADsawFAAQAAAAMAAAAAAAAA8GsBQAEAAAADAAAAAAAAAPRrAUABAAAAAgAAAAAAAAD4awFAAQAAAAIAAAAAAAAA/GsBQAEAAAACAAAAAAAAAABsAUABAAAACQAAAAAAAAAQbAFAAQAAAAkAAAAAAAAAIGwBQAEAAAAHAAAAAAAAAChsAUABAAAACAAAAAAAAAA4bAFAAQAAABQAAAAAAAAAUGwBQAEAAAAIAAAAAAAAAGBsAUABAAAAEgAAAAAAAAB4bAFAAQAAABwAAAAAAAAAmGwBQAEAAAAdAAAAAAAAALhsAUABAAAAHAAAAAAAAADYbAFAAQAAAB0AAAAAAAAA+GwBQAEAAAAcAAAAAAAAABhtAUABAAAAIwAAAAAAAABAbQFAAQAAABoAAAAAAAAAYG0BQAEAAAAgAAAAAAAAAIhtAUABAAAAHwAAAAAAAACobQFAAQAAACYAAAAAAAAA0G0BQAEAAAAaAAAAAAAAAPBtAUABAAAADwAAAAAAAAAAbgFAAQAAAAMAAAAAAAAABG4BQAEAAAAFAAAAAAAAABBuAUABAAAADwAAAAAAAAAgbgFAAQAAACMAAAAAAAAARG4BQAEAAAAGAAAAAAAAAFBuAUABAAAACQAAAAAAAABgbgFAAQAAAA4AAAAAAAAAcG4BQAEAAAAaAAAAAAAAAJBuAUABAAAAHAAAAAAAAACwbgFAAQAAACUAAAAAAAAA2G4BQAEAAAAkAAAAAAAAAABvAUABAAAAJQAAAAAAAAAobwFAAQAAACsAAAAAAAAAWG8BQAEAAAAaAAAAAAAAAHhvAUABAAAAIAAAAAAAAACgbwFAAQAAACIAAAAAAAAAyG8BQAEAAAAoAAAAAAAAAPhvAUABAAAAKgAAAAAAAAAocAFAAQAAABsAAAAAAAAASHABQAEAAAAMAAAAAAAAAFhwAUABAAAAEQAAAAAAAABwcAFAAQAAAAsAAAAAAAAAQmsBQAEAAAAAAAAAAAAAAIBwAUABAAAAEQAAAAAAAACYcAFAAQAAABsAAAAAAAAAuHABQAEAAAASAAAAAAAAANBwAUABAAAAHAAAAAAAAADwcAFAAQAAABkAAAAAAAAAQmsBQAEAAAAAAAAAAAAAAIhrAUABAAAAAQAAAAAAAACcawFAAQAAAAEAAAAAAAAA0GsBQAEAAAACAAAAAAAAAMhrAUABAAAAAQAAAAAAAACoawFAAQAAAAEAAAAAAAAAUGwBQAEAAAAIAAAAAAAAABBxAUABAAAAFQAAAAAAAABfX2Jhc2VkKAAAAAAAAAAAX19jZGVjbABfX3Bhc2NhbAAAAAAAAAAAX19zdGRjYWxsAAAAAAAAAF9fdGhpc2NhbGwAAAAAAABfX2Zhc3RjYWxsAAAAAAAAX192ZWN0b3JjYWxsAAAAAF9fY2xyY2FsbAAAAF9fZWFiaQAAAAAAAF9fc3dpZnRfMQAAAAAAAABfX3N3aWZ0XzIAAAAAAAAAX19zd2lmdF8zAAAAAAAAAF9fcHRyNjQAX19yZXN0cmljdAAAAAAAAF9fdW5hbGlnbmVkAAAAAAByZXN0cmljdCgAAAAgbmV3AAAAAAAAAAAgZGVsZXRlAD0AAAA+PgAAPDwAACEAAAA9PQAAIT0AAFtdAAAAAAAAb3BlcmF0b3IAAAAALT4AACoAAAArKwAALS0AAC0AAAArAAAAJgAAAC0+KgAvAAAAJQAAADwAAAA8PQAAPgAAAD49AAAsAAAAKCkAAH4AAABeAAAAfAAAACYmAAB8fAAAKj0AACs9AAAtPQAALz0AACU9AAA+Pj0APDw9ACY9AAB8PQAAXj0AAGB2ZnRhYmxlJwAAAAAAAABgdmJ0YWJsZScAAAAAAAAAYHZjYWxsJwBgdHlwZW9mJwAAAAAAAAAAYGxvY2FsIHN0YXRpYyBndWFyZCcAAAAAYHN0cmluZycAAAAAAAAAAGB2YmFzZSBkZXN0cnVjdG9yJwAAAAAAAGB2ZWN0b3IgZGVsZXRpbmcgZGVzdHJ1Y3RvcicAAAAAYGRlZmF1bHQgY29uc3RydWN0b3IgY2xvc3VyZScAAABgc2NhbGFyIGRlbGV0aW5nIGRlc3RydWN0b3InAAAAAGB2ZWN0b3IgY29uc3RydWN0b3IgaXRlcmF0b3InAAAAYHZlY3RvciBkZXN0cnVjdG9yIGl0ZXJhdG9yJwAAAABgdmVjdG9yIHZiYXNlIGNvbnN0cnVjdG9yIGl0ZXJhdG9yJwAAAAAAYHZpcnR1YWwgZGlzcGxhY2VtZW50IG1hcCcAAAAAAABgZWggdmVjdG9yIGNvbnN0cnVjdG9yIGl0ZXJhdG9yJwAAAAAAAAAAYGVoIHZlY3RvciBkZXN0cnVjdG9yIGl0ZXJhdG9yJwBgZWggdmVjdG9yIHZiYXNlIGNvbnN0cnVjdG9yIGl0ZXJhdG9yJwAAYGNvcHkgY29uc3RydWN0b3IgY2xvc3VyZScAAAAAAABgdWR0IHJldHVybmluZycAYEVIAGBSVFRJAAAAAAAAAGBsb2NhbCB2ZnRhYmxlJwBgbG9jYWwgdmZ0YWJsZSBjb25zdHJ1Y3RvciBjbG9zdXJlJwAgbmV3W10AAAAAAAAgZGVsZXRlW10AAAAAAAAAYG9tbmkgY2FsbHNpZycAAGBwbGFjZW1lbnQgZGVsZXRlIGNsb3N1cmUnAAAAAAAAYHBsYWNlbWVudCBkZWxldGVbXSBjbG9zdXJlJwAAAABgbWFuYWdlZCB2ZWN0b3IgY29uc3RydWN0b3IgaXRlcmF0b3InAAAAYG1hbmFnZWQgdmVjdG9yIGRlc3RydWN0b3IgaXRlcmF0b3InAAAAAGBlaCB2ZWN0b3IgY29weSBjb25zdHJ1Y3RvciBpdGVyYXRvcicAAABgZWggdmVjdG9yIHZiYXNlIGNvcHkgY29uc3RydWN0b3IgaXRlcmF0b3InAAAAAABgZHluYW1pYyBpbml0aWFsaXplciBmb3IgJwAAAAAAAGBkeW5hbWljIGF0ZXhpdCBkZXN0cnVjdG9yIGZvciAnAAAAAAAAAABgdmVjdG9yIGNvcHkgY29uc3RydWN0b3IgaXRlcmF0b3InAAAAAAAAYHZlY3RvciB2YmFzZSBjb3B5IGNvbnN0cnVjdG9yIGl0ZXJhdG9yJwAAAAAAAAAAYG1hbmFnZWQgdmVjdG9yIGNvcHkgY29uc3RydWN0b3IgaXRlcmF0b3InAAAAAAAAYGxvY2FsIHN0YXRpYyB0aHJlYWQgZ3VhcmQnAAAAAABvcGVyYXRvciAiIiAAAAAAb3BlcmF0b3IgY29fYXdhaXQAAAAAAAAAb3BlcmF0b3I8PT4AAAAAACBUeXBlIERlc2NyaXB0b3InAAAAAAAAACBCYXNlIENsYXNzIERlc2NyaXB0b3IgYXQgKAAAAAAAIEJhc2UgQ2xhc3MgQXJyYXknAAAAAAAAIENsYXNzIEhpZXJhcmNoeSBEZXNjcmlwdG9yJwAAAAAgQ29tcGxldGUgT2JqZWN0IExvY2F0b3InAAAAAAAAAGBhbm9ueW1vdXMgbmFtZXNwYWNlJwAAAEBxAUABAAAAgHEBQAEAAADAcQFAAQAAAGEAcABpAC0AbQBzAC0AdwBpAG4ALQBjAG8AcgBlAC0AZgBpAGIAZQByAHMALQBsADEALQAxAC0AMQAAAAAAAABhAHAAaQAtAG0AcwAtAHcAaQBuAC0AYwBvAHIAZQAtAHMAeQBuAGMAaAAtAGwAMQAtADIALQAwAAAAAAAAAAAAawBlAHIAbgBlAGwAMwAyAAAAAAAAAAAAYQBwAGkALQBtAHMALQAAAAAAAAACAAAARmxzQWxsb2MAAAAAAAAAAAAAAAACAAAARmxzRnJlZQAAAAAAAgAAAEZsc0dldFZhbHVlAAAAAAAAAAAAAgAAAEZsc1NldFZhbHVlAAAAAAABAAAAAgAAAEluaXRpYWxpemVDcml0aWNhbFNlY3Rpb25FeAAAAAAAAAAAAAAAAAAAAAAABgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABgAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAADAAAAAAAAAAYAAAAAAAAAAAAAAAAAAAAGAAAAAAAAAAIAAAABAAAAAAAAAAAAAAAEAAAABAAAAAUAAAAEAAAABQAAAAQAAAAFAAAAAAAAAAUAAAAAAAAABQAAAAAAAAAFAAAAAAAAAAUAAAAAAAAABQAAAAMAAAAFAAAAAwAAAAAAAAAAAAAAAAAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAACAAAAAIAAAAAAAAAAwAAAAgAAAAFAAAAAAAAAAUAAAAIAAAAAAAAAAcAAAAAAAAACAAAAAAAAAAAAAAAAwAAAAcAAAADAAAAAAAAAAMAAAAAAAAABQAAAAcAAAAFAAAAAAAAAAAAAAAHAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAgAAAAAAAAAAAAAACAAAAAAAAAAHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAGAAAAAAAAAAYAAAAIAAAABgAAAAAAAAAGAAAAAAAAAAYAAAAAAAAABgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwAAAAgAAAAHAAAAAAAAAAcAAAAIAAAABwAAAAgAAAAHAAAACAAAAAcAAAAIAAAAAAAAAAgAAAAAAAAABwAAAAAAAAAIAAAAAAAAAAcAAAAAAAAAAAAAAAAAAAAHAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAIAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAABwAAAAAAAAAIAAAAAAAAAAAAAAAAAAAABwAAAAAAAAAIAAAAAAAAAAAAAAAAAAAABwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA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TgQCAAAAAABgBAIAAAAAAHIEAgAAAAAAhgQCAAAAAACcBAIAAAAAAK4EAgAAAAAAvgQCAAAAAADSBAIAAAAAAN4EAgAAAAAA7AQCAAAAAAAAAAAAAAAAAOABR2V0Q29tbWFuZExpbmVXACQFU2V0RW52aXJvbm1lbnRWYXJpYWJsZVcAiQBDbG9zZUhhbmRsZQBqAkdldExhc3RFcnJvcgAA6gVXYWl0Rm9yU2luZ2xlT2JqZWN0AEYCR2V0RXhpdENvZGVQcm9jZXNzAADoAENyZWF0ZVByb2Nlc3NXAAB9AkdldE1vZHVsZUZpbGVOYW1lVwAA1QRSdGxDYXB0dXJlQ29udGV4dADcBFJ0bExvb2t1cEZ1bmN0aW9uRW50cnkAAOMEUnRsVmlydHVhbFVud2luZAAAwAVVbmhhbmRsZWRFeGNlcHRpb25GaWx0ZXIAAH8FU2V0VW5oYW5kbGVkRXhjZXB0aW9uRmlsdGVyACACR2V0Q3VycmVudFByb2Nlc3MAngVUZXJtaW5hdGVQcm9jZXNzAACMA0lzUHJvY2Vzc29yRmVhdHVyZVByZXNlbnQAUgRRdWVyeVBlcmZvcm1hbmNlQ291bnRlcgAhAkdldEN1cnJlbnRQcm9jZXNzSWQAJQJHZXRDdXJyZW50VGhyZWFkSWQAAPMCR2V0U3lzdGVtVGltZUFzRmlsZVRpbWUAbwNJbml0aWFsaXplU0xpc3RIZWFkAIUDSXNEZWJ1Z2dlclByZXNlbnQA2gJHZXRTdGFydHVwSW5mb1cAgQJHZXRNb2R1bGVIYW5kbGVXAABLRVJORUwzMi5kbGwAAOIEUnRsVW53aW5kRXgAQQVTZXRMYXN0RXJyb3IAADgBRW50ZXJDcml0aWNhbFNlY3Rpb24AAMQDTGVhdmVDcml0aWNhbFNlY3Rpb24AABQBRGVsZXRlQ3JpdGljYWxTZWN0aW9uAGsDSW5pdGlhbGl6ZUNyaXRpY2FsU2VjdGlvbkFuZFNwaW5Db3VudACwBVRsc0FsbG9jAACyBVRsc0dldFZhbHVlALMFVGxzU2V0VmFsdWUAsQVUbHNGcmVlALQBRnJlZUxpYnJhcnkAuAJHZXRQcm9jQWRkcmVzcwAAygNMb2FkTGlicmFyeUV4VwAAaARSYWlzZUV4Y2VwdGlvbgAAGQVTZXRDdXJyZW50RGlyZWN0b3J5VwAAGgJHZXRDdXJyZW50RGlyZWN0b3J5VwAA3AJHZXRTdGRIYW5kbGUAACUGV3JpdGVGaWxlAGcBRXhpdFByb2Nlc3MAgAJHZXRNb2R1bGVIYW5kbGVFeFcAAN8BR2V0Q29tbWFuZExpbmVBAFEDSGVhcEFsbG9jAFUDSGVhcEZyZWUAAJ4AQ29tcGFyZVN0cmluZ1cAALgDTENNYXBTdHJpbmdXAABYAkdldEZpbGVUeXBlABEGV2lkZUNoYXJUb011bHRpQnl0ZQB+AUZpbmRDbG9zZQCEAUZpbmRGaXJzdEZpbGVFeFcAAJUBRmluZE5leHRGaWxlVwCSA0lzVmFsaWRDb2RlUGFnZQC7AUdldEFDUAAAoQJHZXRPRU1DUAAAygFHZXRDUEluZm8A9gNNdWx0aUJ5dGVUb1dpZGVDaGFyAEECR2V0RW52aXJvbm1lbnRTdHJpbmdzVwAAswFGcmVlRW52aXJvbm1lbnRTdHJpbmdzVwBbBVNldFN0ZEhhbmRsZQAA4QJHZXRTdHJpbmdUeXBlVwAAvgJHZXRQcm9jZXNzSGVhcAAAqAFGbHVzaEZpbGVCdWZmZXJzAAAJAkdldENvbnNvbGVPdXRwdXRDUAAABQJHZXRDb25zb2xlTW9kZQAAVgJHZXRGaWxlU2l6ZUV4ADMFU2V0RmlsZVBvaW50ZXJFeAAAWgNIZWFwU2l6ZQAAWANIZWFwUmVBbGxvYwDOAENyZWF0ZUZpbGVXACQGV3JpdGVDb25zb2xlVwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAAAAAAAAAAAAAAAAAAAAAABZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAAAAAAAAAAAAAAAAAAAAAABDAGEAbgBuAG8AdAAgAGEAbABsAG8AYwBhAHQAZQAgACUAegBkACAAYgB5AHQAZQBzACAAbwBmACAAbQBlAG0AbwByAHkAIABmAG8AcgAgAGMAbwBtAG0AYQBuAGQAIABsAGkAbgBlAAoAAAAlAHMAAAAAAAAAAAAlAC4AKgBzACUAcwAlAHMAAAAAAAAAAAAlAHMAIAAlAHMAAAAAAAAAVwBJAE4AUABZAEQASQBSAEkAQwBPAE4AUwAAAAAAAABGAGEAaQBsAGUAZAAgAHQAbwAgAHMAZQB0ACAAZQBuAHYAaQByAG8A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dPABAPRiAAD2YwAAAPEBAPhjAADeZAAAUPEBAOBkAACFZQAAFPEBAIhlAAB9ZgAACPABAIBmAACAZwAACPABAIBnAAALaAAA4O8BAAxoAACXaAAA4O8BAKBoAABGaQAA6O4BAORtAACpbgAAiPEBAKxuAAA2cAAADPIBADhwAACMcQAA7PEBAIxxAAAOcwAAiPEBAKBzAABfdQAACPABAGB1AAC9dQAANO4BAMB1AABGdwAAJPIBAEh3AAC0dwAA6O4BALR3AAC6eAAARPIBALx4AAD9eAAAOPIBAAB5AADReQAAXPIBANR5AADueQAAJO4BAPB5AAAKegAAJO4BAAx6AABHegAAJO4BAEh6AACAegAAJO4BAIB6AADOegAAJO4BANh6AAA8ewAAiPEBADx7AAB5ewAA6O4BAHx7AAC0ewAAmPIBALR7AAB1fAAAePIBAIR8AABAfQAAbPIBAEB9AACKfQAANO4BAIx9AADnfQAANO4BABx+AABYfgAAJO4BAGR+AAChfgAAJO4BAKR+AADJfgAAJO4BANx+AABKfwAAxPIBAFh/AACGfwAAvPIBAIh/AADxfwAANO4BAPx/AAAngAAAJO4BADCAAABrgAAALPMBAGyAAACngAAAUPMBAKiAAABYggAA/PIBAFiCAABugwAAFPMBAICDAAC6gwAA9PIBAOSDAAAshAAA7PIBAECEAABjhAAAJO4BAGSEAAB0hAAAJO4BAHSEAACxhAAANO4BALyEAAD8hAAANO4BAPyEAABXhQAAJO4BAGyFAAChhQAAJO4BAKSFAADEhQAAdPMBAMSFAAAjhgAANO4BACSGAAB6hgAAJO4BAISGAACGiQAAlPMBAIiJAAAtkAAAsPMBADCQAACmkAAAiPEBAMCQAAA9kQAAyPMBAGyRAADHkgAA1PMBANCSAAB+kwAA9PMBAICTAACekwAAzPMBAKCTAADnkwAAJO4BADCUAAB+lAAA6O4BAICUAACglAAAJO4BAKCUAADAlAAAJO4BAMCUAAA1lQAANO4BADiVAAB1lQAACPQBAHiVAABOlwAAmO8BAFCXAACelwAANO4BAKCXAADalwAAJO4BANyXAAC4mAAAGPQBALiYAAAAmQAANO4BAACZAABGmQAANO4BAEiZAACOmQAANO4BAJCZAADhmQAA6O4BAOSZAABFmgAAiO8BAEiaAAAkmwAAGPQBACSbAAB0mwAA6O4BAHSbAAClmwAAEPQBAKibAADpmwAANO4BAOybAACdnAAALPQBAKCcAAA6nQAAWPQBADydAAAcngAAfPQBAByeAAB5ngAAUPQBAHyeAAD2ngAAiO8BAPieAABDnwAANO4BAEyfAACMnwAANO4BAIyfAAB5oAAAxPQBAHygAACIoQAAyO8BAIihAADDoQAApPQBAMShAAAEogAA6O4BAASiAABiogAANO4BAGSiAACOogAAzPMBAJCiAAC6ogAAzPMBALyiAAA6pAAAGPQBAESkAADgpQAA4PQBAOClAAD0pQAAzPMBAPSlAAAzpgAAAPUBADSmAABxpgAAbPUBAHSmAAC5pgAAJPUBALymAAAbpwAASPUBABynAADppwAA8PQBAOynAAAMqAAACPQBAAyoAAABqQAA+PQBAASpAABrqQAA6O4BAGypAABAqgAAiO8BAECqAADnqgAANO4BAOiqAAC0qwAAiO8BALSrAADtqwAAJO4BAPCrAAASrAAAJO4BABSsAABFrAAANO4BAEisAAB5rAAANO4BAHysAAD8rwAAwPUBAPyvAADssAAAGPQBAOywAAC+sgAAqPUBAMCyAAAltAAADPIBACi0AABttQAA3PUBAHC1AACGtgAACPABAIi2AAC/uQAAkPUBAMC5AAA7uwAA8PUBADy7AABiuwAAJO4BAJS7AADauwAANO4BANy7AACkvAAA6O4BAKS8AADdvAAADPYBAOC8AADovQAAFPYBAOi9AAAivwAAMPYBACS/AABOvwAAJO4BAFC/AADGwAAAXPYBAMjAAABfwgAAQPYBAGDCAAANwwAAdPYBACTDAAAtxQAAgPYBADDFAAC3xgAAmPYBALjGAADGyQAAtPYBANDJAADhygAA9PYBAOTKAAACzAAA2PYBAATMAAC+zQAAhPcBAMDNAAA9zgAAKPcBAEDOAADQzgAAiPEBANDOAACx0AAAaPcBALTQAABy0gAAWPcBAHTSAAAs0wAAMPcBACzTAACM0wAAJO4BAIzTAACo0wAAJO4BAKjTAABh1gAACPcBAGTWAADZ1gAAXPIBAEzXAABN2AAADPIBAFDYAABw2wAAqPcBAHDbAABV3AAAwPcBAGDcAACo3AAANO4BAMTcAAD73AAANO4BABjdAABU3QAA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KKA4oEigWKBooHigiKCYoKiguKDIoNig6KD4oAihGKEooTihSKFYoWiheKGIoZihqKG4ocih2KHoofihCKIYoiiiOKJIoliiaKJ4ooiimKKooriiyKLYouii+KIIoxijKKM4o0ijWKNoo3ijiKOYo6ijuKPIo9ij6KP4owikGKQopDikSKRYpGikeKSIpJikqKS4pMik2KTopPikCKUYpSilOKVIpVilaKV4pYilmKWopbilyKXYpeil+KUIphimKKY4pkimWKZopnimiKaYpqimuKbIptim6Kb4pginGKcopzinSKdYp2ineKeIp5inqKe4p8in2Kfop/inCKgYqCioOKhIqFioaKh4qIiomKioqLioyKjYqOio+KgIqRipKKk4qUipWKloqXipiKmYqaipuKnIqdip6Kn4qQiqGKooqjiqSKpYqmiqeKqIqpiqqKq4qsiq2KroqviqCKsYqyirOKtIq1iraKt4q4irmKuoq7iryKvYq+ir+KsIrBisKKw4rEisWKxorHisiKyYrKisuKzIrNis6Kz4rAitGK0orTitSK1YrWiteK2IrZitqK24rcitAAAAoAEAzAAAAPCpAKoQqiCqMKpAqlCqYKpwqoCqkKqgqrCqwKrQquCq8KoAqxCrIKswq0CrUKtgq3CrgKuQq6CrsKvAq9Cr4KvwqwCsEKwgrDCsQKxQrGCscKyArJCsoKywrMCs0KzgrPCsAK0QrSCtMK1ArVCtYK1wrYCtkK2grbCtwK3QreCt8K0ArhCuIK4wrkCuUK5grnCugK6QrqCusK7ArtCu4K7wrgCvEK8grzCvQK9Qr2CvcK+Ar5CvoK+wr8Cv0K/gr/CvAAAAsAEAEAEAAACgEKAgoDCgQKBQoGCgcKCAoJCgoKCwoMCg0KDgoPCgAKEQoSChMKFAoVChYKFwoYChkKGgobChwKHQoeCh8KEAohCiIKIwokCiUKJgonCigKKQoqCisKLAotCi4KLwogCjEKMgozCjQKNQo2CjcKOAo5CjoKOwo8Cj0KPgo/CjAKQQpCCkMKRApFCkYKRwpICkkKSgpLCkwKTQpOCk8KQApRClIKUwpUClUKVgpXClgKWQpaClsKXApdCl4KXwpQCmEKYgpjCmQKZQpmCmcKaAppCmoKawpsCm0KbgpvCmAKcQpyCnMKdAp1CnYKdwp4CnkKegp7CnwKfQp+Cn8KcAqBCoIKgAAADgAQAcAAAAmKewp7inQKhYqGCoaKhwqHioAAAAEAIAIAAAALCq+KoYqzirWKt4q6irwKvIq9CrCKwQrAAgAgAwAAAAYKFwoXihgKGIoZChmKGgoaihsKG4ocih0KHYoeCh6KHwofihAKIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= -""" - -if __name__ == '__main__': - main() From 7b77d5cd9a4a15af2c3f7b726be2ea16db312c46 Mon Sep 17 00:00:00 2001 From: stonebig Date: Sat, 4 Jan 2025 21:20:08 +0100 Subject: [PATCH 040/305] override old NSIS launchers per new launchers method --- make.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/make.py b/make.py index c00db8ae..384782dc 100644 --- a/make.py +++ b/make.py @@ -688,6 +688,12 @@ def _create_launchers(self): args=r"Noshell.vbs winvscode.bat", ) + # 2025-01-04: copy launchers premade per the Datalab-Python way + portable_dir = str(Path(__file__).resolve().parent / "portable" / "launchers_final") + for path in Path(portable_dir).rglob('*.exe'): + shutil.copy2(path, Path(self.winpydir) ) + print("new way !!!!!!!!!!!!!!!!!! ", path , " -> ",Path(self.winpydir)) + self._print_done() def _create_batch_scripts_initial(self): From ad155a2be9dcc0b6fa9a62b334c8fd93bfa28ba0 Mon Sep 17 00:00:00 2001 From: stonebig Date: Sat, 4 Jan 2025 21:24:52 +0100 Subject: [PATCH 041/305] further remove shimmy technic --- make.py | 43 ------------------------------------------- winpython/__init__.py | 2 +- 2 files changed, 1 insertion(+), 44 deletions(-) diff --git a/make.py b/make.py index 384782dc..8d13e117 100644 --- a/make.py +++ b/make.py @@ -112,23 +112,6 @@ def replace_in_7zip_file(fname, data): fd.close() -def build_shimmy_launcher(launcher_name, command, icon_path, mkshim_program='mkshim400.py', workdir=''): - """Build .exe launcher with mkshim_program and pywin32""" - - # define where is mkshim - mkshim_program = str(Path(__file__).resolve().parent / mkshim_program) - python_program = utils.get_python_executable() - - # Create the executable using mkshim.py or mkshim240.py - mkshim_command = f'{python_program} "{mkshim_program}" -f "{launcher_name}" -c "{command}"' - if workdir !='': # V03 of shim: we can handle an optional sub-directory - mkshim_command += f' --subdir "{workdir}"' - # Embed the icon, if provided - if Path(icon_path).is_file(): - mkshim_command += f' --i "{icon_path}"' - print(f"Building .exe launcher with {mkshim_program}:", mkshim_command) - subprocess.run(mkshim_command, shell=True) - def build_nsis(srcname, dstname, data): """Build NSIS script""" NSIS_EXE = get_nsis_exe() # NSIS Compiler @@ -417,32 +400,6 @@ def create_batch_script(self, name, contents, do_changes=None): fd.write(contents_final) fd.close() - def create_launcher_shimmy( - self, - name, - icon, - command=None, - args=None, - workdir=r"", # ".\script" to go to sub-directory of the icon - mkshim_program="mkshim400.py", # to force another one - ): - """Create an exe launcher with mkshim.py""" - assert name.endswith(".exe") - portable_dir = str(Path(__file__).resolve().parent / "portable") - icon_fname = str(Path(portable_dir) / "icons" / icon) - assert Path(icon_fname).is_file() - - # prepare mkshim.py script - # $env:WINPYDIRICONS variable give the icons directory - if command is None: - if args is not None and ".pyw" in args: - command = "${WINPYDIR}\pythonw.exe" #not used - else: - command = "${WINPYDIR}\python.exe" #not used - iconlauncherfullname= str(Path(self.winpydir) / name) - true_command = command.replace(r"$SYSDIR\cmd.exe","cmd.exe")+ " " + args - # build_shimmy_launcher(iconlauncherfullname, true_command, icon_fname, mkshim_program=mkshim_program, workdir=workdir) - def create_launcher( self, name, diff --git a/winpython/__init__.py b/winpython/__init__.py index 31747b0c..fc7536db 100644 --- a/winpython/__init__.py +++ b/winpython/__init__.py @@ -28,6 +28,6 @@ OTHER DEALINGS IN THE SOFTWARE. """ -__version__ = '11.2.20241228' +__version__ = '11.3.20250104' __license__ = __doc__ __project_url__ = 'http://winpython.github.io/' From 6e2acf9c38f01e70bf0df564a596ee6e56ebdc97 Mon Sep 17 00:00:00 2001 From: stonebig Date: Sun, 5 Jan 2025 00:11:39 +0100 Subject: [PATCH 042/305] removal of NSIS code --- make.py | 198 +----------------------------------- portable/launcher_basic.nsi | 44 -------- 2 files changed, 4 insertions(+), 238 deletions(-) delete mode 100644 portable/launcher_basic.nsi diff --git a/make.py b/make.py index 8d13e117..ad600c75 100644 --- a/make.py +++ b/make.py @@ -24,38 +24,6 @@ CHANGELOGS_DIR = str(Path(__file__).parent / "changelogs") assert Path(CHANGELOGS_DIR).is_dir() -def get_drives(): - """ - This function retrieves a list of existing drives on a Windows system. - - Returns: - list: A list of drive letters (e.g., ['C:', 'D:']) - """ - if hasattr(os, 'listdrives'): # For Python 3.12 and above - return os.listdrives() - else: - drives = [f"{d}:\\" for d in os.environ.get('HOMEDRIVE', '').split("\\") if d] - return drives - - -def get_nsis_exe(): - """Return NSIS executable""" - localdir = str(Path(sys.prefix).parent.parent) - for drive in get_drives(): - for dirname in ( - r"C:\Program Files", - r"C:\Program Files (x86)", - drive + r"PortableApps\NSISPortableANSI", - drive + r"PortableApps\NSISPortable", - str(Path(localdir) / "NSISPortableANSI"), - str(Path(localdir) / "NSISPortable"), - ): - for subdirname in (".", "App"): - exe = str(Path(dirname) / subdirname / "NSIS" / "makensis.exe") - if Path(exe).is_file(): - return exe - else: - raise RuntimeError("NSIS is not installed on this computer.") def get_7zip_exe(): """Return 7zip executable""" @@ -71,25 +39,6 @@ def get_7zip_exe(): return exe raise RuntimeError("7ZIP is not installed on this computer.") -def replace_in_nsis_file(fname, data): - """Replace text in line starting with *start*, from this position: - data is a list of (start, text) tuples""" - fd = open(fname, "U") - lines = fd.readlines() - fd.close() - for idx, line in enumerate(lines): - for start, text in data: - if start not in ( - "Icon", - "OutFile", - ) and not start.startswith("!"): - start = "!define " + start - if line.startswith(start + " "): - lines[idx] = line[: len(start) + 1] + f'"{text}"' + "\n" - fd = open(fname, "w") - fd.writelines(lines) - print("iss for ", fname, "is", lines) - fd.close() def replace_in_7zip_file(fname, data): """Replace text in line starting with *start*, from this position: @@ -112,34 +61,6 @@ def replace_in_7zip_file(fname, data): fd.close() -def build_nsis(srcname, dstname, data): - """Build NSIS script""" - NSIS_EXE = get_nsis_exe() # NSIS Compiler - portable_dir = str(Path(__file__).resolve().parent / "portable") - shutil.copy(str(Path(portable_dir) / srcname), dstname) - data = [ - ( - "!addincludedir", - str(Path(portable_dir) / "include"), - ) - ] + list(data) - replace_in_nsis_file(dstname, data) - try: - retcode = subprocess.call( - f'"{NSIS_EXE}" -V2 "{dstname}"', - shell=True, - stdout=sys.stderr, - ) - if retcode < 0: - print( - "Child was terminated by signal", - -retcode, - file=sys.stderr, - ) - except OSError as e: - print("Execution failed:", e, file=sys.stderr) - os.remove(dstname) - def build_7zip(srcname, dstname, data): """7-Zip Setup Script""" SEVENZIP_EXE = get_7zip_exe() @@ -400,45 +321,6 @@ def create_batch_script(self, name, contents, do_changes=None): fd.write(contents_final) fd.close() - def create_launcher( - self, - name, - icon, - command=None, - args=None, - workdir=r"$EXEDIR\scripts", - launcher="launcher_basic.nsi", - ): - """Create exe launcher with NSIS""" - assert name.endswith(".exe") - portable_dir = str(Path(__file__).resolve().parent / "portable") - icon_fname = str(Path(portable_dir) / "icons" / icon) - assert Path(icon_fname).is_file() - - # Customizing NSIS script - if command is None: - if args is not None and ".pyw" in args: - command = "${WINPYDIR}\pythonw.exe" - else: - command = "${WINPYDIR}\python.exe" - if args is None: - args = "" - if workdir is None: - workdir = "" - fname = str(Path(self.winpydir) / (Path(name).stem + ".nsi")) - - data = [ - ("WINPYDIR", f"$EXEDIR\{self.python_namedir}"), #2024-12-22 - ("WINPYVER", self.winpyver), - ("COMMAND", command), - ("PARAMETERS", args), - ("WORKDIR", workdir), - ("Icon", icon_fname), - ("OutFile", name), - ] - - build_nsis(launcher, fname, data) - def create_python_batch( self, name, @@ -570,81 +452,6 @@ def _create_launchers(self): self._print("Creating launchers") - - self.create_launcher( - "WinPython Command Prompt.exe", - "cmd.ico", - command="$SYSDIR\cmd.exe", - args=r"/k cmd.bat", - ) - - self.create_launcher( - "WinPython Powershell Prompt.exe", - "powershell.ico", - command="wscript.exe", - args=r"Noshell.vbs cmd_ps.bat", - ) - - self.create_launcher( - "WinPython Interpreter.exe", - "python.ico", - command="$SYSDIR\cmd.exe", - args=r"/k winpython.bat", - ) - - self.create_launcher( - "IDLE (Python GUI).exe", - "python.ico", - command="wscript.exe", - args=r"Noshell.vbs winidle.bat", - ) - - self.create_launcher( - "Spyder.exe", - "spyder.ico", - command="wscript.exe", - args=r"Noshell.vbs winspyder.bat", - ) - - self.create_launcher( - "Spyder reset.exe", - "spyder_reset.ico", - command="wscript.exe", - args=r"Noshell.vbs spyder_reset.bat", - ) - - self.create_launcher( - "WinPython Control Panel.exe", - "winpython.ico", - command="$SYSDIR\cmd.exe", - args=r"/k wpcp.bat", - ) - - # Jupyter launchers - - self.create_launcher( - "Jupyter Notebook.exe", - "jupyter.ico", - command="$SYSDIR\cmd.exe", - args=r"/k winipython_notebook.bat", # like VSCode + Rise way - # args=r'/k winjupyter_nbclassic.bat', # Jupyterlab in classic look - ) - - self.create_launcher( - "Jupyter Lab.exe", - "jupyter.ico", - command="$SYSDIR\cmd.exe", - args=r"/k winjupyter_lab.bat", - ) - - # VSCode launcher - self.create_launcher( - "VS Code.exe", - "code.ico", - command="wscript.exe", - args=r"Noshell.vbs winvscode.bat", - ) - # 2025-01-04: copy launchers premade per the Datalab-Python way portable_dir = str(Path(__file__).resolve().parent / "portable" / "launchers_final") for path in Path(portable_dir).rglob('*.exe'): @@ -1307,7 +1114,10 @@ def make( ) # Create/re-create the WinPython base directory self._print(f"Creating WinPython {my_winpydir} base directory") if Path(self.winpydir).is_dir() and remove_existing and not self.simulation: - shutil.rmtree(self.winpydir, onexc=utils.onerror) + try: + shutil.rmtree(self.winpydir, onexc=utils.onerror) + except TypeError: # before 3.12 + shutil.rmtree(self.winpydir, onerror=utils.onerror) if not Path(self.winpydir).is_dir(): os.mkdir(self.winpydir) if remove_existing and not self.simulation: diff --git a/portable/launcher_basic.nsi b/portable/launcher_basic.nsi deleted file mode 100644 index cb1670b3..00000000 --- a/portable/launcher_basic.nsi +++ /dev/null @@ -1,44 +0,0 @@ -/* WinPython launcher template script -Copyright 2012 Pierre Raybaut -Licensed under the terms of the MIT License -(see winpython/__init__.py for details) -*/ -;================================================================ -; These lines are automatically filled when winpython/make.py creates launchers: -!addincludedir "" -!define COMMAND "" -!define PARAMETERS "" -!define WORKDIR "" -Icon "" -OutFile "" -;================================================================ -# Standard NSIS plugins -!include "WordFunc.nsh" -!include "FileFunc.nsh" - -SilentInstall silent -AutoCloseWindow true -ShowInstDetails nevershow -RequestExecutionLevel user - -Section "" -Call Execute -SectionEnd - -Function Execute -;Set working Directory =========================== -StrCmp ${WORKDIR} "" 0 workdir -System::Call "kernel32::GetCurrentDirectory(i ${NSIS_MAX_STRLEN}, t .r0)" -SetOutPath $0 -Goto end_workdir -workdir: -SetOutPath "${WORKDIR}" -end_workdir: -;Get Command line parameters ===================== -${GetParameters} $R1 -StrCmp "${PARAMETERS}" "" end_param 0 -StrCpy $R1 "${PARAMETERS} $R1" -end_param: -;===== Execution ================================= -Exec '"${COMMAND}" $R1' -FunctionEnd \ No newline at end of file From e1b0fbfe104e9dc4280f6ab33aee3647df0fdd84 Mon Sep 17 00:00:00 2001 From: stonebig Date: Sun, 5 Jan 2025 00:15:46 +0100 Subject: [PATCH 043/305] remove last vbs code --- make.py | 17 ----------------- 1 file changed, 17 deletions(-) diff --git a/make.py b/make.py index ad600c75..0e3d0a24 100644 --- a/make.py +++ b/make.py @@ -674,23 +674,6 @@ def _create_batch_scripts_initial(self): do_changes=changes, ) - self.create_batch_script( - "Noshell.vbs", - r""" -'from http://superuser.com/questions/140047/how-to-run-a-batch-file-without-launching-a-command-window/390129 -If WScript.Arguments.Count >= 1 Then - ReDim arr(WScript.Arguments.Count-1) - For i = 0 To WScript.Arguments.Count-1 - Arg = WScript.Arguments(i) - If InStr(Arg, " ") > 0 or InStr(Arg, "&") > 0 Then Arg = chr(34) & Arg & chr(34) - arr(i) = Arg - Next - - RunCmd = Join(arr) - CreateObject("Wscript.Shell").Run RunCmd, 0 , True -End If - """, - ) self.create_batch_script( "WinPythonIni.py", # Replaces winpython.vbs, and a bit of env.bat From 031e7d1994dad7613fabf05ad09d94b461f15c7e Mon Sep 17 00:00:00 2001 From: stonebig Date: Sun, 5 Jan 2025 09:01:28 +0100 Subject: [PATCH 044/305] remove dead py_arch() and WINPYARCH code --- make.py | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/make.py b/make.py index 0e3d0a24..5b769f87 100644 --- a/make.py +++ b/make.py @@ -251,15 +251,6 @@ def winpy_arch(self): """Return WinPython architecture""" return f"{self.distribution.architecture}" - @property - def py_arch(self): - """Return distribution architecture, in Python distutils format: - win-amd64 or win32""" - if self.distribution.architecture == 64: - return "win-amd64" - else: - return "win32" - @property def prepath(self): """Return PATH contents to be prepend to the environment variable""" @@ -511,8 +502,6 @@ def _create_batch_scripts_initial(self): set JUPYTER_DATA_DIR=%HOME% set JUPYTER_CONFIG_DIR=%WINPYDIR%\etc\jupyter set JUPYTER_CONFIG_PATH=%WINPYDIR%\etc\jupyter -set WINPYARCH=WIN32 -if "%WINPYDIR:~-5%"=="amd64" set WINPYARCH=WIN-AMD64 set FINDDIR=%WINDIR%\system32 echo ";%PATH%;" | %FINDDIR%\find.exe /C /I ";%WINPYDIR%\;" >nul if %ERRORLEVEL% NEQ 0 ( @@ -572,9 +561,6 @@ def _create_batch_scripts_initial(self): $env:WINPYDIRBASE = "" $env:JUPYTER_DATA_DIR = "$env:HOME" -$env:WINPYARCH = 'WIN32' -if ($env:WINPYARCH.subString($env:WINPYARCH.length-5, 5) -eq 'amd64') { - $env:WINPYARCH = 'WIN-AMD64' } if (-not $env:PATH.ToLower().Contains(";"+ $env:WINPYDIR.ToLower()+ ";")) { $env:PATH = """ From 3cbe5f5cfa9b80df61e2d6d0d5bacbcc6ba9b445 Mon Sep 17 00:00:00 2001 From: stonebig Date: Sun, 5 Jan 2025 14:29:54 +0100 Subject: [PATCH 045/305] remove Python-2 code path less useless lines to maintain, suggestion from @firai --- winpython/utils.py | 26 +++++++++----------------- 1 file changed, 9 insertions(+), 17 deletions(-) diff --git a/winpython/utils.py b/winpython/utils.py index 9a26e3f0..8dd65720 100644 --- a/winpython/utils.py +++ b/winpython/utils.py @@ -367,20 +367,16 @@ def patch_shebang_line( + '\\' ) executable = sys.executable - if sys.version_info[0] == 2: - shebang_line = re.compile( - r"""(#!.*pythonw?\.exe)"?""" - ) # Python2.7 - else: + + shebang_line = re.compile( + rb"""(#!.*pythonw?\.exe)"?""" + ) # Python3+ + if 'pypy3' in sys.executable: shebang_line = re.compile( - rb"""(#!.*pythonw?\.exe)"?""" - ) # Python3+ - if 'pypy3' in sys.executable: - shebang_line = re.compile( - rb"""(#!.*pypy3w?\.exe)"?""" - ) # Pypy3+ - - target_dir = target_dir.encode('utf-8') + rb"""(#!.*pypy3w?\.exe)"?""" + ) # Pypy3+ + target_dir = target_dir.encode('utf-8') + with open(fname, 'rb') as fh: initial_content = fh.read() fh.close @@ -415,10 +411,6 @@ def patch_shebang_line_py( import re import sys - if sys.version_info[0] == 2: - # Python 2.x doesn't create .py files for .exe files. So, Moving - # WinPython doesn't break running executable files. - return if to_movable: exec_path = r'#!.\python.exe' if 'pypy3' in sys.executable: # PyPy ! From ddc42672f4994fb5a8f0e13819747bd33a668853 Mon Sep 17 00:00:00 2001 From: stonebig Date: Sun, 5 Jan 2025 14:58:57 +0100 Subject: [PATCH 046/305] a try of the newer "black" formatter --- winpython/utils.py | 110 +++++++++++++++------------------------------ 1 file changed, 36 insertions(+), 74 deletions(-) diff --git a/winpython/utils.py b/winpython/utils.py index 8dd65720..5269fec6 100644 --- a/winpython/utils.py +++ b/winpython/utils.py @@ -267,39 +267,27 @@ def exec_run_cmd(args, path=None): def get_r_version(path): """Return version of the R installed in *path*""" - return ( - exec_shell_cmd(r'dir ..\README.R*', path) - .splitlines()[-3] - .split("-")[-1] - ) + return exec_shell_cmd(r"dir ..\README.R*", path).splitlines()[-3].split("-")[-1] def get_julia_version(path): """Return version of the Julia installed in *path*""" - return ( - exec_shell_cmd('julia.exe -v', path) - .splitlines()[0] - .split(" ")[-1] - ) + return exec_shell_cmd("julia.exe -v", path).splitlines()[0].split(" ")[-1] def get_nodejs_version(path): """Return version of the Nodejs installed in *path*""" - return exec_shell_cmd('node -v', path).splitlines()[0] + return exec_shell_cmd("node -v", path).splitlines()[0] def get_npmjs_version(path): """Return version of the Nodejs installed in *path*""" - return exec_shell_cmd('npm -v', path).splitlines()[0] + return exec_shell_cmd("npm -v", path).splitlines()[0] def get_pandoc_version(path): """Return version of the Pandoc executable in *path*""" - return ( - exec_shell_cmd('pandoc -v', path) - .splitlines()[0] - .split(" ")[-1] - ) + return exec_shell_cmd("pandoc -v", path).splitlines()[0].split(" ")[-1] def python_query(cmd, path): @@ -307,8 +295,10 @@ def python_query(cmd, path): the_exe = get_python_executable(path) # debug2021-09-12 # print(f'"{the_exe}" -c "{cmd}"', ' * ', path) + return exec_shell_cmd(f'"{the_exe}" -c "{cmd}"', path).splitlines()[0] + def python_execmodule(cmd, path): """Execute Python command using the Python interpreter located in *path*""" the_exe = get_python_executable(path) @@ -319,18 +309,14 @@ def get_python_infos(path): """Return (version, architecture) for the Python distribution located in *path*. The version number is limited to MAJOR.MINOR, the architecture is an integer: 32 or 64""" - is_64 = python_query( - 'import sys; print(sys.maxsize > 2**32)', path - ) - arch = {'True': 64, 'False': 32}.get(is_64, None) + is_64 = python_query("import sys; print(sys.maxsize > 2**32)", path) + arch = {"True": 64, "False": 32}.get(is_64, None) ver = python_query( - "import sys;print(f'{sys.version_info.major}.{sys.version_info.minor}')" - , + "import sys;print(f'{sys.version_info.major}.{sys.version_info.minor}')", path, ) - if re.match(r'([0-9]*)\.([0-9]*)', ver) is None: + if re.match(r"([0-9]*)\.([0-9]*)", ver) is None: ver = None - return ver, arch @@ -338,21 +324,15 @@ def get_python_long_version(path): """Return long version (X.Y.Z) for the Python distribution located in *path*""" ver = python_query( - "import sys; print(f'{sys.version_info.major}.{sys.version_info.minor}.{sys.version_info.micro}')" - , + "import sys; print(f'{sys.version_info.major}.{sys.version_info.minor}.{sys.version_info.micro}')", path, ) - if ( - re.match(r'([0-9]*)\.([0-9]*)\.([0-9]*)', ver) - is None - ): + if re.match(r"([0-9]*)\.([0-9]*)\.([0-9]*)", ver) is None: ver = None return ver -def patch_shebang_line( - fname, pad=b' ', to_movable=True, targetdir="" -): +def patch_shebang_line(fname, pad=b" ", to_movable=True, targetdir=""): """Remove absolute path to python.exe in shebang lines in binary files, or re-add it""" import re @@ -362,39 +342,28 @@ def patch_shebang_line( target_dir = targetdir # movable option if to_movable == False: target_dir = os.path.abspath(os.path.dirname(fname)) - target_dir = ( - os.path.abspath(os.path.join(target_dir, r'..')) - + '\\' - ) + target_dir = os.path.abspath(os.path.join(target_dir, r"..")) + "\\" executable = sys.executable - shebang_line = re.compile( - rb"""(#!.*pythonw?\.exe)"?""" - ) # Python3+ - if 'pypy3' in sys.executable: - shebang_line = re.compile( - rb"""(#!.*pypy3w?\.exe)"?""" - ) # Pypy3+ - target_dir = target_dir.encode('utf-8') + shebang_line = re.compile(rb"""(#!.*pythonw?\.exe)"?""") # Python3+ + if "pypy3" in sys.executable: + shebang_line = re.compile(rb"""(#!.*pypy3w?\.exe)"?""") # Pypy3+ + target_dir = target_dir.encode("utf-8") - with open(fname, 'rb') as fh: + with open(fname, "rb") as fh: initial_content = fh.read() fh.close fh = None - content = shebang_line.split( - initial_content, maxsplit=1 - ) + content = shebang_line.split(initial_content, maxsplit=1) if len(content) != 3: return exe = os.path.basename(content[1][2:]) - content[1] = ( - b'#!' + target_dir + exe - ) # + (pad * (len(content[1]) - len(exe) - 2)) - final_content = b''.join(content) + content[1] = b"#!" + target_dir + exe # + (pad * (len(content[1]) - len(exe) - 2)) + final_content = b"".join(content) if initial_content == final_content: return try: - with open(fname, 'wb') as fo: + with open(fname, "wb") as fo: fo.write(final_content) fo.close fo = None @@ -403,9 +372,8 @@ def patch_shebang_line( print("failed to patch", fname) -def patch_shebang_line_py( - fname, to_movable=True, targetdir="" -): +def patch_shebang_line_py(fname, to_movable=True, targetdir=""): + """Changes shebang line in '.py' file to relative or absolue path""" """Changes shebang line in '.py' file to relative or absolue path""" import fileinput import re @@ -443,9 +411,7 @@ def guess_encoding(csv_file): return [locale.getdefaultlocale()[1], "utf-8"] -def patch_sourcefile( - fname, in_text, out_text, silent_mode=False -): +def patch_sourcefile(fname, in_text, out_text, silent_mode=False): """Replace a string in a source file""" import io @@ -472,15 +438,15 @@ def patch_sourcelines( fname, in_line_start, out_line, - endline='\n', + endline="\n", silent_mode=False, ): - """Replace the middle of lines between in_line_start and endline """ + """Replace the middle of lines between in_line_start and endline""" import io if Path(fname).is_file(): the_encoding = guess_encoding(fname)[0] - with io.open(fname, 'r', encoding=the_encoding) as fh: + with io.open(fname, "r", encoding=the_encoding) as fh: contents = fh.readlines() content = "".join(contents) for l in range(len(contents)): @@ -491,9 +457,7 @@ def patch_sourcelines( ) ending = "" if middle.find(endline) > 0: - ending = endline + endline.join( - middle.split(endline)[1:] - ) + ending = endline + endline.join(middle.split(endline)[1:]) middle = middle.split(endline)[0] middle = out_line new_line = begining + middle + ending @@ -512,7 +476,8 @@ def patch_sourcelines( if not new_content == content: # if not silent_mode: # print("patching ", fname, "from", content, "to", new_content) - with io.open(fname, 'wt', encoding=the_encoding) as fh: + + with io.open(fname, "wt", encoding=the_encoding) as fh: try: fh.write(new_content) except: @@ -663,10 +628,10 @@ def direct_pip_install( assert Path(python_exe).is_file() myroot = str(Path(python_exe).parent) - cmd = [python_exe, '-m', 'pip', 'install'] + cmd = [python_exe, "-m", "pip", "install"] if install_options: cmd += install_options # typically ['--no-deps'] - print('python -m pip install_options', install_options) + print("python -m pip install_options", install_options) cmd += [fname] if verbose: @@ -681,10 +646,7 @@ def direct_pip_install( stdout, stderr = p.communicate() the_log = f"{stdout}" + f"\n {stderr}" - if ( - ' not find ' in the_log - or ' not found ' in the_log - ): + if " not find " in the_log or " not found " in the_log: print(f"Failed to Install: \n {fname} \n") print(f"msg: {the_log}") raise RuntimeError From 8be8f727f30bc60a2b3b4c91179d87e008bc3a92 Mon Sep 17 00:00:00 2001 From: stonebig Date: Sun, 5 Jan 2025 16:26:03 +0100 Subject: [PATCH 047/305] more clarity of where are licence files --- make.py | 6 +++--- portable/build_my_launchers.bat | 5 +++-- portable/installer_7zip.bat | 3 ++- portable/launchers_src/launcher_template_CONSOLE.cpp | 2 +- portable/launchers_src/launcher_template_WINDOWS.cpp | 2 +- 5 files changed, 10 insertions(+), 8 deletions(-) diff --git a/make.py b/make.py index 5b769f87..d8959b7d 100644 --- a/make.py +++ b/make.py @@ -87,7 +87,6 @@ def build_7zip(srcname, dstname, data): ) except OSError as e: print("Execution failed:", e, file=sys.stderr) - # os.remove(dstname) class WinPythonDistribution(object): @@ -448,6 +447,8 @@ def _create_launchers(self): for path in Path(portable_dir).rglob('*.exe'): shutil.copy2(path, Path(self.winpydir) ) print("new way !!!!!!!!!!!!!!!!!! ", path , " -> ",Path(self.winpydir)) + for path in (Path(__file__).resolve().parent / "portable").rglob('licence*.*'): + shutil.copy2(path, Path(self.winpydir) ) self._print_done() @@ -1000,7 +1001,7 @@ def _create_batch_scripts(self): r"""@echo off rem launcher for VScode call "%~dp0env_for_icons.bat" -rem cd/D "%WINPYWORKDIR1%" +cd/D "%WINPYWORKDIR1%" if exist "%WINPYDIR%\..\t\vscode\code.exe" ( "%WINPYDIR%\..\t\vscode\code.exe" %* ) else ( @@ -1011,7 +1012,6 @@ def _create_batch_scripts(self): )) """, ) - def _run_complement_batch_scripts(self, this_batch="run_complement.bat"): diff --git a/portable/build_my_launchers.bat b/portable/build_my_launchers.bat index 51ebeb0e..04c4671e 100644 --- a/portable/build_my_launchers.bat +++ b/portable/build_my_launchers.bat @@ -1,5 +1,6 @@ -rem build lmaunchers in WINDOWS and CONSOLE version -rem tweaked from @datalab-winpython provided code +rem build launchers in WINDOWS and CONSOLE version +rem tweaked from @datalab-winpython provided code in \launchers_src +rem @datalab-winpython licence is in \launchers_src\LICENCE @echo off set VCVARS_PATH="C:\Program Files (x86)\Microsoft Visual Studio\2022\BuildTools\VC\Auxiliary\Build\vcvars64.bat" diff --git a/portable/installer_7zip.bat b/portable/installer_7zip.bat index c19e7ab7..0b308f2a 100644 --- a/portable/installer_7zip.bat +++ b/portable/installer_7zip.bat @@ -43,7 +43,8 @@ rem 7-zip uncompress the directory compressed %DISTDIR% (no option to change it rem ================================================================ rem 2019-03-16 copy license at source (due to 7zip limitations) -copy/Y %PORTABLE_DIR%\license.txt %DISTDIR%\license.txt +REM 2025-01-05 done in make.py +rem copy/Y %PORTABLE_DIR%\license.txt %DISTDIR%\license.txt rem ================================================================ diff --git a/portable/launchers_src/launcher_template_CONSOLE.cpp b/portable/launchers_src/launcher_template_CONSOLE.cpp index 4f1d96b4..93614b9e 100644 --- a/portable/launchers_src/launcher_template_CONSOLE.cpp +++ b/portable/launchers_src/launcher_template_CONSOLE.cpp @@ -3,7 +3,7 @@ DataLab-WinPython launcher script --------------------------------- Licensed under the terms of the BSD 3-Clause -(see ../LICENSE for details) +(see ./LICENSE for details) */ diff --git a/portable/launchers_src/launcher_template_WINDOWS.cpp b/portable/launchers_src/launcher_template_WINDOWS.cpp index 511e2574..9c878be6 100644 --- a/portable/launchers_src/launcher_template_WINDOWS.cpp +++ b/portable/launchers_src/launcher_template_WINDOWS.cpp @@ -3,7 +3,7 @@ DataLab-WinPython launcher script --------------------------------- Licensed under the terms of the BSD 3-Clause -(see ../LICENSE for details) +(see ./LICENSE for details) */ From 92dfa27fcadf8fe7ed101e389881223459bfb20e Mon Sep 17 00:00:00 2001 From: stonebig Date: Sat, 18 Jan 2025 18:37:57 +0100 Subject: [PATCH 048/305] simplify launcher .bat layer --- make.py | 16 ---------------- 1 file changed, 16 deletions(-) diff --git a/make.py b/make.py index d8959b7d..45556773 100644 --- a/make.py +++ b/make.py @@ -843,16 +843,12 @@ def _create_batch_scripts(self): "cmd.bat", r"""@echo off call "%~dp0env_for_icons.bat" -if not "%WINPYWORKDIR%"=="%WINPYWORKDIR1%" cd %WINPYWORKDIR1% cmd.exe /k""", ) self.create_batch_script( "WinPython_Terminal.bat", r"""@echo off -rem call "%~dp0env_for_icons.bat" -rem if not "%WINPYWORKDIR%"=="%WINPYWORKDIR1%" cd %WINPYWORKDIR1% -rem "%USERPROFILE%\AppData\Local\Microsoft\WindowsApps\wt.exe" Powershell.exe -Command "& {Start-Process PowerShell.exe -ArgumentList '-ExecutionPolicy RemoteSigned -noexit -File ""%~dp0WinPython_PS_Prompt.ps1""'}" exit """, @@ -862,8 +858,6 @@ def _create_batch_scripts(self): "python.bat", r"""@echo off call "%~dp0env_for_icons.bat" -rem backward compatibility for python command-line users -if not "%WINPYWORKDIR%"=="%WINPYWORKDIR1%" cd %WINPYWORKDIR1% "%WINPYDIR%\python.exe" %* """, do_changes=changes, @@ -873,7 +867,6 @@ def _create_batch_scripts(self): "winpython.bat", r"""@echo off call "%~dp0env_for_icons.bat" -cd/D "%WINPYWORKDIR1%" rem backward compatibility for non-ptpython users if exist "%WINPYDIR%\scripts\ptpython.exe" ( "%WINPYDIR%\scripts\ptpython.exe" %* @@ -888,7 +881,6 @@ def _create_batch_scripts(self): "winidle.bat", r"""@echo off call "%~dp0env_for_icons.bat" -cd/D "%WINPYWORKDIR1%" "%WINPYDIR%\python.exe" "%WINPYDIR%\Lib\idlelib\idle.pyw" %* """, do_changes=changes, @@ -898,7 +890,6 @@ def _create_batch_scripts(self): "winspyder.bat", r"""@echo off call "%~dp0env_for_icons.bat" -rem cd/D "%WINPYWORKDIR%" "%WINPYDIR%\scripts\spyder.exe" %* -w "%WINPYWORKDIR1%" """, ) @@ -907,7 +898,6 @@ def _create_batch_scripts(self): "spyder_reset.bat", r"""@echo off call "%~dp0env_for_icons.bat" -cd/D "%WINPYWORKDIR1%" "%WINPYDIR%\scripts\spyder.exe" --reset %* """, ) @@ -916,7 +906,6 @@ def _create_batch_scripts(self): "winipython_notebook.bat", r"""@echo off call "%~dp0env_for_icons.bat" -cd/D "%WINPYWORKDIR1%" "%WINPYDIR%\scripts\jupyter-notebook.exe" %* """, ) @@ -925,7 +914,6 @@ def _create_batch_scripts(self): "winjupyter_lab.bat", r"""@echo off call "%~dp0env_for_icons.bat" -cd/D "%WINPYWORKDIR1%" "%WINPYDIR%\scripts\jupyter-lab.exe" %* """, ) @@ -934,7 +922,6 @@ def _create_batch_scripts(self): "winqtconsole.bat", r"""@echo off call "%~dp0env_for_icons.bat" -cd/D "%WINPYWORKDIR1%" "%WINPYDIR%\scripts\jupyter-qtconsole.exe" %* """, ) @@ -969,7 +956,6 @@ def _create_batch_scripts(self): "wpcp.bat", r"""@echo off call "%~dp0env_for_icons.bat" -if not "%WINPYWORKDIR%"=="%WINPYWORKDIR1%" cd/d %WINPYWORKDIR1% cmd.exe /k "echo wppm & wppm" """, do_changes=changes, @@ -999,9 +985,7 @@ def _create_batch_scripts(self): self.create_batch_script( "winvscode.bat", r"""@echo off -rem launcher for VScode call "%~dp0env_for_icons.bat" -cd/D "%WINPYWORKDIR1%" if exist "%WINPYDIR%\..\t\vscode\code.exe" ( "%WINPYDIR%\..\t\vscode\code.exe" %* ) else ( From 1be64f63bc8fe65cb37f3c0271d8bab7c1371820 Mon Sep 17 00:00:00 2001 From: stonebig Date: Sat, 18 Jan 2025 20:09:12 +0100 Subject: [PATCH 049/305] trying handle better drag&drop --- make.py | 30 ++++++++++++++++-------------- 1 file changed, 16 insertions(+), 14 deletions(-) diff --git a/make.py b/make.py index 45556773..86ca2b17 100644 --- a/make.py +++ b/make.py @@ -612,12 +612,12 @@ def _create_batch_scripts_initial(self): "env_for_icons.bat", r"""@echo off call "%~dp0env.bat" -set WINPYWORKDIR=%WINPYDIRBASE%\Notebooks rem default is as before: Winpython ..\Notebooks +set WINPYWORKDIR=%WINPYDIRBASE%\Notebooks set WINPYWORKDIR1=%WINPYWORKDIR% -rem if we have a file or directory in %1 parameter, we use that directory +rem if we have a file or directory in %1 parameter, we use that directory to define WINPYWORKDIR1 if not "%~1"=="" ( if exist "%~1" ( if exist "%~1\" ( @@ -641,11 +641,13 @@ def _create_batch_scripts_initial(self): %winpythontoexec%set winpythontoexec= -rem 2024-08-18: we go initial directory WINPYWORKDIR if no direction and we are on icon directory +rem 2025-01-18: we go directory WINPYWORKDIR1 if we are on icon or script directory +rem nota: WINPYWORKDRI1 can have be overwriten per winpython.ini + rem old NSIS launcher is by default at icon\scripts level -if "%__CD__%scripts\"=="%~dp0" if "%WINPYWORKDIR1%"=="%WINPYDIRBASE%\Notebooks" cd/D %WINPYWORKDIR1% +if "%__CD__%scripts\"=="%~dp0" cd/D %WINPYWORKDIR1% rem new shimmy launcher is by default at icon level -if "%__CD__%"=="%~dp0" if "%WINPYWORKDIR1%"=="%WINPYDIRBASE%\Notebooks" cd/D %WINPYWORKDIR1% +if "%__CD__%"=="%~dp0" cd/D %WINPYWORKDIR1% rem ****************** @@ -842,7 +844,7 @@ def _create_batch_scripts(self): self.create_batch_script( "cmd.bat", r"""@echo off -call "%~dp0env_for_icons.bat" +call "%~dp0env_for_icons.bat" %* cmd.exe /k""", ) @@ -857,7 +859,7 @@ def _create_batch_scripts(self): self.create_batch_script( "python.bat", r"""@echo off -call "%~dp0env_for_icons.bat" +call "%~dp0env_for_icons.bat" %* "%WINPYDIR%\python.exe" %* """, do_changes=changes, @@ -866,7 +868,7 @@ def _create_batch_scripts(self): self.create_batch_script( "winpython.bat", r"""@echo off -call "%~dp0env_for_icons.bat" +call "%~dp0env_for_icons.bat" %* rem backward compatibility for non-ptpython users if exist "%WINPYDIR%\scripts\ptpython.exe" ( "%WINPYDIR%\scripts\ptpython.exe" %* @@ -880,7 +882,7 @@ def _create_batch_scripts(self): self.create_batch_script( "winidle.bat", r"""@echo off -call "%~dp0env_for_icons.bat" +call "%~dp0env_for_icons.bat" %* "%WINPYDIR%\python.exe" "%WINPYDIR%\Lib\idlelib\idle.pyw" %* """, do_changes=changes, @@ -889,7 +891,7 @@ def _create_batch_scripts(self): self.create_batch_script( "winspyder.bat", r"""@echo off -call "%~dp0env_for_icons.bat" +call "%~dp0env_for_icons.bat" %* "%WINPYDIR%\scripts\spyder.exe" %* -w "%WINPYWORKDIR1%" """, ) @@ -905,7 +907,7 @@ def _create_batch_scripts(self): self.create_batch_script( "winipython_notebook.bat", r"""@echo off -call "%~dp0env_for_icons.bat" +call "%~dp0env_for_icons.bat" %* "%WINPYDIR%\scripts\jupyter-notebook.exe" %* """, ) @@ -913,7 +915,7 @@ def _create_batch_scripts(self): self.create_batch_script( "winjupyter_lab.bat", r"""@echo off -call "%~dp0env_for_icons.bat" +call "%~dp0env_for_icons.bat" %* "%WINPYDIR%\scripts\jupyter-lab.exe" %* """, ) @@ -921,7 +923,7 @@ def _create_batch_scripts(self): self.create_batch_script( "winqtconsole.bat", r"""@echo off -call "%~dp0env_for_icons.bat" +call "%~dp0env_for_icons.bat" %* "%WINPYDIR%\scripts\jupyter-qtconsole.exe" %* """, ) @@ -955,7 +957,7 @@ def _create_batch_scripts(self): self.create_batch_script( "wpcp.bat", r"""@echo off -call "%~dp0env_for_icons.bat" +call "%~dp0env_for_icons.bat" %* cmd.exe /k "echo wppm & wppm" """, do_changes=changes, From cda166173bea43b34dc9ce07ac978ddd2628338b Mon Sep 17 00:00:00 2001 From: stonebig Date: Sun, 19 Jan 2025 12:55:33 +0100 Subject: [PATCH 050/305] cleaner logic in env_for_icons.bat --- make.py | 30 ++++++++++++++---------------- winpython/__init__.py | 2 +- 2 files changed, 15 insertions(+), 17 deletions(-) diff --git a/make.py b/make.py index 86ca2b17..2faa6e11 100644 --- a/make.py +++ b/make.py @@ -473,8 +473,8 @@ def _create_batch_scripts_initial(self): "env.bat", r"""@echo off set WINPYDIRBASE=%~dp0.. -rem set PYTHONUTF8=1 would create issues in "movable" patching -rem get a normalize path + +rem get a normalized path set WINPYDIRBASETMP=%~dp0.. pushd %WINPYDIRBASETMP% set WINPYDIRBASE=%__CD__% @@ -492,14 +492,16 @@ def _create_batch_scripts_initial(self): set WINPYVER=""" + self.winpyver + r""" -rem 2023-02-12 try utf-8 on console + +rem 2023-02-12 utf-8 on console to avoid pip crash rem see https://github.com/pypa/pip/issues/11798#issuecomment-1427069681 set PYTHONIOENCODING=utf-8 +rem set PYTHONUTF8=1 creates issues in "movable" patching + set HOME=%WINPYDIRBASE%\settings -rem read https://github.com/winpython/winpython/issues/839 +rem see https://github.com/winpython/winpython/issues/839 rem set USERPROFILE=%HOME% -rem set WINPYDIRBASE= set JUPYTER_DATA_DIR=%HOME% set JUPYTER_CONFIG_DIR=%WINPYDIR%\etc\jupyter set JUPYTER_CONFIG_PATH=%WINPYDIR%\etc\jupyter @@ -637,24 +639,20 @@ def _create_batch_scripts_initial(self): rem remove some potential last \ if "%WINPYWORKDIR1:~-1%"=="\" set WINPYWORKDIR1=%WINPYWORKDIR1:~0,-1% +rem you can use winpython.ini to change defaults FOR /F "delims=" %%i IN ('""%WINPYDIR%\python.exe" "%~dp0WinpythonIni.py""') DO set winpythontoexec=%%i - %winpythontoexec%set winpythontoexec= -rem 2025-01-18: we go directory WINPYWORKDIR1 if we are on icon or script directory -rem nota: WINPYWORKDRI1 can have be overwriten per winpython.ini -rem old NSIS launcher is by default at icon\scripts level -if "%__CD__%scripts\"=="%~dp0" cd/D %WINPYWORKDIR1% -rem new shimmy launcher is by default at icon level -if "%__CD__%"=="%~dp0" cd/D %WINPYWORKDIR1% +rem Preventive Working Directories creation if needed +if not "%WINPYWORKDIR%"=="" if not exist "%WINPYWORKDIR%" mkdir "%WINPYWORKDIR%" +if not "%WINPYWORKDIR1%"=="" if not exist "%WINPYWORKDIR1%" mkdir "%WINPYWORKDIR1%" -rem ****************** -rem missing student directory part -rem ****************** +rem Change of directory only if we are in a launcher directory +if "%__CD__%scripts\"=="%~dp0" cd/D %WINPYWORKDIR1% +if "%__CD__%"=="%~dp0" cd/D %WINPYWORKDIR1% -if not exist "%WINPYWORKDIR%" mkdir "%WINPYWORKDIR%" if not exist "%HOME%\.spyder-py%WINPYVER:~0,1%" mkdir "%HOME%\.spyder-py%WINPYVER:~0,1%" if not exist "%HOME%\.spyder-py%WINPYVER:~0,1%\workingdir" echo %HOME%\Notebooks>"%HOME%\.spyder-py%WINPYVER:~0,1%\workingdir" diff --git a/winpython/__init__.py b/winpython/__init__.py index fc7536db..5985a4c8 100644 --- a/winpython/__init__.py +++ b/winpython/__init__.py @@ -28,6 +28,6 @@ OTHER DEALINGS IN THE SOFTWARE. """ -__version__ = '11.3.20250104' +__version__ = '11.4.20250119' __license__ = __doc__ __project_url__ = 'http://winpython.github.io/' From 7aee797a6461e1cc4d918bfdf4c2504c43de449a Mon Sep 17 00:00:00 2001 From: stonebig Date: Sun, 26 Jan 2025 11:08:41 +0100 Subject: [PATCH 051/305] remove un-used "simulation" option --- make.py | 70 ++++++++++++++----------------------------- winpython/__init__.py | 2 +- 2 files changed, 23 insertions(+), 49 deletions(-) diff --git a/make.py b/make.py index 2faa6e11..3320a8f9 100644 --- a/make.py +++ b/make.py @@ -72,7 +72,7 @@ def build_7zip(srcname, dstname, data): ] + list(data) replace_in_7zip_file(dstname, data) try: - # insted of a 7zip command line, we launch a script that does it + # instead of a 7zip command line, we launch a script that does it # retcode = subprocess.call(f'"{SEVENZIP_EXE}" "{dstname}"'), retcode = subprocess.call( f'"{dstname}" ', @@ -103,7 +103,6 @@ def __init__( wheeldir, toolsdirs=None, verbose=False, - simulation=False, basedir=None, install_options=None, flavor="", @@ -125,7 +124,6 @@ def __init__( self.winpydir = None # new WinPython BaseDirectory self.distribution = None self.installed_packages = [] - self.simulation = simulation self.basedir = basedir # added to build from winpython self.install_options = install_options self.flavor = flavor @@ -148,26 +146,14 @@ def package_index_wiki(self): installed_tools = [] def get_tool_path_file(relpath): - if self.simulation: - for dirname in self.toolsdirs: - path = dirname + relpath.replace(r"\t", "") - if Path(path).is_file(): - return path - else: - path = self.winpydir + relpath - if Path(path).is_file(): - return path + path = self.winpydir + relpath + if Path(path).is_file(): + return path def get_tool_path_dir(relpath): - if self.simulation: - for dirname in self.toolsdirs: - path = dirname + relpath.replace(r"\t", "") - if Path(path).is_dir(): - return path - else: - path = self.winpydir + relpath - if Path(path).is_dir(): - return path + path = self.winpydir + relpath + if Path(path).is_dir(): + return path juliapath = get_tool_path_dir(self.JULIA_PATH) if juliapath is not None: @@ -1043,18 +1029,13 @@ def make( remove_existing=True, requirements=None, my_winpydir=None, - ): # , find_links=None): + ): """Make WinPython distribution in target directory from the installers located in wheeldir remove_existing=True: (default) install all from scratch remove_existing=False: only for test purpose (launchers/scripts) requirements=file(s) of requirements (separated by space if several)""" - if self.simulation: - print( - "WARNING: this is just a simulation!", - file=sys.stderr, - ) print( self.python_fname, self.python_name, @@ -1066,14 +1047,14 @@ def make( Path(self.target) / my_winpydir ) # Create/re-create the WinPython base directory self._print(f"Creating WinPython {my_winpydir} base directory") - if Path(self.winpydir).is_dir() and remove_existing and not self.simulation: + if Path(self.winpydir).is_dir() and remove_existing: try: shutil.rmtree(self.winpydir, onexc=utils.onerror) except TypeError: # before 3.12 shutil.rmtree(self.winpydir, onerror=utils.onerror) if not Path(self.winpydir).is_dir(): os.mkdir(self.winpydir) - if remove_existing and not self.simulation: + if remove_existing: # Create settings directory # (only necessary if user is starting an application with a batch # scripts before using an executable launcher, because the latter @@ -1083,7 +1064,7 @@ def make( os.mkdir(str(Path(self.winpydir) / "settings" / "AppData" / "Roaming")) self._print_done() - if remove_existing and not self.simulation: + if remove_existing: self._extract_python() # unzip Python interpreter self.distribution = wppm.Distribution( self.python_dir, @@ -1108,10 +1089,9 @@ def make( ) if remove_existing: - if not self.simulation: - self._create_batch_scripts_initial() - self._create_batch_scripts() - self._create_launchers() + self._create_batch_scripts_initial() + self._create_batch_scripts() + self._create_launchers() # PyPy must ensure pip via: "pypy3.exe -m ensurepip" utils.python_execmodule("ensurepip", self.distribution.target) @@ -1125,11 +1105,8 @@ def make( self._print(f"piping {' '.join(actions)}") self.distribution.do_pip_action(actions) self.distribution.patch_standard_packages(req) - print("self.simulation:", self.simulation) - if not self.simulation: - self._copy_dev_tools() - self._copy_dev_docs() - if not self.simulation: + self._copy_dev_tools() + self._copy_dev_docs() if requirements: if not list(requirements) == requirements: @@ -1143,7 +1120,7 @@ def make( self.distribution.do_pip_action(actions) self._run_complement_batch_scripts() self.distribution.patch_standard_packages() - if remove_existing and not self.simulation: + if remove_existing: self._print("Cleaning up distribution") self.distribution.clean_up() self._print_done() @@ -1213,7 +1190,6 @@ def make_all( verbose=False, remove_existing=True, create_installer=True, - simulation=False, install_options=["--no-index"], flavor="", requirements=None, @@ -1280,7 +1256,6 @@ def make_all( wheeldir, toolsdirs, verbose=verbose, - simulation=simulation, basedir=basedir, install_options=install_options + find_list, flavor=flavor, @@ -1321,14 +1296,13 @@ def make_all( requirements=requirements, my_winpydir=my_winpydir, ) - # ,find_links=osp.join(basedir, 'packages.srcreq')) - if str(create_installer).lower() != "false" and not simulation: - if "7zip" in str(create_installer).lower(): - dist.create_installer_7zip(".exe") - if ".7z" in str(create_installer).lower(): - dist.create_installer_7zip(".7z") + if str(create_installer).lower() != "false": if ".zip" in str(create_installer).lower(): dist.create_installer_7zip(".zip") + if ".7z" in str(create_installer).lower(): + dist.create_installer_7zip(".7z") + if "7zip" in str(create_installer).lower(): + dist.create_installer_7zip(".exe") return dist diff --git a/winpython/__init__.py b/winpython/__init__.py index 5985a4c8..38783128 100644 --- a/winpython/__init__.py +++ b/winpython/__init__.py @@ -28,6 +28,6 @@ OTHER DEALINGS IN THE SOFTWARE. """ -__version__ = '11.4.20250119' +__version__ = '11.5.20250126' __license__ = __doc__ __project_url__ = 'http://winpython.github.io/' From 7a192131293426af127510ce9bbd46010fa2eada Mon Sep 17 00:00:00 2001 From: stonebig Date: Sun, 26 Jan 2025 12:03:21 +0100 Subject: [PATCH 052/305] simplify per using os.makedirs --- make.py | 34 ++++++++++++---------------------- 1 file changed, 12 insertions(+), 22 deletions(-) diff --git a/make.py b/make.py index 3320a8f9..357ce4e5 100644 --- a/make.py +++ b/make.py @@ -285,8 +285,7 @@ def get_package_fname(self, pattern): def create_batch_script(self, name, contents, do_changes=None): """Create batch script %WINPYDIR%/name""" scriptdir = str(Path(self.winpydir) / "scripts") - if not Path(scriptdir).is_dir(): - os.mkdir(scriptdir) + os.makedirs(Path(scriptdir), exist_ok=True) print("dochanges for %s %", name, do_changes) # live patch pypy3 contents_final = contents @@ -388,7 +387,7 @@ def _copy_dev_tools(self): """Copy dev tools""" self._print(f"Copying tools from {self.toolsdirs} to {self.winpydir}/t") toolsdir = str(Path(self.winpydir) / "t") - os.mkdir(toolsdir) + os.makedirs(Path(toolsdir), exist_ok=True) for dirname in [ ok_dir for ok_dir in self.toolsdirs if Path(ok_dir).is_dir() ]: # the ones in the make.py script environment @@ -409,11 +408,9 @@ def _copy_dev_docs(self): """Copy dev docs""" docsdir = str(Path(self.winpydir) / "notebooks") self._print(f"Copying Noteebook docs from {self.docsdirs} to {docsdir}") - if not Path(docsdir).is_dir(): - os.mkdir(docsdir) + os.makedirs(Path(docsdir), exist_ok=True) docsdir = str(Path(self.winpydir) / "notebooks" / "docs") - if not Path(docsdir).is_dir(): - os.mkdir(docsdir) + os.makedirs(Path(docsdir), exist_ok=True) for dirname in self.docsdirs: for name in os.listdir(dirname): path = str(Path(dirname) / name) @@ -1034,7 +1031,7 @@ def make( located in wheeldir remove_existing=True: (default) install all from scratch - remove_existing=False: only for test purpose (launchers/scripts) + remove_existing=False: for complementary purposes (create installers) requirements=file(s) of requirements (separated by space if several)""" print( self.python_fname, @@ -1052,20 +1049,14 @@ def make( shutil.rmtree(self.winpydir, onexc=utils.onerror) except TypeError: # before 3.12 shutil.rmtree(self.winpydir, onerror=utils.onerror) - if not Path(self.winpydir).is_dir(): - os.mkdir(self.winpydir) + os.makedirs(Path(self.winpydir), exist_ok=True) if remove_existing: - # Create settings directory - # (only necessary if user is starting an application with a batch - # scripts before using an executable launcher, because the latter - # is creating the directory automatically) - os.mkdir(str(Path(self.winpydir) / "settings")) - os.mkdir(str(Path(self.winpydir) / "settings" / "AppData")) - os.mkdir(str(Path(self.winpydir) / "settings" / "AppData" / "Roaming")) + # preventive re-Creation of settings directory + # (necessary if user is starting an application with a batch) + os.makedirs(Path(self.winpydir) / "settings" / "AppData" / "Roaming", exist_ok=True) + self._extract_python() # unzip Python interpreter self._print_done() - if remove_existing: - self._extract_python() # unzip Python interpreter self.distribution = wppm.Distribution( self.python_dir, verbose=self.verbose, @@ -1120,7 +1111,7 @@ def make( self.distribution.do_pip_action(actions) self._run_complement_batch_scripts() self.distribution.patch_standard_packages() - if remove_existing: + self._print("Cleaning up distribution") self.distribution.clean_up() self._print_done() @@ -1223,8 +1214,7 @@ def make_all( # Create Build director, where Winpython will be constructed builddir = str(Path(basedir) / ("bu" + flavor)) - if not Path(builddir).is_dir(): - os.mkdir(builddir) + os.makedirs(Path(builddir), exist_ok=True) # use source_dirs as the directory to re-build Winpython wheel wheeldir = source_dirs From 9a0a89739366041c0226ac81c4cfb73e4bef5e5e Mon Sep 17 00:00:00 2001 From: stonebig Date: Sun, 26 Jan 2025 12:31:58 +0100 Subject: [PATCH 053/305] copilot/gtrp-4o improves code readability on error handling --- make.py | 63 +++++++++++++++------------------------------------------ 1 file changed, 16 insertions(+), 47 deletions(-) diff --git a/make.py b/make.py index 357ce4e5..e8b6a362 100644 --- a/make.py +++ b/make.py @@ -27,12 +27,12 @@ def get_7zip_exe(): """Return 7zip executable""" - localdir = str(Path(sys.prefix).parent.parent) - for dirname in ( - r"C:\Program Files", - r"C:\Program Files (x86)", - str(Path(localdir) / "7-Zip"), - ): + SEVEN_ZIP_DIRS = [ + r"C:\Program Files", + r"C:\Program Files (x86)", + str(Path(sys.prefix).parent.parent / "7-Zip") + ] + for dirname in SEVEN_ZIP_DIRS: for subdirname in (".", "App"): exe = str(Path(dirname) / subdirname / "7-Zip" / "7z.exe") if Path(exe).is_file(): @@ -48,18 +48,14 @@ def replace_in_7zip_file(fname, data): fd.close() for idx, line in enumerate(lines): for start, text in data: - if start not in ( - "Icon", - "OutFile", - ) and not start.startswith("!"): + if start not in ("Icon", "OutFile") and not start.startswith("!"): start = "set " + start if line.startswith(start + "="): lines[idx] = line[: len(start) + 1] + f"{text}" + "\n" - fd = open(fname, "w") - fd.writelines(lines) - print("7-zip for ", fname, "is", lines) - fd.close() + with open(fname, "w") as fd: + fd.writelines(lines) + print("7-zip for ", fname, "is", lines) def build_7zip(srcname, dstname, data): """7-Zip Setup Script""" @@ -79,16 +75,9 @@ def build_7zip(srcname, dstname, data): shell=True, stdout=sys.stderr, ) - if retcode < 0: - print( - "Child was terminated by signal", - -retcode, - file=sys.stderr, - ) - except OSError as e: + except subprocess.CalledProcessError as e: print("Execution failed:", e, file=sys.stderr) - class WinPythonDistribution(object): """WinPython distribution""" @@ -984,9 +973,8 @@ def _create_batch_scripts(self): def _run_complement_batch_scripts(self, this_batch="run_complement.bat"): """tools\..\run_complement.bat for final complements""" print(f"now {this_batch} in tooldirs\..") - for post_complement in list( - set([str(Path(s).parent) for s in self._toolsdirs]) - ): + unique_toolsdirs = set([str(Path(s).parent) for s in self._toolsdirs]) + for post_complement in unique_toolsdirs: filepath = str(Path(post_complement) / this_batch) if Path(filepath).is_file(): print(f'launch "{filepath}" for "{self.winpydir}"') @@ -997,28 +985,9 @@ def _run_complement_batch_scripts(self, this_batch="run_complement.bat"): shell=True, stdout=sys.stderr, ) - if retcode < 0: - print( - "Child was terminated by signal", - -retcode, - file=sys.stderr, - ) - self._print( - "Child was terminated by signal ! ", - -retcode, - file=sys.stderr, - ) - except OSError as e: - print( - "Execution failed:", - e, - file=sys.stderr, - ) - self._print( - "Execution failed !:", - e, - file=sys.stderr, - ) + except subprocess.CalledProcessError as e: + print("Execution failed:", e, file=sys.stderr) + self._print("Execution failed !:", e, file=sys.stderr) self._print_done() def make( From f4e297e5bf1ac1e7452b24d522e7df35302195c5 Mon Sep 17 00:00:00 2001 From: stonebig Date: Sun, 26 Jan 2025 14:04:18 +0100 Subject: [PATCH 054/305] copilot/gpt-4o further improves readability --- make.py | 74 +++++++++++++++++++-------------------------------------- 1 file changed, 25 insertions(+), 49 deletions(-) diff --git a/make.py b/make.py index e8b6a362..da5414cd 100644 --- a/make.py +++ b/make.py @@ -34,18 +34,17 @@ def get_7zip_exe(): ] for dirname in SEVEN_ZIP_DIRS: for subdirname in (".", "App"): - exe = str(Path(dirname) / subdirname / "7-Zip" / "7z.exe") - if Path(exe).is_file(): - return exe + exe = Path(dirname) / subdirname / "7-Zip" / "7z.exe" + if exe.is_file(): + return str(exe) raise RuntimeError("7ZIP is not installed on this computer.") - def replace_in_7zip_file(fname, data): """Replace text in line starting with *start*, from this position: data is a list of (start, text) tuples""" - fd = open(fname, "U") - lines = fd.readlines() - fd.close() + with open(fname, "r") as fd: + lines = fd.readlines() + for idx, line in enumerate(lines): for start, text in data: if start not in ("Icon", "OutFile") and not start.startswith("!"): @@ -60,10 +59,10 @@ def replace_in_7zip_file(fname, data): def build_7zip(srcname, dstname, data): """7-Zip Setup Script""" SEVENZIP_EXE = get_7zip_exe() - portable_dir = str(Path(__file__).resolve().parent / "portable") - shutil.copy(str(Path(portable_dir) / srcname), dstname) + portable_dir = Path(__file__).resolve().parent / "portable" + shutil.copy(portable_dir / srcname, dstname) data = [ - ("PORTABLE_DIR", portable_dir), + ("PORTABLE_DIR", str(portable_dir)), ("SEVENZIP_EXE", SEVENZIP_EXE), ] + list(data) replace_in_7zip_file(dstname, data) @@ -103,12 +102,8 @@ def __init__( self.release_level = release_level self.target = target self.wheeldir = wheeldir - if toolsdirs is None: - toolsdirs = [] - self._toolsdirs = toolsdirs - if docsdirs is None: - docsdirs = [] - self._docsdirs = docsdirs + self._toolsdirs = toolsdirs if toolsdirs is not None else [] + self._docsdirs = docsdirs if docsdirs is not None else [] self.verbose = verbose self.winpydir = None # new WinPython BaseDirectory self.distribution = None @@ -127,7 +122,7 @@ def __init__( r"python-([0-9\.rcba]*)((\.|\-)amd64)?\.(zip|zip)" ) self.python_name = Path(self.python_fname).name[:-4] - self.python_namedir ="python" + self.python_namedir = "python" @property def package_index_wiki(self): @@ -244,13 +239,11 @@ def prepath(self): @property def postpath(self): """Return PATH contents to be append to the environment variable""" - path = [] - return path + return [] @property def toolsdirs(self): """Return tools directory list""" - # formerly was joining prepared tool dir + the one of building env.. return [] + self._toolsdirs @property @@ -273,17 +266,16 @@ def get_package_fname(self, pattern): def create_batch_script(self, name, contents, do_changes=None): """Create batch script %WINPYDIR%/name""" - scriptdir = str(Path(self.winpydir) / "scripts") - os.makedirs(Path(scriptdir), exist_ok=True) + scriptdir = Path(self.winpydir) / "scripts" + scriptdir.mkdir(parents=True, exist_ok=True) print("dochanges for %s %", name, do_changes) # live patch pypy3 contents_final = contents - if do_changes != None: + if do_changes is not None: for i in do_changes: contents_final = contents_final.replace(i[0], i[1]) - fd = open(str(Path(scriptdir) / name), "w") - fd.write(contents_final) - fd.close() + with open(scriptdir / name, "w") as fd: + fd.write(contents_final) def create_python_batch( self, @@ -294,35 +286,19 @@ def create_python_batch( command=None, ): """Create batch file to run a Python script""" - if options is None: - options = "" - else: - options = " " + options + options = f" {options}" if options else "" if command is None: if script_name.endswith(".pyw"): command = 'start "%WINPYDIR%\pythonw.exe"' else: command = '"%WINPYDIR%\python.exe"' - changedir = "" - if workdir is not None: - workdir = workdir - changedir = ( - r"""cd/D %s -""" - % workdir - ) - if script_name != "": - script_name = " " + script_name + changedir = f"cd/D {workdir}\n" if workdir else "" + script_name = f" {script_name}" if script_name else "" self.create_batch_script( name, - r"""@echo off + f"""@echo off call "%~dp0env_for_icons.bat" -""" - + changedir - + command - + script_name - + options - + " %*", +{changedir}{command}{script_name}{options} %*""", ) @@ -340,11 +316,11 @@ def create_installer_7zip(self, installer_option=""): ), ( "VERSION_INSTALL", - f'{self.python_fullversion.replace(".", "")}' + f"{self.build_number}", + f'{self.python_fullversion.replace(".", "")}{self.build_number}', ), ("RELEASELEVEL", self.release_level), + ("INSTALLER_OPTION", installer_option), ) - data += (("INSTALLER_OPTION", installer_option),) build_7zip("installer_7zip.bat", fname, data) self._print_done() From 184db0ff4a1e291f9d447c68e78672d4dca92863 Mon Sep 17 00:00:00 2001 From: stonebig Date: Sun, 26 Jan 2025 18:01:28 +0100 Subject: [PATCH 055/305] copilot/gpt-4o further improves readability --- make.py | 103 ++++++++++++++++++++++++-------------------------------- 1 file changed, 44 insertions(+), 59 deletions(-) diff --git a/make.py b/make.py index da5414cd..44c68e2f 100644 --- a/make.py +++ b/make.py @@ -351,64 +351,58 @@ def _extract_python(self): def _copy_dev_tools(self): """Copy dev tools""" self._print(f"Copying tools from {self.toolsdirs} to {self.winpydir}/t") - toolsdir = str(Path(self.winpydir) / "t") - os.makedirs(Path(toolsdir), exist_ok=True) - for dirname in [ - ok_dir for ok_dir in self.toolsdirs if Path(ok_dir).is_dir() - ]: # the ones in the make.py script environment + toolsdir = Path(self.winpydir) / "t" + toolsdir.mkdir(parents=True, exist_ok=True) + for dirname in [ok_dir for ok_dir in self.toolsdirs if Path(ok_dir).is_dir()]: for name in os.listdir(dirname): - path = str(Path(dirname) / name) - copy = shutil.copytree if Path(path).is_dir() else shutil.copyfile + path = Path(dirname) / name + copy = shutil.copytree if path.is_dir() else shutil.copyfile if self.verbose: - print(path + " --> " + str(Path(toolsdir) / name)) - copy(path, str(Path(toolsdir) / name)) + print(f"{path} --> {toolsdir / name}") + copy(path, toolsdir / name) self._print_done() # move node higher - nodejs_current = str(Path(toolsdir) / "n") - nodejs_target = self.winpydir + self.NODEJS_PATH - if nodejs_current != nodejs_target and Path(nodejs_current).is_dir(): + nodejs_current = toolsdir / "n" + nodejs_target = Path(self.winpydir) / self.NODEJS_PATH + if nodejs_current != nodejs_target and nodejs_current.is_dir(): shutil.move(nodejs_current, nodejs_target) def _copy_dev_docs(self): """Copy dev docs""" - docsdir = str(Path(self.winpydir) / "notebooks") - self._print(f"Copying Noteebook docs from {self.docsdirs} to {docsdir}") - os.makedirs(Path(docsdir), exist_ok=True) - docsdir = str(Path(self.winpydir) / "notebooks" / "docs") - os.makedirs(Path(docsdir), exist_ok=True) + docsdir = Path(self.winpydir) / "notebooks" + self._print(f"Copying Notebook docs from {self.docsdirs} to {docsdir}") + docsdir.mkdir(parents=True, exist_ok=True) + docsdir = docsdir / "docs" + docsdir.mkdir(parents=True, exist_ok=True) for dirname in self.docsdirs: for name in os.listdir(dirname): - path = str(Path(dirname) / name) - copy = shutil.copytree if Path(path).is_dir() else shutil.copyfile - copy(path, str(Path(docsdir) / name)) + path = Path(dirname) / name + copy = shutil.copytree if path.is_dir() else shutil.copyfile + copy(path, docsdir / name) if self.verbose: - print(path + " --> " + str(Path(docsdir) / name)) + print(f"{path} --> {docsdir / name}") self._print_done() def _create_launchers(self): """Create launchers""" - self._print("Creating launchers") - # 2025-01-04: copy launchers premade per the Datalab-Python way - portable_dir = str(Path(__file__).resolve().parent / "portable" / "launchers_final") - for path in Path(portable_dir).rglob('*.exe'): - shutil.copy2(path, Path(self.winpydir) ) + portable_dir = Path(__file__).resolve().parent / "portable" / "launchers_final" + for path in portable_dir.rglob('*.exe'): + shutil.copy2(path, Path(self.winpydir)) print("new way !!!!!!!!!!!!!!!!!! ", path , " -> ",Path(self.winpydir)) for path in (Path(__file__).resolve().parent / "portable").rglob('licence*.*'): - shutil.copy2(path, Path(self.winpydir) ) - + shutil.copy2(path, Path(self.winpydir)) self._print_done() def _create_batch_scripts_initial(self): """Create batch scripts""" self._print("Creating batch scripts initial") - conv = lambda path: ";".join(["%WINPYDIR%\\" + pth for pth in path]) + conv = lambda path: ";".join([f"%WINPYDIR%\\{pth}" for pth in path]) path = conv(self.prepath) + ";%PATH%;" + conv(self.postpath) - convps = lambda path: ";".join(["$env:WINPYDIR\\" + pth for pth in path]) + convps = lambda path: ";".join([f"$env:WINPYDIR\\{pth}" for pth in path]) pathps = convps(self.prepath) + ";$env:path;" + convps(self.postpath) - # PyPy3 shorty = self.distribution.short_exe changes = ( @@ -417,56 +411,47 @@ def _create_batch_scripts_initial(self): ) if (Path(self.distribution.target) / r"lib-python\3\idlelib").is_dir(): changes += ((r"\Lib\idlelib", r"\lib-python\3\idlelib"),) - self.create_batch_script( - "env.bat", - r"""@echo off + + env_script_content = f"""@echo off set WINPYDIRBASE=%~dp0.. rem get a normalized path set WINPYDIRBASETMP=%~dp0.. pushd %WINPYDIRBASETMP% set WINPYDIRBASE=%__CD__% -if "%WINPYDIRBASE:~-1%"=="\" set WINPYDIRBASE=%WINPYDIRBASE:~0,-1% +if "%WINPYDIRBASE:~-1%"=="\\" set WINPYDIRBASE=%WINPYDIRBASE:~0,-1% set WINPYDIRBASETMP= popd -set WINPYDIR=%WINPYDIRBASE%""" - + "\\" - + self.python_namedir - + r""" -rem 2019-08-25 pyjulia needs absolutely a variable PYTHON=%WINPYDIR%python.exe -set PYTHON=%WINPYDIR%\python.exe -set PYTHONPATHz=%WINPYDIR%;%WINPYDIR%\Lib;%WINPYDIR%\DLLs -set WINPYVER=""" - + self.winpyver - + r""" +set WINPYDIR=%WINPYDIRBASE%\\{self.python_namedir} +rem 2019-08-25 pyjulia needs absolutely a variable PYTHON=%WINPYDIR%\\python.exe +set PYTHON=%WINPYDIR%\\python.exe +set PYTHONPATHz=%WINPYDIR%;%WINPYDIR%\\Lib;%WINPYDIR%\\DLLs +set WINPYVER={self.winpyver} rem 2023-02-12 utf-8 on console to avoid pip crash rem see https://github.com/pypa/pip/issues/11798#issuecomment-1427069681 set PYTHONIOENCODING=utf-8 rem set PYTHONUTF8=1 creates issues in "movable" patching - -set HOME=%WINPYDIRBASE%\settings +set HOME=%WINPYDIRBASE%\\settings rem see https://github.com/winpython/winpython/issues/839 rem set USERPROFILE=%HOME% set JUPYTER_DATA_DIR=%HOME% -set JUPYTER_CONFIG_DIR=%WINPYDIR%\etc\jupyter -set JUPYTER_CONFIG_PATH=%WINPYDIR%\etc\jupyter -set FINDDIR=%WINDIR%\system32 -echo ";%PATH%;" | %FINDDIR%\find.exe /C /I ";%WINPYDIR%\;" >nul +set JUPYTER_CONFIG_DIR=%WINPYDIR%\\etc\\jupyter +set JUPYTER_CONFIG_PATH=%WINPYDIR%\\etc\\jupyter +set FINDDIR=%WINDIR%\\system32 +echo ";%PATH%;" | %FINDDIR%\\find.exe /C /I ";%WINPYDIR%\\;" >nul if %ERRORLEVEL% NEQ 0 ( - set "PATH=""" - + path - + r"""" + set "PATH={path}" cd . -) +) rem force default pyqt5 kit for Spyder if PyQt5 module is there -if exist "%WINPYDIR%\Lib\site-packages\PyQt5\__init__.py" set QT_API=pyqt5 -""", - do_changes=changes, - ) +if exist "%WINPYDIR%\\Lib\\site-packages\\PyQt5\\__init__.py" set QT_API=pyqt5 +""" + + self.create_batch_script("env.bat", env_script_content, do_changes=changes) self.create_batch_script( "WinPython_PS_Prompt.ps1", From fb2f6f8018192e6ab7254750f7931e18b0c17e42 Mon Sep 17 00:00:00 2001 From: stonebig Date: Sun, 26 Jan 2025 18:44:00 +0100 Subject: [PATCH 056/305] cosmetic more PathLib use --- winpython/utils.py | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/winpython/utils.py b/winpython/utils.py index 5269fec6..238faab5 100644 --- a/winpython/utils.py +++ b/winpython/utils.py @@ -165,7 +165,7 @@ def create_winpython_start_menu_folder(current=True): file=sys.stderr, ) # create, or re-create ! - os.mkdir(path) + Path(path).mkdir(parents=True, exist_ok=True) return path @@ -509,7 +509,7 @@ def extract_archive(fname, targetdir=None, verbose=False): targetdir = _create_temp_dir() else: try: - os.mkdir(targetdir) + Path(targetdir).mkdir(parents=True, exist_ok=True) except: pass if Path(fname).suffix in ('.zip', '.exe'): @@ -786,8 +786,7 @@ def get_package_metadata(database, name, update=False, suggested_summary=None): # print dname+':', '\n', get_python_infos(dname) tmpdir = r'D:\Tests\winpython_tests' - if not Path(tmpdir).is_dir(): - os.mkdir(tmpdir) + Path(tmpdir).mkdir(parents=True, exist_ok=True) print( ( extract_archive( From b611f3fe6c3d0b86023cc8367d0dc907188d3263 Mon Sep 17 00:00:00 2001 From: stonebig Date: Sun, 26 Jan 2025 22:30:22 +0100 Subject: [PATCH 057/305] rewrite 7zip part with gemini flash2.0 --- make.py | 243 +++++++++++++++++++++++++++++++++----------------------- 1 file changed, 145 insertions(+), 98 deletions(-) diff --git a/make.py b/make.py index 44c68e2f..6057ee7a 100644 --- a/make.py +++ b/make.py @@ -11,71 +11,107 @@ """ import os -from pathlib import Path import re -import subprocess import shutil +import subprocess import sys +from pathlib import Path -# Local imports from winpython import wppm, utils +# Local imports import diff -CHANGELOGS_DIR = str(Path(__file__).parent / "changelogs") -assert Path(CHANGELOGS_DIR).is_dir() - - -def get_7zip_exe(): - """Return 7zip executable""" - SEVEN_ZIP_DIRS = [ - r"C:\Program Files", - r"C:\Program Files (x86)", - str(Path(sys.prefix).parent.parent / "7-Zip") - ] - for dirname in SEVEN_ZIP_DIRS: - for subdirname in (".", "App"): - exe = Path(dirname) / subdirname / "7-Zip" / "7z.exe" - if exe.is_file(): - return str(exe) +CHANGELOGS_DIR = Path(__file__).parent / "changelogs" +PORTABLE_DIR = Path(__file__).parent / "portable" + +assert CHANGELOGS_DIR.is_dir(), f"Changelogs directory not found: {CHANGELOGS_DIR}" +assert PORTABLE_DIR.is_dir(), f"Portable directory not found: {PORTABLE_DIR}" + + +def find_7zip_executable() -> str: + """ + Locates the 7-Zip executable (7z.exe) in common installation directories. + + Raises: + RuntimeError: If 7-Zip executable is not found. + + Returns: + str: Path to the 7-Zip executable. + """ + program_files_dirs = [ + Path(r"C:\Program Files"), + Path(r"C:\Program Files (x86)"), + Path(sys.prefix).parent.parent / "7-Zip", + ] + for base_dir in program_files_dirs: + for subdir in [".", "App"]: + exe_path = base_dir / subdir / "7-Zip" / "7z.exe" + if exe_path.is_file(): + return str(exe_path) raise RuntimeError("7ZIP is not installed on this computer.") -def replace_in_7zip_file(fname, data): - """Replace text in line starting with *start*, from this position: - data is a list of (start, text) tuples""" - with open(fname, "r") as fd: - lines = fd.readlines() - - for idx, line in enumerate(lines): - for start, text in data: - if start not in ("Icon", "OutFile") and not start.startswith("!"): - start = "set " + start - if line.startswith(start + "="): - lines[idx] = line[: len(start) + 1] + f"{text}" + "\n" - - with open(fname, "w") as fd: - fd.writelines(lines) - print("7-zip for ", fname, "is", lines) - -def build_7zip(srcname, dstname, data): - """7-Zip Setup Script""" - SEVENZIP_EXE = get_7zip_exe() - portable_dir = Path(__file__).resolve().parent / "portable" - shutil.copy(portable_dir / srcname, dstname) + +def replace_lines_in_file(filepath: Path, replacements: list[tuple[str, str]]): + """ + Replaces lines in a file that start with a given prefix. + + Args: + filepath: Path to the file to modify. + replacements: A list of tuples, where each tuple contains: + - The prefix of the line to replace (str). + - The new text for the line (str). + """ + lines: list[str] = [] + with open(filepath, "r") as f: + lines = f.readlines() + + updated_lines = list(lines) # Create a mutable copy + + for index, line in enumerate(lines): + for prefix, new_text in replacements: + start_prefix = prefix + if prefix not in ("Icon", "OutFile") and not prefix.startswith("!"): + start_prefix = "set " + prefix + if line.startswith(start_prefix + "="): + updated_lines[index] = f"{start_prefix}={new_text}\n" + + with open(filepath, "w") as f: + f.writelines(updated_lines) + print(f"Updated 7-zip script: {filepath}") + + +def build_installer_7zip( + script_template_path: Path, output_script_path: Path, replacements: list[tuple[str, str]] +): + """ + Creates a 7-Zip installer script by copying a template and applying text replacements. + + Args: + script_template_path: Path to the template 7-Zip script (.bat file). + output_script_path: Path to save the generated 7-Zip script. + replacements: A list of tuples for text replacements (prefix, new_text). + """ + sevenzip_exe = find_7zip_executable() + shutil.copy(script_template_path, output_script_path) + + # Standard replacements for all 7zip scripts data = [ - ("PORTABLE_DIR", str(portable_dir)), - ("SEVENZIP_EXE", SEVENZIP_EXE), - ] + list(data) - replace_in_7zip_file(dstname, data) + ("PORTABLE_DIR", str(PORTABLE_DIR)), + ("SEVENZIP_EXE", sevenzip_exe), + ] + replacements + + replace_lines_in_file(output_script_path, data) + try: - # instead of a 7zip command line, we launch a script that does it - # retcode = subprocess.call(f'"{SEVENZIP_EXE}" "{dstname}"'), - retcode = subprocess.call( - f'"{dstname}" ', - shell=True, - stdout=sys.stderr, - ) + # Execute the generated 7-Zip script + command = f'"{output_script_path}"' + print(f"Executing 7-Zip script: {command}") + subprocess.run( + command, shell=True, check=True, stderr=sys.stderr, stdout=sys.stdout + ) # Use subprocess.run for better error handling except subprocess.CalledProcessError as e: - print("Execution failed:", e, file=sys.stderr) + print(f"Error executing 7-Zip script: {e}", file=sys.stderr) + class WinPythonDistribution(object): """WinPython distribution""" @@ -301,56 +337,67 @@ def create_python_batch( {changedir}{command}{script_name}{options} %*""", ) - - def create_installer_7zip(self, installer_option=""): - """Create installer with 7-ZIP""" - self._print("Creating WinPython installer 7-ZIP") - portable_dir = str(Path(__file__).resolve().parent / "portable") - fname = str(Path(portable_dir) / "installer_7zip-tmp.bat") - data = ( - ("DISTDIR", self.winpydir), - ("ARCH", self.winpy_arch), - ( - "VERSION", - f"{self.python_fullversion}.{self.build_number}{self.flavor}", - ), + def create_installer_7zip(self, installer_type: str = ".exe"): + """ + Creates a WinPython installer using 7-Zip. + + Args: + installer_type: Type of installer to create (".exe", ".7z", ".zip"). + """ + self._print_action(f"Creating WinPython installer ({installer_type})") + template_name = "installer_7zip.bat" + output_name = "installer_7zip-tmp.bat" # temp file to avoid overwriting template + if installer_type not in [".exe", ".7z", ".zip"]: + print(f"Warning: Unsupported installer type '{installer_type}'. Defaulting to .exe") + installer_type = ".exe" + + replacements = [ + ("DISTDIR", str(self.winpydir)), + ("ARCH", str(self.winpy_arch)), + ("VERSION", f"{self.python_fullversion}.{self.build_number}{self.flavor}"), ( "VERSION_INSTALL", f'{self.python_fullversion.replace(".", "")}{self.build_number}', ), ("RELEASELEVEL", self.release_level), - ("INSTALLER_OPTION", installer_option), + ("INSTALLER_OPTION", installer_type), # Pass installer type as option to bat script + ] + + build_installer_7zip( + PORTABLE_DIR / template_name, + PORTABLE_DIR / output_name, + replacements ) - build_7zip("installer_7zip.bat", fname, data) - self._print_done() + self._print_action_done() + - def _print(self, text): - """Print action text indicating progress""" + def _print_action(self, text: str): + """Prints an action message with progress indicator.""" if self.verbose: utils.print_box(text) else: - print(text + "...", end=" ") + print(f"{text}... ", end="", flush=True) - def _print_done(self): - """Print OK at the end of a process""" + def _print_action_done(self): + """Prints "OK" to indicate action completion.""" if not self.verbose: print("OK") def _extract_python(self): """Extracting Python installer, creating distribution object""" - self._print("Extracting Python .zip version") + self._print_action("Extracting Python .zip version") utils.extract_archive( self.python_fname, targetdir=self.python_dir + r"\..", ) - self._print_done() + self._print_action_done() # relocate to /python if Path(self.python_namedir) != Path(self.winpydir) / self.python_namedir: #2024-12-22 to /python os.rename(Path(self.python_dir), Path(self.winpydir) / self.python_namedir) def _copy_dev_tools(self): """Copy dev tools""" - self._print(f"Copying tools from {self.toolsdirs} to {self.winpydir}/t") + self._print_action(f"Copying tools from {self.toolsdirs} to {self.winpydir}/t") toolsdir = Path(self.winpydir) / "t" toolsdir.mkdir(parents=True, exist_ok=True) for dirname in [ok_dir for ok_dir in self.toolsdirs if Path(ok_dir).is_dir()]: @@ -360,7 +407,7 @@ def _copy_dev_tools(self): if self.verbose: print(f"{path} --> {toolsdir / name}") copy(path, toolsdir / name) - self._print_done() + self._print_action_done() # move node higher nodejs_current = toolsdir / "n" nodejs_target = Path(self.winpydir) / self.NODEJS_PATH @@ -370,7 +417,7 @@ def _copy_dev_tools(self): def _copy_dev_docs(self): """Copy dev docs""" docsdir = Path(self.winpydir) / "notebooks" - self._print(f"Copying Notebook docs from {self.docsdirs} to {docsdir}") + self._print_action(f"Copying Notebook docs from {self.docsdirs} to {docsdir}") docsdir.mkdir(parents=True, exist_ok=True) docsdir = docsdir / "docs" docsdir.mkdir(parents=True, exist_ok=True) @@ -381,11 +428,11 @@ def _copy_dev_docs(self): copy(path, docsdir / name) if self.verbose: print(f"{path} --> {docsdir / name}") - self._print_done() + self._print_action_done() def _create_launchers(self): """Create launchers""" - self._print("Creating launchers") + self._print_action("Creating launchers") # 2025-01-04: copy launchers premade per the Datalab-Python way portable_dir = Path(__file__).resolve().parent / "portable" / "launchers_final" for path in portable_dir.rglob('*.exe'): @@ -393,11 +440,11 @@ def _create_launchers(self): print("new way !!!!!!!!!!!!!!!!!! ", path , " -> ",Path(self.winpydir)) for path in (Path(__file__).resolve().parent / "portable").rglob('licence*.*'): shutil.copy2(path, Path(self.winpydir)) - self._print_done() + self._print_action_done() def _create_batch_scripts_initial(self): """Create batch scripts""" - self._print("Creating batch scripts initial") + self._print_action("Creating batch scripts initial") conv = lambda path: ";".join([f"%WINPYDIR%\\{pth}" for pth in path]) path = conv(self.prepath) + ";%PATH%;" + conv(self.postpath) @@ -706,7 +753,7 @@ def main(): def _create_batch_scripts(self): """Create batch scripts""" - self._print("Creating batch scripts") + self._print_action("Creating batch scripts") # PyPy3 shorty = self.distribution.short_exe @@ -939,7 +986,7 @@ def _run_complement_batch_scripts(self, this_batch="run_complement.bat"): filepath = str(Path(post_complement) / this_batch) if Path(filepath).is_file(): print(f'launch "{filepath}" for "{self.winpydir}"') - self._print(f'launch "{filepath}" for "{self.winpydir}" !') + self._print_action(f'launch "{filepath}" for "{self.winpydir}" !') try: retcode = subprocess.call( f'"{filepath}" "{self.winpydir}"', @@ -948,8 +995,8 @@ def _run_complement_batch_scripts(self, this_batch="run_complement.bat"): ) except subprocess.CalledProcessError as e: print("Execution failed:", e, file=sys.stderr) - self._print("Execution failed !:", e, file=sys.stderr) - self._print_done() + self._print_action("Execution failed !:", e, file=sys.stderr) + self._print_action_done() def make( self, @@ -973,7 +1020,7 @@ def make( self.winpydir = str( Path(self.target) / my_winpydir ) # Create/re-create the WinPython base directory - self._print(f"Creating WinPython {my_winpydir} base directory") + self._print_action(f"Creating WinPython {my_winpydir} base directory") if Path(self.winpydir).is_dir() and remove_existing: try: shutil.rmtree(self.winpydir, onexc=utils.onerror) @@ -985,7 +1032,7 @@ def make( # (necessary if user is starting an application with a batch) os.makedirs(Path(self.winpydir) / "settings" / "AppData" / "Roaming", exist_ok=True) self._extract_python() # unzip Python interpreter - self._print_done() + self._print_action_done() self.distribution = wppm.Distribution( self.python_dir, @@ -999,7 +1046,7 @@ def make( ) # Assert that WinPython version and real python version do match - self._print( + self._print_action( f"Python version{self.python_fullversion.replace('.','')}" + f"\nDistro Name {self.distribution.target}" ) @@ -1023,7 +1070,7 @@ def make( if self.install_options is not None: actions += self.install_options print(f"piping {' '.join(actions)}") - self._print(f"piping {' '.join(actions)}") + self._print_action(f"piping {' '.join(actions)}") self.distribution.do_pip_action(actions) self.distribution.patch_standard_packages(req) self._copy_dev_tools() @@ -1037,16 +1084,16 @@ def make( if self.install_options is not None: actions += self.install_options print(f"piping {' '.join(actions)}") - self._print(f"piping {' '.join(actions)}") + self._print_action(f"piping {' '.join(actions)}") self.distribution.do_pip_action(actions) self._run_complement_batch_scripts() self.distribution.patch_standard_packages() - self._print("Cleaning up distribution") + self._print_action("Cleaning up distribution") self.distribution.clean_up() - self._print_done() + self._print_action_done() # Writing package index - self._print("Writing package index") + self._print_action("Writing package index") # winpyver2 = the version without build part but with self.distribution.architecture self.winpyver2 = f"{self.python_fullversion}.{self.build_number}" fname = str( @@ -1063,10 +1110,10 @@ def make( fname, str(Path(CHANGELOGS_DIR) / Path(fname).name), ) - self._print_done() + self._print_action_done() # Writing changelog - self._print("Writing changelog") + self._print_action("Writing changelog") diff.write_changelog( self.winpyver2, basedir=self.basedir, @@ -1074,7 +1121,7 @@ def make( release_level=self.release_level, architecture=self.distribution.architecture, ) - self._print_done() + self._print_action_done() def rebuild_winpython(codedir, targetdir, architecture=64, verbose=False): From 7d347400110dc2f8af43e55bbe8b0f34bc6aac6c Mon Sep 17 00:00:00 2001 From: stonebig Date: Sun, 26 Jan 2025 22:59:45 +0100 Subject: [PATCH 058/305] move to more explicit gemini naming --- make.py | 73 ++++++++++++++++++++++++++++----------------------------- 1 file changed, 36 insertions(+), 37 deletions(-) diff --git a/make.py b/make.py index 6057ee7a..8a5acb2c 100644 --- a/make.py +++ b/make.py @@ -113,7 +113,7 @@ def build_installer_7zip( print(f"Error executing 7-Zip script: {e}", file=sys.stderr) -class WinPythonDistribution(object): +class WinPythonDistributionBuilder(object): """WinPython distribution""" JULIA_PATH = r"\t\Julia\bin" @@ -141,7 +141,7 @@ def __init__( self._toolsdirs = toolsdirs if toolsdirs is not None else [] self._docsdirs = docsdirs if docsdirs is not None else [] self.verbose = verbose - self.winpydir = None # new WinPython BaseDirectory + self.winpy_dir: Path | None = None # Will be set during build self.distribution = None self.installed_packages = [] self.basedir = basedir # added to build from winpython @@ -166,12 +166,12 @@ def package_index_wiki(self): installed_tools = [] def get_tool_path_file(relpath): - path = self.winpydir + relpath + path = self.winpy_dir + relpath if Path(path).is_file(): return path def get_tool_path_dir(relpath): - path = self.winpydir + relpath + path = self.winpy_dir + relpath if Path(path).is_dir(): return path @@ -246,10 +246,10 @@ def winpyver(self): @property def python_dir(self): """Return Python dirname (full path) of the target distribution""" - if (Path(self.winpydir) / self.python_namedir).is_dir(): # 2024-12-22 - return str(Path(self.winpydir) / self.python_namedir) # /python path + if (Path(self.winpy_dir) / self.python_namedir).is_dir(): # 2024-12-22 + return str(Path(self.winpy_dir) / self.python_namedir) # /python path else: - return str(Path(self.winpydir) / self.python_name) # python.exe path + return str(Path(self.winpy_dir) / self.python_name) # python.exe path @property def winpy_arch(self): @@ -302,7 +302,7 @@ def get_package_fname(self, pattern): def create_batch_script(self, name, contents, do_changes=None): """Create batch script %WINPYDIR%/name""" - scriptdir = Path(self.winpydir) / "scripts" + scriptdir = Path(self.winpy_dir) / "scripts" scriptdir.mkdir(parents=True, exist_ok=True) print("dochanges for %s %", name, do_changes) # live patch pypy3 @@ -352,7 +352,7 @@ def create_installer_7zip(self, installer_type: str = ".exe"): installer_type = ".exe" replacements = [ - ("DISTDIR", str(self.winpydir)), + ("DISTDIR", str(self.winpy_dir)), ("ARCH", str(self.winpy_arch)), ("VERSION", f"{self.python_fullversion}.{self.build_number}{self.flavor}"), ( @@ -392,13 +392,13 @@ def _extract_python(self): ) self._print_action_done() # relocate to /python - if Path(self.python_namedir) != Path(self.winpydir) / self.python_namedir: #2024-12-22 to /python - os.rename(Path(self.python_dir), Path(self.winpydir) / self.python_namedir) + if Path(self.python_namedir) != Path(self.winpy_dir) / self.python_namedir: #2024-12-22 to /python + os.rename(Path(self.python_dir), Path(self.winpy_dir) / self.python_namedir) def _copy_dev_tools(self): """Copy dev tools""" - self._print_action(f"Copying tools from {self.toolsdirs} to {self.winpydir}/t") - toolsdir = Path(self.winpydir) / "t" + self._print_action(f"Copying tools from {self.toolsdirs} to {self.winpy_dir}/t") + toolsdir = Path(self.winpy_dir) / "t" toolsdir.mkdir(parents=True, exist_ok=True) for dirname in [ok_dir for ok_dir in self.toolsdirs if Path(ok_dir).is_dir()]: for name in os.listdir(dirname): @@ -410,13 +410,13 @@ def _copy_dev_tools(self): self._print_action_done() # move node higher nodejs_current = toolsdir / "n" - nodejs_target = Path(self.winpydir) / self.NODEJS_PATH + nodejs_target = Path(self.winpy_dir) / self.NODEJS_PATH if nodejs_current != nodejs_target and nodejs_current.is_dir(): shutil.move(nodejs_current, nodejs_target) def _copy_dev_docs(self): """Copy dev docs""" - docsdir = Path(self.winpydir) / "notebooks" + docsdir = Path(self.winpy_dir) / "notebooks" self._print_action(f"Copying Notebook docs from {self.docsdirs} to {docsdir}") docsdir.mkdir(parents=True, exist_ok=True) docsdir = docsdir / "docs" @@ -436,10 +436,10 @@ def _create_launchers(self): # 2025-01-04: copy launchers premade per the Datalab-Python way portable_dir = Path(__file__).resolve().parent / "portable" / "launchers_final" for path in portable_dir.rglob('*.exe'): - shutil.copy2(path, Path(self.winpydir)) - print("new way !!!!!!!!!!!!!!!!!! ", path , " -> ",Path(self.winpydir)) + shutil.copy2(path, Path(self.winpy_dir)) + print("new way !!!!!!!!!!!!!!!!!! ", path , " -> ",Path(self.winpy_dir)) for path in (Path(__file__).resolve().parent / "portable").rglob('licence*.*'): - shutil.copy2(path, Path(self.winpydir)) + shutil.copy2(path, Path(self.winpy_dir)) self._print_action_done() def _create_batch_scripts_initial(self): @@ -779,8 +779,7 @@ def _create_batch_scripts(self): echo patch pip and current launchers for move "%WINPYDIR%\python.exe" -c "from winpython import wppm;dist=wppm.Distribution(r'%WINPYDIR%');dist.patch_standard_packages('pip', to_movable=True)" -pause - """, +pause""", do_changes=changes, ) @@ -985,11 +984,11 @@ def _run_complement_batch_scripts(self, this_batch="run_complement.bat"): for post_complement in unique_toolsdirs: filepath = str(Path(post_complement) / this_batch) if Path(filepath).is_file(): - print(f'launch "{filepath}" for "{self.winpydir}"') - self._print_action(f'launch "{filepath}" for "{self.winpydir}" !') + print(f'launch "{filepath}" for "{self.winpy_dir}"') + self._print_action(f'launch "{filepath}" for "{self.winpy_dir}" !') try: retcode = subprocess.call( - f'"{filepath}" "{self.winpydir}"', + f'"{filepath}" "{self.winpy_dir}"', shell=True, stdout=sys.stderr, ) @@ -1017,20 +1016,20 @@ def make( if my_winpydir is None: raise RuntimeError("WinPython base directory to create is undefined") else: - self.winpydir = str( + self.winpy_dir = str( Path(self.target) / my_winpydir ) # Create/re-create the WinPython base directory self._print_action(f"Creating WinPython {my_winpydir} base directory") - if Path(self.winpydir).is_dir() and remove_existing: + if Path(self.winpy_dir).is_dir() and remove_existing: try: - shutil.rmtree(self.winpydir, onexc=utils.onerror) + shutil.rmtree(self.winpy_dir, onexc=utils.onerror) except TypeError: # before 3.12 - shutil.rmtree(self.winpydir, onerror=utils.onerror) - os.makedirs(Path(self.winpydir), exist_ok=True) + shutil.rmtree(self.winpy_dir, onerror=utils.onerror) + os.makedirs(Path(self.winpy_dir), exist_ok=True) if remove_existing: # preventive re-Creation of settings directory # (necessary if user is starting an application with a batch) - os.makedirs(Path(self.winpydir) / "settings" / "AppData" / "Roaming", exist_ok=True) + os.makedirs(Path(self.winpy_dir) / "settings" / "AppData" / "Roaming", exist_ok=True) self._extract_python() # unzip Python interpreter self._print_action_done() @@ -1097,7 +1096,7 @@ def make( # winpyver2 = the version without build part but with self.distribution.architecture self.winpyver2 = f"{self.python_fullversion}.{self.build_number}" fname = str( - Path(self.winpydir).parent + Path(self.winpy_dir).parent / ( f"WinPython{self.flavor}-" + f"{self.distribution.architecture}bit-" @@ -1216,7 +1215,7 @@ def make_all( find_links = transform_in_list(find_links, "find_links") find_list = [f"--find-links={l}" for l in find_links + [wheeldir]] - dist = WinPythonDistribution( + builder = WinPythonDistributionBuilder( build_number, release_level, builddir, @@ -1231,7 +1230,7 @@ def make_all( # define a pre-defined winpydir, instead of having to guess # extract the python subversion to get WPy64-3671b1 - my_x = "".join(dist.python_fname.replace(".amd64", "").split(".")[-2:-1]) + my_x = "".join(builder.python_fname.replace(".amd64", "").split(".")[-2:-1]) while not my_x.isdigit() and len(my_x) > 0: my_x = my_x[:-1] # simplify for PyPy @@ -1258,19 +1257,19 @@ def make_all( ) + release_level # + flavor - dist.make( + builder.make( remove_existing=remove_existing, requirements=requirements, my_winpydir=my_winpydir, ) if str(create_installer).lower() != "false": if ".zip" in str(create_installer).lower(): - dist.create_installer_7zip(".zip") + builder.create_installer_7zip(".zip") if ".7z" in str(create_installer).lower(): - dist.create_installer_7zip(".7z") + builder.create_installer_7zip(".7z") if "7zip" in str(create_installer).lower(): - dist.create_installer_7zip(".exe") - return dist + builder.create_installer_7zip(".exe") + return builder if __name__ == "__main__": From 30a1bccf143895259b21782355d78313725b892d Mon Sep 17 00:00:00 2001 From: stonebig Date: Mon, 27 Jan 2025 22:40:01 +0100 Subject: [PATCH 059/305] with gemini rewrite batch scripts creation part --- make.py | 416 ++++++++++++++++++++++++-------------------------------- 1 file changed, 180 insertions(+), 236 deletions(-) diff --git a/make.py b/make.py index 8a5acb2c..1e27d9ff 100644 --- a/make.py +++ b/make.py @@ -107,7 +107,7 @@ def build_installer_7zip( command = f'"{output_script_path}"' print(f"Executing 7-Zip script: {command}") subprocess.run( - command, shell=True, check=True, stderr=sys.stderr, stdout=sys.stdout + command, shell=True, check=True, stderr=sys.stderr, stdout=sys.stderr #=sys.stdout ) # Use subprocess.run for better error handling except subprocess.CalledProcessError as e: print(f"Error executing 7-Zip script: {e}", file=sys.stderr) @@ -158,7 +158,7 @@ def __init__( r"python-([0-9\.rcba]*)((\.|\-)amd64)?\.(zip|zip)" ) self.python_name = Path(self.python_fname).name[:-4] - self.python_namedir = "python" + self.python_dir_name = "python" @property def package_index_wiki(self): @@ -166,12 +166,12 @@ def package_index_wiki(self): installed_tools = [] def get_tool_path_file(relpath): - path = self.winpy_dir + relpath + path = Path(self.winpy_dir) / relpath if Path(path).is_file(): return path def get_tool_path_dir(relpath): - path = self.winpy_dir + relpath + path = Path(self.winpy_dir) / relpath if Path(path).is_dir(): return path @@ -237,17 +237,17 @@ def get_tool_path_dir(relpath): + "\n\n\n" ) - # @property makes self.winpyver becomes a call to self.winpyver() + # @property makes self.winpython_version_name becomes a call to self.winpython_version_name() @property - def winpyver(self): + def winpython_version_name(self): """Return WinPython version (with flavor and release level!)""" return f"{self.python_fullversion}.{self.build_number}{self.flavor}{self.release_level}" @property def python_dir(self): """Return Python dirname (full path) of the target distribution""" - if (Path(self.winpy_dir) / self.python_namedir).is_dir(): # 2024-12-22 - return str(Path(self.winpy_dir) / self.python_namedir) # /python path + if (Path(self.winpy_dir) / self.python_dir_name).is_dir(): # 2024-12-22 + return str(Path(self.winpy_dir) / self.python_dir_name) # /python path else: return str(Path(self.winpy_dir) / self.python_name) # python.exe path @@ -257,7 +257,7 @@ def winpy_arch(self): return f"{self.distribution.architecture}" @property - def prepath(self): + def pre_path_entries(self) -> list[str]: """Return PATH contents to be prepend to the environment variable""" path = [ r"Lib\site-packages\PyQt5", @@ -273,7 +273,7 @@ def prepath(self): return path @property - def postpath(self): + def post_path_entries(self) -> list[str]: """Return PATH contents to be append to the environment variable""" return [] @@ -300,42 +300,56 @@ def get_package_fname(self, pattern): else: raise RuntimeError(f"Could not find required package matching {pattern}") - def create_batch_script(self, name, contents, do_changes=None): - """Create batch script %WINPYDIR%/name""" - scriptdir = Path(self.winpy_dir) / "scripts" - scriptdir.mkdir(parents=True, exist_ok=True) - print("dochanges for %s %", name, do_changes) - # live patch pypy3 - contents_final = contents - if do_changes is not None: - for i in do_changes: - contents_final = contents_final.replace(i[0], i[1]) - with open(scriptdir / name, "w") as fd: - fd.write(contents_final) - - def create_python_batch( + def create_batch_script(self, name: str, contents: str, replacements: list[tuple[str, str]] = None): + """ + Creates a batch script in the WinPython scripts directory. + + Args: + name: The name of the batch script file. + contents: The contents of the batch script. + replacements: A list of tuples for text replacements in the content. + """ + script_dir = Path(self.winpy_dir) / "scripts" if self.winpy_dir else None + if not script_dir: + print("Warning: WinPython directory not set, cannot create batch script.") + return + script_dir.mkdir(parents=True, exist_ok=True) + final_contents = contents + if replacements: + for old_text, new_text in replacements: + final_contents = final_contents.replace(old_text, new_text) + script_path = script_dir / name + with open(script_path, "w") as f: + f.write(final_contents) + print(f"Created batch script: {script_path}") + + def create_python_launcher_batch( self, - name, - script_name, - workdir=None, - options=None, - command=None, + name: str, + script_name: str, + working_dir: str = None, + options: str = None, + command: str = None, ): - """Create batch file to run a Python script""" - options = f" {options}" if options else "" + """ + Creates a batch file to launch a Python script within the WinPython environment. + + Args: + name: The name of the batch file. + script_name: The name of the Python script to execute. + working_dir: Optional working directory for the script. + options: Optional command-line options for the script. + command: Optional command to execute python, defaults to python.exe or pythonw.exe + """ + options_str = f" {options}" if options else "" if command is None: - if script_name.endswith(".pyw"): - command = 'start "%WINPYDIR%\pythonw.exe"' - else: - command = '"%WINPYDIR%\python.exe"' - changedir = f"cd/D {workdir}\n" if workdir else "" - script_name = f" {script_name}" if script_name else "" - self.create_batch_script( - name, - f"""@echo off + command = '"%WINPYDIR%\\pythonw.exe"' if script_name.endswith(".pyw") else '"%WINPYDIR%\\python.exe"' + change_dir_cmd = f"cd /D {working_dir}\n" if working_dir else "" + script_name_str = f" {script_name}" if script_name else "" + batch_content = f"""@echo off call "%~dp0env_for_icons.bat" -{changedir}{command}{script_name}{options} %*""", - ) +{change_dir_cmd}{command}{script_name_str}{options_str} %*""" + self.create_batch_script(name, batch_content) def create_installer_7zip(self, installer_type: str = ".exe"): """ @@ -392,8 +406,8 @@ def _extract_python(self): ) self._print_action_done() # relocate to /python - if Path(self.python_namedir) != Path(self.winpy_dir) / self.python_namedir: #2024-12-22 to /python - os.rename(Path(self.python_dir), Path(self.winpy_dir) / self.python_namedir) + if Path(self.python_dir_name) != Path(self.winpy_dir) / self.python_dir_name: #2024-12-22 to /python + os.rename(Path(self.python_dir), Path(self.winpy_dir) / self.python_dir_name) def _copy_dev_tools(self): """Copy dev tools""" @@ -442,24 +456,28 @@ def _create_launchers(self): shutil.copy2(path, Path(self.winpy_dir)) self._print_action_done() - def _create_batch_scripts_initial(self): - """Create batch scripts""" - self._print_action("Creating batch scripts initial") - conv = lambda path: ";".join([f"%WINPYDIR%\\{pth}" for pth in path]) - path = conv(self.prepath) + ";%PATH%;" + conv(self.postpath) - - convps = lambda path: ";".join([f"$env:WINPYDIR\\{pth}" for pth in path]) - pathps = convps(self.prepath) + ";$env:path;" + convps(self.postpath) - # PyPy3 - shorty = self.distribution.short_exe - changes = ( - (r"DIR%\python.exe", r"DIR%" + "\\" + shorty), - (r"DIR%\PYTHON.EXE", r"DIR%" + "\\" + shorty), - ) - if (Path(self.distribution.target) / r"lib-python\3\idlelib").is_dir(): - changes += ((r"\Lib\idlelib", r"\lib-python\3\idlelib"),) - env_script_content = f"""@echo off + def _create_initial_batch_scripts(self): + """Creates initial batch scripts, including environment setup.""" + self._print_action("Creating initial batch scripts") + + path_entries_str = ";".join([rf"%WINPYDIR%\{pth}" for pth in self.pre_path_entries]) + full_path_env_var = f"{path_entries_str};%PATH%;" + ";".join([rf"%WINPYDIR%\{pth}" for pth in self.post_path_entries]) + + path_entries_ps_str = ";".join([rf"$env:WINPYDIR\\{pth}" for pth in self.pre_path_entries]) + full_path_ps_env_var = f"{path_entries_ps_str};$env:path;" + ";".join([rf"$env:WINPYDIR\\{pth}" for pth in self.post_path_entries]) + + # Replacements for batch scripts (PyPy compatibility) + exe_name = self.distribution.short_exe if self.distribution else "python.exe" # default to python.exe if distribution is not yet set + batch_replacements = [ + (r"DIR%\\python.exe", rf"DIR%\\{exe_name}"), + (r"DIR%\\PYTHON.EXE", rf"DIR%\\{exe_name}"), + ] + if self.distribution and (Path(self.distribution.target) / r"lib-python\3\idlelib").is_dir(): + batch_replacements.append((r"\Lib\idlelib", r"\lib-python\3\idlelib")) + + + env_bat_content = f"""@echo off set WINPYDIRBASE=%~dp0.. rem get a normalized path @@ -470,11 +488,11 @@ def _create_batch_scripts_initial(self): set WINPYDIRBASETMP= popd -set WINPYDIR=%WINPYDIRBASE%\\{self.python_namedir} +set WINPYDIR=%WINPYDIRBASE%\\{self.python_dir_name} rem 2019-08-25 pyjulia needs absolutely a variable PYTHON=%WINPYDIR%\\python.exe set PYTHON=%WINPYDIR%\\python.exe set PYTHONPATHz=%WINPYDIR%;%WINPYDIR%\\Lib;%WINPYDIR%\\DLLs -set WINPYVER={self.winpyver} +set WINPYVER={self.winpython_version_name} rem 2023-02-12 utf-8 on console to avoid pip crash rem see https://github.com/pypa/pip/issues/11798#issuecomment-1427069681 @@ -490,7 +508,7 @@ def _create_batch_scripts_initial(self): set FINDDIR=%WINDIR%\\system32 echo ";%PATH%;" | %FINDDIR%\\find.exe /C /I ";%WINPYDIR%\\;" >nul if %ERRORLEVEL% NEQ 0 ( - set "PATH={path}" + set "PATH={full_path_env_var}" cd . ) @@ -498,12 +516,9 @@ def _create_batch_scripts_initial(self): if exist "%WINPYDIR%\\Lib\\site-packages\\PyQt5\\__init__.py" set QT_API=pyqt5 """ - self.create_batch_script("env.bat", env_script_content, do_changes=changes) + self.create_batch_script("env.bat", env_bat_content, replacements=batch_replacements) - self.create_batch_script( - "WinPython_PS_Prompt.ps1", - r""" -### WinPython_PS_Prompt.ps1 ### + ps1_content = r"""### WinPython_PS_Prompt.ps1 ### $0 = $myInvocation.MyCommand.Definition $dp0 = [System.IO.Path]::GetDirectoryName($0) # $env:PYTHONUTF8 = 1 would create issues in "movable" patching @@ -513,26 +528,13 @@ def _create_batch_scripts_initial(self): $env:WINPYDIRBASE = [System.IO.Path]::GetFullPath( $env:WINPYDIRBASE ) # avoid double_init (will only resize screen) -if (-not ($env:WINPYDIR -eq [System.IO.Path]::GetFullPath( $env:WINPYDIRBASE+""" - + '"\\' - + self.python_namedir - + '"' - + r""")) ) { - - -$env:WINPYDIR = $env:WINPYDIRBASE+""" - + '"' - + "\\" - + self.python_namedir - + '"' - + r""" +if (-not ($env:WINPYDIR -eq [System.IO.Path]::GetFullPath( $env:WINPYDIRBASE+""" + '"\\' + self.python_dir_name + '"' + r""")) ) { +$env:WINPYDIR = $env:WINPYDIRBASE+""" + '"\\' + self.python_dir_name + '"' + r""" # 2019-08-25 pyjulia needs absolutely a variable PYTHON=%WINPYDIR%python.exe $env:PYTHON = "%WINPYDIR%\python.exe" $env:PYTHONPATHz = "%WINPYDIR%;%WINPYDIR%\Lib;%WINPYDIR%\DLLs" -$env:WINPYVER = '""" - + self.winpyver - + r"""' +$env:WINPYVER = '""" + self.winpython_version_name + r"""' # rem 2023-02-12 try utf-8 on console # rem see https://github.com/pypa/pip/issues/11798#issuecomment-1427069681 $env:PYTHONIOENCODING = "utf-8" @@ -546,18 +548,14 @@ def _create_batch_scripts_initial(self): $env:JUPYTER_DATA_DIR = "$env:HOME" if (-not $env:PATH.ToLower().Contains(";"+ $env:WINPYDIR.ToLower()+ ";")) { - $env:PATH = """ - + '"' - + pathps - + '"' - + r""" } + $env:PATH = """ + '"' + full_path_ps_env_var + '"' + r""" } #rem force default pyqt5 kit for Spyder if PyQt5 module is there if (Test-Path "$env:WINPYDIR\Lib\site-packages\PyQt5\__init__.py") { $env:QT_API = "pyqt5" } # PyQt5 qt.conf creation and winpython.ini creation done via Winpythonini.py (called per env_for_icons.bat for now) # Start-Process -FilePath $env:PYTHON -ArgumentList ($env:WINPYDIRBASE + '\scripts\WinPythonIni.py') -} + ### Set-WindowSize @@ -577,22 +575,19 @@ def _create_batch_scripts_initial(self): ### Colorize to distinguish $host.ui.RawUI.BackgroundColor = "Black" $host.ui.RawUI.ForegroundColor = "White" -""", - do_changes=changes, - ) +} +""" - self.create_batch_script( - "cmd_ps.bat", - r"""@echo off + self.create_batch_script("WinPython_PS_Prompt.ps1", ps1_content, replacements=batch_replacements) + + + cmd_ps_bat_content = r"""@echo off call "%~dp0env_for_icons.bat" Powershell.exe -Command "& {Start-Process PowerShell.exe -ArgumentList '-ExecutionPolicy RemoteSigned -noexit -File ""%~dp0WinPython_PS_Prompt.ps1""'}" -""", - do_changes=changes, - ) +""" + self.create_batch_script("cmd_ps.bat", cmd_ps_bat_content, replacements=batch_replacements) - self.create_batch_script( - "env_for_icons.bat", - r"""@echo off + env_for_icons_bat_content = r"""@echo off call "%~dp0env.bat" rem default is as before: Winpython ..\Notebooks @@ -637,14 +632,12 @@ def _create_batch_scripts_initial(self): if not exist "%HOME%\.spyder-py%WINPYVER:~0,1%" mkdir "%HOME%\.spyder-py%WINPYVER:~0,1%" if not exist "%HOME%\.spyder-py%WINPYVER:~0,1%\workingdir" echo %HOME%\Notebooks>"%HOME%\.spyder-py%WINPYVER:~0,1%\workingdir" -""", - do_changes=changes, - ) +""" + self.create_batch_script("env_for_icons.bat", env_for_icons_bat_content, replacements=batch_replacements) - self.create_batch_script( - "WinPythonIni.py", # Replaces winpython.vbs, and a bit of env.bat - r""" + # Replaces winpython.vbs, and a bit of env.bat + winpython_ini_py_content = r""" # Prepares a dynamic list of variables settings from a .ini file import os import subprocess @@ -747,22 +740,27 @@ def main(): if __name__ == "__main__": main() - """, - ) + """ + + self.create_batch_script("WinPythonIni.py", winpython_ini_py_content) + self._print_action_done() + + + + def _create_standard_batch_scripts(self): + """Creates standard WinPython batch scripts for various actions.""" + self._print_action("Creating standard batch scripts") + + exe_name = self.distribution.short_exe if self.distribution else "python.exe" + batch_replacements = [ + (r"DIR%\\python.exe", rf"DIR%\\{exe_name}"), + (r"DIR%\\PYTHON.EXE", rf"DIR%\\{exe_name}"), + ] + if self.distribution and (Path(self.distribution.target) / r"lib-python\3\idlelib").is_dir(): + batch_replacements.append((r"\Lib\idlelib", r"\lib-python\3\idlelib")) - def _create_batch_scripts(self): - """Create batch scripts""" - self._print_action("Creating batch scripts") - # PyPy3 - shorty = self.distribution.short_exe - changes = ( - (r"DIR%\python.exe", r"DIR%" + "\\" + shorty), - (r"DIR%\PYTHON.EXE", r"DIR%" + "\\" + shorty), - ) - if (Path(self.distribution.target) / r"lib-python\3\idlelib").is_dir(): - changes += ((r"\Lib\idlelib", r"\lib-python\3\idlelib"),) self.create_batch_script( "readme.txt", r"""These batch files are required to run WinPython icons. @@ -780,7 +778,7 @@ def _create_batch_scripts(self): "%WINPYDIR%\python.exe" -c "from winpython import wppm;dist=wppm.Distribution(r'%WINPYDIR%');dist.patch_standard_packages('pip', to_movable=True)" pause""", - do_changes=changes, + replacements=batch_replacements ) self.create_batch_script( @@ -790,57 +788,35 @@ def _create_batch_scripts(self): echo patch pip and current launchers for non-move "%WINPYDIR%\python.exe" -c "from winpython import wppm;dist=wppm.Distribution(r'%WINPYDIR%');dist.patch_standard_packages('pip', to_movable=False)" -pause - """, - do_changes=changes, - ) - - self.create_batch_script( - "make_working_directory_be_not_winpython.bat", - r"""call "%~dp0env_for_icons.bat" -"%PYTHON%" -c "from winpython.utils import patch_sourcefile;patch_sourcefile(r'%~dp0..\\settings\winpython.ini', '[active_environment', '[inactive_environment' )" -"%PYTHON%" -c "from winpython.utils import patch_sourcefile;patch_sourcefile(r'%~dp0..\\settings\winpython.ini', '[inactive_environment_per_user]', '[active_environment_per_user]' )" -""", +pause""", + replacements=batch_replacements ) - self.create_batch_script( - "make_working_directory_be_winpython.bat", - r"""call "%~dp0env_for_icons.bat" -"%PYTHON%" -c "from winpython.utils import patch_sourcefile;patch_sourcefile(r'%~dp0..\\settings\winpython.ini', '[active_environment', '[inactive_environment' )" -""", - ) + for ini_patch_script in [ + ("make_working_directory_be_not_winpython.bat", "[active_environment", "[inactive_environment", "[inactive_environment_per_user]", "[active_environment_per_user]"), + ("make_working_directory_be_winpython.bat", "[active_environment", "[inactive_environment"), + ("make_working_directory_and_userprofile_be_winpython.bat", "[active_environment", "[inactive_environment", "[inactive_environment_common]", "[active_environment_common]") + ]: + name, patch1_start, patch1_end, *patch2 = ini_patch_script + content = f"""call "%~dp0env_for_icons.bat" +"%PYTHON%" -c "from winpython.utils import patch_sourcefile;patch_sourcefile(r'%~dp0..\\settings\winpython.ini', '{patch1_start}', '{patch1_end}' )" +""" + if patch2: + content += f""""%PYTHON%" -c "from winpython.utils import patch_sourcefile;patch_sourcefile(r'%~dp0..\\settings\winpython.ini', '{patch2[0]}', '{patch2[1]}' )" """ + self.create_batch_script(name, content) - self.create_batch_script( - "make_working_directory_and_userprofile_be_winpython.bat", - r"""call "%~dp0env_for_icons.bat" -"%PYTHON%" -c "from winpython.utils import patch_sourcefile;patch_sourcefile(r'%~dp0..\\settings\winpython.ini', '[active_environment', '[inactive_environment' )" -"%PYTHON%" -c "from winpython.utils import patch_sourcefile;patch_sourcefile(r'%~dp0..\\settings\winpython.ini', '[inactive_environment_common]', '[active_environment_common]' )" -""", - ) - self.create_batch_script( - "cmd.bat", - r"""@echo off + self.create_batch_script("cmd.bat", r"""@echo off call "%~dp0env_for_icons.bat" %* -cmd.exe /k""", - ) +cmd.exe /k""", replacements=batch_replacements) - self.create_batch_script( - "WinPython_Terminal.bat", - r"""@echo off + self.create_batch_script("WinPython_Terminal.bat", r"""@echo off Powershell.exe -Command "& {Start-Process PowerShell.exe -ArgumentList '-ExecutionPolicy RemoteSigned -noexit -File ""%~dp0WinPython_PS_Prompt.ps1""'}" -exit -""", - ) +exit""", replacements=batch_replacements) - self.create_batch_script( - "python.bat", - r"""@echo off + self.create_batch_script("python.bat", r"""@echo off call "%~dp0env_for_icons.bat" %* -"%WINPYDIR%\python.exe" %* -""", - do_changes=changes, - ) +"%WINPYDIR%\python.exe" %*""", replacements=batch_replacements) self.create_batch_script( "winpython.bat", @@ -851,94 +827,68 @@ def _create_batch_scripts(self): "%WINPYDIR%\scripts\ptpython.exe" %* ) else ( "%WINPYDIR%\python.exe" %* -) -""", - do_changes=changes, +)""", + replacements=batch_replacements ) self.create_batch_script( "winidle.bat", r"""@echo off call "%~dp0env_for_icons.bat" %* -"%WINPYDIR%\python.exe" "%WINPYDIR%\Lib\idlelib\idle.pyw" %* -""", - do_changes=changes, +"%WINPYDIR%\python.exe" "%WINPYDIR%\Lib\idlelib\idle.pyw" %*""", + replacements=batch_replacements ) self.create_batch_script( "winspyder.bat", r"""@echo off call "%~dp0env_for_icons.bat" %* -"%WINPYDIR%\scripts\spyder.exe" %* -w "%WINPYWORKDIR1%" -""", +"%WINPYDIR%\scripts\spyder.exe" %* -w "%WINPYWORKDIR1%" """, ) self.create_batch_script( "spyder_reset.bat", r"""@echo off call "%~dp0env_for_icons.bat" -"%WINPYDIR%\scripts\spyder.exe" --reset %* -""", - ) - - self.create_batch_script( - "winipython_notebook.bat", - r"""@echo off -call "%~dp0env_for_icons.bat" %* -"%WINPYDIR%\scripts\jupyter-notebook.exe" %* -""", +"%WINPYDIR%\scripts\spyder.exe" --reset %*""", ) - self.create_batch_script( - "winjupyter_lab.bat", - r"""@echo off + for jupyter_script in [ + ("winipython_notebook.bat", "jupyter-notebook.exe"), + ("winjupyter_lab.bat", "jupyter-lab.exe"), + ("winqtconsole.bat", "jupyter-qtconsole.exe"), + ]: + name, exe = jupyter_script + self.create_batch_script(name, f"""@echo off call "%~dp0env_for_icons.bat" %* -"%WINPYDIR%\scripts\jupyter-lab.exe" %* -""", - ) +"%WINPYDIR%\\scripts\\{exe}" %*""") - self.create_batch_script( - "winqtconsole.bat", - r"""@echo off -call "%~dp0env_for_icons.bat" %* -"%WINPYDIR%\scripts\jupyter-qtconsole.exe" %* -""", - ) - self.create_python_batch( + self.create_python_launcher_batch( "register_python.bat", r'"%WINPYDIR%\Lib\site-packages\winpython\register_python.py"', - workdir=r'"%WINPYDIR%\Scripts"', + working_dir=r'"%WINPYDIR%\Scripts"', ) - self.create_python_batch( + self.create_python_launcher_batch( "unregister_python.bat", r'"%WINPYDIR%\Lib\site-packages\winpython\unregister_python.py"', - workdir=r'"%WINPYDIR%\Scripts"', + working_dir=r'"%WINPYDIR%\Scripts"', ) - self.create_batch_script( - "register_python_for_all.bat", - r"""@echo off + for register_all_script in [ + ("register_python_for_all.bat", "register_python.bat"), + ("unregister_python_for_all.bat", "unregister_python.bat"), + ]: + name, base_script = register_all_script + self.create_batch_script(name, f"""@echo off call "%~dp0env.bat" -call "%~dp0register_python.bat" --all""", - ) +call "%~dp0{base_script}" --all""") - self.create_batch_script( - "unregister_python_for_all.bat", - r"""@echo off -call "%~dp0env.bat" -call "%~dp0unregister_python.bat" --all""", - ) - self.create_batch_script( - "wpcp.bat", - r"""@echo off + self.create_batch_script("wpcp.bat", r"""@echo off call "%~dp0env_for_icons.bat" %* -cmd.exe /k "echo wppm & wppm" -""", - do_changes=changes, - ) +cmd.exe /k "echo wppm & wppm" """, replacements=batch_replacements) self.create_batch_script( "upgrade_pip.bat", @@ -948,22 +898,15 @@ def _create_batch_scripts(self): pause "%WINPYDIR%\python.exe" -m pip install --upgrade pip "%WINPYDIR%\python.exe" -c "from winpython import wppm;dist=wppm.Distribution(r'%WINPYDIR%');dist.patch_standard_packages('pip', to_movable=True) -pause -""", - do_changes=changes, +pause""", + replacements=batch_replacements ) - - self.create_batch_script( # virtual environment mimicking - "activate.bat", - r"""@echo off -call "%~dp0env.bat" %* -""", - ) + self.create_batch_script("activate.bat", r"""@echo off +call "%~dp0env.bat" %*""", replacements=batch_replacements) - self.create_batch_script( - "winvscode.bat", - r"""@echo off + + vscode_bat_content = r"""@echo off call "%~dp0env_for_icons.bat" if exist "%WINPYDIR%\..\t\vscode\code.exe" ( "%WINPYDIR%\..\t\vscode\code.exe" %* @@ -972,9 +915,10 @@ def _create_batch_scripts(self): "%LOCALAPPDATA%\Programs\Microsoft VS Code\code.exe" %* ) else ( "code.exe" %* -)) -""", - ) +))""" + self.create_batch_script("winvscode.bat", vscode_bat_content) + + self._print_action_done() def _run_complement_batch_scripts(self, this_batch="run_complement.bat"): @@ -1056,8 +1000,8 @@ def make( ) if remove_existing: - self._create_batch_scripts_initial() - self._create_batch_scripts() + self._create_initial_batch_scripts() + self._create_standard_batch_scripts() self._create_launchers() # PyPy must ensure pip via: "pypy3.exe -m ensurepip" utils.python_execmodule("ensurepip", self.distribution.target) From 9ecc3eab8d0102b529cb1eebd731ac53bbf193a5 Mon Sep 17 00:00:00 2001 From: stonebig Date: Mon, 27 Jan 2025 23:26:44 +0100 Subject: [PATCH 060/305] further renaming proposed per Geminy --- make.py | 103 +++++++++++++++++++++++++++++--------------------------- 1 file changed, 53 insertions(+), 50 deletions(-) diff --git a/make.py b/make.py index 1e27d9ff..4898c462 100644 --- a/make.py +++ b/make.py @@ -161,8 +161,13 @@ def __init__( self.python_dir_name = "python" @property - def package_index_wiki(self): - """Return Package Index page in Wiki format""" + def package_index_markdown(self) -> str: + """ + Generates a Markdown formatted package index page. + + Returns: + str: Markdown content for the package index. + """ installed_tools = [] def get_tool_path_file(relpath): @@ -274,17 +279,17 @@ def pre_path_entries(self) -> list[str]: @property def post_path_entries(self) -> list[str]: - """Return PATH contents to be append to the environment variable""" + """Returns a list of PATH entries to append to the environment.""" return [] @property def toolsdirs(self): - """Return tools directory list""" + """Returns the list of tools directories to include.""" return [] + self._toolsdirs @property def docsdirs(self): - """Return docs directory list""" + """Returns the list of documentation directories to include.""" if (Path(__file__).resolve().parent / "docs").is_dir(): return [str(Path(__file__).resolve().parent / "docs")] + self._docsdirs else: @@ -397,7 +402,7 @@ def _print_action_done(self): if not self.verbose: print("OK") - def _extract_python(self): + def _extract_python_archive(self): """Extracting Python installer, creating distribution object""" self._print_action("Extracting Python .zip version") utils.extract_archive( @@ -409,7 +414,7 @@ def _extract_python(self): if Path(self.python_dir_name) != Path(self.winpy_dir) / self.python_dir_name: #2024-12-22 to /python os.rename(Path(self.python_dir), Path(self.winpy_dir) / self.python_dir_name) - def _copy_dev_tools(self): + def _copy_tools(self): """Copy dev tools""" self._print_action(f"Copying tools from {self.toolsdirs} to {self.winpy_dir}/t") toolsdir = Path(self.winpy_dir) / "t" @@ -428,7 +433,7 @@ def _copy_dev_tools(self): if nodejs_current != nodejs_target and nodejs_current.is_dir(): shutil.move(nodejs_current, nodejs_target) - def _copy_dev_docs(self): + def _copy_documentation(self): """Copy dev docs""" docsdir = Path(self.winpy_dir) / "notebooks" self._print_action(f"Copying Notebook docs from {self.docsdirs} to {docsdir}") @@ -700,7 +705,7 @@ def main(): env = os.environ.copy() # later_version: env = os.environ # default directories (from .bat) - os.makedirs(Path(env['WINPYDIRBASE']) / 'settings' / 'Appdata' / 'Roaming', exist_ok=True) + os.makedirs(Path(env['WINPYDIRBASE']) / 'settings' / 'Appdata' / 'Roaming', exist_ok=True) # default qt.conf for Qt directories qt_conf='''echo [Paths] @@ -708,7 +713,7 @@ def main(): echo Binaries = . ''' - pathlist = [Path(env['WINPYDIR']) / 'Lib' / 'site-packages' / i for i in ('PyQt5', 'PyQt6', 'Pyside6')] + pathlist = [Path(env['WINPYDIR']) / 'Lib' / 'site-packages' / i for i in ('PyQt5', 'PyQt6', 'Pyside6')] for p in pathlist: if p.is_dir(): if not (p / 'qt.conf').is_file(): @@ -741,13 +746,11 @@ def main(): if __name__ == "__main__": main() """ - self.create_batch_script("WinPythonIni.py", winpython_ini_py_content) self._print_action_done() - def _create_standard_batch_scripts(self): """Creates standard WinPython batch scripts for various actions.""" self._print_action("Creating standard batch scripts") @@ -761,9 +764,7 @@ def _create_standard_batch_scripts(self): batch_replacements.append((r"\Lib\idlelib", r"\lib-python\3\idlelib")) - self.create_batch_script( - "readme.txt", - r"""These batch files are required to run WinPython icons. + self.create_batch_script("readme.txt", """These batch files are required to run WinPython icons. These files should help the user writing his/her own specific batch file to call Python scripts inside WinPython. @@ -921,24 +922,26 @@ def _create_standard_batch_scripts(self): self._print_action_done() - def _run_complement_batch_scripts(self, this_batch="run_complement.bat"): - """tools\..\run_complement.bat for final complements""" - print(f"now {this_batch} in tooldirs\..") - unique_toolsdirs = set([str(Path(s).parent) for s in self._toolsdirs]) - for post_complement in unique_toolsdirs: - filepath = str(Path(post_complement) / this_batch) - if Path(filepath).is_file(): - print(f'launch "{filepath}" for "{self.winpy_dir}"') - self._print_action(f'launch "{filepath}" for "{self.winpy_dir}" !') + def _run_complementary_batch_scripts(self, script_name="run_complement.bat"): + """Runs complementary batch scripts from tools directories.""" + print(f"Running {script_name} from tools directories...") + unique_tools_parent_dirs = set(str(Path(s).parent) for s in self.tools_directories) + for tools_parent_dir in unique_tools_parent_dirs: + script_path = Path(tools_parent_dir) / script_name + if script_path.is_file(): + print(f' Executing "{script_path}" for "{self.winpy_dir}"') + self._print_action(f'Executing "{script_path}" for "{self.winpy_dir}" !') try: - retcode = subprocess.call( - f'"{filepath}" "{self.winpy_dir}"', + subprocess.run( + [str(script_path), str(self.winpy_dir)], shell=True, - stdout=sys.stderr, + check=True, + stderr=sys.stderr, + stdout=sys.stdout ) except subprocess.CalledProcessError as e: - print("Execution failed:", e, file=sys.stderr) - self._print_action("Execution failed !:", e, file=sys.stderr) + print(f" Execution failed: {e}", file=sys.stderr) + self._print_action(f"Execution failed: {e}!") self._print_action_done() def make( @@ -973,8 +976,9 @@ def make( if remove_existing: # preventive re-Creation of settings directory # (necessary if user is starting an application with a batch) - os.makedirs(Path(self.winpy_dir) / "settings" / "AppData" / "Roaming", exist_ok=True) - self._extract_python() # unzip Python interpreter + (Path(self.winpy_dir) / "settings" / "AppData" / "Roaming").mkdir(parents=True, exist_ok=True) # Ensure settings dir exists + self._extract_python_archive() + self._print_action_done() self.distribution = wppm.Distribution( @@ -1003,21 +1007,20 @@ def make( self._create_initial_batch_scripts() self._create_standard_batch_scripts() self._create_launchers() - # PyPy must ensure pip via: "pypy3.exe -m ensurepip" - utils.python_execmodule("ensurepip", self.distribution.target) + utils.python_execmodule("ensurepip", self.distribution.target) # Ensure pip is installed for PyPy self.distribution.patch_standard_packages("pip") - # not forced update of pip (FIRST) and setuptools here - for req in ("pip", "setuptools", "wheel", "winpython"): - actions = ["install", "--upgrade", "--pre", req] - if self.install_options is not None: - actions += self.install_options - print(f"piping {' '.join(actions)}") - self._print_action(f"piping {' '.join(actions)}") + # Upgrade essential packages + essential_packages = ["pip", "setuptools", "wheel", "winpython"] + for package_name in essential_packages: + actions = ["install", "--upgrade", "--pre", package_name] + self.install_options + print(f"Piping: {' '.join(actions)}") + self._print_action(f"Piping: {' '.join(actions)}") self.distribution.do_pip_action(actions) - self.distribution.patch_standard_packages(req) - self._copy_dev_tools() - self._copy_dev_docs() + self.distribution.patch_standard_packages(package_name) + + self._copy_tools() + self._copy_documentation() if requirements: if not list(requirements) == requirements: @@ -1029,7 +1032,7 @@ def make( print(f"piping {' '.join(actions)}") self._print_action(f"piping {' '.join(actions)}") self.distribution.do_pip_action(actions) - self._run_complement_batch_scripts() + self._run_complementary_batch_scripts() self.distribution.patch_standard_packages() self._print_action("Cleaning up distribution") @@ -1047,7 +1050,7 @@ def make( + f"{self.winpyver2}.md" ) ) - open(fname, "w", encoding='utf-8').write(self.package_index_wiki) + open(fname, "w", encoding='utf-8').write(self.package_index_markdown) # Copy to winpython/changelogs shutil.copyfile( fname, @@ -1081,7 +1084,7 @@ def rebuild_winpython(codedir, targetdir, architecture=64, verbose=False): ) -def transform_in_list(list_in, list_type=None): +def _parse_list_argument(list_in, list_type=None): """Transform a 'String or List' in List""" if list_in is None: list_in = "" @@ -1146,17 +1149,17 @@ def make_all( ) # Optional pre-defined toolsdirs - toolsdirs = transform_in_list(toolsdirs, "toolsdirs=") + toolsdirs = _parse_list_argument(toolsdirs, "toolsdirs=") # Optional pre-defined toolsdirs print("docsdirs input", docsdirs) - docsdirs = transform_in_list(docsdirs, "docsdirs=") + docsdirs = _parse_list_argument(docsdirs, "docsdirs=") print("docsdirs output", docsdirs) # install_options = ['--no-index', '--pre', f'--find-links={wheeldir)'] - install_options = transform_in_list(install_options, "install_options") + install_options = _parse_list_argument(install_options, "install_options") - find_links = transform_in_list(find_links, "find_links") + find_links = _parse_list_argument(find_links, "find_links") find_list = [f"--find-links={l}" for l in find_links + [wheeldir]] builder = WinPythonDistributionBuilder( From d0984bb7850f94d8c50c105ec0d59b50b076e4e6 Mon Sep 17 00:00:00 2001 From: stonebig Date: Tue, 28 Jan 2025 19:33:33 +0100 Subject: [PATCH 061/305] with gemini, redoing the markdown output --- make.py | 187 ++++++++++++++++++++++++++++++-------------------------- 1 file changed, 99 insertions(+), 88 deletions(-) diff --git a/make.py b/make.py index 4898c462..f1bcd9af 100644 --- a/make.py +++ b/make.py @@ -116,8 +116,8 @@ def build_installer_7zip( class WinPythonDistributionBuilder(object): """WinPython distribution""" - JULIA_PATH = r"\t\Julia\bin" - NODEJS_PATH = r"\n" # r'\t\n' + JULIA_PATH_REL = r"\t\Julia\bin" + NODEJS_PATH_REL = r"\n" # r'\t\n' def __init__( self, @@ -168,62 +168,13 @@ def package_index_markdown(self) -> str: Returns: str: Markdown content for the package index. """ - installed_tools = [] - - def get_tool_path_file(relpath): - path = Path(self.winpy_dir) / relpath - if Path(path).is_file(): - return path - - def get_tool_path_dir(relpath): - path = Path(self.winpy_dir) / relpath - if Path(path).is_dir(): - return path - - juliapath = get_tool_path_dir(self.JULIA_PATH) - if juliapath is not None: - juliaver = utils.get_julia_version(juliapath) - installed_tools += [("Julia", juliaver)] - nodepath = get_tool_path_dir(self.NODEJS_PATH) - if nodepath is not None: - nodever = utils.get_nodejs_version(nodepath) - installed_tools += [("Nodejs", nodever)] - npmver = utils.get_npmjs_version(nodepath) - installed_tools += [("npmjs", npmver)] - pandocexe = get_tool_path_file(r"\t\pandoc.exe") - if pandocexe is not None: - pandocver = utils.get_pandoc_version(str(Path(pandocexe).parent)) - installed_tools += [("Pandoc", pandocver)] - vscodeexe = get_tool_path_file(r"\t\VSCode\Code.exe") - if vscodeexe is not None: - installed_tools += [ - ("VSCode", utils.getFileProperties(vscodeexe)["FileVersion"]) - ] - tools = [] - for name, ver in installed_tools: - metadata = utils.get_package_metadata("tools.ini", name) - url, desc = ( - metadata["url"], - metadata["description"], - ) - tools += [f"[{name}]({url}) | {ver} | {desc}"] - # get all packages installed in the changelog, whatever the method - self.installed_packages = self.distribution.get_installed_packages(update=True) + installed_tools_md = self._get_installed_tools_markdown() + installed_packages_md = self._get_installed_packages_markdown() + python_description = "Python programming language with standard library" - packages = [ - f"[{pack.name}]({pack.url}) | {pack.version} | {pack.description}" - for pack in sorted( - self.installed_packages, - key=lambda p: p.name.lower(), - ) - ] - python_desc = "Python programming language with standard library" - tools_f = "\n".join(tools) - packages_f = "\n".join(packages) - return ( - f"""## WinPython {self.winpyver2 + self.flavor} + return f"""## WinPython {self.winpython_version_name} -The following packages are included in WinPython-{self.winpy_arch}bit v{self.winpyver2+self.flavor} {self.release_level}. +The following packages are included in WinPython-{self.architecture_bits}bit v{self.winpython_version_name} {self.release_level}.
    @@ -231,36 +182,98 @@ def get_tool_path_dir(relpath): Name | Version | Description -----|---------|------------ -{tools_f} +{installed_tools_md} ### Python packages Name | Version | Description -----|---------|------------ -[Python](http://www.python.org/) | {self.python_fullversion} | {python_desc} -{packages_f}""" - + "\n\n
    \n" - ) +[Python](http://www.python.org/) | {self.python_full_version} | {python_description} +{installed_packages_md} + + +""" + def _get_installed_tools_markdown(self) -> str: + """Generates Markdown for installed tools section in package index.""" + installed_tools = [] + + def get_tool_path(rel_path): + path = Path(self.winpy_dir) / rel_path if self.winpy_dir else None + return path if path and (path.is_file() or path.is_dir()) else None + + julia_path = get_tool_path(self.JULIA_PATH_REL) + if julia_path: + julia_version = utils.get_julia_version(str(julia_path)) + installed_tools.append(("Julia", julia_version)) + + nodejs_path = get_tool_path(self.NODEJS_PATH_REL) + if nodejs_path: + node_version = utils.get_nodejs_version(str(nodejs_path)) + installed_tools.append(("Nodejs", node_version)) + npm_version = utils.get_npmjs_version(str(nodejs_path)) + installed_tools.append(("npmjs", npm_version)) + + pandoc_exe = get_tool_path(r"\t\pandoc.exe") + if pandoc_exe: + pandoc_version = utils.get_pandoc_version(str(pandoc_exe.parent)) + installed_tools.append(("Pandoc", pandoc_version)) + + vscode_exe = get_tool_path(r"\t\VSCode\Code.exe") + if vscode_exe: + vscode_version = utils.getFileProperties(str(vscode_exe))["FileVersion"] + installed_tools.append(("VSCode", vscode_version)) + + tool_lines = [] + for name, version in installed_tools: + metadata = utils.get_package_metadata("tools.ini", name) + url, description = metadata["url"], metadata["description"] + tool_lines.append(f"[{name}]({url}) | {version} | {description}") + return "\n".join(tool_lines) + + def _get_installed_packages_markdown(self) -> str: + """Generates Markdown for installed packages section in package index.""" + if self.distribution is None: + return "" # Distribution not initialized yet. + self.installed_packages = self.distribution.get_installed_packages(update=True) + package_lines = [ + f"[{pkg.name}]({pkg.url}) | {pkg.version} | {pkg.description}" + for pkg in sorted(self.installed_packages, key=lambda p: p.name.lower()) + ] + return "\n".join(package_lines) # @property makes self.winpython_version_name becomes a call to self.winpython_version_name() @property def winpython_version_name(self): """Return WinPython version (with flavor and release level!)""" - return f"{self.python_fullversion}.{self.build_number}{self.flavor}{self.release_level}" + return f"{self.python_full_version}.{self.build_number}{self.flavor}{self.release_level}" @property - def python_dir(self): - """Return Python dirname (full path) of the target distribution""" - if (Path(self.winpy_dir) / self.python_dir_name).is_dir(): # 2024-12-22 - return str(Path(self.winpy_dir) / self.python_dir_name) # /python path - else: - return str(Path(self.winpy_dir) / self.python_name) # python.exe path + def python_full_version(self) -> str: + """ + Retrieves the Python full version string from the distribution. + Will be set after _extract_python is called and distribution is initialized. + """ + if self.distribution is None: + return "0.0.0" # Placeholder before initialization + return utils.get_python_long_version(self.distribution.target) @property - def winpy_arch(self): - """Return WinPython architecture""" - return f"{self.distribution.architecture}" + def python_executable_dir(self) -> str: + """Returns the directory containing the Python executable.""" + python_path_dir = Path(self.winpy_dir) / self.python_dir_name if self.winpy_dir else None + if python_path_dir and python_path_dir.is_dir(): + return str(python_path_dir) + else: + python_path_exe = Path(self.winpy_dir) / self.python_name if self.winpy_dir else None # Fallback for older structure + return str(python_path_exe) if python_path_exe else "" + @property + def architecture_bits(self) -> int: + """Returns the architecture (32 or 64 bits) of the distribution.""" + if self.distribution: + return self.distribution.architecture + return 64 # Default to 64 if distribution is not initialized yet + @property def pre_path_entries(self) -> list[str]: """Return PATH contents to be prepend to the environment variable""" @@ -271,9 +284,9 @@ def pre_path_entries(self) -> list[str]: "Scripts", r"..\t", ] - path += [r".." + self.JULIA_PATH] + path += [r".." + self.JULIA_PATH_REL] - path += [r".." + self.NODEJS_PATH] + path += [r".." + self.NODEJS_PATH_REL] return path @@ -372,11 +385,11 @@ def create_installer_7zip(self, installer_type: str = ".exe"): replacements = [ ("DISTDIR", str(self.winpy_dir)), - ("ARCH", str(self.winpy_arch)), - ("VERSION", f"{self.python_fullversion}.{self.build_number}{self.flavor}"), + ("ARCH", str(self.architecture_bits)), + ("VERSION", f"{self.python_full_version}.{self.build_number}{self.flavor}"), ( "VERSION_INSTALL", - f'{self.python_fullversion.replace(".", "")}{self.build_number}', + f'{self.python_full_version.replace(".", "")}{self.build_number}', ), ("RELEASELEVEL", self.release_level), ("INSTALLER_OPTION", installer_type), # Pass installer type as option to bat script @@ -407,12 +420,12 @@ def _extract_python_archive(self): self._print_action("Extracting Python .zip version") utils.extract_archive( self.python_fname, - targetdir=self.python_dir + r"\..", + targetdir=self.python_executable_dir + r"\..", ) self._print_action_done() # relocate to /python if Path(self.python_dir_name) != Path(self.winpy_dir) / self.python_dir_name: #2024-12-22 to /python - os.rename(Path(self.python_dir), Path(self.winpy_dir) / self.python_dir_name) + os.rename(Path(self.python_executable_dir), Path(self.winpy_dir) / self.python_dir_name) def _copy_tools(self): """Copy dev tools""" @@ -429,7 +442,7 @@ def _copy_tools(self): self._print_action_done() # move node higher nodejs_current = toolsdir / "n" - nodejs_target = Path(self.winpy_dir) / self.NODEJS_PATH + nodejs_target = Path(self.winpy_dir) / self.NODEJS_PATH_REL if nodejs_current != nodejs_target and nodejs_current.is_dir(): shutil.move(nodejs_current, nodejs_target) @@ -982,24 +995,22 @@ def make( self._print_action_done() self.distribution = wppm.Distribution( - self.python_dir, + self.python_executable_dir, verbose=self.verbose, indent=True, ) - # get Fullversion from the executable - self.python_fullversion = utils.get_python_long_version( - self.distribution.target - ) + + # Assert that WinPython version and real python version do match self._print_action( - f"Python version{self.python_fullversion.replace('.','')}" + f"Python version{self.python_full_version.replace('.','')}" + f"\nDistro Name {self.distribution.target}" ) - assert self.python_fullversion.replace(".", "") in self.distribution.target, ( + assert self.python_full_version.replace(".", "") in self.distribution.target, ( "Distro Directory doesn't match the Python version it ships" - + f"\nPython version: {self.python_fullversion.replace('.','')}" + + f"\nPython version: {self.python_full_version.replace('.','')}" + f"\nDistro Name: {self.distribution.target}" ) @@ -1041,7 +1052,7 @@ def make( # Writing package index self._print_action("Writing package index") # winpyver2 = the version without build part but with self.distribution.architecture - self.winpyver2 = f"{self.python_fullversion}.{self.build_number}" + self.winpyver2 = f"{self.python_full_version}.{self.build_number}" fname = str( Path(self.winpy_dir).parent / ( From 1626e7f6fd34a497d4ed35bacfbf18fab3e444e4 Mon Sep 17 00:00:00 2001 From: stonebig Date: Tue, 28 Jan 2025 20:02:00 +0100 Subject: [PATCH 062/305] with gemini redo wheels_dir and tools_dirs --- make.py | 101 +++++++++++++++++++++++++++++++------------------------- 1 file changed, 56 insertions(+), 45 deletions(-) diff --git a/make.py b/make.py index f1bcd9af..80321a28 100644 --- a/make.py +++ b/make.py @@ -113,19 +113,21 @@ def build_installer_7zip( print(f"Error executing 7-Zip script: {e}", file=sys.stderr) -class WinPythonDistributionBuilder(object): - """WinPython distribution""" +class WinPythonDistributionBuilder: + """ + Builds a WinPython distribution. + """ - JULIA_PATH_REL = r"\t\Julia\bin" - NODEJS_PATH_REL = r"\n" # r'\t\n' + JULIA_PATH_REL = r"\t\Julia\bin" # Relative path within WinPython dir + NODEJS_PATH_REL = r"\n" # Relative path within WinPython dir def __init__( self, build_number, release_level, target, - wheeldir, - toolsdirs=None, + wheels_dir: Path, + tools_dirs: list[Path] = None, verbose=False, basedir=None, install_options=None, @@ -137,8 +139,8 @@ def __init__( self.build_number = build_number self.release_level = release_level self.target = target - self.wheeldir = wheeldir - self._toolsdirs = toolsdirs if toolsdirs is not None else [] + self.wheels_dir = Path(wheels_dir) # Ensure Path object + self.tools_dirs = tools_dirs or [] self._docsdirs = docsdirs if docsdirs is not None else [] self.verbose = verbose self.winpy_dir: Path | None = None # Will be set during build @@ -273,22 +275,19 @@ def architecture_bits(self) -> int: if self.distribution: return self.distribution.architecture return 64 # Default to 64 if distribution is not initialized yet - + @property def pre_path_entries(self) -> list[str]: - """Return PATH contents to be prepend to the environment variable""" - path = [ + """Returns a list of PATH entries to prepend to the environment.""" + return [ r"Lib\site-packages\PyQt5", "", # Python root directory "DLLs", "Scripts", r"..\t", + r".." + self.JULIA_PATH_REL, + r".." + self.NODEJS_PATH_REL, ] - path += [r".." + self.JULIA_PATH_REL] - - path += [r".." + self.NODEJS_PATH_REL] - - return path @property def post_path_entries(self) -> list[str]: @@ -296,9 +295,9 @@ def post_path_entries(self) -> list[str]: return [] @property - def toolsdirs(self): + def tools_directories(self) -> list[Path]: """Returns the list of tools directories to include.""" - return [] + self._toolsdirs + return self.tools_dirs @property def docsdirs(self): @@ -309,8 +308,8 @@ def docsdirs(self): return self._docsdirs def get_package_fname(self, pattern): - """Get package matching pattern in wheeldir""" - path = self.wheeldir + """Get package matching pattern in wheels_dir""" + path = self.wheels_dir for fname in os.listdir(path): match = re.match(pattern, fname) if match is not None or pattern == fname: @@ -428,23 +427,35 @@ def _extract_python_archive(self): os.rename(Path(self.python_executable_dir), Path(self.winpy_dir) / self.python_dir_name) def _copy_tools(self): - """Copy dev tools""" - self._print_action(f"Copying tools from {self.toolsdirs} to {self.winpy_dir}/t") - toolsdir = Path(self.winpy_dir) / "t" - toolsdir.mkdir(parents=True, exist_ok=True) - for dirname in [ok_dir for ok_dir in self.toolsdirs if Path(ok_dir).is_dir()]: - for name in os.listdir(dirname): - path = Path(dirname) / name - copy = shutil.copytree if path.is_dir() else shutil.copyfile - if self.verbose: - print(f"{path} --> {toolsdir / name}") - copy(path, toolsdir / name) + """Copies development tools to the WinPython 't' directory.""" + tools_target_dir = self.winpy_dir / "t" + self._print_action(f"Copying tools to {tools_target_dir}") + tools_target_dir.mkdir(parents=True, exist_ok=True) + for source_dir in self.tools_directories: + if not source_dir.is_dir(): + print(f"Warning: Tools directory not found: {source_dir}") + continue + for item_name in os.listdir(source_dir): + source_item = source_dir / item_name + target_item = tools_target_dir / item_name + copy_func = shutil.copytree if source_item.is_dir() else shutil.copy2 + try: + copy_func(source_item, target_item) + if self.verbose: + print(f" Copied: {source_item} -> {target_item}") + except Exception as e: + print(f"Error copying {source_item} to {target_item}: {e}") + + # Special handling for Node.js to move it up one level + nodejs_current_dir = tools_target_dir / "n" + nodejs_target_dir = self.winpy_dir / self.NODEJS_PATH_REL + if nodejs_current_dir != nodejs_target_dir and nodejs_current_dir.is_dir(): + try: + shutil.move(nodejs_current_dir, nodejs_target_dir) + except Exception as e: + print(f"Error moving Node.js directory: {e}") + self._print_action_done() - # move node higher - nodejs_current = toolsdir / "n" - nodejs_target = Path(self.winpy_dir) / self.NODEJS_PATH_REL - if nodejs_current != nodejs_target and nodejs_current.is_dir(): - shutil.move(nodejs_current, nodejs_target) def _copy_documentation(self): """Copy dev docs""" @@ -964,7 +975,7 @@ def make( my_winpydir=None, ): """Make WinPython distribution in target directory from the installers - located in wheeldir + located in wheels_dir remove_existing=True: (default) install all from scratch remove_existing=False: for complementary purposes (create installers) @@ -1150,35 +1161,35 @@ def make_all( builddir = str(Path(basedir) / ("bu" + flavor)) os.makedirs(Path(builddir), exist_ok=True) # use source_dirs as the directory to re-build Winpython wheel - wheeldir = source_dirs + wheels_dir = source_dirs # Rebuild Winpython in this wheel dir rebuild_winpython( codedir=str(Path(__file__).resolve().parent), # winpython source dir - targetdir=wheeldir, + targetdir=wheels_dir, architecture=architecture, ) - # Optional pre-defined toolsdirs - toolsdirs = _parse_list_argument(toolsdirs, "toolsdirs=") + # Parse list arguments + tools_dirs_list = _parse_list_argument(toolsdirs) # Optional pre-defined toolsdirs print("docsdirs input", docsdirs) docsdirs = _parse_list_argument(docsdirs, "docsdirs=") print("docsdirs output", docsdirs) - # install_options = ['--no-index', '--pre', f'--find-links={wheeldir)'] + # install_options = ['--no-index', '--pre', f'--find-links={wheels_dir)'] install_options = _parse_list_argument(install_options, "install_options") find_links = _parse_list_argument(find_links, "find_links") - find_list = [f"--find-links={l}" for l in find_links + [wheeldir]] + find_list = [f"--find-links={l}" for l in find_links + [wheels_dir]] builder = WinPythonDistributionBuilder( build_number, release_level, builddir, - wheeldir, - toolsdirs, + wheels_dir=wheels_dir, + tools_dirs=[Path(d) for d in tools_dirs_list], verbose=verbose, basedir=basedir, install_options=install_options + find_list, From 70b88ffe03c79f152598e2fc1a98fca8e43aa7f9 Mon Sep 17 00:00:00 2001 From: stonebig Date: Tue, 28 Jan 2025 21:37:41 +0100 Subject: [PATCH 063/305] with gemini redo copy of tools and documentation --- make.py | 107 +++++++++++++++++++++++++++++++------------------------- 1 file changed, 60 insertions(+), 47 deletions(-) diff --git a/make.py b/make.py index 80321a28..377d9b1c 100644 --- a/make.py +++ b/make.py @@ -123,30 +123,43 @@ class WinPythonDistributionBuilder: def __init__( self, - build_number, - release_level, + build_number: int, + release_level: str, target, wheels_dir: Path, tools_dirs: list[Path] = None, - verbose=False, - basedir=None, - install_options=None, - flavor="", - docsdirs=None, + docs_dirs: list[Path] = None, + verbose: bool = False, + base_dir: Path = None, + install_options: list[str] = None, + flavor: str = "", ): - assert isinstance(build_number, int) - assert isinstance(release_level, str) + """ + Initializes the WinPythonDistributionBuilder. + + Args: + build_number: The build number (integer). + release_level: The release level (e.g., "beta", ""). + target_dir: The base directory where WinPython will be created. + wheels_dir: Directory containing wheel files for packages. + tools_dirs: List of directories containing development tools to include. + docs_dirs: List of directories containing documentation to include. + verbose: Enable verbose output. + base_dir: Base directory for building (optional, for relative paths). + install_options: Additional pip install options. + flavor: WinPython flavor (e.g., "Barebone"). + """ self.build_number = build_number self.release_level = release_level self.target = target self.wheels_dir = Path(wheels_dir) # Ensure Path object self.tools_dirs = tools_dirs or [] - self._docsdirs = docsdirs if docsdirs is not None else [] + self.docs_dirs = docs_dirs or [] self.verbose = verbose self.winpy_dir: Path | None = None # Will be set during build self.distribution = None self.installed_packages = [] - self.basedir = basedir # added to build from winpython + self.base_dir = base_dir # added to build from winpython self.install_options = install_options self.flavor = flavor @@ -300,12 +313,12 @@ def tools_directories(self) -> list[Path]: return self.tools_dirs @property - def docsdirs(self): + def docs_directories(self) -> list[Path]: """Returns the list of documentation directories to include.""" - if (Path(__file__).resolve().parent / "docs").is_dir(): - return [str(Path(__file__).resolve().parent / "docs")] + self._docsdirs - else: - return self._docsdirs + default_docs_dir = Path(__file__).resolve().parent / "docs" + if default_docs_dir.is_dir(): + return [default_docs_dir] + self.docs_dirs + return self.docs_dirs def get_package_fname(self, pattern): """Get package matching pattern in wheels_dir""" @@ -428,7 +441,7 @@ def _extract_python_archive(self): def _copy_tools(self): """Copies development tools to the WinPython 't' directory.""" - tools_target_dir = self.winpy_dir / "t" + tools_target_dir = Path(self.winpy_dir) / "t" self._print_action(f"Copying tools to {tools_target_dir}") tools_target_dir.mkdir(parents=True, exist_ok=True) for source_dir in self.tools_directories: @@ -448,7 +461,7 @@ def _copy_tools(self): # Special handling for Node.js to move it up one level nodejs_current_dir = tools_target_dir / "n" - nodejs_target_dir = self.winpy_dir / self.NODEJS_PATH_REL + nodejs_target_dir = Path(self.winpy_dir) / self.NODEJS_PATH_REL if nodejs_current_dir != nodejs_target_dir and nodejs_current_dir.is_dir(): try: shutil.move(nodejs_current_dir, nodejs_target_dir) @@ -458,19 +471,24 @@ def _copy_tools(self): self._print_action_done() def _copy_documentation(self): - """Copy dev docs""" - docsdir = Path(self.winpy_dir) / "notebooks" - self._print_action(f"Copying Notebook docs from {self.docsdirs} to {docsdir}") - docsdir.mkdir(parents=True, exist_ok=True) - docsdir = docsdir / "docs" - docsdir.mkdir(parents=True, exist_ok=True) - for dirname in self.docsdirs: - for name in os.listdir(dirname): - path = Path(dirname) / name - copy = shutil.copytree if path.is_dir() else shutil.copyfile - copy(path, docsdir / name) - if self.verbose: - print(f"{path} --> {docsdir / name}") + """Copies documentation files to the WinPython 'docs' directory.""" + docs_target_dir = Path(self.winpy_dir) / "notebooks" / "docs" + self._print_action(f"Copying documentation to {docs_target_dir}") + docs_target_dir.mkdir(parents=True, exist_ok=True) + for source_dir in self.docs_directories: + if not source_dir.is_dir(): + print(f"Warning: Documentation directory not found: {source_dir}") + continue + for item_name in os.listdir(source_dir): + source_item = source_dir / item_name + target_item = docs_target_dir / item_name + copy_func = shutil.copytree if source_item.is_dir() else shutil.copy2 + try: + copy_func(source_item, target_item) + if self.verbose: + print(f" Copied: {source_item} -> {target_item}") + except Exception as e: + print(f"Error copying {source_item} to {target_item}: {e}") self._print_action_done() def _create_launchers(self): @@ -984,6 +1002,7 @@ def make( self.python_fname, self.python_name, ) + if my_winpydir is None: raise RuntimeError("WinPython base directory to create is undefined") else: @@ -1084,7 +1103,7 @@ def make( self._print_action("Writing changelog") diff.write_changelog( self.winpyver2, - basedir=self.basedir, + basedir=self.base_dir, flavor=self.flavor, release_level=self.release_level, architecture=self.distribution.architecture, @@ -1172,29 +1191,23 @@ def make_all( # Parse list arguments tools_dirs_list = _parse_list_argument(toolsdirs) + docs_dirs_list = _parse_list_argument(docsdirs) + install_options_list = _parse_list_argument(install_options) + find_links_dirs_list = _parse_list_argument(find_links) + requirements_files_list = [Path(f) for f in _parse_list_argument(requirements) if f] # ensure Path objects - # Optional pre-defined toolsdirs - print("docsdirs input", docsdirs) - docsdirs = _parse_list_argument(docsdirs, "docsdirs=") - print("docsdirs output", docsdirs) - - # install_options = ['--no-index', '--pre', f'--find-links={wheels_dir)'] - install_options = _parse_list_argument(install_options, "install_options") - - find_links = _parse_list_argument(find_links, "find_links") - - find_list = [f"--find-links={l}" for l in find_links + [wheels_dir]] + find_links_options = [f"--find-links={link}" for link in find_links_dirs_list + [wheels_dir]] builder = WinPythonDistributionBuilder( build_number, release_level, builddir, wheels_dir=wheels_dir, tools_dirs=[Path(d) for d in tools_dirs_list], + docs_dirs=[Path(d) for d in docs_dirs_list], verbose=verbose, - basedir=basedir, - install_options=install_options + find_list, + base_dir=basedir, + install_options=install_options_list + find_links_options, flavor=flavor, - docsdirs=docsdirs, ) # define a pre-defined winpydir, instead of having to guess @@ -1228,7 +1241,7 @@ def make_all( builder.make( remove_existing=remove_existing, - requirements=requirements, + requirements=requirements_files_list, my_winpydir=my_winpydir, ) if str(create_installer).lower() != "false": From 54ab05656d51eb80defe44d50326c7926a3f184c Mon Sep 17 00:00:00 2001 From: stonebig Date: Tue, 28 Jan 2025 23:15:01 +0100 Subject: [PATCH 064/305] further gemini inclusion and backpedals --- make.py | 57 ++++++++++++++++++++++++++++----------------------------- 1 file changed, 28 insertions(+), 29 deletions(-) diff --git a/make.py b/make.py index 377d9b1c..54263745 100644 --- a/make.py +++ b/make.py @@ -125,7 +125,7 @@ def __init__( self, build_number: int, release_level: str, - target, + target_dir: Path, wheels_dir: Path, tools_dirs: list[Path] = None, docs_dirs: list[Path] = None, @@ -151,15 +151,15 @@ def __init__( """ self.build_number = build_number self.release_level = release_level - self.target = target + self.target_dir = Path(target_dir) # Ensure Path object self.wheels_dir = Path(wheels_dir) # Ensure Path object self.tools_dirs = tools_dirs or [] self.docs_dirs = docs_dirs or [] self.verbose = verbose self.winpy_dir: Path | None = None # Will be set during build - self.distribution = None + self.distribution: wppm.Distribution | None = None # Will be set during build self.installed_packages = [] - self.base_dir = base_dir # added to build from winpython + self.base_dir = base_dir self.install_options = install_options self.flavor = flavor @@ -187,9 +187,9 @@ def package_index_markdown(self) -> str: installed_packages_md = self._get_installed_packages_markdown() python_description = "Python programming language with standard library" - return f"""## WinPython {self.winpython_version_name} + return f"""## WinPython {self.winpyver2 + self.flavor} -The following packages are included in WinPython-{self.architecture_bits}bit v{self.winpython_version_name} {self.release_level}. +The following packages are included in WinPython-{self.architecture_bits}bit v{self.winpyver2 + self.flavor} {self.release_level}.
    @@ -1007,7 +1007,7 @@ def make( raise RuntimeError("WinPython base directory to create is undefined") else: self.winpy_dir = str( - Path(self.target) / my_winpydir + Path(self.target_dir) / my_winpydir ) # Create/re-create the WinPython base directory self._print_action(f"Creating WinPython {my_winpydir} base directory") if Path(self.winpy_dir).is_dir() and remove_existing: @@ -1111,29 +1111,26 @@ def make( self._print_action_done() -def rebuild_winpython(codedir, targetdir, architecture=64, verbose=False): - """Rebuild winpython package from source""" - - for name in os.listdir(targetdir): - if name.startswith("winpython-") and name.endswith((".exe", ".whl", ".gz")): - os.remove(str(Path(targetdir) / name)) - # utils.build_wininst is replaced per flit 2023-02-27 +def rebuild_winpython_package(source_dir: Path, target_dir: Path, architecture: int = 64, verbose: bool = False): + """Rebuilds the winpython package from source using flit.""" + for filename in os.listdir(target_dir): + if filename.startswith("winpython-") and filename.endswith((".exe", ".whl", ".gz")): + os.remove(Path(target_dir) / filename) + utils.buildflit_wininst( - codedir, - copy_to=targetdir, + str(source_dir), + copy_to=str(target_dir), verbose=verbose, ) -def _parse_list_argument(list_in, list_type=None): - """Transform a 'String or List' in List""" - if list_in is None: - list_in = "" - if not list_in == list(list_in): - list_in = list_in.split() - if list_type: - print(list_type, list_in) - return list_in +def _parse_list_argument(arg_value: str | list[str]) -> list[str]: + """Parses a string or list argument into a list of strings.""" + if arg_value is None: + return [] + if isinstance(arg_value, str): + return arg_value.split() + return list(arg_value) # Ensure it's a list if already a list-like object def make_all( @@ -1182,11 +1179,13 @@ def make_all( # use source_dirs as the directory to re-build Winpython wheel wheels_dir = source_dirs - # Rebuild Winpython in this wheel dir - rebuild_winpython( - codedir=str(Path(__file__).resolve().parent), # winpython source dir - targetdir=wheels_dir, + # Rebuild WinPython package + winpython_source_dir = Path(__file__).resolve().parent + rebuild_winpython_package( + source_dir=winpython_source_dir, + target_dir=wheels_dir, architecture=architecture, + verbose=verbose, ) # Parse list arguments From 04849053f432df02249923bb684c0b520a069595 Mon Sep 17 00:00:00 2001 From: stonebig Date: Tue, 28 Jan 2025 23:16:27 +0100 Subject: [PATCH 065/305] avoid bad surprises --- winpython/utils.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/winpython/utils.py b/winpython/utils.py index 238faab5..9bf48951 100644 --- a/winpython/utils.py +++ b/winpython/utils.py @@ -610,7 +610,10 @@ def buildflit_wininst( ) ) # remove tempo dir 'root' no more needed - shutil.rmtree(root, onexc=onerror) + #try: + # shutil.rmtree(root, onexc=onerror) + #except TypeError: # before 3.12 + # shutil.rmtree(root, onerror=onerror) return dst_fname From 5cf943367fb9a4cf53f1d5184c3015d48f7852dd Mon Sep 17 00:00:00 2001 From: stonebig Date: Wed, 29 Jan 2025 21:40:24 +0100 Subject: [PATCH 066/305] further gemini inclusion --- make.py | 101 ++++++++++++++++++++++++++++---------------------------- 1 file changed, 51 insertions(+), 50 deletions(-) diff --git a/make.py b/make.py index 54263745..f45b7745 100644 --- a/make.py +++ b/make.py @@ -162,18 +162,28 @@ def __init__( self.base_dir = base_dir self.install_options = install_options self.flavor = flavor + self.python_zip_file: Path = self._get_python_zip_file() + self.python_name = self.python_zip_file.stem # Filename without extension + self.python_dir_name = "python" # Standardized Python directory name - # python_fname = the .zip of the python interpreter PyPy ! - try: # PyPy - self.python_fname = self.get_package_fname( - r"(pypy3|python-)([0-9]|[a-zA-Z]|.)*.zip" - ) - except: # normal Python - self.python_fname = self.get_package_fname( - r"python-([0-9\.rcba]*)((\.|\-)amd64)?\.(zip|zip)" - ) - self.python_name = Path(self.python_fname).name[:-4] - self.python_dir_name = "python" + def _get_python_zip_file(self) -> Path: + """ + Finds the Python zip file in the wheels directory. + + Returns: + Path: Path to the Python zip file. + Raises: + RuntimeError: if no python zip file is found + """ + patterns = [ + r"(pypy3|python-)([0-9]|[a-zA-Z]|.)*.zip", # PyPy pattern + r"python-([0-9\.rcba]*)((\.|\-)amd64)?\.(zip|zip)", # Standard Python pattern + ] + for pattern in patterns: + for filename in os.listdir(self.wheels_dir): + if re.match(pattern, filename): + return self.wheels_dir / filename + raise RuntimeError(f"Could not find Python zip package in {self.wheels_dir}") @property def package_index_markdown(self) -> str: @@ -213,7 +223,7 @@ def _get_installed_tools_markdown(self) -> str: installed_tools = [] def get_tool_path(rel_path): - path = Path(self.winpy_dir) / rel_path if self.winpy_dir else None + path = self.winpy_dir / rel_path if self.winpy_dir else None return path if path and (path.is_file() or path.is_dir()) else None julia_path = get_tool_path(self.JULIA_PATH_REL) @@ -272,14 +282,15 @@ def python_full_version(self) -> str: return "0.0.0" # Placeholder before initialization return utils.get_python_long_version(self.distribution.target) + @property def python_executable_dir(self) -> str: """Returns the directory containing the Python executable.""" - python_path_dir = Path(self.winpy_dir) / self.python_dir_name if self.winpy_dir else None + python_path_dir = self.winpy_dir / self.python_dir_name if self.winpy_dir else None if python_path_dir and python_path_dir.is_dir(): return str(python_path_dir) else: - python_path_exe = Path(self.winpy_dir) / self.python_name if self.winpy_dir else None # Fallback for older structure + python_path_exe = self.winpy_dir / self.python_name if self.winpy_dir else None # Fallback for older structure return str(python_path_exe) if python_path_exe else "" @property @@ -320,16 +331,6 @@ def docs_directories(self) -> list[Path]: return [default_docs_dir] + self.docs_dirs return self.docs_dirs - def get_package_fname(self, pattern): - """Get package matching pattern in wheels_dir""" - path = self.wheels_dir - for fname in os.listdir(path): - match = re.match(pattern, fname) - if match is not None or pattern == fname: - return str((Path(path) / fname).resolve()) - else: - raise RuntimeError(f"Could not find required package matching {pattern}") - def create_batch_script(self, name: str, contents: str, replacements: list[tuple[str, str]] = None): """ Creates a batch script in the WinPython scripts directory. @@ -339,7 +340,7 @@ def create_batch_script(self, name: str, contents: str, replacements: list[tuple contents: The contents of the batch script. replacements: A list of tuples for text replacements in the content. """ - script_dir = Path(self.winpy_dir) / "scripts" if self.winpy_dir else None + script_dir = self.winpy_dir / "scripts" if self.winpy_dir else None if not script_dir: print("Warning: WinPython directory not set, cannot create batch script.") return @@ -428,20 +429,22 @@ def _print_action_done(self): print("OK") def _extract_python_archive(self): - """Extracting Python installer, creating distribution object""" - self._print_action("Extracting Python .zip version") + """Extracts the Python zip archive to create the base Python environment.""" + self._print_action("Extracting Python archive") utils.extract_archive( - self.python_fname, - targetdir=self.python_executable_dir + r"\..", + str(self.python_zip_file), + targetdir=str(self.winpy_dir), # Extract directly to winpy_dir ) self._print_action_done() - # relocate to /python - if Path(self.python_dir_name) != Path(self.winpy_dir) / self.python_dir_name: #2024-12-22 to /python - os.rename(Path(self.python_executable_dir), Path(self.winpy_dir) / self.python_dir_name) + # Relocate to /python subfolder if needed (for newer structure) #2024-12-22 to /python + python_target_dir = self.winpy_dir / self.python_dir_name + if self.python_dir_name != self.python_name and not python_target_dir.is_dir(): + os.rename(self.winpy_dir / self.python_name, python_target_dir) + def _copy_tools(self): """Copies development tools to the WinPython 't' directory.""" - tools_target_dir = Path(self.winpy_dir) / "t" + tools_target_dir = self.winpy_dir / "t" self._print_action(f"Copying tools to {tools_target_dir}") tools_target_dir.mkdir(parents=True, exist_ok=True) for source_dir in self.tools_directories: @@ -461,7 +464,7 @@ def _copy_tools(self): # Special handling for Node.js to move it up one level nodejs_current_dir = tools_target_dir / "n" - nodejs_target_dir = Path(self.winpy_dir) / self.NODEJS_PATH_REL + nodejs_target_dir = self.winpy_dir / self.NODEJS_PATH_REL if nodejs_current_dir != nodejs_target_dir and nodejs_current_dir.is_dir(): try: shutil.move(nodejs_current_dir, nodejs_target_dir) @@ -470,9 +473,10 @@ def _copy_tools(self): self._print_action_done() + def _copy_documentation(self): """Copies documentation files to the WinPython 'docs' directory.""" - docs_target_dir = Path(self.winpy_dir) / "notebooks" / "docs" + docs_target_dir = self.winpy_dir / "notebooks" / "docs" self._print_action(f"Copying documentation to {docs_target_dir}") docs_target_dir.mkdir(parents=True, exist_ok=True) for source_dir in self.docs_directories: @@ -491,16 +495,17 @@ def _copy_documentation(self): print(f"Error copying {source_item} to {target_item}: {e}") self._print_action_done() + def _create_launchers(self): """Create launchers""" self._print_action("Creating launchers") # 2025-01-04: copy launchers premade per the Datalab-Python way portable_dir = Path(__file__).resolve().parent / "portable" / "launchers_final" for path in portable_dir.rglob('*.exe'): - shutil.copy2(path, Path(self.winpy_dir)) - print("new way !!!!!!!!!!!!!!!!!! ", path , " -> ",Path(self.winpy_dir)) + shutil.copy2(path, self.winpy_dir) + print("new way !!!!!!!!!!!!!!!!!! ", path , " -> ",self.winpy_dir) for path in (Path(__file__).resolve().parent / "portable").rglob('licence*.*'): - shutil.copy2(path, Path(self.winpy_dir)) + shutil.copy2(path, self.winpy_dir) self._print_action_done() @@ -998,28 +1003,24 @@ def make( remove_existing=True: (default) install all from scratch remove_existing=False: for complementary purposes (create installers) requirements=file(s) of requirements (separated by space if several)""" - print( - self.python_fname, - self.python_name, - ) + python_zip_filename = self.python_zip_file.name + print(f"Building WinPython with Python archive: {python_zip_filename}") if my_winpydir is None: raise RuntimeError("WinPython base directory to create is undefined") else: - self.winpy_dir = str( - Path(self.target_dir) / my_winpydir - ) # Create/re-create the WinPython base directory + self.winpy_dir = self.target_dir / my_winpydir # Create/re-create the WinPython base directory self._print_action(f"Creating WinPython {my_winpydir} base directory") - if Path(self.winpy_dir).is_dir() and remove_existing: + if self.winpy_dir.is_dir() and remove_existing: try: shutil.rmtree(self.winpy_dir, onexc=utils.onerror) except TypeError: # before 3.12 shutil.rmtree(self.winpy_dir, onerror=utils.onerror) - os.makedirs(Path(self.winpy_dir), exist_ok=True) + os.makedirs(self.winpy_dir, exist_ok=True) if remove_existing: # preventive re-Creation of settings directory # (necessary if user is starting an application with a batch) - (Path(self.winpy_dir) / "settings" / "AppData" / "Roaming").mkdir(parents=True, exist_ok=True) # Ensure settings dir exists + (self.winpy_dir / "settings" / "AppData" / "Roaming").mkdir(parents=True, exist_ok=True) # Ensure settings dir exists self._extract_python_archive() self._print_action_done() @@ -1084,7 +1085,7 @@ def make( # winpyver2 = the version without build part but with self.distribution.architecture self.winpyver2 = f"{self.python_full_version}.{self.build_number}" fname = str( - Path(self.winpy_dir).parent + self.winpy_dir.parent / ( f"WinPython{self.flavor}-" + f"{self.distribution.architecture}bit-" @@ -1211,7 +1212,7 @@ def make_all( # define a pre-defined winpydir, instead of having to guess # extract the python subversion to get WPy64-3671b1 - my_x = "".join(builder.python_fname.replace(".amd64", "").split(".")[-2:-1]) + my_x = "".join(builder.python_name.replace(".amd64", "").split(".")[-2:-1]) while not my_x.isdigit() and len(my_x) > 0: my_x = my_x[:-1] # simplify for PyPy From 5f8519e0df0835d9c5dc398e040703db547e4cbc Mon Sep 17 00:00:00 2001 From: stonebig Date: Wed, 29 Jan 2025 21:59:15 +0100 Subject: [PATCH 067/305] further gemini inclusion --- make.py | 41 +++++++++++++++++------------------------ 1 file changed, 17 insertions(+), 24 deletions(-) diff --git a/make.py b/make.py index f45b7745..fdd928c5 100644 --- a/make.py +++ b/make.py @@ -500,12 +500,12 @@ def _create_launchers(self): """Create launchers""" self._print_action("Creating launchers") # 2025-01-04: copy launchers premade per the Datalab-Python way - portable_dir = Path(__file__).resolve().parent / "portable" / "launchers_final" - for path in portable_dir.rglob('*.exe'): - shutil.copy2(path, self.winpy_dir) - print("new way !!!!!!!!!!!!!!!!!! ", path , " -> ",self.winpy_dir) - for path in (Path(__file__).resolve().parent / "portable").rglob('licence*.*'): - shutil.copy2(path, self.winpy_dir) + launchers_source_dir = PORTABLE_DIR / "launchers_final" + for item in launchers_source_dir.rglob('*.exe'): + shutil.copy2(item, self.winpy_dir) + print("new way !!!!!!!!!!!!!!!!!! ", item , " -> ",self.winpy_dir) + for item in launchers_source_dir.rglob('licence*.*'): + shutil.copy2(item, self.winpy_dir) self._print_action_done() @@ -567,9 +567,9 @@ def _create_initial_batch_scripts(self): rem force default pyqt5 kit for Spyder if PyQt5 module is there if exist "%WINPYDIR%\\Lib\\site-packages\\PyQt5\\__init__.py" set QT_API=pyqt5 """ - self.create_batch_script("env.bat", env_bat_content, replacements=batch_replacements) + ps1_content = r"""### WinPython_PS_Prompt.ps1 ### $0 = $myInvocation.MyCommand.Definition $dp0 = [System.IO.Path]::GetDirectoryName($0) @@ -615,11 +615,10 @@ def _create_initial_batch_scripts(self): Param([int]$x=$host.ui.rawui.windowsize.width, [int]$y=$host.ui.rawui.windowsize.heigth, [int]$buffer=$host.UI.RawUI.BufferSize.heigth) - $buffersize = new-object System.Management.Automation.Host.Size($x,$buffer) $host.UI.RawUI.BufferSize = $buffersize $size = New-Object System.Management.Automation.Host.Size($x,$y) - $host.ui.rawui.WindowSize = $size + $host.ui.rawui.WindowSize = $size } # Windows10 yelling at us with 150 40 6000 # Set-WindowSize 195 40 6000 @@ -629,16 +628,15 @@ def _create_initial_batch_scripts(self): $host.ui.RawUI.ForegroundColor = "White" } """ - self.create_batch_script("WinPython_PS_Prompt.ps1", ps1_content, replacements=batch_replacements) - cmd_ps_bat_content = r"""@echo off call "%~dp0env_for_icons.bat" Powershell.exe -Command "& {Start-Process PowerShell.exe -ArgumentList '-ExecutionPolicy RemoteSigned -noexit -File ""%~dp0WinPython_PS_Prompt.ps1""'}" """ self.create_batch_script("cmd_ps.bat", cmd_ps_bat_content, replacements=batch_replacements) + env_for_icons_bat_content = r"""@echo off call "%~dp0env.bat" @@ -675,15 +673,12 @@ def _create_initial_batch_scripts(self): if not "%WINPYWORKDIR%"=="" if not exist "%WINPYWORKDIR%" mkdir "%WINPYWORKDIR%" if not "%WINPYWORKDIR1%"=="" if not exist "%WINPYWORKDIR1%" mkdir "%WINPYWORKDIR1%" - rem Change of directory only if we are in a launcher directory if "%__CD__%scripts\"=="%~dp0" cd/D %WINPYWORKDIR1% if "%__CD__%"=="%~dp0" cd/D %WINPYWORKDIR1% - if not exist "%HOME%\.spyder-py%WINPYVER:~0,1%" mkdir "%HOME%\.spyder-py%WINPYVER:~0,1%" if not exist "%HOME%\.spyder-py%WINPYVER:~0,1%\workingdir" echo %HOME%\Notebooks>"%HOME%\.spyder-py%WINPYVER:~0,1%\workingdir" - """ self.create_batch_script("env_for_icons.bat", env_for_icons_bat_content, replacements=batch_replacements) @@ -745,12 +740,12 @@ def main(): import sys args = sys.argv[1:] file_name = args[0] if args else "..\\settings\\winpython.ini" - + my_lines = get_file(file_name).splitlines() segment = "environment" txt = "" env = os.environ.copy() # later_version: env = os.environ - + # default directories (from .bat) os.makedirs(Path(env['WINPYDIRBASE']) / 'settings' / 'Appdata' / 'Roaming', exist_ok=True) @@ -779,7 +774,7 @@ def main(): env[data[0].strip()] = translate(data[1].strip(), env) if segment == "debug" and data[0].strip() == "state": txt += f"set WINPYDEBUG={data[1].strip()}&&" - + print(txt) # set potential directory @@ -812,7 +807,6 @@ def _create_standard_batch_scripts(self): self.create_batch_script("readme.txt", """These batch files are required to run WinPython icons. - These files should help the user writing his/her own specific batch file to call Python scripts inside WinPython. The environment variables are set-up in 'env_.bat' and 'env_for_icons.bat'.""", @@ -991,6 +985,7 @@ def _run_complementary_batch_scripts(self, script_name="run_complement.bat"): self._print_action(f"Execution failed: {e}!") self._print_action_done() + def make( self, remove_existing=True, @@ -1024,16 +1019,12 @@ def make( self._extract_python_archive() self._print_action_done() - self.distribution = wppm.Distribution( self.python_executable_dir, verbose=self.verbose, indent=True, ) - - - # Assert that WinPython version and real python version do match self._print_action( f"Python version{self.python_full_version.replace('.','')}" @@ -1050,8 +1041,8 @@ def make( self._create_standard_batch_scripts() self._create_launchers() utils.python_execmodule("ensurepip", self.distribution.target) # Ensure pip is installed for PyPy - self.distribution.patch_standard_packages("pip") + # Upgrade essential packages essential_packages = ["pip", "setuptools", "wheel", "winpython"] for package_name in essential_packages: @@ -1074,6 +1065,7 @@ def make( print(f"piping {' '.join(actions)}") self._print_action(f"piping {' '.join(actions)}") self.distribution.do_pip_action(actions) + self._run_complementary_batch_scripts() self.distribution.patch_standard_packages() @@ -1094,6 +1086,7 @@ def make( ) open(fname, "w", encoding='utf-8').write(self.package_index_markdown) # Copy to winpython/changelogs + shutil.copyfile( fname, str(Path(CHANGELOGS_DIR) / Path(fname).name), @@ -1272,4 +1265,4 @@ def make_all( source_dirs=r"D:\WinPython\basedir34\packages.win-amd64", toolsdirs=r"D:\WinPython\basedir34\t.Slim", docsdirs=r"D:\WinPython\basedir34\docs.Slim", - ) + ) \ No newline at end of file From 3325459d65b1e403a2c7fcdbb3896c115c4377de Mon Sep 17 00:00:00 2001 From: stonebig Date: Wed, 29 Jan 2025 22:39:54 +0100 Subject: [PATCH 068/305] further gemini inclusion --- make.py | 32 ++++++++++---------------------- 1 file changed, 10 insertions(+), 22 deletions(-) diff --git a/make.py b/make.py index fdd928c5..a84b4b22 100644 --- a/make.py +++ b/make.py @@ -158,9 +158,8 @@ def __init__( self.verbose = verbose self.winpy_dir: Path | None = None # Will be set during build self.distribution: wppm.Distribution | None = None # Will be set during build - self.installed_packages = [] self.base_dir = base_dir - self.install_options = install_options + self.install_options = install_options or [] self.flavor = flavor self.python_zip_file: Path = self._get_python_zip_file() self.python_name = self.python_zip_file.stem # Filename without extension @@ -266,10 +265,10 @@ def _get_installed_packages_markdown(self) -> str: ] return "\n".join(package_lines) - # @property makes self.winpython_version_name becomes a call to self.winpython_version_name() + @property - def winpython_version_name(self): - """Return WinPython version (with flavor and release level!)""" + def winpython_version_name(self) -> str: + """Returns the full WinPython version string.""" return f"{self.python_full_version}.{self.build_number}{self.flavor}{self.release_level}" @property @@ -497,13 +496,13 @@ def _copy_documentation(self): def _create_launchers(self): - """Create launchers""" + """Copies pre-made launchers to the WinPython directory.""" self._print_action("Creating launchers") - # 2025-01-04: copy launchers premade per the Datalab-Python way launchers_source_dir = PORTABLE_DIR / "launchers_final" for item in launchers_source_dir.rglob('*.exe'): shutil.copy2(item, self.winpy_dir) - print("new way !!!!!!!!!!!!!!!!!! ", item , " -> ",self.winpy_dir) + if self.verbose: + print(f" Copied launcher: {item.name} -> {self.winpy_dir}") for item in launchers_source_dir.rglob('licence*.*'): shutil.copy2(item, self.winpy_dir) self._print_action_done() @@ -683,7 +682,6 @@ def _create_initial_batch_scripts(self): self.create_batch_script("env_for_icons.bat", env_for_icons_bat_content, replacements=batch_replacements) - # Replaces winpython.vbs, and a bit of env.bat winpython_ini_py_content = r""" # Prepares a dynamic list of variables settings from a .ini file import os @@ -986,7 +984,7 @@ def _run_complementary_batch_scripts(self, script_name="run_complement.bat"): self._print_action_done() - def make( + def build( self, remove_existing=True, requirements=None, @@ -1025,17 +1023,6 @@ def make( indent=True, ) - # Assert that WinPython version and real python version do match - self._print_action( - f"Python version{self.python_full_version.replace('.','')}" - + f"\nDistro Name {self.distribution.target}" - ) - assert self.python_full_version.replace(".", "") in self.distribution.target, ( - "Distro Directory doesn't match the Python version it ships" - + f"\nPython version: {self.python_full_version.replace('.','')}" - + f"\nDistro Name: {self.distribution.target}" - ) - if remove_existing: self._create_initial_batch_scripts() self._create_standard_batch_scripts() @@ -1232,7 +1219,7 @@ def make_all( ) + release_level # + flavor - builder.make( + builder.build( remove_existing=remove_existing, requirements=requirements_files_list, my_winpydir=my_winpydir, @@ -1244,6 +1231,7 @@ def make_all( builder.create_installer_7zip(".7z") if "7zip" in str(create_installer).lower(): builder.create_installer_7zip(".exe") + return builder From 6ce98fda2b243c16c0252574305b6373899955d1 Mon Sep 17 00:00:00 2001 From: stonebig Date: Thu, 30 Jan 2025 18:51:40 +0100 Subject: [PATCH 069/305] further gemini flash tweaks --- make.py | 55 +++++++++++++++++++++++++------------------------------ 1 file changed, 25 insertions(+), 30 deletions(-) diff --git a/make.py b/make.py index a84b4b22..ebc14920 100644 --- a/make.py +++ b/make.py @@ -107,7 +107,8 @@ def build_installer_7zip( command = f'"{output_script_path}"' print(f"Executing 7-Zip script: {command}") subprocess.run( - command, shell=True, check=True, stderr=sys.stderr, stdout=sys.stderr #=sys.stdout + command, shell=True, check=True, stderr=sys.stderr, stdout=sys.stderr + # with stdout=sys.stdout, we would not see 7zip compressing ) # Use subprocess.run for better error handling except subprocess.CalledProcessError as e: print(f"Error executing 7-Zip script: {e}", file=sys.stderr) @@ -806,8 +807,7 @@ def _create_standard_batch_scripts(self): self.create_batch_script("readme.txt", """These batch files are required to run WinPython icons. These files should help the user writing his/her own -specific batch file to call Python scripts inside WinPython. -The environment variables are set-up in 'env_.bat' and 'env_for_icons.bat'.""", +The environment variables are set-up in 'env.bat' and 'env_for_icons.bat'.""", ) self.create_batch_script( @@ -984,12 +984,7 @@ def _run_complementary_batch_scripts(self, script_name="run_complement.bat"): self._print_action_done() - def build( - self, - remove_existing=True, - requirements=None, - my_winpydir=None, - ): + def build(self, remove_existing: bool = True, requirements=None, winpy_dirname: str = None): """Make WinPython distribution in target directory from the installers located in wheels_dir @@ -999,11 +994,11 @@ def build( python_zip_filename = self.python_zip_file.name print(f"Building WinPython with Python archive: {python_zip_filename}") - if my_winpydir is None: + if winpy_dirname is None: raise RuntimeError("WinPython base directory to create is undefined") else: - self.winpy_dir = self.target_dir / my_winpydir # Create/re-create the WinPython base directory - self._print_action(f"Creating WinPython {my_winpydir} base directory") + self.winpy_dir = self.target_dir / winpy_dirname # Create/re-create the WinPython base directory + self._print_action(f"Creating WinPython {self.winpy_dir} base directory") if self.winpy_dir.is_dir() and remove_existing: try: shutil.rmtree(self.winpy_dir, onexc=utils.onerror) @@ -1115,22 +1110,22 @@ def _parse_list_argument(arg_value: str | list[str]) -> list[str]: def make_all( - build_number, - release_level, - pyver, - architecture, - basedir, - verbose=False, - remove_existing=True, - create_installer=True, + build_number: int, + release_level: str, + pyver: str, + architecture: int, + basedir: Path, + verbose: bool = False, + remove_existing: bool = True, + create_installer: str = "True", install_options=["--no-index"], - flavor="", - requirements=None, - find_links=None, - source_dirs=None, - toolsdirs=None, - docsdirs=None, - python_target_release=None, # 37101 for 3.7.10 + flavor: str = "", + requirements: str | list[Path] = None, + find_links: str | list[Path] = None, + source_dirs: Path = None, + toolsdirs: str | list[Path] = None, + docsdirs: str | list[Path] = None, + python_target_release: str = None, # e.g. "37101" for 3.7.10 ): """Make WinPython distribution, for a given base directory and architecture: @@ -1197,7 +1192,7 @@ def make_all( my_x = my_x[:-1] # simplify for PyPy if not python_target_release == None: - my_winpydir = ( + winpy_dirname = ( "WPy" + f"{architecture}" + "-" @@ -1207,7 +1202,7 @@ def make_all( ) + release_level # + flavor else: - my_winpydir = ( + winpy_dirname = ( "WPy" + f"{architecture}" + "-" @@ -1222,7 +1217,7 @@ def make_all( builder.build( remove_existing=remove_existing, requirements=requirements_files_list, - my_winpydir=my_winpydir, + winpy_dirname=winpy_dirname, ) if str(create_installer).lower() != "false": if ".zip" in str(create_installer).lower(): From e77b8746b9037c1e83517b2300012f4cf69c08e3 Mon Sep 17 00:00:00 2001 From: stonebig Date: Sat, 1 Feb 2025 17:49:59 +0100 Subject: [PATCH 070/305] simplify using copilote/gpt4o note gpt4o doesn't propose typing... one thing at a time --- winpython/piptree.py | 190 +++++++++++++++++++++++-------------------- winpython/wppm.py | 10 +-- 2 files changed, 108 insertions(+), 92 deletions(-) diff --git a/winpython/piptree.py b/winpython/piptree.py index 20f8340f..309d71bd 100644 --- a/winpython/piptree.py +++ b/winpython/piptree.py @@ -1,32 +1,34 @@ # -*- coding: utf-8 -*- # require python 3.8+ because of importlib.metadata -import json, sys, re, platform, os, sysconfig +import json +import sys import re +import platform +import os from collections import OrderedDict -from pip._vendor.packaging.markers import Marker -from importlib.metadata import Distribution , distributions +from pip._vendor.packaging.markers import Marker, InvalidMarker +from importlib.metadata import Distribution, distributions from pathlib import Path -import configparser as cp -def normalize(this): - """apply https://peps.python.org/pep-0503/#normalized-names""" - return re.sub(r"[-_.]+", "-", this).lower() +def normalize(name): + """Normalize package name according to PEP 503.""" + return re.sub(r"[-_.]+", "-", name).lower() -def sum_up(this, max_length=144, stop_at=". "): - """Keep only 1 line of max_length characters at most""" - sumup = (this + os.linesep).splitlines()[0] - if len(sumup) > max_length and len(stop_at)>1: - sumup = (sumup + stop_at ).split(stop_at)[0] - if len(sumup) > max_length: - sumup = sumup[:max_length] - return sumup +def sum_up(text, max_length=144, stop_at=". "): + """Summarize text to a single line of max_length characters.""" + summary = (text + os.linesep).splitlines()[0] + if len(summary) > max_length and len(stop_at) > 1: + summary = (summary + stop_at).split(stop_at)[0] + if len(summary) > max_length: + summary = summary[:max_length] + return summary class pipdata: """Wrapper around Distribution.discover() or Distribution.distributions()""" - def __init__(self, Target=None): + def __init__(self, target=None): # create a distro{} dict of Packages # key = normalised package name @@ -36,16 +38,31 @@ def __init__(self, Target=None): # req_extra = extra branch needed of the package_key ('all' or '') # req_version = version needed # req_marker = marker of the requirement (if any) - # on current Python, use from importlib.metadata + Distribution.Discover() for 2x speed-up - # on other Python, use importlib.metadata + distributions(path=[str(Path(Target).parent /'lib'/'site-packages'),]) + self.distro = {} self.raw = {} - replacements = str.maketrans({" ": "", "[": "", "]": "", "'": "", '"': ""}) - self.environment = { + self.environment = self._get_environment() + + target = target or sys.executable + + if sys.executable==target: + # self-Distro inspection case (use all packages reachable per sys.path I presume ) + packages=Distribution.discover() + else: + # not self-Distro inspection case , look at site-packages only) + packages=distributions(path=[str(Path(target).parent /'lib'/'site-packages'),]) + + for package in packages: + self._process_package(package) + + # On a second pass, complement distro in reverse mode with 'wanted-per': + self._populate_wanted_per() + + def _get_environment(self): + """Get the current environment details.""" + return { "implementation_name": sys.implementation.name, - "implementation_version": "{0.major}.{0.minor}.{0.micro}".format( - sys.implementation.version - ), + "implementation_version": "{0.major}.{0.minor}.{0.micro}".format(sys.implementation.version), "os_name": os.name, "platform_machine": platform.machine(), "platform_release": platform.release(), @@ -57,89 +74,88 @@ def __init__(self, Target=None): "sys_platform": sys.platform, } - if Target == None: - Target = sys.executable + def _process_package(self, package): + """Process a single package and add it to the distro dictionary.""" + meta = package.metadata + name = meta['Name'] + version = package.version + key = normalize(name) + self.raw[key] = meta + provided = {'': None} + #requires = self._get_requires(package) + #provides = self._get_provides(package) - if sys.executable==Target: - # self-Distro inspection case (use all packages reachable per sys.path I presume ) - pip_json_installed=Distribution.discover() - else: - # not self-Distro inspection case , look at site-packages only) - pip_json_installed=distributions(path=[str(Path(Target).parent /'lib'/'site-packages'),]) - for p in pip_json_installed: - meta = p.metadata - name = p.metadata['Name'] # p.name is not ok in 3.8 - version = p.version - key = normalize(name) - requires = [] - provides = {'':None} - provided = {'':None} - self.raw[key] = meta - if p.requires: - for i in p.requires: - det = (i + ";").split(";") - - # req_nameextra is "python-jose[cryptography]" - # from fastapi "python-jose[cryptography]<4.0.0,>=3.3.0 - # req_nameextra is "google-cloud-storage" - # from "google-cloud-storage (<2.0.0,>=1.26.0) - req_nameextra = re.split(" |;|==|!|>|<", det[0] + ";")[0] - req_nameextra = normalize(req_nameextra) - req_key = normalize((req_nameextra + "[").split("[")[0]) - req_key_extra = req_nameextra[len(req_key) + 1 :].split("]")[0] - req_version = det[0][len(req_nameextra) :].translate(replacements) - req_marker = det[1] - if 'extra == ' in req_marker: - remove_list = {ord("'"):None, ord('"'):None} - provides[req_marker.split('extra == ')[1].translate(remove_list)] = None - req_add = { - "req_key": req_key, - "req_version": req_version, - "req_extra": req_key_extra, - } - # add the marker of the requirement, if not nothing: - if not req_marker == "": - req_add["req_marker"] = req_marker - requires += [req_add] - self.distro[key] = { - "name": name, - "version": p.version, - "summary": meta["Summary"] if "Summary" in meta else "", - "requires_dist": requires, - "wanted_per": [], - "description": meta["Description"] if "Description" in meta else "", - "provides": provides, # extras of the package: 'array' for dask because dask['array'] defines some extra - "provided": provided, # extras from other package: 'test' for pytest because dask['test'] wants pytest - } - # On a second pass, complement distro in reverse mode with 'wanted-per': + requires = [] + provides = {'':None} + + replacements = str.maketrans({" ": "", "[": "", "]": "", "'": "", '"': ""}) + if package.requires: + for i in package.requires: + det = (i + ";").split(";") + # req_nameextra is "python-jose[cryptography]" + # from fastapi "python-jose[cryptography]<4.0.0,>=3.3.0 + # req_nameextra is "google-cloud-storage" + # from "google-cloud-storage (<2.0.0,>=1.26.0) + req_nameextra = re.split(" |;|==|!|>|<", det[0] + ";")[0] + req_nameextra = normalize(req_nameextra) + req_key = normalize((req_nameextra + "[").split("[")[0]) + req_key_extra = req_nameextra[len(req_key) + 1 :].split("]")[0] + req_version = det[0][len(req_nameextra) :].translate(replacements) + req_marker = det[1] + if 'extra == ' in req_marker: + remove_list = {ord("'"):None, ord('"'):None} + provides[req_marker.split('extra == ')[1].translate(remove_list)] = None + req_add = { + "req_key": req_key, + "req_version": req_version, + "req_extra": req_key_extra, + } + # add the marker of the requirement, if not nothing: + if not req_marker == "": + req_add["req_marker"] = req_marker + requires += [req_add] + self.distro[key] = { + "name": name, + "version": version, + "summary": meta.get("Summary", ""), + "requires_dist": requires, + "wanted_per": [], + "description": meta.get("Description", ""), + "provides": provides, # extras of the package: 'array' for dask because dask['array'] defines some extra + "provided": provided, # extras from other package: 'test' for pytest because dask['test'] wants pytest + } + + def _populate_wanted_per(self): + """Populate the wanted_per field for each package.""" # - get all downward links in 'requires_dist' of each package # - feed the required packages 'wanted_per' as a reverse dict of dict # contains = # req_key = upstream package_key # req_version = downstream package version wanted # req_marker = marker of the downstream package requirement (if any) - for p in self.distro: for r in self.distro[p]["requires_dist"]: if r["req_key"] in self.distro: want_add = { - "req_key": p, # p is a string + "req_key": p, "req_version": r["req_version"], "req_extra": r["req_extra"], - } # req_key_extra - - # provided = extras in upper packages that triggers the need for this package, - # like 'pandas[test]->Pytest', so 'test' in distro['pytest']['provided']['test'] - # corner-cases: 'dask[dataframe]' -> dask[array]' - # 'dask-image ->dask[array] - + } if "req_marker" in r: want_add["req_marker"] = r["req_marker"] # req_key_extra + + # provided = extras in upper packages that triggers the need for this package, + # like 'pandas[test]->Pytest', so 'test' in distro['pytest']['provided']['test'] + # corner-cases: 'dask[dataframe]' -> dask[array]' + # 'dask-image ->dask[array] + if 'extra == ' in r["req_marker"]: remove_list = {ord("'"):None, ord('"'):None} self.distro[r["req_key"]]["provided"][r["req_marker"].split('extra == ')[1].translate(remove_list)] = None - self.distro[r["req_key"]]["wanted_per"] += [want_add] + self.distro[r["req_key"]]["wanted_per"].append(want_add) + + def _downraw(self, pp, extra="", version_req="", depth=20, path=[], verbose=False): """build a nested list of needed packages with given extra and depth""" diff --git a/winpython/wppm.py b/winpython/wppm.py index 27feb107..ccba836d 100644 --- a/winpython/wppm.py +++ b/winpython/wppm.py @@ -183,7 +183,7 @@ def get_installed_packages(self, update=False): if str(Path(sys.executable).parent) == self.target: self.pip = piptree.pipdata() else: - self.pip = piptree.pipdata(Target=utils.get_python_executable(self.target)) + self.pip = piptree.pipdata(utils.get_python_executable(self.target)) pip_list = self.pip.pip_list() # create pip package list @@ -645,17 +645,17 @@ def main(test=False): if args.registerWinPython and args.unregisterWinPython: raise RuntimeError("Incompatible arguments: --install and --uninstall") if args.pipdown: - pip = piptree.pipdata(Target=targetpython) + pip = piptree.pipdata(targetpython) pack, extra, *other = (args.fname + "[").replace("]", "[").split("[") print(pip.down(pack, extra, args.levels, verbose=args.verbose)) sys.exit() elif args.pipup: - pip = piptree.pipdata(Target=targetpython) + pip = piptree.pipdata(targetpython) pack, extra, *other = (args.fname + "[").replace("]", "[").split("[") print(pip.up(pack, extra, args.levels, verbose=args.verbose)) sys.exit() elif args.list: - pip = piptree.pipdata(Target=targetpython) + pip = piptree.pipdata(targetpython) todo = [l for l in pip.pip_list(full=True) if bool(re.search(args.fname, l[0])) ] titles = [['Package', 'Version', 'Summary'],['_' * max(x, 6) for x in utils.columns_width(todo)]] listed = utils.formatted_list(titles + todo, max_width=70) @@ -663,7 +663,7 @@ def main(test=False): print(*p) sys.exit() elif args.all: - pip = piptree.pipdata(Target=targetpython) + pip = piptree.pipdata(targetpython) todo = [l for l in pip.pip_list(full=True) if bool(re.search(args.fname, l[0])) ] for l in todo: # print(pip.distro[l[0]]) From 8b3a617bec35fa0bdbdab53fe9c9f8c1a373fdf1 Mon Sep 17 00:00:00 2001 From: stonebig Date: Sat, 1 Feb 2025 18:21:53 +0100 Subject: [PATCH 071/305] simplify piptree using copilote-gpt4o has to do manualy otherwise suprises... --- winpython/piptree.py | 67 ++++++++++++++++++++++++-------------------- 1 file changed, 36 insertions(+), 31 deletions(-) diff --git a/winpython/piptree.py b/winpython/piptree.py index 309d71bd..70ba8d10 100644 --- a/winpython/piptree.py +++ b/winpython/piptree.py @@ -82,49 +82,56 @@ def _process_package(self, package): key = normalize(name) self.raw[key] = meta provided = {'': None} - #requires = self._get_requires(package) - #provides = self._get_provides(package) + + requires = self._get_requires(package) + provides = self._get_provides(package) + self.distro[key] = { + "name": name, + "version": version, + "summary": meta.get("Summary", ""), + "requires_dist": requires, + "wanted_per": [], + "description": meta.get("Description", ""), + "provides": provides, # extras of the package: 'array' for dask because dask['array'] defines some extra + "provided": provided, # extras from other package: 'test' for pytest because dask['test'] wants pytest + } + def _get_requires(self, package): + """Get the requirements of a package.""" requires = [] - provides = {'':None} - replacements = str.maketrans({" ": "", "[": "", "]": "", "'": "", '"': ""}) if package.requires: - for i in package.requires: - det = (i + ";").split(";") + for req in package.requires: # req_nameextra is "python-jose[cryptography]" # from fastapi "python-jose[cryptography]<4.0.0,>=3.3.0 # req_nameextra is "google-cloud-storage" # from "google-cloud-storage (<2.0.0,>=1.26.0) - req_nameextra = re.split(" |;|==|!|>|<", det[0] + ";")[0] - req_nameextra = normalize(req_nameextra) + req_nameextra, req_marker = (req + ";").split(";")[:2] + req_nameextra = normalize(re.split(" |;|==|!|>|<", req_nameextra+";")[0]) req_key = normalize((req_nameextra + "[").split("[")[0]) - req_key_extra = req_nameextra[len(req_key) + 1 :].split("]")[0] - req_version = det[0][len(req_nameextra) :].translate(replacements) - req_marker = det[1] - if 'extra == ' in req_marker: - remove_list = {ord("'"):None, ord('"'):None} - provides[req_marker.split('extra == ')[1].translate(remove_list)] = None + req_key_extra = req_nameextra[len(req_key) + 1:].split("]")[0] + req_version = req[len(req_nameextra):].translate(replacements) req_add = { "req_key": req_key, "req_version": req_version, "req_extra": req_key_extra, } - # add the marker of the requirement, if not nothing: if not req_marker == "": req_add["req_marker"] = req_marker - requires += [req_add] - self.distro[key] = { - "name": name, - "version": version, - "summary": meta.get("Summary", ""), - "requires_dist": requires, - "wanted_per": [], - "description": meta.get("Description", ""), - "provides": provides, # extras of the package: 'array' for dask because dask['array'] defines some extra - "provided": provided, # extras from other package: 'test' for pytest because dask['test'] wants pytest - } + requires.append(req_add) + return requires + + def _get_provides(self, package): + """Get the provides of a package.""" + provides = {'': None} + if package.requires: + for req in package.requires: + req_marker = (req + ";").split(";")[1] + if 'extra == ' in req_marker: + remove_list = {ord("'"): None, ord('"'): None} + provides[req_marker.split('extra == ')[1].translate(remove_list)] = None + return provides def _populate_wanted_per(self): """Populate the wanted_per field for each package.""" @@ -162,7 +169,7 @@ def _downraw(self, pp, extra="", version_req="", depth=20, path=[], verbose=Fals envi = {"extra": extra, **self.environment} p = normalize(pp) - # several extras request management: example dask[array,diagnostics] + # handles several extras, example: dask[array,diagnostics] extras = extra.split(",") ret_all = [] @@ -178,9 +185,7 @@ def _downraw(self, pp, extra="", version_req="", depth=20, path=[], verbose=Fals ret = [f'{p}[{extra}]=={self.distro[p]["version"]} {version_req}{summary}'] for r in self.distro[p]["requires_dist"]: if r["req_key"] in self.distro: - if "req_marker" not in r or Marker(r["req_marker"]).evaluate( - environment=envi - ): + if "req_marker" not in r or Marker(r["req_marker"]).evaluate(environment=envi): ret += self._downraw( r["req_key"], r["req_extra"], @@ -189,7 +194,7 @@ def _downraw(self, pp, extra="", version_req="", depth=20, path=[], verbose=Fals path + [p+"["+extra+"]"], verbose=verbose, ) - ret_all += [ret] + ret_all.append(ret) return ret_all def _upraw(self, pp, extra="", version_req="", depth=20, path=[], verbose=False): From 3a9349cc8dfca6ada1126512ca78f5a25a4c229e Mon Sep 17 00:00:00 2001 From: stonebig Date: Sat, 1 Feb 2025 19:48:40 +0100 Subject: [PATCH 072/305] further piptree improvement from githug-copilote-gpt4o free --- winpython/piptree.py | 88 ++++++++++++++++++-------------------------- 1 file changed, 36 insertions(+), 52 deletions(-) diff --git a/winpython/piptree.py b/winpython/piptree.py index 70ba8d10..aa2960df 100644 --- a/winpython/piptree.py +++ b/winpython/piptree.py @@ -55,7 +55,7 @@ def __init__(self, target=None): for package in packages: self._process_package(package) - # On a second pass, complement distro in reverse mode with 'wanted-per': + # On a second pass, complement dependancies in reverse mode with 'wanted-per': self._populate_wanted_per() def _get_environment(self): @@ -93,8 +93,8 @@ def _process_package(self, package): "requires_dist": requires, "wanted_per": [], "description": meta.get("Description", ""), - "provides": provides, # extras of the package: 'array' for dask because dask['array'] defines some extra - "provided": provided, # extras from other package: 'test' for pytest because dask['test'] wants pytest + "provides": provides, + "provided": provided, # being extras from other packages: 'test' for pytest because dask['test'] wants pytest } def _get_requires(self, package): @@ -123,7 +123,8 @@ def _get_requires(self, package): return requires def _get_provides(self, package): - """Get the provides of a package.""" + """Get the extended list of dependant packages, from extra options.""" + # 'array' is an added dependancy package of dask, if you install dask['array'] provides = {'': None} if package.requires: for req in package.requires: @@ -140,6 +141,7 @@ def _populate_wanted_per(self): # contains = # req_key = upstream package_key # req_version = downstream package version wanted + # req_extra = extra option of the demanding package that wants this dependancy # req_marker = marker of the downstream package requirement (if any) for p in self.distro: for r in self.distro[p]["requires_dist"]: @@ -167,14 +169,11 @@ def _populate_wanted_per(self): def _downraw(self, pp, extra="", version_req="", depth=20, path=[], verbose=False): """build a nested list of needed packages with given extra and depth""" envi = {"extra": extra, **self.environment} - p = normalize(pp) - - # handles several extras, example: dask[array,diagnostics] - extras = extra.split(",") - + p = normalize(pp) + extras = extra.split(",") # to handle several extras, example: dask[array,diagnostics] ret_all = [] - if p+"["+extra+"]" in path: # for dask[complete]->dask[array,test,..] - print("cycle!", "->".join(path + [p+"["+extra+"]"])) + if p + "[" + extra + "]" in path: # for dask[complete]->dask[array,test,..] + print("cycle!", "->".join(path + [p + "[" + extra + "]"])) elif p in self.distro and len(path) <= depth: for extra in extras: # several extras request management envi = {"extra": extra, **self.environment} @@ -191,7 +190,7 @@ def _downraw(self, pp, extra="", version_req="", depth=20, path=[], verbose=Fals r["req_extra"], r["req_version"], depth, - path + [p+"["+extra+"]"], + path + [p + "[" +extra + "]"], verbose=verbose, ) ret_all.append(ret) @@ -219,7 +218,7 @@ def _upraw(self, pp, extra="", version_req="", depth=20, path=[], verbose=False) return [] ret = [] for r in self.distro[p]["wanted_per"]: - up_req = (r["req_marker"].split('extra == ')+[""])[1].translate(remove_list) if "req_marker" in r else "" + up_req = (r.get("req_marker", "").split('extra == ')+[""])[1].translate(remove_list) if r["req_key"] in self.distro and r["req_key"]+"["+up_req+"]" not in path: # avoids circular links on dask[array] # 2024-06-30 example of langchain <- numpy. pip.distro['numpy']['wanted_per'] has: # {'req_key': 'langchain', 'req_version': '(>=1,<2)', 'req_extra': '', 'req_marker': ' python_version < "3.12"'}, @@ -243,74 +242,59 @@ def _upraw(self, pp, extra="", version_req="", depth=20, path=[], verbose=False) verbose=verbose, ) if not ret == []: - ret_all += [ret] + ret_all.append(ret) return ret_all def down(self, pp="", extra="", depth=99, indent=5, version_req="", verbose=False): """print the downward requirements for the package or all packages""" - if not pp == ".": - if not extra == ".": + if pp != ".": + if extra != ".": if pp in self.distro: extras = [s for s in extra.split(',') if s in sorted(self.distro[pp]["provides"])] if extras == []: return '' - rawtext = json.dumps( - self._downraw(pp, extra, version_req, depth, verbose=verbose), indent=indent - ) + rawtext = json.dumps(self._downraw(pp, extra, version_req, depth, verbose=verbose), indent=indent) lines = [l for l in rawtext.split("\n") if len(l.strip()) > 2] return ("\n".join(lines).replace('"', "")) else: if pp in self.distro: - r = [] - for one_extra in sorted(self.distro[pp]["provides"]): - s = self.down(pp, one_extra, depth, indent, version_req, verbose=verbose) - if s != '': r += [s] - #print(r) - return '\n'.join([i for i in r if i!= '']) + results = [self.down(pp, one_extra, depth, indent, version_req, verbose=verbose) + for one_extra in sorted(self.distro[pp]["provides"])] + return '\n'.join(filter(None, results)) else: - r = [] - for one_pp in sorted(self.distro): - s = self.down(one_pp, extra, depth, indent, version_req, verbose=verbose) - if s != '': r += [s] - return '\n'.join([i for i in r if i!= '']) - + results = [self.down(one_pp, extra, depth, indent, version_req, verbose=verbose) + for one_pp in sorted(self.distro)] + return '\n'.join(filter(None, results)) + def up(self, pp, extra="", depth=99, indent=5, version_req="", verbose=False): - """print the upward needs for the package""" + """Print the upward needs for the package.""" r = [] - if not pp == ".": - if not extra == ".": - s = self._upraw(pp, extra, version_req, depth, verbose=verbose) - if s == []: return '' + if pp != ".": + if extra != ".": rawtext = json.dumps(self._upraw(pp, extra, version_req, depth, verbose=verbose), indent=indent) lines = [l for l in rawtext.split("\n") if len(l.strip()) > 2] - return ("\n".join(i for i in lines if i!= '').replace('"', "") ) + return ('\n'.join(filter(None, lines)).replace('"', "") ) else: if pp in self.distro: - r = [] - for one_extra in sorted(set(self.distro[pp]["provided"]).union(set(self.distro[pp]["provides"]))): #direct and from-upward tags - s = self.up(pp, one_extra, depth, indent, version_req, verbose=verbose) - if s != '': r += [s] - return '\n'.join([i for i in r if i!= '']) + # get 'extra' tags from direct and from upward packages + results = [self.up(pp, one_extra, depth, indent, version_req, verbose=verbose) + for one_extra in sorted(set(self.distro[pp]["provided"]).union(set(self.distro[pp]["provides"])))] + return '\n'.join(filter(None, results)) else: - for one_pp in sorted(self.distro): - s = self.up(one_pp, extra, depth, indent, version_req, verbose=verbose) - if s != []: r += [s] - if r !=[]: - return '\n'.join([i for i in r if i!= '']) - else: - return + results = [self.up(one_pp, extra, depth, indent, version_req, verbose=verbose) for one_pp in sorted(self.distro)] + return '\n'.join(filter(None, results)) def description(self, pp): - "return description of the package" + """Return description of the package.""" if pp in self.distro: return print("\n".join(self.distro[pp]["description"].split(r"\n"))) def summary(self, pp): - "return summary of the package" + """Return summary of the package.""" if pp in self.distro: return self.distro[pp]["summary"] def pip_list(self, full=False, max_length=144): - """do like pip list""" + """List installed packages similar to pip list.""" if full: return [(p, self.distro[p]["version"], sum_up(self.distro[p]["summary"]), max_length) for p in sorted(self.distro)] else: From 070fadccaabb24444acc1c8441071460ba5d3a82 Mon Sep 17 00:00:00 2001 From: stonebig Date: Sat, 1 Feb 2025 20:28:02 +0100 Subject: [PATCH 073/305] simplify wppm.py a little with copilote gpt-4o free --- winpython/wppm.py | 122 +++++++++------------------------------------- 1 file changed, 24 insertions(+), 98 deletions(-) diff --git a/winpython/wppm.py b/winpython/wppm.py index ccba836d..d7180ea5 100644 --- a/winpython/wppm.py +++ b/winpython/wppm.py @@ -17,32 +17,16 @@ import sys import subprocess import json +from argparse import ArgumentParser, RawTextHelpFormatter # Local imports -from winpython import utils +from winpython import utils, piptree -# from former wppm separate script launcher -import textwrap -from argparse import ArgumentParser, HelpFormatter, RawTextHelpFormatter -from winpython import piptree - -# import information reader -# importlib_metadata before Python 3.8 -try: - from importlib import metadata as metadata # Python-3.8 - - metadata = metadata.metadata -except: - try: - from importlib_metadata import metadata # Date: Sun, 2 Feb 2025 11:01:10 +0100 Subject: [PATCH 074/305] tweak to better check all is unchanged --- winpython/__init__.py | 2 +- winpython/piptree.py | 9 ++++++++- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/winpython/__init__.py b/winpython/__init__.py index 38783128..865dcd92 100644 --- a/winpython/__init__.py +++ b/winpython/__init__.py @@ -28,6 +28,6 @@ OTHER DEALINGS IN THE SOFTWARE. """ -__version__ = '11.5.20250126' +__version__ = '12.0.20250201' __license__ = __doc__ __project_url__ = 'http://winpython.github.io/' diff --git a/winpython/piptree.py b/winpython/piptree.py index aa2960df..6164f4c6 100644 --- a/winpython/piptree.py +++ b/winpython/piptree.py @@ -100,7 +100,12 @@ def _process_package(self, package): def _get_requires(self, package): """Get the requirements of a package.""" requires = [] - replacements = str.maketrans({" ": "", "[": "", "]": "", "'": "", '"': ""}) + replacements = str.maketrans({" ": " ", "[": "", "]": "", "'": "", '"': ""}) # space not ' or ' + further_replacements=((' == ', '=='),('= ', '='), (' !=', '!='), (' ~=', '~='), + (' <', '<'),('< ', '<'), (' >', '>'), ('> ', '>'), + ('; ', ';'), (' ;', ';'), ('( ', '('), + (' and (',' andZZZZZ('), (' (', '('), (' andZZZZZ(',' and (' )) + if package.requires: for req in package.requires: # req_nameextra is "python-jose[cryptography]" @@ -112,6 +117,8 @@ def _get_requires(self, package): req_key = normalize((req_nameextra + "[").split("[")[0]) req_key_extra = req_nameextra[len(req_key) + 1:].split("]")[0] req_version = req[len(req_nameextra):].translate(replacements) + for other in further_replacements: # before we stop this cosmetic... + req_version = req_version.replace(*other) req_add = { "req_key": req_key, "req_version": req_version, From 956f892329ff67d4a1bc68af86f86d256feba3b6 Mon Sep 17 00:00:00 2001 From: stonebig Date: Sun, 2 Feb 2025 15:13:19 +0100 Subject: [PATCH 075/305] simplify piptree with gemini flash help still it did propose bad simplifications or unwanted code removal --- winpython/piptree.py | 214 ++++++++++++++++++++----------------------- 1 file changed, 101 insertions(+), 113 deletions(-) diff --git a/winpython/piptree.py b/winpython/piptree.py index 6164f4c6..6f02df1a 100644 --- a/winpython/piptree.py +++ b/winpython/piptree.py @@ -1,5 +1,6 @@ # -*- coding: utf-8 -*- # require python 3.8+ because of importlib.metadata +# revamped via github/gpt-4o free then gemini flash 2 free import json import sys import re @@ -43,20 +44,21 @@ def __init__(self, target=None): self.raw = {} self.environment = self._get_environment() - target = target or sys.executable + search_path = target or sys.executable - if sys.executable==target: + if sys.executable==search_path: # self-Distro inspection case (use all packages reachable per sys.path I presume ) packages=Distribution.discover() else: # not self-Distro inspection case , look at site-packages only) - packages=distributions(path=[str(Path(target).parent /'lib'/'site-packages'),]) + packages=distributions(path=[str(Path(search_path).parent /'lib'/'site-packages'),]) + for package in packages: self._process_package(package) # On a second pass, complement dependancies in reverse mode with 'wanted-per': - self._populate_wanted_per() + self._populate_reverse_dependencies() def _get_environment(self): """Get the current environment details.""" @@ -141,7 +143,7 @@ def _get_provides(self, package): provides[req_marker.split('extra == ')[1].translate(remove_list)] = None return provides - def _populate_wanted_per(self): + def _populate_reverse_dependencies(self): """Populate the wanted_per field for each package.""" # - get all downward links in 'requires_dist' of each package # - feed the required packages 'wanted_per' as a reverse dict of dict @@ -171,125 +173,111 @@ def _populate_wanted_per(self): self.distro[r["req_key"]]["provided"][r["req_marker"].split('extra == ')[1].translate(remove_list)] = None self.distro[r["req_key"]]["wanted_per"].append(want_add) + def _get_dependency_tree(self, package_name, extra="", version_req="", depth=20, path=None, verbose=False, upward=False): + """Recursive function to build dependency tree.""" + path = path or [] + extras = extra.split(",") + package_key = normalize(package_name) + ret_all = [] + #pe = normalize(f'{package_key}[{extras}]') + if package_key + "[" + extra + "]" in path: + print("cycle!", "->".join(path + [package_key + "[" + extra + "]"])) + return [] # Return empty list to avoid further recursion + package_data = self.distro.get(package_key) + if package_data and len(path) <= depth: + for extra in extras: + environment = {"extra": extra, **self.environment} + summary = f' {package_data["summary"]}' if verbose else '' + base_name = f'{package_name}[{extra}]' if extra else package_name + ret = [f'{base_name}=={package_data["version"]} {version_req}{summary}'] - def _downraw(self, pp, extra="", version_req="", depth=20, path=[], verbose=False): - """build a nested list of needed packages with given extra and depth""" - envi = {"extra": extra, **self.environment} - p = normalize(pp) - extras = extra.split(",") # to handle several extras, example: dask[array,diagnostics] - ret_all = [] - if p + "[" + extra + "]" in path: # for dask[complete]->dask[array,test,..] - print("cycle!", "->".join(path + [p + "[" + extra + "]"])) - elif p in self.distro and len(path) <= depth: - for extra in extras: # several extras request management - envi = {"extra": extra, **self.environment} - summary = f' {self.distro[p]["summary"]}' if verbose else '' - if extra == "": - ret = [f'{p}=={self.distro[p]["version"]} {version_req}{summary}'] - else: - ret = [f'{p}[{extra}]=={self.distro[p]["version"]} {version_req}{summary}'] - for r in self.distro[p]["requires_dist"]: - if r["req_key"] in self.distro: - if "req_marker" not in r or Marker(r["req_marker"]).evaluate(environment=envi): - ret += self._downraw( - r["req_key"], - r["req_extra"], - r["req_version"], - depth, - path + [p + "[" +extra + "]"], - verbose=verbose, - ) - ret_all.append(ret) - return ret_all + dependencies = package_data["requires_dist"] if not upward else package_data["wanted_per"] - def _upraw(self, pp, extra="", version_req="", depth=20, path=[], verbose=False): - """build a nested list of user packages with given extra and depth - from direct dependancies like dask-image <--dask['array'] - or indirect like Pytest['test'] <-- pandas['test']""" + for dependency in dependencies: + if dependency["req_key"] in self.distro: + if not dependency.get("req_marker") or Marker(dependency["req_marker"]).evaluate(environment=environment): + next_path = path + [base_name] + if upward: + up_req = (dependency.get("req_marker", "").split('extra == ')+[""])[1].strip("'\"") + # 2024-06-30 example of langchain <- numpy. pip.distro['numpy']['wanted_per'] has: + # {'req_key': 'langchain', 'req_version': '(>=1,<2)', 'req_extra': '', 'req_marker': ' python_version < "3.12"'}, + # {'req_key': 'langchain', 'req_version': '(>=1.26.0,<2.0.0)', 'req_extra': '', 'req_marker': ' python_version >= "3.12"'} + # must be no extra dependancy, optionnal extra in the package, or provided extra per upper packages + if dependency["req_key"] in self.distro and dependency["req_key"]+"["+up_req+"]" not in path: # avoids circular links on dask[array] + if (not dependency.get("req_marker") and extra =="") or (extra !="" and extra==up_req and dependency["req_key"]!=package_key) or (extra !="" and "req_marker" in dependency and extra+',' in dependency["req_extra"]+',' #bingo1346 contourpy[test-no-images] + or "req_marker" in dependency and extra+',' in dependency["req_extra"]+',' and Marker(dependency["req_marker"]).evaluate(environment=environment) + ): + ret += self._get_dependency_tree( + dependency["req_key"], + up_req, # pydask[array] going upwards will look for pydask[dataframe] + f"[requires: {package_name}" + + ( + "[" + dependency["req_extra"] + "]" + if dependency["req_extra"] != "" + else "" + ) + + f'{dependency["req_version"]}]', + depth, + next_path, + verbose=verbose, + upward=upward, + ) + else: + ret += self._get_dependency_tree( + dependency["req_key"], + dependency["req_extra"], + dependency["req_version"], + depth, + next_path, + verbose=verbose, + upward=upward, + ) - remove_list = {ord("'"):None, ord('"'):None} # to clean-up req_extra - envi = {"extra": extra, **self.environment} - p = normalize(pp) - pe = normalize(f'{pp}[{extra}]') - ret_all = [] - if pe in path: - print("cycle!", "->".join(path + [pe])) - elif p in self.distro and len(path) <= depth: - summary = f' {self.distro[p]["summary"]}' if verbose else '' - if extra == "": - ret_all = [f'{p}=={self.distro[p]["version"]} {version_req}{summary}'] - elif extra in set(self.distro[p]["provided"]).union(set(self.distro[p]["provides"])): # so that -r pytest[test] gives - ret_all = [f'{p}[{extra}]=={self.distro[p]["version"]} {version_req}{summary}'] - else: - return [] - ret = [] - for r in self.distro[p]["wanted_per"]: - up_req = (r.get("req_marker", "").split('extra == ')+[""])[1].translate(remove_list) - if r["req_key"] in self.distro and r["req_key"]+"["+up_req+"]" not in path: # avoids circular links on dask[array] - # 2024-06-30 example of langchain <- numpy. pip.distro['numpy']['wanted_per'] has: - # {'req_key': 'langchain', 'req_version': '(>=1,<2)', 'req_extra': '', 'req_marker': ' python_version < "3.12"'}, - # {'req_key': 'langchain', 'req_version': '(>=1.26.0,<2.0.0)', 'req_extra': '', 'req_marker': ' python_version >= "3.12"'} - # must be no extra dependancy, optionnal extra in the package, or provided extra per upper packages - if ("req_marker" not in r and extra =="") or (extra !="" and extra==up_req and r["req_key"]!=p) or (extra !="" and "req_marker" in r and extra+',' in r["req_extra"]+',' #bingo1346 contourpy[test-no-images] - or "req_marker" in r and extra+',' in r["req_extra"]+',' and Marker(r["req_marker"]).evaluate(environment=envi) - ): - ret += self._upraw( - r["req_key"], - up_req, # pydask[array] going upwards will look for pydask[dataframe] - f"[requires: {p}" - + ( - "[" + r["req_extra"] + "]" - if r["req_extra"] != "" - else "" - ) - + f'{r["req_version"]}]', - depth, - path + [pe], - verbose=verbose, - ) - if not ret == []: ret_all.append(ret) return ret_all - def down(self, pp="", extra="", depth=99, indent=5, version_req="", verbose=False): - """print the downward requirements for the package or all packages""" - if pp != ".": - if extra != ".": - if pp in self.distro: - extras = [s for s in extra.split(',') if s in sorted(self.distro[pp]["provides"])] - if extras == []: return '' - rawtext = json.dumps(self._downraw(pp, extra, version_req, depth, verbose=verbose), indent=indent) - lines = [l for l in rawtext.split("\n") if len(l.strip()) > 2] - return ("\n".join(lines).replace('"', "")) - else: - if pp in self.distro: - results = [self.down(pp, one_extra, depth, indent, version_req, verbose=verbose) - for one_extra in sorted(self.distro[pp]["provides"])] - return '\n'.join(filter(None, results)) - else: - results = [self.down(one_pp, extra, depth, indent, version_req, verbose=verbose) - for one_pp in sorted(self.distro)] + def down(self, pp="", extra="", depth=20, indent=5, version_req="", verbose=False): + """Print the downward requirements for the package or all packages.""" + if pp == ".": + results = [self.down(one_pp, extra, depth, indent, version_req, verbose=verbose) for one_pp in sorted(self.distro)] return '\n'.join(filter(None, results)) - - def up(self, pp, extra="", depth=99, indent=5, version_req="", verbose=False): + + if extra == ".": + if pp in self.distro: + results = [self.down(pp, one_extra, depth, indent, version_req, verbose=verbose) + for one_extra in sorted(self.distro[pp]["provides"])] + return '\n'.join(filter(None, results)) + return "" # Handle cases where extra is "." and package_name is not found. + + if pp not in self.distro: + return "" # Handle cases where package_name is not found. + + rawtext = json.dumps(self._get_dependency_tree(pp, extra, version_req, depth, verbose=verbose), indent=indent) + lines = [l for l in rawtext.split("\n") if len(l.strip()) > 2] + return "\n".join(lines).replace('"', "") + + def up(self, pp, extra="", depth=20, indent=5, version_req="", verbose=False): """Print the upward needs for the package.""" - r = [] - if pp != ".": - if extra != ".": - rawtext = json.dumps(self._upraw(pp, extra, version_req, depth, verbose=verbose), indent=indent) - lines = [l for l in rawtext.split("\n") if len(l.strip()) > 2] - return ('\n'.join(filter(None, lines)).replace('"', "") ) - else: - if pp in self.distro: - # get 'extra' tags from direct and from upward packages - results = [self.up(pp, one_extra, depth, indent, version_req, verbose=verbose) - for one_extra in sorted(set(self.distro[pp]["provided"]).union(set(self.distro[pp]["provides"])))] - return '\n'.join(filter(None, results)) - else: - results = [self.up(one_pp, extra, depth, indent, version_req, verbose=verbose) for one_pp in sorted(self.distro)] + + if pp == ".": + results = [self.up(one_pp, extra, depth, indent, version_req, verbose) for one_pp in sorted(self.distro)] return '\n'.join(filter(None, results)) + if extra == ".": + if pp in self.distro: + extras = set(self.distro[pp]["provided"]).union(set(self.distro[pp]["provides"])) + results = [self.up(pp, one_extra, depth, indent, version_req, verbose=verbose) for one_extra in sorted(extras)] + return '\n'.join(filter(None, results)) + return "" + + if pp not in self.distro: + return "" + + rawtext = json.dumps(self._get_dependency_tree(pp, extra, version_req, depth, verbose=verbose, upward=True), indent=indent) + lines = [l for l in rawtext.split("\n") if len(l.strip()) > 2] + return '\n'.join(filter(None, lines)).replace('"', "") + def description(self, pp): """Return description of the package.""" if pp in self.distro: From 179026140369207707503708421ce4c3a8aac0f2 Mon Sep 17 00:00:00 2001 From: stonebig Date: Sun, 2 Feb 2025 19:19:00 +0100 Subject: [PATCH 076/305] use Grok. interestigly, it does the sme bug as other at first with translate being replaced per strip, but correct it if refresh button --- winpython/piptree.py | 144 +++++++++++++++++++++---------------------- 1 file changed, 71 insertions(+), 73 deletions(-) diff --git a/winpython/piptree.py b/winpython/piptree.py index 6f02df1a..fc026374 100644 --- a/winpython/piptree.py +++ b/winpython/piptree.py @@ -1,6 +1,10 @@ # -*- coding: utf-8 -*- -# require python 3.8+ because of importlib.metadata -# revamped via github/gpt-4o free then gemini flash 2 free +""" +This script provides functionality to inspect and display package dependencies +in a Python environment, including both downward and upward dependencies. +Requires Python 3.8+ due to importlib.metadata. +""" + import json import sys import re @@ -16,8 +20,16 @@ def normalize(name): """Normalize package name according to PEP 503.""" return re.sub(r"[-_.]+", "-", name).lower() + def sum_up(text, max_length=144, stop_at=". "): - """Summarize text to a single line of max_length characters.""" + """ + Summarize text to fit within max_length characters, ending at the last complete sentence if possible. + + :param text: The text to summarize + :param max_length: Maximum length for summary + :param stop_at: String to stop summarization at + :return: Summarized text + """ summary = (text + os.linesep).splitlines()[0] if len(summary) > max_length and len(stop_at) > 1: summary = (summary + stop_at).split(stop_at)[0] @@ -25,34 +37,22 @@ def sum_up(text, max_length=144, stop_at=". "): summary = summary[:max_length] return summary - class pipdata: - """Wrapper around Distribution.discover() or Distribution.distributions()""" + """ + Wrapper around Distribution.discover() or Distribution.distributions() to manage package metadata. + """ def __init__(self, target=None): - - # create a distro{} dict of Packages - # key = normalised package name - # string_elements = 'name', 'version', 'summary' - # requires = list of dict with 1 level need downward - # req_key = package_key requires - # req_extra = extra branch needed of the package_key ('all' or '') - # req_version = version needed - # req_marker = marker of the requirement (if any) - self.distro = {} self.raw = {} self.environment = self._get_environment() - search_path = target or sys.executable + search_path = target or sys.executable - if sys.executable==search_path: - # self-Distro inspection case (use all packages reachable per sys.path I presume ) - packages=Distribution.discover() + if sys.executable == search_path: + packages = Distribution.discover() else: - # not self-Distro inspection case , look at site-packages only) - packages=distributions(path=[str(Path(search_path).parent /'lib'/'site-packages'),]) - + packages = distributions(path=[str(Path(search_path).parent / 'lib' / 'site-packages')]) for package in packages: self._process_package(package) @@ -61,7 +61,11 @@ def __init__(self, target=None): self._populate_reverse_dependencies() def _get_environment(self): - """Get the current environment details.""" + """ + Collect environment details for dependency evaluation. + + :return: Dictionary containing system and Python environment information + """ return { "implementation_name": sys.implementation.name, "implementation_version": "{0.major}.{0.minor}.{0.micro}".format(sys.implementation.version), @@ -77,63 +81,63 @@ def _get_environment(self): } def _process_package(self, package): - """Process a single package and add it to the distro dictionary.""" + """Process package metadata and store it in the distro dictionary.""" meta = package.metadata name = meta['Name'] version = package.version key = normalize(name) self.raw[key] = meta - provided = {'': None} - - requires = self._get_requires(package) - provides = self._get_provides(package) self.distro[key] = { - "name": name, - "version": version, - "summary": meta.get("Summary", ""), - "requires_dist": requires, - "wanted_per": [], - "description": meta.get("Description", ""), - "provides": provides, - "provided": provided, # being extras from other packages: 'test' for pytest because dask['test'] wants pytest + "name": name, + "version": version, + "summary": meta.get("Summary", ""), + "requires_dist": self._get_requires(package), + "reverse_dependencies": [], + "description": meta.get("Description", ""), + "provides": self._get_provides(package), + "provided": {'': None} # Placeholder for extras provided by this package } def _get_requires(self, package): - """Get the requirements of a package.""" + """Extract and normalize requirements for a package.""" + # requires = list of dict with 1 level need downward + # req_key = package_key requires + # req_extra = extra branch needed of the package_key ('all' or '') + # req_version = version needed + # req_marker = marker of the requirement (if any) requires = [] - replacements = str.maketrans({" ": " ", "[": "", "]": "", "'": "", '"': ""}) # space not ' or ' - further_replacements=((' == ', '=='),('= ', '='), (' !=', '!='), (' ~=', '~='), - (' <', '<'),('< ', '<'), (' >', '>'), ('> ', '>'), - ('; ', ';'), (' ;', ';'), ('( ', '('), - (' and (',' andZZZZZ('), (' (', '('), (' andZZZZZ(',' and (' )) + replacements = str.maketrans({" ": " ", "[": "", "]": "", "'": "", '"': ""}) + further_replacements = [ + (' == ', '=='), ('= ', '='), (' !=', '!='), (' ~=', '~='), + (' <', '<'), ('< ', '<'), (' >', '>'), ('> ', '>'), + ('; ', ';'), (' ;', ';'), ('( ', '('), + (' and (', ' andZZZZZ('), (' (', '('), (' andZZZZZ(', ' and (') + ] if package.requires: for req in package.requires: - # req_nameextra is "python-jose[cryptography]" - # from fastapi "python-jose[cryptography]<4.0.0,>=3.3.0 - # req_nameextra is "google-cloud-storage" - # from "google-cloud-storage (<2.0.0,>=1.26.0) req_nameextra, req_marker = (req + ";").split(";")[:2] - req_nameextra = normalize(re.split(" |;|==|!|>|<", req_nameextra+";")[0]) + req_nameextra = normalize(re.split(r" |;|==|!|>|<", req_nameextra + ";")[0]) req_key = normalize((req_nameextra + "[").split("[")[0]) req_key_extra = req_nameextra[len(req_key) + 1:].split("]")[0] req_version = req[len(req_nameextra):].translate(replacements) - for other in further_replacements: # before we stop this cosmetic... - req_version = req_version.replace(*other) + + for old, new in further_replacements: + req_version = req_version.replace(old, new) + req_add = { "req_key": req_key, "req_version": req_version, "req_extra": req_key_extra, } - if not req_marker == "": + if req_marker != "": req_add["req_marker"] = req_marker requires.append(req_add) return requires def _get_provides(self, package): - """Get the extended list of dependant packages, from extra options.""" - # 'array' is an added dependancy package of dask, if you install dask['array'] + """Get the list of extras provided by this package.""" provides = {'': None} if package.requires: for req in package.requires: @@ -144,34 +148,28 @@ def _get_provides(self, package): return provides def _populate_reverse_dependencies(self): - """Populate the wanted_per field for each package.""" + """Add reverse dependencies to each package.""" # - get all downward links in 'requires_dist' of each package - # - feed the required packages 'wanted_per' as a reverse dict of dict + # - feed the required packages 'reverse_dependencies' as a reverse dict of dict # contains = # req_key = upstream package_key # req_version = downstream package version wanted # req_extra = extra option of the demanding package that wants this dependancy # req_marker = marker of the downstream package requirement (if any) - for p in self.distro: - for r in self.distro[p]["requires_dist"]: - if r["req_key"] in self.distro: + for package in self.distro: + for requirement in self.distro[package]["requires_dist"]: + if requirement["req_key"] in self.distro: want_add = { - "req_key": p, - "req_version": r["req_version"], - "req_extra": r["req_extra"], + "req_key": package, + "req_version": requirement["req_version"], + "req_extra": requirement["req_extra"], } - if "req_marker" in r: - want_add["req_marker"] = r["req_marker"] # req_key_extra - - # provided = extras in upper packages that triggers the need for this package, - # like 'pandas[test]->Pytest', so 'test' in distro['pytest']['provided']['test'] - # corner-cases: 'dask[dataframe]' -> dask[array]' - # 'dask-image ->dask[array] - - if 'extra == ' in r["req_marker"]: + if "req_marker" in requirement: + want_add["req_marker"] = requirement["req_marker"] + if 'extra == ' in requirement["req_marker"]: remove_list = {ord("'"):None, ord('"'):None} - self.distro[r["req_key"]]["provided"][r["req_marker"].split('extra == ')[1].translate(remove_list)] = None - self.distro[r["req_key"]]["wanted_per"].append(want_add) + self.distro[requirement["req_key"]]["provided"][requirement["req_marker"].split('extra == ')[1].translate(remove_list)] = None + self.distro[requirement["req_key"]]["reverse_dependencies"].append(want_add) def _get_dependency_tree(self, package_name, extra="", version_req="", depth=20, path=None, verbose=False, upward=False): """Recursive function to build dependency tree.""" @@ -192,7 +190,7 @@ def _get_dependency_tree(self, package_name, extra="", version_req="", depth=20, base_name = f'{package_name}[{extra}]' if extra else package_name ret = [f'{base_name}=={package_data["version"]} {version_req}{summary}'] - dependencies = package_data["requires_dist"] if not upward else package_data["wanted_per"] + dependencies = package_data["requires_dist"] if not upward else package_data["reverse_dependencies"] for dependency in dependencies: if dependency["req_key"] in self.distro: @@ -200,7 +198,7 @@ def _get_dependency_tree(self, package_name, extra="", version_req="", depth=20, next_path = path + [base_name] if upward: up_req = (dependency.get("req_marker", "").split('extra == ')+[""])[1].strip("'\"") - # 2024-06-30 example of langchain <- numpy. pip.distro['numpy']['wanted_per'] has: + # 2024-06-30 example of langchain <- numpy. pip.distro['numpy']['reverse_dependencies'] has: # {'req_key': 'langchain', 'req_version': '(>=1,<2)', 'req_extra': '', 'req_marker': ' python_version < "3.12"'}, # {'req_key': 'langchain', 'req_version': '(>=1.26.0,<2.0.0)', 'req_extra': '', 'req_marker': ' python_version >= "3.12"'} # must be no extra dependancy, optionnal extra in the package, or provided extra per upper packages From 2462ea4e824d8fdc36d9781efd4602d494b412a9 Mon Sep 17 00:00:00 2001 From: stonebig Date: Sun, 2 Feb 2025 19:40:45 +0100 Subject: [PATCH 077/305] improve utils.py code with grok GRok doesn't rewrite the full file... geminy is more kind --- winpython/utils.py | 49 +++++++++++++++++++++------------------------- 1 file changed, 22 insertions(+), 27 deletions(-) diff --git a/winpython/utils.py b/winpython/utils.py index 9bf48951..9c651c9b 100644 --- a/winpython/utils.py +++ b/winpython/utils.py @@ -11,41 +11,36 @@ """ import os -from pathlib import Path +import sys +import stat +import shutil +import locale +import tempfile import subprocess +import configparser as cp +from pathlib import Path import re import tarfile import zipfile -import tempfile -import shutil import atexit -import sys -import stat -import locale import io -import configparser as cp - -# Local imports import winreg -def get_python_executable(path = None): - """return the python executable""" - my_path = sys.executable if path == None else path # default = current one - my_path = my_path if Path(my_path).is_dir() else str(Path(my_path).parent) - exec_py = str(Path(my_path) / 'python.exe') - exec_pypy = str(Path(my_path) / 'pypy3.exe') # PyPy ! - # PyPy >=7.3.6 3.8 aligns to python.exe and Lib\site-packages - python_executable = exec_py if Path(exec_py).is_file() else exec_pypy - return python_executable - -def get_site_packages_path(path = None): - """return the python site-packages""" - my_path = sys.executable if path == None else path # default = current one - my_path = my_path if Path(my_path).is_dir() else str(Path(my_path).parent) - site_py = str(Path(my_path) / 'Lib' / 'site-packages') - site_pypy = str(Path(my_path) / 'site-packages') # PyPy !! - site_packages_path = site_pypy if Path(site_pypy).is_dir() else site_py - return site_packages_path +def get_python_executable(path=None): + """Return the path to the Python executable.""" + python_path = sys.executable if path is None else path + base_dir = Path(python_path).parent if not Path(python_path).is_dir() else Path(python_path) + python_exe = base_dir / 'python.exe' + pypy_exe = base_dir / 'pypy3.exe' # For PyPy + return str(python_exe if python_exe.is_file() else pypy_exe) + +def get_site_packages_path(path=None): + """Return the path to the Python site-packages directory.""" + python_path = sys.executable if path is None else path + base_dir = Path(python_path).parent if not Path(python_path).is_dir() else Path(python_path) + site_packages = base_dir / 'Lib' / 'site-packages' + pypy_site_packages = base_dir / 'site-packages' # For PyPy + return str(pypy_site_packages if pypy_site_packages.is_dir() else site_packages) def onerror(function, path, excinfo): """Error handler for `shutil.rmtree`. From c7ab1c5ca03bb1350d38b399646665dbb1287af2 Mon Sep 17 00:00:00 2001 From: stonebig Date: Sun, 9 Feb 2025 13:09:27 +0100 Subject: [PATCH 078/305] piptree.py typing with the help of Mistral 'Le Chat' --- winpython/__init__.py | 2 +- winpython/piptree.py | 56 +++++++++++++++++++++---------------------- winpython/wppm.py | 12 +++++----- 3 files changed, 34 insertions(+), 36 deletions(-) diff --git a/winpython/__init__.py b/winpython/__init__.py index 865dcd92..5e0f08c8 100644 --- a/winpython/__init__.py +++ b/winpython/__init__.py @@ -28,6 +28,6 @@ OTHER DEALINGS IN THE SOFTWARE. """ -__version__ = '12.0.20250201' +__version__ = '13.0.20250209' __license__ = __doc__ __project_url__ = 'http://winpython.github.io/' diff --git a/winpython/piptree.py b/winpython/piptree.py index fc026374..31e02efd 100644 --- a/winpython/piptree.py +++ b/winpython/piptree.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- """ -This script provides functionality to inspect and display package dependencies +This script provides functionality to inspect and display package dependencies in a Python environment, including both downward and upward dependencies. Requires Python 3.8+ due to importlib.metadata. """ @@ -11,20 +11,19 @@ import platform import os from collections import OrderedDict +from typing import Dict, List, Optional, Tuple, Union from pip._vendor.packaging.markers import Marker, InvalidMarker from importlib.metadata import Distribution, distributions from pathlib import Path - -def normalize(name): +def normalize(name: str) -> str: """Normalize package name according to PEP 503.""" return re.sub(r"[-_.]+", "-", name).lower() - -def sum_up(text, max_length=144, stop_at=". "): +def sum_up(text: str, max_length: int = 144, stop_at: str = ". ") -> str: """ Summarize text to fit within max_length characters, ending at the last complete sentence if possible. - + :param text: The text to summarize :param max_length: Maximum length for summary :param stop_at: String to stop summarization at @@ -37,14 +36,14 @@ def sum_up(text, max_length=144, stop_at=". "): summary = summary[:max_length] return summary -class pipdata: +class PipData: """ Wrapper around Distribution.discover() or Distribution.distributions() to manage package metadata. """ - def __init__(self, target=None): - self.distro = {} - self.raw = {} + def __init__(self, target: Optional[str] = None): + self.distro: Dict[str, Dict] = {} + self.raw: Dict[str, Dict] = {} self.environment = self._get_environment() search_path = target or sys.executable @@ -57,18 +56,18 @@ def __init__(self, target=None): for package in packages: self._process_package(package) - # On a second pass, complement dependancies in reverse mode with 'wanted-per': + # On a second pass, complement dependencies in reverse mode with 'wanted-per': self._populate_reverse_dependencies() - def _get_environment(self): + def _get_environment(self) -> Dict[str, str]: """ Collect environment details for dependency evaluation. - + :return: Dictionary containing system and Python environment information """ return { "implementation_name": sys.implementation.name, - "implementation_version": "{0.major}.{0.minor}.{0.micro}".format(sys.implementation.version), + "implementation_version": f"{sys.implementation.version.major}.{sys.implementation.version.minor}.{sys.implementation.version.micro}", "os_name": os.name, "platform_machine": platform.machine(), "platform_release": platform.release(), @@ -80,7 +79,7 @@ def _get_environment(self): "sys_platform": sys.platform, } - def _process_package(self, package): + def _process_package(self, package: Distribution) -> None: """Process package metadata and store it in the distro dictionary.""" meta = package.metadata name = meta['Name'] @@ -99,7 +98,7 @@ def _process_package(self, package): "provided": {'': None} # Placeholder for extras provided by this package } - def _get_requires(self, package): + def _get_requires(self, package: Distribution) -> List[Dict[str, str]]: """Extract and normalize requirements for a package.""" # requires = list of dict with 1 level need downward # req_key = package_key requires @@ -136,7 +135,7 @@ def _get_requires(self, package): requires.append(req_add) return requires - def _get_provides(self, package): + def _get_provides(self, package: Distribution) -> Dict[str, None]: """Get the list of extras provided by this package.""" provides = {'': None} if package.requires: @@ -147,7 +146,7 @@ def _get_provides(self, package): provides[req_marker.split('extra == ')[1].translate(remove_list)] = None return provides - def _populate_reverse_dependencies(self): + def _populate_reverse_dependencies(self) -> None: """Add reverse dependencies to each package.""" # - get all downward links in 'requires_dist' of each package # - feed the required packages 'reverse_dependencies' as a reverse dict of dict @@ -167,11 +166,11 @@ def _populate_reverse_dependencies(self): if "req_marker" in requirement: want_add["req_marker"] = requirement["req_marker"] if 'extra == ' in requirement["req_marker"]: - remove_list = {ord("'"):None, ord('"'):None} + remove_list = {ord("'"): None, ord('"'): None} self.distro[requirement["req_key"]]["provided"][requirement["req_marker"].split('extra == ')[1].translate(remove_list)] = None self.distro[requirement["req_key"]]["reverse_dependencies"].append(want_add) - def _get_dependency_tree(self, package_name, extra="", version_req="", depth=20, path=None, verbose=False, upward=False): + def _get_dependency_tree(self, package_name: str, extra: str = "", version_req: str = "", depth: int = 20, path: Optional[List[str]] = None, verbose: bool = False, upward: bool = False) -> List[List[str]]: """Recursive function to build dependency tree.""" path = path or [] extras = extra.split(",") @@ -235,7 +234,7 @@ def _get_dependency_tree(self, package_name, extra="", version_req="", depth=20, ret_all.append(ret) return ret_all - def down(self, pp="", extra="", depth=20, indent=5, version_req="", verbose=False): + def down(self, pp: str = "", extra: str = "", depth: int = 20, indent: int = 5, version_req: str = "", verbose: bool = False) -> str: """Print the downward requirements for the package or all packages.""" if pp == ".": results = [self.down(one_pp, extra, depth, indent, version_req, verbose=verbose) for one_pp in sorted(self.distro)] @@ -255,9 +254,8 @@ def down(self, pp="", extra="", depth=20, indent=5, version_req="", verbose=Fals lines = [l for l in rawtext.split("\n") if len(l.strip()) > 2] return "\n".join(lines).replace('"', "") - def up(self, pp, extra="", depth=20, indent=5, version_req="", verbose=False): + def up(self, pp: str, extra: str = "", depth: int = 20, indent: int = 5, version_req: str = "", verbose: bool = False) -> str: """Print the upward needs for the package.""" - if pp == ".": results = [self.up(one_pp, extra, depth, indent, version_req, verbose) for one_pp in sorted(self.distro)] return '\n'.join(filter(None, results)) @@ -274,9 +272,9 @@ def up(self, pp, extra="", depth=20, indent=5, version_req="", verbose=False): rawtext = json.dumps(self._get_dependency_tree(pp, extra, version_req, depth, verbose=verbose, upward=True), indent=indent) lines = [l for l in rawtext.split("\n") if len(l.strip()) > 2] - return '\n'.join(filter(None, lines)).replace('"', "") + return "\n".join(filter(None, lines)).replace('"', "") - def description(self, pp): + def description(self, pp: str) -> None: """Return description of the package.""" if pp in self.distro: return print("\n".join(self.distro[pp]["description"].split(r"\n"))) @@ -284,12 +282,12 @@ def description(self, pp): def summary(self, pp): """Return summary of the package.""" if pp in self.distro: - return self.distro[pp]["summary"] + return self.distro[pp]["summary"] + return "" - def pip_list(self, full=False, max_length=144): + def pip_list(self, full: bool = False, max_length: int = 144) -> List[Tuple[str, Union[str, Tuple[str, str]]]]: """List installed packages similar to pip list.""" if full: - return [(p, self.distro[p]["version"], sum_up(self.distro[p]["summary"]), max_length) for p in sorted(self.distro)] + return [(p, self.distro[p]["version"], sum_up(self.distro[p]["summary"], max_length)) for p in sorted(self.distro)] else: return [(p, sum_up(self.distro[p]["version"], max_length)) for p in sorted(self.distro)] - diff --git a/winpython/wppm.py b/winpython/wppm.py index d7180ea5..03f44dcc 100644 --- a/winpython/wppm.py +++ b/winpython/wppm.py @@ -148,9 +148,9 @@ def get_installed_packages(self, update=False): # Include package installed via pip (not via WPPM) wppm = [] if str(Path(sys.executable).parent) == self.target: - self.pip = piptree.pipdata() + self.pip = piptree.PipData() else: - self.pip = piptree.pipdata(utils.get_python_executable(self.target)) + self.pip = piptree.PipData(utils.get_python_executable(self.target)) pip_list = self.pip.pip_list() # create pip package list @@ -571,17 +571,17 @@ def main(test=False): if args.registerWinPython and args.unregisterWinPython: raise RuntimeError("Incompatible arguments: --install and --uninstall") if args.pipdown: - pip = piptree.pipdata(targetpython) + pip = piptree.PipData(targetpython) pack, extra, *other = (args.fname + "[").replace("]", "[").split("[") print(pip.down(pack, extra, args.levels, verbose=args.verbose)) sys.exit() elif args.pipup: - pip = piptree.pipdata(targetpython) + pip = piptree.PipData(targetpython) pack, extra, *other = (args.fname + "[").replace("]", "[").split("[") print(pip.up(pack, extra, args.levels, verbose=args.verbose)) sys.exit() elif args.list: - pip = piptree.pipdata(targetpython) + pip = piptree.PipData(targetpython) todo = [l for l in pip.pip_list(full=True) if bool(re.search(args.fname, l[0])) ] titles = [['Package', 'Version', 'Summary'],['_' * max(x, 6) for x in utils.columns_width(todo)]] listed = utils.formatted_list(titles + todo, max_width=70) @@ -589,7 +589,7 @@ def main(test=False): print(*p) sys.exit() elif args.all: - pip = piptree.pipdata(targetpython) + pip = piptree.PipData(targetpython) todo = [l for l in pip.pip_list(full=True) if bool(re.search(args.fname, l[0])) ] for l in todo: # print(pip.distro[l[0]]) From 3f0a7af57c2168ae1708e3d76c6b82923c21ad50 Mon Sep 17 00:00:00 2001 From: stonebig Date: Sun, 9 Feb 2025 20:44:27 +0100 Subject: [PATCH 079/305] piptree docstring via mistral , and fix upward --- winpython/piptree.py | 241 ++++++++++++++++++++++++++++++++----------- 1 file changed, 181 insertions(+), 60 deletions(-) diff --git a/winpython/piptree.py b/winpython/piptree.py index 31e02efd..639d224a 100644 --- a/winpython/piptree.py +++ b/winpython/piptree.py @@ -12,18 +12,31 @@ import os from collections import OrderedDict from typing import Dict, List, Optional, Tuple, Union -from pip._vendor.packaging.markers import Marker, InvalidMarker +from pip._vendor.packaging.markers import Marker from importlib.metadata import Distribution, distributions from pathlib import Path def normalize(name: str) -> str: - """Normalize package name according to PEP 503.""" + """ + Normalize package name according to PEP 503. + + This function converts a package name to its canonical form by replacing + any sequence of dashes, underscores, or dots with a single dash and + converting the result to lowercase. + + :param name: The package name to normalize + :return: The normalized package name + """ return re.sub(r"[-_.]+", "-", name).lower() def sum_up(text: str, max_length: int = 144, stop_at: str = ". ") -> str: """ Summarize text to fit within max_length characters, ending at the last complete sentence if possible. + This function attempts to create a summary of the given text that fits within + the specified maximum length. It tries to end the summary at a complete sentence + if possible. + :param text: The text to summarize :param max_length: Maximum length for summary :param stop_at: String to stop summarization at @@ -39,19 +52,23 @@ def sum_up(text: str, max_length: int = 144, stop_at: str = ". ") -> str: class PipData: """ Wrapper around Distribution.discover() or Distribution.distributions() to manage package metadata. + + This class provides methods to inspect and display package dependencies + in a Python environment, including both downward and upward dependencies. """ def __init__(self, target: Optional[str] = None): + """ + Initialize the PipData instance. + + :param target: Optional target path to search for packages + """ self.distro: Dict[str, Dict] = {} self.raw: Dict[str, Dict] = {} self.environment = self._get_environment() search_path = target or sys.executable - - if sys.executable == search_path: - packages = Distribution.discover() - else: - packages = distributions(path=[str(Path(search_path).parent / 'lib' / 'site-packages')]) + packages = self._get_packages(search_path) for package in packages: self._process_package(package) @@ -63,6 +80,9 @@ def _get_environment(self) -> Dict[str, str]: """ Collect environment details for dependency evaluation. + This method gathers information about the system and Python environment, + which is used to evaluate package dependencies. + :return: Dictionary containing system and Python environment information """ return { @@ -79,8 +99,33 @@ def _get_environment(self) -> Dict[str, str]: "sys_platform": sys.platform, } + def _get_packages(self, search_path: str) -> List[Distribution]: + """ + Get the list of packages based on the search path. + + This method retrieves the list of installed packages in the specified + search path. If the search path is the current executable, it uses + Distribution.discover(). Otherwise, it uses distributions() with the + specified path. + + :param search_path: Path to search for packages + :return: List of Distribution objects + """ + if sys.executable == search_path: + return Distribution.discover() + else: + return distributions(path=[str(Path(search_path).parent / 'lib' / 'site-packages')]) + def _process_package(self, package: Distribution) -> None: - """Process package metadata and store it in the distro dictionary.""" + """ + Process package metadata and store it in the distro dictionary. + + This method extracts metadata from a Distribution object and stores it + in the distro dictionary. It also initializes the reverse dependencies + and provided extras for the package. + + :param package: The Distribution object to process + """ meta = package.metadata name = meta['Name'] version = package.version @@ -99,12 +144,16 @@ def _process_package(self, package: Distribution) -> None: } def _get_requires(self, package: Distribution) -> List[Dict[str, str]]: - """Extract and normalize requirements for a package.""" - # requires = list of dict with 1 level need downward - # req_key = package_key requires - # req_extra = extra branch needed of the package_key ('all' or '') - # req_version = version needed - # req_marker = marker of the requirement (if any) + """ + Extract and normalize requirements for a package. + + This method parses the requirements of a package and normalizes them + into a list of dictionaries. Each dictionary contains the required + package key, version, extra, and marker (if any). + + :param package: The Distribution object to extract requirements from + :return: List of dictionaries containing normalized requirements + """ requires = [] replacements = str.maketrans({" ": " ", "[": "", "]": "", "'": "", '"': ""}) further_replacements = [ @@ -136,7 +185,16 @@ def _get_requires(self, package: Distribution) -> List[Dict[str, str]]: return requires def _get_provides(self, package: Distribution) -> Dict[str, None]: - """Get the list of extras provided by this package.""" + """ + Get the list of extras provided by this package. + + This method extracts the extras provided by a package from its requirements. + It returns a dictionary where the keys are the provided extras and the values + are None. + + :param package: The Distribution object to extract provided extras from + :return: Dictionary containing provided extras + """ provides = {'': None} if package.requires: for req in package.requires: @@ -147,14 +205,13 @@ def _get_provides(self, package: Distribution) -> Dict[str, None]: return provides def _populate_reverse_dependencies(self) -> None: - """Add reverse dependencies to each package.""" - # - get all downward links in 'requires_dist' of each package - # - feed the required packages 'reverse_dependencies' as a reverse dict of dict - # contains = - # req_key = upstream package_key - # req_version = downstream package version wanted - # req_extra = extra option of the demanding package that wants this dependancy - # req_marker = marker of the downstream package requirement (if any) + """ + Add reverse dependencies to each package. + + This method populates the reverse dependencies for each package in the + distro dictionary. It iterates over the requirements of each package + and adds the package as a reverse dependency to the required packages. + """ for package in self.distro: for requirement in self.distro[package]["requires_dist"]: if requirement["req_key"] in self.distro: @@ -171,12 +228,28 @@ def _populate_reverse_dependencies(self) -> None: self.distro[requirement["req_key"]]["reverse_dependencies"].append(want_add) def _get_dependency_tree(self, package_name: str, extra: str = "", version_req: str = "", depth: int = 20, path: Optional[List[str]] = None, verbose: bool = False, upward: bool = False) -> List[List[str]]: - """Recursive function to build dependency tree.""" + """ + Recursive function to build dependency tree. + + This method builds a dependency tree for the specified package. It can + build the tree for downward dependencies (default) or upward dependencies + (if upward is True). The tree is built recursively up to the specified + depth. + + :param package_name: The name of the package to build the tree for + :param extra: The extra to include in the dependency tree + :param version_req: The version requirement for the package + :param depth: The maximum depth of the dependency tree + :param path: The current path in the dependency tree (used for cycle detection) + :param verbose: Whether to include verbose output in the tree + :param upward: Whether to build the tree for upward dependencies + :return: List of lists containing the dependency tree + """ path = path or [] extras = extra.split(",") package_key = normalize(package_name) ret_all = [] - #pe = normalize(f'{package_key}[{extras}]') + if package_key + "[" + extra + "]" in path: print("cycle!", "->".join(path + [package_key + "[" + extra + "]"])) return [] # Return empty list to avoid further recursion @@ -193,49 +266,60 @@ def _get_dependency_tree(self, package_name: str, extra: str = "", version_req: for dependency in dependencies: if dependency["req_key"] in self.distro: - if not dependency.get("req_marker") or Marker(dependency["req_marker"]).evaluate(environment=environment): - next_path = path + [base_name] - if upward: - up_req = (dependency.get("req_marker", "").split('extra == ')+[""])[1].strip("'\"") - # 2024-06-30 example of langchain <- numpy. pip.distro['numpy']['reverse_dependencies'] has: - # {'req_key': 'langchain', 'req_version': '(>=1,<2)', 'req_extra': '', 'req_marker': ' python_version < "3.12"'}, - # {'req_key': 'langchain', 'req_version': '(>=1.26.0,<2.0.0)', 'req_extra': '', 'req_marker': ' python_version >= "3.12"'} - # must be no extra dependancy, optionnal extra in the package, or provided extra per upper packages - if dependency["req_key"] in self.distro and dependency["req_key"]+"["+up_req+"]" not in path: # avoids circular links on dask[array] - if (not dependency.get("req_marker") and extra =="") or (extra !="" and extra==up_req and dependency["req_key"]!=package_key) or (extra !="" and "req_marker" in dependency and extra+',' in dependency["req_extra"]+',' #bingo1346 contourpy[test-no-images] - or "req_marker" in dependency and extra+',' in dependency["req_extra"]+',' and Marker(dependency["req_marker"]).evaluate(environment=environment) - ): + next_path = path + [base_name] + if upward: + up_req = (dependency.get("req_marker", "").split('extra == ')+[""])[1].strip("'\"") + # avoids circular links on dask[array] + if dependency["req_key"] in self.distro and dependency["req_key"]+"["+up_req+"]" not in path: + # upward dependancy taken if: + # - if extra "" demanded, and no marker from upward package: like pandas[] ==> numpy + # - if an extra "array" is demanded, and indeed in the req_extra list: array,dataframe,diagnostics,distributer + # - or the extra is in the upward package, like pandas[test] ==> pytest, for 'test' extra + if (not dependency.get("req_marker") and extra =="" + ) or (extra !="" and extra==up_req and dependency["req_key"]!=package_key + ) or (extra !="" and "req_marker" in dependency and extra+',' in dependency["req_extra"]+',' + ) or ("req_marker" in dependency and extra+',' in dependency["req_extra"]+',' and Marker(dependency["req_marker"]).evaluate(environment=environment)): ret += self._get_dependency_tree( dependency["req_key"], - up_req, # pydask[array] going upwards will look for pydask[dataframe] + up_req, # dask[array] going upwards continues as dask[dataframe] f"[requires: {package_name}" - + ( - "[" + dependency["req_extra"] + "]" - if dependency["req_extra"] != "" - else "" - ) + + (f"[{dependency['req_extra']}]" if dependency["req_extra"] != "" else "") + f'{dependency["req_version"]}]', depth, next_path, verbose=verbose, upward=upward, ) - else: - ret += self._get_dependency_tree( - dependency["req_key"], - dependency["req_extra"], - dependency["req_version"], - depth, - next_path, - verbose=verbose, - upward=upward, - ) + elif not dependency.get("req_marker") or Marker(dependency["req_marker"]).evaluate(environment=environment): + ret += self._get_dependency_tree( + dependency["req_key"], + dependency["req_extra"], + dependency["req_version"], + depth, + next_path, + verbose=verbose, + upward=upward, + ) ret_all.append(ret) return ret_all def down(self, pp: str = "", extra: str = "", depth: int = 20, indent: int = 5, version_req: str = "", verbose: bool = False) -> str: - """Print the downward requirements for the package or all packages.""" + """ + Print the downward requirements for the package or all packages. + + This method prints the downward dependencies for the specified package + or all packages if pp is ".". It uses the _get_dependency_tree method + to build the dependency tree and formats the output as a JSON string. + + :param pp: The package name or "." to print dependencies for all packages + :param extra: The extra to include in the dependency tree + :param depth: The maximum depth of the dependency tree + :param indent: The indentation level for the JSON output + :param version_req: The version requirement for the package + :param verbose: Whether to include verbose output in the tree + :return: JSON string containing the downward dependencies + """ if pp == ".": results = [self.down(one_pp, extra, depth, indent, version_req, verbose=verbose) for one_pp in sorted(self.distro)] return '\n'.join(filter(None, results)) @@ -255,7 +339,21 @@ def down(self, pp: str = "", extra: str = "", depth: int = 20, indent: int = 5, return "\n".join(lines).replace('"', "") def up(self, pp: str, extra: str = "", depth: int = 20, indent: int = 5, version_req: str = "", verbose: bool = False) -> str: - """Print the upward needs for the package.""" + """ + Print the upward needs for the package. + + This method prints the upward dependencies for the specified package. + It uses the _get_dependency_tree method to build the dependency tree + and formats the output as a JSON string. + + :param pp: The package name + :param extra: The extra to include in the dependency tree + :param depth: The maximum depth of the dependency tree + :param indent: The indentation level for the JSON output + :param version_req: The version requirement for the package + :param verbose: Whether to include verbose output in the tree + :return: JSON string containing the upward dependencies + """ if pp == ".": results = [self.up(one_pp, extra, depth, indent, version_req, verbose) for one_pp in sorted(self.distro)] return '\n'.join(filter(None, results)) @@ -275,18 +373,41 @@ def up(self, pp: str, extra: str = "", depth: int = 20, indent: int = 5, version return "\n".join(filter(None, lines)).replace('"', "") def description(self, pp: str) -> None: - """Return description of the package.""" + """ + Return description of the package. + + This method prints the description of the specified package. + + :param pp: The package name + """ if pp in self.distro: return print("\n".join(self.distro[pp]["description"].split(r"\n"))) - - def summary(self, pp): - """Return summary of the package.""" + + def summary(self, pp: str) -> str: + """ + Return summary of the package. + + This method returns the summary of the specified package. + + :param pp: The package name + :return: The summary of the package + """ if pp in self.distro: return self.distro[pp]["summary"] return "" def pip_list(self, full: bool = False, max_length: int = 144) -> List[Tuple[str, Union[str, Tuple[str, str]]]]: - """List installed packages similar to pip list.""" + """ + List installed packages similar to pip list. + + This method lists the installed packages in a format similar to the + output of the `pip list` command. If full is True, it includes the + package version and summary. + + :param full: Whether to include the package version and summary + :param max_length: The maximum length for the summary + :return: List of tuples containing package information + """ if full: return [(p, self.distro[p]["version"], sum_up(self.distro[p]["summary"], max_length)) for p in sorted(self.distro)] else: From 711180becbe81a5f95dfa1a14320ca06ae644e6b Mon Sep 17 00:00:00 2001 From: stonebig Date: Mon, 10 Feb 2025 23:22:34 +0100 Subject: [PATCH 080/305] correct reverse dependancy filtering --- winpython/piptree.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/winpython/piptree.py b/winpython/piptree.py index 639d224a..b47e165f 100644 --- a/winpython/piptree.py +++ b/winpython/piptree.py @@ -273,12 +273,12 @@ def _get_dependency_tree(self, package_name: str, extra: str = "", version_req: if dependency["req_key"] in self.distro and dependency["req_key"]+"["+up_req+"]" not in path: # upward dependancy taken if: # - if extra "" demanded, and no marker from upward package: like pandas[] ==> numpy - # - if an extra "array" is demanded, and indeed in the req_extra list: array,dataframe,diagnostics,distributer # - or the extra is in the upward package, like pandas[test] ==> pytest, for 'test' extra + # - or an extra "array" is demanded, and indeed in the req_extra list: array,dataframe,diagnostics,distributer if (not dependency.get("req_marker") and extra =="" - ) or (extra !="" and extra==up_req and dependency["req_key"]!=package_key - ) or (extra !="" and "req_marker" in dependency and extra+',' in dependency["req_extra"]+',' - ) or ("req_marker" in dependency and extra+',' in dependency["req_extra"]+',' and Marker(dependency["req_marker"]).evaluate(environment=environment)): + ) or ("req_marker" in dependency and extra==up_req and dependency["req_key"]!=package_key and Marker(dependency["req_marker"]).evaluate(environment=environment) + ) or ("req_marker" in dependency and extra!="" and extra+',' in dependency["req_extra"]+',' and Marker(dependency["req_marker"]).evaluate(environment=environment|{"extra": up_req}) + ): ret += self._get_dependency_tree( dependency["req_key"], up_req, # dask[array] going upwards continues as dask[dataframe] From 4f94963323833d65a342576f2dd106e8e32e7cfd Mon Sep 17 00:00:00 2001 From: stonebig Date: Sat, 15 Feb 2025 15:18:49 +0100 Subject: [PATCH 081/305] remove a build process step --- run_complement_newbuild.bat | 165 ------------------------------------ winpython/__init__.py | 2 +- 2 files changed, 1 insertion(+), 166 deletions(-) delete mode 100644 run_complement_newbuild.bat diff --git a/run_complement_newbuild.bat b/run_complement_newbuild.bat deleted file mode 100644 index 69b3da50..00000000 --- a/run_complement_newbuild.bat +++ /dev/null @@ -1,165 +0,0 @@ -rem first line check -echo keep me in ansi =utf-8 without BOM (notepad plus plus or win10 screwing up for compatibility) - -rem ***************************** -rem 2021-05-23: use "%PYTHON%" for the executable instead of "%WINPYDIR%\python.exe" -rem 2022-10-19 patch cpython bug https://github.com/winpython/winpython/issues/1121 -rem 2024-09-15a: compactify for lisiblity -rem ***************************** - -rem algorithm: -rem 0.0 Initialize target environment -rem 0.9 Python-3.13.0b3 free-threading tweak -rem 1.0 Do cosmetic complements -rem 2.0 Do active patches -rem 3.0 Don't do patches in reserve (examples) -rem 3.0 clean-ups (to move to upper stage) -rem 4.0 summary of packages - -@echo off -echo ---------------------------------------- -echo 0.0 (%date% %time%) Initialize variables -echo ---------------------------------------- - -rem %1 is the WINPYDIRBASE being prepared, (names winpydir of python build batch) (like "...bd37\buPyPy\WPy64-37100b2") -rem this .bat is placed at root (buildir34, buildir34\FlavorJulia, ...) -set origin=%~dp0 -set new_winpydir=%1 - -echo new_winpydir=%new_winpydir% -cd /d %new_winpydir% - -call scripts\env.bat -@echo off - -echo ---------------------------------------- -echo 0.9 (%date% %time%) Python-3.13.0b3 free-threading tweak -echo ---------------------------------------- - -if exist "%WINPYDIR%\python3.13t.exe" ( - -rem "%PYTHON%" -m pip install --pre --no-index --trusted-host=None --find-links=C:\WinP\bd313\packages.win-amd64t --upgrade cython - - -rem make python3.13t binaries the default - move "%WINPYDIR%\python.exe" "%WINPYDIR%\python_classic.exe" - move "%WINPYDIR%\pythonw.exe" "%WINPYDIR%\pythonw_classic.exe" - copy/Y "%WINPYDIR%\python3.13t.exe" "%WINPYDIR%\python.exe" - copy/Y "%WINPYDIR%\pythonw3.13t.exe" "%WINPYDIR%\pythonw.exe" - -rem a bug when ipython "help(len)" -rem "%PYTHON%" -c "from winpython.utils import patch_sourcefile;patch_sourcefile(r'%WINPYDIR%\\Lib\_pyrepl\pager.py', 'tempfilepager(', 'tempfile_pager(' )" - -) else ( - echo "I DIDN'T patch python3.13 !" -) - - -echo ---------------------------------------- -echo 1.0 (%date% %time%) Do cosmetic complements -echo ---------------------------------------- - -echo finish install seaborn iris example -rem ---------------------------------------- -if exist "%WINPYDIR%\Lib\site-packages\seaborn" "%PYTHON%" -c "import seaborn as sns;sns.set();sns.load_dataset('iris')" - - -echo ---------------------------------------- -echo 2.0 (%date% %time%) Do Active patchs -echo ---------------------------------------- - - - -rem 2022-10-19 patch cpython bug https://github.com/winpython/winpython/issues/1121 - -set qt56p=%WINPYDIR%\Lib\idlelib\macosx.py -if exist "%qt56p%" ( - "%PYTHON%" -c "from winpython.utils import patch_sourcefile;patch_sourcefile(r'%WINPYDIR%\Lib\idlelib\macosx.py', 'from test.support ', '#stonebig patch cpython/pull/98313/files: from test.support' )" - echo "DID I patch numba%??" -) else ( - echo "I DIDN'T patch of numba !" -) - - -goto the_end - -echo ---------------------------------------- -echo 2.0 (%date% %time%) not active patchs example (reserve) -echo ---------------------------------------- - - - -rem ---------------------------------------- -echo 2021-04-17 patch jupyter_lsp-1.1.4 -rem see https://github.com/krassowski/jupyterlab-lsp/pull/580/files - -rem in DOS, the variable must be set befor the parenthesis block.... -set this_source='%WINPYDIR%\Lib\site-packages\jupyter_lsp\virtual_documents_shadow.py' -if exist "%WINPYDIR%\Lib\site-packages\jupyter_lsp-1.1.4.dist-info" ( - echo "**%this_source%**" - "%PYTHON%" -c "from winpython.utils import patch_sourcefile;patch_sourcefile(r%this_source%, 'read_text()', 'read_text(encoding='+chr(39)+'utf-8'+chr(39)+')' )" - "%PYTHON%" -c "from winpython.utils import patch_sourcefile;patch_sourcefile(r%this_source%, 'join(self.lines))', 'join(self.lines), encoding='+chr(39)+'utf-8'+chr(39)+')' )" -) - -rem ---------------------------------------- -rem 2020-05-15 patch jedi-0.17.0 - -if exist "%WINPYDIR%\Lib\site-packages\jedi-0.17.0.dist-info" copy/Y "C:\WinP\tempo_fixes\Jedi-0.17.0\api\__init__.py" "%WINPYDIR%\Lib\site-packages\Jedi-0.17.0\api\__init__.py" - -rem ---------------------------------------- - - - - - -echo 2019-10-22 Spyder tweaks moved at the end as suspicion of problem creating (on Python-3.8) -rem ---------------------------------------- -echo .spyder3\temp.py suspected of creating issue east of Italia -echo see https://groups.google.com/forum/#!topic/spyderlib/dH5VXlTc30s - -if exist "%WINPYDIR%\..\settings\.spyder-py3\temp.py" del "%WINPYDIR%\..\settings\.spyder-py3\temp.py" - -rem ---------------------------------------- -rem 2023-02-12: paching pip-23.0.0 pip\_vend_r\rich patch cpython bug https://github.com/pypa/pip/issues/11798 - -if exist "%WINPYDIR%\Lib\site-packages\pip-23.0.dist-info" ( - echo "coucou Pip-23.0 crashing _vendor/rich" - copy/Y "C:\WinP\tempo_fixes\pip\_vendor\rich\_win32_console.py" "%WINPYDIR%\site-packages\pip\_vendor\rich\_win32_console.py" -) - -:the_end - -echo ---------------------------------------- -echo 3.0 (%date% %time%) clean-ups (to move to upper stage) -echo ---------------------------------------- - -echo JUPYTERLAB_DIR=%JUPYTERLAB_DIR% default is ~/.jupyter/lab -echo JUPYTERLAB_SETTINGS_DIR=%JUPYTERLAB_SETTINGS_DIR% , default is ~/.jupyter/lab/user-settings/ -echo JUPYTERLAB_WORKSPACES_DIR=%JUPYTERLAB_WORKSPACES_DIR% , default is ~/.jupyter/lab/workspaces/ - -"%WINPYDIR%\Scripts\jupyter.exe" lab path - -rem ---------------------------------------- -echo clear jupyterlab staging (2018-03-09) - -if exist "%WINPYDIR%\share\jupyter\lab\staging" rmdir /S /Q "%WINPYDIR%\share\jupyter\lab\staging" -rem if exist "%WINPYDIR%\Lib\site-packages\jupyterlab" "%WINPYDIR%\Scripts\jupyter.exe" lab clean - - - -rem see https://jupyter.readthedocs.io/en/latest/use/jupyter-directories.html -if exist "%WINPYDIR%\Lib\site-packages\jupyterlab" ( -"%WINPYDIR%\Scripts\jupyter.exe" labextension list -"%WINPYDIR%\Scripts\jupyter.exe" --paths -) - - -echo ---------------------------------------- -echo 4.0 (%date% %time%) Summary of packages -echo ---------------------------------------- - - -pip check - - - diff --git a/winpython/__init__.py b/winpython/__init__.py index 5e0f08c8..daf42293 100644 --- a/winpython/__init__.py +++ b/winpython/__init__.py @@ -28,6 +28,6 @@ OTHER DEALINGS IN THE SOFTWARE. """ -__version__ = '13.0.20250209' +__version__ = '13.1.20250215' __license__ = __doc__ __project_url__ = 'http://winpython.github.io/' From 5f77f8886160a6e62413b6439b82041fb72f8405 Mon Sep 17 00:00:00 2001 From: stonebig Date: Sun, 23 Feb 2025 00:13:57 +0100 Subject: [PATCH 082/305] prepare for rc --- make.py | 24 ------------------------ winpython/__init__.py | 2 +- 2 files changed, 1 insertion(+), 25 deletions(-) diff --git a/make.py b/make.py index ebc14920..40640f42 100644 --- a/make.py +++ b/make.py @@ -961,29 +961,6 @@ def _create_standard_batch_scripts(self): self._print_action_done() - def _run_complementary_batch_scripts(self, script_name="run_complement.bat"): - """Runs complementary batch scripts from tools directories.""" - print(f"Running {script_name} from tools directories...") - unique_tools_parent_dirs = set(str(Path(s).parent) for s in self.tools_directories) - for tools_parent_dir in unique_tools_parent_dirs: - script_path = Path(tools_parent_dir) / script_name - if script_path.is_file(): - print(f' Executing "{script_path}" for "{self.winpy_dir}"') - self._print_action(f'Executing "{script_path}" for "{self.winpy_dir}" !') - try: - subprocess.run( - [str(script_path), str(self.winpy_dir)], - shell=True, - check=True, - stderr=sys.stderr, - stdout=sys.stdout - ) - except subprocess.CalledProcessError as e: - print(f" Execution failed: {e}", file=sys.stderr) - self._print_action(f"Execution failed: {e}!") - self._print_action_done() - - def build(self, remove_existing: bool = True, requirements=None, winpy_dirname: str = None): """Make WinPython distribution in target directory from the installers located in wheels_dir @@ -1048,7 +1025,6 @@ def build(self, remove_existing: bool = True, requirements=None, winpy_dirname: self._print_action(f"piping {' '.join(actions)}") self.distribution.do_pip_action(actions) - self._run_complementary_batch_scripts() self.distribution.patch_standard_packages() self._print_action("Cleaning up distribution") diff --git a/winpython/__init__.py b/winpython/__init__.py index daf42293..cca25d39 100644 --- a/winpython/__init__.py +++ b/winpython/__init__.py @@ -28,6 +28,6 @@ OTHER DEALINGS IN THE SOFTWARE. """ -__version__ = '13.1.20250215' +__version__ = '13.1.20250222' __license__ = __doc__ __project_url__ = 'http://winpython.github.io/' From bb71e5ed333547e23038cce5ebd40022b4836fe6 Mon Sep 17 00:00:00 2001 From: stonebig Date: Sat, 1 Mar 2025 17:48:44 +0100 Subject: [PATCH 083/305] final is equal to rc --- changelogs/WinPythondot-64bit-3.12.8.1.md | 28 + .../WinPythondot-64bit-3.12.8.1_History.md | 14 + changelogs/WinPythondot-64bit-3.12.9.0.md | 28 + .../WinPythondot-64bit-3.12.9.0_History.md | 16 + changelogs/WinPythondot-64bit-3.13.1.1.md | 28 + .../WinPythondot-64bit-3.13.1.1_History.md | 14 + changelogs/WinPythondot-64bit-3.13.2.0.md | 28 + .../WinPythondot-64bit-3.13.2.0_History.md | 16 + changelogs/WinPythondot-64bit-3.14.0.0.md | 28 + .../WinPythondot-64bit-3.14.0.0_History.md | 8 + changelogs/WinPythonslim-64bit-3.12.8.1.md | 522 ++++++++++++++++++ .../WinPythonslim-64bit-3.12.8.1_History.md | 112 ++++ changelogs/WinPythonslim-64bit-3.12.9.0.md | 511 +++++++++++++++++ .../WinPythonslim-64bit-3.12.9.0_History.md | 195 +++++++ changelogs/WinPythonslim-64bit-3.13.2.0.md | 511 +++++++++++++++++ .../WinPythonslim-64bit-3.13.2.0_History.md | 170 ++++++ changelogs/md5_sha1.txt | 19 + 17 files changed, 2248 insertions(+) create mode 100644 changelogs/WinPythondot-64bit-3.12.8.1.md create mode 100644 changelogs/WinPythondot-64bit-3.12.8.1_History.md create mode 100644 changelogs/WinPythondot-64bit-3.12.9.0.md create mode 100644 changelogs/WinPythondot-64bit-3.12.9.0_History.md create mode 100644 changelogs/WinPythondot-64bit-3.13.1.1.md create mode 100644 changelogs/WinPythondot-64bit-3.13.1.1_History.md create mode 100644 changelogs/WinPythondot-64bit-3.13.2.0.md create mode 100644 changelogs/WinPythondot-64bit-3.13.2.0_History.md create mode 100644 changelogs/WinPythondot-64bit-3.14.0.0.md create mode 100644 changelogs/WinPythondot-64bit-3.14.0.0_History.md create mode 100644 changelogs/WinPythonslim-64bit-3.12.8.1.md create mode 100644 changelogs/WinPythonslim-64bit-3.12.8.1_History.md create mode 100644 changelogs/WinPythonslim-64bit-3.12.9.0.md create mode 100644 changelogs/WinPythonslim-64bit-3.12.9.0_History.md create mode 100644 changelogs/WinPythonslim-64bit-3.13.2.0.md create mode 100644 changelogs/WinPythonslim-64bit-3.13.2.0_History.md diff --git a/changelogs/WinPythondot-64bit-3.12.8.1.md b/changelogs/WinPythondot-64bit-3.12.8.1.md new file mode 100644 index 00000000..4c75f289 --- /dev/null +++ b/changelogs/WinPythondot-64bit-3.12.8.1.md @@ -0,0 +1,28 @@ +## WinPython 3.12.8.1dot + +The following packages are included in WinPython-64bit v3.12.8.1dot b3. + +
    + +### Tools + +Name | Version | Description +-----|---------|------------ + + +### Python packages + +Name | Version | Description +-----|---------|------------ +[Python](http://www.python.org/) | 3.12.8 | Python programming language with standard library +[build](https://pypi.org/project/build) | 1.2.2.post1 | A simple, correct Python build frontend +[colorama](https://pypi.org/project/colorama) | 0.4.6 | Cross-platform colored terminal text. +[packaging](https://pypi.org/project/packaging) | 24.2 | Core utilities for Python packages +[pip](https://pypi.org/project/pip) | 24.3.1 | The PyPA recommended tool for installing Python packages. +[pyproject_hooks](https://pypi.org/project/pyproject_hooks) | 1.1.0 | Wrappers to call pyproject.toml-based build backend hooks. +[setuptools](https://pypi.org/project/setuptools) | 75.6.0 | Easily download, build, install, upgrade, and uninstall Python packages +[sqlite_bro](https://pypi.org/project/sqlite_bro) | 0.13.1 | a graphic SQLite Client in 1 Python file +[wheel](https://pypi.org/project/wheel) | 0.44.0 | A built-package format for Python +[winpython](https://pypi.org/project/winpython) | 11.5.20250126 | WinPython distribution tools, including WPPM + +
    diff --git a/changelogs/WinPythondot-64bit-3.12.8.1_History.md b/changelogs/WinPythondot-64bit-3.12.8.1_History.md new file mode 100644 index 00000000..4276ca3f --- /dev/null +++ b/changelogs/WinPythondot-64bit-3.12.8.1_History.md @@ -0,0 +1,14 @@ +## History of changes for WinPython-64bit 3.12.8.1dot + +The following changes were made to WinPython-64bit distribution since version 3.12.8.0dot. + +
    +### Python packages + +Upgraded packages: + + * [winpython](https://pypi.org/project/winpython) 11.2.20241228 → 11.5.20250126 (WinPython distribution tools, including WPPM) + + +
    +* * * diff --git a/changelogs/WinPythondot-64bit-3.12.9.0.md b/changelogs/WinPythondot-64bit-3.12.9.0.md new file mode 100644 index 00000000..7d8615bd --- /dev/null +++ b/changelogs/WinPythondot-64bit-3.12.9.0.md @@ -0,0 +1,28 @@ +## WinPython 3.12.9.0dot + +The following packages are included in WinPython-64bit v3.12.9.0dot . + +
    + +### Tools + +Name | Version | Description +-----|---------|------------ + + +### Python packages + +Name | Version | Description +-----|---------|------------ +[Python](http://www.python.org/) | 3.12.9 | Python programming language with standard library +[build](https://pypi.org/project/build) | 1.2.2.post1 | A simple, correct Python build frontend +[colorama](https://pypi.org/project/colorama) | 0.4.6 | Cross-platform colored terminal text. +[packaging](https://pypi.org/project/packaging) | 24.2 | Core utilities for Python packages +[pip](https://pypi.org/project/pip) | 24.3.1 | The PyPA recommended tool for installing Python packages. +[pyproject_hooks](https://pypi.org/project/pyproject_hooks) | 1.1.0 | Wrappers to call pyproject.toml-based build backend hooks. +[setuptools](https://pypi.org/project/setuptools) | 75.6.0 | Easily download, build, install, upgrade, and uninstall Python packages +[sqlite_bro](https://pypi.org/project/sqlite_bro) | 0.13.1 | a graphic SQLite Client in 1 Python file +[wheel](https://pypi.org/project/wheel) | 0.45.1 | A built-package format for Python +[winpython](https://pypi.org/project/winpython) | 13.1.20250215 | WinPython distribution tools, including WPPM + +
    diff --git a/changelogs/WinPythondot-64bit-3.12.9.0_History.md b/changelogs/WinPythondot-64bit-3.12.9.0_History.md new file mode 100644 index 00000000..4685d221 --- /dev/null +++ b/changelogs/WinPythondot-64bit-3.12.9.0_History.md @@ -0,0 +1,16 @@ +## History of changes for WinPython-64bit 3.12.9.0dot + +The following changes were made to WinPython-64bit distribution since version 3.12.8.0dot. + +
    +### Python packages + +Upgraded packages: + + * [Python](http://www.python.org/) 3.12.8 → 3.12.9 (Python programming language with standard library) + * [wheel](https://pypi.org/project/wheel) 0.44.0 → 0.45.1 (A built-package format for Python) + * [winpython](https://pypi.org/project/winpython) 11.2.20241228 → 13.1.20250215 (WinPython distribution tools, including WPPM) + + +
    +* * * diff --git a/changelogs/WinPythondot-64bit-3.13.1.1.md b/changelogs/WinPythondot-64bit-3.13.1.1.md new file mode 100644 index 00000000..b711c0ef --- /dev/null +++ b/changelogs/WinPythondot-64bit-3.13.1.1.md @@ -0,0 +1,28 @@ +## WinPython 3.13.1.1dot + +The following packages are included in WinPython-64bit v3.13.1.1dot b3. + +
    + +### Tools + +Name | Version | Description +-----|---------|------------ + + +### Python packages + +Name | Version | Description +-----|---------|------------ +[Python](http://www.python.org/) | 3.13.1 | Python programming language with standard library +[build](https://pypi.org/project/build) | 1.2.2.post1 | A simple, correct Python build frontend +[colorama](https://pypi.org/project/colorama) | 0.4.6 | Cross-platform colored terminal text. +[packaging](https://pypi.org/project/packaging) | 24.2 | Core utilities for Python packages +[pip](https://pypi.org/project/pip) | 24.3.1 | The PyPA recommended tool for installing Python packages. +[pyproject_hooks](https://pypi.org/project/pyproject_hooks) | 1.1.0 | Wrappers to call pyproject.toml-based build backend hooks. +[setuptools](https://pypi.org/project/setuptools) | 75.6.0 | Easily download, build, install, upgrade, and uninstall Python packages +[sqlite_bro](https://pypi.org/project/sqlite_bro) | 0.13.1 | a graphic SQLite Client in 1 Python file +[wheel](https://pypi.org/project/wheel) | 0.44.0 | A built-package format for Python +[winpython](https://pypi.org/project/winpython) | 11.5.20250126 | WinPython distribution tools, including WPPM + +
    diff --git a/changelogs/WinPythondot-64bit-3.13.1.1_History.md b/changelogs/WinPythondot-64bit-3.13.1.1_History.md new file mode 100644 index 00000000..32a5992a --- /dev/null +++ b/changelogs/WinPythondot-64bit-3.13.1.1_History.md @@ -0,0 +1,14 @@ +## History of changes for WinPython-64bit 3.13.1.1dot + +The following changes were made to WinPython-64bit distribution since version 3.13.1.0dot. + +
    +### Python packages + +Upgraded packages: + + * [winpython](https://pypi.org/project/winpython) 11.2.20241228 → 11.5.20250126 (WinPython distribution tools, including WPPM) + + +
    +* * * diff --git a/changelogs/WinPythondot-64bit-3.13.2.0.md b/changelogs/WinPythondot-64bit-3.13.2.0.md new file mode 100644 index 00000000..ccbfa9a8 --- /dev/null +++ b/changelogs/WinPythondot-64bit-3.13.2.0.md @@ -0,0 +1,28 @@ +## WinPython 3.13.2.0dot + +The following packages are included in WinPython-64bit v3.13.2.0dot . + +
    + +### Tools + +Name | Version | Description +-----|---------|------------ + + +### Python packages + +Name | Version | Description +-----|---------|------------ +[Python](http://www.python.org/) | 3.13.2 | Python programming language with standard library +[build](https://pypi.org/project/build) | 1.2.2.post1 | A simple, correct Python build frontend +[colorama](https://pypi.org/project/colorama) | 0.4.6 | Cross-platform colored terminal text. +[packaging](https://pypi.org/project/packaging) | 24.2 | Core utilities for Python packages +[pip](https://pypi.org/project/pip) | 24.3.1 | The PyPA recommended tool for installing Python packages. +[pyproject_hooks](https://pypi.org/project/pyproject_hooks) | 1.1.0 | Wrappers to call pyproject.toml-based build backend hooks. +[setuptools](https://pypi.org/project/setuptools) | 75.6.0 | Easily download, build, install, upgrade, and uninstall Python packages +[sqlite_bro](https://pypi.org/project/sqlite_bro) | 0.13.1 | a graphic SQLite Client in 1 Python file +[wheel](https://pypi.org/project/wheel) | 0.45.1 | A built-package format for Python +[winpython](https://pypi.org/project/winpython) | 13.1.20250222 | WinPython distribution tools, including WPPM + +
    diff --git a/changelogs/WinPythondot-64bit-3.13.2.0_History.md b/changelogs/WinPythondot-64bit-3.13.2.0_History.md new file mode 100644 index 00000000..b4bbb942 --- /dev/null +++ b/changelogs/WinPythondot-64bit-3.13.2.0_History.md @@ -0,0 +1,16 @@ +## History of changes for WinPython-64bit 3.13.2.0dot + +The following changes were made to WinPython-64bit distribution since version 3.13.1.1dot. + +
    +### Python packages + +Upgraded packages: + + * [Python](http://www.python.org/) 3.13.1 → 3.13.2 (Python programming language with standard library) + * [wheel](https://pypi.org/project/wheel) 0.44.0 → 0.45.1 (A built-package format for Python) + * [winpython](https://pypi.org/project/winpython) 11.5.20250126 → 13.1.20250222 (WinPython distribution tools, including WPPM) + + +
    +* * * diff --git a/changelogs/WinPythondot-64bit-3.14.0.0.md b/changelogs/WinPythondot-64bit-3.14.0.0.md new file mode 100644 index 00000000..a97b3e37 --- /dev/null +++ b/changelogs/WinPythondot-64bit-3.14.0.0.md @@ -0,0 +1,28 @@ +## WinPython 3.14.0.0dot + +The following packages are included in WinPython-64bit v3.14.0.0dot a5b. + +
    + +### Tools + +Name | Version | Description +-----|---------|------------ + + +### Python packages + +Name | Version | Description +-----|---------|------------ +[Python](http://www.python.org/) | 3.14.0 | Python programming language with standard library +[build](https://pypi.org/project/build) | 1.2.2.post1 | A simple, correct Python build frontend +[colorama](https://pypi.org/project/colorama) | 0.4.6 | Cross-platform colored terminal text. +[packaging](https://pypi.org/project/packaging) | 24.2 | Core utilities for Python packages +[pip](https://pypi.org/project/pip) | 25.0.1 | The PyPA recommended tool for installing Python packages. +[pyproject_hooks](https://pypi.org/project/pyproject_hooks) | 1.1.0 | Wrappers to call pyproject.toml-based build backend hooks. +[setuptools](https://pypi.org/project/setuptools) | 75.6.0 | Easily download, build, install, upgrade, and uninstall Python packages +[sqlite_bro](https://pypi.org/project/sqlite_bro) | 0.13.1 | a graphic SQLite Client in 1 Python file +[wheel](https://pypi.org/project/wheel) | 0.45.1 | A built-package format for Python +[winpython](https://pypi.org/project/winpython) | 13.1.20250222 | WinPython distribution tools, including WPPM + +
    diff --git a/changelogs/WinPythondot-64bit-3.14.0.0_History.md b/changelogs/WinPythondot-64bit-3.14.0.0_History.md new file mode 100644 index 00000000..5b7848f1 --- /dev/null +++ b/changelogs/WinPythondot-64bit-3.14.0.0_History.md @@ -0,0 +1,8 @@ +## History of changes for WinPython-64bit 3.14.0.0dot + +The following changes were made to WinPython-64bit distribution since version 3.14.0.0dot. + +
    + +
    +* * * diff --git a/changelogs/WinPythonslim-64bit-3.12.8.1.md b/changelogs/WinPythonslim-64bit-3.12.8.1.md new file mode 100644 index 00000000..897798ea --- /dev/null +++ b/changelogs/WinPythonslim-64bit-3.12.8.1.md @@ -0,0 +1,522 @@ +## WinPython 3.12.8.1slim + +The following packages are included in WinPython-64bit v3.12.8.1slim b3. + +
    + +### Tools + +Name | Version | Description +-----|---------|------------ + + +### Python packages + +Name | Version | Description +-----|---------|------------ +[Python](http://www.python.org/) | 3.12.8 | Python programming language with standard library +[absl_py](https://pypi.org/project/absl_py) | 2.0.0 | Abseil Python Common Libraries, see https://github.com/abseil/abseil-py. +[adbc_driver_manager](https://pypi.org/project/adbc_driver_manager) | 1.3.0 | A generic entrypoint for ADBC drivers. +[adodbapi](https://pypi.org/project/adodbapi) | 2.6.1.3 | A pure Python package implementing PEP 249 DB-API using Microsoft ADO. +[aiofiles](https://pypi.org/project/aiofiles) | 23.2.1 | File support for asyncio. +[aiohappyeyeballs](https://pypi.org/project/aiohappyeyeballs) | 2.4.4 | Happy Eyeballs for asyncio +[aiohttp](https://pypi.org/project/aiohttp) | 3.11.11 | Async http client/server framework (asyncio) +[aiosignal](https://pypi.org/project/aiosignal) | 1.3.1 | aiosignal: a list of registered asynchronous callbacks +[aiosqlite](https://pypi.org/project/aiosqlite) | 0.20.0 | asyncio bridge to the standard sqlite3 module +[alabaster](https://pypi.org/project/alabaster) | 0.7.16 | A light, configurable Sphinx theme +[alembic](https://pypi.org/project/alembic) | 1.13.1 | A database migration tool for SQLAlchemy. +[altair](https://pypi.org/project/altair) | 5.5.0 | Vega-Altair: A declarative statistical visualization library for Python. +[aniso8601](https://pypi.org/project/aniso8601) | 9.0.1 | A library for parsing ISO 8601 strings. +[annotated_types](https://pypi.org/project/annotated_types) | 0.6.0 | Reusable constraint types to use with typing.Annotated +[ansicolors](https://pypi.org/project/ansicolors) | 1.1.8 | ANSI colors for Python +[anthropic](https://pypi.org/project/anthropic) | 0.42.0 | The official Python library for the anthropic API +[anyio](https://pypi.org/project/anyio) | 4.7.0 | High level compatibility layer for multiple asynchronous event loop implementations +[anywidget](https://pypi.org/project/anywidget) | 0.9.12 | custom jupyter widgets made easy +[appdirs](https://pypi.org/project/appdirs) | 1.4.4 | A small Python module for determining appropriate platform-specific dirs, e.g. a "user data dir". +[argon2_cffi](https://pypi.org/project/argon2_cffi) | 23.1.0 | Argon2 for Python +[argon2_cffi_bindings](https://pypi.org/project/argon2_cffi_bindings) | 21.2.0 | Low-level CFFI bindings for Argon2 +[array_api_compat](https://pypi.org/project/array_api_compat) | 1.10.0 | A wrapper around NumPy and other array libraries to make them compatible with the Array API standard +[arrow](https://pypi.org/project/arrow) | 1.3.0 | Better dates & times for Python +[asgi_csrf](https://pypi.org/project/asgi_csrf) | 0.9 | ASGI middleware for protecting against CSRF attacks +[asgiref](https://pypi.org/project/asgiref) | 3.8.1 | ASGI specs, helper code, and adapters +[asn1crypto](https://pypi.org/project/asn1crypto) | 1.5.1 | Fast ASN.1 parser and serializer with definitions for private keys, public keys, certificates, CRL, OCSP, CMS, PKCS#3, PKCS#7, PKCS#8, PKCS#12, +[asteval](https://pypi.org/project/asteval) | 0.9.31 | Safe, minimalistic evaluator of python expression using ast module +[astroid](https://pypi.org/project/astroid) | 3.1.0 | An abstract syntax tree for Python with inference support. +[astropy](https://pypi.org/project/astropy) | 6.1.6 | Astronomy and astrophysics core library +[astropy_iers_data](https://pypi.org/project/astropy_iers_data) | 0.2024.12.23.0.33.24 | IERS Earth Rotation and Leap Second tables for the astropy core package +[asttokens](https://pypi.org/project/asttokens) | 2.4.1 | Annotate AST trees with source code positions +[async_lru](https://pypi.org/project/async_lru) | 2.0.4 | Simple LRU cache for asyncio +[atomicwrites](https://pypi.org/project/atomicwrites) | 1.4.0 | Atomic file writes. +[attrs](https://pypi.org/project/attrs) | 23.2.0 | Classes Without Boilerplate +[autopep8](https://pypi.org/project/autopep8) | 2.0.4 | A tool that automatically formats Python code to conform to the PEP 8 style guide +[azure_core](https://pypi.org/project/azure_core) | 1.30.2 | Microsoft Azure Core Library for Python +[azure_cosmos](https://pypi.org/project/azure_cosmos) | 4.7.0 | Microsoft Azure Cosmos Client Library for Python +[azure_identity](https://pypi.org/project/azure_identity) | 1.16.1 | Microsoft Azure Identity Library for Python +[babel](https://pypi.org/project/babel) | 2.16.0 | Internationalization utilities +[baresql](https://pypi.org/project/baresql) | 0.8.0 | playing SQL directly on Python datas +[bcrypt](https://pypi.org/project/bcrypt) | 4.0.1 | Modern password hashing for your software and your servers +[beautifulsoup4](https://pypi.org/project/beautifulsoup4) | 4.12.2 | Screen-scraping library +[binaryornot](https://pypi.org/project/binaryornot) | 0.4.4 | Ultra-lightweight pure Python package to check if a file is binary or text. +[black](https://pypi.org/project/black) | 24.10.0 | The uncompromising code formatter. +[bleach](https://pypi.org/project/bleach) | 6.1.0 | An easy safelist-based HTML-sanitizing tool. +[blinker](https://pypi.org/project/blinker) | 1.7.0 | Fast, simple object-to-object and broadcast signaling +[bokeh](https://pypi.org/project/bokeh) | 3.6.2 | Interactive plots and applications in the browser from Python +[branca](https://pypi.org/project/branca) | 0.8.0 | Generate complex HTML+JS pages with Python +[brotli](https://pypi.org/project/brotli) | 1.1.0 | Python bindings for the Brotli compression library +[build](https://pypi.org/project/build) | 1.2.2.post1 | A simple, correct Python build frontend +[cachelib](https://pypi.org/project/cachelib) | 0.13.0 | A collection of cache libraries in the same API interface. +[cachetools](https://pypi.org/project/cachetools) | 5.4.0 | Extensible memoizing collections and decorators +[certifi](https://pypi.org/project/certifi) | 2024.6.2 | Python package for providing Mozilla's CA Bundle. +[cffi](https://pypi.org/project/cffi) | 1.17.1 | Foreign Function Interface for Python calling C code. +[chardet](https://pypi.org/project/chardet) | 5.2.0 | Universal encoding detector for Python 3 +[charset_normalizer](https://pypi.org/project/charset_normalizer) | 3.4.0 | The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet. +[clarabel](https://pypi.org/project/clarabel) | 0.9.0 | Clarabel Conic Interior Point Solver for Rust / Python +[click](https://pypi.org/project/click) | 8.1.7 | Composable command line interface toolkit +[click_default_group](https://pypi.org/project/click_default_group) | 1.2.4 | click_default_group +[cloudpickle](https://pypi.org/project/cloudpickle) | 3.0.0 | Pickler class to extend the standard pickle.Pickler functionality +[colorama](https://pypi.org/project/colorama) | 0.4.6 | Cross-platform colored terminal text. +[colorcet](https://pypi.org/project/colorcet) | 3.1.0 | Collection of perceptually uniform colormaps +[colorlog](https://pypi.org/project/colorlog) | 6.8.2 | Add colours to the output of Python's logging module. +[comm](https://pypi.org/project/comm) | 0.2.2 | Jupyter Python Comm implementation, for usage in ipykernel, xeus-python etc. +[contourpy](https://pypi.org/project/contourpy) | 1.3.1 | Python library for calculating contours of 2D quadrilateral grids +[cookiecutter](https://pypi.org/project/cookiecutter) | 2.6.0 | A command-line utility that creates projects from project templates, e.g +[cryptography](https://pypi.org/project/cryptography) | 44.0.0 | cryptography is a package which provides cryptographic recipes and primitives to Python developers. +[cvxopt](https://pypi.org/project/cvxopt) | 1.3.2 | Convex optimization package +[cvxpy](https://pypi.org/project/cvxpy) | 1.6.0 | A domain-specific language for modeling convex optimization problems in Python. +[cycler](https://pypi.org/project/cycler) | 0.12.1 | Composable style cycles +[cython](https://pypi.org/project/cython) | 3.0.11 | The Cython compiler for writing C extensions in the Python language. +[cytoolz](https://pypi.org/project/cytoolz) | 1.0.1 | Cython implementation of Toolz: High performance functional utilities +[dask](https://pypi.org/project/dask) | 2024.12.1 | Parallel PyData with Task Scheduling +[dask_expr](https://pypi.org/project/dask_expr) | 1.1.21 | High Level Expressions for Dask +[datasette](https://pypi.org/project/datasette) | 0.64.8 | An open source multi-tool for exploring and publishing data +[datasette_graphql](https://pypi.org/project/datasette_graphql) | 2.2 | Datasette plugin providing an automatic GraphQL API for your SQLite databases +[datashader](https://pypi.org/project/datashader) | 0.16.3 | Data visualization toolchain based on aggregating into a grid +[db_py](https://pypi.org/project/db_py) | 0.5.4b1 | a db package that doesn't suck +[deap](https://pypi.org/project/deap) | 1.4.2 | Distributed Evolutionary Algorithms in Python +[debugpy](https://pypi.org/project/debugpy) | 1.8.0 | An implementation of the Debug Adapter Protocol for Python +[decorator](https://pypi.org/project/decorator) | 5.1.1 | Decorators for Humans +[defusedxml](https://pypi.org/project/defusedxml) | 0.7.1 | XML bomb protection for Python stdlib modules +[diff_match_patch](https://pypi.org/project/diff_match_patch) | 20230430 | Diff Match and Patch +[dill](https://pypi.org/project/dill) | 0.3.7 | serialize all of Python +[distributed](https://pypi.org/project/distributed) | 2024.12.1 | Distributed scheduler for Dask +[distro](https://pypi.org/project/distro) | 1.8.0 | Distro - an OS platform information API +[django](https://pypi.org/project/django) | 5.0.7 | A high-level Python web framework that encourages rapid development and clean, pragmatic design. +[dnspython](https://pypi.org/project/dnspython) | 2.6.1 | DNS toolkit +[docopt](https://pypi.org/project/docopt) | 0.6.2 | Pythonic argument parser, that will make you smile +[docstring_to_markdown](https://pypi.org/project/docstring_to_markdown) | 0.13 | On the fly conversion of Python docstrings to markdown +[docutils](https://pypi.org/project/docutils) | 0.20.1 | Docutils -- Python Documentation Utilities +[duckdb](https://pypi.org/project/duckdb) | 1.1.3 | DuckDB in-process database +[entrypoints](https://pypi.org/project/entrypoints) | 0.4 | Discover and load entry points from installed packages. +[et_xmlfile](https://pypi.org/project/et_xmlfile) | 1.1.0 | An implementation of lxml.xmlfile for the standard library +[eval_type_backport](https://pypi.org/project/eval_type_backport) | 0.2.2 | Like `typing._eval_type`, but lets older Python versions use newer typing features. +[executing](https://pypi.org/project/executing) | 2.0.1 | Get the currently executing AST node of a frame, and other information +[faker](https://pypi.org/project/faker) | 33.3.1 | Faker is a Python package that generates fake data for you. +[fast_histogram](https://pypi.org/project/fast_histogram) | 0.14 | Fast simple 1D and 2D histograms +[fastapi](https://pypi.org/project/fastapi) | 0.115.6 | FastAPI framework, high performance, easy to learn, fast to code, ready for production +[fastjsonschema](https://pypi.org/project/fastjsonschema) | 2.18.0 | Fastest Python implementation of JSON schema +[filelock](https://pypi.org/project/filelock) | 3.14.0 | A platform independent file lock. +[filterpy](https://pypi.org/project/filterpy) | 1.4.5 | Kalman filtering and optimal estimation library +[flake8](https://pypi.org/project/flake8) | 7.1.1 | the modular source code checker: pep8 pyflakes and co +[flask](https://pypi.org/project/flask) | 3.0.3 | A simple framework for building complex web applications. +[flask_mail](https://pypi.org/project/flask_mail) | 0.9.1 | Flask extension for sending email +[flask_session](https://pypi.org/project/flask_session) | 0.5.0 | Server-side session support for Flask +[flask_sqlalchemy](https://pypi.org/project/flask_sqlalchemy) | 3.0.5 | Add SQLAlchemy support to your Flask application. +[flit](https://pypi.org/project/flit) | 3.9.0 | A simple packaging tool for simple packages. +[flit_core](https://pypi.org/project/flit_core) | 3.9.0 | Distribution-building parts of Flit. See flit package for more information +[folium](https://pypi.org/project/folium) | 0.18.0 | Make beautiful maps with Leaflet.js & Python +[fonttools](https://pypi.org/project/fonttools) | 4.55.3 | Tools to manipulate font files +[formlayout](https://pypi.org/project/formlayout) | 1.2.1a1 | The most easy way to create Qt form dialogs and widgets with Python +[fqdn](https://pypi.org/project/fqdn) | 1.5.1 | Validates fully-qualified domain names against RFC 1123, so that they are acceptable to modern bowsers +[frozenlist](https://pypi.org/project/frozenlist) | 1.5.0 | A list-like structure which implements collections.abc.MutableSequence +[fsspec](https://pypi.org/project/fsspec) | 2024.6.1 | File-system specification +[future](https://pypi.org/project/future) | 0.18.2 | Clean single-source support for Python 3 and 2 +[fuzzywuzzy](https://pypi.org/project/fuzzywuzzy) | 0.18.0 | Fuzzy string matching in python +[geographiclib](https://pypi.org/project/geographiclib) | 2.0 | The geodesic routines from GeographicLib +[geopandas](https://pypi.org/project/geopandas) | 1.0.1 | Geographic pandas extensions +[geopy](https://pypi.org/project/geopy) | 2.4.1 | Python Geocoding Toolbox +[gitdb](https://pypi.org/project/gitdb) | 4.0.10 | Git Object Database +[gitpython](https://pypi.org/project/gitpython) | 3.1.32 | GitPython is a Python library used to interact with Git repositories +[google_auth](https://pypi.org/project/google_auth) | 2.37.0 | Google Authentication Library +[graphene](https://pypi.org/project/graphene) | 3.3 | GraphQL Framework for Python +[graphql_core](https://pypi.org/project/graphql_core) | 3.2.3 | GraphQL implementation for Python, a port of GraphQL.js, the JavaScript reference implementation for GraphQL. +[graphql_relay](https://pypi.org/project/graphql_relay) | 3.2.0 | Relay library for graphql-core +[greenlet](https://pypi.org/project/greenlet) | 3.1.1 | Lightweight in-process concurrent programming +[griffe](https://pypi.org/project/griffe) | 1.5.4 | Signatures for entire Python programs +[groq](https://pypi.org/project/groq) | 0.13.1 | The official Python library for the groq API +[guidata](https://pypi.org/project/guidata) | 3.7.1 | Automatic GUI generation for easy dataset editing and display +[h11](https://pypi.org/project/h11) | 0.14.0 | A pure-Python, bring-your-own-I/O implementation of HTTP/1.1 +[h2](https://pypi.org/project/h2) | 4.1.0 | HTTP/2 State-Machine based protocol implementation +[h5py](https://pypi.org/project/h5py) | 3.12.1 | Read and write HDF5 files from Python +[hatchling](https://pypi.org/project/hatchling) | 1.27.0 | Modern, extensible Python build backend +[holoviews](https://pypi.org/project/holoviews) | 1.20.0 | A high-level plotting API for the PyData ecosystem built on HoloViews. +[hpack](https://pypi.org/project/hpack) | 4.0.0 | Pure-Python HPACK header compression +[html5lib](https://pypi.org/project/html5lib) | 1.1 | HTML parser based on the WHATWG HTML specification +[httpcore](https://pypi.org/project/httpcore) | 1.0.5 | A minimal low-level HTTP client. +[httpie](https://pypi.org/project/httpie) | 3.2.4 | HTTPie: modern, user-friendly command-line HTTP client for the API era. +[httpx](https://pypi.org/project/httpx) | 0.27.2 | The next generation HTTP client. +[huggingface_hub](https://pypi.org/project/huggingface_hub) | 0.27.0 | Client library to download and publish models, datasets and other repos on the huggingface.co hub +[hupper](https://pypi.org/project/hupper) | 1.12 | Integrated process monitor for developing and reloading daemons. +[hvplot](https://pypi.org/project/hvplot) | 0.11.2 | A high-level plotting API for the PyData ecosystem built on HoloViews. +[hypercorn](https://pypi.org/project/hypercorn) | 0.16.0 | A ASGI Server based on Hyper libraries and inspired by Gunicorn +[hyperframe](https://pypi.org/project/hyperframe) | 6.0.1 | HTTP/2 framing layer for Python +[hypothesis](https://pypi.org/project/hypothesis) | 6.122.3 | A library for property-based testing +[idna](https://pypi.org/project/idna) | 3.7 | Internationalized Domain Names in Applications (IDNA) +[imageio](https://pypi.org/project/imageio) | 2.33.1 | Library for reading and writing a wide range of image, video, scientific, and volumetric data formats. +[imagesize](https://pypi.org/project/imagesize) | 1.4.1 | Getting image size from png/jpeg/jpeg2000/gif file +[imbalanced_learn](https://pypi.org/project/imbalanced_learn) | 0.13.0 | Toolbox for imbalanced dataset in machine learning +[importlib_metadata](https://pypi.org/project/importlib_metadata) | 7.1.0 | Read metadata from Python packages +[inflection](https://pypi.org/project/inflection) | 0.5.1 | A port of Ruby on Rails inflector to Python +[iniconfig](https://pypi.org/project/iniconfig) | 2.0.0 | brain-dead simple config-ini parsing +[intervaltree](https://pypi.org/project/intervaltree) | 3.0.2 | Editable interval tree data structure for Python 2 and 3 +[ipycanvas](https://pypi.org/project/ipycanvas) | 0.13.2 | Interactive widgets library exposing the browser's Canvas API +[ipykernel](https://pypi.org/project/ipykernel) | 6.29.5 | IPython Kernel for Jupyter +[ipyleaflet](https://pypi.org/project/ipyleaflet) | 0.19.2 | A Jupyter widget for dynamic Leaflet maps +[ipympl](https://pypi.org/project/ipympl) | 0.9.4 | Matplotlib Jupyter Extension +[ipython](https://pypi.org/project/ipython) | 8.31.0 | IPython: Productive Interactive Computing +[ipython_genutils](https://pypi.org/project/ipython_genutils) | 0.2.0 | Vestigial utilities from IPython +[ipython_sql](https://pypi.org/project/ipython_sql) | 0.5.0 | RDBMS access via IPython +[ipywidgets](https://pypi.org/project/ipywidgets) | 8.1.5 | Jupyter interactive widgets +[isoduration](https://pypi.org/project/isoduration) | 20.11.0 | Operations with ISO 8601 durations +[isort](https://pypi.org/project/isort) | 5.13.2 | A Python utility / library to sort Python imports. +[itsdangerous](https://pypi.org/project/itsdangerous) | 2.2.0 | Safely pass data to untrusted environments and back. +[janus](https://pypi.org/project/janus) | 2.0.0 | Mixed sync-async queue to interoperate between asyncio tasks and classic threads +[jaraco_classes](https://pypi.org/project/jaraco_classes) | 3.4.0 | Utility functions for Python class constructs +[jaraco_context](https://pypi.org/project/jaraco_context) | 6.0.1 | Useful decorators and context managers +[jaraco_functools](https://pypi.org/project/jaraco_functools) | 4.1.0 | Functools like those found in stdlib +[jedi](https://pypi.org/project/jedi) | 0.19.2 | An autocompletion tool for Python that can be used for text editors. +[jellyfish](https://pypi.org/project/jellyfish) | 1.1.3 | Approximate and phonetic matching of strings. +[jinja2](https://pypi.org/project/jinja2) | 3.1.2 | A very fast and expressive template engine. +[jiter](https://pypi.org/project/jiter) | 0.8.2 | Fast iterable JSON parser. +[joblib](https://pypi.org/project/joblib) | 1.4.2 | Lightweight pipelining with Python functions +[json5](https://pypi.org/project/json5) | 0.9.14 | A Python implementation of the JSON5 data format. +[jsonpatch](https://pypi.org/project/jsonpatch) | 1.33 | Apply JSON-Patches (RFC 6902) +[jsonpath_python](https://pypi.org/project/jsonpath_python) | 1.0.6 | A more powerful JSONPath implementation in modern python +[jsonpointer](https://pypi.org/project/jsonpointer) | 2.4 | Identify specific nodes in a JSON document (RFC 6901) +[jsonschema](https://pypi.org/project/jsonschema) | 4.19.2 | An implementation of JSON Schema validation for Python +[jsonschema_specifications](https://pypi.org/project/jsonschema_specifications) | 2023.12.1 | The JSON Schema meta-schemas and vocabularies, exposed as a Registry +[julia](https://pypi.org/project/julia) | 0.6.2 | Julia/Python bridge with IPython support. +[jupyter](https://pypi.org/project/jupyter) | 1.1.1 | Jupyter metapackage. Install all the Jupyter components in one go. +[jupyter_bokeh](https://pypi.org/project/jupyter_bokeh) | 4.0.5 | A Jupyter extension for rendering Bokeh content. +[jupyter_client](https://pypi.org/project/jupyter_client) | 8.6.2 | Jupyter protocol implementation and client libraries +[jupyter_console](https://pypi.org/project/jupyter_console) | 6.6.3 | Jupyter terminal console +[jupyter_core](https://pypi.org/project/jupyter_core) | 5.7.2 | Jupyter core package. A base package on which Jupyter projects rely. +[jupyter_events](https://pypi.org/project/jupyter_events) | 0.10.0 | Jupyter Event System library +[jupyter_leaflet](https://pypi.org/project/jupyter_leaflet) | 0.19.2 | ipyleaflet extensions for JupyterLab and Jupyter Notebook +[jupyter_lsp](https://pypi.org/project/jupyter_lsp) | 2.2.5 | Multi-Language Server WebSocket proxy for Jupyter Notebook/Lab server +[jupyter_server](https://pypi.org/project/jupyter_server) | 2.14.2 | The backend—i.e. core services, APIs, and REST endpoints—to Jupyter web applications. +[jupyter_server_terminals](https://pypi.org/project/jupyter_server_terminals) | 0.5.3 | A Jupyter Server Extension Providing Terminals. +[jupyterlab](https://pypi.org/project/jupyterlab) | 4.3.4 | JupyterLab computational environment +[jupyterlab_pygments](https://pypi.org/project/jupyterlab_pygments) | 0.3.0 | Pygments theme using JupyterLab CSS variables +[jupyterlab_server](https://pypi.org/project/jupyterlab_server) | 2.27.3 | A set of server components for JupyterLab and JupyterLab like applications. +[jupyterlab_widgets](https://pypi.org/project/jupyterlab_widgets) | 3.0.13 | Jupyter interactive widgets for JupyterLab +[keras](https://pypi.org/project/keras) | 3.8.0 | Multi-backend Keras +[keyring](https://pypi.org/project/keyring) | 25.6.0 | Store and access your passwords safely. +[kiwisolver](https://pypi.org/project/kiwisolver) | 1.4.7 | A fast implementation of the Cassowary constraint solver +[langchain](https://pypi.org/project/langchain) | 0.3.13 | Building applications with LLMs through composability +[langchain_core](https://pypi.org/project/langchain_core) | 0.3.28 | Building applications with LLMs through composability +[langchain_text_splitters](https://pypi.org/project/langchain_text_splitters) | 0.3.4 | LangChain text splitting utilities +[langsmith](https://pypi.org/project/langsmith) | 0.2.6 | Client library to connect to the LangSmith LLM Tracing and Evaluation Platform. +[lazy_loader](https://pypi.org/project/lazy_loader) | 0.4 | Makes it easy to load subpackages and functions on demand. +[linkify_it_py](https://pypi.org/project/linkify_it_py) | 2.0.2 | Links recognition library with FULL unicode support. +[llvmlite](https://pypi.org/project/llvmlite) | 0.44.0 | lightweight wrapper around basic LLVM functionality +[lmfit](https://pypi.org/project/lmfit) | 1.3.1 | Least-Squares Minimization with Bounds and Constraints +[locket](https://pypi.org/project/locket) | 1.0.0 | File-based locks for Python on Linux and Windows +[logfire_api](https://pypi.org/project/logfire_api) | 2.11.0 | Shim for the Logfire SDK which does nothing unless Logfire is installed +[lxml](https://pypi.org/project/lxml) | 5.3.0 | Powerful and Pythonic XML processing library combining libxml2/libxslt with the ElementTree API. +[mako](https://pypi.org/project/mako) | 1.3.5 | A super-fast templating language that borrows the best ideas from the existing templating languages. +[markdown](https://pypi.org/project/markdown) | 3.5.1 | Python implementation of John Gruber's Markdown. +[markdown_it_py](https://pypi.org/project/markdown_it_py) | 2.2.0 | Python port of markdown-it. Markdown parsing, done right! +[markupsafe](https://pypi.org/project/markupsafe) | 2.1.1 | Safely add untrusted strings to HTML/XML markup. +[matplotlib](https://pypi.org/project/matplotlib) | 3.10.0 | Python plotting package +[matplotlib_inline](https://pypi.org/project/matplotlib_inline) | 0.1.7 | Inline Matplotlib backend for Jupyter +[maturin](https://pypi.org/project/maturin) | 1.8.1 | Build and publish crates with pyo3, cffi and uniffi bindings as well as rust binaries as python packages +[mccabe](https://pypi.org/project/mccabe) | 0.7.0 | McCabe checker, plugin for flake8 +[mdit_py_plugins](https://pypi.org/project/mdit_py_plugins) | 0.3.5 | Collection of plugins for markdown-it-py +[mdurl](https://pypi.org/project/mdurl) | 0.1.2 | Markdown URL utilities +[mercantile](https://pypi.org/project/mercantile) | 1.2.1 | Web mercator XYZ tile utilities +[mergedeep](https://pypi.org/project/mergedeep) | 1.3.4 | A deep merge function for 🐍. +[missingno](https://pypi.org/project/missingno) | 0.5.1 | Missing data visualization module for Python. +[mistralai](https://pypi.org/project/mistralai) | 1.2.5 | Python Client SDK for the Mistral AI API. +[mistune](https://pypi.org/project/mistune) | 2.0.5 | A sane Markdown parser with useful plugins and renderers +[mizani](https://pypi.org/project/mizani) | 0.11.4 | Scales for Python +[ml_dtypes](https://pypi.org/project/ml_dtypes) | 0.5.0 | +[mlxtend](https://pypi.org/project/mlxtend) | 0.23.3 | Machine Learning Library Extensions +[more_itertools](https://pypi.org/project/more_itertools) | 10.2.0 | More routines for operating on iterables, beyond itertools +[mpl_scatter_density](https://pypi.org/project/mpl_scatter_density) | 0.7 | Matplotlib helpers to make density scatter plots +[mpld3](https://pypi.org/project/mpld3) | 0.5.8 | D3 Viewer for Matplotlib +[mpmath](https://pypi.org/project/mpmath) | 1.3.0 | Python library for arbitrary-precision floating-point arithmetic +[msal](https://pypi.org/project/msal) | 1.30.0 | The Microsoft Authentication Library (MSAL) for Python library enables your app to access the Microsoft Cloud by supporting authentication of us +[msal_extensions](https://pypi.org/project/msal_extensions) | 1.2.0 | Microsoft Authentication Library extensions (MSAL EX) provides a persistence API that can save your data on disk, encrypted on Windows, macOS an +[msgpack](https://pypi.org/project/msgpack) | 1.0.4 | MessagePack serializer +[multidict](https://pypi.org/project/multidict) | 6.1.0 | multidict implementation +[multipledispatch](https://pypi.org/project/multipledispatch) | 1.0.0 | Multiple dispatch +[mutagen](https://pypi.org/project/mutagen) | 1.47.0 | read and write audio tags for many formats +[mypy](https://pypi.org/project/mypy) | 1.14.0 | Optional static typing for Python +[mypy_extensions](https://pypi.org/project/mypy_extensions) | 1.0.0 | Type system extensions for programs checked with the mypy type checker. +[mysql_connector_python](https://pypi.org/project/mysql_connector_python) | 8.0.21 | MySQL driver written in Python +[namex](https://pypi.org/project/namex) | 0.0.8 | A simple utility to separate the implementation of your Python package and its public API surface. +[narwhals](https://pypi.org/project/narwhals) | 1.21.1 | Extremely lightweight compatibility layer between dataframe libraries +[nbclient](https://pypi.org/project/nbclient) | 0.10.0 | A client library for executing notebooks. Formerly nbconvert's ExecutePreprocessor. +[nbconvert](https://pypi.org/project/nbconvert) | 7.16.1 | Converting Jupyter Notebooks (.ipynb files) to other formats +[nbformat](https://pypi.org/project/nbformat) | 5.10.4 | The Jupyter Notebook format +[nest_asyncio](https://pypi.org/project/nest_asyncio) | 1.6.0 | Patch asyncio to allow nested event loops +[networkx](https://pypi.org/project/networkx) | 3.4.2 | Python package for creating and manipulating graphs and networks +[nltk](https://pypi.org/project/nltk) | 3.9.1 | Natural Language Toolkit +[notebook](https://pypi.org/project/notebook) | 7.3.1 | Jupyter Notebook - A web-based notebook environment for interactive computing +[notebook_shim](https://pypi.org/project/notebook_shim) | 0.2.4 | A shim layer for notebook traits and config +[numba](https://pypi.org/project/numba) | 0.61.0 | compiling Python code using LLVM +[numpy](https://pypi.org/project/numpy) | 2.1.3 | Fundamental package for array computing in Python +[numpydoc](https://pypi.org/project/numpydoc) | 1.6.0 | Sphinx extension to support docstrings in Numpy format +[openai](https://pypi.org/project/openai) | 1.58.1 | The official Python library for the openai API +[opencv_python](https://pypi.org/project/opencv_python) | 4.10.0.84 | Wrapper package for OpenCV python bindings. +[openpyxl](https://pypi.org/project/openpyxl) | 3.1.2 | A Python library to read/write Excel 2010 xlsx/xlsm files +[optree](https://pypi.org/project/optree) | 0.13.1 | Optimized PyTree Utilities. +[optuna](https://pypi.org/project/optuna) | 3.6.1 | A hyperparameter optimization framework +[orjson](https://pypi.org/project/orjson) | 3.10.12 | Fast, correct Python JSON library supporting dataclasses, datetimes, and numpy +[osqp](https://pypi.org/project/osqp) | 0.6.7.post3 | OSQP: The Operator Splitting QP Solver +[outcome](https://pypi.org/project/outcome) | 1.3.0.post0 | Capture the outcome of Python function calls. +[overrides](https://pypi.org/project/overrides) | 7.7.0 | A decorator to automatically detect mismatch when overriding a method. +[packaging](https://pypi.org/project/packaging) | 24.2 | Core utilities for Python packages +[pandas](https://pypi.org/project/pandas) | 2.2.3 | Powerful data structures for data analysis, time series, and statistics +[pandocfilters](https://pypi.org/project/pandocfilters) | 1.5.0 | Utilities for writing pandoc filters in python +[panel](https://pypi.org/project/panel) | 1.5.4 | The powerful data exploration & web app framework for Python. +[papermill](https://pypi.org/project/papermill) | 2.6.0 | Parameterize and run Jupyter and nteract Notebooks +[param](https://pypi.org/project/param) | 2.1.1 | Make your Python code clearer and more reliable by declaring Parameters. +[paramiko](https://pypi.org/project/paramiko) | 2.8.0 | SSH2 protocol library +[parso](https://pypi.org/project/parso) | 0.8.4 | A Python Parser +[partd](https://pypi.org/project/partd) | 1.4.0 | Appendable key-value storage +[pathspec](https://pypi.org/project/pathspec) | 0.11.0 | Utility library for gitignore style pattern matching of file paths. +[patsy](https://pypi.org/project/patsy) | 0.5.6 | A Python package for describing statistical models and for building design matrices. +[pdfrw](https://pypi.org/project/pdfrw) | 0.4.post2 | PDF file reader/writer library +[pep8](https://pypi.org/project/pep8) | 1.7.1 | Python style guide checker +[pexpect](https://pypi.org/project/pexpect) | 4.8.0 | Pexpect allows easy control of interactive console applications. +[pg8000](https://pypi.org/project/pg8000) | 1.23.0 | PostgreSQL interface library +[pickleshare](https://pypi.org/project/pickleshare) | 0.7.5 | Tiny 'shelve'-like database with concurrency support +[pillow](https://pypi.org/project/pillow) | 11.1.0 | Python Imaging Library (Fork) +[pint](https://pypi.org/project/pint) | 0.23 | Physical quantities module +[pip](https://pypi.org/project/pip) | 24.3.1 | The PyPA recommended tool for installing Python packages. +[pkginfo](https://pypi.org/project/pkginfo) | 1.11.2 | Query metadata from sdists / bdists / installed packages. +[platformdirs](https://pypi.org/project/platformdirs) | 4.2.2 | A small Python package for determining appropriate platform-specific dirs, e.g. a `user data dir`. +[plotly](https://pypi.org/project/plotly) | 5.24.1 | An open-source, interactive data visualization library for Python +[plotnine](https://pypi.org/project/plotnine) | 0.13.6 | A Grammar of Graphics for Python +[plotpy](https://pypi.org/project/plotpy) | 2.7.0 | Curve and image plotting tools for Python/Qt applications +[pluggy](https://pypi.org/project/pluggy) | 1.5.0 | plugin and hook calling mechanisms for python +[ply](https://pypi.org/project/ply) | 3.11 | Python Lex & Yacc +[polars](https://pypi.org/project/polars) | 1.20.0 | Blazingly fast DataFrame library +[portalocker](https://pypi.org/project/portalocker) | 2.7.0 | Wraps the portalocker recipe for easy usage +[ppci](https://pypi.org/project/ppci) | 0.5.9 | A compiler for ARM, X86, MSP430, xtensa and more implemented in pure Python +[prettytable](https://pypi.org/project/prettytable) | 3.3.0 | A simple Python library for easily displaying tabular data in a visually appealing ASCII table format +[prince](https://pypi.org/project/prince) | 0.15.0 | Factor analysis in Python: PCA, CA, MCA, MFA, FAMD, GPA +[priority](https://pypi.org/project/priority) | 2.0.0 | A pure-Python implementation of the HTTP/2 priority tree +[prometheus_client](https://pypi.org/project/prometheus_client) | 0.18.0 | Python client for the Prometheus monitoring system. +[prompt_toolkit](https://pypi.org/project/prompt_toolkit) | 3.0.48 | Library for building powerful interactive command lines in Python +[propcache](https://pypi.org/project/propcache) | 0.2.1 | Accelerated property cache +[protobuf](https://pypi.org/project/protobuf) | 5.27.3 | +[psutil](https://pypi.org/project/psutil) | 5.9.8 | Cross-platform lib for process and system monitoring in Python. +[psygnal](https://pypi.org/project/psygnal) | 0.11.1 | Fast python callback/event system modeled after Qt Signals +[ptpython](https://pypi.org/project/ptpython) | 3.0.29 | Python REPL build on top of prompt_toolkit +[ptyprocess](https://pypi.org/project/ptyprocess) | 0.7.0 | Run a subprocess in a pseudo terminal +[pure_eval](https://pypi.org/project/pure_eval) | 0.2.2 | Safely evaluate AST nodes without side effects +[pyarrow](https://pypi.org/project/pyarrow) | 19.0.0 | Python library for Apache Arrow +[pyasn1](https://pypi.org/project/pyasn1) | 0.4.8 | ASN.1 types and codecs +[pyasn1_modules](https://pypi.org/project/pyasn1_modules) | 0.2.8 | A collection of ASN.1-based protocols modules. +[pybars3](https://pypi.org/project/pybars3) | 0.9.7 | Handlebars.js templating for Python 3 and 2 +[pybind11](https://pypi.org/project/pybind11) | 2.13.6 | Seamless operability between C++11 and Python +[pycodestyle](https://pypi.org/project/pycodestyle) | 2.12.0 | Python style guide checker +[pycparser](https://pypi.org/project/pycparser) | 2.22 | C parser in Python +[pycryptodomex](https://pypi.org/project/pycryptodomex) | 3.20.0 | Cryptographic library for Python +[pyct](https://pypi.org/project/pyct) | 0.5.0 | Python package common tasks for users (e.g. copy examples, fetch data, ...) +[pydantic](https://pypi.org/project/pydantic) | 2.10.4 | Data validation using Python type hints +[pydantic_ai](https://pypi.org/project/pydantic_ai) | 0.0.15 | Agent Framework / shim to use Pydantic with LLMs +[pydantic_ai_slim](https://pypi.org/project/pydantic_ai_slim) | 0.0.15 | Agent Framework / shim to use Pydantic with LLMs, slim package +[pydantic_core](https://pypi.org/project/pydantic_core) | 2.27.2 | Core functionality for Pydantic validation and serialization +[pydeck](https://pypi.org/project/pydeck) | 0.9.1 | Widget for deck.gl maps +[pydocstyle](https://pypi.org/project/pydocstyle) | 6.3.0 | Python docstring style checker +[pydub](https://pypi.org/project/pydub) | 0.25.1 | Manipulate audio with an simple and easy high level interface +[pyerfa](https://pypi.org/project/pyerfa) | 2.0.1.4 | Python bindings for ERFA +[pyflakes](https://pypi.org/project/pyflakes) | 3.2.0 | passive checker of Python programs +[pygments](https://pypi.org/project/pygments) | 2.19.1 | Pygments is a syntax highlighting package written in Python. +[pyjwt](https://pypi.org/project/pyjwt) | 2.8.0 | JSON Web Token implementation in Python +[pylint](https://pypi.org/project/pylint) | 3.1.0 | python code static checker +[pylint_venv](https://pypi.org/project/pylint_venv) | 3.0.3 | pylint-venv provides a Pylint init-hook to use the same Pylint installation with different virtual environments. +[pyls_spyder](https://pypi.org/project/pyls_spyder) | 0.4.0 | Spyder extensions for the python-lsp-server +[pymeta3](https://pypi.org/project/pymeta3) | 0.5.1 | Pattern-matching language based on OMeta for Python 3 and 2 +[pymongo](https://pypi.org/project/pymongo) | 4.10.1 | Python driver for MongoDB +[pympler](https://pypi.org/project/pympler) | 1.0.1 | A development tool to measure, monitor and analyze the memory behavior of Python objects. +[pynacl](https://pypi.org/project/pynacl) | 1.5.0 | Python binding to the Networking and Cryptography (NaCl) library +[pynndescent](https://pypi.org/project/pynndescent) | 0.5.12 | Nearest Neighbor Descent +[pyodbc](https://pypi.org/project/pyodbc) | 5.2.0 | DB API module for ODBC +[pyogrio](https://pypi.org/project/pyogrio) | 0.10.0 | Vectorized spatial vector file format I/O using GDAL/OGR +[pyomo](https://pypi.org/project/pyomo) | 6.8.0 | Pyomo: Python Optimization Modeling Objects +[pypandoc](https://pypi.org/project/pypandoc) | 1.5 | Thin wrapper for pandoc. +[pyparsing](https://pypi.org/project/pyparsing) | 3.2.1 | pyparsing module - Classes and methods to define and execute parsing grammars +[pypdf](https://pypi.org/project/pypdf) | 3.15.2 | A pure-python PDF library capable of splitting, merging, cropping, and transforming PDF files +[pyproj](https://pypi.org/project/pyproj) | 3.7.0 | Python interface to PROJ (cartographic projections and coordinate transformations library) +[pyproject_hooks](https://pypi.org/project/pyproject_hooks) | 1.1.0 | Wrappers to call pyproject.toml-based build backend hooks. +[pyqt5](https://pypi.org/project/pyqt5) | 5.15.10 | Python bindings for the Qt cross platform application toolkit +[pyqt5_qt5](https://pypi.org/project/pyqt5_qt5) | 5.15.2 | The subset of a Qt installation needed by PyQt5. +[pyqt5_sip](https://pypi.org/project/pyqt5_sip) | 12.13.0 | The sip module support for PyQt5 +[pyqtgraph](https://pypi.org/project/pyqtgraph) | 0.13.7 | Scientific Graphics and GUI Library for Python +[pyqtwebengine](https://pypi.org/project/pyqtwebengine) | 5.15.6 | Python bindings for the Qt WebEngine framework +[pyqtwebengine_qt5](https://pypi.org/project/pyqtwebengine_qt5) | 5.15.2 | The subset of a Qt installation needed by PyQtWebEngine. +[pyserial](https://pypi.org/project/pyserial) | 3.5 | Python Serial Port Extension +[pysimplegui](https://pypi.org/project/pysimplegui) | 4.60.4 | Python GUIs for Humans +[pysocks](https://pypi.org/project/pysocks) | 1.7.1 | A Python SOCKS client module. See https://github.com/Anorov/PySocks for more information. +[pyspnego](https://pypi.org/project/pyspnego) | 0.11.2 | Windows Negotiate Authentication Client and Server +[pytest](https://pypi.org/project/pytest) | 8.2.2 | pytest: simple powerful testing with Python +[python_barcode](https://pypi.org/project/python_barcode) | 0.15.1 | Create standard barcodes with Python. No external modules needed. (optional Pillow support included). +[python_dateutil](https://pypi.org/project/python_dateutil) | 2.8.2 | Extensions to the standard Python datetime module +[python_dotenv](https://pypi.org/project/python_dotenv) | 1.0.1 | Read key-value pairs from a .env file and set them as environment variables +[python_json_logger](https://pypi.org/project/python_json_logger) | 2.0.7 | A python library adding a json log formatter +[python_lsp_black](https://pypi.org/project/python_lsp_black) | 2.0.0 | Black plugin for the Python LSP Server +[python_lsp_jsonrpc](https://pypi.org/project/python_lsp_jsonrpc) | 1.1.2 | JSON RPC 2.0 server library +[python_lsp_server](https://pypi.org/project/python_lsp_server) | 1.12.0 | Python Language Server for the Language Server Protocol +[python_multipart](https://pypi.org/project/python_multipart) | 0.0.9 | A streaming multipart parser for Python +[python_slugify](https://pypi.org/project/python_slugify) | 8.0.4 | A Python slugify application that also handles Unicode +[pythonqwt](https://pypi.org/project/pythonqwt) | 0.14.2 | Qt plotting widgets for Python +[pytoolconfig](https://pypi.org/project/pytoolconfig) | 1.3.1 | Python tool configuration +[pytz](https://pypi.org/project/pytz) | 2024.1 | World timezone definitions, modern and historical +[pyviz_comms](https://pypi.org/project/pyviz_comms) | 3.0.3 | A JupyterLab extension for rendering HoloViz content. +[pywavelets](https://pypi.org/project/pywavelets) | 1.8.0 | PyWavelets, wavelet transform module +[pywin32](https://pypi.org/project/pywin32) | 308 | Python for Window Extensions +[pywin32_ctypes](https://pypi.org/project/pywin32_ctypes) | 0.2.2 | A (partial) reimplementation of pywin32 using ctypes/cffi +[pywinpty](https://pypi.org/project/pywinpty) | 2.0.14 | Pseudo terminal support for Windows from Python. +[pywinusb](https://pypi.org/project/pywinusb) | 0.4.2 | A package that simplifies USB/HID communications on windows +[pyyaml](https://pypi.org/project/pyyaml) | 6.0.2 | YAML parser and emitter for Python +[pyzmq](https://pypi.org/project/pyzmq) | 26.2.0 | Python bindings for 0MQ +[qdarkstyle](https://pypi.org/project/qdarkstyle) | 3.2.3 | The most complete dark/light style sheet for C++/Python and Qt applications +[qdldl](https://pypi.org/project/qdldl) | 0.1.7.post5 | QDLDL, a free LDL factorization routine. +[qrcode](https://pypi.org/project/qrcode) | 8.0 | QR Code image generator +[qstylizer](https://pypi.org/project/qstylizer) | 0.2.2 | Stylesheet Generator for PyQt{4-5}/PySide{1-2} +[qtawesome](https://pypi.org/project/qtawesome) | 1.3.1 | FontAwesome icons in PyQt and PySide applications +[qtconsole](https://pypi.org/project/qtconsole) | 5.5.2 | Jupyter Qt console +[qtpy](https://pypi.org/project/qtpy) | 2.4.1 | Provides an abstraction layer on top of the various Qt bindings (PyQt5/6 and PySide2/6). +[quantecon](https://pypi.org/project/quantecon) | 0.7.2 | Import the main names to top level. +[quart](https://pypi.org/project/quart) | 0.19.4 | A Python ASGI web microframework with the same API as Flask +[rapidfuzz](https://pypi.org/project/rapidfuzz) | 3.9.6 | rapid fuzzy string matching +[readme_renderer](https://pypi.org/project/readme_renderer) | 35.0 | readme_renderer is a library for rendering "readme" descriptions for Warehouse +[redis](https://pypi.org/project/redis) | 5.0.3 | Python client for Redis database and key-value store +[referencing](https://pypi.org/project/referencing) | 0.35.1 | JSON Referencing + Python +[regex](https://pypi.org/project/regex) | 2024.11.6 | Alternative regular expression module, to replace re. +[reportlab](https://pypi.org/project/reportlab) | 4.2.2 | The Reportlab Toolkit +[requests](https://pypi.org/project/requests) | 2.32.3 | Python HTTP for Humans. +[requests_ntlm](https://pypi.org/project/requests_ntlm) | 1.3.0 | This package allows for HTTP NTLM authentication using the requests library. +[requests_toolbelt](https://pypi.org/project/requests_toolbelt) | 1.0.0 | A utility belt for advanced users of python-requests +[rfc3339_validator](https://pypi.org/project/rfc3339_validator) | 0.1.4 | A pure python RFC3339 validator +[rfc3986](https://pypi.org/project/rfc3986) | 2.0.0 | Validating URI References per RFC 3986 +[rfc3986_validator](https://pypi.org/project/rfc3986_validator) | 0.1.1 | Pure python rfc3986 validator +[rich](https://pypi.org/project/rich) | 13.9.4 | Render rich text, tables, progress bars, syntax highlighting, markdown and more to the terminal +[rope](https://pypi.org/project/rope) | 1.12.0 | a python refactoring library... +[rpds_py](https://pypi.org/project/rpds_py) | 0.22.3 | Python bindings to Rust's persistent data structures (rpds) +[rsa](https://pypi.org/project/rsa) | 4.7.2 | Pure-Python RSA implementation +[rtree](https://pypi.org/project/rtree) | 1.1.0 | R-Tree spatial index for Python GIS +[rx](https://pypi.org/project/rx) | 3.1.1 | Reactive Extensions (Rx) for Python +[scikit_image](https://pypi.org/project/scikit_image) | 0.25.0 | Image processing in Python +[scikit_learn](https://pypi.org/project/scikit_learn) | 1.6.1 | A set of python modules for machine learning and data mining +[scipy](https://pypi.org/project/scipy) | 1.15.1 | Fundamental algorithms for scientific computing in Python +[scramp](https://pypi.org/project/scramp) | 1.4.1 | An implementation of the SCRAM protocol. +[scs](https://pypi.org/project/scs) | 3.2.7 | Splitting conic solver +[seaborn](https://pypi.org/project/seaborn) | 0.13.2 | Statistical data visualization +[send2trash](https://pypi.org/project/send2trash) | 1.8.2 | Send file to trash natively under Mac OS X, Windows and Linux +[setuptools](https://pypi.org/project/setuptools) | 75.6.0 | Easily download, build, install, upgrade, and uninstall Python packages +[shapely](https://pypi.org/project/shapely) | 2.0.6 | Manipulation and analysis of geometric objects +[simplegeneric](https://pypi.org/project/simplegeneric) | 0.8.1 | Simple generic functions (similar to Python's own len(), pickle.dump(), etc.) +[simplejson](https://pypi.org/project/simplejson) | 3.19.3 | Simple, fast, extensible JSON encoder/decoder for Python +[simpy](https://pypi.org/project/simpy) | 4.0.1 | Event discrete, process based simulation for Python. +[six](https://pypi.org/project/six) | 1.16.0 | Python 2 and 3 compatibility utilities +[sklearn_compat](https://pypi.org/project/sklearn_compat) | 0.1.3 | Ease support for compatible scikit-learn estimators across versions +[smmap](https://pypi.org/project/smmap) | 5.0.0 | A pure Python implementation of a sliding window memory map manager +[sniffio](https://pypi.org/project/sniffio) | 1.3.0 | Sniff out which async library your code is running under +[snowballstemmer](https://pypi.org/project/snowballstemmer) | 2.2.0 | This package provides 29 stemmers for 28 languages generated from Snowball algorithms. +[sortedcontainers](https://pypi.org/project/sortedcontainers) | 2.4.0 | Sorted Containers -- Sorted List, Sorted Dict, Sorted Set +[sounddevice](https://pypi.org/project/sounddevice) | 0.4.6 | Play and Record Sound with Python +[soupsieve](https://pypi.org/project/soupsieve) | 2.5 | A modern CSS selector implementation for Beautiful Soup. +[sphinx](https://pypi.org/project/sphinx) | 7.3.7 | Python documentation generator +[sphinx_rtd_theme](https://pypi.org/project/sphinx_rtd_theme) | 2.0.0 | Read the Docs theme for Sphinx +[sphinxcontrib_applehelp](https://pypi.org/project/sphinxcontrib_applehelp) | 1.0.8 | sphinxcontrib-applehelp is a Sphinx extension which outputs Apple help books +[sphinxcontrib_devhelp](https://pypi.org/project/sphinxcontrib_devhelp) | 1.0.6 | sphinxcontrib-devhelp is a sphinx extension which outputs Devhelp documents +[sphinxcontrib_htmlhelp](https://pypi.org/project/sphinxcontrib_htmlhelp) | 2.0.5 | sphinxcontrib-htmlhelp is a sphinx extension which renders HTML help files +[sphinxcontrib_jquery](https://pypi.org/project/sphinxcontrib_jquery) | 4.1 | Extension to include jQuery on newer Sphinx releases +[sphinxcontrib_jsmath](https://pypi.org/project/sphinxcontrib_jsmath) | 1.0.1 | A sphinx extension which renders display math in HTML via JavaScript +[sphinxcontrib_qthelp](https://pypi.org/project/sphinxcontrib_qthelp) | 1.0.7 | sphinxcontrib-qthelp is a sphinx extension which outputs QtHelp documents +[sphinxcontrib_serializinghtml](https://pypi.org/project/sphinxcontrib_serializinghtml) | 1.1.9 | sphinxcontrib-serializinghtml is a sphinx extension which outputs "serialized" HTML files (json and pickle) +[spyder](https://pypi.org/project/spyder) | 5.5.6 | The Scientific Python Development Environment +[spyder_kernels](https://pypi.org/project/spyder_kernels) | 2.5.2 | Jupyter kernels for Spyder's console +[sqlalchemy](https://pypi.org/project/sqlalchemy) | 2.0.35 | Database Abstraction Library +[sqlite_bro](https://pypi.org/project/sqlite_bro) | 0.13.1 | a graphic SQLite Client in 1 Python file +[sqlite_fts4](https://pypi.org/project/sqlite_fts4) | 1.0.3 | Python functions for working with SQLite FTS4 search +[sqlite_utils](https://pypi.org/project/sqlite_utils) | 3.38 | CLI tool and Python library for manipulating SQLite databases +[sqlparse](https://pypi.org/project/sqlparse) | 0.5.3 | A non-validating SQL parser. +[squarify](https://pypi.org/project/squarify) | 0.4.4 | Pure Python implementation of the squarify treemap layout algorithm +[sspilib](https://pypi.org/project/sspilib) | 0.2.0 | SSPI API bindings for Python +[sspyrs](https://pypi.org/project/sspyrs) | 0.3 | Lightweight interface for SSRS reports to python +[stack_data](https://pypi.org/project/stack_data) | 0.6.3 | Extract data from python stack frames and tracebacks for informative displays +[starlette](https://pypi.org/project/starlette) | 0.41.3 | The little ASGI library that shines. +[statsmodels](https://pypi.org/project/statsmodels) | 0.14.4 | Statistical computations and models for Python +[streamlit](https://pypi.org/project/streamlit) | 1.41.1 | A faster way to build and share data apps +[streamz](https://pypi.org/project/streamz) | 0.6.3 | Streams +[sympy](https://pypi.org/project/sympy) | 1.13.2 | Computer algebra system (CAS) in Python +[tabulate](https://pypi.org/project/tabulate) | 0.9.0 | Pretty-print tabular data +[tblib](https://pypi.org/project/tblib) | 3.0.0 | Traceback serialization library. +[tenacity](https://pypi.org/project/tenacity) | 8.5.0 | Retry code until it succeeds +[termcolor](https://pypi.org/project/termcolor) | 2.5.0 | ANSI color formatting for output in terminal +[terminado](https://pypi.org/project/terminado) | 0.18.1 | Tornado websocket backend for the Xterm.js Javascript terminal emulator library. +[text_unidecode](https://pypi.org/project/text_unidecode) | 1.3 | The most basic Text::Unidecode port +[textdistance](https://pypi.org/project/textdistance) | 4.6.2 | Compute distance between the two texts. +[thefuzz](https://pypi.org/project/thefuzz) | 0.22.1 | Fuzzy string matching in python +[threadpoolctl](https://pypi.org/project/threadpoolctl) | 3.5.0 | threadpoolctl +[three_merge](https://pypi.org/project/three_merge) | 0.1.1 | Simple library for merging two strings with respect to a base one +[tifffile](https://pypi.org/project/tifffile) | 2025.1.10 | Read and write TIFF files +[tiktoken](https://pypi.org/project/tiktoken) | 0.8.0 | tiktoken is a fast BPE tokeniser for use with OpenAI's models +[tinycss2](https://pypi.org/project/tinycss2) | 1.3.0 | A tiny CSS parser +[toml](https://pypi.org/project/toml) | 0.10.2 | Python Library for Tom's Obvious, Minimal Language +[tomli](https://pypi.org/project/tomli) | 2.0.1 | A lil' TOML parser +[tomli_w](https://pypi.org/project/tomli_w) | 1.0.0 | A lil' TOML writer +[tomlkit](https://pypi.org/project/tomlkit) | 0.12.3 | Style preserving TOML library +[toolz](https://pypi.org/project/toolz) | 1.0.0 | List processing tools and functional utilities +[tornado](https://pypi.org/project/tornado) | 6.4.2 | Tornado is a Python web framework and asynchronous networking library, originally developed at FriendFeed. +[tqdm](https://pypi.org/project/tqdm) | 4.66.4 | Fast, Extensible Progress Meter +[traitlets](https://pypi.org/project/traitlets) | 5.14.1 | Traitlets Python configuration system +[traittypes](https://pypi.org/project/traittypes) | 0.2.1 | Scipy trait types +[trio](https://pypi.org/project/trio) | 0.28.0 | A friendly Python library for async concurrency and I/O +[trove_classifiers](https://pypi.org/project/trove_classifiers) | 2024.10.21.16 | Canonical source for classifiers on PyPI (pypi.org). +[twine](https://pypi.org/project/twine) | 6.0.1 | Collection of utilities for publishing packages on PyPI +[types_python_dateutil](https://pypi.org/project/types_python_dateutil) | 2.9.0.20240316 | Typing stubs for python-dateutil +[typing_extensions](https://pypi.org/project/typing_extensions) | 4.12.2 | Backported and Experimental Type Hints for Python 3.8+ +[typing_inspect](https://pypi.org/project/typing_inspect) | 0.9.0 | Runtime inspection utilities for typing module. +[tzdata](https://pypi.org/project/tzdata) | 2024.1 | Provider of IANA time zone data +[tzlocal](https://pypi.org/project/tzlocal) | 5.2 | tzinfo object for the local timezone +[uc_micro_py](https://pypi.org/project/uc_micro_py) | 1.0.1 | Micro subset of unicode data files for linkify-it-py projects. +[ujson](https://pypi.org/project/ujson) | 5.10.0 | Ultra fast JSON encoder and decoder for Python +[umap_learn](https://pypi.org/project/umap_learn) | 0.5.6 | Uniform Manifold Approximation and Projection +[uncertainties](https://pypi.org/project/uncertainties) | 3.1.7 | Transparent calculations with uncertainties on the quantities involved (aka error propagation); fast calculation of derivatives +[uri_template](https://pypi.org/project/uri_template) | 1.3.0 | RFC 6570 URI Template Processor +[urllib3](https://pypi.org/project/urllib3) | 2.0.3 | HTTP library with thread-safe connection pooling, file post, and more. +[uvicorn](https://pypi.org/project/uvicorn) | 0.30.3 | The lightning-fast ASGI server. +[vega_datasets](https://pypi.org/project/vega_datasets) | 0.9.0 | A Python package for offline access to Vega datasets +[waitress](https://pypi.org/project/waitress) | 3.0.0 | Waitress WSGI server +[watchdog](https://pypi.org/project/watchdog) | 6.0.0 | Filesystem events monitoring +[wcwidth](https://pypi.org/project/wcwidth) | 0.2.13 | Measures the displayed width of unicode strings in a terminal +[webcolors](https://pypi.org/project/webcolors) | 24.11.1 | A library for working with the color formats defined by HTML and CSS. +[webencodings](https://pypi.org/project/webencodings) | 0.5.1 | Character encoding aliases for legacy web content +[websocket_client](https://pypi.org/project/websocket_client) | 1.8.0 | WebSocket client for Python with low level API options +[websockets](https://pypi.org/project/websockets) | 14.2 | An implementation of the WebSocket Protocol (RFC 6455 & 7692) +[werkzeug](https://pypi.org/project/werkzeug) | 3.1.3 | The comprehensive WSGI web application library. +[whatthepatch](https://pypi.org/project/whatthepatch) | 1.0.7 | A patch parsing and application library. +[wheel](https://pypi.org/project/wheel) | 0.45.1 | A built-package format for Python +[widgetsnbextension](https://pypi.org/project/widgetsnbextension) | 4.0.13 | Jupyter interactive widgets for Jupyter Notebook +[winpython](https://pypi.org/project/winpython) | 12.0.20250201 | WinPython distribution tools, including WPPM +[wordcloud](https://pypi.org/project/wordcloud) | 1.9.4 | A little word cloud generator +[wsproto](https://pypi.org/project/wsproto) | 1.2.0 | WebSockets state-machine based protocol implementation +[xarray](https://pypi.org/project/xarray) | 2025.1.1 | N-D labeled arrays and datasets in Python +[xlsxwriter](https://pypi.org/project/xlsxwriter) | 3.1.9 | A Python module for creating Excel XLSX files. +[xmltodict](https://pypi.org/project/xmltodict) | 0.13.0 | Makes working with XML feel like you are working with JSON +[xyzservices](https://pypi.org/project/xyzservices) | 2023.10.1 | Source of XYZ tiles providers +[yapf](https://pypi.org/project/yapf) | 0.40.1 | A formatter for Python code. +[yarl](https://pypi.org/project/yarl) | 1.18.3 | Yet another URL library +[yt_dlp](https://pypi.org/project/yt_dlp) | 2023.7.6 | A youtube-dl fork with additional features and patches +[zict](https://pypi.org/project/zict) | 3.0.0 | Mutable mapping tools +[zipp](https://pypi.org/project/zipp) | 3.21.0 | Backport of pathlib-compatible object wrapper for zip files +[zstandard](https://pypi.org/project/zstandard) | 0.23.0 | Zstandard bindings for Python + +
    diff --git a/changelogs/WinPythonslim-64bit-3.12.8.1_History.md b/changelogs/WinPythonslim-64bit-3.12.8.1_History.md new file mode 100644 index 00000000..72a872d2 --- /dev/null +++ b/changelogs/WinPythonslim-64bit-3.12.8.1_History.md @@ -0,0 +1,112 @@ +## History of changes for WinPython-64bit 3.12.8.1slim + +The following changes were made to WinPython-64bit distribution since version 3.12.8.0slim. + +
    +### Tools + +Removed packages: + + * [Pandoc](https://pandoc.org/) 3.1.9 (a universal document converter) + +### Python packages + +New packages: + + * [faker](https://pypi.org/project/faker) 33.3.1 (Faker is a Python package that generates fake data for you.) + * [prince](https://pypi.org/project/prince) 0.15.0 (Factor analysis in Python: PCA, CA, MCA, MFA, FAMD, GPA) + * [pyogrio](https://pypi.org/project/pyogrio) 0.10.0 (Vectorized spatial vector file format I/O using GDAL/OGR) + * [pyspnego](https://pypi.org/project/pyspnego) 0.11.2 (Windows Negotiate Authentication Client and Server) + * [pywavelets](https://pypi.org/project/pywavelets) 1.8.0 (PyWavelets, wavelet transform module) + * [sklearn_compat](https://pypi.org/project/sklearn_compat) 0.1.3 (Ease support for compatible scikit-learn estimators across versions) + * [squarify](https://pypi.org/project/squarify) 0.4.4 (Pure Python implementation of the squarify treemap layout algorithm) + * [sspilib](https://pypi.org/project/sspilib) 0.2.0 (SSPI API bindings for Python) + * [thefuzz](https://pypi.org/project/thefuzz) 0.22.1 (Fuzzy string matching in python) + +Upgraded packages: + + * [array_api_compat](https://pypi.org/project/array_api_compat) 1.8 → 1.10.0 (A wrapper around NumPy and other array libraries to make them compatible with the Array API standard) + * [bokeh](https://pypi.org/project/bokeh) 3.6.1 → 3.6.2 (Interactive plots and applications in the browser from Python) + * [cryptography](https://pypi.org/project/cryptography) 41.0.5 → 44.0.0 (cryptography is a package which provides cryptographic recipes and primitives to Python developers.) + * [cytoolz](https://pypi.org/project/cytoolz) 0.12.3 → 1.0.1 (Cython implementation of Toolz: High performance functional utilities) + * [deap](https://pypi.org/project/deap) 1.4.1 → 1.4.2 (Distributed Evolutionary Algorithms in Python) + * [geopandas](https://pypi.org/project/geopandas) 0.14.4 → 1.0.1 (Geographic pandas extensions) + * [hypothesis](https://pypi.org/project/hypothesis) 6.108.5 → 6.122.3 (A library for property-based testing) + * [imbalanced_learn](https://pypi.org/project/imbalanced_learn) 0.12.3 → 0.13.0 (Toolbox for imbalanced dataset in machine learning) + * [ipython](https://pypi.org/project/ipython) 8.26.0 → 8.31.0 (IPython: Productive Interactive Computing) + * [janus](https://pypi.org/project/janus) 1.0.0 → 2.0.0 (Mixed sync-async queue to interoperate between asyncio tasks and classic threads) + * [jaraco_context](https://pypi.org/project/jaraco_context) 5.3.0 → 6.0.1 (Useful decorators and context managers) + * [jaraco_functools](https://pypi.org/project/jaraco_functools) 4.0.1 → 4.1.0 (Functools like those found in stdlib) + * [jedi](https://pypi.org/project/jedi) 0.19.1 → 0.19.2 (An autocompletion tool for Python that can be used for text editors.) + * [keras](https://pypi.org/project/keras) 3.7.0 → 3.8.0 (Multi-backend Keras) + * [keyring](https://pypi.org/project/keyring) 25.2.1 → 25.6.0 (Store and access your passwords safely.) + * [llvmlite](https://pypi.org/project/llvmlite) 0.44.0rc2 → 0.44.0 (lightweight wrapper around basic LLVM functionality) + * [maturin](https://pypi.org/project/maturin) 1.7.0 → 1.8.1 (Build and publish crates with pyo3, cffi and uniffi bindings as well as rust binaries as python packages) + * [mlxtend](https://pypi.org/project/mlxtend) 0.22.0 → 0.23.3 (Machine Learning Library Extensions) + * [narwhals](https://pypi.org/project/narwhals) 1.15.2 → 1.21.1 (Extremely lightweight compatibility layer between dataframe libraries) + * [numba](https://pypi.org/project/numba) 0.61.0rc2 → 0.61.0 (compiling Python code using LLVM) + * [osqp](https://pypi.org/project/osqp) 0.6.7.post1 → 0.6.7.post3 (OSQP: The Operator Splitting QP Solver) + * [pillow](https://pypi.org/project/pillow) 11.0.0 → 11.1.0 (Python Imaging Library (Fork)) + * [polars](https://pypi.org/project/polars) 1.18.0 → 1.20.0 (Blazingly fast DataFrame library) + * [pyarrow](https://pypi.org/project/pyarrow) 18.1.0 → 19.0.0 (Python library for Apache Arrow) + * [pygments](https://pypi.org/project/pygments) 2.18.0 → 2.19.1 (Pygments is a syntax highlighting package written in Python.) + * [pyparsing](https://pypi.org/project/pyparsing) 3.1.2 → 3.2.1 (pyparsing module - Classes and methods to define and execute parsing grammars) + * [pyproj](https://pypi.org/project/pyproj) 3.6.1 → 3.7.0 (Python interface to PROJ (cartographic projections and coordinate transformations library)) + * [qdldl](https://pypi.org/project/qdldl) 0.1.7.post4 → 0.1.7.post5 (QDLDL, a free LDL factorization routine.) + * [qrcode](https://pypi.org/project/qrcode) 7.4.2 → 8.0 (QR Code image generator) + * [requests_ntlm](https://pypi.org/project/requests_ntlm) 1.1.0 → 1.3.0 (This package allows for HTTP NTLM authentication using the requests library.) + * [scikit_learn](https://pypi.org/project/scikit_learn) 1.6.0 → 1.6.1 (A set of python modules for machine learning and data mining) + * [scipy](https://pypi.org/project/scipy) 1.14.1 → 1.15.1 (Fundamental algorithms for scientific computing in Python) + * [shapely](https://pypi.org/project/shapely) 2.0.4 → 2.0.6 (Manipulation and analysis of geometric objects) + * [sqlite_utils](https://pypi.org/project/sqlite_utils) 3.37 → 3.38 (CLI tool and Python library for manipulating SQLite databases) + * [sqlparse](https://pypi.org/project/sqlparse) 0.4.3 → 0.5.3 (A non-validating SQL parser.) + * [tifffile](https://pypi.org/project/tifffile) 2024.7.2 → 2025.1.10 (Read and write TIFF files) + * [toolz](https://pypi.org/project/toolz) 0.12.0 → 1.0.0 (List processing tools and functional utilities) + * [tornado](https://pypi.org/project/tornado) 6.4.1 → 6.4.2 (Tornado is a Python web framework and asynchronous networking library, originally developed at FriendFeed.) + * [trio](https://pypi.org/project/trio) 0.27.0 → 0.28.0 (A friendly Python library for async concurrency and I/O) + * [twine](https://pypi.org/project/twine) 4.0.1 → 6.0.1 (Collection of utilities for publishing packages on PyPI) + * [watchdog](https://pypi.org/project/watchdog) 4.0.1 → 6.0.0 (Filesystem events monitoring) + * [webcolors](https://pypi.org/project/webcolors) 1.12 → 24.11.1 (A library for working with the color formats defined by HTML and CSS.) + * [websockets](https://pypi.org/project/websockets) 13.1 → 14.2 (An implementation of the WebSocket Protocol (RFC 6455 & 7692)) + * [werkzeug](https://pypi.org/project/werkzeug) 3.0.3 → 3.1.3 (The comprehensive WSGI web application library.) + * [whatthepatch](https://pypi.org/project/whatthepatch) 1.0.2 → 1.0.7 (A patch parsing and application library.) + * [wheel](https://pypi.org/project/wheel) 0.44.0 → 0.45.1 (A built-package format for Python) + * [winpython](https://pypi.org/project/winpython) 11.2.20241228 → 12.0.20250201 (WinPython distribution tools, including WPPM) + * [xarray](https://pypi.org/project/xarray) 2024.11.0 → 2025.1.1 (N-D labeled arrays and datasets in Python) + * [zipp](https://pypi.org/project/zipp) 3.17.0 → 3.21.0 (Backport of pathlib-compatible object wrapper for zip files) + +Removed packages: + + * [about_time](https://pypi.org/project/about_time) 4.2.1 (Easily measure timing and throughput of code blocks, with beautiful human friendly representations.) + * [affine](https://pypi.org/project/affine) 2.3.1 (Matrices describing affine transformation of the plane.) + * [alive_progress](https://pypi.org/project/alive_progress) 3.1.5 (A new kind of Progress Bar, with real-time throughput, ETA, and very cool animations!) + * [autograd](https://pypi.org/project/autograd) 1.6.2 (Efficiently computes derivatives of numpy code.) + * [cartopy](https://pypi.org/project/cartopy) 0.23.0 (A Python library for cartographic visualizations with Matplotlib) + * [cftime](https://pypi.org/project/cftime) 1.6.3 (Time-handling functionality from netcdf4-python) + * [click_plugins](https://pypi.org/project/click_plugins) 1.1.1 (An extension module for click to enable registering CLI commands via setuptools entry-points.) + * [cligj](https://pypi.org/project/cligj) 0.7.2 (Click params for commmand line interfaces to GeoJSON) + * [clr_loader](https://pypi.org/project/clr_loader) 0.2.6 (Generic pure Python loader for .NET runtimes) + * [clrmagic](https://pypi.org/project/clrmagic) 0.0.1a2 (IPython cell magic to use .NET languages) + * [cma](https://pypi.org/project/cma) 3.2.2 (CMA-ES, Covariance Matrix Adaptation Evolution Strategy for non-linear numerical optimization in Python) + * [deprecated](https://pypi.org/project/deprecated) 1.2.13 (Python @deprecated decorator to deprecate old python classes, functions or methods.) + * [ecos](https://pypi.org/project/ecos) 2.0.13 (This is the Python package for ECOS: Embedded Cone Solver. See Github page for more information.) + * [fiona](https://pypi.org/project/fiona) 1.10.1 (Fiona reads and writes spatial data files) + * [grapheme](https://pypi.org/project/grapheme) 0.6.0 (Unicode grapheme helpers) + * [netcdf4](https://pypi.org/project/netcdf4) 1.7.1.post2 (Provides an object-oriented python interface to the netCDF version 4 library) + * [ntlm_auth](https://pypi.org/project/ntlm_auth) 1.5.0 (Creates NTLM authentication structures) + * [numexpr](https://pypi.org/project/numexpr) 2.10.1 (Fast numerical expression evaluator for NumPy) + * [pulp](https://pypi.org/project/pulp) 2.6.0 (PuLP is an LP modeler written in python) + * [pyaudio](https://pypi.org/project/pyaudio) 0.2.14 (Cross-platform audio I/O with PortAudio) + * [pycosat](https://pypi.org/project/pycosat) 0.6.6 (bindings to picosat (a SAT solver)) + * [pymoo](https://pypi.org/project/pymoo) 0.6.1.3 (Multi-Objective Optimization in Python) + * [pypng](https://pypi.org/project/pypng) 0.20220715.0 (Pure Python library for saving and loading PNG images) + * [pyshp](https://pypi.org/project/pyshp) 2.3.1 (Pure Python read/write support for ESRI Shapefile format) + * [pythonnet](https://pypi.org/project/pythonnet) 3.0.3 (.NET and Mono integration for Python) + * [rasterio](https://pypi.org/project/rasterio) 1.3.10 (Fast and direct raster I/O for use with Numpy and SciPy) + * [snuggs](https://pypi.org/project/snuggs) 1.4.7 (Snuggs are s-expressions for Numpy) + * [wrapt](https://pypi.org/project/wrapt) 1.16.0 (Module for decorators, wrappers and monkey patching.) + * [xlwings](https://pypi.org/project/xlwings) 0.24.7 (Make Excel fly: Interact with Excel from Python and vice versa.) + + +
    +* * * diff --git a/changelogs/WinPythonslim-64bit-3.12.9.0.md b/changelogs/WinPythonslim-64bit-3.12.9.0.md new file mode 100644 index 00000000..9f11f9cb --- /dev/null +++ b/changelogs/WinPythonslim-64bit-3.12.9.0.md @@ -0,0 +1,511 @@ +## WinPython 3.12.9.0slim + +The following packages are included in WinPython-64bit v3.12.9.0slim . + +
    + +### Tools + +Name | Version | Description +-----|---------|------------ + + +### Python packages + +Name | Version | Description +-----|---------|------------ +[Python](http://www.python.org/) | 3.12.9 | Python programming language with standard library +[absl_py](https://pypi.org/project/absl_py) | 2.0.0 | Abseil Python Common Libraries, see https://github.com/abseil/abseil-py. +[adbc_driver_manager](https://pypi.org/project/adbc_driver_manager) | 1.3.0 | A generic entrypoint for ADBC drivers. +[aiofiles](https://pypi.org/project/aiofiles) | 23.2.1 | File support for asyncio. +[aiohappyeyeballs](https://pypi.org/project/aiohappyeyeballs) | 2.4.4 | Happy Eyeballs for asyncio +[aiohttp](https://pypi.org/project/aiohttp) | 3.11.11 | Async http client/server framework (asyncio) +[aiosignal](https://pypi.org/project/aiosignal) | 1.3.1 | aiosignal: a list of registered asynchronous callbacks +[aiosqlite](https://pypi.org/project/aiosqlite) | 0.20.0 | asyncio bridge to the standard sqlite3 module +[alabaster](https://pypi.org/project/alabaster) | 0.7.16 | A light, configurable Sphinx theme +[alembic](https://pypi.org/project/alembic) | 1.13.1 | A database migration tool for SQLAlchemy. +[altair](https://pypi.org/project/altair) | 5.5.0 | Vega-Altair: A declarative statistical visualization library for Python. +[aniso8601](https://pypi.org/project/aniso8601) | 9.0.1 | A library for parsing ISO 8601 strings. +[annotated_types](https://pypi.org/project/annotated_types) | 0.6.0 | Reusable constraint types to use with typing.Annotated +[ansicolors](https://pypi.org/project/ansicolors) | 1.1.8 | ANSI colors for Python +[anthropic](https://pypi.org/project/anthropic) | 0.42.0 | The official Python library for the anthropic API +[anyio](https://pypi.org/project/anyio) | 4.7.0 | High level compatibility layer for multiple asynchronous event loop implementations +[anywidget](https://pypi.org/project/anywidget) | 0.9.12 | custom jupyter widgets made easy +[appdirs](https://pypi.org/project/appdirs) | 1.4.4 | A small Python module for determining appropriate platform-specific dirs, e.g. a "user data dir". +[argon2_cffi](https://pypi.org/project/argon2_cffi) | 23.1.0 | Argon2 for Python +[argon2_cffi_bindings](https://pypi.org/project/argon2_cffi_bindings) | 21.2.0 | Low-level CFFI bindings for Argon2 +[array_api_compat](https://pypi.org/project/array_api_compat) | 1.10.0 | A wrapper around NumPy and other array libraries to make them compatible with the Array API standard +[arrow](https://pypi.org/project/arrow) | 1.3.0 | Better dates & times for Python +[asgi_csrf](https://pypi.org/project/asgi_csrf) | 0.9 | ASGI middleware for protecting against CSRF attacks +[asgiref](https://pypi.org/project/asgiref) | 3.8.1 | ASGI specs, helper code, and adapters +[asn1crypto](https://pypi.org/project/asn1crypto) | 1.5.1 | Fast ASN.1 parser and serializer with definitions for private keys, public keys, certificates, CRL, OCSP, CMS, PKCS#3, PKCS#7, PKCS#8, PKCS#12, +[asteval](https://pypi.org/project/asteval) | 0.9.31 | Safe, minimalistic evaluator of python expression using ast module +[astroid](https://pypi.org/project/astroid) | 3.1.0 | An abstract syntax tree for Python with inference support. +[astropy](https://pypi.org/project/astropy) | 6.1.6 | Astronomy and astrophysics core library +[astropy_iers_data](https://pypi.org/project/astropy_iers_data) | 0.2024.12.23.0.33.24 | IERS Earth Rotation and Leap Second tables for the astropy core package +[asttokens](https://pypi.org/project/asttokens) | 2.4.1 | Annotate AST trees with source code positions +[async_lru](https://pypi.org/project/async_lru) | 2.0.4 | Simple LRU cache for asyncio +[atomicwrites](https://pypi.org/project/atomicwrites) | 1.4.0 | Atomic file writes. +[attrs](https://pypi.org/project/attrs) | 23.2.0 | Classes Without Boilerplate +[autopep8](https://pypi.org/project/autopep8) | 2.0.4 | A tool that automatically formats Python code to conform to the PEP 8 style guide +[azure_core](https://pypi.org/project/azure_core) | 1.30.2 | Microsoft Azure Core Library for Python +[azure_cosmos](https://pypi.org/project/azure_cosmos) | 4.7.0 | Microsoft Azure Cosmos Client Library for Python +[azure_identity](https://pypi.org/project/azure_identity) | 1.16.1 | Microsoft Azure Identity Library for Python +[babel](https://pypi.org/project/babel) | 2.16.0 | Internationalization utilities +[baresql](https://pypi.org/project/baresql) | 1.0.0 | playing SQL directly on Python datas +[bcrypt](https://pypi.org/project/bcrypt) | 4.0.1 | Modern password hashing for your software and your servers +[beautifulsoup4](https://pypi.org/project/beautifulsoup4) | 4.12.2 | Screen-scraping library +[binaryornot](https://pypi.org/project/binaryornot) | 0.4.4 | Ultra-lightweight pure Python package to check if a file is binary or text. +[black](https://pypi.org/project/black) | 24.10.0 | The uncompromising code formatter. +[bleach](https://pypi.org/project/bleach) | 6.1.0 | An easy safelist-based HTML-sanitizing tool. +[blinker](https://pypi.org/project/blinker) | 1.9.0 | Fast, simple object-to-object and broadcast signaling +[bokeh](https://pypi.org/project/bokeh) | 3.6.3 | Interactive plots and applications in the browser from Python +[branca](https://pypi.org/project/branca) | 0.8.0 | Generate complex HTML+JS pages with Python +[brotli](https://pypi.org/project/brotli) | 1.1.0 | Python bindings for the Brotli compression library +[build](https://pypi.org/project/build) | 1.2.2.post1 | A simple, correct Python build frontend +[cachetools](https://pypi.org/project/cachetools) | 5.4.0 | Extensible memoizing collections and decorators +[certifi](https://pypi.org/project/certifi) | 2024.6.2 | Python package for providing Mozilla's CA Bundle. +[cffi](https://pypi.org/project/cffi) | 1.17.1 | Foreign Function Interface for Python calling C code. +[chardet](https://pypi.org/project/chardet) | 5.2.0 | Universal encoding detector for Python 3 +[charset_normalizer](https://pypi.org/project/charset_normalizer) | 3.4.0 | The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet. +[clarabel](https://pypi.org/project/clarabel) | 0.10.0 | Clarabel Conic Interior Point Solver for Rust / Python +[click](https://pypi.org/project/click) | 8.1.7 | Composable command line interface toolkit +[click_default_group](https://pypi.org/project/click_default_group) | 1.2.4 | click_default_group +[cloudpickle](https://pypi.org/project/cloudpickle) | 3.0.0 | Pickler class to extend the standard pickle.Pickler functionality +[cohere](https://pypi.org/project/cohere) | 5.13.12 | +[colorama](https://pypi.org/project/colorama) | 0.4.6 | Cross-platform colored terminal text. +[colorcet](https://pypi.org/project/colorcet) | 3.1.0 | Collection of perceptually uniform colormaps +[colorlog](https://pypi.org/project/colorlog) | 6.8.2 | Add colours to the output of Python's logging module. +[comm](https://pypi.org/project/comm) | 0.2.2 | Jupyter Python Comm implementation, for usage in ipykernel, xeus-python etc. +[contourpy](https://pypi.org/project/contourpy) | 1.3.1 | Python library for calculating contours of 2D quadrilateral grids +[cookiecutter](https://pypi.org/project/cookiecutter) | 2.6.0 | A command-line utility that creates projects from project templates, e.g +[cryptography](https://pypi.org/project/cryptography) | 44.0.0 | cryptography is a package which provides cryptographic recipes and primitives to Python developers. +[cvxopt](https://pypi.org/project/cvxopt) | 1.3.2 | Convex optimization package +[cvxpy](https://pypi.org/project/cvxpy) | 1.6.0 | A domain-specific language for modeling convex optimization problems in Python. +[cycler](https://pypi.org/project/cycler) | 0.12.1 | Composable style cycles +[cython](https://pypi.org/project/cython) | 3.0.11 | The Cython compiler for writing C extensions in the Python language. +[cytoolz](https://pypi.org/project/cytoolz) | 1.0.1 | Cython implementation of Toolz: High performance functional utilities +[dask](https://pypi.org/project/dask) | 2024.12.1 | Parallel PyData with Task Scheduling +[dask_expr](https://pypi.org/project/dask_expr) | 1.1.21 | High Level Expressions for Dask +[datasette](https://pypi.org/project/datasette) | 0.64.8 | An open source multi-tool for exploring and publishing data +[datasette_graphql](https://pypi.org/project/datasette_graphql) | 2.2 | Datasette plugin providing an automatic GraphQL API for your SQLite databases +[datashader](https://pypi.org/project/datashader) | 0.16.3 | Data visualization toolchain based on aggregating into a grid +[deap](https://pypi.org/project/deap) | 1.4.2 | Distributed Evolutionary Algorithms in Python +[debugpy](https://pypi.org/project/debugpy) | 1.8.0 | An implementation of the Debug Adapter Protocol for Python +[decorator](https://pypi.org/project/decorator) | 5.1.1 | Decorators for Humans +[defusedxml](https://pypi.org/project/defusedxml) | 0.7.1 | XML bomb protection for Python stdlib modules +[diff_match_patch](https://pypi.org/project/diff_match_patch) | 20230430 | Diff Match and Patch +[dill](https://pypi.org/project/dill) | 0.3.9 | serialize all of Python +[distributed](https://pypi.org/project/distributed) | 2024.12.1 | Distributed scheduler for Dask +[distro](https://pypi.org/project/distro) | 1.8.0 | Distro - an OS platform information API +[django](https://pypi.org/project/django) | 5.0.7 | A high-level Python web framework that encourages rapid development and clean, pragmatic design. +[dnspython](https://pypi.org/project/dnspython) | 2.6.1 | DNS toolkit +[docstring_to_markdown](https://pypi.org/project/docstring_to_markdown) | 0.13 | On the fly conversion of Python docstrings to markdown +[docutils](https://pypi.org/project/docutils) | 0.21.2 | Docutils -- Python Documentation Utilities +[duckdb](https://pypi.org/project/duckdb) | 1.2.0 | DuckDB in-process database +[entrypoints](https://pypi.org/project/entrypoints) | 0.4 | Discover and load entry points from installed packages. +[et_xmlfile](https://pypi.org/project/et_xmlfile) | 1.1.0 | An implementation of lxml.xmlfile for the standard library +[eval_type_backport](https://pypi.org/project/eval_type_backport) | 0.2.2 | Like `typing._eval_type`, but lets older Python versions use newer typing features. +[executing](https://pypi.org/project/executing) | 2.0.1 | Get the currently executing AST node of a frame, and other information +[faker](https://pypi.org/project/faker) | 33.3.1 | Faker is a Python package that generates fake data for you. +[fast_histogram](https://pypi.org/project/fast_histogram) | 0.14 | Fast simple 1D and 2D histograms +[fastapi](https://pypi.org/project/fastapi) | 0.115.6 | FastAPI framework, high performance, easy to learn, fast to code, ready for production +[fastavro](https://pypi.org/project/fastavro) | 1.10.0 | Fast read/write of AVRO files +[fastjsonschema](https://pypi.org/project/fastjsonschema) | 2.18.0 | Fastest Python implementation of JSON schema +[filelock](https://pypi.org/project/filelock) | 3.14.0 | A platform independent file lock. +[flake8](https://pypi.org/project/flake8) | 7.1.1 | the modular source code checker: pep8 pyflakes and co +[flask](https://pypi.org/project/flask) | 3.1.0 | A simple framework for building complex web applications. +[flit](https://pypi.org/project/flit) | 3.10.1 | A simple packaging tool for simple packages. +[flit_core](https://pypi.org/project/flit_core) | 3.10.1 | Distribution-building parts of Flit. See flit package for more information +[folium](https://pypi.org/project/folium) | 0.18.0 | Make beautiful maps with Leaflet.js & Python +[fonttools](https://pypi.org/project/fonttools) | 4.55.3 | Tools to manipulate font files +[fqdn](https://pypi.org/project/fqdn) | 1.5.1 | Validates fully-qualified domain names against RFC 1123, so that they are acceptable to modern bowsers +[frozenlist](https://pypi.org/project/frozenlist) | 1.5.0 | A list-like structure which implements collections.abc.MutableSequence +[fsspec](https://pypi.org/project/fsspec) | 2024.6.1 | File-system specification +[fuzzywuzzy](https://pypi.org/project/fuzzywuzzy) | 0.18.0 | Fuzzy string matching in python +[geographiclib](https://pypi.org/project/geographiclib) | 2.0 | The geodesic routines from GeographicLib +[geopandas](https://pypi.org/project/geopandas) | 1.0.1 | Geographic pandas extensions +[geopy](https://pypi.org/project/geopy) | 2.4.1 | Python Geocoding Toolbox +[gitdb](https://pypi.org/project/gitdb) | 4.0.10 | Git Object Database +[gitpython](https://pypi.org/project/gitpython) | 3.1.32 | GitPython is a Python library used to interact with Git repositories +[google_auth](https://pypi.org/project/google_auth) | 2.37.0 | Google Authentication Library +[graphene](https://pypi.org/project/graphene) | 3.3 | GraphQL Framework for Python +[graphql_core](https://pypi.org/project/graphql_core) | 3.2.3 | GraphQL implementation for Python, a port of GraphQL.js, the JavaScript reference implementation for GraphQL. +[graphql_relay](https://pypi.org/project/graphql_relay) | 3.2.0 | Relay library for graphql-core +[greenlet](https://pypi.org/project/greenlet) | 3.1.1 | Lightweight in-process concurrent programming +[griffe](https://pypi.org/project/griffe) | 1.5.5 | Signatures for entire Python programs +[groq](https://pypi.org/project/groq) | 0.13.1 | The official Python library for the groq API +[guidata](https://pypi.org/project/guidata) | 3.7.1 | Automatic GUI generation for easy dataset editing and display +[h11](https://pypi.org/project/h11) | 0.14.0 | A pure-Python, bring-your-own-I/O implementation of HTTP/1.1 +[h2](https://pypi.org/project/h2) | 4.1.0 | HTTP/2 State-Machine based protocol implementation +[h5py](https://pypi.org/project/h5py) | 3.12.1 | Read and write HDF5 files from Python +[hatchling](https://pypi.org/project/hatchling) | 1.27.0 | Modern, extensible Python build backend +[holoviews](https://pypi.org/project/holoviews) | 1.20.0 | A high-level plotting API for the PyData ecosystem built on HoloViews. +[hpack](https://pypi.org/project/hpack) | 4.0.0 | Pure-Python HPACK header compression +[html5lib](https://pypi.org/project/html5lib) | 1.1 | HTML parser based on the WHATWG HTML specification +[httpcore](https://pypi.org/project/httpcore) | 1.0.5 | A minimal low-level HTTP client. +[httpie](https://pypi.org/project/httpie) | 3.2.4 | HTTPie: modern, user-friendly command-line HTTP client for the API era. +[httpx](https://pypi.org/project/httpx) | 0.27.2 | The next generation HTTP client. +[httpx_sse](https://pypi.org/project/httpx_sse) | 0.4.0 | Consume Server-Sent Event (SSE) messages with HTTPX. +[huggingface_hub](https://pypi.org/project/huggingface_hub) | 0.28.1 | Client library to download and publish models, datasets and other repos on the huggingface.co hub +[hupper](https://pypi.org/project/hupper) | 1.12 | Integrated process monitor for developing and reloading daemons. +[hvplot](https://pypi.org/project/hvplot) | 0.11.2 | A high-level plotting API for the PyData ecosystem built on HoloViews. +[hypercorn](https://pypi.org/project/hypercorn) | 0.16.0 | A ASGI Server based on Hyper libraries and inspired by Gunicorn +[hyperframe](https://pypi.org/project/hyperframe) | 6.0.1 | HTTP/2 framing layer for Python +[hypothesis](https://pypi.org/project/hypothesis) | 6.122.3 | A library for property-based testing +[idna](https://pypi.org/project/idna) | 3.7 | Internationalized Domain Names in Applications (IDNA) +[imageio](https://pypi.org/project/imageio) | 2.33.1 | Library for reading and writing a wide range of image, video, scientific, and volumetric data formats. +[imagesize](https://pypi.org/project/imagesize) | 1.4.1 | Getting image size from png/jpeg/jpeg2000/gif file +[imbalanced_learn](https://pypi.org/project/imbalanced_learn) | 0.13.0 | Toolbox for imbalanced dataset in machine learning +[importlib_metadata](https://pypi.org/project/importlib_metadata) | 7.1.0 | Read metadata from Python packages +[inflection](https://pypi.org/project/inflection) | 0.5.1 | A port of Ruby on Rails inflector to Python +[iniconfig](https://pypi.org/project/iniconfig) | 2.0.0 | brain-dead simple config-ini parsing +[intervaltree](https://pypi.org/project/intervaltree) | 3.0.2 | Editable interval tree data structure for Python 2 and 3 +[ipycanvas](https://pypi.org/project/ipycanvas) | 0.13.3 | Interactive widgets library exposing the browser's Canvas API +[ipykernel](https://pypi.org/project/ipykernel) | 6.29.5 | IPython Kernel for Jupyter +[ipyleaflet](https://pypi.org/project/ipyleaflet) | 0.19.2 | A Jupyter widget for dynamic Leaflet maps +[ipympl](https://pypi.org/project/ipympl) | 0.9.6 | Matplotlib Jupyter Extension +[ipython](https://pypi.org/project/ipython) | 8.32.0 | IPython: Productive Interactive Computing +[ipython_genutils](https://pypi.org/project/ipython_genutils) | 0.2.0 | Vestigial utilities from IPython +[ipython_sql](https://pypi.org/project/ipython_sql) | 0.5.0 | RDBMS access via IPython +[ipywidgets](https://pypi.org/project/ipywidgets) | 8.1.5 | Jupyter interactive widgets +[isoduration](https://pypi.org/project/isoduration) | 20.11.0 | Operations with ISO 8601 durations +[isort](https://pypi.org/project/isort) | 5.13.2 | A Python utility / library to sort Python imports. +[itsdangerous](https://pypi.org/project/itsdangerous) | 2.2.0 | Safely pass data to untrusted environments and back. +[janus](https://pypi.org/project/janus) | 2.0.0 | Mixed sync-async queue to interoperate between asyncio tasks and classic threads +[jaraco_classes](https://pypi.org/project/jaraco_classes) | 3.4.0 | Utility functions for Python class constructs +[jaraco_context](https://pypi.org/project/jaraco_context) | 6.0.1 | Useful decorators and context managers +[jaraco_functools](https://pypi.org/project/jaraco_functools) | 4.1.0 | Functools like those found in stdlib +[jedi](https://pypi.org/project/jedi) | 0.19.2 | An autocompletion tool for Python that can be used for text editors. +[jellyfish](https://pypi.org/project/jellyfish) | 1.1.3 | Approximate and phonetic matching of strings. +[jinja2](https://pypi.org/project/jinja2) | 3.1.2 | A very fast and expressive template engine. +[jiter](https://pypi.org/project/jiter) | 0.8.2 | Fast iterable JSON parser. +[joblib](https://pypi.org/project/joblib) | 1.4.2 | Lightweight pipelining with Python functions +[json5](https://pypi.org/project/json5) | 0.9.14 | A Python implementation of the JSON5 data format. +[jsonpatch](https://pypi.org/project/jsonpatch) | 1.33 | Apply JSON-Patches (RFC 6902) +[jsonpath_python](https://pypi.org/project/jsonpath_python) | 1.0.6 | A more powerful JSONPath implementation in modern python +[jsonpointer](https://pypi.org/project/jsonpointer) | 2.4 | Identify specific nodes in a JSON document (RFC 6901) +[jsonschema](https://pypi.org/project/jsonschema) | 4.19.2 | An implementation of JSON Schema validation for Python +[jsonschema_specifications](https://pypi.org/project/jsonschema_specifications) | 2023.12.1 | The JSON Schema meta-schemas and vocabularies, exposed as a Registry +[julia](https://pypi.org/project/julia) | 0.6.2 | Julia/Python bridge with IPython support. +[jupyter](https://pypi.org/project/jupyter) | 1.1.1 | Jupyter metapackage. Install all the Jupyter components in one go. +[jupyter_bokeh](https://pypi.org/project/jupyter_bokeh) | 4.0.5 | A Jupyter extension for rendering Bokeh content. +[jupyter_client](https://pypi.org/project/jupyter_client) | 8.6.2 | Jupyter protocol implementation and client libraries +[jupyter_console](https://pypi.org/project/jupyter_console) | 6.6.3 | Jupyter terminal console +[jupyter_core](https://pypi.org/project/jupyter_core) | 5.7.2 | Jupyter core package. A base package on which Jupyter projects rely. +[jupyter_events](https://pypi.org/project/jupyter_events) | 0.10.0 | Jupyter Event System library +[jupyter_leaflet](https://pypi.org/project/jupyter_leaflet) | 0.19.2 | ipyleaflet extensions for JupyterLab and Jupyter Notebook +[jupyter_lsp](https://pypi.org/project/jupyter_lsp) | 2.2.5 | Multi-Language Server WebSocket proxy for Jupyter Notebook/Lab server +[jupyter_server](https://pypi.org/project/jupyter_server) | 2.14.2 | The backend—i.e. core services, APIs, and REST endpoints—to Jupyter web applications. +[jupyter_server_terminals](https://pypi.org/project/jupyter_server_terminals) | 0.5.3 | A Jupyter Server Extension Providing Terminals. +[jupyterlab](https://pypi.org/project/jupyterlab) | 4.3.5 | JupyterLab computational environment +[jupyterlab_pygments](https://pypi.org/project/jupyterlab_pygments) | 0.3.0 | Pygments theme using JupyterLab CSS variables +[jupyterlab_server](https://pypi.org/project/jupyterlab_server) | 2.27.3 | A set of server components for JupyterLab and JupyterLab like applications. +[jupyterlab_widgets](https://pypi.org/project/jupyterlab_widgets) | 3.0.13 | Jupyter interactive widgets for JupyterLab +[keras](https://pypi.org/project/keras) | 3.8.0 | Multi-backend Keras +[keyring](https://pypi.org/project/keyring) | 25.6.0 | Store and access your passwords safely. +[kiwisolver](https://pypi.org/project/kiwisolver) | 1.4.8 | A fast implementation of the Cassowary constraint solver +[langchain](https://pypi.org/project/langchain) | 0.3.18 | Building applications with LLMs through composability +[langchain_core](https://pypi.org/project/langchain_core) | 0.3.34 | Building applications with LLMs through composability +[langchain_text_splitters](https://pypi.org/project/langchain_text_splitters) | 0.3.6 | LangChain text splitting utilities +[langsmith](https://pypi.org/project/langsmith) | 0.2.11 | Client library to connect to the LangSmith LLM Tracing and Evaluation Platform. +[lazy_loader](https://pypi.org/project/lazy_loader) | 0.4 | Makes it easy to load subpackages and functions on demand. +[linkify_it_py](https://pypi.org/project/linkify_it_py) | 2.0.2 | Links recognition library with FULL unicode support. +[llvmlite](https://pypi.org/project/llvmlite) | 0.44.0 | lightweight wrapper around basic LLVM functionality +[lmfit](https://pypi.org/project/lmfit) | 1.3.1 | Least-Squares Minimization with Bounds and Constraints +[locket](https://pypi.org/project/locket) | 1.0.0 | File-based locks for Python on Linux and Windows +[logfire_api](https://pypi.org/project/logfire_api) | 3.5.3 | Shim for the Logfire SDK which does nothing unless Logfire is installed +[lxml](https://pypi.org/project/lxml) | 5.3.0 | Powerful and Pythonic XML processing library combining libxml2/libxslt with the ElementTree API. +[mako](https://pypi.org/project/mako) | 1.3.5 | A super-fast templating language that borrows the best ideas from the existing templating languages. +[markdown](https://pypi.org/project/markdown) | 3.5.1 | Python implementation of John Gruber's Markdown. +[markdown_it_py](https://pypi.org/project/markdown_it_py) | 2.2.0 | Python port of markdown-it. Markdown parsing, done right! +[markupsafe](https://pypi.org/project/markupsafe) | 3.0.2 | Safely add untrusted strings to HTML/XML markup. +[matplotlib](https://pypi.org/project/matplotlib) | 3.10.0 | Python plotting package +[matplotlib_inline](https://pypi.org/project/matplotlib_inline) | 0.1.7 | Inline Matplotlib backend for Jupyter +[maturin](https://pypi.org/project/maturin) | 1.8.1 | Build and publish crates with pyo3, cffi and uniffi bindings as well as rust binaries as python packages +[mccabe](https://pypi.org/project/mccabe) | 0.7.0 | McCabe checker, plugin for flake8 +[mdit_py_plugins](https://pypi.org/project/mdit_py_plugins) | 0.3.5 | Collection of plugins for markdown-it-py +[mdurl](https://pypi.org/project/mdurl) | 0.1.2 | Markdown URL utilities +[mercantile](https://pypi.org/project/mercantile) | 1.2.1 | Web mercator XYZ tile utilities +[mergedeep](https://pypi.org/project/mergedeep) | 1.3.4 | A deep merge function for 🐍. +[missingno](https://pypi.org/project/missingno) | 0.5.1 | Missing data visualization module for Python. +[mistralai](https://pypi.org/project/mistralai) | 1.2.5 | Python Client SDK for the Mistral AI API. +[mistune](https://pypi.org/project/mistune) | 2.0.5 | A sane Markdown parser with useful plugins and renderers +[mizani](https://pypi.org/project/mizani) | 0.11.4 | Scales for Python +[ml_dtypes](https://pypi.org/project/ml_dtypes) | 0.5.0 | +[mlxtend](https://pypi.org/project/mlxtend) | 0.23.3 | Machine Learning Library Extensions +[more_itertools](https://pypi.org/project/more_itertools) | 10.2.0 | More routines for operating on iterables, beyond itertools +[mpl_scatter_density](https://pypi.org/project/mpl_scatter_density) | 0.7 | Matplotlib helpers to make density scatter plots +[mpld3](https://pypi.org/project/mpld3) | 0.5.8 | D3 Viewer for Matplotlib +[mpmath](https://pypi.org/project/mpmath) | 1.3.0 | Python library for arbitrary-precision floating-point arithmetic +[msal](https://pypi.org/project/msal) | 1.30.0 | The Microsoft Authentication Library (MSAL) for Python library enables your app to access the Microsoft Cloud by supporting authentication of us +[msal_extensions](https://pypi.org/project/msal_extensions) | 1.2.0 | Microsoft Authentication Library extensions (MSAL EX) provides a persistence API that can save your data on disk, encrypted on Windows, macOS an +[msgpack](https://pypi.org/project/msgpack) | 1.1.0 | MessagePack serializer +[multidict](https://pypi.org/project/multidict) | 6.1.0 | multidict implementation +[multipledispatch](https://pypi.org/project/multipledispatch) | 1.0.0 | Multiple dispatch +[mutagen](https://pypi.org/project/mutagen) | 1.47.0 | read and write audio tags for many formats +[mypy](https://pypi.org/project/mypy) | 1.14.0 | Optional static typing for Python +[mypy_extensions](https://pypi.org/project/mypy_extensions) | 1.0.0 | Type system extensions for programs checked with the mypy type checker. +[mysql_connector_python](https://pypi.org/project/mysql_connector_python) | 8.0.21 | MySQL driver written in Python +[namex](https://pypi.org/project/namex) | 0.0.8 | A simple utility to separate the implementation of your Python package and its public API surface. +[narwhals](https://pypi.org/project/narwhals) | 1.21.1 | Extremely lightweight compatibility layer between dataframe libraries +[nbclient](https://pypi.org/project/nbclient) | 0.10.0 | A client library for executing notebooks. Formerly nbconvert's ExecutePreprocessor. +[nbconvert](https://pypi.org/project/nbconvert) | 7.16.1 | Converting Jupyter Notebooks (.ipynb files) to other formats +[nbformat](https://pypi.org/project/nbformat) | 5.10.4 | The Jupyter Notebook format +[nest_asyncio](https://pypi.org/project/nest_asyncio) | 1.6.0 | Patch asyncio to allow nested event loops +[networkx](https://pypi.org/project/networkx) | 3.4.2 | Python package for creating and manipulating graphs and networks +[nh3](https://pypi.org/project/nh3) | 0.2.18 | Python bindings to the ammonia HTML sanitization library. +[nltk](https://pypi.org/project/nltk) | 3.9.1 | Natural Language Toolkit +[notebook](https://pypi.org/project/notebook) | 7.3.1 | Jupyter Notebook - A web-based notebook environment for interactive computing +[notebook_shim](https://pypi.org/project/notebook_shim) | 0.2.4 | A shim layer for notebook traits and config +[numba](https://pypi.org/project/numba) | 0.61.0 | compiling Python code using LLVM +[numpy](https://pypi.org/project/numpy) | 2.1.3 | Fundamental package for array computing in Python +[numpydoc](https://pypi.org/project/numpydoc) | 1.6.0 | Sphinx extension to support docstrings in Numpy format +[openai](https://pypi.org/project/openai) | 1.61.1 | The official Python library for the openai API +[opencv_python](https://pypi.org/project/opencv_python) | 4.10.0.84 | Wrapper package for OpenCV python bindings. +[openpyxl](https://pypi.org/project/openpyxl) | 3.1.2 | A Python library to read/write Excel 2010 xlsx/xlsm files +[optree](https://pypi.org/project/optree) | 0.13.1 | Optimized PyTree Utilities. +[optuna](https://pypi.org/project/optuna) | 3.6.1 | A hyperparameter optimization framework +[orjson](https://pypi.org/project/orjson) | 3.10.12 | Fast, correct Python JSON library supporting dataclasses, datetimes, and numpy +[osqp](https://pypi.org/project/osqp) | 0.6.7.post3 | OSQP: The Operator Splitting QP Solver +[outcome](https://pypi.org/project/outcome) | 1.3.0.post0 | Capture the outcome of Python function calls. +[overrides](https://pypi.org/project/overrides) | 7.7.0 | A decorator to automatically detect mismatch when overriding a method. +[packaging](https://pypi.org/project/packaging) | 24.2 | Core utilities for Python packages +[pandas](https://pypi.org/project/pandas) | 2.2.3 | Powerful data structures for data analysis, time series, and statistics +[pandocfilters](https://pypi.org/project/pandocfilters) | 1.5.0 | Utilities for writing pandoc filters in python +[panel](https://pypi.org/project/panel) | 1.6.0 | The powerful data exploration & web app framework for Python. +[papermill](https://pypi.org/project/papermill) | 2.6.0 | Parameterize and run Jupyter and nteract Notebooks +[param](https://pypi.org/project/param) | 2.1.1 | Make your Python code clearer and more reliable by declaring Parameters. +[paramiko](https://pypi.org/project/paramiko) | 2.8.0 | SSH2 protocol library +[parso](https://pypi.org/project/parso) | 0.8.4 | A Python Parser +[partd](https://pypi.org/project/partd) | 1.4.0 | Appendable key-value storage +[pathspec](https://pypi.org/project/pathspec) | 0.11.0 | Utility library for gitignore style pattern matching of file paths. +[patsy](https://pypi.org/project/patsy) | 0.5.6 | A Python package for describing statistical models and for building design matrices. +[pep8](https://pypi.org/project/pep8) | 1.7.1 | Python style guide checker +[pexpect](https://pypi.org/project/pexpect) | 4.8.0 | Pexpect allows easy control of interactive console applications. +[pg8000](https://pypi.org/project/pg8000) | 1.23.0 | PostgreSQL interface library +[pickleshare](https://pypi.org/project/pickleshare) | 0.7.5 | Tiny 'shelve'-like database with concurrency support +[pillow](https://pypi.org/project/pillow) | 11.1.0 | Python Imaging Library (Fork) +[pint](https://pypi.org/project/pint) | 0.23 | Physical quantities module +[pip](https://pypi.org/project/pip) | 24.3.1 | The PyPA recommended tool for installing Python packages. +[pkginfo](https://pypi.org/project/pkginfo) | 1.11.2 | Query metadata from sdists / bdists / installed packages. +[platformdirs](https://pypi.org/project/platformdirs) | 4.2.2 | A small Python package for determining appropriate platform-specific dirs, e.g. a `user data dir`. +[plotly](https://pypi.org/project/plotly) | 5.24.1 | An open-source, interactive data visualization library for Python +[plotnine](https://pypi.org/project/plotnine) | 0.13.6 | A Grammar of Graphics for Python +[plotpy](https://pypi.org/project/plotpy) | 2.7.2 | Curve and image plotting tools for Python/Qt applications +[pluggy](https://pypi.org/project/pluggy) | 1.5.0 | plugin and hook calling mechanisms for python +[ply](https://pypi.org/project/ply) | 3.11 | Python Lex & Yacc +[polars](https://pypi.org/project/polars) | 1.22.0 | Blazingly fast DataFrame library +[portalocker](https://pypi.org/project/portalocker) | 2.7.0 | Wraps the portalocker recipe for easy usage +[prettytable](https://pypi.org/project/prettytable) | 3.3.0 | A simple Python library for easily displaying tabular data in a visually appealing ASCII table format +[prince](https://pypi.org/project/prince) | 0.15.0 | Factor analysis in Python: PCA, CA, MCA, MFA, FAMD, GPA +[priority](https://pypi.org/project/priority) | 2.0.0 | A pure-Python implementation of the HTTP/2 priority tree +[prometheus_client](https://pypi.org/project/prometheus_client) | 0.18.0 | Python client for the Prometheus monitoring system. +[prompt_toolkit](https://pypi.org/project/prompt_toolkit) | 3.0.48 | Library for building powerful interactive command lines in Python +[propcache](https://pypi.org/project/propcache) | 0.2.1 | Accelerated property cache +[protobuf](https://pypi.org/project/protobuf) | 5.27.3 | +[psutil](https://pypi.org/project/psutil) | 5.9.8 | Cross-platform lib for process and system monitoring in Python. +[psygnal](https://pypi.org/project/psygnal) | 0.11.1 | Fast python callback/event system modeled after Qt Signals +[ptpython](https://pypi.org/project/ptpython) | 3.0.29 | Python REPL build on top of prompt_toolkit +[ptyprocess](https://pypi.org/project/ptyprocess) | 0.7.0 | Run a subprocess in a pseudo terminal +[pure_eval](https://pypi.org/project/pure_eval) | 0.2.2 | Safely evaluate AST nodes without side effects +[pyarrow](https://pypi.org/project/pyarrow) | 19.0.0 | Python library for Apache Arrow +[pyasn1](https://pypi.org/project/pyasn1) | 0.4.8 | ASN.1 types and codecs +[pyasn1_modules](https://pypi.org/project/pyasn1_modules) | 0.2.8 | A collection of ASN.1-based protocols modules. +[pybind11](https://pypi.org/project/pybind11) | 2.13.6 | Seamless operability between C++11 and Python +[pycodestyle](https://pypi.org/project/pycodestyle) | 2.12.0 | Python style guide checker +[pycparser](https://pypi.org/project/pycparser) | 2.22 | C parser in Python +[pycryptodomex](https://pypi.org/project/pycryptodomex) | 3.20.0 | Cryptographic library for Python +[pyct](https://pypi.org/project/pyct) | 0.5.0 | Python package common tasks for users (e.g. copy examples, fetch data, ...) +[pydantic](https://pypi.org/project/pydantic) | 2.10.6 | Data validation using Python type hints +[pydantic_ai](https://pypi.org/project/pydantic_ai) | 0.0.24 | Agent Framework / shim to use Pydantic with LLMs +[pydantic_ai_slim](https://pypi.org/project/pydantic_ai_slim) | 0.0.24 | Agent Framework / shim to use Pydantic with LLMs, slim package +[pydantic_core](https://pypi.org/project/pydantic_core) | 2.27.2 | Core functionality for Pydantic validation and serialization +[pydantic_graph](https://pypi.org/project/pydantic_graph) | 0.0.24 | Graph and state machine library +[pydeck](https://pypi.org/project/pydeck) | 0.9.1 | Widget for deck.gl maps +[pydocstyle](https://pypi.org/project/pydocstyle) | 6.3.0 | Python docstring style checker +[pydub](https://pypi.org/project/pydub) | 0.25.1 | Manipulate audio with an simple and easy high level interface +[pyerfa](https://pypi.org/project/pyerfa) | 2.0.1.4 | Python bindings for ERFA +[pyflakes](https://pypi.org/project/pyflakes) | 3.2.0 | passive checker of Python programs +[pygments](https://pypi.org/project/pygments) | 2.19.1 | Pygments is a syntax highlighting package written in Python. +[pyjwt](https://pypi.org/project/pyjwt) | 2.8.0 | JSON Web Token implementation in Python +[pylint](https://pypi.org/project/pylint) | 3.1.0 | python code static checker +[pylint_venv](https://pypi.org/project/pylint_venv) | 3.0.3 | pylint-venv provides a Pylint init-hook to use the same Pylint installation with different virtual environments. +[pyls_spyder](https://pypi.org/project/pyls_spyder) | 0.4.0 | Spyder extensions for the python-lsp-server +[pymongo](https://pypi.org/project/pymongo) | 4.10.1 | Python driver for MongoDB +[pympler](https://pypi.org/project/pympler) | 1.0.1 | A development tool to measure, monitor and analyze the memory behavior of Python objects. +[pynacl](https://pypi.org/project/pynacl) | 1.5.0 | Python binding to the Networking and Cryptography (NaCl) library +[pynndescent](https://pypi.org/project/pynndescent) | 0.5.12 | Nearest Neighbor Descent +[pyodbc](https://pypi.org/project/pyodbc) | 5.2.0 | DB API module for ODBC +[pyogrio](https://pypi.org/project/pyogrio) | 0.10.0 | Vectorized spatial vector file format I/O using GDAL/OGR +[pyomo](https://pypi.org/project/pyomo) | 6.8.2 | Pyomo: Python Optimization Modeling Objects +[pypandoc](https://pypi.org/project/pypandoc) | 1.5 | Thin wrapper for pandoc. +[pyparsing](https://pypi.org/project/pyparsing) | 3.2.1 | pyparsing module - Classes and methods to define and execute parsing grammars +[pypdf](https://pypi.org/project/pypdf) | 5.1.0 | A pure-python PDF library capable of splitting, merging, cropping, and transforming PDF files +[pyproj](https://pypi.org/project/pyproj) | 3.7.0 | Python interface to PROJ (cartographic projections and coordinate transformations library) +[pyproject_hooks](https://pypi.org/project/pyproject_hooks) | 1.1.0 | Wrappers to call pyproject.toml-based build backend hooks. +[pyqt5](https://pypi.org/project/pyqt5) | 5.15.10 | Python bindings for the Qt cross platform application toolkit +[pyqt5_qt5](https://pypi.org/project/pyqt5_qt5) | 5.15.2 | The subset of a Qt installation needed by PyQt5. +[pyqt5_sip](https://pypi.org/project/pyqt5_sip) | 12.16.1 | The sip module support for PyQt5 +[pyqtgraph](https://pypi.org/project/pyqtgraph) | 0.13.7 | Scientific Graphics and GUI Library for Python +[pyqtwebengine](https://pypi.org/project/pyqtwebengine) | 5.15.6 | Python bindings for the Qt WebEngine framework +[pyqtwebengine_qt5](https://pypi.org/project/pyqtwebengine_qt5) | 5.15.2 | The subset of a Qt installation needed by PyQtWebEngine. +[pyserial](https://pypi.org/project/pyserial) | 3.5 | Python Serial Port Extension +[pysocks](https://pypi.org/project/pysocks) | 1.7.1 | A Python SOCKS client module. See https://github.com/Anorov/PySocks for more information. +[pyspnego](https://pypi.org/project/pyspnego) | 0.11.2 | Windows Negotiate Authentication Client and Server +[pytest](https://pypi.org/project/pytest) | 8.2.2 | pytest: simple powerful testing with Python +[python_barcode](https://pypi.org/project/python_barcode) | 0.15.1 | Create standard barcodes with Python. No external modules needed. (optional Pillow support included). +[python_dateutil](https://pypi.org/project/python_dateutil) | 2.8.2 | Extensions to the standard Python datetime module +[python_dotenv](https://pypi.org/project/python_dotenv) | 1.0.1 | Read key-value pairs from a .env file and set them as environment variables +[python_json_logger](https://pypi.org/project/python_json_logger) | 2.0.7 | A python library adding a json log formatter +[python_lsp_black](https://pypi.org/project/python_lsp_black) | 2.0.0 | Black plugin for the Python LSP Server +[python_lsp_jsonrpc](https://pypi.org/project/python_lsp_jsonrpc) | 1.1.2 | JSON RPC 2.0 server library +[python_lsp_server](https://pypi.org/project/python_lsp_server) | 1.12.0 | Python Language Server for the Language Server Protocol +[python_multipart](https://pypi.org/project/python_multipart) | 0.0.9 | A streaming multipart parser for Python +[python_slugify](https://pypi.org/project/python_slugify) | 8.0.4 | A Python slugify application that also handles Unicode +[pythonqwt](https://pypi.org/project/pythonqwt) | 0.14.4 | Qt plotting widgets for Python +[pytoolconfig](https://pypi.org/project/pytoolconfig) | 1.3.1 | Python tool configuration +[pytz](https://pypi.org/project/pytz) | 2024.1 | World timezone definitions, modern and historical +[pyusb](https://pypi.org/project/pyusb) | 1.3.1 | Easy USB access for Python +[pyviz_comms](https://pypi.org/project/pyviz_comms) | 3.0.3 | A JupyterLab extension for rendering HoloViz content. +[pywavelets](https://pypi.org/project/pywavelets) | 1.8.0 | PyWavelets, wavelet transform module +[pywin32](https://pypi.org/project/pywin32) | 308 | Python for Window Extensions +[pywin32_ctypes](https://pypi.org/project/pywin32_ctypes) | 0.2.2 | A (partial) reimplementation of pywin32 using ctypes/cffi +[pywinpty](https://pypi.org/project/pywinpty) | 2.0.14 | Pseudo terminal support for Windows from Python. +[pyyaml](https://pypi.org/project/pyyaml) | 6.0.2 | YAML parser and emitter for Python +[pyzmq](https://pypi.org/project/pyzmq) | 26.2.0 | Python bindings for 0MQ +[qdarkstyle](https://pypi.org/project/qdarkstyle) | 3.2.3 | The most complete dark/light style sheet for C++/Python and Qt applications +[qdldl](https://pypi.org/project/qdldl) | 0.1.7.post5 | QDLDL, a free LDL factorization routine. +[qrcode](https://pypi.org/project/qrcode) | 8.0 | QR Code image generator +[qstylizer](https://pypi.org/project/qstylizer) | 0.2.2 | Stylesheet Generator for PyQt{4-5}/PySide{1-2} +[qtawesome](https://pypi.org/project/qtawesome) | 1.3.1 | FontAwesome icons in PyQt and PySide applications +[qtconsole](https://pypi.org/project/qtconsole) | 5.5.2 | Jupyter Qt console +[qtpy](https://pypi.org/project/qtpy) | 2.4.1 | Provides an abstraction layer on top of the various Qt bindings (PyQt5/6 and PySide2/6). +[quantecon](https://pypi.org/project/quantecon) | 0.7.2 | Import the main names to top level. +[quart](https://pypi.org/project/quart) | 0.19.4 | A Python ASGI web microframework with the same API as Flask +[rapidfuzz](https://pypi.org/project/rapidfuzz) | 3.9.6 | rapid fuzzy string matching +[readme_renderer](https://pypi.org/project/readme_renderer) | 44.0 | readme_renderer is a library for rendering readme descriptions for Warehouse +[redis](https://pypi.org/project/redis) | 5.0.8 | Python client for Redis database and key-value store +[referencing](https://pypi.org/project/referencing) | 0.35.1 | JSON Referencing + Python +[regex](https://pypi.org/project/regex) | 2024.11.6 | Alternative regular expression module, to replace re. +[reportlab](https://pypi.org/project/reportlab) | 4.2.5 | The Reportlab Toolkit +[requests](https://pypi.org/project/requests) | 2.32.3 | Python HTTP for Humans. +[requests_ntlm](https://pypi.org/project/requests_ntlm) | 1.3.0 | This package allows for HTTP NTLM authentication using the requests library. +[requests_toolbelt](https://pypi.org/project/requests_toolbelt) | 1.0.0 | A utility belt for advanced users of python-requests +[rfc3339_validator](https://pypi.org/project/rfc3339_validator) | 0.1.4 | A pure python RFC3339 validator +[rfc3986](https://pypi.org/project/rfc3986) | 2.0.0 | Validating URI References per RFC 3986 +[rfc3986_validator](https://pypi.org/project/rfc3986_validator) | 0.1.1 | Pure python rfc3986 validator +[rich](https://pypi.org/project/rich) | 13.9.4 | Render rich text, tables, progress bars, syntax highlighting, markdown and more to the terminal +[rope](https://pypi.org/project/rope) | 1.12.0 | a python refactoring library... +[rpds_py](https://pypi.org/project/rpds_py) | 0.22.3 | Python bindings to Rust's persistent data structures (rpds) +[rsa](https://pypi.org/project/rsa) | 4.7.2 | Pure-Python RSA implementation +[rtree](https://pypi.org/project/rtree) | 1.1.0 | R-Tree spatial index for Python GIS +[rx](https://pypi.org/project/rx) | 3.1.1 | Reactive Extensions (Rx) for Python +[scikit_image](https://pypi.org/project/scikit_image) | 0.25.0 | Image processing in Python +[scikit_learn](https://pypi.org/project/scikit_learn) | 1.6.1 | A set of python modules for machine learning and data mining +[scipy](https://pypi.org/project/scipy) | 1.15.1 | Fundamental algorithms for scientific computing in Python +[scramp](https://pypi.org/project/scramp) | 1.4.5 | An implementation of the SCRAM protocol. +[scs](https://pypi.org/project/scs) | 3.2.7.post2 | Splitting conic solver +[seaborn](https://pypi.org/project/seaborn) | 0.13.2 | Statistical data visualization +[send2trash](https://pypi.org/project/send2trash) | 1.8.2 | Send file to trash natively under Mac OS X, Windows and Linux +[setuptools](https://pypi.org/project/setuptools) | 75.6.0 | Easily download, build, install, upgrade, and uninstall Python packages +[shapely](https://pypi.org/project/shapely) | 2.0.6 | Manipulation and analysis of geometric objects +[simplejson](https://pypi.org/project/simplejson) | 3.19.3 | Simple, fast, extensible JSON encoder/decoder for Python +[simpy](https://pypi.org/project/simpy) | 4.0.1 | Event discrete, process based simulation for Python. +[six](https://pypi.org/project/six) | 1.16.0 | Python 2 and 3 compatibility utilities +[sklearn_compat](https://pypi.org/project/sklearn_compat) | 0.1.3 | Ease support for compatible scikit-learn estimators across versions +[smmap](https://pypi.org/project/smmap) | 5.0.0 | A pure Python implementation of a sliding window memory map manager +[sniffio](https://pypi.org/project/sniffio) | 1.3.0 | Sniff out which async library your code is running under +[snowballstemmer](https://pypi.org/project/snowballstemmer) | 2.2.0 | This package provides 29 stemmers for 28 languages generated from Snowball algorithms. +[sortedcontainers](https://pypi.org/project/sortedcontainers) | 2.4.0 | Sorted Containers -- Sorted List, Sorted Dict, Sorted Set +[sounddevice](https://pypi.org/project/sounddevice) | 0.5.1 | Play and Record Sound with Python +[soupsieve](https://pypi.org/project/soupsieve) | 2.6 | A modern CSS selector implementation for Beautiful Soup. +[sphinx](https://pypi.org/project/sphinx) | 7.3.7 | Python documentation generator +[sphinx_rtd_theme](https://pypi.org/project/sphinx_rtd_theme) | 3.0.2 | Read the Docs theme for Sphinx +[sphinxcontrib_applehelp](https://pypi.org/project/sphinxcontrib_applehelp) | 2.0.0 | sphinxcontrib-applehelp is a Sphinx extension which outputs Apple help books +[sphinxcontrib_devhelp](https://pypi.org/project/sphinxcontrib_devhelp) | 2.0.0 | sphinxcontrib-devhelp is a sphinx extension which outputs Devhelp documents +[sphinxcontrib_htmlhelp](https://pypi.org/project/sphinxcontrib_htmlhelp) | 2.1.0 | sphinxcontrib-htmlhelp is a sphinx extension which renders HTML help files +[sphinxcontrib_jquery](https://pypi.org/project/sphinxcontrib_jquery) | 4.1 | Extension to include jQuery on newer Sphinx releases +[sphinxcontrib_jsmath](https://pypi.org/project/sphinxcontrib_jsmath) | 1.0.1 | A sphinx extension which renders display math in HTML via JavaScript +[sphinxcontrib_qthelp](https://pypi.org/project/sphinxcontrib_qthelp) | 2.0.0 | sphinxcontrib-qthelp is a sphinx extension which outputs QtHelp documents +[sphinxcontrib_serializinghtml](https://pypi.org/project/sphinxcontrib_serializinghtml) | 2.0.0 | sphinxcontrib-serializinghtml is a sphinx extension which outputs "serialized" HTML files (json and pickle) +[spyder](https://pypi.org/project/spyder) | 5.5.6 | The Scientific Python Development Environment +[spyder_kernels](https://pypi.org/project/spyder_kernels) | 2.5.2 | Jupyter kernels for Spyder's console +[sqlalchemy](https://pypi.org/project/sqlalchemy) | 2.0.35 | Database Abstraction Library +[sqlite_bro](https://pypi.org/project/sqlite_bro) | 0.13.1 | a graphic SQLite Client in 1 Python file +[sqlite_fts4](https://pypi.org/project/sqlite_fts4) | 1.0.3 | Python functions for working with SQLite FTS4 search +[sqlite_utils](https://pypi.org/project/sqlite_utils) | 3.38 | CLI tool and Python library for manipulating SQLite databases +[sqlparse](https://pypi.org/project/sqlparse) | 0.5.3 | A non-validating SQL parser. +[squarify](https://pypi.org/project/squarify) | 0.4.4 | Pure Python implementation of the squarify treemap layout algorithm +[sspilib](https://pypi.org/project/sspilib) | 0.2.0 | SSPI API bindings for Python +[stack_data](https://pypi.org/project/stack_data) | 0.6.3 | Extract data from python stack frames and tracebacks for informative displays +[starlette](https://pypi.org/project/starlette) | 0.41.3 | The little ASGI library that shines. +[statsmodels](https://pypi.org/project/statsmodels) | 0.14.4 | Statistical computations and models for Python +[streamlit](https://pypi.org/project/streamlit) | 1.41.1 | A faster way to build and share data apps +[streamz](https://pypi.org/project/streamz) | 0.6.3 | Streams +[sympy](https://pypi.org/project/sympy) | 1.13.3 | Computer algebra system (CAS) in Python +[tabulate](https://pypi.org/project/tabulate) | 0.9.0 | Pretty-print tabular data +[tblib](https://pypi.org/project/tblib) | 3.0.0 | Traceback serialization library. +[tenacity](https://pypi.org/project/tenacity) | 9.0.0 | Retry code until it succeeds +[termcolor](https://pypi.org/project/termcolor) | 2.5.0 | ANSI color formatting for output in terminal +[terminado](https://pypi.org/project/terminado) | 0.18.1 | Tornado websocket backend for the Xterm.js Javascript terminal emulator library. +[text_unidecode](https://pypi.org/project/text_unidecode) | 1.3 | The most basic Text::Unidecode port +[textdistance](https://pypi.org/project/textdistance) | 4.6.3 | Compute distance between the two texts. +[thefuzz](https://pypi.org/project/thefuzz) | 0.22.1 | Fuzzy string matching in python +[threadpoolctl](https://pypi.org/project/threadpoolctl) | 3.5.0 | threadpoolctl +[three_merge](https://pypi.org/project/three_merge) | 0.1.1 | Simple library for merging two strings with respect to a base one +[tifffile](https://pypi.org/project/tifffile) | 2025.1.10 | Read and write TIFF files +[tiktoken](https://pypi.org/project/tiktoken) | 0.8.0 | tiktoken is a fast BPE tokeniser for use with OpenAI's models +[tinycss2](https://pypi.org/project/tinycss2) | 1.4.0 | A tiny CSS parser +[tokenizers](https://pypi.org/project/tokenizers) | 0.21.0 | +[toml](https://pypi.org/project/toml) | 0.10.2 | Python Library for Tom's Obvious, Minimal Language +[tomli](https://pypi.org/project/tomli) | 2.2.1 | A lil' TOML parser +[tomli_w](https://pypi.org/project/tomli_w) | 1.1.0 | A lil' TOML writer +[tomlkit](https://pypi.org/project/tomlkit) | 0.13.2 | Style preserving TOML library +[toolz](https://pypi.org/project/toolz) | 1.0.0 | List processing tools and functional utilities +[tornado](https://pypi.org/project/tornado) | 6.4.2 | Tornado is a Python web framework and asynchronous networking library, originally developed at FriendFeed. +[tqdm](https://pypi.org/project/tqdm) | 4.66.4 | Fast, Extensible Progress Meter +[traitlets](https://pypi.org/project/traitlets) | 5.14.1 | Traitlets Python configuration system +[traittypes](https://pypi.org/project/traittypes) | 0.2.1 | Scipy trait types +[trio](https://pypi.org/project/trio) | 0.28.0 | A friendly Python library for async concurrency and I/O +[trove_classifiers](https://pypi.org/project/trove_classifiers) | 2024.10.21.16 | Canonical source for classifiers on PyPI (pypi.org). +[twine](https://pypi.org/project/twine) | 6.0.1 | Collection of utilities for publishing packages on PyPI +[types_python_dateutil](https://pypi.org/project/types_python_dateutil) | 2.9.0.20240316 | Typing stubs for python-dateutil +[types_requests](https://pypi.org/project/types_requests) | 2.32.0.20241016 | Typing stubs for requests +[typing_extensions](https://pypi.org/project/typing_extensions) | 4.12.2 | Backported and Experimental Type Hints for Python 3.8+ +[typing_inspect](https://pypi.org/project/typing_inspect) | 0.9.0 | Runtime inspection utilities for typing module. +[tzdata](https://pypi.org/project/tzdata) | 2024.1 | Provider of IANA time zone data +[tzlocal](https://pypi.org/project/tzlocal) | 5.2 | tzinfo object for the local timezone +[uc_micro_py](https://pypi.org/project/uc_micro_py) | 1.0.1 | Micro subset of unicode data files for linkify-it-py projects. +[ujson](https://pypi.org/project/ujson) | 5.10.0 | Ultra fast JSON encoder and decoder for Python +[umap_learn](https://pypi.org/project/umap_learn) | 0.5.6 | Uniform Manifold Approximation and Projection +[uncertainties](https://pypi.org/project/uncertainties) | 3.2.2 | calculations with values with uncertainties, error propagation +[uri_template](https://pypi.org/project/uri_template) | 1.3.0 | RFC 6570 URI Template Processor +[urllib3](https://pypi.org/project/urllib3) | 2.2.3 | HTTP library with thread-safe connection pooling, file post, and more. +[uvicorn](https://pypi.org/project/uvicorn) | 0.34.0 | The lightning-fast ASGI server. +[vega_datasets](https://pypi.org/project/vega_datasets) | 0.9.0 | A Python package for offline access to Vega datasets +[waitress](https://pypi.org/project/waitress) | 3.0.0 | Waitress WSGI server +[watchdog](https://pypi.org/project/watchdog) | 6.0.0 | Filesystem events monitoring +[wcwidth](https://pypi.org/project/wcwidth) | 0.2.13 | Measures the displayed width of unicode strings in a terminal +[webcolors](https://pypi.org/project/webcolors) | 24.11.1 | A library for working with the color formats defined by HTML and CSS. +[webencodings](https://pypi.org/project/webencodings) | 0.5.1 | Character encoding aliases for legacy web content +[websocket_client](https://pypi.org/project/websocket_client) | 1.8.0 | WebSocket client for Python with low level API options +[websockets](https://pypi.org/project/websockets) | 14.2 | An implementation of the WebSocket Protocol (RFC 6455 & 7692) +[werkzeug](https://pypi.org/project/werkzeug) | 3.1.3 | The comprehensive WSGI web application library. +[whatthepatch](https://pypi.org/project/whatthepatch) | 1.0.7 | A patch parsing and application library. +[wheel](https://pypi.org/project/wheel) | 0.45.1 | A built-package format for Python +[widgetsnbextension](https://pypi.org/project/widgetsnbextension) | 4.0.13 | Jupyter interactive widgets for Jupyter Notebook +[winpython](https://pypi.org/project/winpython) | 13.1.20250222 | WinPython distribution tools, including WPPM +[wordcloud](https://pypi.org/project/wordcloud) | 1.9.4 | A little word cloud generator +[wsproto](https://pypi.org/project/wsproto) | 1.2.0 | WebSockets state-machine based protocol implementation +[xarray](https://pypi.org/project/xarray) | 2025.1.1 | N-D labeled arrays and datasets in Python +[xlsxwriter](https://pypi.org/project/xlsxwriter) | 3.1.9 | A Python module for creating Excel XLSX files. +[xyzservices](https://pypi.org/project/xyzservices) | 2023.10.1 | Source of XYZ tiles providers +[yapf](https://pypi.org/project/yapf) | 0.40.1 | A formatter for Python code. +[yarl](https://pypi.org/project/yarl) | 1.18.3 | Yet another URL library +[yt_dlp](https://pypi.org/project/yt_dlp) | 2023.7.6 | A youtube-dl fork with additional features and patches +[zict](https://pypi.org/project/zict) | 3.0.0 | Mutable mapping tools +[zipp](https://pypi.org/project/zipp) | 3.21.0 | Backport of pathlib-compatible object wrapper for zip files +[zstandard](https://pypi.org/project/zstandard) | 0.23.0 | Zstandard bindings for Python + +
    diff --git a/changelogs/WinPythonslim-64bit-3.12.9.0_History.md b/changelogs/WinPythonslim-64bit-3.12.9.0_History.md new file mode 100644 index 00000000..aa21a9ba --- /dev/null +++ b/changelogs/WinPythonslim-64bit-3.12.9.0_History.md @@ -0,0 +1,195 @@ +## History of changes for WinPython-64bit 3.12.9.0slim + +The following changes were made to WinPython-64bit distribution since version 3.12.8.0slim. + +
    +### Tools + +Removed packages: + + * [Pandoc](https://pandoc.org/) 3.1.9 (a universal document converter) + +### Python packages + +New packages: + + * [cohere](https://pypi.org/project/cohere) 5.13.12 () + * [faker](https://pypi.org/project/faker) 33.3.1 (Faker is a Python package that generates fake data for you.) + * [fastavro](https://pypi.org/project/fastavro) 1.10.0 (Fast read/write of AVRO files) + * [httpx_sse](https://pypi.org/project/httpx_sse) 0.4.0 (Consume Server-Sent Event (SSE) messages with HTTPX.) + * [nh3](https://pypi.org/project/nh3) 0.2.18 (Python bindings to the ammonia HTML sanitization library.) + * [prince](https://pypi.org/project/prince) 0.15.0 (Factor analysis in Python: PCA, CA, MCA, MFA, FAMD, GPA) + * [pydantic_graph](https://pypi.org/project/pydantic_graph) 0.0.24 (Graph and state machine library) + * [pyogrio](https://pypi.org/project/pyogrio) 0.10.0 (Vectorized spatial vector file format I/O using GDAL/OGR) + * [pyspnego](https://pypi.org/project/pyspnego) 0.11.2 (Windows Negotiate Authentication Client and Server) + * [pyusb](https://pypi.org/project/pyusb) 1.3.1 (Easy USB access for Python) + * [pywavelets](https://pypi.org/project/pywavelets) 1.8.0 (PyWavelets, wavelet transform module) + * [sklearn_compat](https://pypi.org/project/sklearn_compat) 0.1.3 (Ease support for compatible scikit-learn estimators across versions) + * [squarify](https://pypi.org/project/squarify) 0.4.4 (Pure Python implementation of the squarify treemap layout algorithm) + * [sspilib](https://pypi.org/project/sspilib) 0.2.0 (SSPI API bindings for Python) + * [thefuzz](https://pypi.org/project/thefuzz) 0.22.1 (Fuzzy string matching in python) + * [tokenizers](https://pypi.org/project/tokenizers) 0.21.0 () + * [types_requests](https://pypi.org/project/types_requests) 2.32.0.20241016 (Typing stubs for requests) + +Upgraded packages: + + * [array_api_compat](https://pypi.org/project/array_api_compat) 1.8 → 1.10.0 (A wrapper around NumPy and other array libraries to make them compatible with the Array API standard) + * [baresql](https://pypi.org/project/baresql) 0.8.0 → 1.0.0 (playing SQL directly on Python datas) + * [blinker](https://pypi.org/project/blinker) 1.7.0 → 1.9.0 (Fast, simple object-to-object and broadcast signaling) + * [bokeh](https://pypi.org/project/bokeh) 3.6.1 → 3.6.3 (Interactive plots and applications in the browser from Python) + * [clarabel](https://pypi.org/project/clarabel) 0.9.0 → 0.10.0 (Clarabel Conic Interior Point Solver for Rust / Python) + * [cryptography](https://pypi.org/project/cryptography) 41.0.5 → 44.0.0 (cryptography is a package which provides cryptographic recipes and primitives to Python developers.) + * [cytoolz](https://pypi.org/project/cytoolz) 0.12.3 → 1.0.1 (Cython implementation of Toolz: High performance functional utilities) + * [deap](https://pypi.org/project/deap) 1.4.1 → 1.4.2 (Distributed Evolutionary Algorithms in Python) + * [dill](https://pypi.org/project/dill) 0.3.7 → 0.3.9 (serialize all of Python) + * [docutils](https://pypi.org/project/docutils) 0.20.1 → 0.21.2 (Docutils -- Python Documentation Utilities) + * [duckdb](https://pypi.org/project/duckdb) 1.1.3 → 1.2.0 (DuckDB in-process database) + * [flask](https://pypi.org/project/flask) 3.0.3 → 3.1.0 (A simple framework for building complex web applications.) + * [flit](https://pypi.org/project/flit) 3.9.0 → 3.10.1 (A simple packaging tool for simple packages.) + * [flit_core](https://pypi.org/project/flit_core) 3.9.0 → 3.10.1 (Distribution-building parts of Flit. See flit package for more information) + * [geopandas](https://pypi.org/project/geopandas) 0.14.4 → 1.0.1 (Geographic pandas extensions) + * [griffe](https://pypi.org/project/griffe) 1.5.4 → 1.5.5 (Signatures for entire Python programs) + * [huggingface_hub](https://pypi.org/project/huggingface_hub) 0.27.0 → 0.28.1 (Client library to download and publish models, datasets and other repos on the huggingface.co hub) + * [hypothesis](https://pypi.org/project/hypothesis) 6.108.5 → 6.122.3 (A library for property-based testing) + * [imbalanced_learn](https://pypi.org/project/imbalanced_learn) 0.12.3 → 0.13.0 (Toolbox for imbalanced dataset in machine learning) + * [ipycanvas](https://pypi.org/project/ipycanvas) 0.13.2 → 0.13.3 (Interactive widgets library exposing the browser's Canvas API) + * [ipympl](https://pypi.org/project/ipympl) 0.9.4 → 0.9.6 (Matplotlib Jupyter Extension) + * [ipython](https://pypi.org/project/ipython) 8.26.0 → 8.32.0 (IPython: Productive Interactive Computing) + * [janus](https://pypi.org/project/janus) 1.0.0 → 2.0.0 (Mixed sync-async queue to interoperate between asyncio tasks and classic threads) + * [jaraco_context](https://pypi.org/project/jaraco_context) 5.3.0 → 6.0.1 (Useful decorators and context managers) + * [jaraco_functools](https://pypi.org/project/jaraco_functools) 4.0.1 → 4.1.0 (Functools like those found in stdlib) + * [jedi](https://pypi.org/project/jedi) 0.19.1 → 0.19.2 (An autocompletion tool for Python that can be used for text editors.) + * [jupyterlab](https://pypi.org/project/jupyterlab) 4.3.4 → 4.3.5 (JupyterLab computational environment) + * [keras](https://pypi.org/project/keras) 3.7.0 → 3.8.0 (Multi-backend Keras) + * [keyring](https://pypi.org/project/keyring) 25.2.1 → 25.6.0 (Store and access your passwords safely.) + * [kiwisolver](https://pypi.org/project/kiwisolver) 1.4.7 → 1.4.8 (A fast implementation of the Cassowary constraint solver) + * [langchain](https://pypi.org/project/langchain) 0.3.13 → 0.3.18 (Building applications with LLMs through composability) + * [langchain_core](https://pypi.org/project/langchain_core) 0.3.28 → 0.3.34 (Building applications with LLMs through composability) + * [langchain_text_splitters](https://pypi.org/project/langchain_text_splitters) 0.3.4 → 0.3.6 (LangChain text splitting utilities) + * [langsmith](https://pypi.org/project/langsmith) 0.2.6 → 0.2.11 (Client library to connect to the LangSmith LLM Tracing and Evaluation Platform.) + * [llvmlite](https://pypi.org/project/llvmlite) 0.44.0rc2 → 0.44.0 (lightweight wrapper around basic LLVM functionality) + * [logfire_api](https://pypi.org/project/logfire_api) 2.11.0 → 3.5.3 (Shim for the Logfire SDK which does nothing unless Logfire is installed) + * [markupsafe](https://pypi.org/project/markupsafe) 2.1.1 → 3.0.2 (Safely add untrusted strings to HTML/XML markup.) + * [maturin](https://pypi.org/project/maturin) 1.7.0 → 1.8.1 (Build and publish crates with pyo3, cffi and uniffi bindings as well as rust binaries as python packages) + * [mlxtend](https://pypi.org/project/mlxtend) 0.22.0 → 0.23.3 (Machine Learning Library Extensions) + * [msgpack](https://pypi.org/project/msgpack) 1.0.4 → 1.1.0 (MessagePack serializer) + * [narwhals](https://pypi.org/project/narwhals) 1.15.2 → 1.21.1 (Extremely lightweight compatibility layer between dataframe libraries) + * [numba](https://pypi.org/project/numba) 0.61.0rc2 → 0.61.0 (compiling Python code using LLVM) + * [openai](https://pypi.org/project/openai) 1.58.1 → 1.61.1 (The official Python library for the openai API) + * [osqp](https://pypi.org/project/osqp) 0.6.7.post1 → 0.6.7.post3 (OSQP: The Operator Splitting QP Solver) + * [panel](https://pypi.org/project/panel) 1.5.4 → 1.6.0 (The powerful data exploration & web app framework for Python.) + * [pillow](https://pypi.org/project/pillow) 11.0.0 → 11.1.0 (Python Imaging Library (Fork)) + * [plotpy](https://pypi.org/project/plotpy) 2.7.0 → 2.7.2 (Curve and image plotting tools for Python/Qt applications) + * [polars](https://pypi.org/project/polars) 1.18.0 → 1.22.0 (Blazingly fast DataFrame library) + * [pyarrow](https://pypi.org/project/pyarrow) 18.1.0 → 19.0.0 (Python library for Apache Arrow) + * [pydantic](https://pypi.org/project/pydantic) 2.10.4 → 2.10.6 (Data validation using Python type hints) + * [pydantic_ai](https://pypi.org/project/pydantic_ai) 0.0.15 → 0.0.24 (Agent Framework / shim to use Pydantic with LLMs) + * [pydantic_ai_slim](https://pypi.org/project/pydantic_ai_slim) 0.0.15 → 0.0.24 (Agent Framework / shim to use Pydantic with LLMs, slim package) + * [pygments](https://pypi.org/project/pygments) 2.18.0 → 2.19.1 (Pygments is a syntax highlighting package written in Python.) + * [pyomo](https://pypi.org/project/pyomo) 6.8.0 → 6.8.2 (Pyomo: Python Optimization Modeling Objects) + * [pyparsing](https://pypi.org/project/pyparsing) 3.1.2 → 3.2.1 (pyparsing module - Classes and methods to define and execute parsing grammars) + * [pypdf](https://pypi.org/project/pypdf) 3.15.2 → 5.1.0 (A pure-python PDF library capable of splitting, merging, cropping, and transforming PDF files) + * [pyproj](https://pypi.org/project/pyproj) 3.6.1 → 3.7.0 (Python interface to PROJ (cartographic projections and coordinate transformations library)) + * [pyqt5_sip](https://pypi.org/project/pyqt5_sip) 12.13.0 → 12.16.1 (The sip module support for PyQt5) + * [Python](http://www.python.org/) 3.12.8 → 3.12.9 (Python programming language with standard library) + * [pythonqwt](https://pypi.org/project/pythonqwt) 0.14.2 → 0.14.4 (Qt plotting widgets for Python) + * [qdldl](https://pypi.org/project/qdldl) 0.1.7.post4 → 0.1.7.post5 (QDLDL, a free LDL factorization routine.) + * [qrcode](https://pypi.org/project/qrcode) 7.4.2 → 8.0 (QR Code image generator) + * [readme_renderer](https://pypi.org/project/readme_renderer) 35.0 → 44.0 (readme_renderer is a library for rendering readme descriptions for Warehouse) + * [redis](https://pypi.org/project/redis) 5.0.3 → 5.0.8 (Python client for Redis database and key-value store) + * [reportlab](https://pypi.org/project/reportlab) 4.2.2 → 4.2.5 (The Reportlab Toolkit) + * [requests_ntlm](https://pypi.org/project/requests_ntlm) 1.1.0 → 1.3.0 (This package allows for HTTP NTLM authentication using the requests library.) + * [scikit_learn](https://pypi.org/project/scikit_learn) 1.6.0 → 1.6.1 (A set of python modules for machine learning and data mining) + * [scipy](https://pypi.org/project/scipy) 1.14.1 → 1.15.1 (Fundamental algorithms for scientific computing in Python) + * [scramp](https://pypi.org/project/scramp) 1.4.1 → 1.4.5 (An implementation of the SCRAM protocol.) + * [scs](https://pypi.org/project/scs) 3.2.7 → 3.2.7.post2 (Splitting conic solver) + * [shapely](https://pypi.org/project/shapely) 2.0.4 → 2.0.6 (Manipulation and analysis of geometric objects) + * [sounddevice](https://pypi.org/project/sounddevice) 0.4.6 → 0.5.1 (Play and Record Sound with Python) + * [soupsieve](https://pypi.org/project/soupsieve) 2.5 → 2.6 (A modern CSS selector implementation for Beautiful Soup.) + * [sphinx_rtd_theme](https://pypi.org/project/sphinx_rtd_theme) 2.0.0 → 3.0.2 (Read the Docs theme for Sphinx) + * [sphinxcontrib_applehelp](https://pypi.org/project/sphinxcontrib_applehelp) 1.0.8 → 2.0.0 (sphinxcontrib-applehelp is a Sphinx extension which outputs Apple help books) + * [sphinxcontrib_devhelp](https://pypi.org/project/sphinxcontrib_devhelp) 1.0.6 → 2.0.0 (sphinxcontrib-devhelp is a sphinx extension which outputs Devhelp documents) + * [sphinxcontrib_htmlhelp](https://pypi.org/project/sphinxcontrib_htmlhelp) 2.0.5 → 2.1.0 (sphinxcontrib-htmlhelp is a sphinx extension which renders HTML help files) + * [sphinxcontrib_qthelp](https://pypi.org/project/sphinxcontrib_qthelp) 1.0.7 → 2.0.0 (sphinxcontrib-qthelp is a sphinx extension which outputs QtHelp documents) + * [sphinxcontrib_serializinghtml](https://pypi.org/project/sphinxcontrib_serializinghtml) 1.1.9 → 2.0.0 (sphinxcontrib-serializinghtml is a sphinx extension which outputs "serialized" HTML files (json and pickle)) + * [sqlite_utils](https://pypi.org/project/sqlite_utils) 3.37 → 3.38 (CLI tool and Python library for manipulating SQLite databases) + * [sqlparse](https://pypi.org/project/sqlparse) 0.4.3 → 0.5.3 (A non-validating SQL parser.) + * [sympy](https://pypi.org/project/sympy) 1.13.2 → 1.13.3 (Computer algebra system (CAS) in Python) + * [tenacity](https://pypi.org/project/tenacity) 8.5.0 → 9.0.0 (Retry code until it succeeds) + * [textdistance](https://pypi.org/project/textdistance) 4.6.2 → 4.6.3 (Compute distance between the two texts.) + * [tifffile](https://pypi.org/project/tifffile) 2024.7.2 → 2025.1.10 (Read and write TIFF files) + * [tinycss2](https://pypi.org/project/tinycss2) 1.3.0 → 1.4.0 (A tiny CSS parser) + * [tomli](https://pypi.org/project/tomli) 2.0.1 → 2.2.1 (A lil' TOML parser) + * [tomli_w](https://pypi.org/project/tomli_w) 1.0.0 → 1.1.0 (A lil' TOML writer) + * [tomlkit](https://pypi.org/project/tomlkit) 0.12.3 → 0.13.2 (Style preserving TOML library) + * [toolz](https://pypi.org/project/toolz) 0.12.0 → 1.0.0 (List processing tools and functional utilities) + * [tornado](https://pypi.org/project/tornado) 6.4.1 → 6.4.2 (Tornado is a Python web framework and asynchronous networking library, originally developed at FriendFeed.) + * [trio](https://pypi.org/project/trio) 0.27.0 → 0.28.0 (A friendly Python library for async concurrency and I/O) + * [twine](https://pypi.org/project/twine) 4.0.1 → 6.0.1 (Collection of utilities for publishing packages on PyPI) + * [uncertainties](https://pypi.org/project/uncertainties) 3.1.7 → 3.2.2 (calculations with values with uncertainties, error propagation) + * [urllib3](https://pypi.org/project/urllib3) 2.0.3 → 2.2.3 (HTTP library with thread-safe connection pooling, file post, and more.) + * [uvicorn](https://pypi.org/project/uvicorn) 0.30.3 → 0.34.0 (The lightning-fast ASGI server.) + * [watchdog](https://pypi.org/project/watchdog) 4.0.1 → 6.0.0 (Filesystem events monitoring) + * [webcolors](https://pypi.org/project/webcolors) 1.12 → 24.11.1 (A library for working with the color formats defined by HTML and CSS.) + * [websockets](https://pypi.org/project/websockets) 13.1 → 14.2 (An implementation of the WebSocket Protocol (RFC 6455 & 7692)) + * [werkzeug](https://pypi.org/project/werkzeug) 3.0.3 → 3.1.3 (The comprehensive WSGI web application library.) + * [whatthepatch](https://pypi.org/project/whatthepatch) 1.0.2 → 1.0.7 (A patch parsing and application library.) + * [wheel](https://pypi.org/project/wheel) 0.44.0 → 0.45.1 (A built-package format for Python) + * [winpython](https://pypi.org/project/winpython) 11.2.20241228 → 13.1.20250222 (WinPython distribution tools, including WPPM) + * [xarray](https://pypi.org/project/xarray) 2024.11.0 → 2025.1.1 (N-D labeled arrays and datasets in Python) + * [zipp](https://pypi.org/project/zipp) 3.17.0 → 3.21.0 (Backport of pathlib-compatible object wrapper for zip files) + +Removed packages: + + * [about_time](https://pypi.org/project/about_time) 4.2.1 (Easily measure timing and throughput of code blocks, with beautiful human friendly representations.) + * [adodbapi](https://pypi.org/project/adodbapi) 2.6.1.3 (A pure Python package implementing PEP 249 DB-API using Microsoft ADO.) + * [affine](https://pypi.org/project/affine) 2.3.1 (Matrices describing affine transformation of the plane.) + * [alive_progress](https://pypi.org/project/alive_progress) 3.1.5 (A new kind of Progress Bar, with real-time throughput, ETA, and very cool animations!) + * [autograd](https://pypi.org/project/autograd) 1.6.2 (Efficiently computes derivatives of numpy code.) + * [cachelib](https://pypi.org/project/cachelib) 0.13.0 (A collection of cache libraries in the same API interface.) + * [cartopy](https://pypi.org/project/cartopy) 0.23.0 (A Python library for cartographic visualizations with Matplotlib) + * [cftime](https://pypi.org/project/cftime) 1.6.3 (Time-handling functionality from netcdf4-python) + * [click_plugins](https://pypi.org/project/click_plugins) 1.1.1 (An extension module for click to enable registering CLI commands via setuptools entry-points.) + * [cligj](https://pypi.org/project/cligj) 0.7.2 (Click params for commmand line interfaces to GeoJSON) + * [clr_loader](https://pypi.org/project/clr_loader) 0.2.6 (Generic pure Python loader for .NET runtimes) + * [clrmagic](https://pypi.org/project/clrmagic) 0.0.1a2 (IPython cell magic to use .NET languages) + * [cma](https://pypi.org/project/cma) 3.2.2 (CMA-ES, Covariance Matrix Adaptation Evolution Strategy for non-linear numerical optimization in Python) + * [db_py](https://pypi.org/project/db_py) 0.5.4b1 (a db package that doesn't suck) + * [deprecated](https://pypi.org/project/deprecated) 1.2.13 (Python @deprecated decorator to deprecate old python classes, functions or methods.) + * [docopt](https://pypi.org/project/docopt) 0.6.2 (Pythonic argument parser, that will make you smile) + * [ecos](https://pypi.org/project/ecos) 2.0.13 (This is the Python package for ECOS: Embedded Cone Solver. See Github page for more information.) + * [filterpy](https://pypi.org/project/filterpy) 1.4.5 (Kalman filtering and optimal estimation library) + * [fiona](https://pypi.org/project/fiona) 1.10.1 (Fiona reads and writes spatial data files) + * [flask_mail](https://pypi.org/project/flask_mail) 0.9.1 (Flask extension for sending email) + * [flask_session](https://pypi.org/project/flask_session) 0.5.0 (Server-side session support for Flask) + * [flask_sqlalchemy](https://pypi.org/project/flask_sqlalchemy) 3.0.5 (Add SQLAlchemy support to your Flask application.) + * [formlayout](https://pypi.org/project/formlayout) 1.2.1a1 (The most easy way to create Qt form dialogs and widgets with Python) + * [future](https://pypi.org/project/future) 0.18.2 (Clean single-source support for Python 3 and 2) + * [grapheme](https://pypi.org/project/grapheme) 0.6.0 (Unicode grapheme helpers) + * [netcdf4](https://pypi.org/project/netcdf4) 1.7.1.post2 (Provides an object-oriented python interface to the netCDF version 4 library) + * [ntlm_auth](https://pypi.org/project/ntlm_auth) 1.5.0 (Creates NTLM authentication structures) + * [numexpr](https://pypi.org/project/numexpr) 2.10.1 (Fast numerical expression evaluator for NumPy) + * [pdfrw](https://pypi.org/project/pdfrw) 0.4.post2 (PDF file reader/writer library) + * [ppci](https://pypi.org/project/ppci) 0.5.9 (A compiler for ARM, X86, MSP430, xtensa and more implemented in pure Python) + * [pulp](https://pypi.org/project/pulp) 2.6.0 (PuLP is an LP modeler written in python) + * [pyaudio](https://pypi.org/project/pyaudio) 0.2.14 (Cross-platform audio I/O with PortAudio) + * [pybars3](https://pypi.org/project/pybars3) 0.9.7 (Handlebars.js templating for Python 3 and 2) + * [pycosat](https://pypi.org/project/pycosat) 0.6.6 (bindings to picosat (a SAT solver)) + * [pymeta3](https://pypi.org/project/pymeta3) 0.5.1 (Pattern-matching language based on OMeta for Python 3 and 2) + * [pymoo](https://pypi.org/project/pymoo) 0.6.1.3 (Multi-Objective Optimization in Python) + * [pypng](https://pypi.org/project/pypng) 0.20220715.0 (Pure Python library for saving and loading PNG images) + * [pyshp](https://pypi.org/project/pyshp) 2.3.1 (Pure Python read/write support for ESRI Shapefile format) + * [pysimplegui](https://pypi.org/project/pysimplegui) 4.60.4 (Python GUIs for Humans) + * [pythonnet](https://pypi.org/project/pythonnet) 3.0.3 (.NET and Mono integration for Python) + * [pywinusb](https://pypi.org/project/pywinusb) 0.4.2 (A package that simplifies USB/HID communications on windows) + * [rasterio](https://pypi.org/project/rasterio) 1.3.10 (Fast and direct raster I/O for use with Numpy and SciPy) + * [simplegeneric](https://pypi.org/project/simplegeneric) 0.8.1 (Simple generic functions (similar to Python's own len(), pickle.dump(), etc.)) + * [snuggs](https://pypi.org/project/snuggs) 1.4.7 (Snuggs are s-expressions for Numpy) + * [sspyrs](https://pypi.org/project/sspyrs) 0.3 (Lightweight interface for SSRS reports to python) + * [wrapt](https://pypi.org/project/wrapt) 1.16.0 (Module for decorators, wrappers and monkey patching.) + * [xlwings](https://pypi.org/project/xlwings) 0.24.7 (Make Excel fly: Interact with Excel from Python and vice versa.) + * [xmltodict](https://pypi.org/project/xmltodict) 0.13.0 (Makes working with XML feel like you are working with JSON) + + +
    +* * * diff --git a/changelogs/WinPythonslim-64bit-3.13.2.0.md b/changelogs/WinPythonslim-64bit-3.13.2.0.md new file mode 100644 index 00000000..c0701b8a --- /dev/null +++ b/changelogs/WinPythonslim-64bit-3.13.2.0.md @@ -0,0 +1,511 @@ +## WinPython 3.13.2.0slim + +The following packages are included in WinPython-64bit v3.13.2.0slim . + +
    + +### Tools + +Name | Version | Description +-----|---------|------------ + + +### Python packages + +Name | Version | Description +-----|---------|------------ +[Python](http://www.python.org/) | 3.13.2 | Python programming language with standard library +[absl_py](https://pypi.org/project/absl_py) | 2.0.0 | Abseil Python Common Libraries, see https://github.com/abseil/abseil-py. +[adbc_driver_manager](https://pypi.org/project/adbc_driver_manager) | 1.3.0 | A generic entrypoint for ADBC drivers. +[aiofiles](https://pypi.org/project/aiofiles) | 23.2.1 | File support for asyncio. +[aiohappyeyeballs](https://pypi.org/project/aiohappyeyeballs) | 2.4.4 | Happy Eyeballs for asyncio +[aiohttp](https://pypi.org/project/aiohttp) | 3.11.11 | Async http client/server framework (asyncio) +[aiosignal](https://pypi.org/project/aiosignal) | 1.3.1 | aiosignal: a list of registered asynchronous callbacks +[aiosqlite](https://pypi.org/project/aiosqlite) | 0.20.0 | asyncio bridge to the standard sqlite3 module +[alabaster](https://pypi.org/project/alabaster) | 0.7.16 | A light, configurable Sphinx theme +[alembic](https://pypi.org/project/alembic) | 1.13.1 | A database migration tool for SQLAlchemy. +[altair](https://pypi.org/project/altair) | 5.5.0 | Vega-Altair: A declarative statistical visualization library for Python. +[aniso8601](https://pypi.org/project/aniso8601) | 9.0.1 | A library for parsing ISO 8601 strings. +[annotated_types](https://pypi.org/project/annotated_types) | 0.6.0 | Reusable constraint types to use with typing.Annotated +[ansicolors](https://pypi.org/project/ansicolors) | 1.1.8 | ANSI colors for Python +[anthropic](https://pypi.org/project/anthropic) | 0.42.0 | The official Python library for the anthropic API +[anyio](https://pypi.org/project/anyio) | 4.7.0 | High level compatibility layer for multiple asynchronous event loop implementations +[anywidget](https://pypi.org/project/anywidget) | 0.9.12 | custom jupyter widgets made easy +[appdirs](https://pypi.org/project/appdirs) | 1.4.4 | A small Python module for determining appropriate platform-specific dirs, e.g. a "user data dir". +[argon2_cffi](https://pypi.org/project/argon2_cffi) | 23.1.0 | Argon2 for Python +[argon2_cffi_bindings](https://pypi.org/project/argon2_cffi_bindings) | 21.2.0 | Low-level CFFI bindings for Argon2 +[array_api_compat](https://pypi.org/project/array_api_compat) | 1.10.0 | A wrapper around NumPy and other array libraries to make them compatible with the Array API standard +[arrow](https://pypi.org/project/arrow) | 1.3.0 | Better dates & times for Python +[asgi_csrf](https://pypi.org/project/asgi_csrf) | 0.9 | ASGI middleware for protecting against CSRF attacks +[asgiref](https://pypi.org/project/asgiref) | 3.8.1 | ASGI specs, helper code, and adapters +[asn1crypto](https://pypi.org/project/asn1crypto) | 1.5.1 | Fast ASN.1 parser and serializer with definitions for private keys, public keys, certificates, CRL, OCSP, CMS, PKCS#3, PKCS#7, PKCS#8, PKCS#12, +[asteval](https://pypi.org/project/asteval) | 0.9.31 | Safe, minimalistic evaluator of python expression using ast module +[astroid](https://pypi.org/project/astroid) | 3.1.0 | An abstract syntax tree for Python with inference support. +[astropy](https://pypi.org/project/astropy) | 6.1.6 | Astronomy and astrophysics core library +[astropy_iers_data](https://pypi.org/project/astropy_iers_data) | 0.2024.12.23.0.33.24 | IERS Earth Rotation and Leap Second tables for the astropy core package +[asttokens](https://pypi.org/project/asttokens) | 2.4.1 | Annotate AST trees with source code positions +[async_lru](https://pypi.org/project/async_lru) | 2.0.4 | Simple LRU cache for asyncio +[atomicwrites](https://pypi.org/project/atomicwrites) | 1.4.0 | Atomic file writes. +[attrs](https://pypi.org/project/attrs) | 23.2.0 | Classes Without Boilerplate +[autopep8](https://pypi.org/project/autopep8) | 2.0.4 | A tool that automatically formats Python code to conform to the PEP 8 style guide +[azure_core](https://pypi.org/project/azure_core) | 1.30.2 | Microsoft Azure Core Library for Python +[azure_cosmos](https://pypi.org/project/azure_cosmos) | 4.7.0 | Microsoft Azure Cosmos Client Library for Python +[azure_identity](https://pypi.org/project/azure_identity) | 1.16.1 | Microsoft Azure Identity Library for Python +[babel](https://pypi.org/project/babel) | 2.16.0 | Internationalization utilities +[baresql](https://pypi.org/project/baresql) | 1.0.0 | playing SQL directly on Python datas +[bcrypt](https://pypi.org/project/bcrypt) | 4.0.1 | Modern password hashing for your software and your servers +[beautifulsoup4](https://pypi.org/project/beautifulsoup4) | 4.12.2 | Screen-scraping library +[binaryornot](https://pypi.org/project/binaryornot) | 0.4.4 | Ultra-lightweight pure Python package to check if a file is binary or text. +[black](https://pypi.org/project/black) | 24.10.0 | The uncompromising code formatter. +[bleach](https://pypi.org/project/bleach) | 6.1.0 | An easy safelist-based HTML-sanitizing tool. +[blinker](https://pypi.org/project/blinker) | 1.9.0 | Fast, simple object-to-object and broadcast signaling +[bokeh](https://pypi.org/project/bokeh) | 3.6.3 | Interactive plots and applications in the browser from Python +[branca](https://pypi.org/project/branca) | 0.8.0 | Generate complex HTML+JS pages with Python +[brotli](https://pypi.org/project/brotli) | 1.1.0 | Python bindings for the Brotli compression library +[build](https://pypi.org/project/build) | 1.2.2.post1 | A simple, correct Python build frontend +[cachetools](https://pypi.org/project/cachetools) | 5.4.0 | Extensible memoizing collections and decorators +[certifi](https://pypi.org/project/certifi) | 2024.6.2 | Python package for providing Mozilla's CA Bundle. +[cffi](https://pypi.org/project/cffi) | 1.17.1 | Foreign Function Interface for Python calling C code. +[chardet](https://pypi.org/project/chardet) | 5.2.0 | Universal encoding detector for Python 3 +[charset_normalizer](https://pypi.org/project/charset_normalizer) | 3.4.0 | The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet. +[clarabel](https://pypi.org/project/clarabel) | 0.10.0 | Clarabel Conic Interior Point Solver for Rust / Python +[click](https://pypi.org/project/click) | 8.1.7 | Composable command line interface toolkit +[click_default_group](https://pypi.org/project/click_default_group) | 1.2.4 | click_default_group +[cloudpickle](https://pypi.org/project/cloudpickle) | 3.0.0 | Pickler class to extend the standard pickle.Pickler functionality +[cohere](https://pypi.org/project/cohere) | 5.13.12 | +[colorama](https://pypi.org/project/colorama) | 0.4.6 | Cross-platform colored terminal text. +[colorcet](https://pypi.org/project/colorcet) | 3.1.0 | Collection of perceptually uniform colormaps +[colorlog](https://pypi.org/project/colorlog) | 6.8.2 | Add colours to the output of Python's logging module. +[comm](https://pypi.org/project/comm) | 0.2.2 | Jupyter Python Comm implementation, for usage in ipykernel, xeus-python etc. +[contourpy](https://pypi.org/project/contourpy) | 1.3.1 | Python library for calculating contours of 2D quadrilateral grids +[cookiecutter](https://pypi.org/project/cookiecutter) | 2.6.0 | A command-line utility that creates projects from project templates, e.g +[cryptography](https://pypi.org/project/cryptography) | 44.0.0 | cryptography is a package which provides cryptographic recipes and primitives to Python developers. +[cvxopt](https://pypi.org/project/cvxopt) | 1.3.2 | Convex optimization package +[cvxpy](https://pypi.org/project/cvxpy) | 1.6.0 | A domain-specific language for modeling convex optimization problems in Python. +[cycler](https://pypi.org/project/cycler) | 0.12.1 | Composable style cycles +[cython](https://pypi.org/project/cython) | 3.0.11 | The Cython compiler for writing C extensions in the Python language. +[cytoolz](https://pypi.org/project/cytoolz) | 1.0.1 | Cython implementation of Toolz: High performance functional utilities +[dask](https://pypi.org/project/dask) | 2024.12.1 | Parallel PyData with Task Scheduling +[dask_expr](https://pypi.org/project/dask_expr) | 1.1.21 | High Level Expressions for Dask +[datasette](https://pypi.org/project/datasette) | 0.64.8 | An open source multi-tool for exploring and publishing data +[datasette_graphql](https://pypi.org/project/datasette_graphql) | 2.2 | Datasette plugin providing an automatic GraphQL API for your SQLite databases +[datashader](https://pypi.org/project/datashader) | 0.16.3 | Data visualization toolchain based on aggregating into a grid +[deap](https://pypi.org/project/deap) | 1.4.2 | Distributed Evolutionary Algorithms in Python +[debugpy](https://pypi.org/project/debugpy) | 1.8.0 | An implementation of the Debug Adapter Protocol for Python +[decorator](https://pypi.org/project/decorator) | 5.1.1 | Decorators for Humans +[defusedxml](https://pypi.org/project/defusedxml) | 0.7.1 | XML bomb protection for Python stdlib modules +[diff_match_patch](https://pypi.org/project/diff_match_patch) | 20230430 | Diff Match and Patch +[dill](https://pypi.org/project/dill) | 0.3.9 | serialize all of Python +[distributed](https://pypi.org/project/distributed) | 2024.12.1 | Distributed scheduler for Dask +[distro](https://pypi.org/project/distro) | 1.8.0 | Distro - an OS platform information API +[django](https://pypi.org/project/django) | 5.0.7 | A high-level Python web framework that encourages rapid development and clean, pragmatic design. +[dnspython](https://pypi.org/project/dnspython) | 2.6.1 | DNS toolkit +[docstring_to_markdown](https://pypi.org/project/docstring_to_markdown) | 0.13 | On the fly conversion of Python docstrings to markdown +[docutils](https://pypi.org/project/docutils) | 0.21.2 | Docutils -- Python Documentation Utilities +[duckdb](https://pypi.org/project/duckdb) | 1.2.0 | DuckDB in-process database +[entrypoints](https://pypi.org/project/entrypoints) | 0.4 | Discover and load entry points from installed packages. +[et_xmlfile](https://pypi.org/project/et_xmlfile) | 1.1.0 | An implementation of lxml.xmlfile for the standard library +[eval_type_backport](https://pypi.org/project/eval_type_backport) | 0.2.2 | Like `typing._eval_type`, but lets older Python versions use newer typing features. +[executing](https://pypi.org/project/executing) | 2.0.1 | Get the currently executing AST node of a frame, and other information +[faker](https://pypi.org/project/faker) | 33.3.1 | Faker is a Python package that generates fake data for you. +[fast_histogram](https://pypi.org/project/fast_histogram) | 0.14 | Fast simple 1D and 2D histograms +[fastapi](https://pypi.org/project/fastapi) | 0.115.6 | FastAPI framework, high performance, easy to learn, fast to code, ready for production +[fastavro](https://pypi.org/project/fastavro) | 1.10.0 | Fast read/write of AVRO files +[fastjsonschema](https://pypi.org/project/fastjsonschema) | 2.18.0 | Fastest Python implementation of JSON schema +[filelock](https://pypi.org/project/filelock) | 3.14.0 | A platform independent file lock. +[flake8](https://pypi.org/project/flake8) | 7.1.1 | the modular source code checker: pep8 pyflakes and co +[flask](https://pypi.org/project/flask) | 3.1.0 | A simple framework for building complex web applications. +[flit](https://pypi.org/project/flit) | 3.10.1 | A simple packaging tool for simple packages. +[flit_core](https://pypi.org/project/flit_core) | 3.10.1 | Distribution-building parts of Flit. See flit package for more information +[folium](https://pypi.org/project/folium) | 0.18.0 | Make beautiful maps with Leaflet.js & Python +[fonttools](https://pypi.org/project/fonttools) | 4.55.3 | Tools to manipulate font files +[fqdn](https://pypi.org/project/fqdn) | 1.5.1 | Validates fully-qualified domain names against RFC 1123, so that they are acceptable to modern bowsers +[frozenlist](https://pypi.org/project/frozenlist) | 1.5.0 | A list-like structure which implements collections.abc.MutableSequence +[fsspec](https://pypi.org/project/fsspec) | 2024.6.1 | File-system specification +[fuzzywuzzy](https://pypi.org/project/fuzzywuzzy) | 0.18.0 | Fuzzy string matching in python +[geographiclib](https://pypi.org/project/geographiclib) | 2.0 | The geodesic routines from GeographicLib +[geopandas](https://pypi.org/project/geopandas) | 1.0.1 | Geographic pandas extensions +[geopy](https://pypi.org/project/geopy) | 2.4.1 | Python Geocoding Toolbox +[gitdb](https://pypi.org/project/gitdb) | 4.0.10 | Git Object Database +[gitpython](https://pypi.org/project/gitpython) | 3.1.32 | GitPython is a Python library used to interact with Git repositories +[google_auth](https://pypi.org/project/google_auth) | 2.37.0 | Google Authentication Library +[graphene](https://pypi.org/project/graphene) | 3.3 | GraphQL Framework for Python +[graphql_core](https://pypi.org/project/graphql_core) | 3.2.3 | GraphQL implementation for Python, a port of GraphQL.js, the JavaScript reference implementation for GraphQL. +[graphql_relay](https://pypi.org/project/graphql_relay) | 3.2.0 | Relay library for graphql-core +[greenlet](https://pypi.org/project/greenlet) | 3.1.1 | Lightweight in-process concurrent programming +[griffe](https://pypi.org/project/griffe) | 1.5.5 | Signatures for entire Python programs +[groq](https://pypi.org/project/groq) | 0.13.1 | The official Python library for the groq API +[guidata](https://pypi.org/project/guidata) | 3.7.1 | Automatic GUI generation for easy dataset editing and display +[h11](https://pypi.org/project/h11) | 0.14.0 | A pure-Python, bring-your-own-I/O implementation of HTTP/1.1 +[h2](https://pypi.org/project/h2) | 4.1.0 | HTTP/2 State-Machine based protocol implementation +[h5py](https://pypi.org/project/h5py) | 3.12.1 | Read and write HDF5 files from Python +[hatchling](https://pypi.org/project/hatchling) | 1.27.0 | Modern, extensible Python build backend +[holoviews](https://pypi.org/project/holoviews) | 1.20.0 | A high-level plotting API for the PyData ecosystem built on HoloViews. +[hpack](https://pypi.org/project/hpack) | 4.0.0 | Pure-Python HPACK header compression +[html5lib](https://pypi.org/project/html5lib) | 1.1 | HTML parser based on the WHATWG HTML specification +[httpcore](https://pypi.org/project/httpcore) | 1.0.5 | A minimal low-level HTTP client. +[httpie](https://pypi.org/project/httpie) | 3.2.4 | HTTPie: modern, user-friendly command-line HTTP client for the API era. +[httpx](https://pypi.org/project/httpx) | 0.27.2 | The next generation HTTP client. +[httpx_sse](https://pypi.org/project/httpx_sse) | 0.4.0 | Consume Server-Sent Event (SSE) messages with HTTPX. +[huggingface_hub](https://pypi.org/project/huggingface_hub) | 0.28.1 | Client library to download and publish models, datasets and other repos on the huggingface.co hub +[hupper](https://pypi.org/project/hupper) | 1.12 | Integrated process monitor for developing and reloading daemons. +[hvplot](https://pypi.org/project/hvplot) | 0.11.2 | A high-level plotting API for the PyData ecosystem built on HoloViews. +[hypercorn](https://pypi.org/project/hypercorn) | 0.16.0 | A ASGI Server based on Hyper libraries and inspired by Gunicorn +[hyperframe](https://pypi.org/project/hyperframe) | 6.0.1 | HTTP/2 framing layer for Python +[hypothesis](https://pypi.org/project/hypothesis) | 6.122.3 | A library for property-based testing +[idna](https://pypi.org/project/idna) | 3.7 | Internationalized Domain Names in Applications (IDNA) +[imageio](https://pypi.org/project/imageio) | 2.33.1 | Library for reading and writing a wide range of image, video, scientific, and volumetric data formats. +[imagesize](https://pypi.org/project/imagesize) | 1.4.1 | Getting image size from png/jpeg/jpeg2000/gif file +[imbalanced_learn](https://pypi.org/project/imbalanced_learn) | 0.13.0 | Toolbox for imbalanced dataset in machine learning +[importlib_metadata](https://pypi.org/project/importlib_metadata) | 7.1.0 | Read metadata from Python packages +[inflection](https://pypi.org/project/inflection) | 0.5.1 | A port of Ruby on Rails inflector to Python +[iniconfig](https://pypi.org/project/iniconfig) | 2.0.0 | brain-dead simple config-ini parsing +[intervaltree](https://pypi.org/project/intervaltree) | 3.0.2 | Editable interval tree data structure for Python 2 and 3 +[ipycanvas](https://pypi.org/project/ipycanvas) | 0.13.3 | Interactive widgets library exposing the browser's Canvas API +[ipykernel](https://pypi.org/project/ipykernel) | 6.29.5 | IPython Kernel for Jupyter +[ipyleaflet](https://pypi.org/project/ipyleaflet) | 0.19.2 | A Jupyter widget for dynamic Leaflet maps +[ipympl](https://pypi.org/project/ipympl) | 0.9.6 | Matplotlib Jupyter Extension +[ipython](https://pypi.org/project/ipython) | 8.32.0 | IPython: Productive Interactive Computing +[ipython_genutils](https://pypi.org/project/ipython_genutils) | 0.2.0 | Vestigial utilities from IPython +[ipython_sql](https://pypi.org/project/ipython_sql) | 0.5.0 | RDBMS access via IPython +[ipywidgets](https://pypi.org/project/ipywidgets) | 8.1.5 | Jupyter interactive widgets +[isoduration](https://pypi.org/project/isoduration) | 20.11.0 | Operations with ISO 8601 durations +[isort](https://pypi.org/project/isort) | 5.13.2 | A Python utility / library to sort Python imports. +[itsdangerous](https://pypi.org/project/itsdangerous) | 2.2.0 | Safely pass data to untrusted environments and back. +[janus](https://pypi.org/project/janus) | 2.0.0 | Mixed sync-async queue to interoperate between asyncio tasks and classic threads +[jaraco_classes](https://pypi.org/project/jaraco_classes) | 3.4.0 | Utility functions for Python class constructs +[jaraco_context](https://pypi.org/project/jaraco_context) | 6.0.1 | Useful decorators and context managers +[jaraco_functools](https://pypi.org/project/jaraco_functools) | 4.1.0 | Functools like those found in stdlib +[jedi](https://pypi.org/project/jedi) | 0.19.2 | An autocompletion tool for Python that can be used for text editors. +[jellyfish](https://pypi.org/project/jellyfish) | 1.1.3 | Approximate and phonetic matching of strings. +[jinja2](https://pypi.org/project/jinja2) | 3.1.2 | A very fast and expressive template engine. +[jiter](https://pypi.org/project/jiter) | 0.8.2 | Fast iterable JSON parser. +[joblib](https://pypi.org/project/joblib) | 1.4.2 | Lightweight pipelining with Python functions +[json5](https://pypi.org/project/json5) | 0.9.14 | A Python implementation of the JSON5 data format. +[jsonpatch](https://pypi.org/project/jsonpatch) | 1.33 | Apply JSON-Patches (RFC 6902) +[jsonpath_python](https://pypi.org/project/jsonpath_python) | 1.0.6 | A more powerful JSONPath implementation in modern python +[jsonpointer](https://pypi.org/project/jsonpointer) | 2.4 | Identify specific nodes in a JSON document (RFC 6901) +[jsonschema](https://pypi.org/project/jsonschema) | 4.19.2 | An implementation of JSON Schema validation for Python +[jsonschema_specifications](https://pypi.org/project/jsonschema_specifications) | 2023.12.1 | The JSON Schema meta-schemas and vocabularies, exposed as a Registry +[julia](https://pypi.org/project/julia) | 0.6.2 | Julia/Python bridge with IPython support. +[jupyter](https://pypi.org/project/jupyter) | 1.1.1 | Jupyter metapackage. Install all the Jupyter components in one go. +[jupyter_bokeh](https://pypi.org/project/jupyter_bokeh) | 4.0.5 | A Jupyter extension for rendering Bokeh content. +[jupyter_client](https://pypi.org/project/jupyter_client) | 8.6.2 | Jupyter protocol implementation and client libraries +[jupyter_console](https://pypi.org/project/jupyter_console) | 6.6.3 | Jupyter terminal console +[jupyter_core](https://pypi.org/project/jupyter_core) | 5.7.2 | Jupyter core package. A base package on which Jupyter projects rely. +[jupyter_events](https://pypi.org/project/jupyter_events) | 0.10.0 | Jupyter Event System library +[jupyter_leaflet](https://pypi.org/project/jupyter_leaflet) | 0.19.2 | ipyleaflet extensions for JupyterLab and Jupyter Notebook +[jupyter_lsp](https://pypi.org/project/jupyter_lsp) | 2.2.5 | Multi-Language Server WebSocket proxy for Jupyter Notebook/Lab server +[jupyter_server](https://pypi.org/project/jupyter_server) | 2.14.2 | The backend—i.e. core services, APIs, and REST endpoints—to Jupyter web applications. +[jupyter_server_terminals](https://pypi.org/project/jupyter_server_terminals) | 0.5.3 | A Jupyter Server Extension Providing Terminals. +[jupyterlab](https://pypi.org/project/jupyterlab) | 4.3.5 | JupyterLab computational environment +[jupyterlab_pygments](https://pypi.org/project/jupyterlab_pygments) | 0.3.0 | Pygments theme using JupyterLab CSS variables +[jupyterlab_server](https://pypi.org/project/jupyterlab_server) | 2.27.3 | A set of server components for JupyterLab and JupyterLab like applications. +[jupyterlab_widgets](https://pypi.org/project/jupyterlab_widgets) | 3.0.13 | Jupyter interactive widgets for JupyterLab +[keras](https://pypi.org/project/keras) | 3.8.0 | Multi-backend Keras +[keyring](https://pypi.org/project/keyring) | 25.6.0 | Store and access your passwords safely. +[kiwisolver](https://pypi.org/project/kiwisolver) | 1.4.8 | A fast implementation of the Cassowary constraint solver +[langchain](https://pypi.org/project/langchain) | 0.3.18 | Building applications with LLMs through composability +[langchain_core](https://pypi.org/project/langchain_core) | 0.3.34 | Building applications with LLMs through composability +[langchain_text_splitters](https://pypi.org/project/langchain_text_splitters) | 0.3.6 | LangChain text splitting utilities +[langsmith](https://pypi.org/project/langsmith) | 0.2.11 | Client library to connect to the LangSmith LLM Tracing and Evaluation Platform. +[lazy_loader](https://pypi.org/project/lazy_loader) | 0.4 | Makes it easy to load subpackages and functions on demand. +[linkify_it_py](https://pypi.org/project/linkify_it_py) | 2.0.2 | Links recognition library with FULL unicode support. +[llvmlite](https://pypi.org/project/llvmlite) | 0.44.0 | lightweight wrapper around basic LLVM functionality +[lmfit](https://pypi.org/project/lmfit) | 1.3.1 | Least-Squares Minimization with Bounds and Constraints +[locket](https://pypi.org/project/locket) | 1.0.0 | File-based locks for Python on Linux and Windows +[logfire_api](https://pypi.org/project/logfire_api) | 3.5.3 | Shim for the Logfire SDK which does nothing unless Logfire is installed +[lxml](https://pypi.org/project/lxml) | 5.3.0 | Powerful and Pythonic XML processing library combining libxml2/libxslt with the ElementTree API. +[mako](https://pypi.org/project/mako) | 1.3.5 | A super-fast templating language that borrows the best ideas from the existing templating languages. +[markdown](https://pypi.org/project/markdown) | 3.5.1 | Python implementation of John Gruber's Markdown. +[markdown_it_py](https://pypi.org/project/markdown_it_py) | 2.2.0 | Python port of markdown-it. Markdown parsing, done right! +[markupsafe](https://pypi.org/project/markupsafe) | 3.0.2 | Safely add untrusted strings to HTML/XML markup. +[matplotlib](https://pypi.org/project/matplotlib) | 3.10.0 | Python plotting package +[matplotlib_inline](https://pypi.org/project/matplotlib_inline) | 0.1.7 | Inline Matplotlib backend for Jupyter +[maturin](https://pypi.org/project/maturin) | 1.8.1 | Build and publish crates with pyo3, cffi and uniffi bindings as well as rust binaries as python packages +[mccabe](https://pypi.org/project/mccabe) | 0.7.0 | McCabe checker, plugin for flake8 +[mdit_py_plugins](https://pypi.org/project/mdit_py_plugins) | 0.3.5 | Collection of plugins for markdown-it-py +[mdurl](https://pypi.org/project/mdurl) | 0.1.2 | Markdown URL utilities +[mercantile](https://pypi.org/project/mercantile) | 1.2.1 | Web mercator XYZ tile utilities +[mergedeep](https://pypi.org/project/mergedeep) | 1.3.4 | A deep merge function for 🐍. +[missingno](https://pypi.org/project/missingno) | 0.5.1 | Missing data visualization module for Python. +[mistralai](https://pypi.org/project/mistralai) | 1.2.5 | Python Client SDK for the Mistral AI API. +[mistune](https://pypi.org/project/mistune) | 2.0.5 | A sane Markdown parser with useful plugins and renderers +[mizani](https://pypi.org/project/mizani) | 0.11.4 | Scales for Python +[ml_dtypes](https://pypi.org/project/ml_dtypes) | 0.5.0 | +[mlxtend](https://pypi.org/project/mlxtend) | 0.23.3 | Machine Learning Library Extensions +[more_itertools](https://pypi.org/project/more_itertools) | 10.2.0 | More routines for operating on iterables, beyond itertools +[mpl_scatter_density](https://pypi.org/project/mpl_scatter_density) | 0.7 | Matplotlib helpers to make density scatter plots +[mpld3](https://pypi.org/project/mpld3) | 0.5.8 | D3 Viewer for Matplotlib +[mpmath](https://pypi.org/project/mpmath) | 1.3.0 | Python library for arbitrary-precision floating-point arithmetic +[msal](https://pypi.org/project/msal) | 1.30.0 | The Microsoft Authentication Library (MSAL) for Python library enables your app to access the Microsoft Cloud by supporting authentication of us +[msal_extensions](https://pypi.org/project/msal_extensions) | 1.2.0 | Microsoft Authentication Library extensions (MSAL EX) provides a persistence API that can save your data on disk, encrypted on Windows, macOS an +[msgpack](https://pypi.org/project/msgpack) | 1.1.0 | MessagePack serializer +[multidict](https://pypi.org/project/multidict) | 6.1.0 | multidict implementation +[multipledispatch](https://pypi.org/project/multipledispatch) | 1.0.0 | Multiple dispatch +[mutagen](https://pypi.org/project/mutagen) | 1.47.0 | read and write audio tags for many formats +[mypy](https://pypi.org/project/mypy) | 1.14.0 | Optional static typing for Python +[mypy_extensions](https://pypi.org/project/mypy_extensions) | 1.0.0 | Type system extensions for programs checked with the mypy type checker. +[mysql_connector_python](https://pypi.org/project/mysql_connector_python) | 8.0.21 | MySQL driver written in Python +[namex](https://pypi.org/project/namex) | 0.0.8 | A simple utility to separate the implementation of your Python package and its public API surface. +[narwhals](https://pypi.org/project/narwhals) | 1.21.1 | Extremely lightweight compatibility layer between dataframe libraries +[nbclient](https://pypi.org/project/nbclient) | 0.10.0 | A client library for executing notebooks. Formerly nbconvert's ExecutePreprocessor. +[nbconvert](https://pypi.org/project/nbconvert) | 7.16.1 | Converting Jupyter Notebooks (.ipynb files) to other formats +[nbformat](https://pypi.org/project/nbformat) | 5.10.4 | The Jupyter Notebook format +[nest_asyncio](https://pypi.org/project/nest_asyncio) | 1.6.0 | Patch asyncio to allow nested event loops +[networkx](https://pypi.org/project/networkx) | 3.4.2 | Python package for creating and manipulating graphs and networks +[nh3](https://pypi.org/project/nh3) | 0.2.18 | Python bindings to the ammonia HTML sanitization library. +[nltk](https://pypi.org/project/nltk) | 3.9.1 | Natural Language Toolkit +[notebook](https://pypi.org/project/notebook) | 7.3.1 | Jupyter Notebook - A web-based notebook environment for interactive computing +[notebook_shim](https://pypi.org/project/notebook_shim) | 0.2.4 | A shim layer for notebook traits and config +[numba](https://pypi.org/project/numba) | 0.61.0 | compiling Python code using LLVM +[numpy](https://pypi.org/project/numpy) | 2.1.3 | Fundamental package for array computing in Python +[numpydoc](https://pypi.org/project/numpydoc) | 1.6.0 | Sphinx extension to support docstrings in Numpy format +[openai](https://pypi.org/project/openai) | 1.61.1 | The official Python library for the openai API +[opencv_python](https://pypi.org/project/opencv_python) | 4.10.0.84 | Wrapper package for OpenCV python bindings. +[openpyxl](https://pypi.org/project/openpyxl) | 3.1.2 | A Python library to read/write Excel 2010 xlsx/xlsm files +[optree](https://pypi.org/project/optree) | 0.13.1 | Optimized PyTree Utilities. +[optuna](https://pypi.org/project/optuna) | 3.6.1 | A hyperparameter optimization framework +[orjson](https://pypi.org/project/orjson) | 3.10.12 | Fast, correct Python JSON library supporting dataclasses, datetimes, and numpy +[osqp](https://pypi.org/project/osqp) | 0.6.7.post3 | OSQP: The Operator Splitting QP Solver +[outcome](https://pypi.org/project/outcome) | 1.3.0.post0 | Capture the outcome of Python function calls. +[overrides](https://pypi.org/project/overrides) | 7.7.0 | A decorator to automatically detect mismatch when overriding a method. +[packaging](https://pypi.org/project/packaging) | 24.2 | Core utilities for Python packages +[pandas](https://pypi.org/project/pandas) | 2.2.3 | Powerful data structures for data analysis, time series, and statistics +[pandocfilters](https://pypi.org/project/pandocfilters) | 1.5.0 | Utilities for writing pandoc filters in python +[panel](https://pypi.org/project/panel) | 1.6.0 | The powerful data exploration & web app framework for Python. +[papermill](https://pypi.org/project/papermill) | 2.6.0 | Parameterize and run Jupyter and nteract Notebooks +[param](https://pypi.org/project/param) | 2.1.1 | Make your Python code clearer and more reliable by declaring Parameters. +[paramiko](https://pypi.org/project/paramiko) | 2.8.0 | SSH2 protocol library +[parso](https://pypi.org/project/parso) | 0.8.4 | A Python Parser +[partd](https://pypi.org/project/partd) | 1.4.0 | Appendable key-value storage +[pathspec](https://pypi.org/project/pathspec) | 0.11.0 | Utility library for gitignore style pattern matching of file paths. +[patsy](https://pypi.org/project/patsy) | 0.5.6 | A Python package for describing statistical models and for building design matrices. +[pep8](https://pypi.org/project/pep8) | 1.7.1 | Python style guide checker +[pexpect](https://pypi.org/project/pexpect) | 4.8.0 | Pexpect allows easy control of interactive console applications. +[pg8000](https://pypi.org/project/pg8000) | 1.23.0 | PostgreSQL interface library +[pickleshare](https://pypi.org/project/pickleshare) | 0.7.5 | Tiny 'shelve'-like database with concurrency support +[pillow](https://pypi.org/project/pillow) | 11.1.0 | Python Imaging Library (Fork) +[pint](https://pypi.org/project/pint) | 0.23 | Physical quantities module +[pip](https://pypi.org/project/pip) | 24.3.1 | The PyPA recommended tool for installing Python packages. +[pkginfo](https://pypi.org/project/pkginfo) | 1.11.2 | Query metadata from sdists / bdists / installed packages. +[platformdirs](https://pypi.org/project/platformdirs) | 4.2.2 | A small Python package for determining appropriate platform-specific dirs, e.g. a `user data dir`. +[plotly](https://pypi.org/project/plotly) | 5.24.1 | An open-source, interactive data visualization library for Python +[plotnine](https://pypi.org/project/plotnine) | 0.13.6 | A Grammar of Graphics for Python +[plotpy](https://pypi.org/project/plotpy) | 2.7.2 | Curve and image plotting tools for Python/Qt applications +[pluggy](https://pypi.org/project/pluggy) | 1.5.0 | plugin and hook calling mechanisms for python +[ply](https://pypi.org/project/ply) | 3.11 | Python Lex & Yacc +[polars](https://pypi.org/project/polars) | 1.22.0 | Blazingly fast DataFrame library +[portalocker](https://pypi.org/project/portalocker) | 2.7.0 | Wraps the portalocker recipe for easy usage +[prettytable](https://pypi.org/project/prettytable) | 3.3.0 | A simple Python library for easily displaying tabular data in a visually appealing ASCII table format +[prince](https://pypi.org/project/prince) | 0.15.0 | Factor analysis in Python: PCA, CA, MCA, MFA, FAMD, GPA +[priority](https://pypi.org/project/priority) | 2.0.0 | A pure-Python implementation of the HTTP/2 priority tree +[prometheus_client](https://pypi.org/project/prometheus_client) | 0.18.0 | Python client for the Prometheus monitoring system. +[prompt_toolkit](https://pypi.org/project/prompt_toolkit) | 3.0.48 | Library for building powerful interactive command lines in Python +[propcache](https://pypi.org/project/propcache) | 0.2.1 | Accelerated property cache +[protobuf](https://pypi.org/project/protobuf) | 5.27.3 | +[psutil](https://pypi.org/project/psutil) | 5.9.8 | Cross-platform lib for process and system monitoring in Python. +[psygnal](https://pypi.org/project/psygnal) | 0.11.1 | Fast python callback/event system modeled after Qt Signals +[ptpython](https://pypi.org/project/ptpython) | 3.0.29 | Python REPL build on top of prompt_toolkit +[ptyprocess](https://pypi.org/project/ptyprocess) | 0.7.0 | Run a subprocess in a pseudo terminal +[pure_eval](https://pypi.org/project/pure_eval) | 0.2.2 | Safely evaluate AST nodes without side effects +[pyarrow](https://pypi.org/project/pyarrow) | 19.0.0 | Python library for Apache Arrow +[pyasn1](https://pypi.org/project/pyasn1) | 0.4.8 | ASN.1 types and codecs +[pyasn1_modules](https://pypi.org/project/pyasn1_modules) | 0.2.8 | A collection of ASN.1-based protocols modules. +[pybind11](https://pypi.org/project/pybind11) | 2.13.6 | Seamless operability between C++11 and Python +[pycodestyle](https://pypi.org/project/pycodestyle) | 2.12.0 | Python style guide checker +[pycparser](https://pypi.org/project/pycparser) | 2.22 | C parser in Python +[pycryptodomex](https://pypi.org/project/pycryptodomex) | 3.20.0 | Cryptographic library for Python +[pyct](https://pypi.org/project/pyct) | 0.5.0 | Python package common tasks for users (e.g. copy examples, fetch data, ...) +[pydantic](https://pypi.org/project/pydantic) | 2.10.6 | Data validation using Python type hints +[pydantic_ai](https://pypi.org/project/pydantic_ai) | 0.0.24 | Agent Framework / shim to use Pydantic with LLMs +[pydantic_ai_slim](https://pypi.org/project/pydantic_ai_slim) | 0.0.24 | Agent Framework / shim to use Pydantic with LLMs, slim package +[pydantic_core](https://pypi.org/project/pydantic_core) | 2.27.2 | Core functionality for Pydantic validation and serialization +[pydantic_graph](https://pypi.org/project/pydantic_graph) | 0.0.24 | Graph and state machine library +[pydeck](https://pypi.org/project/pydeck) | 0.9.1 | Widget for deck.gl maps +[pydocstyle](https://pypi.org/project/pydocstyle) | 6.3.0 | Python docstring style checker +[pydub](https://pypi.org/project/pydub) | 0.25.1 | Manipulate audio with an simple and easy high level interface +[pyerfa](https://pypi.org/project/pyerfa) | 2.0.1.4 | Python bindings for ERFA +[pyflakes](https://pypi.org/project/pyflakes) | 3.2.0 | passive checker of Python programs +[pygments](https://pypi.org/project/pygments) | 2.19.1 | Pygments is a syntax highlighting package written in Python. +[pyjwt](https://pypi.org/project/pyjwt) | 2.8.0 | JSON Web Token implementation in Python +[pylint](https://pypi.org/project/pylint) | 3.1.0 | python code static checker +[pylint_venv](https://pypi.org/project/pylint_venv) | 3.0.3 | pylint-venv provides a Pylint init-hook to use the same Pylint installation with different virtual environments. +[pyls_spyder](https://pypi.org/project/pyls_spyder) | 0.4.0 | Spyder extensions for the python-lsp-server +[pymongo](https://pypi.org/project/pymongo) | 4.10.1 | Python driver for MongoDB +[pympler](https://pypi.org/project/pympler) | 1.0.1 | A development tool to measure, monitor and analyze the memory behavior of Python objects. +[pynacl](https://pypi.org/project/pynacl) | 1.5.0 | Python binding to the Networking and Cryptography (NaCl) library +[pynndescent](https://pypi.org/project/pynndescent) | 0.5.12 | Nearest Neighbor Descent +[pyodbc](https://pypi.org/project/pyodbc) | 5.2.0 | DB API module for ODBC +[pyogrio](https://pypi.org/project/pyogrio) | 0.10.0 | Vectorized spatial vector file format I/O using GDAL/OGR +[pyomo](https://pypi.org/project/pyomo) | 6.8.2 | Pyomo: Python Optimization Modeling Objects +[pypandoc](https://pypi.org/project/pypandoc) | 1.5 | Thin wrapper for pandoc. +[pyparsing](https://pypi.org/project/pyparsing) | 3.2.1 | pyparsing module - Classes and methods to define and execute parsing grammars +[pypdf](https://pypi.org/project/pypdf) | 5.1.0 | A pure-python PDF library capable of splitting, merging, cropping, and transforming PDF files +[pyproj](https://pypi.org/project/pyproj) | 3.7.0 | Python interface to PROJ (cartographic projections and coordinate transformations library) +[pyproject_hooks](https://pypi.org/project/pyproject_hooks) | 1.1.0 | Wrappers to call pyproject.toml-based build backend hooks. +[pyqt5](https://pypi.org/project/pyqt5) | 5.15.10 | Python bindings for the Qt cross platform application toolkit +[pyqt5_qt5](https://pypi.org/project/pyqt5_qt5) | 5.15.2 | The subset of a Qt installation needed by PyQt5. +[pyqt5_sip](https://pypi.org/project/pyqt5_sip) | 12.16.1 | The sip module support for PyQt5 +[pyqtgraph](https://pypi.org/project/pyqtgraph) | 0.13.7 | Scientific Graphics and GUI Library for Python +[pyqtwebengine](https://pypi.org/project/pyqtwebengine) | 5.15.6 | Python bindings for the Qt WebEngine framework +[pyqtwebengine_qt5](https://pypi.org/project/pyqtwebengine_qt5) | 5.15.2 | The subset of a Qt installation needed by PyQtWebEngine. +[pyserial](https://pypi.org/project/pyserial) | 3.5 | Python Serial Port Extension +[pysocks](https://pypi.org/project/pysocks) | 1.7.1 | A Python SOCKS client module. See https://github.com/Anorov/PySocks for more information. +[pyspnego](https://pypi.org/project/pyspnego) | 0.11.2 | Windows Negotiate Authentication Client and Server +[pytest](https://pypi.org/project/pytest) | 8.2.2 | pytest: simple powerful testing with Python +[python_barcode](https://pypi.org/project/python_barcode) | 0.15.1 | Create standard barcodes with Python. No external modules needed. (optional Pillow support included). +[python_dateutil](https://pypi.org/project/python_dateutil) | 2.8.2 | Extensions to the standard Python datetime module +[python_dotenv](https://pypi.org/project/python_dotenv) | 1.0.1 | Read key-value pairs from a .env file and set them as environment variables +[python_json_logger](https://pypi.org/project/python_json_logger) | 2.0.7 | A python library adding a json log formatter +[python_lsp_black](https://pypi.org/project/python_lsp_black) | 2.0.0 | Black plugin for the Python LSP Server +[python_lsp_jsonrpc](https://pypi.org/project/python_lsp_jsonrpc) | 1.1.2 | JSON RPC 2.0 server library +[python_lsp_server](https://pypi.org/project/python_lsp_server) | 1.12.0 | Python Language Server for the Language Server Protocol +[python_multipart](https://pypi.org/project/python_multipart) | 0.0.9 | A streaming multipart parser for Python +[python_slugify](https://pypi.org/project/python_slugify) | 8.0.4 | A Python slugify application that also handles Unicode +[pythonqwt](https://pypi.org/project/pythonqwt) | 0.14.4 | Qt plotting widgets for Python +[pytoolconfig](https://pypi.org/project/pytoolconfig) | 1.3.1 | Python tool configuration +[pytz](https://pypi.org/project/pytz) | 2024.1 | World timezone definitions, modern and historical +[pyusb](https://pypi.org/project/pyusb) | 1.3.1 | Easy USB access for Python +[pyviz_comms](https://pypi.org/project/pyviz_comms) | 3.0.3 | A JupyterLab extension for rendering HoloViz content. +[pywavelets](https://pypi.org/project/pywavelets) | 1.8.0 | PyWavelets, wavelet transform module +[pywin32](https://pypi.org/project/pywin32) | 308 | Python for Window Extensions +[pywin32_ctypes](https://pypi.org/project/pywin32_ctypes) | 0.2.2 | A (partial) reimplementation of pywin32 using ctypes/cffi +[pywinpty](https://pypi.org/project/pywinpty) | 2.0.14 | Pseudo terminal support for Windows from Python. +[pyyaml](https://pypi.org/project/pyyaml) | 6.0.2 | YAML parser and emitter for Python +[pyzmq](https://pypi.org/project/pyzmq) | 26.2.0 | Python bindings for 0MQ +[qdarkstyle](https://pypi.org/project/qdarkstyle) | 3.2.3 | The most complete dark/light style sheet for C++/Python and Qt applications +[qdldl](https://pypi.org/project/qdldl) | 0.1.7.post5 | QDLDL, a free LDL factorization routine. +[qrcode](https://pypi.org/project/qrcode) | 8.0 | QR Code image generator +[qstylizer](https://pypi.org/project/qstylizer) | 0.2.2 | Stylesheet Generator for PyQt{4-5}/PySide{1-2} +[qtawesome](https://pypi.org/project/qtawesome) | 1.3.1 | FontAwesome icons in PyQt and PySide applications +[qtconsole](https://pypi.org/project/qtconsole) | 5.5.2 | Jupyter Qt console +[qtpy](https://pypi.org/project/qtpy) | 2.4.1 | Provides an abstraction layer on top of the various Qt bindings (PyQt5/6 and PySide2/6). +[quantecon](https://pypi.org/project/quantecon) | 0.7.2 | Import the main names to top level. +[quart](https://pypi.org/project/quart) | 0.19.4 | A Python ASGI web microframework with the same API as Flask +[rapidfuzz](https://pypi.org/project/rapidfuzz) | 3.9.6 | rapid fuzzy string matching +[readme_renderer](https://pypi.org/project/readme_renderer) | 44.0 | readme_renderer is a library for rendering readme descriptions for Warehouse +[redis](https://pypi.org/project/redis) | 5.0.8 | Python client for Redis database and key-value store +[referencing](https://pypi.org/project/referencing) | 0.35.1 | JSON Referencing + Python +[regex](https://pypi.org/project/regex) | 2024.11.6 | Alternative regular expression module, to replace re. +[reportlab](https://pypi.org/project/reportlab) | 4.2.5 | The Reportlab Toolkit +[requests](https://pypi.org/project/requests) | 2.32.3 | Python HTTP for Humans. +[requests_ntlm](https://pypi.org/project/requests_ntlm) | 1.3.0 | This package allows for HTTP NTLM authentication using the requests library. +[requests_toolbelt](https://pypi.org/project/requests_toolbelt) | 1.0.0 | A utility belt for advanced users of python-requests +[rfc3339_validator](https://pypi.org/project/rfc3339_validator) | 0.1.4 | A pure python RFC3339 validator +[rfc3986](https://pypi.org/project/rfc3986) | 2.0.0 | Validating URI References per RFC 3986 +[rfc3986_validator](https://pypi.org/project/rfc3986_validator) | 0.1.1 | Pure python rfc3986 validator +[rich](https://pypi.org/project/rich) | 13.9.4 | Render rich text, tables, progress bars, syntax highlighting, markdown and more to the terminal +[rope](https://pypi.org/project/rope) | 1.12.0 | a python refactoring library... +[rpds_py](https://pypi.org/project/rpds_py) | 0.22.3 | Python bindings to Rust's persistent data structures (rpds) +[rsa](https://pypi.org/project/rsa) | 4.7.2 | Pure-Python RSA implementation +[rtree](https://pypi.org/project/rtree) | 1.1.0 | R-Tree spatial index for Python GIS +[rx](https://pypi.org/project/rx) | 3.1.1 | Reactive Extensions (Rx) for Python +[scikit_image](https://pypi.org/project/scikit_image) | 0.25.0 | Image processing in Python +[scikit_learn](https://pypi.org/project/scikit_learn) | 1.6.1 | A set of python modules for machine learning and data mining +[scipy](https://pypi.org/project/scipy) | 1.15.1 | Fundamental algorithms for scientific computing in Python +[scramp](https://pypi.org/project/scramp) | 1.4.5 | An implementation of the SCRAM protocol. +[scs](https://pypi.org/project/scs) | 3.2.7.post2 | Splitting conic solver +[seaborn](https://pypi.org/project/seaborn) | 0.13.2 | Statistical data visualization +[send2trash](https://pypi.org/project/send2trash) | 1.8.2 | Send file to trash natively under Mac OS X, Windows and Linux +[setuptools](https://pypi.org/project/setuptools) | 75.6.0 | Easily download, build, install, upgrade, and uninstall Python packages +[shapely](https://pypi.org/project/shapely) | 2.0.6 | Manipulation and analysis of geometric objects +[simplejson](https://pypi.org/project/simplejson) | 3.19.3 | Simple, fast, extensible JSON encoder/decoder for Python +[simpy](https://pypi.org/project/simpy) | 4.0.1 | Event discrete, process based simulation for Python. +[six](https://pypi.org/project/six) | 1.16.0 | Python 2 and 3 compatibility utilities +[sklearn_compat](https://pypi.org/project/sklearn_compat) | 0.1.3 | Ease support for compatible scikit-learn estimators across versions +[smmap](https://pypi.org/project/smmap) | 5.0.0 | A pure Python implementation of a sliding window memory map manager +[sniffio](https://pypi.org/project/sniffio) | 1.3.0 | Sniff out which async library your code is running under +[snowballstemmer](https://pypi.org/project/snowballstemmer) | 2.2.0 | This package provides 29 stemmers for 28 languages generated from Snowball algorithms. +[sortedcontainers](https://pypi.org/project/sortedcontainers) | 2.4.0 | Sorted Containers -- Sorted List, Sorted Dict, Sorted Set +[sounddevice](https://pypi.org/project/sounddevice) | 0.5.1 | Play and Record Sound with Python +[soupsieve](https://pypi.org/project/soupsieve) | 2.6 | A modern CSS selector implementation for Beautiful Soup. +[sphinx](https://pypi.org/project/sphinx) | 7.3.7 | Python documentation generator +[sphinx_rtd_theme](https://pypi.org/project/sphinx_rtd_theme) | 3.0.2 | Read the Docs theme for Sphinx +[sphinxcontrib_applehelp](https://pypi.org/project/sphinxcontrib_applehelp) | 2.0.0 | sphinxcontrib-applehelp is a Sphinx extension which outputs Apple help books +[sphinxcontrib_devhelp](https://pypi.org/project/sphinxcontrib_devhelp) | 2.0.0 | sphinxcontrib-devhelp is a sphinx extension which outputs Devhelp documents +[sphinxcontrib_htmlhelp](https://pypi.org/project/sphinxcontrib_htmlhelp) | 2.1.0 | sphinxcontrib-htmlhelp is a sphinx extension which renders HTML help files +[sphinxcontrib_jquery](https://pypi.org/project/sphinxcontrib_jquery) | 4.1 | Extension to include jQuery on newer Sphinx releases +[sphinxcontrib_jsmath](https://pypi.org/project/sphinxcontrib_jsmath) | 1.0.1 | A sphinx extension which renders display math in HTML via JavaScript +[sphinxcontrib_qthelp](https://pypi.org/project/sphinxcontrib_qthelp) | 2.0.0 | sphinxcontrib-qthelp is a sphinx extension which outputs QtHelp documents +[sphinxcontrib_serializinghtml](https://pypi.org/project/sphinxcontrib_serializinghtml) | 2.0.0 | sphinxcontrib-serializinghtml is a sphinx extension which outputs "serialized" HTML files (json and pickle) +[spyder](https://pypi.org/project/spyder) | 5.5.6 | The Scientific Python Development Environment +[spyder_kernels](https://pypi.org/project/spyder_kernels) | 2.5.2 | Jupyter kernels for Spyder's console +[sqlalchemy](https://pypi.org/project/sqlalchemy) | 2.0.35 | Database Abstraction Library +[sqlite_bro](https://pypi.org/project/sqlite_bro) | 0.13.1 | a graphic SQLite Client in 1 Python file +[sqlite_fts4](https://pypi.org/project/sqlite_fts4) | 1.0.3 | Python functions for working with SQLite FTS4 search +[sqlite_utils](https://pypi.org/project/sqlite_utils) | 3.38 | CLI tool and Python library for manipulating SQLite databases +[sqlparse](https://pypi.org/project/sqlparse) | 0.5.3 | A non-validating SQL parser. +[squarify](https://pypi.org/project/squarify) | 0.4.4 | Pure Python implementation of the squarify treemap layout algorithm +[sspilib](https://pypi.org/project/sspilib) | 0.2.0 | SSPI API bindings for Python +[stack_data](https://pypi.org/project/stack_data) | 0.6.3 | Extract data from python stack frames and tracebacks for informative displays +[starlette](https://pypi.org/project/starlette) | 0.41.3 | The little ASGI library that shines. +[statsmodels](https://pypi.org/project/statsmodels) | 0.14.4 | Statistical computations and models for Python +[streamlit](https://pypi.org/project/streamlit) | 1.41.1 | A faster way to build and share data apps +[streamz](https://pypi.org/project/streamz) | 0.6.3 | Streams +[sympy](https://pypi.org/project/sympy) | 1.13.3 | Computer algebra system (CAS) in Python +[tabulate](https://pypi.org/project/tabulate) | 0.9.0 | Pretty-print tabular data +[tblib](https://pypi.org/project/tblib) | 3.0.0 | Traceback serialization library. +[tenacity](https://pypi.org/project/tenacity) | 9.0.0 | Retry code until it succeeds +[termcolor](https://pypi.org/project/termcolor) | 2.5.0 | ANSI color formatting for output in terminal +[terminado](https://pypi.org/project/terminado) | 0.18.1 | Tornado websocket backend for the Xterm.js Javascript terminal emulator library. +[text_unidecode](https://pypi.org/project/text_unidecode) | 1.3 | The most basic Text::Unidecode port +[textdistance](https://pypi.org/project/textdistance) | 4.6.3 | Compute distance between the two texts. +[thefuzz](https://pypi.org/project/thefuzz) | 0.22.1 | Fuzzy string matching in python +[threadpoolctl](https://pypi.org/project/threadpoolctl) | 3.5.0 | threadpoolctl +[three_merge](https://pypi.org/project/three_merge) | 0.1.1 | Simple library for merging two strings with respect to a base one +[tifffile](https://pypi.org/project/tifffile) | 2025.1.10 | Read and write TIFF files +[tiktoken](https://pypi.org/project/tiktoken) | 0.8.0 | tiktoken is a fast BPE tokeniser for use with OpenAI's models +[tinycss2](https://pypi.org/project/tinycss2) | 1.4.0 | A tiny CSS parser +[tokenizers](https://pypi.org/project/tokenizers) | 0.21.0 | +[toml](https://pypi.org/project/toml) | 0.10.2 | Python Library for Tom's Obvious, Minimal Language +[tomli](https://pypi.org/project/tomli) | 2.2.1 | A lil' TOML parser +[tomli_w](https://pypi.org/project/tomli_w) | 1.1.0 | A lil' TOML writer +[tomlkit](https://pypi.org/project/tomlkit) | 0.13.2 | Style preserving TOML library +[toolz](https://pypi.org/project/toolz) | 1.0.0 | List processing tools and functional utilities +[tornado](https://pypi.org/project/tornado) | 6.4.2 | Tornado is a Python web framework and asynchronous networking library, originally developed at FriendFeed. +[tqdm](https://pypi.org/project/tqdm) | 4.66.4 | Fast, Extensible Progress Meter +[traitlets](https://pypi.org/project/traitlets) | 5.14.1 | Traitlets Python configuration system +[traittypes](https://pypi.org/project/traittypes) | 0.2.1 | Scipy trait types +[trio](https://pypi.org/project/trio) | 0.28.0 | A friendly Python library for async concurrency and I/O +[trove_classifiers](https://pypi.org/project/trove_classifiers) | 2024.10.21.16 | Canonical source for classifiers on PyPI (pypi.org). +[twine](https://pypi.org/project/twine) | 6.0.1 | Collection of utilities for publishing packages on PyPI +[types_python_dateutil](https://pypi.org/project/types_python_dateutil) | 2.9.0.20240316 | Typing stubs for python-dateutil +[types_requests](https://pypi.org/project/types_requests) | 2.32.0.20241016 | Typing stubs for requests +[typing_extensions](https://pypi.org/project/typing_extensions) | 4.12.2 | Backported and Experimental Type Hints for Python 3.8+ +[typing_inspect](https://pypi.org/project/typing_inspect) | 0.9.0 | Runtime inspection utilities for typing module. +[tzdata](https://pypi.org/project/tzdata) | 2024.1 | Provider of IANA time zone data +[tzlocal](https://pypi.org/project/tzlocal) | 5.2 | tzinfo object for the local timezone +[uc_micro_py](https://pypi.org/project/uc_micro_py) | 1.0.1 | Micro subset of unicode data files for linkify-it-py projects. +[ujson](https://pypi.org/project/ujson) | 5.10.0 | Ultra fast JSON encoder and decoder for Python +[umap_learn](https://pypi.org/project/umap_learn) | 0.5.6 | Uniform Manifold Approximation and Projection +[uncertainties](https://pypi.org/project/uncertainties) | 3.2.2 | calculations with values with uncertainties, error propagation +[uri_template](https://pypi.org/project/uri_template) | 1.3.0 | RFC 6570 URI Template Processor +[urllib3](https://pypi.org/project/urllib3) | 2.2.3 | HTTP library with thread-safe connection pooling, file post, and more. +[uvicorn](https://pypi.org/project/uvicorn) | 0.34.0 | The lightning-fast ASGI server. +[vega_datasets](https://pypi.org/project/vega_datasets) | 0.9.0 | A Python package for offline access to Vega datasets +[waitress](https://pypi.org/project/waitress) | 3.0.0 | Waitress WSGI server +[watchdog](https://pypi.org/project/watchdog) | 6.0.0 | Filesystem events monitoring +[wcwidth](https://pypi.org/project/wcwidth) | 0.2.13 | Measures the displayed width of unicode strings in a terminal +[webcolors](https://pypi.org/project/webcolors) | 24.11.1 | A library for working with the color formats defined by HTML and CSS. +[webencodings](https://pypi.org/project/webencodings) | 0.5.1 | Character encoding aliases for legacy web content +[websocket_client](https://pypi.org/project/websocket_client) | 1.8.0 | WebSocket client for Python with low level API options +[websockets](https://pypi.org/project/websockets) | 14.2 | An implementation of the WebSocket Protocol (RFC 6455 & 7692) +[werkzeug](https://pypi.org/project/werkzeug) | 3.1.3 | The comprehensive WSGI web application library. +[whatthepatch](https://pypi.org/project/whatthepatch) | 1.0.7 | A patch parsing and application library. +[wheel](https://pypi.org/project/wheel) | 0.45.1 | A built-package format for Python +[widgetsnbextension](https://pypi.org/project/widgetsnbextension) | 4.0.13 | Jupyter interactive widgets for Jupyter Notebook +[winpython](https://pypi.org/project/winpython) | 13.1.20250222 | WinPython distribution tools, including WPPM +[wordcloud](https://pypi.org/project/wordcloud) | 1.9.4 | A little word cloud generator +[wsproto](https://pypi.org/project/wsproto) | 1.2.0 | WebSockets state-machine based protocol implementation +[xarray](https://pypi.org/project/xarray) | 2025.1.1 | N-D labeled arrays and datasets in Python +[xlsxwriter](https://pypi.org/project/xlsxwriter) | 3.1.9 | A Python module for creating Excel XLSX files. +[xyzservices](https://pypi.org/project/xyzservices) | 2023.10.1 | Source of XYZ tiles providers +[yapf](https://pypi.org/project/yapf) | 0.40.1 | A formatter for Python code. +[yarl](https://pypi.org/project/yarl) | 1.18.3 | Yet another URL library +[yt_dlp](https://pypi.org/project/yt_dlp) | 2023.7.6 | A youtube-dl fork with additional features and patches +[zict](https://pypi.org/project/zict) | 3.0.0 | Mutable mapping tools +[zipp](https://pypi.org/project/zipp) | 3.21.0 | Backport of pathlib-compatible object wrapper for zip files +[zstandard](https://pypi.org/project/zstandard) | 0.23.0 | Zstandard bindings for Python + +
    diff --git a/changelogs/WinPythonslim-64bit-3.13.2.0_History.md b/changelogs/WinPythonslim-64bit-3.13.2.0_History.md new file mode 100644 index 00000000..5fdad5b4 --- /dev/null +++ b/changelogs/WinPythonslim-64bit-3.13.2.0_History.md @@ -0,0 +1,170 @@ +## History of changes for WinPython-64bit 3.13.2.0slim + +The following changes were made to WinPython-64bit distribution since version 3.13.1.0slim. + +
    +### Tools + +Removed packages: + + * [Pandoc](https://pandoc.org/) 3.1.9 (a universal document converter) + +### Python packages + +New packages: + + * [cohere](https://pypi.org/project/cohere) 5.13.12 () + * [cvxpy](https://pypi.org/project/cvxpy) 1.6.0 (A domain-specific language for modeling convex optimization problems in Python.) + * [cytoolz](https://pypi.org/project/cytoolz) 1.0.1 (Cython implementation of Toolz: High performance functional utilities) + * [deap](https://pypi.org/project/deap) 1.4.2 (Distributed Evolutionary Algorithms in Python) + * [faker](https://pypi.org/project/faker) 33.3.1 (Faker is a Python package that generates fake data for you.) + * [fastavro](https://pypi.org/project/fastavro) 1.10.0 (Fast read/write of AVRO files) + * [geopandas](https://pypi.org/project/geopandas) 1.0.1 (Geographic pandas extensions) + * [httpx_sse](https://pypi.org/project/httpx_sse) 0.4.0 (Consume Server-Sent Event (SSE) messages with HTTPX.) + * [nh3](https://pypi.org/project/nh3) 0.2.18 (Python bindings to the ammonia HTML sanitization library.) + * [osqp](https://pypi.org/project/osqp) 0.6.7.post3 (OSQP: The Operator Splitting QP Solver) + * [prince](https://pypi.org/project/prince) 0.15.0 (Factor analysis in Python: PCA, CA, MCA, MFA, FAMD, GPA) + * [pydantic_graph](https://pypi.org/project/pydantic_graph) 0.0.24 (Graph and state machine library) + * [pyogrio](https://pypi.org/project/pyogrio) 0.10.0 (Vectorized spatial vector file format I/O using GDAL/OGR) + * [pyproj](https://pypi.org/project/pyproj) 3.7.0 (Python interface to PROJ (cartographic projections and coordinate transformations library)) + * [pyspnego](https://pypi.org/project/pyspnego) 0.11.2 (Windows Negotiate Authentication Client and Server) + * [pyusb](https://pypi.org/project/pyusb) 1.3.1 (Easy USB access for Python) + * [pywavelets](https://pypi.org/project/pywavelets) 1.8.0 (PyWavelets, wavelet transform module) + * [qdldl](https://pypi.org/project/qdldl) 0.1.7.post5 (QDLDL, a free LDL factorization routine.) + * [scs](https://pypi.org/project/scs) 3.2.7.post2 (Splitting conic solver) + * [shapely](https://pypi.org/project/shapely) 2.0.6 (Manipulation and analysis of geometric objects) + * [sklearn_compat](https://pypi.org/project/sklearn_compat) 0.1.3 (Ease support for compatible scikit-learn estimators across versions) + * [squarify](https://pypi.org/project/squarify) 0.4.4 (Pure Python implementation of the squarify treemap layout algorithm) + * [sspilib](https://pypi.org/project/sspilib) 0.2.0 (SSPI API bindings for Python) + * [termcolor](https://pypi.org/project/termcolor) 2.5.0 (ANSI color formatting for output in terminal) + * [thefuzz](https://pypi.org/project/thefuzz) 0.22.1 (Fuzzy string matching in python) + * [tiktoken](https://pypi.org/project/tiktoken) 0.8.0 (tiktoken is a fast BPE tokeniser for use with OpenAI's models) + * [tokenizers](https://pypi.org/project/tokenizers) 0.21.0 () + * [types_requests](https://pypi.org/project/types_requests) 2.32.0.20241016 (Typing stubs for requests) + +Upgraded packages: + + * [array_api_compat](https://pypi.org/project/array_api_compat) 1.8 → 1.10.0 (A wrapper around NumPy and other array libraries to make them compatible with the Array API standard) + * [baresql](https://pypi.org/project/baresql) 0.8.0 → 1.0.0 (playing SQL directly on Python datas) + * [blinker](https://pypi.org/project/blinker) 1.7.0 → 1.9.0 (Fast, simple object-to-object and broadcast signaling) + * [bokeh](https://pypi.org/project/bokeh) 3.6.1 → 3.6.3 (Interactive plots and applications in the browser from Python) + * [clarabel](https://pypi.org/project/clarabel) 0.9.0 → 0.10.0 (Clarabel Conic Interior Point Solver for Rust / Python) + * [cryptography](https://pypi.org/project/cryptography) 41.0.5 → 44.0.0 (cryptography is a package which provides cryptographic recipes and primitives to Python developers.) + * [dill](https://pypi.org/project/dill) 0.3.7 → 0.3.9 (serialize all of Python) + * [docutils](https://pypi.org/project/docutils) 0.20.1 → 0.21.2 (Docutils -- Python Documentation Utilities) + * [duckdb](https://pypi.org/project/duckdb) 1.1.3 → 1.2.0 (DuckDB in-process database) + * [flask](https://pypi.org/project/flask) 3.0.3 → 3.1.0 (A simple framework for building complex web applications.) + * [flit](https://pypi.org/project/flit) 3.9.0 → 3.10.1 (A simple packaging tool for simple packages.) + * [flit_core](https://pypi.org/project/flit_core) 3.9.0 → 3.10.1 (Distribution-building parts of Flit. See flit package for more information) + * [griffe](https://pypi.org/project/griffe) 1.5.4 → 1.5.5 (Signatures for entire Python programs) + * [huggingface_hub](https://pypi.org/project/huggingface_hub) 0.27.0 → 0.28.1 (Client library to download and publish models, datasets and other repos on the huggingface.co hub) + * [hypothesis](https://pypi.org/project/hypothesis) 6.108.5 → 6.122.3 (A library for property-based testing) + * [imbalanced_learn](https://pypi.org/project/imbalanced_learn) 0.12.3 → 0.13.0 (Toolbox for imbalanced dataset in machine learning) + * [ipycanvas](https://pypi.org/project/ipycanvas) 0.13.2 → 0.13.3 (Interactive widgets library exposing the browser's Canvas API) + * [ipympl](https://pypi.org/project/ipympl) 0.9.4 → 0.9.6 (Matplotlib Jupyter Extension) + * [ipython](https://pypi.org/project/ipython) 8.26.0 → 8.32.0 (IPython: Productive Interactive Computing) + * [janus](https://pypi.org/project/janus) 1.0.0 → 2.0.0 (Mixed sync-async queue to interoperate between asyncio tasks and classic threads) + * [jaraco_context](https://pypi.org/project/jaraco_context) 5.3.0 → 6.0.1 (Useful decorators and context managers) + * [jaraco_functools](https://pypi.org/project/jaraco_functools) 4.0.1 → 4.1.0 (Functools like those found in stdlib) + * [jedi](https://pypi.org/project/jedi) 0.19.1 → 0.19.2 (An autocompletion tool for Python that can be used for text editors.) + * [jupyterlab](https://pypi.org/project/jupyterlab) 4.3.4 → 4.3.5 (JupyterLab computational environment) + * [keras](https://pypi.org/project/keras) 3.7.0 → 3.8.0 (Multi-backend Keras) + * [keyring](https://pypi.org/project/keyring) 25.2.1 → 25.6.0 (Store and access your passwords safely.) + * [kiwisolver](https://pypi.org/project/kiwisolver) 1.4.7 → 1.4.8 (A fast implementation of the Cassowary constraint solver) + * [langchain](https://pypi.org/project/langchain) 0.3.13 → 0.3.18 (Building applications with LLMs through composability) + * [langchain_core](https://pypi.org/project/langchain_core) 0.3.28 → 0.3.34 (Building applications with LLMs through composability) + * [langchain_text_splitters](https://pypi.org/project/langchain_text_splitters) 0.3.4 → 0.3.6 (LangChain text splitting utilities) + * [langsmith](https://pypi.org/project/langsmith) 0.2.6 → 0.2.11 (Client library to connect to the LangSmith LLM Tracing and Evaluation Platform.) + * [llvmlite](https://pypi.org/project/llvmlite) 0.44.0rc2 → 0.44.0 (lightweight wrapper around basic LLVM functionality) + * [logfire_api](https://pypi.org/project/logfire_api) 2.11.0 → 3.5.3 (Shim for the Logfire SDK which does nothing unless Logfire is installed) + * [markupsafe](https://pypi.org/project/markupsafe) 2.1.1 → 3.0.2 (Safely add untrusted strings to HTML/XML markup.) + * [maturin](https://pypi.org/project/maturin) 1.7.0 → 1.8.1 (Build and publish crates with pyo3, cffi and uniffi bindings as well as rust binaries as python packages) + * [mlxtend](https://pypi.org/project/mlxtend) 0.22.0 → 0.23.3 (Machine Learning Library Extensions) + * [msgpack](https://pypi.org/project/msgpack) 1.0.4 → 1.1.0 (MessagePack serializer) + * [narwhals](https://pypi.org/project/narwhals) 1.15.2 → 1.21.1 (Extremely lightweight compatibility layer between dataframe libraries) + * [numba](https://pypi.org/project/numba) 0.61.0rc2 → 0.61.0 (compiling Python code using LLVM) + * [openai](https://pypi.org/project/openai) 1.58.1 → 1.61.1 (The official Python library for the openai API) + * [panel](https://pypi.org/project/panel) 1.5.4 → 1.6.0 (The powerful data exploration & web app framework for Python.) + * [pillow](https://pypi.org/project/pillow) 11.0.0 → 11.1.0 (Python Imaging Library (Fork)) + * [plotpy](https://pypi.org/project/plotpy) 2.7.0 → 2.7.2 (Curve and image plotting tools for Python/Qt applications) + * [polars](https://pypi.org/project/polars) 1.18.0 → 1.22.0 (Blazingly fast DataFrame library) + * [pyarrow](https://pypi.org/project/pyarrow) 18.1.0 → 19.0.0 (Python library for Apache Arrow) + * [pydantic](https://pypi.org/project/pydantic) 2.10.4 → 2.10.6 (Data validation using Python type hints) + * [pydantic_ai](https://pypi.org/project/pydantic_ai) 0.0.15 → 0.0.24 (Agent Framework / shim to use Pydantic with LLMs) + * [pydantic_ai_slim](https://pypi.org/project/pydantic_ai_slim) 0.0.15 → 0.0.24 (Agent Framework / shim to use Pydantic with LLMs, slim package) + * [pygments](https://pypi.org/project/pygments) 2.18.0 → 2.19.1 (Pygments is a syntax highlighting package written in Python.) + * [pyomo](https://pypi.org/project/pyomo) 6.8.0 → 6.8.2 (Pyomo: Python Optimization Modeling Objects) + * [pyparsing](https://pypi.org/project/pyparsing) 3.1.2 → 3.2.1 (pyparsing module - Classes and methods to define and execute parsing grammars) + * [pypdf](https://pypi.org/project/pypdf) 3.15.2 → 5.1.0 (A pure-python PDF library capable of splitting, merging, cropping, and transforming PDF files) + * [Python](http://www.python.org/) 3.13.1 → 3.13.2 (Python programming language with standard library) + * [pythonqwt](https://pypi.org/project/pythonqwt) 0.14.2 → 0.14.4 (Qt plotting widgets for Python) + * [qrcode](https://pypi.org/project/qrcode) 7.4.2 → 8.0 (QR Code image generator) + * [readme_renderer](https://pypi.org/project/readme_renderer) 35.0 → 44.0 (readme_renderer is a library for rendering readme descriptions for Warehouse) + * [redis](https://pypi.org/project/redis) 5.0.3 → 5.0.8 (Python client for Redis database and key-value store) + * [reportlab](https://pypi.org/project/reportlab) 4.2.2 → 4.2.5 (The Reportlab Toolkit) + * [requests_ntlm](https://pypi.org/project/requests_ntlm) 1.1.0 → 1.3.0 (This package allows for HTTP NTLM authentication using the requests library.) + * [scikit_learn](https://pypi.org/project/scikit_learn) 1.6.0 → 1.6.1 (A set of python modules for machine learning and data mining) + * [scipy](https://pypi.org/project/scipy) 1.14.1 → 1.15.1 (Fundamental algorithms for scientific computing in Python) + * [scramp](https://pypi.org/project/scramp) 1.4.1 → 1.4.5 (An implementation of the SCRAM protocol.) + * [sounddevice](https://pypi.org/project/sounddevice) 0.4.6 → 0.5.1 (Play and Record Sound with Python) + * [soupsieve](https://pypi.org/project/soupsieve) 2.5 → 2.6 (A modern CSS selector implementation for Beautiful Soup.) + * [sphinx_rtd_theme](https://pypi.org/project/sphinx_rtd_theme) 2.0.0 → 3.0.2 (Read the Docs theme for Sphinx) + * [sphinxcontrib_applehelp](https://pypi.org/project/sphinxcontrib_applehelp) 1.0.8 → 2.0.0 (sphinxcontrib-applehelp is a Sphinx extension which outputs Apple help books) + * [sphinxcontrib_devhelp](https://pypi.org/project/sphinxcontrib_devhelp) 1.0.6 → 2.0.0 (sphinxcontrib-devhelp is a sphinx extension which outputs Devhelp documents) + * [sphinxcontrib_htmlhelp](https://pypi.org/project/sphinxcontrib_htmlhelp) 2.0.5 → 2.1.0 (sphinxcontrib-htmlhelp is a sphinx extension which renders HTML help files) + * [sphinxcontrib_qthelp](https://pypi.org/project/sphinxcontrib_qthelp) 1.0.7 → 2.0.0 (sphinxcontrib-qthelp is a sphinx extension which outputs QtHelp documents) + * [sphinxcontrib_serializinghtml](https://pypi.org/project/sphinxcontrib_serializinghtml) 1.1.9 → 2.0.0 (sphinxcontrib-serializinghtml is a sphinx extension which outputs "serialized" HTML files (json and pickle)) + * [sqlite_utils](https://pypi.org/project/sqlite_utils) 3.37 → 3.38 (CLI tool and Python library for manipulating SQLite databases) + * [sqlparse](https://pypi.org/project/sqlparse) 0.4.3 → 0.5.3 (A non-validating SQL parser.) + * [sympy](https://pypi.org/project/sympy) 1.13.2 → 1.13.3 (Computer algebra system (CAS) in Python) + * [tenacity](https://pypi.org/project/tenacity) 8.5.0 → 9.0.0 (Retry code until it succeeds) + * [textdistance](https://pypi.org/project/textdistance) 4.6.2 → 4.6.3 (Compute distance between the two texts.) + * [tifffile](https://pypi.org/project/tifffile) 2024.7.2 → 2025.1.10 (Read and write TIFF files) + * [tinycss2](https://pypi.org/project/tinycss2) 1.3.0 → 1.4.0 (A tiny CSS parser) + * [tomli](https://pypi.org/project/tomli) 2.0.1 → 2.2.1 (A lil' TOML parser) + * [tomli_w](https://pypi.org/project/tomli_w) 1.0.0 → 1.1.0 (A lil' TOML writer) + * [tomlkit](https://pypi.org/project/tomlkit) 0.12.3 → 0.13.2 (Style preserving TOML library) + * [toolz](https://pypi.org/project/toolz) 0.12.0 → 1.0.0 (List processing tools and functional utilities) + * [tornado](https://pypi.org/project/tornado) 6.4.1 → 6.4.2 (Tornado is a Python web framework and asynchronous networking library, originally developed at FriendFeed.) + * [trio](https://pypi.org/project/trio) 0.27.0 → 0.28.0 (A friendly Python library for async concurrency and I/O) + * [twine](https://pypi.org/project/twine) 4.0.1 → 6.0.1 (Collection of utilities for publishing packages on PyPI) + * [uncertainties](https://pypi.org/project/uncertainties) 3.1.7 → 3.2.2 (calculations with values with uncertainties, error propagation) + * [urllib3](https://pypi.org/project/urllib3) 2.0.3 → 2.2.3 (HTTP library with thread-safe connection pooling, file post, and more.) + * [uvicorn](https://pypi.org/project/uvicorn) 0.30.3 → 0.34.0 (The lightning-fast ASGI server.) + * [watchdog](https://pypi.org/project/watchdog) 4.0.1 → 6.0.0 (Filesystem events monitoring) + * [webcolors](https://pypi.org/project/webcolors) 1.12 → 24.11.1 (A library for working with the color formats defined by HTML and CSS.) + * [websockets](https://pypi.org/project/websockets) 13.1 → 14.2 (An implementation of the WebSocket Protocol (RFC 6455 & 7692)) + * [werkzeug](https://pypi.org/project/werkzeug) 3.0.3 → 3.1.3 (The comprehensive WSGI web application library.) + * [whatthepatch](https://pypi.org/project/whatthepatch) 1.0.2 → 1.0.7 (A patch parsing and application library.) + * [wheel](https://pypi.org/project/wheel) 0.44.0 → 0.45.1 (A built-package format for Python) + * [winpython](https://pypi.org/project/winpython) 11.2.20241228 → 13.1.20250222 (WinPython distribution tools, including WPPM) + * [xarray](https://pypi.org/project/xarray) 2024.11.0 → 2025.1.1 (N-D labeled arrays and datasets in Python) + * [zipp](https://pypi.org/project/zipp) 3.17.0 → 3.21.0 (Backport of pathlib-compatible object wrapper for zip files) + +Removed packages: + + * [adodbapi](https://pypi.org/project/adodbapi) 2.6.1.3 (A pure Python package implementing PEP 249 DB-API using Microsoft ADO.) + * [cachelib](https://pypi.org/project/cachelib) 0.13.0 (A collection of cache libraries in the same API interface.) + * [db_py](https://pypi.org/project/db_py) 0.5.4b1 (a db package that doesn't suck) + * [docopt](https://pypi.org/project/docopt) 0.6.2 (Pythonic argument parser, that will make you smile) + * [filterpy](https://pypi.org/project/filterpy) 1.4.5 (Kalman filtering and optimal estimation library) + * [flask_mail](https://pypi.org/project/flask_mail) 0.9.1 (Flask extension for sending email) + * [flask_session](https://pypi.org/project/flask_session) 0.5.0 (Server-side session support for Flask) + * [flask_sqlalchemy](https://pypi.org/project/flask_sqlalchemy) 3.0.5 (Add SQLAlchemy support to your Flask application.) + * [formlayout](https://pypi.org/project/formlayout) 1.2.1a1 (The most easy way to create Qt form dialogs and widgets with Python) + * [future](https://pypi.org/project/future) 0.18.2 (Clean single-source support for Python 3 and 2) + * [ntlm_auth](https://pypi.org/project/ntlm_auth) 1.5.0 (Creates NTLM authentication structures) + * [pdfrw](https://pypi.org/project/pdfrw) 0.4.post2 (PDF file reader/writer library) + * [ppci](https://pypi.org/project/ppci) 0.5.9 (A compiler for ARM, X86, MSP430, xtensa and more implemented in pure Python) + * [pybars3](https://pypi.org/project/pybars3) 0.9.7 (Handlebars.js templating for Python 3 and 2) + * [pymeta3](https://pypi.org/project/pymeta3) 0.5.1 (Pattern-matching language based on OMeta for Python 3 and 2) + * [pypng](https://pypi.org/project/pypng) 0.20220715.0 (Pure Python library for saving and loading PNG images) + * [pysimplegui](https://pypi.org/project/pysimplegui) 4.60.4 (Python GUIs for Humans) + * [pywinusb](https://pypi.org/project/pywinusb) 0.4.2 (A package that simplifies USB/HID communications on windows) + * [simplegeneric](https://pypi.org/project/simplegeneric) 0.8.1 (Simple generic functions (similar to Python's own len(), pickle.dump(), etc.)) + * [sspyrs](https://pypi.org/project/sspyrs) 0.3 (Lightweight interface for SSRS reports to python) + * [xmltodict](https://pypi.org/project/xmltodict) 0.13.0 (Makes working with XML feel like you are working with JSON) + + +
    +* * * diff --git a/changelogs/md5_sha1.txt b/changelogs/md5_sha1.txt index 330882ef..a5e7b0a5 100644 --- a/changelogs/md5_sha1.txt +++ b/changelogs/md5_sha1.txt @@ -1,3 +1,22 @@ +### WinPython 2025-01 release (March 1st, 2025) + + MD5 | SHA-1 | SHA-256 | Binary | Size | blake2b-256 +---------------------------------|------------------------------------------|------------------------------------------------------------------|-----------------------------------|--------------------|----------------------------------------------------------------- +8aef7e46e862e543d38bed851d0d6505 | fe32d81a13bfd830b5c2820eb9f545ea2dc3302d | 2bcb5bda5d6d27ffce3cccadd772599d534edcbcbca7cb59124e015b3919db68 | Winpython64-3.12.9.0dot.zip | 38 280 444 Bytes | 9f2a468504c56bfb28fec03e47c6526b546098801f21e5137a58dd302838cc6d +b6fdc51ec5aa7cc449e3e31ab4750899 | f623dc942a6e572a078a2cc71ddc0532d6fd7aef | bf240df0e6ba72499dbea42ba4638264bb777f4d59822df0033f421a342c5188 | Winpython64-3.12.9.0dot.7z | 23 093 610 Bytes | db09d389d7ac6a8e2cfb5369ad910ffcf60ee673894f0ad0a94386409f1d582c +39dcdd15299ac9a0aa068290432b6c89 | 80c48b7a91446019c1444b85be1124e8b27b9393 | bf1be605dffa97207ab108d9d8dcab2f51c597fc31bebb5e6067811c93402fd3 | Winpython64-3.12.9.0dot.exe | 23 308 650 Bytes | b4f20a6d870c99628fed5fa070ef4bf9312fabc91be926267ec9b9919d1f2353 +e5c92eca86d5063d7c927b87ca7a979a | eabb5add549cda18e7405c8dbe64f163ab92aa05 | 13a08f3bd516558ebca224bb44cc61d763e679b821a1bf240a700a093e7d47fc | Winpython64-3.12.9.0slim.7z | 616 678 094 Bytes | ddcb6f9118e3e2522e920049cb44d82fdcd8e48bfe5f7a30faf1706742971951 +688a2be695eda8f59d0cc690326d1299 | d9e9ddaea543964d9e9743aec86ee7b342f5480f | 02936d96bb488d111136dce11b08afa189b51f57f59d8d0e7068bea2a5fa67c0 | Winpython64-3.12.9.0slim.exe | 616 892 419 Bytes | bcb6fdccc898a2d70d0f8ba7f80d9a056062fcc5d4cc78845dc979ee46e9292e +6a8d945c058d9fb08b78235bbf8d7ae6 | bcbf848ed72de9b4595ee44faeec15a084408c06 | 0f984ca5dfc195a265a8b547be43891caed9a8770ba8a13b6f87b45990f12704 | Winpython64-3.13.2.0dot.zip | 39 737 933 Bytes | 10008fb4a9193332a1cf5a0d180e503d3860a708a3add9a021c1b23c72ac767a +51617e557c70a78f70153b92c784ea69 | 217e21a9292ede8ddc50f4628a0a031c2320be3b | 069f4a9a32b713f27d5a8f8ffccf2658580eeea7df7120b414b3fd74e7fc099e | Winpython64-3.13.2.0dot.7z | 24 777 973 Bytes | b2e6ae219ea69c5f212534cd8a52e0c2bf0506b272b643be5884a52251da4125 +7f509cb8aba38aa748b35014ef7d8c1c | a37826beb8474d678e6dac8d263c3062055e1050 | ecba739bd41459656b632306f316da73980bae84e62b540f14c03affb8ac2d93 | Winpython64-3.13.2.0dot.exe | 24 993 013 Bytes | 4f51cba5d6533bbe59367f925649da08c008cf40aaa564a1ee9134799311b83e +6486a208002d34492af762d33e51c058 | bd1af3dbd687ed1797ac61a85df74f25efb1578b | dcdcb0608d74333bfb987219150f418b0c9637328703a5c12786ad1e24d5485b | Winpython64-3.13.2.0slim.7z | 621 789 094 Bytes | 112a12e15435b200c22055407553879554e3487bed5118468ee2cd6a3c56fff2 +04b8e6e1dc61e2871b5cf522c76ab471 | 7d66dd128689ae80dbfdb589604572bdf204fc9b | 865c54d31aec95f3138b934a4c0a4ff440ac7a27d82b1a9667c61a80ec4d764f | Winpython64-3.13.2.0slim.exe | 622 004 549 Bytes | fd1ad38146a6323be31c7a35aa39c31dd26b6c3d9328da97b71c6a3dcea622f9 +99a59eda2bf37dfab76bcffcae9cd3a7 | 77df69ec8875a7733c60ce2f0d78ced356d7b4c9 | fc66c242a6fe975dd85c764bd1068ad944440684a2bdc8599c2e5a13b5ca29cd | Winpython64-3.14.0.0dota5b.zip | 40 495 265 Bytes | 8344a7e9a40d15d12fe6e3682b86a72ff512136d4cdc65ebca321cd3283c088e +a0a66a0d00aeefcc185327999fd044c8 | 501888e481f95f824ca7e3160ea117f4f302385e | 92a9a6da1faef872ade0905cf01471831da54ff628b722a4e1d5b4d2a9338f8c | Winpython64-3.14.0.0dota5b.7z | 25 110 864 Bytes | 38275cae601dbbd83fba9591930c893e71b7ea7a8333b2acc0a5a2bde85001bb +91d3e6ebb32677e6ed9674f5e91fc538 | 931baf8ea70e052e4d87d7dc89d8cdb9c3c277e2 | e4933634b52e0b4ae498ddd1302ecf2ccb8b3de95df8af5120f9f298c2b64d3d | Winpython64-3.14.0.0dota5b.exe | 25 325 904 Bytes | fe50cdcb5328813d783cf92b0b2bb16ef6330d7f45d6888fab1f0fcc208c1b16 + + ### WinPython 2024-05 release (January 3rd, 2025) MD5 | SHA-1 | SHA-256 | Binary | Size | blake2b-256 From 0b15d7585750979e6040dc59f19db381dd951196 Mon Sep 17 00:00:00 2001 From: stonebig Date: Sun, 2 Mar 2025 10:27:12 +0100 Subject: [PATCH 084/305] remove Julia detection from build --- make.py | 7 ------- winpython/utils.py | 10 ---------- 2 files changed, 17 deletions(-) diff --git a/make.py b/make.py index 40640f42..29b9fef1 100644 --- a/make.py +++ b/make.py @@ -119,7 +119,6 @@ class WinPythonDistributionBuilder: Builds a WinPython distribution. """ - JULIA_PATH_REL = r"\t\Julia\bin" # Relative path within WinPython dir NODEJS_PATH_REL = r"\n" # Relative path within WinPython dir def __init__( @@ -226,11 +225,6 @@ def get_tool_path(rel_path): path = self.winpy_dir / rel_path if self.winpy_dir else None return path if path and (path.is_file() or path.is_dir()) else None - julia_path = get_tool_path(self.JULIA_PATH_REL) - if julia_path: - julia_version = utils.get_julia_version(str(julia_path)) - installed_tools.append(("Julia", julia_version)) - nodejs_path = get_tool_path(self.NODEJS_PATH_REL) if nodejs_path: node_version = utils.get_nodejs_version(str(nodejs_path)) @@ -309,7 +303,6 @@ def pre_path_entries(self) -> list[str]: "DLLs", "Scripts", r"..\t", - r".." + self.JULIA_PATH_REL, r".." + self.NODEJS_PATH_REL, ] diff --git a/winpython/utils.py b/winpython/utils.py index 9c651c9b..d1ff43d7 100644 --- a/winpython/utils.py +++ b/winpython/utils.py @@ -260,16 +260,6 @@ def exec_run_cmd(args, path=None): return process.stdout -def get_r_version(path): - """Return version of the R installed in *path*""" - return exec_shell_cmd(r"dir ..\README.R*", path).splitlines()[-3].split("-")[-1] - - -def get_julia_version(path): - """Return version of the Julia installed in *path*""" - return exec_shell_cmd("julia.exe -v", path).splitlines()[0].split(" ")[-1] - - def get_nodejs_version(path): """Return version of the Nodejs installed in *path*""" return exec_shell_cmd("node -v", path).splitlines()[0] From 73b4876a5dbd9feab37f3620c4869ba215e9bc95 Mon Sep 17 00:00:00 2001 From: stonebig Date: Sun, 2 Mar 2025 10:47:49 +0100 Subject: [PATCH 085/305] simplify current build --- Qt5_requirements64.txt | 373 ------------- dot_requirements.txt | 6 +- generate_a_winpython_distro.bat | 29 +- generate_winpython_distros311_mkl.bat | 44 -- generate_winpython_distros311_qt5.bat | 37 -- ...t => generate_winpython_distros313_dot.bat | 24 +- ... => generate_winpython_distros313_slim.bat | 32 +- requirements64_slim.txt | 510 ++++++++++++++++++ requirements_mkl.txt | 370 ------------- 9 files changed, 570 insertions(+), 855 deletions(-) delete mode 100644 Qt5_requirements64.txt delete mode 100644 generate_winpython_distros311_mkl.bat delete mode 100644 generate_winpython_distros311_qt5.bat rename generate_winpython_distros312_dot.bat => generate_winpython_distros313_dot.bat (61%) rename generate_winpython_distros311_dot.bat => generate_winpython_distros313_slim.bat (50%) create mode 100644 requirements64_slim.txt delete mode 100644 requirements_mkl.txt diff --git a/Qt5_requirements64.txt b/Qt5_requirements64.txt deleted file mode 100644 index a72667c1..00000000 --- a/Qt5_requirements64.txt +++ /dev/null @@ -1,373 +0,0 @@ -# the essential -wheel -pywin32 - -# compilers -cython -pycparser -cffi -numba -maturin - -# done in pre-step in mkl -numpy -scipy -numexpr -##mkl_service - -# pytorch eco-system -Torch -torchvision -torchaudio -botorch -fastai -dask_ml - -#LLM huggingface -openai -transformers[torch] -accelerate - - -# complementary tools -mypy -black -pep8 -twine -pytest -coverage -hypothesis -pybind11 -flit -poetry -virtualenv -pympler - -sqlite_bro -baresql -idlex - -# scientific -matplotlib -sympy - -scikit_learn -scikit_image - -SQLAlchemy -alembic - -#statistic -statsmodels -pmdarima -pymc - -# to become skrub -dirty_cat - -pandas -# pandas-datareader -xarray - -#pdf -pdfrw -reportlab - -#git -gitdb -gitpython - -# Jupyter -jupyter -# jupyterlab, ipython -papermill -ipython_sql -ipympl -ipyleaflet -ipycanvas -#not popular jupyterlab_rise - -jedi - -# gui -seaborn -altair -plotnine -plotly -bokeh -datashader -holoviews -mpld3 -networkx -bqplot -imageio -imageio_ffmpeg -hvplot -wordcloud -panel - - -# gui geographic -geopandas -geopy -pydeck -# geoviews has no success -gdal - -#solvers -pycosat -ecos -qpsolvers -cvxpy -pulp - -# Qt5 - -# QT -spyder -pyzo -pyqtgraph -qtconsole -guiqwt -PythonQwt -guidata -formlayout -folium - -# web -Flask -Django -python_dotenv -uvicorn -beautifulsoup4 -regex -lxml -html5lib -requests -datasette -yarl -xmltodict -pystache -pysocks -pyjwt -mako - -# parallelize (and replace celery) -joblib -dask[complete] -dask_image -cloudpickle -fastparquet - -# write & read QRcode -python-barcode -qrcode -opencv-python - -# ports -pyodbc -pyserial -# pywinusb to replace per puysb+libusb-package ? -pywinusb - -#rust packages -duckdb -polars - -# excel -xlsxwriter -openpyxl - -# connect to other langages -julia -pythonnet -clrmagic - -ptpython - -# async -trio -trio-asyncio - -# large lange models -llm -llm_gpt4all -llm_llama_cpp -llm_markov -huggingface_hub - -imbalanced-learn - - -fastapi - - -# needs recent wheel for altai5 -#great_expectations - -datasette_graphql -sqlite_utils -db.py -aiosqlite - - -# compression -zstandard - -#2023-08-22 fuzz replacements -rapidfuzz - -# dashboards -streamlit -dash - -#popular 2023-08-23 -greenlet -Markdown -docopt -PyOpenGL -Sphinx -sphinx_rtd_theme -rx -bottleneck -pystache -pypandoc -scikit-optimize -fuzzywuzzy -loky -astropy -snuggs -rasterio -flask-session -python-multipart -filterpy -requests_ntlm - -swifter -emcee -zarr -pyflux -snakeviz -nbdime -simplegeneric -ipydatagrid - -simpy -supersmoother -mpl_scatter_density -ppci -nltk -simplejson -sounddevice -pygame -moviepy -altair-transform -altair_data_server -pygad -xgboost -xlwings -cvxopt -mpmath -#azure -azure-identity -azure-cosmos -azure-core -sspyrs - -# sql - data -adodbapi - - -sqlparse - -mysql_connector_python -pg8000 - -pymongo -redis - -#hdf files -h5py -tables -netCDF4 -# not_popular python-hdf4 - -cytoolz - -blosc - -brewer2mpl - -PyAudio - -lmfit - -# less popular cartographic -mercantile -pyepsg - -#preparing parquet -python_snappy -brotli - -feather_format - -jupyter_sphinx - -streamz - -vega_datasets - - -gmpy2 - -mlxtend - -quantecon - -quart - -hypercorn - -umap-learn -flask-sqlalchemy - -nlopt - -httpie -flask-Mail - -lz4 - -jupyter_bokeh - -pydeck - -wasmer -wasmer_compiler_cranelift -wasmer_compiler_singlepass - -nbval - -## onnxruntime - -pynndescent - -quadprog - -orjson - -jupyter_packaging - -deap - -tbats - -missingno - -# for flask -waitress - - - - diff --git a/dot_requirements.txt b/dot_requirements.txt index 68a29ece..c5453f90 100644 --- a/dot_requirements.txt +++ b/dot_requirements.txt @@ -1,5 +1,9 @@ # the essential sqlite_bro -#idlex +setuptools wheel +build +##msvc_runtime # end of requirements.txt + + diff --git a/generate_a_winpython_distro.bat b/generate_a_winpython_distro.bat index c2af1bcb..5bae6a99 100644 --- a/generate_a_winpython_distro.bat +++ b/generate_a_winpython_distro.bat @@ -27,7 +27,12 @@ rem 3.0 Generate Changelog and binaries rem "my_release_level" is optionaly set per the calling program ********************************************* rem set my_release_level= -if "%my_release_level%"=="" set my_release_level=b1 + +rem ! = ! = ! = ! = ! = ! = ! = ! = ! = ! = ! = ! = ! = ! = ! = ! = ! = ! = ! = ! = ! = ! = ! = ! = + +if "%my_release_level%"=="" set my_release_level= + +rem ! = ! = ! = ! = ! = ! = ! = ! = ! = ! = ! = ! = ! = ! = ! = ! = ! = ! = ! = ! = ! = ! = ! = ! = rem "my_create_installer" is optionaly set per the calling program if "%my_create_installer%"=="" set my_create_installer=True @@ -85,12 +90,16 @@ if %my_python_target%==311 ( ) if %my_python_target%==312 ( - set my_python_target_release=3128 - set my_release=0 + set my_python_target_release=3129 + set my_release=1 ) if %my_python_target%==313 ( - set my_python_target_release=3131 + set my_python_target_release=3132 + set my_release=1 +) +if %my_python_target%==314 ( + set my_python_target_release=3140 set my_release=0 ) @@ -229,18 +238,6 @@ call %my_WINPYDIRBASE%\scripts\env.bat set -echo ---------------------------------------- -echo 2.3 (%date% %time%) add mandatory packages for build 'msvc_runtime'.. still necessary ? 2024-12-22 dropped -echo ---------------------------------------- -echo ---------------------------------------- >>%my_archive_log% -echo 2.3 (%date% %time%) add mandatory packages for build 'msvc_runtime'.. still necessary ? 2024-12-22 dropped>>%my_archive_log% -echo ---------------------------------------- >>%my_archive_log% - -rem echo python -m pip install msvc_runtime --pre --no-index --trusted-host=None --find-links=%my_find_links% --upgrade -rem echo python -m pip install msvc_runtime --pre --no-index --trusted-host=None --find-links=%my_find_links% --upgrade>>%my_archive_log% -rem python -m pip install msvc_runtime --pre --no-index --trusted-host=None --find-links=%my_find_links% --upgrade - - echo ---------------------------------------- echo 2.4 (%date% %time%) add packages pre_requirements (if any) echo ---------------------------------------- diff --git a/generate_winpython_distros311_mkl.bat b/generate_winpython_distros311_mkl.bat deleted file mode 100644 index 9f28bf24..00000000 --- a/generate_winpython_distros311_mkl.bat +++ /dev/null @@ -1,44 +0,0 @@ -rem 20230821 add a pre_step with my_requirements_pre.txt + my_find_links_pre -rem this replace running manually from spyder the make.py -rem to launch from a winpython module 'make' directory - -set my_original_path=%path% - -set my_root_dir_for_builds=C:\WinP -set my_python_target=311 -set my_pyver=3.11 - -set my_flavor=mkl - -set my_release=0 - -set my_release_level= - -rem set my_create_installer=False -set my_create_installer=nsis.zip -set my_create_installer=7zip -rem set my_create_installer=False - -set my_arch=64 -set my_preclear_build_directory=Yes - -set tmp_reqdir=%my_root_dir_for_builds%\bd%my_python_target% - -rem 20230821 add a requirement_pre.txt + -set my_requirements_pre=C:\WinP\bd311\requirements_mkl_pre.txt -set my_find_links_pre=C:\WinP\packages_mkl.srcreq - -rem just mkl = 204 Mo total - -set my_requirements=C:\WinP\bd311\requirements_mkl.txt -set my_find_links=C:\WinP\packages.srcreq - -set my_source_dirs=C:\WinP\bd311\packages.win-amd64 -set my_toolsdirs=C:\WinP\bdTools\tools64 -set my_docsdirs=C:\WinP\bdDocs\docs -set my_install_options=--no-index --pre --trusted-host=None - -call %~dp0\generate_a_winpython_distro.bat - - -pause \ No newline at end of file diff --git a/generate_winpython_distros311_qt5.bat b/generate_winpython_distros311_qt5.bat deleted file mode 100644 index b5640e7f..00000000 --- a/generate_winpython_distros311_qt5.bat +++ /dev/null @@ -1,37 +0,0 @@ -rem this replace running manually from spyder the make.py -rem to launch from a winpython module 'make' directory - -set my_original_path=%path% - -set my_root_dir_for_builds=C:\WinP -set my_python_target=311 -set my_pyver=3.11 - -set my_flavor= - -set my_release=0 - -set my_release_level= - -rem set my_create_installer=False -set my_create_installer=nsis.zip -set my_create_installer=7zip - -set my_arch=64 -set my_preclear_build_directory=Yes - -set tmp_reqdir=%my_root_dir_for_builds%\bd%my_python_target% - -set my_requirements=C:\WinP\bd311\Qt5_requirements64.txt - -set my_find_links=C:\WinP\packages.srcreq - -set my_source_dirs=C:\WinP\bd311\packages.win-amd64 -set my_toolsdirs=C:\WinP\bdTools\tools64 -set my_docsdirs=C:\WinP\bdDocs\docs -set my_install_options=--no-index --pre --trusted-host=None - -call %~dp0\generate_a_winpython_distro.bat - - -pause \ No newline at end of file diff --git a/generate_winpython_distros312_dot.bat b/generate_winpython_distros313_dot.bat similarity index 61% rename from generate_winpython_distros312_dot.bat rename to generate_winpython_distros313_dot.bat index b69e3090..7090f779 100644 --- a/generate_winpython_distros312_dot.bat +++ b/generate_winpython_distros313_dot.bat @@ -4,8 +4,8 @@ rem to launch from a winpython module 'make' directory set my_original_path=%path% set my_root_dir_for_builds=C:\Winp -set my_python_target=312 -set my_pyver=3.12 +set my_python_target=313 +set my_pyver=3.13 set my_flavor=dot @@ -15,22 +15,32 @@ set my_release_level= rem set my_create_installer=False set my_create_installer=nsis.zip +set my_create_installer=.7z set my_create_installer=7zip rem 2024-07-14: ask both the 7zip auto executable and the .7z simple archive -set my_create_installer=7zip.7z - +rem set my_create_installer=False +rem set my_create_installer=7zip.7z +set my_create_installer=7zip.7z.zip set my_arch=64 set my_preclear_build_directory=Yes set tmp_reqdir=%my_root_dir_for_builds%\bd%my_python_target% -set my_requirements=C:\Winp\bd312\dot_requirements.txt +rem ****** THREADING +rem 20240629: handle cython-3.23 as a pre-requirement + +rem set my_requirements_pre=C:\WinP\bd313\requirements_pre.txt +rem set my_find_links_pre=C:\WinP\bd313\packages.win-amd64 + +rem ***** THREADING + +set my_requirements=C:\Winp\bd313\dot_requirements.txt set my_find_links=C:\Winp\packages.srcreq -set my_source_dirs=C:\Winp\bd312\packages.win-amd64 +set my_source_dirs=C:\Winp\bd313\packages.win-amd64 set my_toolsdirs=C:\Winp\bdTools\Tools.dot set my_docsdirs=C:\WinP\bdDocs\docs.dot @@ -42,7 +52,7 @@ call %~dp0\generate_a_winpython_distro.bat set my_arch=32 set my_preclear_build_directory=No -set my_source_dirs=C:\Winp\bd312\packages.win32 +set my_source_dirs=C:\Winp\bd313\packages.win32 rem call %~dp0\generate_a_winpython_distro.bat diff --git a/generate_winpython_distros311_dot.bat b/generate_winpython_distros313_slim.bat similarity index 50% rename from generate_winpython_distros311_dot.bat rename to generate_winpython_distros313_slim.bat index 1fdd2ff8..27c68db1 100644 --- a/generate_winpython_distros311_dot.bat +++ b/generate_winpython_distros313_slim.bat @@ -4,30 +4,48 @@ rem to launch from a winpython module 'make' directory set my_original_path=%path% set my_root_dir_for_builds=C:\Winp -set my_python_target=311 -set my_pyver=3.11 +set my_python_target=313 +set my_pyver=3.13 -set my_flavor=dot +set my_flavor=slim -set my_release=0 +set my_release= set my_release_level= rem set my_create_installer=False set my_create_installer=nsis.zip +set my_create_installer=.7z set my_create_installer=7zip +rem 2024-07-14: ask both the 7zip auto executable and the .7z simple archive +rem set my_create_installer=False +set my_create_installer=7zip.7z + set my_arch=64 set my_preclear_build_directory=Yes set tmp_reqdir=%my_root_dir_for_builds%\bd%my_python_target% -set my_requirements=C:\Winp\bd311\dot_requirements.txt +rem ****** THREADING +rem 20240629: handle cython-3.23 as a pre-requirement + +rem set my_requirements_pre=C:\WinP\bd313\requirements_pre.txt +rem set my_find_links_pre=C:\WinP\bd313\packages.win-amd64 + +rem ***** THREADING + +set my_requirements=C:\Winp\bd313\requirements64_slim.txt set my_find_links=C:\Winp\packages.srcreq -set my_source_dirs=C:\Winp\bd311\packages.win-amd64 +set my_source_dirs=C:\Winp\bd313\packages.win-amd64 + set my_toolsdirs=C:\Winp\bdTools\Tools.dot + +REM 2024-07-13:put back pandoc (so from 598Mo to 518Mo?) +set my_toolsdirs=C:\WinP\bdTools\tools64_pandoc_alone + set my_docsdirs=C:\WinP\bdDocs\docs.dot set my_install_options=--no-index --pre --trusted-host=None @@ -38,7 +56,7 @@ call %~dp0\generate_a_winpython_distro.bat set my_arch=32 set my_preclear_build_directory=No -set my_source_dirs=C:\Winp\bd311\packages.win32 +set my_source_dirs=C:\Winp\bd313\packages.win32 rem call %~dp0\generate_a_winpython_distro.bat diff --git a/requirements64_slim.txt b/requirements64_slim.txt new file mode 100644 index 00000000..9c0872cd --- /dev/null +++ b/requirements64_slim.txt @@ -0,0 +1,510 @@ +# 313 +# ortool 290MO UNCOMPRESSED +# re-add pandoc … 618Mo? +# 698 Mo after remoal of moviepy/imageio-ffmpeg +# 714 Mo after removal of maturin and WASM Klein +# 725Mo before removal of: maturin 7 Mo, WASM KLEIN example +#2024-09-22: swifter removed + +#2024-12-28 add pydantic_ai + +# the essential +wheel +pywin32 +build + + +# compilers +cython +pycparser +cffi + +# numeric stones +numpy + +scipy +sympy +Pillow +matplotlib + +pandas + +# sql - data + +pyodbc + + +SQLAlchemy +sqlparse +sqlite_bro +baresql +mysql_connector_python +pg8000 +ipython_sql + +XlsxWriter + +pymongo +redis + +# high numeric +#numexpr 2024-12-25: not worth it + +#h5py 2024-12-25: not worth it + +cytoolz +#netCDF4 2024-12-25: not worth it +xarray + +#Pulp 2024-12-25: not worth it + +scikit_learn +scikit_image + + + +# gui +jupyter +ipython + +spyder + +# seaborn wants patsy and statsmodels for linear modeling +seaborn +patsy +statsmodels + +holoviews +mpld3 + +# web +beautifulsoup4 + +lxml +html5lib +requests + + +simplejson + +flask + +# dev complements + +pytest +jedi +pep8 +pyflakes + +pylint + +numpydoc + +twine + +# other +networkx +nltk + +# PyAudio 2024-12-25: not worth it, no visibility of source +sounddevice + +pyserial + +#pdf + +reportlab + + +# Pierre Raybaut Stack (PyQt5 only for now) +plotpy +PythonQwt +guidata + +# for dask + +lmfit + +# Qt + +pyqtgraph + + +# yet other +julia + +# remember me why +certifi +click + + + +sphinx_rtd_theme +Sphinx +greenlet +rx + +# wheelhouse-uploader apache-libcloud (is heavy) + +Markdown + +prompt-toolkit +ptpython + +geopy + +wordcloud + + + +pycodestyle + +altair +nbconvert +pypandoc + + + + +fuzzywuzzy +#scikit_fuzzy +imageio + +#xlwings 2024-12-25 not worth it + +# parallelize (and replace celery) +joblib +#dask[complete] contains irrelevant pyarrow-hotfix +dask[array,dataframe,distributed,diagnostics] + +# dask 'bag' and 'delayed' +cloudpickle +toolz +partd + +brotli + + +pybind11 + +#SLIM_2024 pygame +plotnine + +mpl_scatter_density + + + + +#SLIM_2024 moviepy + + +streamz + + +# Tensorflow_world +###edward +###Keras +###keras_vis +###Tensorflow_cpu +###tensorflow_probability + +##keras-tuner + +# pytorch eco-system +#Torch +#torchvision +#torchaudio +#botorch +#lightning +#kornia +#transformers[torch] +#accelerate +#fidle (tensorboard-2.15.1 wants still protobuf<4.24 , problem with ortools) +## waiting for torch: +##fastai +##spacy + +# if we drop torch: jaxlib ml-dtypes numpy scipy jax opt-einsum +#jax[cpu] + +terminado + +# pywinpty added due link removed from terminado for PyPy3 +pywinpty + +Send2Trash + +vega_datasets + +regex + +#loky + +hvplot + +#clrmagic 2024-12-25 not Worth it +#pythonnet 2024-12-25 not Worth it + +cvxopt + +numba +##pyarrow + + +cvxpy +mypy + +datashader + +mlxtend + +##jupyterlab_rise + +simpy + + +trio + +imbalanced-learn + +tzlocal +astropy + +panel + +hypothesis +geopandas + +mercantile + +#rasterio 2024-12-25 not jangmin and maxsecure + +quantecon + +kiwisolver + +# automate notebooks 2019-04-26 +papermill + +autopep8 +black + +## winrt not yet + + +# python_language_server no more +python_lsp_server +pexpect + + +#swagger flask (still no asyncio choice) +#flask_accepts +#flaskerize +# flask_RESTplus ... shall be now flask-restx +quart +datasette +hypercorn + +#complementing asgi stack +#2023-03-19 no more with sqlalchemy2.0 +##databases[sqlite] + +## ibis-framework no big life + +folium +plotly + + +umap-learn +#SLIM_2024 virtualenv +pympler +## pipdeptree replaced par wppm + +##nlopt + +#2025-02-15 flask-sqlalchemy +#2025-02-15 flask-session +#2025-02-15 flask-Mail +python-dotenv +httpie +asgiref + +#SLIM_2024 importlib_metadata + + +##jupyterlab things +jupyterlab +widgetsnbextension + +##jupyterlab_launcher +jupyter_bokeh +#2023-05-21 too fragile: dask_labextension +#SLIM_2024 pydeck + +## jupyterlab3 only +jupyterlab-widgets + +## 2020-09-27 jupyterlab2 only +ipympl +ipyleaflet + +ipycanvas + +#SLIM_2024 wasmer +#SLIM_2024 wasmer_compiler_cranelift +#SLIM_2024 wasmer_compiler_singlepass + +fastapi + + +datasette_graphql +sqlite_utils +aiosqlite + + +## onnxruntime + +##sklearn-contrib-lightning +openpyxl +zstandard + + +pynndescent + + +flit +## 2023-10-15 (too constraining) poetry +## so moves to hatch +## buth hatch wants now uv.. a bit too much +hatchling + +#ecos 2024-12-25 + +##csvs_to_sqlite +datasette_graphql +sqlite_utils + +maturin + +orjson + + +#2023-08-22 fuzz replacements +rapidfuzz + +## waiting pyarrow on 3.11 oct 23th +streamlit + +## 2024-09-08 until plotly at least updates its lumnio thing https://github.com/plotly/plotly.py/pull/4685 +# dash +alembic + + +#webapps example needs +Django +#channels + + +## badly formed uvicorn[standard] +uvicorn +python-multipart +deap + +polars + +##timseries bis + + +# for SSRS +requests_ntlm +missingno + +##xgboost +# lightgbm ? +duckdb + + +# for flask +waitress + +#2023-10-08 soon:jupyterlab-lsp + +array-api-compat + + +mpmath + +openai + + +#azure +azure-identity +azure-cosmos +azure-core + +## build + +# write & read QRcode +python-barcode +qrcode +opencv-python + +#llm follow-up +# llm +#risk llm_gpt4all +# llm_llama_cpp +# llm_markov +# llm-python +huggingface_hub + + +#course of langchain https://learn.deeplearning.ai/langchain-chat-with-your-data +pypdf +yt_dlp +pydub + + +# new friends of panel (load psygnal, a qt-like signaling) +anywidget + +keras + + + +# pyomo becomes a frequent wrapper nowodays + +langchain +pyomo +#NUMPY2_WAIT highspy +#pymoo 2024-12-25 not well maintained + +clarabel +#SLIM_2024 ortools + +#waiting cvxpy +scs +optuna + + +#pyarrow complement +adbc_driver_manager +#adbc_driver_sqlite +#backport optional importlib_resources + +#cartopy 2024-12-26 use geopandas more popular (that include gdal via pyogrio) + +#2024-12-26 agent ai things +pydantic_ai +#skrub replaces dirty_cat, seems needing torch +termcolor +tiktoken + +# from Microsoft own distro +thefuzz +tabulate +squarify +PyWavelets +prince +faker + +pyusb diff --git a/requirements_mkl.txt b/requirements_mkl.txt deleted file mode 100644 index a2a94317..00000000 --- a/requirements_mkl.txt +++ /dev/null @@ -1,370 +0,0 @@ -# the essential -wheel -pywin32 - -# compilers -cython -pycparser -cffi -numba -maturin - -# done in pre-step -## numpy -## scipy -## numexpr -## mkl_service - -# pytorch eco-system -#Torch -#torchvision -#torchaudio -#botorch -#fastai -#dask_ml - -#LLM huggingface -#openai -#transformers[torch] -#accelerate - - -# complementary tools -mypy -black -pep8 -twine -pytest -coverage -hypothesis -pybind11 -flit -poetry -virtualenv -pympler - -sqlite_bro -baresql -idlex - -# scientific -matplotlib -sympy - -scikit_learn -scikit_image - -SQLAlchemy -alembic - -#statistic -statsmodels -pmdarima -pymc - -# to become skrub -dirty_cat - -pandas -# pandas-datareader -xarray - -#pdf -pdfrw -reportlab - -#git -gitdb -gitpython - -# Jupyter -jupyter -# jupyterlab, ipython -papermill -ipython_sql -ipympl -ipyleaflet -ipycanvas -#not popular jupyterlab_rise - -jedi - -# gui -seaborn -altair -plotnine -plotly -bokeh -datashader -holoviews -mpld3 -networkx -bqplot -imageio -imageio_ffmpeg -hvplot -wordcloud -panel - - -# gui geographic -geopandas -geopy -pydeck -# geoviews has no success -gdal - -#solvers -pycosat -ecos -qpsolvers -cvxpy -pulp - -# Qt5 - -# QT -spyder -pyzo -pyqtgraph -qtconsole -guiqwt -PythonQwt -guidata -formlayout -folium - -# web -Flask -Django -python_dotenv -uvicorn -beautifulsoup4 -regex -lxml -html5lib -requests -datasette -yarl -xmltodict -pystache -pysocks -pyjwt -mako - -# parallelize (and replace celery) -joblib -dask[complete] -dask_image -cloudpickle -fastparquet - -# write & read QRcode -python-barcode -qrcode -opencv-python - -# ports -pyodbc -pyserial -# pywinusb to replace per puysb+libusb-package ? -pywinusb - -#rust packages -duckdb -polars - -# excel -xlsxwriter -openpyxl - -# connect to other langages -julia -pythonnet -clrmagic - -ptpython - -# async -trio -trio-asyncio - -# large lange models -llm -llm_gpt4all -llm_llama_cpp -llm_markov -huggingface_hub - -imbalanced-learn - - -fastapi - - -# needs recent wheel for altai5 -#great_expectations - -datasette_graphql -sqlite_utils -db.py -aiosqlite - - -# compression -zstandard - -#2023-08-22 fuzz replacements -rapidfuzz - -# dashboards -streamlit -dash - -#popular 2023-08-23 -greenlet -Markdown -docopt -PyOpenGL -Sphinx -sphinx_rtd_theme -rx -bottleneck -pystache -pypandoc -scikit-optimize -fuzzywuzzy -loky -astropy -snuggs -rasterio -flask-session -python-multipart -filterpy -requests_ntlm - -swifter -emcee -zarr -pyflux -snakeviz -nbdime -simplegeneric -ipydatagrid - -simpy -supersmoother -mpl_scatter_density -ppci -nltk -simplejson -sounddevice -pygame -moviepy -altair-transform -altair_data_server -pygad -xgboost -xlwings -cvxopt -mpmath -#azure -azure-identity -azure-cosmos -azure-core -sspyrs - -# sql - data -adodbapi - - -sqlparse - -mysql_connector_python -pg8000 - -pymongo -redis - -#hdf files -h5py -tables -netCDF4 -# not_popular python-hdf4 - -cytoolz - -blosc - -brewer2mpl - -PyAudio - -lmfit - -# less popular cartographic -mercantile -pyepsg - -#preparing parquet -python_snappy -brotli - -feather_format - -jupyter_sphinx - -streamz - -vega_datasets - - -gmpy2 - -mlxtend - -quantecon - -quart - -hypercorn - -umap-learn -flask-sqlalchemy - -nlopt - -httpie -flask-Mail - -lz4 - -jupyter_bokeh - -pydeck - -wasmer -wasmer_compiler_cranelift -wasmer_compiler_singlepass - -nbval - -## onnxruntime - -pynndescent - -quadprog - -orjson - -jupyter_packaging - -deap - -tbats - -missingno - -# for flask -waitress - From 11228fa04387dfb419becdfd50dc146d270d524b Mon Sep 17 00:00:00 2001 From: stonebig Date: Sun, 2 Mar 2025 10:55:01 +0100 Subject: [PATCH 086/305] remove step 2.8 post-build patches --- generate_a_winpython_distro.bat | 14 +------------- 1 file changed, 1 insertion(+), 13 deletions(-) diff --git a/generate_a_winpython_distro.bat b/generate_a_winpython_distro.bat index 5bae6a99..b5bd7140 100644 --- a/generate_a_winpython_distro.bat +++ b/generate_a_winpython_distro.bat @@ -9,6 +9,7 @@ rem 2021-04-22 : path PyPy3 (as we don't try to copy PyPy3.exe to Python.exe) rem 2023-08-21a: add a pre_step with my_requirements_pre.txt + my_find_links_pre rem 2024-05-12a: use python -m pip instead of pip , and remove --upgrade %new_resolver% rem 2024-09-15a: compactify for lisiblity +rem 2025-03-02 : remove step 2.3 (pre-build), and 2.8 (post-patch) as we simplify to only wheels rem ***************************** rem algorithm: @@ -18,10 +19,8 @@ rem 2 a Pre-clear of previous build infrastructure rem 2.0 Create a new build rem 2.1 Create basic build infrastructure rem 2.2 check infrastructure is in place -rem 2.3 add mandatory packages for build rem 2.4 add packages pre_requirements (if any) rem 2.5 add requirement packages -rem 2.8 post-build (if specific workarounds) rem 2.9 archive success rem 3.0 Generate Changelog and binaries @@ -274,17 +273,6 @@ echo if pip doesn't work, check the path of %my_WINPYDIRBASE% python -m pip install -r %my_requirements% -c %my_constraints% --pre --no-index --trusted-host=None --find-links=%my_find_links% >>%my_archive_log% -echo ---------------------------------------- -echo 2.8 (%date% %time%) post-build (if specific workarounds) -echo ---------------------------------------- -echo ---------------------------------------- >>%my_archive_log% -echo 2.8 (%date% %time%) post-build (if specific workarounds)>>%my_archive_log% -echo ---------------------------------------- >>%my_archive_log% - -@echo on -call %my_basedir%\run_complement_newbuild.bat %my_WINPYDIRBASE% - - echo ---------------------------------------- echo 2.9 (%date% %time%) archive success echo ---------------------------------------- From da3954664373f954f8f123e9ebc0df1077332a4a Mon Sep 17 00:00:00 2001 From: stonebig Date: Sun, 2 Mar 2025 13:03:37 +0100 Subject: [PATCH 087/305] reduce Package() class complexity --- winpython/wppm.py | 44 +++++++++++++++----------------------------- 1 file changed, 15 insertions(+), 29 deletions(-) diff --git a/winpython/wppm.py b/winpython/wppm.py index 03f44dcc..e825d9c8 100644 --- a/winpython/wppm.py +++ b/winpython/wppm.py @@ -26,40 +26,27 @@ # Workaround for installing PyVISA on Windows from source: os.environ["HOME"] = os.environ["USERPROFILE"] -class BasePackage: - def __init__(self, fname): +class Package: + "standardize a Package from filename or pip list" + def __init__(self, fname, suggested_summary=None): self.fname = fname + self.description = piptree.sum_up(suggested_summary) if suggested_summary else "" self.name = None self.version = None - self.description = "" + if fname.endswith((".zip", ".tar.gz", ".whl")): + bname = Path(self.fname).name #wheel style name like "sqlite_bro-1.0.0..." + infos = utils.get_source_package_infos(bname) # get name, version + if infos is not None: + self.name, self.version = infos + self.name = utils.normalize(self.name) self.url = None + self.files = [] + + setattr(self,'url',"https://pypi.org/project/" + self.name) def __str__(self): return f"{self.name} {self.version}\r\n{self.description}\r\nWebsite: {self.url}" - - -class Package(BasePackage): - def __init__(self, fname, update=False, suggested_summary=None): - BasePackage.__init__(self, fname) - self.files = [] - self.extract_infos() - if suggested_summary: - setattr(self, 'description', - piptree.sum_up(suggested_summary )) - bname = fname.split("-")[0] - setattr(self,'url',"https://pypi.org/project/" + bname) - - def extract_infos(self): - "Extract package (name, version) from filename (installer basename)" - bname = Path(self.fname).name - if bname.endswith((".zip", ".tar.gz", ".whl")): - # distutils sdist - infos = utils.get_source_package_infos(bname) - if infos is not None: - self.name, self.version = infos - return - raise NotImplementedError(f"Not supported package type {bname}") - + class Distribution: def __init__(self, target=None, verbose=False, indent=False): @@ -156,8 +143,7 @@ def get_installed_packages(self, update=False): # create pip package list wppm = [ Package( - f"{i[0].replace('-', '_').lower()}-{i[1]}-py3-none-any.whl", - update=update, + f"{i[0].replace('-', '_').lower()}-{i[1]}-py3-none-any.whl", #faking wheel suggested_summary=self.pip.summary(i[0]) if self.pip else None ) for i in pip_list From 44866c9d913cad0d3f9f2ee1327029b6213a68ec Mon Sep 17 00:00:00 2001 From: stonebig Date: Sun, 2 Mar 2025 16:42:34 +0100 Subject: [PATCH 088/305] improve piptree.py via IA + manual check --- winpython/piptree.py | 253 +++++++++++++++---------------------------- 1 file changed, 86 insertions(+), 167 deletions(-) diff --git a/winpython/piptree.py b/winpython/piptree.py index b47e165f..fd67d83e 100644 --- a/winpython/piptree.py +++ b/winpython/piptree.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- """ -This script provides functionality to inspect and display package dependencies -in a Python environment, including both downward and upward dependencies. +Enhanced script to inspect and display Python package dependencies, +supporting both downward and upward dependency trees. Requires Python 3.8+ due to importlib.metadata. """ @@ -10,52 +10,26 @@ import re import platform import os +from functools import lru_cache from collections import OrderedDict from typing import Dict, List, Optional, Tuple, Union from pip._vendor.packaging.markers import Marker from importlib.metadata import Distribution, distributions from pathlib import Path -def normalize(name: str) -> str: - """ - Normalize package name according to PEP 503. - - This function converts a package name to its canonical form by replacing - any sequence of dashes, underscores, or dots with a single dash and - converting the result to lowercase. - - :param name: The package name to normalize - :return: The normalized package name - """ - return re.sub(r"[-_.]+", "-", name).lower() def sum_up(text: str, max_length: int = 144, stop_at: str = ". ") -> str: - """ - Summarize text to fit within max_length characters, ending at the last complete sentence if possible. - - This function attempts to create a summary of the given text that fits within - the specified maximum length. It tries to end the summary at a complete sentence - if possible. - - :param text: The text to summarize - :param max_length: Maximum length for summary - :param stop_at: String to stop summarization at - :return: Summarized text - """ + """Summarize text to fit within max_length, ending at last complete sentence.""" summary = (text + os.linesep).splitlines()[0] - if len(summary) > max_length and len(stop_at) > 1: - summary = (summary + stop_at).split(stop_at)[0] - if len(summary) > max_length: - summary = summary[:max_length] - return summary + if len(summary) <= max_length: + return summary + if stop_at and stop_at in summary[:max_length]: + return summary[:summary.rfind(stop_at, 0, max_length)] + stop_at.rstrip() + return summary[:max_length].rstrip() -class PipData: - """ - Wrapper around Distribution.discover() or Distribution.distributions() to manage package metadata. - This class provides methods to inspect and display package dependencies - in a Python environment, including both downward and upward dependencies. - """ +class PipData: + """Manages package metadata and dependency relationships in a Python environment.""" def __init__(self, target: Optional[str] = None): """ @@ -67,24 +41,22 @@ def __init__(self, target: Optional[str] = None): self.raw: Dict[str, Dict] = {} self.environment = self._get_environment() - search_path = target or sys.executable - packages = self._get_packages(search_path) - - for package in packages: - self._process_package(package) + try: + packages = self._get_packages(target or sys.executable) + self._process_packages(packages) + self._populate_reverse_dependencies() + except Exception as e: + raise RuntimeError(f"Failed to initialize package data: {str(e)}") from e - # On a second pass, complement dependencies in reverse mode with 'wanted-per': - self._populate_reverse_dependencies() + @staticmethod + @lru_cache(maxsize=None) + def normalize(name: str) -> str: + """Normalize package name per PEP 503.""" + return re.sub(r"[-_.]+", "-", name).lower() + def _get_environment(self) -> Dict[str, str]: - """ - Collect environment details for dependency evaluation. - - This method gathers information about the system and Python environment, - which is used to evaluate package dependencies. - - :return: Dictionary containing system and Python environment information - """ + """Collect system and Python environment details.""" return { "implementation_name": sys.implementation.name, "implementation_version": f"{sys.implementation.version.major}.{sys.implementation.version.minor}.{sys.implementation.version.micro}", @@ -100,48 +72,35 @@ def _get_environment(self) -> Dict[str, str]: } def _get_packages(self, search_path: str) -> List[Distribution]: - """ - Get the list of packages based on the search path. - - This method retrieves the list of installed packages in the specified - search path. If the search path is the current executable, it uses - Distribution.discover(). Otherwise, it uses distributions() with the - specified path. - - :param search_path: Path to search for packages - :return: List of Distribution objects - """ + """Retrieve installed packages from the specified path.""" if sys.executable == search_path: return Distribution.discover() else: return distributions(path=[str(Path(search_path).parent / 'lib' / 'site-packages')]) - def _process_package(self, package: Distribution) -> None: - """ - Process package metadata and store it in the distro dictionary. - - This method extracts metadata from a Distribution object and stores it - in the distro dictionary. It also initializes the reverse dependencies - and provided extras for the package. + def _process_packages(self, packages: List[Distribution]) -> None: + """Process packages metadata and store them in the distro dictionary.""" + for package in packages: + try: + meta = package.metadata + name = meta.get('Name') + if not name: + continue + key = self.normalize(name) + self.raw[key] = meta + self.distro[key] = { + "name": name, + "version": package.version, + "summary": meta.get("Summary", ""), + "requires_dist": self._get_requires(package), + "reverse_dependencies": [], + "description": meta.get("Description", ""), + "provides": self._get_provides(package), + "provided": {'': None} # Placeholder for extras provided by this package + } + except Exception as e: + print(f"Warning: Failed to process package {name}: {str(e)}", file=sys.stderr) - :param package: The Distribution object to process - """ - meta = package.metadata - name = meta['Name'] - version = package.version - key = normalize(name) - self.raw[key] = meta - - self.distro[key] = { - "name": name, - "version": version, - "summary": meta.get("Summary", ""), - "requires_dist": self._get_requires(package), - "reverse_dependencies": [], - "description": meta.get("Description", ""), - "provides": self._get_provides(package), - "provided": {'': None} # Placeholder for extras provided by this package - } def _get_requires(self, package: Distribution) -> List[Dict[str, str]]: """ @@ -166,8 +125,8 @@ def _get_requires(self, package: Distribution) -> List[Dict[str, str]]: if package.requires: for req in package.requires: req_nameextra, req_marker = (req + ";").split(";")[:2] - req_nameextra = normalize(re.split(r" |;|==|!|>|<", req_nameextra + ";")[0]) - req_key = normalize((req_nameextra + "[").split("[")[0]) + req_nameextra = self.normalize(re.split(r" |;|==|!|>|<", req_nameextra + ";")[0]) + req_key = self.normalize((req_nameextra + "[").split("[")[0]) req_key_extra = req_nameextra[len(req_key) + 1:].split("]")[0] req_version = req[len(req_nameextra):].translate(replacements) @@ -185,16 +144,7 @@ def _get_requires(self, package: Distribution) -> List[Dict[str, str]]: return requires def _get_provides(self, package: Distribution) -> Dict[str, None]: - """ - Get the list of extras provided by this package. - - This method extracts the extras provided by a package from its requirements. - It returns a dictionary where the keys are the provided extras and the values - are None. - - :param package: The Distribution object to extract provided extras from - :return: Dictionary containing provided extras - """ + """Extract provided extras from package requirements.""" provides = {'': None} if package.requires: for req in package.requires: @@ -205,27 +155,22 @@ def _get_provides(self, package: Distribution) -> Dict[str, None]: return provides def _populate_reverse_dependencies(self) -> None: - """ - Add reverse dependencies to each package. - - This method populates the reverse dependencies for each package in the - distro dictionary. It iterates over the requirements of each package + """Populate reverse dependencies. + + It iterates over the requirements of each package and adds the package as a reverse dependency to the required packages. """ - for package in self.distro: - for requirement in self.distro[package]["requires_dist"]: - if requirement["req_key"] in self.distro: - want_add = { - "req_key": package, - "req_version": requirement["req_version"], - "req_extra": requirement["req_extra"], - } - if "req_marker" in requirement: - want_add["req_marker"] = requirement["req_marker"] - if 'extra == ' in requirement["req_marker"]: + for pkg_key, pkg_data in self.distro.items(): + for req in pkg_data["requires_dist"]: + target_key = req["req_key"] + if target_key in self.distro: + rev_dep = {"req_key": pkg_key, "req_version": req["req_version"], "req_extra": req["req_extra"]} + if "req_marker" in req: + rev_dep["req_marker"] = req["req_marker"] + if 'extra == ' in req["req_marker"]: remove_list = {ord("'"): None, ord('"'): None} - self.distro[requirement["req_key"]]["provided"][requirement["req_marker"].split('extra == ')[1].translate(remove_list)] = None - self.distro[requirement["req_key"]]["reverse_dependencies"].append(want_add) + self.distro[target_key]["provided"][req["req_marker"].split('extra == ')[1].translate(remove_list)] = None + self.distro[target_key]["reverse_dependencies"].append(rev_dep) def _get_dependency_tree(self, package_name: str, extra: str = "", version_req: str = "", depth: int = 20, path: Optional[List[str]] = None, verbose: bool = False, upward: bool = False) -> List[List[str]]: """ @@ -247,22 +192,23 @@ def _get_dependency_tree(self, package_name: str, extra: str = "", version_req: """ path = path or [] extras = extra.split(",") - package_key = normalize(package_name) + pkg_key = self.normalize(package_name) ret_all = [] - if package_key + "[" + extra + "]" in path: - print("cycle!", "->".join(path + [package_key + "[" + extra + "]"])) + full_name = f"{package_name}[{extra}]" if extra else package_name + if full_name in path: + print(f"Cycle detected: {' -> '.join(path + [full_name])}") return [] # Return empty list to avoid further recursion - package_data = self.distro.get(package_key) - if package_data and len(path) <= depth: + pkg_data = self.distro[pkg_key] + if pkg_data and len(path) <= depth: for extra in extras: environment = {"extra": extra, **self.environment} - summary = f' {package_data["summary"]}' if verbose else '' + summary = f' {pkg_data["summary"]}' if verbose else '' base_name = f'{package_name}[{extra}]' if extra else package_name - ret = [f'{base_name}=={package_data["version"]} {version_req}{summary}'] + ret = [f'{base_name}=={pkg_data["version"]} {version_req}{summary}'] - dependencies = package_data["requires_dist"] if not upward else package_data["reverse_dependencies"] + dependencies = pkg_data["requires_dist"] if not upward else pkg_data["reverse_dependencies"] for dependency in dependencies: if dependency["req_key"] in self.distro: @@ -276,7 +222,7 @@ def _get_dependency_tree(self, package_name: str, extra: str = "", version_req: # - or the extra is in the upward package, like pandas[test] ==> pytest, for 'test' extra # - or an extra "array" is demanded, and indeed in the req_extra list: array,dataframe,diagnostics,distributer if (not dependency.get("req_marker") and extra =="" - ) or ("req_marker" in dependency and extra==up_req and dependency["req_key"]!=package_key and Marker(dependency["req_marker"]).evaluate(environment=environment) + ) or ("req_marker" in dependency and extra==up_req and dependency["req_key"]!=pkg_key and Marker(dependency["req_marker"]).evaluate(environment=environment) ) or ("req_marker" in dependency and extra!="" and extra+',' in dependency["req_extra"]+',' and Marker(dependency["req_marker"]).evaluate(environment=environment|{"extra": up_req}) ): ret += self._get_dependency_tree( @@ -306,11 +252,7 @@ def _get_dependency_tree(self, package_name: str, extra: str = "", version_req: def down(self, pp: str = "", extra: str = "", depth: int = 20, indent: int = 5, version_req: str = "", verbose: bool = False) -> str: """ - Print the downward requirements for the package or all packages. - - This method prints the downward dependencies for the specified package - or all packages if pp is ".". It uses the _get_dependency_tree method - to build the dependency tree and formats the output as a JSON string. + Generate downward dependency tree as formatted string. :param pp: The package name or "." to print dependencies for all packages :param extra: The extra to include in the dependency tree @@ -318,10 +260,9 @@ def down(self, pp: str = "", extra: str = "", depth: int = 20, indent: int = 5, :param indent: The indentation level for the JSON output :param version_req: The version requirement for the package :param verbose: Whether to include verbose output in the tree - :return: JSON string containing the downward dependencies """ if pp == ".": - results = [self.down(one_pp, extra, depth, indent, version_req, verbose=verbose) for one_pp in sorted(self.distro)] + results = [self.down(p, extra, depth, indent, version_req, verbose=verbose) for p in sorted(self.distro)] return '\n'.join(filter(None, results)) if extra == ".": @@ -338,13 +279,10 @@ def down(self, pp: str = "", extra: str = "", depth: int = 20, indent: int = 5, lines = [l for l in rawtext.split("\n") if len(l.strip()) > 2] return "\n".join(lines).replace('"', "") - def up(self, pp: str, extra: str = "", depth: int = 20, indent: int = 5, version_req: str = "", verbose: bool = False) -> str: + def up(self, pp: str, extra: str = "", depth: int = 20, indent: int = 5, + version_req: str = "", verbose: bool = False) -> str: """ - Print the upward needs for the package. - - This method prints the upward dependencies for the specified package. - It uses the _get_dependency_tree method to build the dependency tree - and formats the output as a JSON string. + Generate upward dependency tree as formatted string. :param pp: The package name :param extra: The extra to include in the dependency tree @@ -352,16 +290,15 @@ def up(self, pp: str, extra: str = "", depth: int = 20, indent: int = 5, version :param indent: The indentation level for the JSON output :param version_req: The version requirement for the package :param verbose: Whether to include verbose output in the tree - :return: JSON string containing the upward dependencies """ if pp == ".": - results = [self.up(one_pp, extra, depth, indent, version_req, verbose) for one_pp in sorted(self.distro)] + results = [self.up(p, extra, depth, indent, version_req, verbose) for p in sorted(self.distro)] return '\n'.join(filter(None, results)) if extra == ".": if pp in self.distro: extras = set(self.distro[pp]["provided"]).union(set(self.distro[pp]["provides"])) - results = [self.up(pp, one_extra, depth, indent, version_req, verbose=verbose) for one_extra in sorted(extras)] + results = [self.up(pp, e, depth, indent, version_req, verbose=verbose) for e in sorted(extras)] return '\n'.join(filter(None, results)) return "" @@ -373,42 +310,24 @@ def up(self, pp: str, extra: str = "", depth: int = 20, indent: int = 5, version return "\n".join(filter(None, lines)).replace('"', "") def description(self, pp: str) -> None: - """ - Return description of the package. - - This method prints the description of the specified package. - - :param pp: The package name - """ + """Return package description or None if not found.""" if pp in self.distro: return print("\n".join(self.distro[pp]["description"].split(r"\n"))) def summary(self, pp: str) -> str: - """ - Return summary of the package. - - This method returns the summary of the specified package. - - :param pp: The package name - :return: The summary of the package - """ + """Return package summary or empty string if not found.""" if pp in self.distro: return self.distro[pp]["summary"] return "" def pip_list(self, full: bool = False, max_length: int = 144) -> List[Tuple[str, Union[str, Tuple[str, str]]]]: - """ - List installed packages similar to pip list. - - This method lists the installed packages in a format similar to the - output of the `pip list` command. If full is True, it includes the - package version and summary. + """List installed packages with optional details. :param full: Whether to include the package version and summary :param max_length: The maximum length for the summary :return: List of tuples containing package information """ + pkgs = sorted(self.distro.items()) if full: - return [(p, self.distro[p]["version"], sum_up(self.distro[p]["summary"], max_length)) for p in sorted(self.distro)] - else: - return [(p, sum_up(self.distro[p]["version"], max_length)) for p in sorted(self.distro)] + return [(p, d["version"], sum_up(d["summary"], max_length)) for p, d in pkgs] + return [(p, d["version"]) for p, d in pkgs] From 41cc8dea137291067fe8e6bf6069ec9319368350 Mon Sep 17 00:00:00 2001 From: stonebig Date: Sun, 2 Mar 2025 19:07:03 +0100 Subject: [PATCH 089/305] donw to one error of logic of Copilote --- winpython/piptree.py | 102 +++++++++++++------------------------------ 1 file changed, 30 insertions(+), 72 deletions(-) diff --git a/winpython/piptree.py b/winpython/piptree.py index fd67d83e..abb1a082 100644 --- a/winpython/piptree.py +++ b/winpython/piptree.py @@ -10,6 +10,7 @@ import re import platform import os +import logging from functools import lru_cache from collections import OrderedDict from typing import Dict, List, Optional, Tuple, Union @@ -17,17 +18,22 @@ from importlib.metadata import Distribution, distributions from pathlib import Path +logging.basicConfig(level=logging.INFO) +logger = logging.getLogger(__name__) + +class PipDataError(Exception): + """Custom exception for PipData related errors.""" + pass def sum_up(text: str, max_length: int = 144, stop_at: str = ". ") -> str: """Summarize text to fit within max_length, ending at last complete sentence.""" summary = (text + os.linesep).splitlines()[0] if len(summary) <= max_length: - return summary + return summary if stop_at and stop_at in summary[:max_length]: return summary[:summary.rfind(stop_at, 0, max_length)] + stop_at.rstrip() return summary[:max_length].rstrip() - class PipData: """Manages package metadata and dependency relationships in a Python environment.""" @@ -40,21 +46,19 @@ def __init__(self, target: Optional[str] = None): self.distro: Dict[str, Dict] = {} self.raw: Dict[str, Dict] = {} self.environment = self._get_environment() - try: packages = self._get_packages(target or sys.executable) self._process_packages(packages) self._populate_reverse_dependencies() except Exception as e: - raise RuntimeError(f"Failed to initialize package data: {str(e)}") from e - + raise PipDataError(f"Failed to initialize package data: {str(e)}") from e @staticmethod @lru_cache(maxsize=None) def normalize(name: str) -> str: """Normalize package name per PEP 503.""" return re.sub(r"[-_.]+", "-", name).lower() - + def _get_environment(self) -> Dict[str, str]: """Collect system and Python environment details.""" return { @@ -99,20 +103,10 @@ def _process_packages(self, packages: List[Distribution]) -> None: "provided": {'': None} # Placeholder for extras provided by this package } except Exception as e: - print(f"Warning: Failed to process package {name}: {str(e)}", file=sys.stderr) - + logger.warning(f"Failed to process package {name}: {str(e)}", exc_info=True) def _get_requires(self, package: Distribution) -> List[Dict[str, str]]: - """ - Extract and normalize requirements for a package. - - This method parses the requirements of a package and normalizes them - into a list of dictionaries. Each dictionary contains the required - package key, version, extra, and marker (if any). - - :param package: The Distribution object to extract requirements from - :return: List of dictionaries containing normalized requirements - """ + """Extract and normalize requirements for a package.""" requires = [] replacements = str.maketrans({" ": " ", "[": "", "]": "", "'": "", '"': ""}) further_replacements = [ @@ -155,11 +149,7 @@ def _get_provides(self, package: Distribution) -> Dict[str, None]: return provides def _populate_reverse_dependencies(self) -> None: - """Populate reverse dependencies. - - It iterates over the requirements of each package - and adds the package as a reverse dependency to the required packages. - """ + """Populate reverse dependencies.""" for pkg_key, pkg_data in self.distro.items(): for req in pkg_data["requires_dist"]: target_key = req["req_key"] @@ -173,23 +163,7 @@ def _populate_reverse_dependencies(self) -> None: self.distro[target_key]["reverse_dependencies"].append(rev_dep) def _get_dependency_tree(self, package_name: str, extra: str = "", version_req: str = "", depth: int = 20, path: Optional[List[str]] = None, verbose: bool = False, upward: bool = False) -> List[List[str]]: - """ - Recursive function to build dependency tree. - - This method builds a dependency tree for the specified package. It can - build the tree for downward dependencies (default) or upward dependencies - (if upward is True). The tree is built recursively up to the specified - depth. - - :param package_name: The name of the package to build the tree for - :param extra: The extra to include in the dependency tree - :param version_req: The version requirement for the package - :param depth: The maximum depth of the dependency tree - :param path: The current path in the dependency tree (used for cycle detection) - :param verbose: Whether to include verbose output in the tree - :param upward: Whether to build the tree for upward dependencies - :return: List of lists containing the dependency tree - """ + """Recursive function to build dependency tree.""" path = path or [] extras = extra.split(",") pkg_key = self.normalize(package_name) @@ -197,8 +171,8 @@ def _get_dependency_tree(self, package_name: str, extra: str = "", version_req: full_name = f"{package_name}[{extra}]" if extra else package_name if full_name in path: - print(f"Cycle detected: {' -> '.join(path + [full_name])}") - return [] # Return empty list to avoid further recursion + logger.warning(f"Cycle detected: {' -> '.join(path + [full_name])}") + return [] pkg_data = self.distro[pkg_key] if pkg_data and len(path) <= depth: @@ -215,19 +189,22 @@ def _get_dependency_tree(self, package_name: str, extra: str = "", version_req: next_path = path + [base_name] if upward: up_req = (dependency.get("req_marker", "").split('extra == ')+[""])[1].strip("'\"") - # avoids circular links on dask[array] if dependency["req_key"] in self.distro and dependency["req_key"]+"["+up_req+"]" not in path: # upward dependancy taken if: # - if extra "" demanded, and no marker from upward package: like pandas[] ==> numpy # - or the extra is in the upward package, like pandas[test] ==> pytest, for 'test' extra # - or an extra "array" is demanded, and indeed in the req_extra list: array,dataframe,diagnostics,distributer - if (not dependency.get("req_marker") and extra =="" - ) or ("req_marker" in dependency and extra==up_req and dependency["req_key"]!=pkg_key and Marker(dependency["req_marker"]).evaluate(environment=environment) - ) or ("req_marker" in dependency and extra!="" and extra+',' in dependency["req_extra"]+',' and Marker(dependency["req_marker"]).evaluate(environment=environment|{"extra": up_req}) - ): + if (not dependency.get("req_marker") and extra == "") or \ + ("req_marker" in dependency and extra == up_req and \ + dependency["req_key"] != pkg_key and \ + Marker(dependency["req_marker"]).evaluate(environment=environment)) or \ + ("req_marker" in dependency and extra != "" and \ + extra + ',' in dependency["req_extra"] + ',' and \ + Marker(dependency["req_marker"]).evaluate(environment=environment | {"extra": up_req})): + # IA risk error: # dask[array] go upwards as dask[dataframe], so {"extra": up_req} , not {"extra": extra} ret += self._get_dependency_tree( dependency["req_key"], - up_req, # dask[array] going upwards continues as dask[dataframe] + up_req, f"[requires: {package_name}" + (f"[{dependency['req_extra']}]" if dependency["req_extra"] != "" else "") + f'{dependency["req_version"]}]', @@ -251,16 +228,7 @@ def _get_dependency_tree(self, package_name: str, extra: str = "", version_req: return ret_all def down(self, pp: str = "", extra: str = "", depth: int = 20, indent: int = 5, version_req: str = "", verbose: bool = False) -> str: - """ - Generate downward dependency tree as formatted string. - - :param pp: The package name or "." to print dependencies for all packages - :param extra: The extra to include in the dependency tree - :param depth: The maximum depth of the dependency tree - :param indent: The indentation level for the JSON output - :param version_req: The version requirement for the package - :param verbose: Whether to include verbose output in the tree - """ + """Generate downward dependency tree as formatted string.""" if pp == ".": results = [self.down(p, extra, depth, indent, version_req, verbose=verbose) for p in sorted(self.distro)] return '\n'.join(filter(None, results)) @@ -270,27 +238,17 @@ def down(self, pp: str = "", extra: str = "", depth: int = 20, indent: int = 5, results = [self.down(pp, one_extra, depth, indent, version_req, verbose=verbose) for one_extra in sorted(self.distro[pp]["provides"])] return '\n'.join(filter(None, results)) - return "" # Handle cases where extra is "." and package_name is not found. + return "" if pp not in self.distro: - return "" # Handle cases where package_name is not found. + return "" rawtext = json.dumps(self._get_dependency_tree(pp, extra, version_req, depth, verbose=verbose), indent=indent) lines = [l for l in rawtext.split("\n") if len(l.strip()) > 2] return "\n".join(lines).replace('"', "") - def up(self, pp: str, extra: str = "", depth: int = 20, indent: int = 5, - version_req: str = "", verbose: bool = False) -> str: - """ - Generate upward dependency tree as formatted string. - - :param pp: The package name - :param extra: The extra to include in the dependency tree - :param depth: The maximum depth of the dependency tree - :param indent: The indentation level for the JSON output - :param version_req: The version requirement for the package - :param verbose: Whether to include verbose output in the tree - """ + def up(self, pp: str, extra: str = "", depth: int = 20, indent: int = 5, version_req: str = "", verbose: bool = False) -> str: + """Generate upward dependency tree as formatted string.""" if pp == ".": results = [self.up(p, extra, depth, indent, version_req, verbose) for p in sorted(self.distro)] return '\n'.join(filter(None, results)) From 40d543064409c1c7a5df3066c58779de020e7ccd Mon Sep 17 00:00:00 2001 From: stonebig Date: Sun, 9 Mar 2025 08:40:05 +0100 Subject: [PATCH 090/305] prevent doublequote in PATH to crash WinPython --- make.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/make.py b/make.py index 29b9fef1..ebb8c48f 100644 --- a/make.py +++ b/make.py @@ -551,11 +551,15 @@ def _create_initial_batch_scripts(self): set JUPYTER_CONFIG_DIR=%WINPYDIR%\\etc\\jupyter set JUPYTER_CONFIG_PATH=%WINPYDIR%\\etc\\jupyter set FINDDIR=%WINDIR%\\system32 -echo ";%PATH%;" | %FINDDIR%\\find.exe /C /I ";%WINPYDIR%\\;" >nul + +rem Remove all double quotes +set PATH_CLEANED=%PATH:"=% +echo ";%PATH_CLEANED%;" | %FINDDIR%\\find.exe /C /I ";%WINPYDIR%\\;" >nul if %ERRORLEVEL% NEQ 0 ( set "PATH={full_path_env_var}" cd . ) +set PATH_CLEANED= rem force default pyqt5 kit for Spyder if PyQt5 module is there if exist "%WINPYDIR%\\Lib\\site-packages\\PyQt5\\__init__.py" set QT_API=pyqt5 From 1462d7cb0df5f9f948961161b2b6aa7484bf5e97 Mon Sep 17 00:00:00 2001 From: stonebig Date: Sun, 9 Mar 2025 11:03:53 +0100 Subject: [PATCH 091/305] simplify generate_a_winpython_distro.bat --- generate_a_winpython_distro.bat | 342 +++++++------------------------- 1 file changed, 70 insertions(+), 272 deletions(-) diff --git a/generate_a_winpython_distro.bat b/generate_a_winpython_distro.bat index b5bd7140..f7e79be8 100644 --- a/generate_a_winpython_distro.bat +++ b/generate_a_winpython_distro.bat @@ -1,71 +1,18 @@ -rem to launch from a winpython package directory, where 'make.py' is +rem generate_a_winpython_distro.bat: to be launched from a winpython directory, where 'make.py' is @echo on -rem ***************************** -rem 2020-07-05: install msvc_runtime before packages that may want to compile -rem 2020-12-05 : add a constraints.txt file from a recent pip list -rem 2021-03-20 : track successes packages combination are archived for future contraint update -rem 2021-04-22 : path PyPy3 (as we don't try to copy PyPy3.exe to Python.exe) -rem 2023-08-21a: add a pre_step with my_requirements_pre.txt + my_find_links_pre -rem 2024-05-12a: use python -m pip instead of pip , and remove --upgrade %new_resolver% -rem 2024-09-15a: compactify for lisiblity -rem 2025-03-02 : remove step 2.3 (pre-build), and 2.8 (post-patch) as we simplify to only wheels -rem ***************************** - -rem algorithm: -rem 0.0 Initialize variables -rem 1.0 Do 2021-04-22 : patch PyPy3 (as we don't try to copy PyPy3.exe to Python.exe) -rem 2 a Pre-clear of previous build infrastructure -rem 2.0 Create a new build -rem 2.1 Create basic build infrastructure -rem 2.2 check infrastructure is in place -rem 2.4 add packages pre_requirements (if any) -rem 2.5 add requirement packages -rem 2.9 archive success -rem 3.0 Generate Changelog and binaries - -rem "my_release_level" is optionaly set per the calling program ********************************************* -rem set my_release_level= - -rem ! = ! = ! = ! = ! = ! = ! = ! = ! = ! = ! = ! = ! = ! = ! = ! = ! = ! = ! = ! = ! = ! = ! = ! = - -if "%my_release_level%"=="" set my_release_level= - -rem ! = ! = ! = ! = ! = ! = ! = ! = ! = ! = ! = ! = ! = ! = ! = ! = ! = ! = ! = ! = ! = ! = ! = ! = - -rem "my_create_installer" is optionaly set per the calling program +REM Initialize variables +if "%my_release_level%"=="" set my_release_level=b1 if "%my_create_installer%"=="" set my_create_installer=True +rem Set archive directory and log file +set my_archive_dir=%~dp0WinPython_build_logs +if not exist %my_archive_dir% mkdir %my_archive_dir% -rem this is pre-initialised per the program calling this .bat -rem set my_original_path=%path% -rem set my_root_dir_for_builds=D:\WinP - -rem set my_python_target=34 -rem set my_pyver=3.4 -rem set my_flavor=slim -rem set my_release=84 - -rem set my_find_link=C:\WinP\packages.srcreq - -rem set my_arch=64 -rem set my_preclear_build_directory=Yes - -rem set my_requirements_pre=C:\WinP\bd311\requirements_mkl_pre.txt -rem set my_find_links_pre=C:\WinP\packages_mkl.srcreq - -rem set my_requirements=C:\Winpents=d:\my_req1.txt - -rem set my_source_dirs=D:\WinPython\bd34\packages.src D:\WinPython\bd34\packages.win32.Slim -rem set my_toolsdirs=D:\WinPython\bd34\Tools.Slim -rem set my_docsdirs=D:\WinPython\bd34\docs.Slim - - - -echo ---------------------------------------- -echo 0.0 (%date% %time%) Initialize variables -echo ---------------------------------------- - +set my_time=%time:~0,5% +set my_time=%my_time::=_% +set my_time=%my_time: =0% +set my_archive_log=%my_archive_dir%\build_%my_pyver%._.%my_release%%my_flavor%_%my_release_level%_of_%date:/=-%at_%my_time%.txt set my_basedir=%my_root_dir_for_builds%\bd%my_python_target% @@ -77,248 +24,99 @@ if "%my_constraints%"=="" set my_constraints=C:\WinP\constraints.txt rem 2021-04-22 : path PyPy3 (as we don't try to copy PyPy3.exe to Python.exe) if "%target_python_exe%"=="" set target_python_exe=python.exe - -if %my_python_target%==310 ( - set my_python_target_release=31011 - set my_release=2 -) - -if %my_python_target%==311 ( - set my_python_target_release=3119 - set my_release=1 +rem Set Python target release based on my_python_target +if %my_python_target%==311 set my_python_target_release=3119& set my_release=1 +if %my_python_target%==312 set my_python_target_release=3129& set my_release=1 +if %my_python_target%==313 set my_python_target_release=3132& set my_release=1 +if %my_python_target%==314 set my_python_target_release=3140& set my_release=0 + +echo -------------------------------------- >>%my_archive_log% +echo (%date% %time%) preparing winPython for %my_pyver% (%my_python_target%)release %my_release%%my_flavor% (%my_release_level%) *** %my_arch% bit ***>>%my_archive_log% +echo -------------------------------------- >>%my_archive_log% + +rem Pre-clear previous build infrastructure +if "%my_preclear_build_directory%"=="Yes" ( + echo "(%date% %time%) Pre-clear previous build infrastructure">>%my_archive_log% + del -y %userprofile%\.jupyter\jupyter_notebook_config.py + cd /D %my_root_dir_for_builds%\bd%my_python_target% + set build_det=\%my_flavor% + if "%my_flavor%"=="" set build_det= + dir %build_det% + ren bu%my_flavor% bu%my_flavor%_old + start rmdir /S /Q bu%my_flavor%_old + rmdir /S /Q bu%my_flavor% + rmdir /S /Q dist ) -if %my_python_target%==312 ( - set my_python_target_release=3129 - set my_release=1 -) - -if %my_python_target%==313 ( - set my_python_target_release=3132 - set my_release=1 -) -if %my_python_target%==314 ( - set my_python_target_release=3140 - set my_release=0 -) - - -rem set my_install_options=--no-index --pre - -set my_day=%date:/=-% -set my_time=%time:~0,5% -set my_time=%my_time::=_% -set my_time=%my_time: =0% - -set my_archive_dir=%~dp0WinPython_build_logs -if not exist %my_archive_dir% mkdir %my_archive_dir% - -set my_archive_log=%my_archive_dir%\build_%my_pyver%._.%my_release%%my_flavor%_%my_release_level%_of_%my_day%_at_%my_time%.txt - - -echo ---------------------------------------- -echo preparing winPython for %my_pyver% (%my_python_target%)release %my_release%%my_flavor% (%my_release_level%) *** %my_arch% bit *** -echo ---------------------------------------- -echo ---------------------------------------- >>%my_archive_log% -echo (%date% %time%) preparing winPython for %my_pyver% (%my_python_target%)release %my_release%%my_flavor% (%my_release_level%) *** %my_arch% bit ***>>%my_archive_log% -echo ---------------------------------------- >>%my_archive_log% - - -if not "%my_preclear_build_directory%"=="Yes" goto no_preclear - - -echo ---------------------------------------- -echo 1.0 (%date% %time%) Do a Pre-clear of previous build infrastructure -echo ---------------------------------------- -echo ---------------------------------------- >>%my_archive_log% -echo 1.0 (%date% %time%) Do a Pre-clear of previous build infrastructure>>%my_archive_log% -echo ---------------------------------------- >>%my_archive_log% - -rem 2019-05-10 PATCH for build problem (asking permission to overwrite the file) -del -y %userprofile%\.jupyter\jupyter_notebook_config.py - -cd /D %my_root_dir_for_builds%\bd%my_python_target% - -set build_det=\%my_flavor% -if "%my_flavor%"=="" set build_det= - -dir %build_det% - -rem 2021-02-13 workaround to hard to remove json files -echo ren bu%my_flavor% bu%my_flavor%_old -ren bu%my_flavor% bu%my_flavor%_old - -rem pause -start rmdir /S /Q bu%my_flavor%_old - - -echo rmdir /S /Q bu%my_flavor% -rem pause -rmdir /S /Q bu%my_flavor% -rmdir /S /Q bu%my_flavor% -rmdir /S /Q bu%my_flavor% -rmdir /S /Q bu%my_flavor% -rmdir /S /Q bu%my_flavor% -rmdir /S /Q dist - -echo %date% %time% -echo %date% %time%>>%my_archive_log% - -:no_preclear - - -echo ---------------------------------------- -echo 2.0 (%date% %time%) Create a new build -echo ---------------------------------------- >>%my_archive_log% -echo 2.0 (%date% %time%) Create a new build>>%my_archive_log% -echo ---------------------------------------- >>%my_archive_log% - - -echo cd /D %~dp0>>%my_archive_log% +REM Create a new build +echo -------------------------------------- >>%my_archive_log% +echo "(%date% %time%) Create a new build">>%my_archive_log% +echo -------------------------------------- >>%my_archive_log% cd /D %~dp0 - -echo set path=%my_original_path%>>%my_archive_log% set path=%my_original_path% - -echo call %my_buildenv%\scripts\env.bat>>%my_archive_log% call %my_buildenv%\scripts\env.bat +@echo on -echo ---------------------------------------- -echo 2.1 (%date% %time%) Create basic build infrastructure -echo ---------------------------------------- -echo ---------------------------------------- >>%my_archive_log% -echo 2.1 (%date% %time%) Create basic build infrastructure>>%my_archive_log% -echo ---------------------------------------- >>%my_archive_log% - -rem at First step 2.1 -rem we don't use any %my_requirements% -rem we don't create installer -rem we use legacy python build cd /D %~dp0 - -set my_buildenv_path=%path% - -echo python.exe -c "from make import *;make_all(%my_release%, '%my_release_level%', pyver='%my_pyver%', basedir=r'%my_basedir%', verbose=True, architecture=%my_arch%, flavor='%my_flavor%', install_options=r'%my_install_options%', find_links=r'%my_find_links%', source_dirs=r'%my_source_dirs%', toolsdirs=r'%my_toolsdirs%', docsdirs=r'%my_docsdirs%', create_installer='False', python_target_release='%my_python_target_release%')">>%my_archive_log% - -echo python.exe -c "from make import *;make_all(%my_release%, '%my_release_level%', pyver='%my_pyver%', basedir=r'%my_basedir%', verbose=True, architecture=%my_arch%, flavor='%my_flavor%', install_options=r'%my_install_options%', find_links=r'%my_find_links%', source_dirs=r'%my_source_dirs%', toolsdirs=r'%my_toolsdirs%', docsdirs=r'%my_docsdirs%', create_installer='False', python_target_release='%my_python_target_release%')" - -rem pause - +REM Create basic build infrastructure +echo "(%date% %time%) Create basic build infrastructure">>%my_archive_log% python.exe -c "from make import *;make_all(%my_release%, '%my_release_level%', pyver='%my_pyver%', basedir=r'%my_basedir%', verbose=True, architecture=%my_arch%, flavor='%my_flavor%', install_options=r'%my_install_options%', find_links=r'%my_find_links%', source_dirs=r'%my_source_dirs%', toolsdirs=r'%my_toolsdirs%', docsdirs=r'%my_docsdirs%', create_installer='False', python_target_release='%my_python_target_release%')">>%my_archive_log% - -echo ---------------------------------------- -echo 2.2 (%date% %time%) check infrastructure is in place -echo ---------------------------------------- -echo ---------------------------------------- >>%my_archive_log% -echo 2.2 (%date% %time%) check infrastructure is in place>>%my_archive_log% -echo ---------------------------------------- >>%my_archive_log% - -@echo on +REM Check infrastructure is in place +echo "(%date% %time%) Check infrastructure">>%my_archive_log% set my_WINPYDIRBASE=%my_root_dir_for_builds%\bd%my_python_target%\bu%my_flavor%\Wpy%my_arch%-%my_python_target_release%%my_release%%my_release_level% - set WINPYDIRBASE=%my_WINPYDIRBASE% if not exist %my_WINPYDIRBASE%\scripts\env.bat ( + @echo off + echo as %my_WINPYDIRBASE%\scripts\env.bat does not exist echo please check and correct my_python_target_release=%my_python_target_release% echo my_arch=%my_arch% echo my_python_target_release=%my_python_target_release% echo my_release=%my_release% echo my_release_level=%my_release_level% - echo in generate_a_winpython_distro.bat - echo as %my_WINPYDIRBASE%\scripts\env.bat doesnt exist pause exit -) +) -rem we use final environment to install requirements -set path=%my_original_path% +REM Add pre-requisite packages +echo -------------------------------------- >>%my_archive_log% +echo "(%date% %time%) Add pre-requisite packages">>%my_archive_log% +echo -------------------------------------- >>%my_archive_log% +set path=%my_original_path% call %my_WINPYDIRBASE%\scripts\env.bat -set - - -echo ---------------------------------------- -echo 2.4 (%date% %time%) add packages pre_requirements (if any) -echo ---------------------------------------- -echo ---------------------------------------- >>%my_archive_log% -echo 2.4 (%date% %time%) add packages pre_requirements (if any) -echo ---------------------------------------- >>%my_archive_log% +rem Install pre-requirements if any if not "Z%my_requirements_pre%Z"=="ZZ" ( - -if "%my_find_links_pre%"=="" set my_find_links_pre=%my_find_links% - -echo python -m pip install -r %my_requirements_pre% -c %my_constraints% --pre --no-index --trusted-host=None --find-links=%my_find_links_pre% -echo python -m pip install -r %my_requirements_pre% -c %my_constraints% --pre --no-index --trusted-host=None --find-links=%my_find_links_pre% >>%my_archive_log% -echo if pip doesn't work, check the path of %my_WINPYDIRBASE% - -python -m pip install -r %my_requirements_pre% -c %my_constraints% --pre --no-index --trusted-host=None --find-links=%my_find_links_pre% >>%my_archive_log% + if "%my_find_links_pre%"=="" set my_find_links_pre=%my_find_links% + python -m pip install -r %my_requirements_pre% -c %my_constraints% --pre --no-index --trusted-host=None --find-links=%my_find_links_pre% >> %my_archive_log% ) else ( -echo no packages pre_requirements -echo no packages pre_requirements>>%my_archive_log% + echo "No pre-requisite packages">>%my_archive_log% ) +REM Add requirement packages +echo -------------------------------------- >>%my_archive_log% +echo "(%date% %time%) Add requirement packages">>%my_archive_log% +echo -------------------------------------- >>%my_archive_log% +python -m pip install -r %my_requirements% -c %my_constraints% --pre --no-index --trusted-host=None --find-links=%my_find_links% >>%my_archive_log% -echo ---------------------------------------- -echo 2.5 (%date% %time%) add requirement packages -echo ---------------------------------------- -echo ---------------------------------------- >>%my_archive_log% -echo 2.5 (%date% %time%) add requirement packages_versions>>%my_archive_log% -echo ---------------------------------------- >>%my_archive_log% - -echo python -m pip install -r %my_requirements% -c %my_constraints% --pre --no-index --trusted-host=None --find-links=%my_find_links% -echo python -m pip install -r %my_requirements% -c %my_constraints% --pre --no-index --trusted-host=None --find-links=%my_find_links% >>%my_archive_log% -echo if pip doesn't work, check the path of %my_WINPYDIRBASE% - -python -m pip install -r %my_requirements% -c %my_constraints% --pre --no-index --trusted-host=None --find-links=%my_find_links% >>%my_archive_log% - - -echo ---------------------------------------- -echo 2.9 (%date% %time%) archive success -echo ---------------------------------------- -echo ---------------------------------------- >>%my_archive_log% -echo 2.9 (%date% %time%) archive success >>%my_archive_log% -echo ---------------------------------------- >>%my_archive_log% - -echo %target_python_exe% -m pip freeze>%my_archive_log%.packages_versions.txt>>%my_archive_log% -%target_python_exe% -m pip freeze>%my_archive_log%.packages_versions.txt - - -echo ---------------------------------------- -echo 3.0 (%date% %time%) Generate Changelog and binaries -echo ---------------------------------------- -echo ---------------------------------------- >>%my_archive_log% -echo 3.0 (%date% %time%) Generate Changelog and binaries >>%my_archive_log% -echo ---------------------------------------- >>%my_archive_log% - -rem build final changelog and binaries, using create_installer='%my_create_installer%', remove_existing=False , remove : requirements, toolsdirs and docdirs +REM Archive success +echo -------------------------------------- >>%my_archive_log% +echo "(%date% %time%) Archive success">>%my_archive_log% +echo -------------------------------------- >>%my_archive_log% +%target_python_exe% -m pip freeze > %my_archive_log%.packages_versions.txt +REM Generate changelog and binaries +echo "(%date% %time%) Generate changelog and binaries">>%my_archive_log% set path=%my_original_path% -echo cd /D %~dp0>>%my_archive_log% cd /D %~dp0 - -echo call %my_buildenv%\scripts\env.bat>>%my_archive_log% call %my_buildenv%\scripts\env.bat -set - -echo python.exe -c "from make import *;make_all(%my_release%, '%my_release_level%', pyver='%my_pyver%', basedir=r'%my_basedir%', verbose=True, architecture=%my_arch%, flavor='%my_flavor%', install_options=r'%my_install_options%', find_links=r'%my_find_links%', source_dirs=r'%my_source_dirs%', create_installer='%my_create_installer%', remove_existing=False, python_target_release='%my_python_target_release%')">>%my_archive_log% - -echo python.exe -c "from make import *;make_all(%my_release%, '%my_release_level%', pyver='%my_pyver%', basedir=r'%my_basedir%', verbose=True, architecture=%my_arch%, flavor='%my_flavor%', install_options=r'%my_install_options%', find_links=r'%my_find_links%', source_dirs=r'%my_source_dirs%', create_installer='%my_create_installer%', remove_existing=False, python_target_release='%my_python_target_release%')" +python.exe -c "from make import *;make_all(%my_release%, '%my_release_level%', pyver='%my_pyver%', basedir=r'%my_basedir%', verbose=True, architecture=%my_arch%, flavor='%my_flavor%', install_options=r'%my_install_options%', find_links=r'%my_find_links%', source_dirs=r'%my_source_dirs%', create_installer='%my_create_installer%', remove_existing=False, python_target_release='%my_python_target_release%')" >> %my_archive_log% -python.exe -c "from make import *;make_all(%my_release%, '%my_release_level%', pyver='%my_pyver%', basedir=r'%my_basedir%', verbose=True, architecture=%my_arch%, flavor='%my_flavor%', install_options=r'%my_install_options%', find_links=r'%my_find_links%', source_dirs=r'%my_source_dirs%', create_installer='%my_create_installer%', remove_existing=False, python_target_release='%my_python_target_release%')">>%my_archive_log% - - -echo ---------------------------------------- -echo (%date% %time%) END OF creation -echo ---------------------------------------- -echo ---------------------------------------- >>%my_archive_log% -echo (%date% %time%) END OF creation>>%my_archive_log% -echo ---------------------------------------- >>%my_archive_log% - -rem show logs +echo -------------------------------------- >>%my_archive_log% +echo "(%date% %time%) END OF CREATION">>%my_archive_log% +echo -------------------------------------- >>%my_archive_log% start notepad.exe %my_archive_log% - start notepad.exe %my_archive_log%.packages_versions.txt -set path=%my_original_path% -rem pause +set path=%my_original_path% \ No newline at end of file From ba94d4d207153d733230cd172c1a060581b55c89 Mon Sep 17 00:00:00 2001 From: stonebig Date: Sun, 9 Mar 2025 11:20:34 +0100 Subject: [PATCH 092/305] simplify generate_winpython_distros999_nnn.bat --- generate_winpython_distros313_dot.bat | 33 +++---------------------- generate_winpython_distros313_slim.bat | 34 ++++---------------------- 2 files changed, 9 insertions(+), 58 deletions(-) diff --git a/generate_winpython_distros313_dot.bat b/generate_winpython_distros313_dot.bat index 7090f779..b0ed9351 100644 --- a/generate_winpython_distros313_dot.bat +++ b/generate_winpython_distros313_dot.bat @@ -6,41 +6,24 @@ set my_original_path=%path% set my_root_dir_for_builds=C:\Winp set my_python_target=313 set my_pyver=3.13 - set my_flavor=dot +set my_arch=64 +rem settings delegated to generate_a_winpython_distro.bat set my_release= - set my_release_level= -rem set my_create_installer=False -set my_create_installer=nsis.zip -set my_create_installer=.7z -set my_create_installer=7zip - -rem 2024-07-14: ask both the 7zip auto executable and the .7z simple archive -rem set my_create_installer=False -rem set my_create_installer=7zip.7z +rem list of installers to create separated per dot: False=none, .zip=zip, .7z=.7z, 7zip=auto-extractible 7z set my_create_installer=7zip.7z.zip -set my_arch=64 set my_preclear_build_directory=Yes set tmp_reqdir=%my_root_dir_for_builds%\bd%my_python_target% -rem ****** THREADING -rem 20240629: handle cython-3.23 as a pre-requirement - -rem set my_requirements_pre=C:\WinP\bd313\requirements_pre.txt -rem set my_find_links_pre=C:\WinP\bd313\packages.win-amd64 - -rem ***** THREADING - set my_requirements=C:\Winp\bd313\dot_requirements.txt +set my_source_dirs=C:\Winp\bd313\packages.win-amd64 set my_find_links=C:\Winp\packages.srcreq - -set my_source_dirs=C:\Winp\bd313\packages.win-amd64 set my_toolsdirs=C:\Winp\bdTools\Tools.dot set my_docsdirs=C:\WinP\bdDocs\docs.dot @@ -49,12 +32,4 @@ set my_install_options=--no-index --pre --trusted-host=None call %~dp0\generate_a_winpython_distro.bat -set my_arch=32 -set my_preclear_build_directory=No - -set my_source_dirs=C:\Winp\bd313\packages.win32 - -rem call %~dp0\generate_a_winpython_distro.bat - - pause \ No newline at end of file diff --git a/generate_winpython_distros313_slim.bat b/generate_winpython_distros313_slim.bat index 27c68db1..7b7a1ffc 100644 --- a/generate_winpython_distros313_slim.bat +++ b/generate_winpython_distros313_slim.bat @@ -6,41 +6,25 @@ set my_original_path=%path% set my_root_dir_for_builds=C:\Winp set my_python_target=313 set my_pyver=3.13 - set my_flavor=slim +set my_arch=64 +rem settings delegated to generate_a_winpython_distro.bat set my_release= - set my_release_level= -rem set my_create_installer=False -set my_create_installer=nsis.zip -set my_create_installer=.7z -set my_create_installer=7zip - -rem 2024-07-14: ask both the 7zip auto executable and the .7z simple archive -rem set my_create_installer=False +rem list of installers to create separated per dot: False=none, .zip=zip, .7z=.7z, 7zip=auto-extractible 7z +rem set my_create_installer=7zip.7z.zip set my_create_installer=7zip.7z -set my_arch=64 set my_preclear_build_directory=Yes set tmp_reqdir=%my_root_dir_for_builds%\bd%my_python_target% -rem ****** THREADING -rem 20240629: handle cython-3.23 as a pre-requirement - -rem set my_requirements_pre=C:\WinP\bd313\requirements_pre.txt -rem set my_find_links_pre=C:\WinP\bd313\packages.win-amd64 - -rem ***** THREADING - set my_requirements=C:\Winp\bd313\requirements64_slim.txt - -set my_find_links=C:\Winp\packages.srcreq - set my_source_dirs=C:\Winp\bd313\packages.win-amd64 +set my_find_links=C:\Winp\packages.srcreq set my_toolsdirs=C:\Winp\bdTools\Tools.dot REM 2024-07-13:put back pandoc (so from 598Mo to 518Mo?) @@ -53,12 +37,4 @@ set my_install_options=--no-index --pre --trusted-host=None call %~dp0\generate_a_winpython_distro.bat -set my_arch=32 -set my_preclear_build_directory=No - -set my_source_dirs=C:\Winp\bd313\packages.win32 - -rem call %~dp0\generate_a_winpython_distro.bat - - pause \ No newline at end of file From 0d9bfb908be5096d67140e016203c0c0c1b7f20b Mon Sep 17 00:00:00 2001 From: stonebig Date: Sun, 9 Mar 2025 12:57:33 +0100 Subject: [PATCH 093/305] extracting Winpythonini.py out of make.py --- make.py | 118 +++---------------------------- portable/scripts/WinPythonIni.py | 104 +++++++++++++++++++++++++++ winpython/__init__.py | 2 +- 3 files changed, 116 insertions(+), 108 deletions(-) create mode 100644 portable/scripts/WinPythonIni.py diff --git a/make.py b/make.py index ebb8c48f..8e40a77e 100644 --- a/make.py +++ b/make.py @@ -501,6 +501,15 @@ def _create_launchers(self): shutil.copy2(item, self.winpy_dir) self._print_action_done() + def _copy_default_scripts(self): + """Copies launchers and defeult scripts.""" + self._print_action("copying pre-made scripts") + origin = PORTABLE_DIR / "scripts" + destination = self.winpy_dir / "scripts" + for item in origin.rglob('*.*'): + shutil.copy2(item, destination) + if self.verbose: + print(f" Copied : {item.name} -> {destination}") def _create_initial_batch_scripts(self): """Creates initial batch scripts, including environment setup.""" @@ -679,113 +688,6 @@ def _create_initial_batch_scripts(self): """ self.create_batch_script("env_for_icons.bat", env_for_icons_bat_content, replacements=batch_replacements) - - winpython_ini_py_content = r""" -# Prepares a dynamic list of variables settings from a .ini file -import os -import subprocess -from pathlib import Path - -winpython_inidefault=r''' -[debug] -state = disabled -[inactive_environment_per_user] -## changing this segment to [active_environment_per_user] makes this segment of lines active or not -HOME = %HOMEDRIVE%%HOMEPATH%\Documents\WinPython%WINPYVER%\settings -USERPROFILE = %HOME% -JUPYTER_DATA_DIR = %HOME% -WINPYWORKDIR = %HOMEDRIVE%%HOMEPATH%\Documents\WinPython%WINPYVER%\Notebooks -[inactive_environment_common] -USERPROFILE = %HOME% -[environment] -## Uncomment lines to override environment variables -#JUPYTERLAB_SETTINGS_DIR = %HOME%\.jupyter\lab -#JUPYTERLAB_WORKSPACES_DIR = %HOME%\.jupyter\lab\workspaces -#R_HOME=%WINPYDIRBASE%\t\R -#R_HOMEbin=%R_HOME%\bin\x64 -#JULIA_HOME=%WINPYDIRBASE%\t\Julia\bin\ -#JULIA_EXE=julia.exe -#JULIA=%JULIA_HOME%%JULIA_EXE% -#JULIA_PKGDIR=%WINPYDIRBASE%\settings\.julia -#QT_PLUGIN_PATH=%WINPYDIR%\Lib\site-packages\pyqt5_tools\Qt\plugins -''' - -def get_file(file_name): - if file_name.startswith("..\\"): - file_name = os.path.join(os.path.dirname(os.path.dirname(__file__)), file_name[3:]) - elif file_name.startswith(".\\"): - file_name = os.path.join(os.path.dirname(__file__), file_name[2:]) - try: - with open(file_name, 'r') as file: - return file.read() - except FileNotFoundError: - if file_name[-3:] == 'ini': - os.makedirs(Path(file_name).parent, exist_ok=True) - with open(file_name, 'w') as file: - file.write(winpython_inidefault) - return winpython_inidefault - -def translate(line, env): - parts = line.split('%') - for i in range(1, len(parts), 2): - if parts[i] in env: - parts[i] = env[parts[i]] - return ''.join(parts) - -def main(): - import sys - args = sys.argv[1:] - file_name = args[0] if args else "..\\settings\\winpython.ini" - - my_lines = get_file(file_name).splitlines() - segment = "environment" - txt = "" - env = os.environ.copy() # later_version: env = os.environ - - # default directories (from .bat) - os.makedirs(Path(env['WINPYDIRBASE']) / 'settings' / 'Appdata' / 'Roaming', exist_ok=True) - - # default qt.conf for Qt directories - qt_conf='''echo [Paths] - echo Prefix = . - echo Binaries = . - ''' - - pathlist = [Path(env['WINPYDIR']) / 'Lib' / 'site-packages' / i for i in ('PyQt5', 'PyQt6', 'Pyside6')] - for p in pathlist: - if p.is_dir(): - if not (p / 'qt.conf').is_file(): - with open(p / 'qt.conf', 'w') as file: - file.write(qt_conf) - - for l in my_lines: - if l.startswith("["): - segment = l[1:].split("]")[0] - elif not l.startswith("#") and "=" in l: - data = l.split("=", 1) - if segment == "debug" and data[0].strip() == "state": - data[0] = "WINPYDEBUG" - if segment in ["environment", "debug", "active_environment_per_user", "active_environment_common"]: - txt += f"set {data[0].strip()}={translate(data[1].strip(), env)}&& " - env[data[0].strip()] = translate(data[1].strip(), env) - if segment == "debug" and data[0].strip() == "state": - txt += f"set WINPYDEBUG={data[1].strip()}&&" - - print(txt) - - # set potential directory - for i in ('HOME', 'WINPYWORKDIR'): - if i in env: - os.makedirs(Path(env[i]), exist_ok=True) - # later_version: - # p = subprocess.Popen(["start", "cmd", "/k", "set"], shell = True) - # p.wait() # I can wait until finished (although it too finishes after start finishes) - -if __name__ == "__main__": - main() - """ - self.create_batch_script("WinPythonIni.py", winpython_ini_py_content) - self._print_action_done() @@ -994,8 +896,10 @@ def build(self, remove_existing: bool = True, requirements=None, winpy_dirname: if remove_existing: self._create_initial_batch_scripts() + self._copy_default_scripts() self._create_standard_batch_scripts() self._create_launchers() + utils.python_execmodule("ensurepip", self.distribution.target) # Ensure pip is installed for PyPy self.distribution.patch_standard_packages("pip") diff --git a/portable/scripts/WinPythonIni.py b/portable/scripts/WinPythonIni.py new file mode 100644 index 00000000..7bc11bb9 --- /dev/null +++ b/portable/scripts/WinPythonIni.py @@ -0,0 +1,104 @@ + +# Prepares a dynamic list of variables settings from a .ini file +import os +import subprocess +from pathlib import Path + +winpython_inidefault=r''' +[debug] +state = disabled +[inactive_environment_per_user] +## changing this segment to [active_environment_per_user] makes this segment of lines active or not +HOME = %HOMEDRIVE%%HOMEPATH%\Documents\WinPython%WINPYVER%\settings +USERPROFILE = %HOME% +JUPYTER_DATA_DIR = %HOME% +WINPYWORKDIR = %HOMEDRIVE%%HOMEPATH%\Documents\WinPython%WINPYVER%\Notebooks +[inactive_environment_common] +USERPROFILE = %HOME% +[environment] +## Uncomment lines to override environment variables +#JUPYTERLAB_SETTINGS_DIR = %HOME%\.jupyter\lab +#JUPYTERLAB_WORKSPACES_DIR = %HOME%\.jupyter\lab\workspaces +#R_HOME=%WINPYDIRBASE%\t\R +#R_HOMEbin=%R_HOME%\bin\x64 +#JULIA_HOME=%WINPYDIRBASE%\t\Julia\bin\ +#JULIA_EXE=julia.exe +#JULIA=%JULIA_HOME%%JULIA_EXE% +#JULIA_PKGDIR=%WINPYDIRBASE%\settings\.julia +#QT_PLUGIN_PATH=%WINPYDIR%\Lib\site-packages\pyqt5_tools\Qt\plugins +''' + +def get_file(file_name): + if file_name.startswith("..\\"): + file_name = os.path.join(os.path.dirname(os.path.dirname(__file__)), file_name[3:]) + elif file_name.startswith(".\\"): + file_name = os.path.join(os.path.dirname(__file__), file_name[2:]) + try: + with open(file_name, 'r') as file: + return file.read() + except FileNotFoundError: + if file_name[-3:] == 'ini': + os.makedirs(Path(file_name).parent, exist_ok=True) + with open(file_name, 'w') as file: + file.write(winpython_inidefault) + return winpython_inidefault + +def translate(line, env): + parts = line.split('%') + for i in range(1, len(parts), 2): + if parts[i] in env: + parts[i] = env[parts[i]] + return ''.join(parts) + +def main(): + import sys + args = sys.argv[1:] + file_name = args[0] if args else "..\\settings\\winpython.ini" + + my_lines = get_file(file_name).splitlines() + segment = "environment" + txt = "" + env = os.environ.copy() # later_version: env = os.environ + + # default directories (from .bat) + os.makedirs(Path(env['WINPYDIRBASE']) / 'settings' / 'Appdata' / 'Roaming', exist_ok=True) + + # default qt.conf for Qt directories + qt_conf='''echo [Paths] + echo Prefix = . + echo Binaries = . + ''' + + pathlist = [Path(env['WINPYDIR']) / 'Lib' / 'site-packages' / i for i in ('PyQt5', 'PyQt6', 'Pyside6')] + for p in pathlist: + if p.is_dir(): + if not (p / 'qt.conf').is_file(): + with open(p / 'qt.conf', 'w') as file: + file.write(qt_conf) + + for l in my_lines: + if l.startswith("["): + segment = l[1:].split("]")[0] + elif not l.startswith("#") and "=" in l: + data = l.split("=", 1) + if segment == "debug" and data[0].strip() == "state": + data[0] = "WINPYDEBUG" + if segment in ["environment", "debug", "active_environment_per_user", "active_environment_common"]: + txt += f"set {data[0].strip()}={translate(data[1].strip(), env)}&& " + env[data[0].strip()] = translate(data[1].strip(), env) + if segment == "debug" and data[0].strip() == "state": + txt += f"set WINPYDEBUG={data[1].strip()}&&" + + print(txt) + + # set potential directory + for i in ('HOME', 'WINPYWORKDIR'): + if i in env: + os.makedirs(Path(env[i]), exist_ok=True) + # later_version: + # p = subprocess.Popen(["start", "cmd", "/k", "set"], shell = True) + # p.wait() # I can wait until finished (although it too finishes after start finishes) + +if __name__ == "__main__": + main() + \ No newline at end of file diff --git a/winpython/__init__.py b/winpython/__init__.py index cca25d39..3c47549c 100644 --- a/winpython/__init__.py +++ b/winpython/__init__.py @@ -28,6 +28,6 @@ OTHER DEALINGS IN THE SOFTWARE. """ -__version__ = '13.1.20250222' +__version__ = '13.2.20250309' __license__ = __doc__ __project_url__ = 'http://winpython.github.io/' From 57c7e5043690b83a6451689a67d1bb042fb8de02 Mon Sep 17 00:00:00 2001 From: stonebig Date: Sun, 9 Mar 2025 14:44:28 +0100 Subject: [PATCH 094/305] move ".bat" fixed scripts out of make.py --- make.py | 142 ------------------ portable/scripts/WinPython_Terminal.bat | 3 + portable/scripts/activate.bat | 2 + portable/scripts/cmd.bat | 3 + portable/scripts/cmd_ps.bat | 3 + portable/scripts/make_winpython_fix.bat | 6 + portable/scripts/make_winpython_movable.bat | 6 + portable/scripts/python.bat | 3 + portable/scripts/register_python.bat | 4 + portable/scripts/register_python_for_all.bat | 3 + portable/scripts/spyder_reset.bat | 3 + portable/scripts/unregister_python.bat | 4 + .../scripts/unregister_python_for_all.bat | 3 + portable/scripts/upgrade_pip.bat | 7 + portable/scripts/winidle.bat | 3 + portable/scripts/winipython_notebook.bat | 3 + portable/scripts/winjupyter_lab.bat | 3 + portable/scripts/winpython.bat | 8 + portable/scripts/winqtconsole.bat | 3 + portable/scripts/winspyder.bat | 3 + portable/scripts/winvscode.bat | 10 ++ portable/scripts/wpcp.bat | 3 + 22 files changed, 86 insertions(+), 142 deletions(-) create mode 100644 portable/scripts/WinPython_Terminal.bat create mode 100644 portable/scripts/activate.bat create mode 100644 portable/scripts/cmd.bat create mode 100644 portable/scripts/cmd_ps.bat create mode 100644 portable/scripts/make_winpython_fix.bat create mode 100644 portable/scripts/make_winpython_movable.bat create mode 100644 portable/scripts/python.bat create mode 100644 portable/scripts/register_python.bat create mode 100644 portable/scripts/register_python_for_all.bat create mode 100644 portable/scripts/spyder_reset.bat create mode 100644 portable/scripts/unregister_python.bat create mode 100644 portable/scripts/unregister_python_for_all.bat create mode 100644 portable/scripts/upgrade_pip.bat create mode 100644 portable/scripts/winidle.bat create mode 100644 portable/scripts/winipython_notebook.bat create mode 100644 portable/scripts/winjupyter_lab.bat create mode 100644 portable/scripts/winpython.bat create mode 100644 portable/scripts/winqtconsole.bat create mode 100644 portable/scripts/winspyder.bat create mode 100644 portable/scripts/winvscode.bat create mode 100644 portable/scripts/wpcp.bat diff --git a/make.py b/make.py index 8e40a77e..73b3f941 100644 --- a/make.py +++ b/make.py @@ -636,12 +636,6 @@ def _create_initial_batch_scripts(self): """ self.create_batch_script("WinPython_PS_Prompt.ps1", ps1_content, replacements=batch_replacements) - cmd_ps_bat_content = r"""@echo off -call "%~dp0env_for_icons.bat" -Powershell.exe -Command "& {Start-Process PowerShell.exe -ArgumentList '-ExecutionPolicy RemoteSigned -noexit -File ""%~dp0WinPython_PS_Prompt.ps1""'}" -""" - self.create_batch_script("cmd_ps.bat", cmd_ps_bat_content, replacements=batch_replacements) - env_for_icons_bat_content = r"""@echo off call "%~dp0env.bat" @@ -703,34 +697,11 @@ def _create_standard_batch_scripts(self): if self.distribution and (Path(self.distribution.target) / r"lib-python\3\idlelib").is_dir(): batch_replacements.append((r"\Lib\idlelib", r"\lib-python\3\idlelib")) - self.create_batch_script("readme.txt", """These batch files are required to run WinPython icons. These files should help the user writing his/her own The environment variables are set-up in 'env.bat' and 'env_for_icons.bat'.""", ) - self.create_batch_script( - "make_winpython_movable.bat", - r"""@echo off -call "%~dp0env.bat" -echo patch pip and current launchers for move - -"%WINPYDIR%\python.exe" -c "from winpython import wppm;dist=wppm.Distribution(r'%WINPYDIR%');dist.patch_standard_packages('pip', to_movable=True)" -pause""", - replacements=batch_replacements - ) - - self.create_batch_script( - "make_winpython_fix.bat", - r"""@echo off -call "%~dp0env.bat" -echo patch pip and current launchers for non-move - -"%WINPYDIR%\python.exe" -c "from winpython import wppm;dist=wppm.Distribution(r'%WINPYDIR%');dist.patch_standard_packages('pip', to_movable=False)" -pause""", - replacements=batch_replacements - ) - for ini_patch_script in [ ("make_working_directory_be_not_winpython.bat", "[active_environment", "[inactive_environment", "[inactive_environment_per_user]", "[active_environment_per_user]"), ("make_working_directory_be_winpython.bat", "[active_environment", "[inactive_environment"), @@ -744,119 +715,6 @@ def _create_standard_batch_scripts(self): content += f""""%PYTHON%" -c "from winpython.utils import patch_sourcefile;patch_sourcefile(r'%~dp0..\\settings\winpython.ini', '{patch2[0]}', '{patch2[1]}' )" """ self.create_batch_script(name, content) - - self.create_batch_script("cmd.bat", r"""@echo off -call "%~dp0env_for_icons.bat" %* -cmd.exe /k""", replacements=batch_replacements) - - self.create_batch_script("WinPython_Terminal.bat", r"""@echo off -Powershell.exe -Command "& {Start-Process PowerShell.exe -ArgumentList '-ExecutionPolicy RemoteSigned -noexit -File ""%~dp0WinPython_PS_Prompt.ps1""'}" -exit""", replacements=batch_replacements) - - self.create_batch_script("python.bat", r"""@echo off -call "%~dp0env_for_icons.bat" %* -"%WINPYDIR%\python.exe" %*""", replacements=batch_replacements) - - self.create_batch_script( - "winpython.bat", - r"""@echo off -call "%~dp0env_for_icons.bat" %* -rem backward compatibility for non-ptpython users -if exist "%WINPYDIR%\scripts\ptpython.exe" ( - "%WINPYDIR%\scripts\ptpython.exe" %* -) else ( - "%WINPYDIR%\python.exe" %* -)""", - replacements=batch_replacements - ) - - self.create_batch_script( - "winidle.bat", - r"""@echo off -call "%~dp0env_for_icons.bat" %* -"%WINPYDIR%\python.exe" "%WINPYDIR%\Lib\idlelib\idle.pyw" %*""", - replacements=batch_replacements - ) - - self.create_batch_script( - "winspyder.bat", - r"""@echo off -call "%~dp0env_for_icons.bat" %* -"%WINPYDIR%\scripts\spyder.exe" %* -w "%WINPYWORKDIR1%" """, - ) - - self.create_batch_script( - "spyder_reset.bat", - r"""@echo off -call "%~dp0env_for_icons.bat" -"%WINPYDIR%\scripts\spyder.exe" --reset %*""", - ) - - for jupyter_script in [ - ("winipython_notebook.bat", "jupyter-notebook.exe"), - ("winjupyter_lab.bat", "jupyter-lab.exe"), - ("winqtconsole.bat", "jupyter-qtconsole.exe"), - ]: - name, exe = jupyter_script - self.create_batch_script(name, f"""@echo off -call "%~dp0env_for_icons.bat" %* -"%WINPYDIR%\\scripts\\{exe}" %*""") - - - self.create_python_launcher_batch( - "register_python.bat", - r'"%WINPYDIR%\Lib\site-packages\winpython\register_python.py"', - working_dir=r'"%WINPYDIR%\Scripts"', - ) - - self.create_python_launcher_batch( - "unregister_python.bat", - r'"%WINPYDIR%\Lib\site-packages\winpython\unregister_python.py"', - working_dir=r'"%WINPYDIR%\Scripts"', - ) - - for register_all_script in [ - ("register_python_for_all.bat", "register_python.bat"), - ("unregister_python_for_all.bat", "unregister_python.bat"), - ]: - name, base_script = register_all_script - self.create_batch_script(name, f"""@echo off -call "%~dp0env.bat" -call "%~dp0{base_script}" --all""") - - - self.create_batch_script("wpcp.bat", r"""@echo off -call "%~dp0env_for_icons.bat" %* -cmd.exe /k "echo wppm & wppm" """, replacements=batch_replacements) - - self.create_batch_script( - "upgrade_pip.bat", - r"""@echo off -call "%~dp0env.bat" -echo this will upgrade pip with latest version, then patch it for WinPython portability ok ? -pause -"%WINPYDIR%\python.exe" -m pip install --upgrade pip -"%WINPYDIR%\python.exe" -c "from winpython import wppm;dist=wppm.Distribution(r'%WINPYDIR%');dist.patch_standard_packages('pip', to_movable=True) -pause""", - replacements=batch_replacements - ) - - self.create_batch_script("activate.bat", r"""@echo off -call "%~dp0env.bat" %*""", replacements=batch_replacements) - - - vscode_bat_content = r"""@echo off -call "%~dp0env_for_icons.bat" -if exist "%WINPYDIR%\..\t\vscode\code.exe" ( - "%WINPYDIR%\..\t\vscode\code.exe" %* -) else ( -if exist "%LOCALAPPDATA%\Programs\Microsoft VS Code\code.exe" ( - "%LOCALAPPDATA%\Programs\Microsoft VS Code\code.exe" %* -) else ( - "code.exe" %* -))""" - self.create_batch_script("winvscode.bat", vscode_bat_content) - self._print_action_done() diff --git a/portable/scripts/WinPython_Terminal.bat b/portable/scripts/WinPython_Terminal.bat new file mode 100644 index 00000000..3e55a021 --- /dev/null +++ b/portable/scripts/WinPython_Terminal.bat @@ -0,0 +1,3 @@ +@echo off +Powershell.exe -Command "& {Start-Process PowerShell.exe -ArgumentList '-ExecutionPolicy RemoteSigned -noexit -File ""%~dp0WinPython_PS_Prompt.ps1""'}" +exit \ No newline at end of file diff --git a/portable/scripts/activate.bat b/portable/scripts/activate.bat new file mode 100644 index 00000000..e52886af --- /dev/null +++ b/portable/scripts/activate.bat @@ -0,0 +1,2 @@ +@echo off +call "%~dp0env.bat" %* \ No newline at end of file diff --git a/portable/scripts/cmd.bat b/portable/scripts/cmd.bat new file mode 100644 index 00000000..fc76541f --- /dev/null +++ b/portable/scripts/cmd.bat @@ -0,0 +1,3 @@ +@echo off +call "%~dp0env_for_icons.bat" %* +cmd.exe /k \ No newline at end of file diff --git a/portable/scripts/cmd_ps.bat b/portable/scripts/cmd_ps.bat new file mode 100644 index 00000000..c6fa79a4 --- /dev/null +++ b/portable/scripts/cmd_ps.bat @@ -0,0 +1,3 @@ +@echo off +call "%~dp0env_for_icons.bat" +Powershell.exe -Command "& {Start-Process PowerShell.exe -ArgumentList '-ExecutionPolicy RemoteSigned -noexit -File ""%~dp0WinPython_PS_Prompt.ps1""'}" diff --git a/portable/scripts/make_winpython_fix.bat b/portable/scripts/make_winpython_fix.bat new file mode 100644 index 00000000..a0dddfa6 --- /dev/null +++ b/portable/scripts/make_winpython_fix.bat @@ -0,0 +1,6 @@ +@echo off +call "%~dp0env.bat" +echo patch pip and current launchers for non-move + +"%WINPYDIR%\python.exe" -c "from winpython import wppm;dist=wppm.Distribution(r'%WINPYDIR%');dist.patch_standard_packages('pip', to_movable=False)" +pause \ No newline at end of file diff --git a/portable/scripts/make_winpython_movable.bat b/portable/scripts/make_winpython_movable.bat new file mode 100644 index 00000000..2ae903f8 --- /dev/null +++ b/portable/scripts/make_winpython_movable.bat @@ -0,0 +1,6 @@ +@echo off +call "%~dp0env.bat" +echo patch pip and current launchers for move + +"%WINPYDIR%\python.exe" -c "from winpython import wppm;dist=wppm.Distribution(r'%WINPYDIR%');dist.patch_standard_packages('pip', to_movable=True)" +pause \ No newline at end of file diff --git a/portable/scripts/python.bat b/portable/scripts/python.bat new file mode 100644 index 00000000..1e8fea0b --- /dev/null +++ b/portable/scripts/python.bat @@ -0,0 +1,3 @@ +@echo off +call "%~dp0env_for_icons.bat" %* +"%WINPYDIR%\python.exe" %* \ No newline at end of file diff --git a/portable/scripts/register_python.bat b/portable/scripts/register_python.bat new file mode 100644 index 00000000..945110e6 --- /dev/null +++ b/portable/scripts/register_python.bat @@ -0,0 +1,4 @@ +@echo off +call "%~dp0env_for_icons.bat" +cd /D "%WINPYDIR%\Scripts" +"%WINPYDIR%\python.exe" "%WINPYDIR%\Lib\site-packages\winpython\register_python.py" %* \ No newline at end of file diff --git a/portable/scripts/register_python_for_all.bat b/portable/scripts/register_python_for_all.bat new file mode 100644 index 00000000..e9e4e7f9 --- /dev/null +++ b/portable/scripts/register_python_for_all.bat @@ -0,0 +1,3 @@ +@echo off +call "%~dp0env.bat" +call "%~dp0register_python.bat" --all \ No newline at end of file diff --git a/portable/scripts/spyder_reset.bat b/portable/scripts/spyder_reset.bat new file mode 100644 index 00000000..89cb78c8 --- /dev/null +++ b/portable/scripts/spyder_reset.bat @@ -0,0 +1,3 @@ +@echo off +call "%~dp0env_for_icons.bat" +"%WINPYDIR%\scripts\spyder.exe" --reset %* \ No newline at end of file diff --git a/portable/scripts/unregister_python.bat b/portable/scripts/unregister_python.bat new file mode 100644 index 00000000..40a9b12e --- /dev/null +++ b/portable/scripts/unregister_python.bat @@ -0,0 +1,4 @@ +@echo off +call "%~dp0env_for_icons.bat" +cd /D "%WINPYDIR%\Scripts" +"%WINPYDIR%\python.exe" "%WINPYDIR%\Lib\site-packages\winpython\unregister_python.py" %* \ No newline at end of file diff --git a/portable/scripts/unregister_python_for_all.bat b/portable/scripts/unregister_python_for_all.bat new file mode 100644 index 00000000..6aca706f --- /dev/null +++ b/portable/scripts/unregister_python_for_all.bat @@ -0,0 +1,3 @@ +@echo off +call "%~dp0env.bat" +call "%~dp0unregister_python.bat" --all \ No newline at end of file diff --git a/portable/scripts/upgrade_pip.bat b/portable/scripts/upgrade_pip.bat new file mode 100644 index 00000000..da212592 --- /dev/null +++ b/portable/scripts/upgrade_pip.bat @@ -0,0 +1,7 @@ +@echo off +call "%~dp0env.bat" +echo this will upgrade pip with latest version, then patch it for WinPython portability ok ? +pause +"%WINPYDIR%\python.exe" -m pip install --upgrade pip +"%WINPYDIR%\python.exe" -c "from winpython import wppm;dist=wppm.Distribution(r'%WINPYDIR%');dist.patch_standard_packages('pip', to_movable=True) +pause \ No newline at end of file diff --git a/portable/scripts/winidle.bat b/portable/scripts/winidle.bat new file mode 100644 index 00000000..79a6a01a --- /dev/null +++ b/portable/scripts/winidle.bat @@ -0,0 +1,3 @@ +@echo off +call "%~dp0env_for_icons.bat" %* +"%WINPYDIR%\python.exe" "%WINPYDIR%\Lib\idlelib\idle.pyw" %* \ No newline at end of file diff --git a/portable/scripts/winipython_notebook.bat b/portable/scripts/winipython_notebook.bat new file mode 100644 index 00000000..7ee541d9 --- /dev/null +++ b/portable/scripts/winipython_notebook.bat @@ -0,0 +1,3 @@ +@echo off +call "%~dp0env_for_icons.bat" %* +"%WINPYDIR%\scripts\jupyter-notebook.exe" %* \ No newline at end of file diff --git a/portable/scripts/winjupyter_lab.bat b/portable/scripts/winjupyter_lab.bat new file mode 100644 index 00000000..845d1f0b --- /dev/null +++ b/portable/scripts/winjupyter_lab.bat @@ -0,0 +1,3 @@ +@echo off +call "%~dp0env_for_icons.bat" %* +"%WINPYDIR%\scripts\jupyter-lab.exe" %* \ No newline at end of file diff --git a/portable/scripts/winpython.bat b/portable/scripts/winpython.bat new file mode 100644 index 00000000..9f98d397 --- /dev/null +++ b/portable/scripts/winpython.bat @@ -0,0 +1,8 @@ +@echo off +call "%~dp0env_for_icons.bat" %* +rem backward compatibility for non-ptpython users +if exist "%WINPYDIR%\scripts\ptpython.exe" ( + "%WINPYDIR%\scripts\ptpython.exe" %* +) else ( + "%WINPYDIR%\python.exe" %* +) \ No newline at end of file diff --git a/portable/scripts/winqtconsole.bat b/portable/scripts/winqtconsole.bat new file mode 100644 index 00000000..c05e36fa --- /dev/null +++ b/portable/scripts/winqtconsole.bat @@ -0,0 +1,3 @@ +@echo off +call "%~dp0env_for_icons.bat" %* +"%WINPYDIR%\scripts\jupyter-qtconsole.exe" %* \ No newline at end of file diff --git a/portable/scripts/winspyder.bat b/portable/scripts/winspyder.bat new file mode 100644 index 00000000..deae01c5 --- /dev/null +++ b/portable/scripts/winspyder.bat @@ -0,0 +1,3 @@ +@echo off +call "%~dp0env_for_icons.bat" %* +"%WINPYDIR%\scripts\spyder.exe" %* -w "%WINPYWORKDIR1%" \ No newline at end of file diff --git a/portable/scripts/winvscode.bat b/portable/scripts/winvscode.bat new file mode 100644 index 00000000..efcb4208 --- /dev/null +++ b/portable/scripts/winvscode.bat @@ -0,0 +1,10 @@ +@echo off +call "%~dp0env_for_icons.bat" +if exist "%WINPYDIR%\..\t\vscode\code.exe" ( + "%WINPYDIR%\..\t\vscode\code.exe" %* +) else ( +if exist "%LOCALAPPDATA%\Programs\Microsoft VS Code\code.exe" ( + "%LOCALAPPDATA%\Programs\Microsoft VS Code\code.exe" %* +) else ( + "code.exe" %* +)) \ No newline at end of file diff --git a/portable/scripts/wpcp.bat b/portable/scripts/wpcp.bat new file mode 100644 index 00000000..069b3544 --- /dev/null +++ b/portable/scripts/wpcp.bat @@ -0,0 +1,3 @@ +@echo off +call "%~dp0env_for_icons.bat" %* +cmd.exe /k "echo wppm & wppm" \ No newline at end of file From 48cc0c4ca24a68e9d2369659b67783aa8c2e9e44 Mon Sep 17 00:00:00 2001 From: stonebig Date: Sun, 9 Mar 2025 15:11:27 +0100 Subject: [PATCH 095/305] move "env_for_icons.bat" out of make.py --- make.py | 50 ++---------------------------- portable/scripts/env_for_icons.bat | 42 +++++++++++++++++++++++++ 2 files changed, 44 insertions(+), 48 deletions(-) create mode 100644 portable/scripts/env_for_icons.bat diff --git a/make.py b/make.py index 73b3f941..e905a463 100644 --- a/make.py +++ b/make.py @@ -489,7 +489,7 @@ def _copy_documentation(self): self._print_action_done() - def _create_launchers(self): + def _copy_launchers(self): """Copies pre-made launchers to the WinPython directory.""" self._print_action("Creating launchers") launchers_source_dir = PORTABLE_DIR / "launchers_final" @@ -636,52 +636,6 @@ def _create_initial_batch_scripts(self): """ self.create_batch_script("WinPython_PS_Prompt.ps1", ps1_content, replacements=batch_replacements) - - env_for_icons_bat_content = r"""@echo off -call "%~dp0env.bat" - -rem default is as before: Winpython ..\Notebooks -set WINPYWORKDIR=%WINPYDIRBASE%\Notebooks -set WINPYWORKDIR1=%WINPYWORKDIR% - -rem if we have a file or directory in %1 parameter, we use that directory to define WINPYWORKDIR1 -if not "%~1"=="" ( - if exist "%~1" ( - if exist "%~1\" ( - rem echo it is a directory %~1 - set WINPYWORKDIR1=%~1 - ) else ( - rem echo it is a file %~1, so we take the directory %~dp1 - set WINPYWORKDIR1=%~dp1 - ) - ) -) else ( -rem if it is launched from another directory than icon origin , we keep it that one echo %__CD__% -if not "%__CD__%"=="%~dp0" if not "%__CD__%scripts\"=="%~dp0" set WINPYWORKDIR1="%__CD__%" -) -rem remove potential doublequote -set WINPYWORKDIR1=%WINPYWORKDIR1:"=% -rem remove some potential last \ -if "%WINPYWORKDIR1:~-1%"=="\" set WINPYWORKDIR1=%WINPYWORKDIR1:~0,-1% - -rem you can use winpython.ini to change defaults -FOR /F "delims=" %%i IN ('""%WINPYDIR%\python.exe" "%~dp0WinpythonIni.py""') DO set winpythontoexec=%%i -%winpythontoexec%set winpythontoexec= - - -rem Preventive Working Directories creation if needed -if not "%WINPYWORKDIR%"=="" if not exist "%WINPYWORKDIR%" mkdir "%WINPYWORKDIR%" -if not "%WINPYWORKDIR1%"=="" if not exist "%WINPYWORKDIR1%" mkdir "%WINPYWORKDIR1%" - -rem Change of directory only if we are in a launcher directory -if "%__CD__%scripts\"=="%~dp0" cd/D %WINPYWORKDIR1% -if "%__CD__%"=="%~dp0" cd/D %WINPYWORKDIR1% - -if not exist "%HOME%\.spyder-py%WINPYVER:~0,1%" mkdir "%HOME%\.spyder-py%WINPYVER:~0,1%" -if not exist "%HOME%\.spyder-py%WINPYVER:~0,1%\workingdir" echo %HOME%\Notebooks>"%HOME%\.spyder-py%WINPYVER:~0,1%\workingdir" -""" - self.create_batch_script("env_for_icons.bat", env_for_icons_bat_content, replacements=batch_replacements) - self._print_action_done() @@ -756,7 +710,7 @@ def build(self, remove_existing: bool = True, requirements=None, winpy_dirname: self._create_initial_batch_scripts() self._copy_default_scripts() self._create_standard_batch_scripts() - self._create_launchers() + self._copy_launchers() utils.python_execmodule("ensurepip", self.distribution.target) # Ensure pip is installed for PyPy self.distribution.patch_standard_packages("pip") diff --git a/portable/scripts/env_for_icons.bat b/portable/scripts/env_for_icons.bat new file mode 100644 index 00000000..a6ac886f --- /dev/null +++ b/portable/scripts/env_for_icons.bat @@ -0,0 +1,42 @@ +@echo off +call "%~dp0env.bat" + +rem default is as before: Winpython ..\Notebooks +set WINPYWORKDIR=%WINPYDIRBASE%\Notebooks +set WINPYWORKDIR1=%WINPYWORKDIR% + +rem if we have a file or directory in %1 parameter, we use that directory to define WINPYWORKDIR1 +if not "%~1"=="" ( + if exist "%~1" ( + if exist "%~1\" ( + rem echo it is a directory %~1 + set WINPYWORKDIR1=%~1 + ) else ( + rem echo it is a file %~1, so we take the directory %~dp1 + set WINPYWORKDIR1=%~dp1 + ) + ) +) else ( +rem if it is launched from another directory than icon origin , we keep it that one echo %__CD__% +if not "%__CD__%"=="%~dp0" if not "%__CD__%scripts\"=="%~dp0" set WINPYWORKDIR1="%__CD__%" +) +rem remove potential doublequote +set WINPYWORKDIR1=%WINPYWORKDIR1:"=% +rem remove some potential last \ +if "%WINPYWORKDIR1:~-1%"=="\" set WINPYWORKDIR1=%WINPYWORKDIR1:~0,-1% + +rem you can use winpython.ini to change defaults +FOR /F "delims=" %%i IN ('""%WINPYDIR%\python.exe" "%~dp0WinpythonIni.py""') DO set winpythontoexec=%%i +%winpythontoexec%set winpythontoexec= + + +rem Preventive Working Directories creation if needed +if not "%WINPYWORKDIR%"=="" if not exist "%WINPYWORKDIR%" mkdir "%WINPYWORKDIR%" +if not "%WINPYWORKDIR1%"=="" if not exist "%WINPYWORKDIR1%" mkdir "%WINPYWORKDIR1%" + +rem Change of directory only if we are in a launcher directory +if "%__CD__%scripts\"=="%~dp0" cd/D %WINPYWORKDIR1% +if "%__CD__%"=="%~dp0" cd/D %WINPYWORKDIR1% + +if not exist "%HOME%\.spyder-py%WINPYVER:~0,1%" mkdir "%HOME%\.spyder-py%WINPYVER:~0,1%" +if not exist "%HOME%\.spyder-py%WINPYVER:~0,1%\workingdir" echo %HOME%\Notebooks>"%HOME%\.spyder-py%WINPYVER:~0,1%\workingdir" From b84859e63313c63cfd9a4184f551eaac4fe01da2 Mon Sep 17 00:00:00 2001 From: stonebig Date: Sun, 9 Mar 2025 17:00:03 +0100 Subject: [PATCH 096/305] use a common _copy_items function --- make.py | 73 +++++++++++++++++++++++---------------------------------- 1 file changed, 29 insertions(+), 44 deletions(-) diff --git a/make.py b/make.py index e905a463..2b383e2d 100644 --- a/make.py +++ b/make.py @@ -113,6 +113,30 @@ def build_installer_7zip( except subprocess.CalledProcessError as e: print(f"Error executing 7-Zip script: {e}", file=sys.stderr) +def _copy_items(source_dirs: list[Path], target_dir: Path, verbose: bool = False): + """ + Copies items from source directories to the target directory. + + Args: + source_dirs: List of source directories to copy items from. + target_dir: Target directory to copy items to. + verbose: Enable verbose output. + """ + target_dir.mkdir(parents=True, exist_ok=True) + for source_dir in source_dirs: + if not source_dir.is_dir(): + print(f"Warning: Source directory not found: {source_dir}") + continue + for item_name in os.listdir(source_dir): + source_item = source_dir / item_name + target_item = target_dir / item_name + copy_func = shutil.copytree if source_item.is_dir() else shutil.copy2 + try: + copy_func(source_item, target_item) + if verbose: + print(f" Copied: {source_item} -> {target_item}") + except Exception as e: + print(f"Error copying {source_item} to {target_item}: {e}") class WinPythonDistributionBuilder: """ @@ -434,26 +458,11 @@ def _extract_python_archive(self): if self.python_dir_name != self.python_name and not python_target_dir.is_dir(): os.rename(self.winpy_dir / self.python_name, python_target_dir) - def _copy_tools(self): """Copies development tools to the WinPython 't' directory.""" tools_target_dir = self.winpy_dir / "t" self._print_action(f"Copying tools to {tools_target_dir}") - tools_target_dir.mkdir(parents=True, exist_ok=True) - for source_dir in self.tools_directories: - if not source_dir.is_dir(): - print(f"Warning: Tools directory not found: {source_dir}") - continue - for item_name in os.listdir(source_dir): - source_item = source_dir / item_name - target_item = tools_target_dir / item_name - copy_func = shutil.copytree if source_item.is_dir() else shutil.copy2 - try: - copy_func(source_item, target_item) - if self.verbose: - print(f" Copied: {source_item} -> {target_item}") - except Exception as e: - print(f"Error copying {source_item} to {target_item}: {e}") + _copy_items(self.tools_directories, tools_target_dir, self.verbose) # Special handling for Node.js to move it up one level nodejs_current_dir = tools_target_dir / "n" @@ -463,42 +472,20 @@ def _copy_tools(self): shutil.move(nodejs_current_dir, nodejs_target_dir) except Exception as e: print(f"Error moving Node.js directory: {e}") - self._print_action_done() - def _copy_documentation(self): """Copies documentation files to the WinPython 'docs' directory.""" docs_target_dir = self.winpy_dir / "notebooks" / "docs" self._print_action(f"Copying documentation to {docs_target_dir}") - docs_target_dir.mkdir(parents=True, exist_ok=True) - for source_dir in self.docs_directories: - if not source_dir.is_dir(): - print(f"Warning: Documentation directory not found: {source_dir}") - continue - for item_name in os.listdir(source_dir): - source_item = source_dir / item_name - target_item = docs_target_dir / item_name - copy_func = shutil.copytree if source_item.is_dir() else shutil.copy2 - try: - copy_func(source_item, target_item) - if self.verbose: - print(f" Copied: {source_item} -> {target_item}") - except Exception as e: - print(f"Error copying {source_item} to {target_item}: {e}") + _copy_items(self.docs_directories, docs_target_dir, self.verbose) self._print_action_done() - def _copy_launchers(self): """Copies pre-made launchers to the WinPython directory.""" self._print_action("Creating launchers") launchers_source_dir = PORTABLE_DIR / "launchers_final" - for item in launchers_source_dir.rglob('*.exe'): - shutil.copy2(item, self.winpy_dir) - if self.verbose: - print(f" Copied launcher: {item.name} -> {self.winpy_dir}") - for item in launchers_source_dir.rglob('licence*.*'): - shutil.copy2(item, self.winpy_dir) + _copy_items([launchers_source_dir], self.winpy_dir, self.verbose) self._print_action_done() def _copy_default_scripts(self): @@ -506,10 +493,8 @@ def _copy_default_scripts(self): self._print_action("copying pre-made scripts") origin = PORTABLE_DIR / "scripts" destination = self.winpy_dir / "scripts" - for item in origin.rglob('*.*'): - shutil.copy2(item, destination) - if self.verbose: - print(f" Copied : {item.name} -> {destination}") + _copy_items([origin], destination, self.verbose) + self._print_action_done() def _create_initial_batch_scripts(self): """Creates initial batch scripts, including environment setup.""" From cfe1b85b319fbd689c964ea77f0952d519dcb346 Mon Sep 17 00:00:00 2001 From: stonebig Date: Sun, 9 Mar 2025 18:58:26 +0100 Subject: [PATCH 097/305] move env.bat and WinPython_PS_Prompt.ps1 out of make.py --- make.py | 123 ++--------------------- portable/scripts/WinPython_PS_Prompt.ps1 | 57 +++++++++++ portable/scripts/env.bat | 41 ++++++++ portable/scripts/readme.txt | 3 + 4 files changed, 111 insertions(+), 113 deletions(-) create mode 100644 portable/scripts/WinPython_PS_Prompt.ps1 create mode 100644 portable/scripts/env.bat create mode 100644 portable/scripts/readme.txt diff --git a/make.py b/make.py index 2b383e2d..68bac141 100644 --- a/make.py +++ b/make.py @@ -495,7 +495,7 @@ def _copy_default_scripts(self): destination = self.winpy_dir / "scripts" _copy_items([origin], destination, self.verbose) self._print_action_done() - + def _create_initial_batch_scripts(self): """Creates initial batch scripts, including environment setup.""" self._print_action("Creating initial batch scripts") @@ -515,112 +515,14 @@ def _create_initial_batch_scripts(self): if self.distribution and (Path(self.distribution.target) / r"lib-python\3\idlelib").is_dir(): batch_replacements.append((r"\Lib\idlelib", r"\lib-python\3\idlelib")) - - env_bat_content = f"""@echo off -set WINPYDIRBASE=%~dp0.. - -rem get a normalized path -set WINPYDIRBASETMP=%~dp0.. -pushd %WINPYDIRBASETMP% -set WINPYDIRBASE=%__CD__% -if "%WINPYDIRBASE:~-1%"=="\\" set WINPYDIRBASE=%WINPYDIRBASE:~0,-1% -set WINPYDIRBASETMP= -popd - -set WINPYDIR=%WINPYDIRBASE%\\{self.python_dir_name} -rem 2019-08-25 pyjulia needs absolutely a variable PYTHON=%WINPYDIR%\\python.exe -set PYTHON=%WINPYDIR%\\python.exe -set PYTHONPATHz=%WINPYDIR%;%WINPYDIR%\\Lib;%WINPYDIR%\\DLLs -set WINPYVER={self.winpython_version_name} - -rem 2023-02-12 utf-8 on console to avoid pip crash -rem see https://github.com/pypa/pip/issues/11798#issuecomment-1427069681 -set PYTHONIOENCODING=utf-8 -rem set PYTHONUTF8=1 creates issues in "movable" patching - -set HOME=%WINPYDIRBASE%\\settings -rem see https://github.com/winpython/winpython/issues/839 -rem set USERPROFILE=%HOME% -set JUPYTER_DATA_DIR=%HOME% -set JUPYTER_CONFIG_DIR=%WINPYDIR%\\etc\\jupyter -set JUPYTER_CONFIG_PATH=%WINPYDIR%\\etc\\jupyter -set FINDDIR=%WINDIR%\\system32 - -rem Remove all double quotes -set PATH_CLEANED=%PATH:"=% -echo ";%PATH_CLEANED%;" | %FINDDIR%\\find.exe /C /I ";%WINPYDIR%\\;" >nul -if %ERRORLEVEL% NEQ 0 ( - set "PATH={full_path_env_var}" - cd . -) -set PATH_CLEANED= - -rem force default pyqt5 kit for Spyder if PyQt5 module is there -if exist "%WINPYDIR%\\Lib\\site-packages\\PyQt5\\__init__.py" set QT_API=pyqt5 -""" - self.create_batch_script("env.bat", env_bat_content, replacements=batch_replacements) - - - ps1_content = r"""### WinPython_PS_Prompt.ps1 ### -$0 = $myInvocation.MyCommand.Definition -$dp0 = [System.IO.Path]::GetDirectoryName($0) -# $env:PYTHONUTF8 = 1 would create issues in "movable" patching -$env:WINPYDIRBASE = "$dp0\.." -# get a normalize path -# http://stackoverflow.com/questions/1645843/resolve-absolute-path-from-relative-path-and-or-file-name -$env:WINPYDIRBASE = [System.IO.Path]::GetFullPath( $env:WINPYDIRBASE ) - -# avoid double_init (will only resize screen) -if (-not ($env:WINPYDIR -eq [System.IO.Path]::GetFullPath( $env:WINPYDIRBASE+""" + '"\\' + self.python_dir_name + '"' + r""")) ) { -$env:WINPYDIR = $env:WINPYDIRBASE+""" + '"\\' + self.python_dir_name + '"' + r""" -# 2019-08-25 pyjulia needs absolutely a variable PYTHON=%WINPYDIR%python.exe -$env:PYTHON = "%WINPYDIR%\python.exe" -$env:PYTHONPATHz = "%WINPYDIR%;%WINPYDIR%\Lib;%WINPYDIR%\DLLs" - -$env:WINPYVER = '""" + self.winpython_version_name + r"""' -# rem 2023-02-12 try utf-8 on console -# rem see https://github.com/pypa/pip/issues/11798#issuecomment-1427069681 -$env:PYTHONIOENCODING = "utf-8" - -$env:HOME = "$env:WINPYDIRBASE\settings" - -# rem read https://github.com/winpython/winpython/issues/839 -# $env:USERPROFILE = "$env:HOME" - -$env:WINPYDIRBASE = "" -$env:JUPYTER_DATA_DIR = "$env:HOME" - -if (-not $env:PATH.ToLower().Contains(";"+ $env:WINPYDIR.ToLower()+ ";")) { - $env:PATH = """ + '"' + full_path_ps_env_var + '"' + r""" } - -#rem force default pyqt5 kit for Spyder if PyQt5 module is there -if (Test-Path "$env:WINPYDIR\Lib\site-packages\PyQt5\__init__.py") { $env:QT_API = "pyqt5" } - -# PyQt5 qt.conf creation and winpython.ini creation done via Winpythonini.py (called per env_for_icons.bat for now) -# Start-Process -FilePath $env:PYTHON -ArgumentList ($env:WINPYDIRBASE + '\scripts\WinPythonIni.py') - - -### Set-WindowSize - -Function Set-WindowSize { -Param([int]$x=$host.ui.rawui.windowsize.width, - [int]$y=$host.ui.rawui.windowsize.heigth, - [int]$buffer=$host.UI.RawUI.BufferSize.heigth) - $buffersize = new-object System.Management.Automation.Host.Size($x,$buffer) - $host.UI.RawUI.BufferSize = $buffersize - $size = New-Object System.Management.Automation.Host.Size($x,$y) - $host.ui.rawui.WindowSize = $size -} -# Windows10 yelling at us with 150 40 6000 -# Set-WindowSize 195 40 6000 - -### Colorize to distinguish -$host.ui.RawUI.BackgroundColor = "Black" -$host.ui.RawUI.ForegroundColor = "White" -} -""" - self.create_batch_script("WinPython_PS_Prompt.ps1", ps1_content, replacements=batch_replacements) - + destination = self.winpy_dir / "scripts" + for specials in ('env.bat', 'WinPython_PS_Prompt.ps1'): + destspe=str(destination / specials) + print('destspe:', destspe) + utils.patch_sourcefile(destspe,'{self.python_dir_name}', self.python_dir_name) + utils.patch_sourcefile(destspe,'{self.winpython_version_name}', self.winpython_version_name) + utils.patch_sourcefile(destspe,'{full_path_env_var}', full_path_env_var) + utils.patch_sourcefile(destspe,'{full_path_ps_env_var}', full_path_ps_env_var) self._print_action_done() @@ -636,11 +538,6 @@ def _create_standard_batch_scripts(self): if self.distribution and (Path(self.distribution.target) / r"lib-python\3\idlelib").is_dir(): batch_replacements.append((r"\Lib\idlelib", r"\lib-python\3\idlelib")) - self.create_batch_script("readme.txt", """These batch files are required to run WinPython icons. -These files should help the user writing his/her own -The environment variables are set-up in 'env.bat' and 'env_for_icons.bat'.""", - ) - for ini_patch_script in [ ("make_working_directory_be_not_winpython.bat", "[active_environment", "[inactive_environment", "[inactive_environment_per_user]", "[active_environment_per_user]"), ("make_working_directory_be_winpython.bat", "[active_environment", "[inactive_environment"), @@ -692,8 +589,8 @@ def build(self, remove_existing: bool = True, requirements=None, winpy_dirname: ) if remove_existing: - self._create_initial_batch_scripts() self._copy_default_scripts() + self._create_initial_batch_scripts() self._create_standard_batch_scripts() self._copy_launchers() diff --git a/portable/scripts/WinPython_PS_Prompt.ps1 b/portable/scripts/WinPython_PS_Prompt.ps1 new file mode 100644 index 00000000..c2f148b5 --- /dev/null +++ b/portable/scripts/WinPython_PS_Prompt.ps1 @@ -0,0 +1,57 @@ +### WinPython_PS_Prompt.ps1 ### +$0 = $myInvocation.MyCommand.Definition +$dp0 = [System.IO.Path]::GetDirectoryName($0) +# $env:PYTHONUTF8 = 1 would create issues in "movable" patching +$env:WINPYDIRBASE = "$dp0\.." +# get a normalize path +# http://stackoverflow.com/questions/1645843/resolve-absolute-path-from-relative-path-and-or-file-name +$env:WINPYDIRBASE = [System.IO.Path]::GetFullPath( $env:WINPYDIRBASE ) + +# avoid double_init (will only resize screen) +if (-not ($env:WINPYDIR -eq [System.IO.Path]::GetFullPath( $env:WINPYDIRBASE+"\{self.python_dir_name}")) ) { +$env:WINPYDIR = $env:WINPYDIRBASE+"\{self.python_dir_name}" +# 2019-08-25 pyjulia needs absolutely a variable PYTHON=%WINPYDIR%python.exe +$env:PYTHON = "%WINPYDIR%\python.exe" +$env:PYTHONPATHz = "%WINPYDIR%;%WINPYDIR%\Lib;%WINPYDIR%\DLLs" + +$env:WINPYVER = '{self.winpython_version_name}' +# rem 2023-02-12 try utf-8 on console +# rem see https://github.com/pypa/pip/issues/11798#issuecomment-1427069681 +$env:PYTHONIOENCODING = "utf-8" + +$env:HOME = "$env:WINPYDIRBASE\settings" + +# rem read https://github.com/winpython/winpython/issues/839 +# $env:USERPROFILE = "$env:HOME" + +$env:WINPYDIRBASE = "" +$env:JUPYTER_DATA_DIR = "$env:HOME" + +if (-not $env:PATH.ToLower().Contains(";"+ $env:WINPYDIR.ToLower()+ ";")) { + $env:PATH = "{full_path_ps_env_var}" } + +#rem force default pyqt5 kit for Spyder if PyQt5 module is there +if (Test-Path "$env:WINPYDIR\Lib\site-packages\PyQt5\__init__.py") { $env:QT_API = "pyqt5" } + +# PyQt5 qt.conf creation and winpython.ini creation done via Winpythonini.py (called per env_for_icons.bat for now) +# Start-Process -FilePath $env:PYTHON -ArgumentList ($env:WINPYDIRBASE + '\scripts\WinPythonIni.py') + + +### Set-WindowSize + +Function Set-WindowSize { +Param([int]$x=$host.ui.rawui.windowsize.width, + [int]$y=$host.ui.rawui.windowsize.heigth, + [int]$buffer=$host.UI.RawUI.BufferSize.heigth) + $buffersize = new-object System.Management.Automation.Host.Size($x,$buffer) + $host.UI.RawUI.BufferSize = $buffersize + $size = New-Object System.Management.Automation.Host.Size($x,$y) + $host.ui.rawui.WindowSize = $size +} +# Windows10 yelling at us with 150 40 6000 +# Set-WindowSize 195 40 6000 + +### Colorize to distinguish +$host.ui.RawUI.BackgroundColor = "Black" +$host.ui.RawUI.ForegroundColor = "White" +} diff --git a/portable/scripts/env.bat b/portable/scripts/env.bat new file mode 100644 index 00000000..dc8aa552 --- /dev/null +++ b/portable/scripts/env.bat @@ -0,0 +1,41 @@ +@echo off +set WINPYDIRBASE=%~dp0.. + +rem get a normalized path +set WINPYDIRBASETMP=%~dp0.. +pushd %WINPYDIRBASETMP% +set WINPYDIRBASE=%__CD__% +if "%WINPYDIRBASE:~-1%"=="\" set WINPYDIRBASE=%WINPYDIRBASE:~0,-1% +set WINPYDIRBASETMP= +popd + +set WINPYDIR=%WINPYDIRBASE%\{self.python_dir_name} +rem 2019-08-25 pyjulia needs absolutely a variable PYTHON=%WINPYDIR%\python.exe +set PYTHON=%WINPYDIR%\python.exe +set PYTHONPATHz=%WINPYDIR%;%WINPYDIR%\Lib;%WINPYDIR%\DLLs +set WINPYVER={self.winpython_version_name} + +rem 2023-02-12 utf-8 on console to avoid pip crash +rem see https://github.com/pypa/pip/issues/11798#issuecomment-1427069681 +set PYTHONIOENCODING=utf-8 +rem set PYTHONUTF8=1 creates issues in "movable" patching + +set HOME=%WINPYDIRBASE%\settings +rem see https://github.com/winpython/winpython/issues/839 +rem set USERPROFILE=%HOME% +set JUPYTER_DATA_DIR=%HOME% +set JUPYTER_CONFIG_DIR=%WINPYDIR%\etc\jupyter +set JUPYTER_CONFIG_PATH=%WINPYDIR%\etc\jupyter +set FINDDIR=%WINDIR%\system32 + +rem Remove all double quotes +set PATH_CLEANED=%PATH:"=% +echo ";%PATH_CLEANED%;" | %FINDDIR%\find.exe /C /I ";%WINPYDIR%\;" >nul +if %ERRORLEVEL% NEQ 0 ( + set "PATH={full_path_env_var}" + cd . +) +set PATH_CLEANED= + +rem force default pyqt5 kit for Spyder if PyQt5 module is there +if exist "%WINPYDIR%\Lib\site-packages\PyQt5\__init__.py" set QT_API=pyqt5 diff --git a/portable/scripts/readme.txt b/portable/scripts/readme.txt new file mode 100644 index 00000000..11592357 --- /dev/null +++ b/portable/scripts/readme.txt @@ -0,0 +1,3 @@ +These batch files are required to run WinPython icons. +These files should help the user writing his/her own +The environment variables are set-up in 'env.bat' and 'env_for_icons.bat'. \ No newline at end of file From 719a36fdb3974919b0db66805f7318357bc1c6f7 Mon Sep 17 00:00:00 2001 From: stonebig Date: Thu, 13 Mar 2025 20:26:03 +0100 Subject: [PATCH 098/305] remove useless complexity: "working_directory" program generator --- make.py | 24 ------------------- ...directory_and_userprofile_be_winpython.bat | 3 +++ ...ake_working_directory_be_not_winpython.bat | 3 +++ .../make_working_directory_be_winpython.bat | 2 ++ 4 files changed, 8 insertions(+), 24 deletions(-) create mode 100644 portable/scripts/make_working_directory_and_userprofile_be_winpython.bat create mode 100644 portable/scripts/make_working_directory_be_not_winpython.bat create mode 100644 portable/scripts/make_working_directory_be_winpython.bat diff --git a/make.py b/make.py index 68bac141..f05f98b9 100644 --- a/make.py +++ b/make.py @@ -31,12 +31,6 @@ def find_7zip_executable() -> str: """ Locates the 7-Zip executable (7z.exe) in common installation directories. - - Raises: - RuntimeError: If 7-Zip executable is not found. - - Returns: - str: Path to the 7-Zip executable. """ program_files_dirs = [ Path(r"C:\Program Files"), @@ -116,11 +110,6 @@ def build_installer_7zip( def _copy_items(source_dirs: list[Path], target_dir: Path, verbose: bool = False): """ Copies items from source directories to the target directory. - - Args: - source_dirs: List of source directories to copy items from. - target_dir: Target directory to copy items to. - verbose: Enable verbose output. """ target_dir.mkdir(parents=True, exist_ok=True) for source_dir in source_dirs: @@ -538,19 +527,6 @@ def _create_standard_batch_scripts(self): if self.distribution and (Path(self.distribution.target) / r"lib-python\3\idlelib").is_dir(): batch_replacements.append((r"\Lib\idlelib", r"\lib-python\3\idlelib")) - for ini_patch_script in [ - ("make_working_directory_be_not_winpython.bat", "[active_environment", "[inactive_environment", "[inactive_environment_per_user]", "[active_environment_per_user]"), - ("make_working_directory_be_winpython.bat", "[active_environment", "[inactive_environment"), - ("make_working_directory_and_userprofile_be_winpython.bat", "[active_environment", "[inactive_environment", "[inactive_environment_common]", "[active_environment_common]") - ]: - name, patch1_start, patch1_end, *patch2 = ini_patch_script - content = f"""call "%~dp0env_for_icons.bat" -"%PYTHON%" -c "from winpython.utils import patch_sourcefile;patch_sourcefile(r'%~dp0..\\settings\winpython.ini', '{patch1_start}', '{patch1_end}' )" -""" - if patch2: - content += f""""%PYTHON%" -c "from winpython.utils import patch_sourcefile;patch_sourcefile(r'%~dp0..\\settings\winpython.ini', '{patch2[0]}', '{patch2[1]}' )" """ - self.create_batch_script(name, content) - self._print_action_done() diff --git a/portable/scripts/make_working_directory_and_userprofile_be_winpython.bat b/portable/scripts/make_working_directory_and_userprofile_be_winpython.bat new file mode 100644 index 00000000..2806dc14 --- /dev/null +++ b/portable/scripts/make_working_directory_and_userprofile_be_winpython.bat @@ -0,0 +1,3 @@ +call "%~dp0env_for_icons.bat" +"%PYTHON%" -c "from winpython.utils import patch_sourcefile;patch_sourcefile(r'%~dp0..\settings\winpython.ini', '[active_environment', '[inactive_environment' )" +"%PYTHON%" -c "from winpython.utils import patch_sourcefile;patch_sourcefile(r'%~dp0..\settings\winpython.ini', '[inactive_environment_common]', '[active_environment_common]' )" \ No newline at end of file diff --git a/portable/scripts/make_working_directory_be_not_winpython.bat b/portable/scripts/make_working_directory_be_not_winpython.bat new file mode 100644 index 00000000..759de71d --- /dev/null +++ b/portable/scripts/make_working_directory_be_not_winpython.bat @@ -0,0 +1,3 @@ +call "%~dp0env_for_icons.bat" +"%PYTHON%" -c "from winpython.utils import patch_sourcefile;patch_sourcefile(r'%~dp0..\settings\winpython.ini', '[active_environment', '[inactive_environment' )" +"%PYTHON%" -c "from winpython.utils import patch_sourcefile;patch_sourcefile(r'%~dp0..\settings\winpython.ini', '[inactive_environment_per_user]', '[active_environment_per_user]' )" \ No newline at end of file diff --git a/portable/scripts/make_working_directory_be_winpython.bat b/portable/scripts/make_working_directory_be_winpython.bat new file mode 100644 index 00000000..bcdd3c45 --- /dev/null +++ b/portable/scripts/make_working_directory_be_winpython.bat @@ -0,0 +1,2 @@ +call "%~dp0env_for_icons.bat" +"%PYTHON%" -c "from winpython.utils import patch_sourcefile;patch_sourcefile(r'%~dp0..\settings\winpython.ini', '[active_environment', '[inactive_environment' )" From 6c9389018c4d2960c37b19edd8120f31a66a79c4 Mon Sep 17 00:00:00 2001 From: stonebig Date: Thu, 13 Mar 2025 23:08:58 +0100 Subject: [PATCH 099/305] cosmetic shrink --- make.py | 45 ++++++++------------------------------------- 1 file changed, 8 insertions(+), 37 deletions(-) diff --git a/make.py b/make.py index f05f98b9..95eace37 100644 --- a/make.py +++ b/make.py @@ -29,9 +29,7 @@ def find_7zip_executable() -> str: - """ - Locates the 7-Zip executable (7z.exe) in common installation directories. - """ + "Locates the 7-Zip executable (7z.exe)" program_files_dirs = [ Path(r"C:\Program Files"), Path(r"C:\Program Files (x86)"), @@ -107,10 +105,10 @@ def build_installer_7zip( except subprocess.CalledProcessError as e: print(f"Error executing 7-Zip script: {e}", file=sys.stderr) + def _copy_items(source_dirs: list[Path], target_dir: Path, verbose: bool = False): - """ - Copies items from source directories to the target directory. - """ + "Copies items from source directories to the target directory." + target_dir.mkdir(parents=True, exist_ok=True) for source_dir in source_dirs: if not source_dir.is_dir(): @@ -128,9 +126,7 @@ def _copy_items(source_dirs: list[Path], target_dir: Path, verbose: bool = False print(f"Error copying {source_item} to {target_item}: {e}") class WinPythonDistributionBuilder: - """ - Builds a WinPython distribution. - """ + "Builds a WinPython distribution." NODEJS_PATH_REL = r"\n" # Relative path within WinPython dir @@ -179,14 +175,7 @@ def __init__( self.python_dir_name = "python" # Standardized Python directory name def _get_python_zip_file(self) -> Path: - """ - Finds the Python zip file in the wheels directory. - - Returns: - Path: Path to the Python zip file. - Raises: - RuntimeError: if no python zip file is found - """ + "Finds the Python .zip file in the wheels directory." patterns = [ r"(pypy3|python-)([0-9]|[a-zA-Z]|.)*.zip", # PyPy pattern r"python-([0-9\.rcba]*)((\.|\-)amd64)?\.(zip|zip)", # Standard Python pattern @@ -739,27 +728,9 @@ def make_all( my_x = my_x[:-1] # simplify for PyPy if not python_target_release == None: - winpy_dirname = ( - "WPy" - + f"{architecture}" - + "-" - + python_target_release - + "" - + f"{build_number}" - ) + release_level - # + flavor + winpy_dirname = f"WPy{architecture}-{python_target_release}{build_number}{release_level}" else: - winpy_dirname = ( - "WPy" - + f"{architecture}" - + "-" - + pyver.replace(".", "") - + "" - + my_x - + "" - + f"{build_number}" - ) + release_level - # + flavor + winpy_dirname = f"WPy{architecture}-{pyver.replace('.', '')}{my_x}{build_number}{release_level}" builder.build( remove_existing=remove_existing, From 618c983feb30ba91d4a0e9b94b05ab06e07ced25 Mon Sep 17 00:00:00 2001 From: stonebig Date: Mon, 17 Mar 2025 18:12:17 +0100 Subject: [PATCH 100/305] remove useless "._print_action_done()" and "batch_replacements" --- make.py | 42 ++++-------------------------------------- 1 file changed, 4 insertions(+), 38 deletions(-) diff --git a/make.py b/make.py index 95eace37..9e877e55 100644 --- a/make.py +++ b/make.py @@ -381,8 +381,7 @@ def create_installer_7zip(self, installer_type: str = ".exe"): """ Creates a WinPython installer using 7-Zip. - Args: - installer_type: Type of installer to create (".exe", ".7z", ".zip"). + Args: installer_type: Type of installer to create (".exe", ".7z", ".zip"). """ self._print_action(f"Creating WinPython installer ({installer_type})") template_name = "installer_7zip.bat" @@ -408,7 +407,6 @@ def create_installer_7zip(self, installer_type: str = ".exe"): PORTABLE_DIR / output_name, replacements ) - self._print_action_done() def _print_action(self, text: str): @@ -418,11 +416,6 @@ def _print_action(self, text: str): else: print(f"{text}... ", end="", flush=True) - def _print_action_done(self): - """Prints "OK" to indicate action completion.""" - if not self.verbose: - print("OK") - def _extract_python_archive(self): """Extracts the Python zip archive to create the base Python environment.""" self._print_action("Extracting Python archive") @@ -430,7 +423,6 @@ def _extract_python_archive(self): str(self.python_zip_file), targetdir=str(self.winpy_dir), # Extract directly to winpy_dir ) - self._print_action_done() # Relocate to /python subfolder if needed (for newer structure) #2024-12-22 to /python python_target_dir = self.winpy_dir / self.python_dir_name if self.python_dir_name != self.python_name and not python_target_dir.is_dir(): @@ -450,29 +442,22 @@ def _copy_tools(self): shutil.move(nodejs_current_dir, nodejs_target_dir) except Exception as e: print(f"Error moving Node.js directory: {e}") - self._print_action_done() def _copy_documentation(self): """Copies documentation files to the WinPython 'docs' directory.""" docs_target_dir = self.winpy_dir / "notebooks" / "docs" self._print_action(f"Copying documentation to {docs_target_dir}") _copy_items(self.docs_directories, docs_target_dir, self.verbose) - self._print_action_done() - + def _copy_launchers(self): """Copies pre-made launchers to the WinPython directory.""" self._print_action("Creating launchers") - launchers_source_dir = PORTABLE_DIR / "launchers_final" - _copy_items([launchers_source_dir], self.winpy_dir, self.verbose) - self._print_action_done() + _copy_items([PORTABLE_DIR / "launchers_final"], self.winpy_dir, self.verbose) def _copy_default_scripts(self): """Copies launchers and defeult scripts.""" self._print_action("copying pre-made scripts") - origin = PORTABLE_DIR / "scripts" - destination = self.winpy_dir / "scripts" - _copy_items([origin], destination, self.verbose) - self._print_action_done() + _copy_items([PORTABLE_DIR / "scripts"], self.winpy_dir / "scripts", self.verbose) def _create_initial_batch_scripts(self): """Creates initial batch scripts, including environment setup.""" @@ -486,12 +471,6 @@ def _create_initial_batch_scripts(self): # Replacements for batch scripts (PyPy compatibility) exe_name = self.distribution.short_exe if self.distribution else "python.exe" # default to python.exe if distribution is not yet set - batch_replacements = [ - (r"DIR%\\python.exe", rf"DIR%\\{exe_name}"), - (r"DIR%\\PYTHON.EXE", rf"DIR%\\{exe_name}"), - ] - if self.distribution and (Path(self.distribution.target) / r"lib-python\3\idlelib").is_dir(): - batch_replacements.append((r"\Lib\idlelib", r"\lib-python\3\idlelib")) destination = self.winpy_dir / "scripts" for specials in ('env.bat', 'WinPython_PS_Prompt.ps1'): @@ -501,7 +480,6 @@ def _create_initial_batch_scripts(self): utils.patch_sourcefile(destspe,'{self.winpython_version_name}', self.winpython_version_name) utils.patch_sourcefile(destspe,'{full_path_env_var}', full_path_env_var) utils.patch_sourcefile(destspe,'{full_path_ps_env_var}', full_path_ps_env_var) - self._print_action_done() def _create_standard_batch_scripts(self): @@ -509,14 +487,6 @@ def _create_standard_batch_scripts(self): self._print_action("Creating standard batch scripts") exe_name = self.distribution.short_exe if self.distribution else "python.exe" - batch_replacements = [ - (r"DIR%\\python.exe", rf"DIR%\\{exe_name}"), - (r"DIR%\\PYTHON.EXE", rf"DIR%\\{exe_name}"), - ] - if self.distribution and (Path(self.distribution.target) / r"lib-python\3\idlelib").is_dir(): - batch_replacements.append((r"\Lib\idlelib", r"\lib-python\3\idlelib")) - - self._print_action_done() def build(self, remove_existing: bool = True, requirements=None, winpy_dirname: str = None): @@ -546,7 +516,6 @@ def build(self, remove_existing: bool = True, requirements=None, winpy_dirname: (self.winpy_dir / "settings" / "AppData" / "Roaming").mkdir(parents=True, exist_ok=True) # Ensure settings dir exists self._extract_python_archive() - self._print_action_done() self.distribution = wppm.Distribution( self.python_executable_dir, verbose=self.verbose, @@ -589,7 +558,6 @@ def build(self, remove_existing: bool = True, requirements=None, winpy_dirname: self._print_action("Cleaning up distribution") self.distribution.clean_up() - self._print_action_done() # Writing package index self._print_action("Writing package index") # winpyver2 = the version without build part but with self.distribution.architecture @@ -609,7 +577,6 @@ def build(self, remove_existing: bool = True, requirements=None, winpy_dirname: fname, str(Path(CHANGELOGS_DIR) / Path(fname).name), ) - self._print_action_done() # Writing changelog self._print_action("Writing changelog") @@ -620,7 +587,6 @@ def build(self, remove_existing: bool = True, requirements=None, winpy_dirname: release_level=self.release_level, architecture=self.distribution.architecture, ) - self._print_action_done() def rebuild_winpython_package(source_dir: Path, target_dir: Path, architecture: int = 64, verbose: bool = False): From 40d0c77a83a5cce9a9bc9561e6f7534b1e181b3c Mon Sep 17 00:00:00 2001 From: stonebig Date: Tue, 18 Mar 2025 19:11:43 +0100 Subject: [PATCH 101/305] remove unused post_path_entries --- make.py | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/make.py b/make.py index 9e877e55..fe54737c 100644 --- a/make.py +++ b/make.py @@ -308,11 +308,6 @@ def pre_path_entries(self) -> list[str]: r".." + self.NODEJS_PATH_REL, ] - @property - def post_path_entries(self) -> list[str]: - """Returns a list of PATH entries to append to the environment.""" - return [] - @property def tools_directories(self) -> list[Path]: """Returns the list of tools directories to include.""" @@ -464,10 +459,10 @@ def _create_initial_batch_scripts(self): self._print_action("Creating initial batch scripts") path_entries_str = ";".join([rf"%WINPYDIR%\{pth}" for pth in self.pre_path_entries]) - full_path_env_var = f"{path_entries_str};%PATH%;" + ";".join([rf"%WINPYDIR%\{pth}" for pth in self.post_path_entries]) + full_path_env_var = f"{path_entries_str};%PATH%" path_entries_ps_str = ";".join([rf"$env:WINPYDIR\\{pth}" for pth in self.pre_path_entries]) - full_path_ps_env_var = f"{path_entries_ps_str};$env:path;" + ";".join([rf"$env:WINPYDIR\\{pth}" for pth in self.post_path_entries]) + full_path_ps_env_var = f"{path_entries_ps_str};$env:path" # Replacements for batch scripts (PyPy compatibility) exe_name = self.distribution.short_exe if self.distribution else "python.exe" # default to python.exe if distribution is not yet set From de1c177c585e5380073e324f26b628ecbe5466c7 Mon Sep 17 00:00:00 2001 From: stonebig Date: Tue, 18 Mar 2025 20:11:54 +0100 Subject: [PATCH 102/305] further cosmetic clean-up --- make.py | 20 +++----------------- 1 file changed, 3 insertions(+), 17 deletions(-) diff --git a/make.py b/make.py index fe54737c..478d7d81 100644 --- a/make.py +++ b/make.py @@ -7,7 +7,6 @@ """ WinPython build script -Created on Sun Aug 12 11:17:50 2012 """ import os @@ -278,7 +277,6 @@ def python_full_version(self) -> str: return "0.0.0" # Placeholder before initialization return utils.get_python_long_version(self.distribution.target) - @property def python_executable_dir(self) -> str: """Returns the directory containing the Python executable.""" @@ -557,21 +555,11 @@ def build(self, remove_existing: bool = True, requirements=None, winpy_dirname: self._print_action("Writing package index") # winpyver2 = the version without build part but with self.distribution.architecture self.winpyver2 = f"{self.python_full_version}.{self.build_number}" - fname = str( - self.winpy_dir.parent - / ( - f"WinPython{self.flavor}-" - + f"{self.distribution.architecture}bit-" - + f"{self.winpyver2}.md" - ) - ) + fname = str(self.winpy_dir.parent / f"WinPython{self.flavor}-{self.distribution.architecture}bit-{self.winpyver2}.md") open(fname, "w", encoding='utf-8').write(self.package_index_markdown) - # Copy to winpython/changelogs - shutil.copyfile( - fname, - str(Path(CHANGELOGS_DIR) / Path(fname).name), - ) + # Copy to winpython/changelogs + shutil.copyfile(fname, str(Path(CHANGELOGS_DIR) / Path(fname).name)) # Writing changelog self._print_action("Writing changelog") @@ -706,8 +694,6 @@ def make_all( if "7zip" in str(create_installer).lower(): builder.create_installer_7zip(".exe") - return builder - if __name__ == "__main__": # DO create only one version at a time From 42728da0e598f3be3277f718f8173d58e70cb1a9 Mon Sep 17 00:00:00 2001 From: stonebig Date: Tue, 18 Mar 2025 20:28:48 +0100 Subject: [PATCH 103/305] remove further useless complexity --- make.py | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/make.py b/make.py index 478d7d81..555327bd 100644 --- a/make.py +++ b/make.py @@ -686,13 +686,12 @@ def make_all( requirements=requirements_files_list, winpy_dirname=winpy_dirname, ) - if str(create_installer).lower() != "false": - if ".zip" in str(create_installer).lower(): - builder.create_installer_7zip(".zip") - if ".7z" in str(create_installer).lower(): - builder.create_installer_7zip(".7z") - if "7zip" in str(create_installer).lower(): - builder.create_installer_7zip(".exe") + if ".zip" in str(create_installer).lower(): + builder.create_installer_7zip(".zip") + if ".7z" in str(create_installer).lower(): + builder.create_installer_7zip(".7z") + if "7zip" in str(create_installer).lower(): + builder.create_installer_7zip(".exe") if __name__ == "__main__": From 60b87b77e4a05aef80f60d145c41e131a8e978a2 Mon Sep 17 00:00:00 2001 From: stonebig Date: Fri, 21 Mar 2025 20:01:08 +0100 Subject: [PATCH 104/305] remove_existing is a rebuild flag --- generate_a_winpython_distro.bat | 4 ++-- make.py | 29 +++++++++++++---------------- winpython/__init__.py | 2 +- 3 files changed, 16 insertions(+), 19 deletions(-) diff --git a/generate_a_winpython_distro.bat b/generate_a_winpython_distro.bat index f7e79be8..59102fed 100644 --- a/generate_a_winpython_distro.bat +++ b/generate_a_winpython_distro.bat @@ -2,7 +2,7 @@ rem generate_a_winpython_distro.bat: to be launched from a winpython directory, @echo on REM Initialize variables -if "%my_release_level%"=="" set my_release_level=b1 +if "%my_release_level%"=="" set my_release_level=b2 if "%my_create_installer%"=="" set my_create_installer=True rem Set archive directory and log file @@ -111,7 +111,7 @@ echo "(%date% %time%) Generate changelog and binaries">>%my_archive_log% set path=%my_original_path% cd /D %~dp0 call %my_buildenv%\scripts\env.bat -python.exe -c "from make import *;make_all(%my_release%, '%my_release_level%', pyver='%my_pyver%', basedir=r'%my_basedir%', verbose=True, architecture=%my_arch%, flavor='%my_flavor%', install_options=r'%my_install_options%', find_links=r'%my_find_links%', source_dirs=r'%my_source_dirs%', create_installer='%my_create_installer%', remove_existing=False, python_target_release='%my_python_target_release%')" >> %my_archive_log% +python.exe -c "from make import *;make_all(%my_release%, '%my_release_level%', pyver='%my_pyver%', basedir=r'%my_basedir%', verbose=True, architecture=%my_arch%, flavor='%my_flavor%', install_options=r'%my_install_options%', find_links=r'%my_find_links%', source_dirs=r'%my_source_dirs%', create_installer='%my_create_installer%', rebuild=False, python_target_release='%my_python_target_release%')" >> %my_archive_log% echo -------------------------------------- >>%my_archive_log% echo "(%date% %time%) END OF CREATION">>%my_archive_log% diff --git a/make.py b/make.py index 555327bd..a00217ce 100644 --- a/make.py +++ b/make.py @@ -387,10 +387,7 @@ def create_installer_7zip(self, installer_type: str = ".exe"): ("DISTDIR", str(self.winpy_dir)), ("ARCH", str(self.architecture_bits)), ("VERSION", f"{self.python_full_version}.{self.build_number}{self.flavor}"), - ( - "VERSION_INSTALL", - f'{self.python_full_version.replace(".", "")}{self.build_number}', - ), + ("VERSION_INSTALL", f'{self.python_full_version.replace(".", "")}{self.build_number}'), ("RELEASELEVEL", self.release_level), ("INSTALLER_OPTION", installer_type), # Pass installer type as option to bat script ] @@ -482,12 +479,12 @@ def _create_standard_batch_scripts(self): exe_name = self.distribution.short_exe if self.distribution else "python.exe" - def build(self, remove_existing: bool = True, requirements=None, winpy_dirname: str = None): + def build(self, rebuild: bool = True, requirements=None, winpy_dirname: str = None): """Make WinPython distribution in target directory from the installers located in wheels_dir - remove_existing=True: (default) install all from scratch - remove_existing=False: for complementary purposes (create installers) + rebuild=True: (default) install all from scratch + rebuild=False: for complementary purposes (create installers) requirements=file(s) of requirements (separated by space if several)""" python_zip_filename = self.python_zip_file.name print(f"Building WinPython with Python archive: {python_zip_filename}") @@ -497,13 +494,13 @@ def build(self, remove_existing: bool = True, requirements=None, winpy_dirname: else: self.winpy_dir = self.target_dir / winpy_dirname # Create/re-create the WinPython base directory self._print_action(f"Creating WinPython {self.winpy_dir} base directory") - if self.winpy_dir.is_dir() and remove_existing: + if self.winpy_dir.is_dir() and rebuild: try: shutil.rmtree(self.winpy_dir, onexc=utils.onerror) except TypeError: # before 3.12 shutil.rmtree(self.winpy_dir, onerror=utils.onerror) os.makedirs(self.winpy_dir, exist_ok=True) - if remove_existing: + if rebuild: # preventive re-Creation of settings directory # (necessary if user is starting an application with a batch) (self.winpy_dir / "settings" / "AppData" / "Roaming").mkdir(parents=True, exist_ok=True) # Ensure settings dir exists @@ -515,7 +512,7 @@ def build(self, remove_existing: bool = True, requirements=None, winpy_dirname: indent=True, ) - if remove_existing: + if rebuild: self._copy_default_scripts() self._create_initial_batch_scripts() self._create_standard_batch_scripts() @@ -538,7 +535,7 @@ def build(self, remove_existing: bool = True, requirements=None, winpy_dirname: if requirements: if not list(requirements) == requirements: - requirements = requirements.split() + requirements = requirements.split(",") for req in requirements: actions = ["install", "-r", req] if self.install_options is not None: @@ -586,12 +583,12 @@ def rebuild_winpython_package(source_dir: Path, target_dir: Path, architecture: def _parse_list_argument(arg_value: str | list[str]) -> list[str]: - """Parses a string or list argument into a list of strings.""" + """Parses a string or comma separated list argument into a list of strings.""" if arg_value is None: return [] if isinstance(arg_value, str): - return arg_value.split() - return list(arg_value) # Ensure it's a list if already a list-like object + return arg_value.split(",") + return list(arg_value) def make_all( @@ -601,7 +598,7 @@ def make_all( architecture: int, basedir: Path, verbose: bool = False, - remove_existing: bool = True, + rebuild: bool = True, create_installer: str = "True", install_options=["--no-index"], flavor: str = "", @@ -682,7 +679,7 @@ def make_all( winpy_dirname = f"WPy{architecture}-{pyver.replace('.', '')}{my_x}{build_number}{release_level}" builder.build( - remove_existing=remove_existing, + rebuild=rebuild, requirements=requirements_files_list, winpy_dirname=winpy_dirname, ) diff --git a/winpython/__init__.py b/winpython/__init__.py index 3c47549c..bc06e9a6 100644 --- a/winpython/__init__.py +++ b/winpython/__init__.py @@ -28,6 +28,6 @@ OTHER DEALINGS IN THE SOFTWARE. """ -__version__ = '13.2.20250309' +__version__ = '14.0.20250321' __license__ = __doc__ __project_url__ = 'http://winpython.github.io/' From 2c4cd9488ac37f4a9eb9275d0cda3042038e2cc6 Mon Sep 17 00:00:00 2001 From: stonebig Date: Fri, 21 Mar 2025 20:22:02 +0100 Subject: [PATCH 105/305] clarify and remove _create_standard_batch_scripts() --- make.py | 70 ++++++++++++++++++--------------------------------------- 1 file changed, 22 insertions(+), 48 deletions(-) diff --git a/make.py b/make.py index a00217ce..882faabf 100644 --- a/make.py +++ b/make.py @@ -472,13 +472,6 @@ def _create_initial_batch_scripts(self): utils.patch_sourcefile(destspe,'{full_path_ps_env_var}', full_path_ps_env_var) - def _create_standard_batch_scripts(self): - """Creates standard WinPython batch scripts for various actions.""" - self._print_action("Creating standard batch scripts") - - exe_name = self.distribution.short_exe if self.distribution else "python.exe" - - def build(self, rebuild: bool = True, requirements=None, winpy_dirname: str = None): """Make WinPython distribution in target directory from the installers located in wheels_dir @@ -515,8 +508,9 @@ def build(self, rebuild: bool = True, requirements=None, winpy_dirname: str = No if rebuild: self._copy_default_scripts() self._create_initial_batch_scripts() - self._create_standard_batch_scripts() self._copy_launchers() + self._copy_tools() + self._copy_documentation() utils.python_execmodule("ensurepip", self.distribution.target) # Ensure pip is installed for PyPy self.distribution.patch_standard_packages("pip") @@ -530,9 +524,6 @@ def build(self, rebuild: bool = True, requirements=None, winpy_dirname: str = No self.distribution.do_pip_action(actions) self.distribution.patch_standard_packages(package_name) - self._copy_tools() - self._copy_documentation() - if requirements: if not list(requirements) == requirements: requirements = requirements.split(",") @@ -574,20 +565,15 @@ def rebuild_winpython_package(source_dir: Path, target_dir: Path, architecture: for filename in os.listdir(target_dir): if filename.startswith("winpython-") and filename.endswith((".exe", ".whl", ".gz")): os.remove(Path(target_dir) / filename) - - utils.buildflit_wininst( - str(source_dir), - copy_to=str(target_dir), - verbose=verbose, - ) + utils.buildflit_wininst(source_dir, copy_to=target_dir, verbose=verbose) -def _parse_list_argument(arg_value: str | list[str]) -> list[str]: - """Parses a string or comma separated list argument into a list of strings.""" +def _parse_list_argument(arg_value: str | list[str], separator=" ") -> list[str]: + """Parse a separated list argument into a list of strings.""" if arg_value is None: return [] if isinstance(arg_value, str): - return arg_value.split(",") + return arg_value.split(separator) return list(arg_value) @@ -626,39 +612,29 @@ def make_all( assert basedir is not None, "The *basedir* directory must be specified" assert architecture in (32, 64) - utils.print_box( - f"Making WinPython {architecture}bits" - + f" at {Path(basedir) / ('bu' + flavor)}" - ) - # Create Build director, where Winpython will be constructed + # Parse list arguments + tools_dirs_list = _parse_list_argument(toolsdirs, ",") + docs_dirs_list = _parse_list_argument(docsdirs, ",") + install_options_list = _parse_list_argument(install_options, " ") + find_links_dirs_list = _parse_list_argument(find_links, ",") + requirements_files_list = [Path(f) for f in _parse_list_argument(requirements, ",") if f] # ensure Path objects + find_links_options = [f"--find-links={link}" for link in find_links_dirs_list + [source_dirs]] builddir = str(Path(basedir) / ("bu" + flavor)) - os.makedirs(Path(builddir), exist_ok=True) - # use source_dirs as the directory to re-build Winpython wheel - wheels_dir = source_dirs - - # Rebuild WinPython package - winpython_source_dir = Path(__file__).resolve().parent - rebuild_winpython_package( - source_dir=winpython_source_dir, - target_dir=wheels_dir, - architecture=architecture, - verbose=verbose, - ) - # Parse list arguments - tools_dirs_list = _parse_list_argument(toolsdirs) - docs_dirs_list = _parse_list_argument(docsdirs) - install_options_list = _parse_list_argument(install_options) - find_links_dirs_list = _parse_list_argument(find_links) - requirements_files_list = [Path(f) for f in _parse_list_argument(requirements) if f] # ensure Path objects + if rebuild: + # Rebuild Winpython Wheel Package + utils.print_box(f"Making WinPython {architecture}bits at {Path(basedir) / ('bu' + flavor)}") + os.makedirs(Path(builddir), exist_ok=True) + # use source_dirs as the directory to re-build Winpython wheel + winpython_source_dir = Path(__file__).resolve().parent + rebuild_winpython_package(winpython_source_dir, source_dirs, architecture, verbose) - find_links_options = [f"--find-links={link}" for link in find_links_dirs_list + [wheels_dir]] builder = WinPythonDistributionBuilder( build_number, release_level, builddir, - wheels_dir=wheels_dir, + wheels_dir=source_dirs, tools_dirs=[Path(d) for d in tools_dirs_list], docs_dirs=[Path(d) for d in docs_dirs_list], verbose=verbose, @@ -666,9 +642,7 @@ def make_all( install_options=install_options_list + find_links_options, flavor=flavor, ) - # define a pre-defined winpydir, instead of having to guess - - # extract the python subversion to get WPy64-3671b1 + # define the directory where to create the distro my_x = "".join(builder.python_name.replace(".amd64", "").split(".")[-2:-1]) while not my_x.isdigit() and len(my_x) > 0: my_x = my_x[:-1] From dc74822a1977fa120ac27da2ab275dbae9c98b22 Mon Sep 17 00:00:00 2001 From: stonebig Date: Fri, 21 Mar 2025 22:54:14 +0100 Subject: [PATCH 106/305] remove unused create_python_launcher_batch --- make.py | 46 ++++++++++------------------------------------ 1 file changed, 10 insertions(+), 36 deletions(-) diff --git a/make.py b/make.py index 882faabf..dc7f2e17 100644 --- a/make.py +++ b/make.py @@ -124,6 +124,16 @@ def _copy_items(source_dirs: list[Path], target_dir: Path, verbose: bool = False except Exception as e: print(f"Error copying {source_item} to {target_item}: {e}") + +def _parse_list_argument(arg_value: str | list[str], separator=" ") -> list[str]: + """Parse a separated list argument into a list of strings.""" + if arg_value is None: + return [] + if isinstance(arg_value, str): + return arg_value.split(separator) + return list(arg_value) + + class WinPythonDistributionBuilder: "Builds a WinPython distribution." @@ -342,33 +352,6 @@ def create_batch_script(self, name: str, contents: str, replacements: list[tuple f.write(final_contents) print(f"Created batch script: {script_path}") - def create_python_launcher_batch( - self, - name: str, - script_name: str, - working_dir: str = None, - options: str = None, - command: str = None, - ): - """ - Creates a batch file to launch a Python script within the WinPython environment. - - Args: - name: The name of the batch file. - script_name: The name of the Python script to execute. - working_dir: Optional working directory for the script. - options: Optional command-line options for the script. - command: Optional command to execute python, defaults to python.exe or pythonw.exe - """ - options_str = f" {options}" if options else "" - if command is None: - command = '"%WINPYDIR%\\pythonw.exe"' if script_name.endswith(".pyw") else '"%WINPYDIR%\\python.exe"' - change_dir_cmd = f"cd /D {working_dir}\n" if working_dir else "" - script_name_str = f" {script_name}" if script_name else "" - batch_content = f"""@echo off -call "%~dp0env_for_icons.bat" -{change_dir_cmd}{command}{script_name_str}{options_str} %*""" - self.create_batch_script(name, batch_content) def create_installer_7zip(self, installer_type: str = ".exe"): """ @@ -568,15 +551,6 @@ def rebuild_winpython_package(source_dir: Path, target_dir: Path, architecture: utils.buildflit_wininst(source_dir, copy_to=target_dir, verbose=verbose) -def _parse_list_argument(arg_value: str | list[str], separator=" ") -> list[str]: - """Parse a separated list argument into a list of strings.""" - if arg_value is None: - return [] - if isinstance(arg_value, str): - return arg_value.split(separator) - return list(arg_value) - - def make_all( build_number: int, release_level: str, From 9760fc9b4f0c3b83a87cde5f12e2ef01b6e77882 Mon Sep 17 00:00:00 2001 From: stonebig Date: Sat, 22 Mar 2025 16:30:24 +0100 Subject: [PATCH 107/305] improve variable names via AI flash2 --- make.py | 248 ++++++++++++++++++++++++++++---------------------------- 1 file changed, 125 insertions(+), 123 deletions(-) diff --git a/make.py b/make.py index dc7f2e17..eeb2e11a 100644 --- a/make.py +++ b/make.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- # # Copyright © 2012 Pierre Raybaut -# Copyright © 2014-2024+ The Winpython development team https://github.com/winpython/ +# Copyright © 2014-2024+  The Winpython development team https://github.com/winpython/ # Licensed under the terms of the MIT License # (see winpython/__init__.py for details) @@ -20,25 +20,27 @@ # Local imports import diff -CHANGELOGS_DIR = Path(__file__).parent / "changelogs" -PORTABLE_DIR = Path(__file__).parent / "portable" +# Define constant paths for clarity +CHANGELOGS_DIRECTORY = Path(__file__).parent / "changelogs" +PORTABLE_DIRECTORY = Path(__file__).parent / "portable" -assert CHANGELOGS_DIR.is_dir(), f"Changelogs directory not found: {CHANGELOGS_DIR}" -assert PORTABLE_DIR.is_dir(), f"Portable directory not found: {PORTABLE_DIR}" +# Ensure necessary directories exist at the start +assert CHANGELOGS_DIRECTORY.is_dir(), f"Changelogs directory not found: {CHANGELOGS_DIRECTORY}" +assert PORTABLE_DIRECTORY.is_dir(), f"Portable directory not found: {PORTABLE_DIRECTORY}" def find_7zip_executable() -> str: - "Locates the 7-Zip executable (7z.exe)" - program_files_dirs = [ + """Locates the 7-Zip executable (7z.exe).""" + possible_program_files = [ Path(r"C:\Program Files"), Path(r"C:\Program Files (x86)"), Path(sys.prefix).parent.parent / "7-Zip", ] - for base_dir in program_files_dirs: + for base_dir in possible_program_files: for subdir in [".", "App"]: - exe_path = base_dir / subdir / "7-Zip" / "7z.exe" - if exe_path.is_file(): - return str(exe_path) + executable_path = base_dir / subdir / "7-Zip" / "7z.exe" + if executable_path.is_file(): + return str(executable_path) raise RuntimeError("7ZIP is not installed on this computer.") @@ -52,9 +54,12 @@ def replace_lines_in_file(filepath: Path, replacements: list[tuple[str, str]]): - The prefix of the line to replace (str). - The new text for the line (str). """ - lines: list[str] = [] - with open(filepath, "r") as f: - lines = f.readlines() + try: + with open(filepath, "r") as f: + lines = f.readlines() + except FileNotFoundError: + print(f"Error: File not found: {filepath}") + return updated_lines = list(lines) # Create a mutable copy @@ -66,9 +71,12 @@ def replace_lines_in_file(filepath: Path, replacements: list[tuple[str, str]]): if line.startswith(start_prefix + "="): updated_lines[index] = f"{start_prefix}={new_text}\n" - with open(filepath, "w") as f: - f.writelines(updated_lines) - print(f"Updated 7-zip script: {filepath}") + try: + with open(filepath, "w") as f: + f.writelines(updated_lines) + print(f"Updated 7-zip script: {filepath}") + except Exception as e: + print(f"Error writing to file {filepath}: {e}") def build_installer_7zip( @@ -82,16 +90,16 @@ def build_installer_7zip( output_script_path: Path to save the generated 7-Zip script. replacements: A list of tuples for text replacements (prefix, new_text). """ - sevenzip_exe = find_7zip_executable() + sevenzip_executable = find_7zip_executable() shutil.copy(script_template_path, output_script_path) # Standard replacements for all 7zip scripts - data = [ - ("PORTABLE_DIR", str(PORTABLE_DIR)), - ("SEVENZIP_EXE", sevenzip_exe), + data_to_replace = [ + ("PORTABLE_DIR", str(PORTABLE_DIRECTORY)), + ("SEVENZIP_EXE", sevenzip_executable), ] + replacements - replace_lines_in_file(output_script_path, data) + replace_lines_in_file(output_script_path, data_to_replace) try: # Execute the generated 7-Zip script @@ -105,50 +113,50 @@ def build_installer_7zip( print(f"Error executing 7-Zip script: {e}", file=sys.stderr) -def _copy_items(source_dirs: list[Path], target_dir: Path, verbose: bool = False): - "Copies items from source directories to the target directory." +def _copy_items(source_directories: list[Path], target_directory: Path, verbose: bool = False): + """Copies items from source directories to the target directory.""" - target_dir.mkdir(parents=True, exist_ok=True) - for source_dir in source_dirs: + target_directory.mkdir(parents=True, exist_ok=True) + for source_dir in source_directories: if not source_dir.is_dir(): print(f"Warning: Source directory not found: {source_dir}") continue for item_name in os.listdir(source_dir): source_item = source_dir / item_name - target_item = target_dir / item_name - copy_func = shutil.copytree if source_item.is_dir() else shutil.copy2 + target_item = target_directory / item_name + copy_function = shutil.copytree if source_item.is_dir() else shutil.copy2 try: - copy_func(source_item, target_item) + copy_function(source_item, target_item) if verbose: print(f" Copied: {source_item} -> {target_item}") except Exception as e: print(f"Error copying {source_item} to {target_item}: {e}") -def _parse_list_argument(arg_value: str | list[str], separator=" ") -> list[str]: - """Parse a separated list argument into a list of strings.""" - if arg_value is None: +def _parse_list_argument(argument_value: str | list[str], separator=" ") -> list[str]: + """Parse a separated list argument into a list of strings.""" + if argument_value is None: return [] - if isinstance(arg_value, str): - return arg_value.split(separator) - return list(arg_value) + if isinstance(argument_value, str): + return argument_value.split(separator) + return list(argument_value) class WinPythonDistributionBuilder: - "Builds a WinPython distribution." + """Builds a WinPython distribution.""" - NODEJS_PATH_REL = r"\n" # Relative path within WinPython dir + NODEJS_RELATIVE_PATH = r"\n" # Relative path within WinPython dir def __init__( self, build_number: int, release_level: str, - target_dir: Path, - wheels_dir: Path, - tools_dirs: list[Path] = None, - docs_dirs: list[Path] = None, + target_directory: Path, + wheels_directory: Path, + tools_directories: list[Path] = None, + documentation_directories: list[Path] = None, verbose: bool = False, - base_dir: Path = None, + base_directory: Path = None, install_options: list[str] = None, flavor: str = "", ): @@ -158,25 +166,25 @@ def __init__( Args: build_number: The build number (integer). release_level: The release level (e.g., "beta", ""). - target_dir: The base directory where WinPython will be created. - wheels_dir: Directory containing wheel files for packages. - tools_dirs: List of directories containing development tools to include. - docs_dirs: List of directories containing documentation to include. + target_directory: The base directory where WinPython will be created. + wheels_directory: Directory containing wheel files for packages. + tools_directories: List of directories containing development tools to include. + documentation_directories: List of directories containing documentation to include. verbose: Enable verbose output. - base_dir: Base directory for building (optional, for relative paths). + base_directory: Base directory for building (optional, for relative paths). install_options: Additional pip install options. flavor: WinPython flavor (e.g., "Barebone"). """ self.build_number = build_number self.release_level = release_level - self.target_dir = Path(target_dir) # Ensure Path object - self.wheels_dir = Path(wheels_dir) # Ensure Path object - self.tools_dirs = tools_dirs or [] - self.docs_dirs = docs_dirs or [] + self.target_directory = Path(target_directory) # Ensure Path object + self.wheels_directory = Path(wheels_directory) # Ensure Path object + self.tools_directories = tools_directories or [] + self.documentation_directories = documentation_directories or [] self.verbose = verbose - self.winpy_dir: Path | None = None # Will be set during build - self.distribution: wppm.Distribution | None = None # Will be set during build - self.base_dir = base_dir + self.winpython_directory: Path | None = None # Will be set during build + self.distribution: wppm.Distribution | None = None # Will be set during build + self.base_directory = base_directory self.install_options = install_options or [] self.flavor = flavor self.python_zip_file: Path = self._get_python_zip_file() @@ -184,16 +192,16 @@ def __init__( self.python_dir_name = "python" # Standardized Python directory name def _get_python_zip_file(self) -> Path: - "Finds the Python .zip file in the wheels directory." + """Finds the Python .zip file in the wheels directory.""" patterns = [ r"(pypy3|python-)([0-9]|[a-zA-Z]|.)*.zip", # PyPy pattern r"python-([0-9\.rcba]*)((\.|\-)amd64)?\.(zip|zip)", # Standard Python pattern ] for pattern in patterns: - for filename in os.listdir(self.wheels_dir): + for filename in os.listdir(self.wheels_directory): if re.match(pattern, filename): - return self.wheels_dir / filename - raise RuntimeError(f"Could not find Python zip package in {self.wheels_dir}") + return self.wheels_directory / filename + raise RuntimeError(f"Could not find Python zip package in {self.wheels_directory}") @property def package_index_markdown(self) -> str: @@ -203,8 +211,8 @@ def package_index_markdown(self) -> str: Returns: str: Markdown content for the package index. """ - installed_tools_md = self._get_installed_tools_markdown() - installed_packages_md = self._get_installed_packages_markdown() + installed_tools_markdown = self._get_installed_tools_markdown() + installed_packages_markdown = self._get_installed_packages_markdown() python_description = "Python programming language with standard library" return f"""## WinPython {self.winpyver2 + self.flavor} @@ -217,40 +225,41 @@ def package_index_markdown(self) -> str: Name | Version | Description -----|---------|------------ -{installed_tools_md} +{installed_tools_markdown} ### Python packages Name | Version | Description -----|---------|------------ [Python](http://www.python.org/) | {self.python_full_version} | {python_description} -{installed_packages_md} +{installed_packages_markdown}
    """ + def _get_installed_tools_markdown(self) -> str: """Generates Markdown for installed tools section in package index.""" installed_tools = [] def get_tool_path(rel_path): - path = self.winpy_dir / rel_path if self.winpy_dir else None + path = self.winpython_directory / rel_path if self.winpython_directory else None return path if path and (path.is_file() or path.is_dir()) else None - nodejs_path = get_tool_path(self.NODEJS_PATH_REL) + nodejs_path = get_tool_path(self.NODEJS_RELATIVE_PATH) if nodejs_path: node_version = utils.get_nodejs_version(str(nodejs_path)) installed_tools.append(("Nodejs", node_version)) npm_version = utils.get_npmjs_version(str(nodejs_path)) installed_tools.append(("npmjs", npm_version)) - pandoc_exe = get_tool_path(r"\t\pandoc.exe") - if pandoc_exe: - pandoc_version = utils.get_pandoc_version(str(pandoc_exe.parent)) + pandoc_executable = get_tool_path(r"\t\pandoc.exe") + if pandoc_executable: + pandoc_version = utils.get_pandoc_version(str(pandoc_executable.parent)) installed_tools.append(("Pandoc", pandoc_version)) - vscode_exe = get_tool_path(r"\t\VSCode\Code.exe") - if vscode_exe: - vscode_version = utils.getFileProperties(str(vscode_exe))["FileVersion"] + vscode_executable = get_tool_path(r"\t\VSCode\Code.exe") + if vscode_executable: + vscode_version = utils.getFileProperties(str(vscode_executable))["FileVersion"] installed_tools.append(("VSCode", vscode_version)) tool_lines = [] @@ -271,7 +280,6 @@ def _get_installed_packages_markdown(self) -> str: ] return "\n".join(package_lines) - @property def winpython_version_name(self) -> str: """Returns the full WinPython version string.""" @@ -284,17 +292,17 @@ def python_full_version(self) -> str: Will be set after _extract_python is called and distribution is initialized. """ if self.distribution is None: - return "0.0.0" # Placeholder before initialization + return "0.0.0" # Placeholder before initialization return utils.get_python_long_version(self.distribution.target) @property def python_executable_dir(self) -> str: """Returns the directory containing the Python executable.""" - python_path_dir = self.winpy_dir / self.python_dir_name if self.winpy_dir else None + python_path_dir = self.winpython_directory / self.python_dir_name if self.winpython_directory else None if python_path_dir and python_path_dir.is_dir(): return str(python_path_dir) else: - python_path_exe = self.winpy_dir / self.python_name if self.winpy_dir else None # Fallback for older structure + python_path_exe = self.winpython_directory / self.python_name if self.winpython_directory else None # Fallback for older structure return str(python_path_exe) if python_path_exe else "" @property @@ -302,7 +310,7 @@ def architecture_bits(self) -> int: """Returns the architecture (32 or 64 bits) of the distribution.""" if self.distribution: return self.distribution.architecture - return 64 # Default to 64 if distribution is not initialized yet + return 64 # Default to 64 if distribution is not initialized yet @property def pre_path_entries(self) -> list[str]: @@ -313,21 +321,16 @@ def pre_path_entries(self) -> list[str]: "DLLs", "Scripts", r"..\t", - r".." + self.NODEJS_PATH_REL, + r".." + self.NODEJS_RELATIVE_PATH, ] - @property - def tools_directories(self) -> list[Path]: - """Returns the list of tools directories to include.""" - return self.tools_dirs - @property def docs_directories(self) -> list[Path]: """Returns the list of documentation directories to include.""" default_docs_dir = Path(__file__).resolve().parent / "docs" if default_docs_dir.is_dir(): - return [default_docs_dir] + self.docs_dirs - return self.docs_dirs + return [default_docs_dir] + self.documentation_directories + return self.documentation_directories def create_batch_script(self, name: str, contents: str, replacements: list[tuple[str, str]] = None): """ @@ -338,7 +341,7 @@ def create_batch_script(self, name: str, contents: str, replacements: list[tuple contents: The contents of the batch script. replacements: A list of tuples for text replacements in the content. """ - script_dir = self.winpy_dir / "scripts" if self.winpy_dir else None + script_dir = self.winpython_directory / "scripts" if self.winpython_directory else None if not script_dir: print("Warning: WinPython directory not set, cannot create batch script.") return @@ -361,27 +364,26 @@ def create_installer_7zip(self, installer_type: str = ".exe"): """ self._print_action(f"Creating WinPython installer ({installer_type})") template_name = "installer_7zip.bat" - output_name = "installer_7zip-tmp.bat" # temp file to avoid overwriting template + output_name = "installer_7zip-tmp.bat" # temp file to avoid overwriting template if installer_type not in [".exe", ".7z", ".zip"]: print(f"Warning: Unsupported installer type '{installer_type}'. Defaulting to .exe") installer_type = ".exe" replacements = [ - ("DISTDIR", str(self.winpy_dir)), + ("DISTDIR", str(self.winpython_directory)), ("ARCH", str(self.architecture_bits)), ("VERSION", f"{self.python_full_version}.{self.build_number}{self.flavor}"), ("VERSION_INSTALL", f'{self.python_full_version.replace(".", "")}{self.build_number}'), ("RELEASELEVEL", self.release_level), - ("INSTALLER_OPTION", installer_type), # Pass installer type as option to bat script + ("INSTALLER_OPTION", installer_type), # Pass installer type as option to bat script ] build_installer_7zip( - PORTABLE_DIR / template_name, - PORTABLE_DIR / output_name, + PORTABLE_DIRECTORY / template_name, + PORTABLE_DIRECTORY / output_name, replacements ) - def _print_action(self, text: str): """Prints an action message with progress indicator.""" if self.verbose: @@ -394,22 +396,22 @@ def _extract_python_archive(self): self._print_action("Extracting Python archive") utils.extract_archive( str(self.python_zip_file), - targetdir=str(self.winpy_dir), # Extract directly to winpy_dir + targetdir=str(self.winpython_directory), # Extract directly to winpython_directory ) # Relocate to /python subfolder if needed (for newer structure) #2024-12-22 to /python - python_target_dir = self.winpy_dir / self.python_dir_name + python_target_dir = self.winpython_directory / self.python_dir_name if self.python_dir_name != self.python_name and not python_target_dir.is_dir(): - os.rename(self.winpy_dir / self.python_name, python_target_dir) + os.rename(self.winpython_directory / self.python_name, python_target_dir) def _copy_tools(self): """Copies development tools to the WinPython 't' directory.""" - tools_target_dir = self.winpy_dir / "t" + tools_target_dir = self.winpython_directory / "t" self._print_action(f"Copying tools to {tools_target_dir}") _copy_items(self.tools_directories, tools_target_dir, self.verbose) # Special handling for Node.js to move it up one level nodejs_current_dir = tools_target_dir / "n" - nodejs_target_dir = self.winpy_dir / self.NODEJS_PATH_REL + nodejs_target_dir = self.winpython_directory / self.NODEJS_RELATIVE_PATH if nodejs_current_dir != nodejs_target_dir and nodejs_current_dir.is_dir(): try: shutil.move(nodejs_current_dir, nodejs_target_dir) @@ -418,19 +420,19 @@ def _copy_tools(self): def _copy_documentation(self): """Copies documentation files to the WinPython 'docs' directory.""" - docs_target_dir = self.winpy_dir / "notebooks" / "docs" + docs_target_dir = self.winpython_directory / "notebooks" / "docs" self._print_action(f"Copying documentation to {docs_target_dir}") _copy_items(self.docs_directories, docs_target_dir, self.verbose) def _copy_launchers(self): """Copies pre-made launchers to the WinPython directory.""" self._print_action("Creating launchers") - _copy_items([PORTABLE_DIR / "launchers_final"], self.winpy_dir, self.verbose) + _copy_items([PORTABLE_DIRECTORY / "launchers_final"], self.winpython_directory, self.verbose) def _copy_default_scripts(self): """Copies launchers and defeult scripts.""" self._print_action("copying pre-made scripts") - _copy_items([PORTABLE_DIR / "scripts"], self.winpy_dir / "scripts", self.verbose) + _copy_items([PORTABLE_DIRECTORY / "scripts"], self.winpython_directory / "scripts", self.verbose) def _create_initial_batch_scripts(self): """Creates initial batch scripts, including environment setup.""" @@ -445,7 +447,7 @@ def _create_initial_batch_scripts(self): # Replacements for batch scripts (PyPy compatibility) exe_name = self.distribution.short_exe if self.distribution else "python.exe" # default to python.exe if distribution is not yet set - destination = self.winpy_dir / "scripts" + destination = self.winpython_directory / "scripts" for specials in ('env.bat', 'WinPython_PS_Prompt.ps1'): destspe=str(destination / specials) print('destspe:', destspe) @@ -457,7 +459,7 @@ def _create_initial_batch_scripts(self): def build(self, rebuild: bool = True, requirements=None, winpy_dirname: str = None): """Make WinPython distribution in target directory from the installers - located in wheels_dir + located in wheels_directory rebuild=True: (default) install all from scratch rebuild=False: for complementary purposes (create installers) @@ -466,20 +468,20 @@ def build(self, rebuild: bool = True, requirements=None, winpy_dirname: str = No print(f"Building WinPython with Python archive: {python_zip_filename}") if winpy_dirname is None: - raise RuntimeError("WinPython base directory to create is undefined") + raise RuntimeError("WinPython base directory to create is undefined") else: - self.winpy_dir = self.target_dir / winpy_dirname # Create/re-create the WinPython base directory - self._print_action(f"Creating WinPython {self.winpy_dir} base directory") - if self.winpy_dir.is_dir() and rebuild: + self.winpython_directory = self.target_directory / winpy_dirname # Create/re-create the WinPython base directory + self._print_action(f"Creating WinPython {self.winpython_directory} base directory") + if self.winpython_directory.is_dir() and rebuild: try: - shutil.rmtree(self.winpy_dir, onexc=utils.onerror) - except TypeError: # before 3.12 - shutil.rmtree(self.winpy_dir, onerror=utils.onerror) - os.makedirs(self.winpy_dir, exist_ok=True) + shutil.rmtree(self.winpython_directory, onexc=utils.onerror) + except TypeError: # before 3.12 + shutil.rmtree(self.winpython_directory, onerror=utils.onerror) + os.makedirs(self.winpython_directory, exist_ok=True) if rebuild: # preventive re-Creation of settings directory # (necessary if user is starting an application with a batch) - (self.winpy_dir / "settings" / "AppData" / "Roaming").mkdir(parents=True, exist_ok=True) # Ensure settings dir exists + (self.winpython_directory / "settings" / "AppData" / "Roaming").mkdir(parents=True, exist_ok=True) # Ensure settings dir exists self._extract_python_archive() self.distribution = wppm.Distribution( @@ -495,7 +497,7 @@ def build(self, rebuild: bool = True, requirements=None, winpy_dirname: str = No self._copy_tools() self._copy_documentation() - utils.python_execmodule("ensurepip", self.distribution.target) # Ensure pip is installed for PyPy + utils.python_execmodule("ensurepip", self.distribution.target) # Ensure pip is installed for PyPy self.distribution.patch_standard_packages("pip") # Upgrade essential packages @@ -508,7 +510,7 @@ def build(self, rebuild: bool = True, requirements=None, winpy_dirname: str = No self.distribution.patch_standard_packages(package_name) if requirements: - if not list(requirements) == requirements: + if not isinstance(requirements, list): requirements = requirements.split(",") for req in requirements: actions = ["install", "-r", req] @@ -526,29 +528,29 @@ def build(self, rebuild: bool = True, requirements=None, winpy_dirname: str = No self._print_action("Writing package index") # winpyver2 = the version without build part but with self.distribution.architecture self.winpyver2 = f"{self.python_full_version}.{self.build_number}" - fname = str(self.winpy_dir.parent / f"WinPython{self.flavor}-{self.distribution.architecture}bit-{self.winpyver2}.md") + fname = str(self.winpython_directory.parent / f"WinPython{self.flavor}-{self.distribution.architecture}bit-{self.winpyver2}.md") open(fname, "w", encoding='utf-8').write(self.package_index_markdown) # Copy to winpython/changelogs - shutil.copyfile(fname, str(Path(CHANGELOGS_DIR) / Path(fname).name)) + shutil.copyfile(fname, str(Path(CHANGELOGS_DIRECTORY) / Path(fname).name)) # Writing changelog self._print_action("Writing changelog") diff.write_changelog( self.winpyver2, - basedir=self.base_dir, + basedir=self.base_directory, flavor=self.flavor, release_level=self.release_level, architecture=self.distribution.architecture, ) -def rebuild_winpython_package(source_dir: Path, target_dir: Path, architecture: int = 64, verbose: bool = False): +def rebuild_winpython_package(source_dir: Path, target_directory: Path, architecture: int = 64, verbose: bool = False): """Rebuilds the winpython package from source using flit.""" - for filename in os.listdir(target_dir): + for filename in os.listdir(target_directory): if filename.startswith("winpython-") and filename.endswith((".exe", ".whl", ".gz")): - os.remove(Path(target_dir) / filename) - utils.buildflit_wininst(source_dir, copy_to=target_dir, verbose=verbose) + os.remove(Path(target_directory) / filename) + utils.buildflit_wininst(source_dir, copy_to=target_directory, verbose=verbose) def make_all( @@ -608,11 +610,11 @@ def make_all( build_number, release_level, builddir, - wheels_dir=source_dirs, - tools_dirs=[Path(d) for d in tools_dirs_list], - docs_dirs=[Path(d) for d in docs_dirs_list], + wheels_directory=source_dirs, + tools_directories=[Path(d) for d in tools_dirs_list], + documentation_directories=[Path(d) for d in docs_dirs_list], verbose=verbose, - base_dir=basedir, + base_directory=basedir, install_options=install_options_list + find_links_options, flavor=flavor, ) @@ -644,7 +646,7 @@ def make_all( # You may have to manually delete previous build\winpython-.. directory make_all( - 1, + build_number=1, release_level="build3", pyver="3.4", basedir=r"D:\Winpython\basedir34", From f3125feba3fce1986edcdec05db4bd5ec0b88dce Mon Sep 17 00:00:00 2001 From: stonebig Date: Sat, 22 Mar 2025 17:19:58 +0100 Subject: [PATCH 108/305] improve variable names via AI flash2 thinking --- make.py | 111 ++++++++++++++++++++++++++++---------------------------- 1 file changed, 55 insertions(+), 56 deletions(-) diff --git a/make.py b/make.py index eeb2e11a..fd66bbf8 100644 --- a/make.py +++ b/make.py @@ -189,7 +189,7 @@ def __init__( self.flavor = flavor self.python_zip_file: Path = self._get_python_zip_file() self.python_name = self.python_zip_file.stem # Filename without extension - self.python_dir_name = "python" # Standardized Python directory name + self.python_directory_name = "python" # Standardized Python directory name def _get_python_zip_file(self) -> Path: """Finds the Python .zip file in the wheels directory.""" @@ -241,8 +241,8 @@ def _get_installed_tools_markdown(self) -> str: """Generates Markdown for installed tools section in package index.""" installed_tools = [] - def get_tool_path(rel_path): - path = self.winpython_directory / rel_path if self.winpython_directory else None + def get_tool_path(relative_path): + path = self.winpython_directory / relative_path if self.winpython_directory else None return path if path and (path.is_file() or path.is_dir()) else None nodejs_path = get_tool_path(self.NODEJS_RELATIVE_PATH) @@ -272,7 +272,7 @@ def get_tool_path(rel_path): def _get_installed_packages_markdown(self) -> str: """Generates Markdown for installed packages section in package index.""" if self.distribution is None: - return "" # Distribution not initialized yet. + return "" # Distribution not initialized yet. self.installed_packages = self.distribution.get_installed_packages(update=True) package_lines = [ f"[{pkg.name}]({pkg.url}) | {pkg.version} | {pkg.description}" @@ -296,14 +296,14 @@ def python_full_version(self) -> str: return utils.get_python_long_version(self.distribution.target) @property - def python_executable_dir(self) -> str: + def python_executable_directory(self) -> str: """Returns the directory containing the Python executable.""" - python_path_dir = self.winpython_directory / self.python_dir_name if self.winpython_directory else None - if python_path_dir and python_path_dir.is_dir(): - return str(python_path_dir) + python_path_directory = self.winpython_directory / self.python_directory_name if self.winpython_directory else None + if python_path_directory and python_path_directory.is_dir(): + return str(python_path_directory) else: - python_path_exe = self.winpython_directory / self.python_name if self.winpython_directory else None # Fallback for older structure - return str(python_path_exe) if python_path_exe else "" + python_path_executable = self.winpython_directory / self.python_name if self.winpython_directory else None # Fallback for older structure + return str(python_path_executable) if python_path_executable else "" @property def architecture_bits(self) -> int: @@ -325,11 +325,11 @@ def pre_path_entries(self) -> list[str]: ] @property - def docs_directories(self) -> list[Path]: + def documentation_directories_list(self) -> list[Path]: """Returns the list of documentation directories to include.""" - default_docs_dir = Path(__file__).resolve().parent / "docs" - if default_docs_dir.is_dir(): - return [default_docs_dir] + self.documentation_directories + default_docs_directory = Path(__file__).resolve().parent / "docs" + if default_docs_directory.is_dir(): + return [default_docs_directory] + self.documentation_directories return self.documentation_directories def create_batch_script(self, name: str, contents: str, replacements: list[tuple[str, str]] = None): @@ -341,21 +341,20 @@ def create_batch_script(self, name: str, contents: str, replacements: list[tuple contents: The contents of the batch script. replacements: A list of tuples for text replacements in the content. """ - script_dir = self.winpython_directory / "scripts" if self.winpython_directory else None - if not script_dir: + script_directory = self.winpython_directory / "scripts" if self.winpython_directory else None + if not script_directory: print("Warning: WinPython directory not set, cannot create batch script.") return - script_dir.mkdir(parents=True, exist_ok=True) + script_directory.mkdir(parents=True, exist_ok=True) final_contents = contents if replacements: for old_text, new_text in replacements: final_contents = final_contents.replace(old_text, new_text) - script_path = script_dir / name + script_path = script_directory / name with open(script_path, "w") as f: f.write(final_contents) print(f"Created batch script: {script_path}") - def create_installer_7zip(self, installer_type: str = ".exe"): """ Creates a WinPython installer using 7-Zip. @@ -399,63 +398,63 @@ def _extract_python_archive(self): targetdir=str(self.winpython_directory), # Extract directly to winpython_directory ) # Relocate to /python subfolder if needed (for newer structure) #2024-12-22 to /python - python_target_dir = self.winpython_directory / self.python_dir_name - if self.python_dir_name != self.python_name and not python_target_dir.is_dir(): - os.rename(self.winpython_directory / self.python_name, python_target_dir) + expected_python_directory = self.winpython_directory / self.python_directory_name + if self.python_directory_name != self.python_name and not expected_python_directory.is_dir(): + os.rename(self.winpython_directory / self.python_name, expected_python_directory) def _copy_tools(self): """Copies development tools to the WinPython 't' directory.""" - tools_target_dir = self.winpython_directory / "t" - self._print_action(f"Copying tools to {tools_target_dir}") - _copy_items(self.tools_directories, tools_target_dir, self.verbose) + tools_target_directory = self.winpython_directory / "t" + self._print_action(f"Copying tools to {tools_target_directory}") + _copy_items(self.tools_directories, tools_target_directory, self.verbose) # Special handling for Node.js to move it up one level - nodejs_current_dir = tools_target_dir / "n" - nodejs_target_dir = self.winpython_directory / self.NODEJS_RELATIVE_PATH - if nodejs_current_dir != nodejs_target_dir and nodejs_current_dir.is_dir(): + nodejs_current_directory = tools_target_directory / "n" + nodejs_target_directory = self.winpython_directory / self.NODEJS_RELATIVE_PATH + if nodejs_current_directory != nodejs_target_directory and nodejs_current_directory.is_dir(): try: - shutil.move(nodejs_current_dir, nodejs_target_dir) + shutil.move(nodejs_current_directory, nodejs_target_directory) except Exception as e: print(f"Error moving Node.js directory: {e}") def _copy_documentation(self): """Copies documentation files to the WinPython 'docs' directory.""" - docs_target_dir = self.winpython_directory / "notebooks" / "docs" - self._print_action(f"Copying documentation to {docs_target_dir}") - _copy_items(self.docs_directories, docs_target_dir, self.verbose) - + docs_target_directory = self.winpython_directory / "notebooks" / "docs" + self._print_action(f"Copying documentation to {docs_target_directory}") + _copy_items(self.documentation_directories_list, docs_target_directory, self.verbose) + def _copy_launchers(self): """Copies pre-made launchers to the WinPython directory.""" self._print_action("Creating launchers") _copy_items([PORTABLE_DIRECTORY / "launchers_final"], self.winpython_directory, self.verbose) def _copy_default_scripts(self): - """Copies launchers and defeult scripts.""" + """Copies launchers and default scripts.""" self._print_action("copying pre-made scripts") _copy_items([PORTABLE_DIRECTORY / "scripts"], self.winpython_directory / "scripts", self.verbose) - + def _create_initial_batch_scripts(self): """Creates initial batch scripts, including environment setup.""" self._print_action("Creating initial batch scripts") - path_entries_str = ";".join([rf"%WINPYDIR%\{pth}" for pth in self.pre_path_entries]) - full_path_env_var = f"{path_entries_str};%PATH%" + path_entries_string = ";".join([rf"%WINPYDIR%\{path}" for path in self.pre_path_entries]) + full_path_environment_variable = f"{path_entries_string};%PATH%" - path_entries_ps_str = ";".join([rf"$env:WINPYDIR\\{pth}" for pth in self.pre_path_entries]) - full_path_ps_env_var = f"{path_entries_ps_str};$env:path" + path_entries_powershell_string = ";".join([rf"$env:WINPYDIR\\{path}" for path in self.pre_path_entries]) + full_path_powershell_environment_variable = f"{path_entries_powershell_string};$env:path" # Replacements for batch scripts (PyPy compatibility) - exe_name = self.distribution.short_exe if self.distribution else "python.exe" # default to python.exe if distribution is not yet set + executable_name = self.distribution.short_exe if self.distribution else "python.exe" # default to python.exe if distribution is not yet set destination = self.winpython_directory / "scripts" - for specials in ('env.bat', 'WinPython_PS_Prompt.ps1'): - destspe=str(destination / specials) - print('destspe:', destspe) - utils.patch_sourcefile(destspe,'{self.python_dir_name}', self.python_dir_name) - utils.patch_sourcefile(destspe,'{self.winpython_version_name}', self.winpython_version_name) - utils.patch_sourcefile(destspe,'{full_path_env_var}', full_path_env_var) - utils.patch_sourcefile(destspe,'{full_path_ps_env_var}', full_path_ps_env_var) - + for script_name in ('env.bat', 'WinPython_PS_Prompt.ps1'): + destination_script_path = str(destination / script_name) + print('destination_script_path:', destination_script_path) + utils.patch_sourcefile(destination_script_path, 'python.exe', executable_name) + utils.patch_sourcefile(destination_script_path, '{self.python_dir_name}', self.python_directory_name) + utils.patch_sourcefile(destination_script_path, '{self.winpython_version_name}', self.winpython_version_name) + utils.patch_sourcefile(destination_script_path, '{full_path_env_var}', full_path_environment_variable) + utils.patch_sourcefile(destination_script_path,'{full_path_ps_env_var}', full_path_powershell_environment_variable) def build(self, rebuild: bool = True, requirements=None, winpy_dirname: str = None): """Make WinPython distribution in target directory from the installers @@ -485,7 +484,7 @@ def build(self, rebuild: bool = True, requirements=None, winpy_dirname: str = No self._extract_python_archive() self.distribution = wppm.Distribution( - self.python_executable_dir, + self.python_executable_directory, verbose=self.verbose, indent=True, ) @@ -528,11 +527,11 @@ def build(self, rebuild: bool = True, requirements=None, winpy_dirname: str = No self._print_action("Writing package index") # winpyver2 = the version without build part but with self.distribution.architecture self.winpyver2 = f"{self.python_full_version}.{self.build_number}" - fname = str(self.winpython_directory.parent / f"WinPython{self.flavor}-{self.distribution.architecture}bit-{self.winpyver2}.md") - open(fname, "w", encoding='utf-8').write(self.package_index_markdown) + output_markdown_filename = str(self.winpython_directory.parent / f"WinPython{self.flavor}-{self.distribution.architecture}bit-{self.winpyver2}.md") + open(output_markdown_filename, "w", encoding='utf-8').write(self.package_index_markdown) # Copy to winpython/changelogs - shutil.copyfile(fname, str(Path(CHANGELOGS_DIRECTORY) / Path(fname).name)) + shutil.copyfile(output_markdown_filename, str(Path(CHANGELOGS_DIRECTORY) / Path(output_markdown_filename).name)) # Writing changelog self._print_action("Writing changelog") @@ -594,14 +593,14 @@ def make_all( docs_dirs_list = _parse_list_argument(docsdirs, ",") install_options_list = _parse_list_argument(install_options, " ") find_links_dirs_list = _parse_list_argument(find_links, ",") - requirements_files_list = [Path(f) for f in _parse_list_argument(requirements, ",") if f] # ensure Path objects + requirements_files_list = [Path(f) for f in _parse_list_argument(requirements, ",") if f] # ensure Path objects find_links_options = [f"--find-links={link}" for link in find_links_dirs_list + [source_dirs]] - builddir = str(Path(basedir) / ("bu" + flavor)) + build_directory = str(Path(basedir) / ("bu" + flavor)) if rebuild: # Rebuild Winpython Wheel Package utils.print_box(f"Making WinPython {architecture}bits at {Path(basedir) / ('bu' + flavor)}") - os.makedirs(Path(builddir), exist_ok=True) + os.makedirs(Path(build_directory), exist_ok=True) # use source_dirs as the directory to re-build Winpython wheel winpython_source_dir = Path(__file__).resolve().parent rebuild_winpython_package(winpython_source_dir, source_dirs, architecture, verbose) @@ -609,7 +608,7 @@ def make_all( builder = WinPythonDistributionBuilder( build_number, release_level, - builddir, + build_directory, wheels_directory=source_dirs, tools_directories=[Path(d) for d in tools_dirs_list], documentation_directories=[Path(d) for d in docs_dirs_list], From ca08175892ed05037911d4de517822eef9d15455 Mon Sep 17 00:00:00 2001 From: stonebig Date: Sat, 22 Mar 2025 18:50:51 +0100 Subject: [PATCH 109/305] use AI Gemini Flash2 thinking intermediate thoughts --- make.py | 125 +++++++++++++++++----------------------------- winpython/wppm.py | 7 +-- 2 files changed, 49 insertions(+), 83 deletions(-) diff --git a/make.py b/make.py index fd66bbf8..430974b3 100644 --- a/make.py +++ b/make.py @@ -401,12 +401,22 @@ def _extract_python_archive(self): expected_python_directory = self.winpython_directory / self.python_directory_name if self.python_directory_name != self.python_name and not expected_python_directory.is_dir(): os.rename(self.winpython_directory / self.python_name, expected_python_directory) + + def _copy_essential_files(self): + """Copies pre-made objects""" + self._print_action("Copying default scripts") + _copy_items([PORTABLE_DIRECTORY / "scripts"], self.winpython_directory / "scripts", self.verbose) + + self._print_action("Copying launchers") + _copy_items([PORTABLE_DIRECTORY / "launchers_final"], self.winpython_directory, self.verbose) + + docs_target_directory = self.winpython_directory / "notebooks" / "docs" + self._print_action(f"Copying documentation to {docs_target_directory}") + _copy_items(self.documentation_directories_list, docs_target_directory, self.verbose) - def _copy_tools(self): - """Copies development tools to the WinPython 't' directory.""" tools_target_directory = self.winpython_directory / "t" self._print_action(f"Copying tools to {tools_target_directory}") - _copy_items(self.tools_directories, tools_target_directory, self.verbose) + _copy_items(self.tools_directories, self.winpython_directory / "t", self.verbose) # Special handling for Node.js to move it up one level nodejs_current_directory = tools_target_directory / "n" @@ -417,22 +427,6 @@ def _copy_tools(self): except Exception as e: print(f"Error moving Node.js directory: {e}") - def _copy_documentation(self): - """Copies documentation files to the WinPython 'docs' directory.""" - docs_target_directory = self.winpython_directory / "notebooks" / "docs" - self._print_action(f"Copying documentation to {docs_target_directory}") - _copy_items(self.documentation_directories_list, docs_target_directory, self.verbose) - - def _copy_launchers(self): - """Copies pre-made launchers to the WinPython directory.""" - self._print_action("Creating launchers") - _copy_items([PORTABLE_DIRECTORY / "launchers_final"], self.winpython_directory, self.verbose) - - def _copy_default_scripts(self): - """Copies launchers and default scripts.""" - self._print_action("copying pre-made scripts") - _copy_items([PORTABLE_DIRECTORY / "scripts"], self.winpython_directory / "scripts", self.verbose) - def _create_initial_batch_scripts(self): """Creates initial batch scripts, including environment setup.""" self._print_action("Creating initial batch scripts") @@ -456,13 +450,9 @@ def _create_initial_batch_scripts(self): utils.patch_sourcefile(destination_script_path, '{full_path_env_var}', full_path_environment_variable) utils.patch_sourcefile(destination_script_path,'{full_path_ps_env_var}', full_path_powershell_environment_variable) - def build(self, rebuild: bool = True, requirements=None, winpy_dirname: str = None): - """Make WinPython distribution in target directory from the installers - located in wheels_directory - - rebuild=True: (default) install all from scratch - rebuild=False: for complementary purposes (create installers) - requirements=file(s) of requirements (separated by space if several)""" + def build(self, rebuild: bool = True, requirements_files_list=None, winpy_dirname: str = None): + """Make or finalise WinPython distribution in the target directory""" + python_zip_filename = self.python_zip_file.name print(f"Building WinPython with Python archive: {python_zip_filename}") @@ -470,31 +460,23 @@ def build(self, rebuild: bool = True, requirements=None, winpy_dirname: str = No raise RuntimeError("WinPython base directory to create is undefined") else: self.winpython_directory = self.target_directory / winpy_dirname # Create/re-create the WinPython base directory - self._print_action(f"Creating WinPython {self.winpython_directory} base directory") - if self.winpython_directory.is_dir() and rebuild: - try: - shutil.rmtree(self.winpython_directory, onexc=utils.onerror) - except TypeError: # before 3.12 - shutil.rmtree(self.winpython_directory, onerror=utils.onerror) - os.makedirs(self.winpython_directory, exist_ok=True) if rebuild: + self._print_action(f"Creating WinPython {self.winpython_directory} base directory") + if self.winpython_directory.is_dir(): + try: + shutil.rmtree(self.winpython_directory, onexc=utils.onerror) + except TypeError: # before 3.12 + shutil.rmtree(self.winpython_directory, onerror=utils.onerror) + os.makedirs(self.winpython_directory, exist_ok=True) # preventive re-Creation of settings directory - # (necessary if user is starting an application with a batch) - (self.winpython_directory / "settings" / "AppData" / "Roaming").mkdir(parents=True, exist_ok=True) # Ensure settings dir exists + (self.winpython_directory / "settings" / "AppData" / "Roaming").mkdir(parents=True, exist_ok=True) self._extract_python_archive() - self.distribution = wppm.Distribution( - self.python_executable_directory, - verbose=self.verbose, - indent=True, - ) + self.distribution = wppm.Distribution(self.python_executable_directory, verbose=self.verbose) if rebuild: - self._copy_default_scripts() + self._copy_essential_files() self._create_initial_batch_scripts() - self._copy_launchers() - self._copy_tools() - self._copy_documentation() utils.python_execmodule("ensurepip", self.distribution.target) # Ensure pip is installed for PyPy self.distribution.patch_standard_packages("pip") @@ -503,26 +485,21 @@ def build(self, rebuild: bool = True, requirements=None, winpy_dirname: str = No essential_packages = ["pip", "setuptools", "wheel", "winpython"] for package_name in essential_packages: actions = ["install", "--upgrade", "--pre", package_name] + self.install_options - print(f"Piping: {' '.join(actions)}") self._print_action(f"Piping: {' '.join(actions)}") self.distribution.do_pip_action(actions) self.distribution.patch_standard_packages(package_name) - if requirements: - if not isinstance(requirements, list): - requirements = requirements.split(",") - for req in requirements: - actions = ["install", "-r", req] - if self.install_options is not None: - actions += self.install_options - print(f"piping {' '.join(actions)}") - self._print_action(f"piping {' '.join(actions)}") - self.distribution.do_pip_action(actions) - + if requirements_files_list: + for req in requirements_files_list: + actions = ["install", "-r", req] + if self.install_options is not None: + actions += self.install_options + self._print_action(f"piping {' '.join(actions)}") + self.distribution.do_pip_action(actions) self.distribution.patch_standard_packages() - self._print_action("Cleaning up distribution") - self.distribution.clean_up() + self._print_action("Cleaning up distribution") + self.distribution.clean_up() # still usefull ? # Writing package index self._print_action("Writing package index") # winpyver2 = the version without build part but with self.distribution.architecture @@ -530,26 +507,18 @@ def build(self, rebuild: bool = True, requirements=None, winpy_dirname: str = No output_markdown_filename = str(self.winpython_directory.parent / f"WinPython{self.flavor}-{self.distribution.architecture}bit-{self.winpyver2}.md") open(output_markdown_filename, "w", encoding='utf-8').write(self.package_index_markdown) - # Copy to winpython/changelogs - shutil.copyfile(output_markdown_filename, str(Path(CHANGELOGS_DIRECTORY) / Path(output_markdown_filename).name)) - # Writing changelog self._print_action("Writing changelog") - diff.write_changelog( - self.winpyver2, - basedir=self.base_directory, - flavor=self.flavor, - release_level=self.release_level, - architecture=self.distribution.architecture, - ) + shutil.copyfile(output_markdown_filename, str(Path(CHANGELOGS_DIRECTORY) / Path(output_markdown_filename).name)) + diff.write_changelog(self.winpyver2, None, self.base_directory, self.flavor, self.release_level, self.distribution.architecture) -def rebuild_winpython_package(source_dir: Path, target_directory: Path, architecture: int = 64, verbose: bool = False): +def rebuild_winpython_package(source_directory: Path, target_directory: Path, architecture: int = 64, verbose: bool = False): """Rebuilds the winpython package from source using flit.""" for filename in os.listdir(target_directory): if filename.startswith("winpython-") and filename.endswith((".exe", ".whl", ".gz")): os.remove(Path(target_directory) / filename) - utils.buildflit_wininst(source_dir, copy_to=target_directory, verbose=verbose) + utils.buildflit_wininst(source_directory, copy_to=target_directory, verbose=verbose) def make_all( @@ -618,19 +587,19 @@ def make_all( flavor=flavor, ) # define the directory where to create the distro - my_x = "".join(builder.python_name.replace(".amd64", "").split(".")[-2:-1]) - while not my_x.isdigit() and len(my_x) > 0: - my_x = my_x[:-1] + python_minor_version_str = "".join(builder.python_name.replace(".amd64", "").split(".")[-2:-1]) + while not python_minor_version_str.isdigit() and len(python_minor_version_str) > 0: + python_minor_version_str = python_minor_version_str[:-1] # simplify for PyPy - if not python_target_release == None: - winpy_dirname = f"WPy{architecture}-{python_target_release}{build_number}{release_level}" + if python_target_release is not None: + winpython_dirname = f"WPy{architecture}-{python_target_release}{build_number}{release_level}" else: - winpy_dirname = f"WPy{architecture}-{pyver.replace('.', '')}{my_x}{build_number}{release_level}" + winpython_dirname = f"WPy{architecture}-{pyver.replace('.', '')}{python_minor_version_str}{build_number}{release_level}" builder.build( rebuild=rebuild, - requirements=requirements_files_list, - winpy_dirname=winpy_dirname, + requirements_files_list=requirements_files_list, + winpy_dirname=winpython_dirname, ) if ".zip" in str(create_installer).lower(): builder.create_installer_7zip(".zip") diff --git a/winpython/wppm.py b/winpython/wppm.py index e825d9c8..9d13b195 100644 --- a/winpython/wppm.py +++ b/winpython/wppm.py @@ -49,11 +49,10 @@ def __str__(self): class Distribution: - def __init__(self, target=None, verbose=False, indent=False): + def __init__(self, target=None, verbose=False): # if no target path given, take the current python interpreter one self.target = target or os.path.dirname(sys.executable) self.verbose = verbose - self.indent = indent self.pip = None self.to_be_removed = [] # list of directories to be removed later self.version, self.architecture = utils.get_python_infos(target) @@ -376,9 +375,7 @@ def _print(self, package, action): if self.verbose: utils.print_box(text) else: - if self.indent: - text = (" " * 4) + text - print(text + "...", end=" ") + print(" " + text + "...", end=" ") def _print_done(self): """Print OK at the end of a process""" From 0b62f975277d4ec8c10c1fde5c1cb7aae939a5a4 Mon Sep 17 00:00:00 2001 From: stonebig Date: Sat, 22 Mar 2025 18:53:51 +0100 Subject: [PATCH 110/305] missing patch --- diff.py | 1 - 1 file changed, 1 deletion(-) diff --git a/diff.py b/diff.py index ec658aba..73498001 100644 --- a/diff.py +++ b/diff.py @@ -259,7 +259,6 @@ def write_changelog( version1=None, basedir=None, flavor="", - release_level="", architecture=64, ): """Write changelog between version1 and version2 of WinPython""" From f01d177886e695f9e241d33611629853c8576612 Mon Sep 17 00:00:00 2001 From: stonebig Date: Sat, 22 Mar 2025 21:35:12 +0100 Subject: [PATCH 111/305] fix-up and remove dead create_batch_script() --- make.py | 25 +------------------------ 1 file changed, 1 insertion(+), 24 deletions(-) diff --git a/make.py b/make.py index 430974b3..fa0bdb73 100644 --- a/make.py +++ b/make.py @@ -332,29 +332,6 @@ def documentation_directories_list(self) -> list[Path]: return [default_docs_directory] + self.documentation_directories return self.documentation_directories - def create_batch_script(self, name: str, contents: str, replacements: list[tuple[str, str]] = None): - """ - Creates a batch script in the WinPython scripts directory. - - Args: - name: The name of the batch script file. - contents: The contents of the batch script. - replacements: A list of tuples for text replacements in the content. - """ - script_directory = self.winpython_directory / "scripts" if self.winpython_directory else None - if not script_directory: - print("Warning: WinPython directory not set, cannot create batch script.") - return - script_directory.mkdir(parents=True, exist_ok=True) - final_contents = contents - if replacements: - for old_text, new_text in replacements: - final_contents = final_contents.replace(old_text, new_text) - script_path = script_directory / name - with open(script_path, "w") as f: - f.write(final_contents) - print(f"Created batch script: {script_path}") - def create_installer_7zip(self, installer_type: str = ".exe"): """ Creates a WinPython installer using 7-Zip. @@ -510,7 +487,7 @@ def build(self, rebuild: bool = True, requirements_files_list=None, winpy_dirnam # Writing changelog self._print_action("Writing changelog") shutil.copyfile(output_markdown_filename, str(Path(CHANGELOGS_DIRECTORY) / Path(output_markdown_filename).name)) - diff.write_changelog(self.winpyver2, None, self.base_directory, self.flavor, self.release_level, self.distribution.architecture) + diff.write_changelog(self.winpyver2, None, self.base_directory, self.flavor, self.distribution.architecture) def rebuild_winpython_package(source_directory: Path, target_directory: Path, architecture: int = 64, verbose: bool = False): From 73864a539f9446d81c1adb811a17b05fd93c8021 Mon Sep 17 00:00:00 2001 From: stonebig Date: Sat, 22 Mar 2025 23:42:05 +0100 Subject: [PATCH 112/305] simplify further --- make.py | 32 ++++++++++++-------------------- 1 file changed, 12 insertions(+), 20 deletions(-) diff --git a/make.py b/make.py index fa0bdb73..5d5bb36a 100644 --- a/make.py +++ b/make.py @@ -1,14 +1,11 @@ # -*- coding: utf-8 -*- # +# WinPython build script # Copyright © 2012 Pierre Raybaut # Copyright © 2014-2024+  The Winpython development team https://github.com/winpython/ # Licensed under the terms of the MIT License # (see winpython/__init__.py for details) -""" -WinPython build script -""" - import os import re import shutil @@ -66,7 +63,7 @@ def replace_lines_in_file(filepath: Path, replacements: list[tuple[str, str]]): for index, line in enumerate(lines): for prefix, new_text in replacements: start_prefix = prefix - if prefix not in ("Icon", "OutFile") and not prefix.startswith("!"): + if not prefix.startswith("!"): start_prefix = "set " + prefix if line.startswith(start_prefix + "="): updated_lines[index] = f"{start_prefix}={new_text}\n" @@ -90,13 +87,12 @@ def build_installer_7zip( output_script_path: Path to save the generated 7-Zip script. replacements: A list of tuples for text replacements (prefix, new_text). """ - sevenzip_executable = find_7zip_executable() shutil.copy(script_template_path, output_script_path) # Standard replacements for all 7zip scripts data_to_replace = [ ("PORTABLE_DIR", str(PORTABLE_DIRECTORY)), - ("SEVENZIP_EXE", sevenzip_executable), + ("SEVENZIP_EXE", find_7zip_executable()), ] + replacements replace_lines_in_file(output_script_path, data_to_replace) @@ -108,7 +104,7 @@ def build_installer_7zip( subprocess.run( command, shell=True, check=True, stderr=sys.stderr, stdout=sys.stderr # with stdout=sys.stdout, we would not see 7zip compressing - ) # Use subprocess.run for better error handling + ) except subprocess.CalledProcessError as e: print(f"Error executing 7-Zip script: {e}", file=sys.stderr) @@ -516,19 +512,17 @@ def make_all( docsdirs: str | list[Path] = None, python_target_release: str = None, # e.g. "37101" for 3.7.10 ): - """Make WinPython distribution, for a given base directory and - architecture: + """Make a WinPython distribution for a given set of parameters: `build_number`: build number [int] `release_level`: release level (e.g. 'beta1', '') [str] `pyver`: python version ('3.4' or 3.5') `architecture`: [int] (32 or 64) - `basedir`: where will be created tmp_wheel and Winpython build - r'D:\Winpython\basedir34'. - `requirements`: the package list for pip r'D:\requirements.txt', - `install_options`: pip options r'--no-index --pre --trusted-host=None', - `find_links`: package directories r'D:\Winpython\packages.srcreq', - `source_dirs`: the python.zip + rebuilt winpython wheel package directory, - `toolsdirs`: r'D:\WinPython\basedir34\t.Slim', + `basedir`: where to create the build (r'D:\Winpython\basedir34') + `requirements`: package lists for pip (r'D:\requirements.txt') + `install_options`: pip options (r'--no-index --pre --trusted-host=None') + `find_links`: package directories (r'D:\Winpython\packages.srcreq') + `source_dirs`: the python.zip + rebuilt winpython wheel package directory + `toolsdirs`: r'D:\WinPython\basedir34\t.Slim' `docsdirs`: r'D:\WinPython\basedir34\docs.Slim'""" assert basedir is not None, "The *basedir* directory must be specified" @@ -587,9 +581,7 @@ def make_all( if __name__ == "__main__": - # DO create only one version at a time - # You may have to manually delete previous build\winpython-.. directory - + # DO create only one Winpython distribution at a time make_all( build_number=1, release_level="build3", From 4b0d8b46ffdd9dad3bca7650dd1867d0f378ea01 Mon Sep 17 00:00:00 2001 From: stonebig Date: Sun, 23 Mar 2025 08:36:41 +0100 Subject: [PATCH 113/305] simplify 7-zip and python archive search --- make.py | 59 ++++++++++++++++++--------------------------------------- 1 file changed, 18 insertions(+), 41 deletions(-) diff --git a/make.py b/make.py index 5d5bb36a..45b36f21 100644 --- a/make.py +++ b/make.py @@ -31,13 +31,12 @@ def find_7zip_executable() -> str: possible_program_files = [ Path(r"C:\Program Files"), Path(r"C:\Program Files (x86)"), - Path(sys.prefix).parent.parent / "7-Zip", + Path(sys.prefix).parent / "t" , ] for base_dir in possible_program_files: - for subdir in [".", "App"]: - executable_path = base_dir / subdir / "7-Zip" / "7z.exe" - if executable_path.is_file(): - return str(executable_path) + executable_path = base_dir / "7-Zip" / "7z.exe" + if executable_path.is_file(): + return str(executable_path) raise RuntimeError("7ZIP is not installed on this computer.") @@ -58,13 +57,11 @@ def replace_lines_in_file(filepath: Path, replacements: list[tuple[str, str]]): print(f"Error: File not found: {filepath}") return - updated_lines = list(lines) # Create a mutable copy + updated_lines = lines.copy() # Create a mutable copy of lines for index, line in enumerate(lines): for prefix, new_text in replacements: - start_prefix = prefix - if not prefix.startswith("!"): - start_prefix = "set " + prefix + start_prefix = "set " + prefix if not prefix.startswith("!") else prefix if line.startswith(start_prefix + "="): updated_lines[index] = f"{start_prefix}={new_text}\n" @@ -75,10 +72,7 @@ def replace_lines_in_file(filepath: Path, replacements: list[tuple[str, str]]): except Exception as e: print(f"Error writing to file {filepath}: {e}") - -def build_installer_7zip( - script_template_path: Path, output_script_path: Path, replacements: list[tuple[str, str]] -): +def build_installer_7zip(script_template_path: Path, output_script_path: Path, replacements: list[tuple[str, str]]): """ Creates a 7-Zip installer script by copying a template and applying text replacements. @@ -98,13 +92,10 @@ def build_installer_7zip( replace_lines_in_file(output_script_path, data_to_replace) try: - # Execute the generated 7-Zip script + # Execute the generated 7-Zip script, with stdout=sys.stderr to see 7zip compressing command = f'"{output_script_path}"' print(f"Executing 7-Zip script: {command}") - subprocess.run( - command, shell=True, check=True, stderr=sys.stderr, stdout=sys.stderr - # with stdout=sys.stdout, we would not see 7zip compressing - ) + subprocess.run(command, shell=True, check=True, stderr=sys.stderr, stdout=sys.stderr) except subprocess.CalledProcessError as e: print(f"Error executing 7-Zip script: {e}", file=sys.stderr) @@ -124,7 +115,7 @@ def _copy_items(source_directories: list[Path], target_directory: Path, verbose: try: copy_function(source_item, target_item) if verbose: - print(f" Copied: {source_item} -> {target_item}") + print(f"Copied: {source_item} -> {target_item}") except Exception as e: print(f"Error copying {source_item} to {target_item}: {e}") @@ -189,24 +180,15 @@ def __init__( def _get_python_zip_file(self) -> Path: """Finds the Python .zip file in the wheels directory.""" - patterns = [ - r"(pypy3|python-)([0-9]|[a-zA-Z]|.)*.zip", # PyPy pattern - r"python-([0-9\.rcba]*)((\.|\-)amd64)?\.(zip|zip)", # Standard Python pattern - ] - for pattern in patterns: - for filename in os.listdir(self.wheels_directory): - if re.match(pattern, filename): + pattern = r"(pypy3|python-)([0-9]|[a-zA-Z]|.)*.zip" + for filename in os.listdir(self.wheels_directory): + if re.match(pattern, filename): return self.wheels_directory / filename raise RuntimeError(f"Could not find Python zip package in {self.wheels_directory}") @property def package_index_markdown(self) -> str: - """ - Generates a Markdown formatted package index page. - - Returns: - str: Markdown content for the package index. - """ + """Generates a Markdown formatted package index page.""" installed_tools_markdown = self._get_installed_tools_markdown() installed_packages_markdown = self._get_installed_packages_markdown() python_description = "Python programming language with standard library" @@ -421,7 +403,7 @@ def _create_initial_batch_scripts(self): utils.patch_sourcefile(destination_script_path, '{self.python_dir_name}', self.python_directory_name) utils.patch_sourcefile(destination_script_path, '{self.winpython_version_name}', self.winpython_version_name) utils.patch_sourcefile(destination_script_path, '{full_path_env_var}', full_path_environment_variable) - utils.patch_sourcefile(destination_script_path,'{full_path_ps_env_var}', full_path_powershell_environment_variable) + utils.patch_sourcefile(destination_script_path, '{full_path_ps_env_var}', full_path_powershell_environment_variable) def build(self, rebuild: bool = True, requirements_files_list=None, winpy_dirname: str = None): """Make or finalise WinPython distribution in the target directory""" @@ -450,8 +432,7 @@ def build(self, rebuild: bool = True, requirements_files_list=None, winpy_dirnam if rebuild: self._copy_essential_files() self._create_initial_batch_scripts() - - utils.python_execmodule("ensurepip", self.distribution.target) # Ensure pip is installed for PyPy + utils.python_execmodule("ensurepip", self.distribution.target) self.distribution.patch_standard_packages("pip") # Upgrade essential packages @@ -567,11 +548,8 @@ def make_all( else: winpython_dirname = f"WPy{architecture}-{pyver.replace('.', '')}{python_minor_version_str}{build_number}{release_level}" - builder.build( - rebuild=rebuild, - requirements_files_list=requirements_files_list, - winpy_dirname=winpython_dirname, - ) + builder.build(rebuild=rebuild, requirements_files_list=requirements_files_list, winpy_dirname=winpython_dirname) + if ".zip" in str(create_installer).lower(): builder.create_installer_7zip(".zip") if ".7z" in str(create_installer).lower(): @@ -579,7 +557,6 @@ def make_all( if "7zip" in str(create_installer).lower(): builder.create_installer_7zip(".exe") - if __name__ == "__main__": # DO create only one Winpython distribution at a time make_all( From 6e7d16ba363a35b7d76a66b54ff1be6cbe170c70 Mon Sep 17 00:00:00 2001 From: stonebig Date: Sun, 23 Mar 2025 09:30:56 +0100 Subject: [PATCH 114/305] walrus a bit --- make.py | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/make.py b/make.py index 45b36f21..e6672d7a 100644 --- a/make.py +++ b/make.py @@ -34,8 +34,7 @@ def find_7zip_executable() -> str: Path(sys.prefix).parent / "t" , ] for base_dir in possible_program_files: - executable_path = base_dir / "7-Zip" / "7z.exe" - if executable_path.is_file(): + if (executable_path := base_dir / "7-Zip" / "7z.exe").is_file(): return str(executable_path) raise RuntimeError("7ZIP is not installed on this computer.") @@ -180,9 +179,8 @@ def __init__( def _get_python_zip_file(self) -> Path: """Finds the Python .zip file in the wheels directory.""" - pattern = r"(pypy3|python-)([0-9]|[a-zA-Z]|.)*.zip" for filename in os.listdir(self.wheels_directory): - if re.match(pattern, filename): + if re.match("(pypy3|python-)([0-9]|[a-zA-Z]|.)*.zip", filename): return self.wheels_directory / filename raise RuntimeError(f"Could not find Python zip package in {self.wheels_directory}") @@ -305,8 +303,7 @@ def pre_path_entries(self) -> list[str]: @property def documentation_directories_list(self) -> list[Path]: """Returns the list of documentation directories to include.""" - default_docs_directory = Path(__file__).resolve().parent / "docs" - if default_docs_directory.is_dir(): + if (default_docs_directory := Path(__file__).parent / "docs").is_dir(): return [default_docs_directory] + self.documentation_directories return self.documentation_directories @@ -371,7 +368,7 @@ def _copy_essential_files(self): tools_target_directory = self.winpython_directory / "t" self._print_action(f"Copying tools to {tools_target_directory}") - _copy_items(self.tools_directories, self.winpython_directory / "t", self.verbose) + _copy_items(self.tools_directories, tools_target_directory, self.verbose) # Special handling for Node.js to move it up one level nodejs_current_directory = tools_target_directory / "n" From 942872c8db11916799fe8594606086dc9afd33d6 Mon Sep 17 00:00:00 2001 From: stonebig Date: Sun, 23 Mar 2025 09:45:49 +0100 Subject: [PATCH 115/305] simplify further --- make.py | 41 ++++++++++++----------------------------- 1 file changed, 12 insertions(+), 29 deletions(-) diff --git a/make.py b/make.py index e6672d7a..62a2c8a0 100644 --- a/make.py +++ b/make.py @@ -25,7 +25,6 @@ assert CHANGELOGS_DIRECTORY.is_dir(), f"Changelogs directory not found: {CHANGELOGS_DIRECTORY}" assert PORTABLE_DIRECTORY.is_dir(), f"Portable directory not found: {PORTABLE_DIRECTORY}" - def find_7zip_executable() -> str: """Locates the 7-Zip executable (7z.exe).""" possible_program_files = [ @@ -38,7 +37,6 @@ def find_7zip_executable() -> str: return str(executable_path) raise RuntimeError("7ZIP is not installed on this computer.") - def replace_lines_in_file(filepath: Path, replacements: list[tuple[str, str]]): """ Replaces lines in a file that start with a given prefix. @@ -98,10 +96,8 @@ def build_installer_7zip(script_template_path: Path, output_script_path: Path, r except subprocess.CalledProcessError as e: print(f"Error executing 7-Zip script: {e}", file=sys.stderr) - def _copy_items(source_directories: list[Path], target_directory: Path, verbose: bool = False): """Copies items from source directories to the target directory.""" - target_directory.mkdir(parents=True, exist_ok=True) for source_dir in source_directories: if not source_dir.is_dir(): @@ -118,7 +114,6 @@ def _copy_items(source_directories: list[Path], target_directory: Path, verbose: except Exception as e: print(f"Error copying {source_item} to {target_item}: {e}") - def _parse_list_argument(argument_value: str | list[str], separator=" ") -> list[str]: """Parse a separated list argument into a list of strings.""" if argument_value is None: @@ -127,7 +122,6 @@ def _parse_list_argument(argument_value: str | list[str], separator=" ") -> list return argument_value.split(separator) return list(argument_value) - class WinPythonDistributionBuilder: """Builds a WinPython distribution.""" @@ -163,19 +157,19 @@ def __init__( """ self.build_number = build_number self.release_level = release_level - self.target_directory = Path(target_directory) # Ensure Path object - self.wheels_directory = Path(wheels_directory) # Ensure Path object + self.target_directory = Path(target_directory) + self.wheels_directory = Path(wheels_directory) self.tools_directories = tools_directories or [] self.documentation_directories = documentation_directories or [] self.verbose = verbose - self.winpython_directory: Path | None = None # Will be set during build - self.distribution: wppm.Distribution | None = None # Will be set during build + self.winpython_directory: Path | None = None + self.distribution: wppm.Distribution | None = None self.base_directory = base_directory self.install_options = install_options or [] self.flavor = flavor self.python_zip_file: Path = self._get_python_zip_file() - self.python_name = self.python_zip_file.stem # Filename without extension - self.python_directory_name = "python" # Standardized Python directory name + self.python_name = self.python_zip_file.stem + self.python_directory_name = "python" def _get_python_zip_file(self) -> Path: """Finds the Python .zip file in the wheels directory.""" @@ -263,10 +257,7 @@ def winpython_version_name(self) -> str: @property def python_full_version(self) -> str: - """ - Retrieves the Python full version string from the distribution. - Will be set after _extract_python is called and distribution is initialized. - """ + """Retrieves the Python full version string from the distribution.""" if self.distribution is None: return "0.0.0" # Placeholder before initialization return utils.get_python_long_version(self.distribution.target) @@ -286,7 +277,7 @@ def architecture_bits(self) -> int: """Returns the architecture (32 or 64 bits) of the distribution.""" if self.distribution: return self.distribution.architecture - return 64 # Default to 64 if distribution is not initialized yet + return 64 @property def pre_path_entries(self) -> list[str]: @@ -308,14 +299,10 @@ def documentation_directories_list(self) -> list[Path]: return self.documentation_directories def create_installer_7zip(self, installer_type: str = ".exe"): - """ - Creates a WinPython installer using 7-Zip. - - Args: installer_type: Type of installer to create (".exe", ".7z", ".zip"). - """ + """Creates a WinPython installer using 7-Zip: ".exe", ".7z", ".zip")""" self._print_action(f"Creating WinPython installer ({installer_type})") template_name = "installer_7zip.bat" - output_name = "installer_7zip-tmp.bat" # temp file to avoid overwriting template + output_name = "installer_7zip-tmp.bat" if installer_type not in [".exe", ".7z", ".zip"]: print(f"Warning: Unsupported installer type '{installer_type}'. Defaulting to .exe") installer_type = ".exe" @@ -326,14 +313,10 @@ def create_installer_7zip(self, installer_type: str = ".exe"): ("VERSION", f"{self.python_full_version}.{self.build_number}{self.flavor}"), ("VERSION_INSTALL", f'{self.python_full_version.replace(".", "")}{self.build_number}'), ("RELEASELEVEL", self.release_level), - ("INSTALLER_OPTION", installer_type), # Pass installer type as option to bat script + ("INSTALLER_OPTION", installer_type), ] - build_installer_7zip( - PORTABLE_DIRECTORY / template_name, - PORTABLE_DIRECTORY / output_name, - replacements - ) + build_installer_7zip(PORTABLE_DIRECTORY / template_name, PORTABLE_DIRECTORY / output_name, replacements) def _print_action(self, text: str): """Prints an action message with progress indicator.""" From a496b25f5a2b7e778eece9b5312fc9017f8211a9 Mon Sep 17 00:00:00 2001 From: stonebig Date: Sun, 23 Mar 2025 12:50:10 +0100 Subject: [PATCH 116/305] remove un-needed documentation_directories_list() complexity --- make.py | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) diff --git a/make.py b/make.py index 62a2c8a0..38dbdfdd 100644 --- a/make.py +++ b/make.py @@ -30,7 +30,7 @@ def find_7zip_executable() -> str: possible_program_files = [ Path(r"C:\Program Files"), Path(r"C:\Program Files (x86)"), - Path(sys.prefix).parent / "t" , + Path(sys.prefix).parent / "t", ] for base_dir in possible_program_files: if (executable_path := base_dir / "7-Zip" / "7z.exe").is_file(): @@ -291,13 +291,6 @@ def pre_path_entries(self) -> list[str]: r".." + self.NODEJS_RELATIVE_PATH, ] - @property - def documentation_directories_list(self) -> list[Path]: - """Returns the list of documentation directories to include.""" - if (default_docs_directory := Path(__file__).parent / "docs").is_dir(): - return [default_docs_directory] + self.documentation_directories - return self.documentation_directories - def create_installer_7zip(self, installer_type: str = ".exe"): """Creates a WinPython installer using 7-Zip: ".exe", ".7z", ".zip")""" self._print_action(f"Creating WinPython installer ({installer_type})") @@ -347,7 +340,7 @@ def _copy_essential_files(self): docs_target_directory = self.winpython_directory / "notebooks" / "docs" self._print_action(f"Copying documentation to {docs_target_directory}") - _copy_items(self.documentation_directories_list, docs_target_directory, self.verbose) + _copy_items(self.documentation_directories, docs_target_directory, self.verbose) tools_target_directory = self.winpython_directory / "t" self._print_action(f"Copying tools to {tools_target_directory}") From 1d31d51914fbd238b85f5095dd36ebc7f9d46e13 Mon Sep 17 00:00:00 2001 From: stonebig Date: Sun, 23 Mar 2025 14:43:13 +0100 Subject: [PATCH 117/305] simplify --- make.py | 102 +++++++++++++++++++++----------------------------------- 1 file changed, 38 insertions(+), 64 deletions(-) diff --git a/make.py b/make.py index 38dbdfdd..f0b5f2c2 100644 --- a/make.py +++ b/make.py @@ -127,19 +127,9 @@ class WinPythonDistributionBuilder: NODEJS_RELATIVE_PATH = r"\n" # Relative path within WinPython dir - def __init__( - self, - build_number: int, - release_level: str, - target_directory: Path, - wheels_directory: Path, - tools_directories: list[Path] = None, - documentation_directories: list[Path] = None, - verbose: bool = False, - base_directory: Path = None, - install_options: list[str] = None, - flavor: str = "", - ): + def __init__(self, build_number: int, release_level: str, target_directory: Path, wheels_directory: Path, + tools_directories: list[Path] = None, documentation_directories: list[Path] = None, verbose: bool = False, + base_directory: Path = None, install_options: list[str] = None, flavor: str = ""): """ Initializes the WinPythonDistributionBuilder. @@ -269,7 +259,7 @@ def python_executable_directory(self) -> str: if python_path_directory and python_path_directory.is_dir(): return str(python_path_directory) else: - python_path_executable = self.winpython_directory / self.python_name if self.winpython_directory else None # Fallback for older structure + python_path_executable = self.winpython_directory / self.python_name if self.winpython_directory else None return str(python_path_executable) if python_path_executable else "" @property @@ -321,15 +311,12 @@ def _print_action(self, text: str): def _extract_python_archive(self): """Extracts the Python zip archive to create the base Python environment.""" self._print_action("Extracting Python archive") - utils.extract_archive( - str(self.python_zip_file), - targetdir=str(self.winpython_directory), # Extract directly to winpython_directory - ) + utils.extract_archive(self.python_zip_file, self.winpython_directory) # Relocate to /python subfolder if needed (for newer structure) #2024-12-22 to /python expected_python_directory = self.winpython_directory / self.python_directory_name if self.python_directory_name != self.python_name and not expected_python_directory.is_dir(): os.rename(self.winpython_directory / self.python_name, expected_python_directory) - + def _copy_essential_files(self): """Copies pre-made objects""" self._print_action("Copying default scripts") @@ -347,11 +334,9 @@ def _copy_essential_files(self): _copy_items(self.tools_directories, tools_target_directory, self.verbose) # Special handling for Node.js to move it up one level - nodejs_current_directory = tools_target_directory / "n" - nodejs_target_directory = self.winpython_directory / self.NODEJS_RELATIVE_PATH - if nodejs_current_directory != nodejs_target_directory and nodejs_current_directory.is_dir(): + if (nodejs_current_directory := tools_target_directory / "n").is_dir(): try: - shutil.move(nodejs_current_directory, nodejs_target_directory) + shutil.move(nodejs_current_directory, self.winpython_directory / self.NODEJS_RELATIVE_PATH) except Exception as e: print(f"Error moving Node.js directory: {e}") @@ -380,14 +365,13 @@ def _create_initial_batch_scripts(self): def build(self, rebuild: bool = True, requirements_files_list=None, winpy_dirname: str = None): """Make or finalise WinPython distribution in the target directory""" - - python_zip_filename = self.python_zip_file.name - print(f"Building WinPython with Python archive: {python_zip_filename}") + print(f"Building WinPython with Python archive: {self.python_zip_file.name}") if winpy_dirname is None: raise RuntimeError("WinPython base directory to create is undefined") else: self.winpython_directory = self.target_directory / winpy_dirname # Create/re-create the WinPython base directory + if rebuild: self._print_action(f"Creating WinPython {self.winpython_directory} base directory") if self.winpython_directory.is_dir(): @@ -448,37 +432,32 @@ def rebuild_winpython_package(source_directory: Path, target_directory: Path, ar utils.buildflit_wininst(source_directory, copy_to=target_directory, verbose=verbose) -def make_all( - build_number: int, - release_level: str, - pyver: str, - architecture: int, - basedir: Path, - verbose: bool = False, - rebuild: bool = True, - create_installer: str = "True", - install_options=["--no-index"], - flavor: str = "", - requirements: str | list[Path] = None, - find_links: str | list[Path] = None, - source_dirs: Path = None, - toolsdirs: str | list[Path] = None, - docsdirs: str | list[Path] = None, - python_target_release: str = None, # e.g. "37101" for 3.7.10 +def make_all(build_number: int, release_level: str, pyver: str, architecture: int, basedir: Path, + verbose: bool = False, rebuild: bool = True, create_installer: str = "True", install_options=["--no-index"], + flavor: str = "", requirements: str | list[Path] = None, find_links: str | list[Path] = None, + source_dirs: Path = None, toolsdirs: str | list[Path] = None, docsdirs: str | list[Path] = None, + python_target_release: str = None, # e.g. "37101" for 3.7.10 ): - """Make a WinPython distribution for a given set of parameters: - `build_number`: build number [int] - `release_level`: release level (e.g. 'beta1', '') [str] - `pyver`: python version ('3.4' or 3.5') - `architecture`: [int] (32 or 64) - `basedir`: where to create the build (r'D:\Winpython\basedir34') - `requirements`: package lists for pip (r'D:\requirements.txt') - `install_options`: pip options (r'--no-index --pre --trusted-host=None') - `find_links`: package directories (r'D:\Winpython\packages.srcreq') - `source_dirs`: the python.zip + rebuilt winpython wheel package directory - `toolsdirs`: r'D:\WinPython\basedir34\t.Slim' - `docsdirs`: r'D:\WinPython\basedir34\docs.Slim'""" - + """ + Make a WinPython distribution for a given set of parameters: + Args: + build_number: build number [int] + release_level: release level (e.g. 'beta1', '') [str] + pyver: python version ('3.4' or 3.5') + architecture: [int] (32 or 64) + basedir: where to create the build (r'D:\Winpython\basedir34') + verbose: Enable verbose output (bool). + rebuild: Whether to rebuild the distribution (bool). + create_installer: Type of installer to create (str). + install_options: pip options (r'--no-index --pre --trusted-host=None') + flavor: WinPython flavor (str). + requirements: package lists for pip (r'D:\requirements.txt') + find_links: package directories (r'D:\Winpython\packages.srcreq') + source_dirs: the python.zip + rebuilt winpython wheel package directory + toolsdirs: Directory with development tools r'D:\WinPython\basedir34\t.Slim' + docsdirs: Directory with documentation r'D:\WinPython\basedir34\docs.Slim' + python_target_release: Target Python release (str). + """ assert basedir is not None, "The *basedir* directory must be specified" assert architecture in (32, 64) @@ -492,7 +471,6 @@ def make_all( build_directory = str(Path(basedir) / ("bu" + flavor)) if rebuild: - # Rebuild Winpython Wheel Package utils.print_box(f"Making WinPython {architecture}bits at {Path(basedir) / ('bu' + flavor)}") os.makedirs(Path(build_directory), exist_ok=True) # use source_dirs as the directory to re-build Winpython wheel @@ -500,16 +478,12 @@ def make_all( rebuild_winpython_package(winpython_source_dir, source_dirs, architecture, verbose) builder = WinPythonDistributionBuilder( - build_number, - release_level, - build_directory, - wheels_directory=source_dirs, + build_number, release_level, build_directory, wheels_directory=source_dirs, tools_directories=[Path(d) for d in tools_dirs_list], documentation_directories=[Path(d) for d in docs_dirs_list], - verbose=verbose, - base_directory=basedir, + verbose=verbose, base_directory=basedir, install_options=install_options_list + find_links_options, - flavor=flavor, + flavor=flavor ) # define the directory where to create the distro python_minor_version_str = "".join(builder.python_name.replace(".amd64", "").split(".")[-2:-1]) From 1c3f4636a32f15dde0df8e4c8a16fcaa92ab158b Mon Sep 17 00:00:00 2001 From: stonebig Date: Sun, 23 Mar 2025 17:53:12 +0100 Subject: [PATCH 118/305] bug fix and simplify --- make.py | 95 +++++++++++++++++++++------------------------------------ 1 file changed, 35 insertions(+), 60 deletions(-) diff --git a/make.py b/make.py index f0b5f2c2..1a02006b 100644 --- a/make.py +++ b/make.py @@ -2,7 +2,7 @@ # # WinPython build script # Copyright © 2012 Pierre Raybaut -# Copyright © 2014-2024+  The Winpython development team https://github.com/winpython/ +# Copyright © 2014-2025+ The Winpython development team https://github.com/winpython/ # Licensed under the terms of the MIT License # (see winpython/__init__.py for details) @@ -12,9 +12,8 @@ import subprocess import sys from pathlib import Path - from winpython import wppm, utils -# Local imports +# Local import import diff # Define constant paths for clarity @@ -27,33 +26,23 @@ def find_7zip_executable() -> str: """Locates the 7-Zip executable (7z.exe).""" - possible_program_files = [ - Path(r"C:\Program Files"), - Path(r"C:\Program Files (x86)"), - Path(sys.prefix).parent / "t", - ] + possible_program_files = [r"C:\Program Files", r"C:\Program Files (x86)", Path(sys.prefix).parent / "t"] for base_dir in possible_program_files: - if (executable_path := base_dir / "7-Zip" / "7z.exe").is_file(): + if (executable_path := Path(base_dir) / "7-Zip" / "7z.exe").is_file(): return str(executable_path) raise RuntimeError("7ZIP is not installed on this computer.") def replace_lines_in_file(filepath: Path, replacements: list[tuple[str, str]]): """ Replaces lines in a file that start with a given prefix. - Args: filepath: Path to the file to modify. replacements: A list of tuples, where each tuple contains: - The prefix of the line to replace (str). - The new text for the line (str). """ - try: - with open(filepath, "r") as f: - lines = f.readlines() - except FileNotFoundError: - print(f"Error: File not found: {filepath}") - return - + with open(filepath, "r") as f: + lines = f.readlines() updated_lines = lines.copy() # Create a mutable copy of lines for index, line in enumerate(lines): @@ -62,12 +51,9 @@ def replace_lines_in_file(filepath: Path, replacements: list[tuple[str, str]]): if line.startswith(start_prefix + "="): updated_lines[index] = f"{start_prefix}={new_text}\n" - try: - with open(filepath, "w") as f: + with open(filepath, "w") as f: f.writelines(updated_lines) - print(f"Updated 7-zip script: {filepath}") - except Exception as e: - print(f"Error writing to file {filepath}: {e}") + print(f"Updated 7-zip script: {filepath}") def build_installer_7zip(script_template_path: Path, output_script_path: Path, replacements: list[tuple[str, str]]): """ @@ -96,7 +82,7 @@ def build_installer_7zip(script_template_path: Path, output_script_path: Path, r except subprocess.CalledProcessError as e: print(f"Error executing 7-Zip script: {e}", file=sys.stderr) -def _copy_items(source_directories: list[Path], target_directory: Path, verbose: bool = False): +def copy_items(source_directories: list[Path], target_directory: Path, verbose: bool = False): """Copies items from source directories to the target directory.""" target_directory.mkdir(parents=True, exist_ok=True) for source_dir in source_directories: @@ -114,7 +100,7 @@ def _copy_items(source_directories: list[Path], target_directory: Path, verbose: except Exception as e: print(f"Error copying {source_item} to {target_item}: {e}") -def _parse_list_argument(argument_value: str | list[str], separator=" ") -> list[str]: +def parse_list_argument(argument_value: str | list[str], separator=" ") -> list[str]: """Parse a separated list argument into a list of strings.""" if argument_value is None: return [] @@ -125,7 +111,7 @@ def _parse_list_argument(argument_value: str | list[str], separator=" ") -> list class WinPythonDistributionBuilder: """Builds a WinPython distribution.""" - NODEJS_RELATIVE_PATH = r"\n" # Relative path within WinPython dir + NODEJS_RELATIVE_PATH = "n" # Relative path within WinPython dir def __init__(self, build_number: int, release_level: str, target_directory: Path, wheels_directory: Path, tools_directories: list[Path] = None, documentation_directories: list[Path] = None, verbose: bool = False, @@ -205,20 +191,16 @@ def get_tool_path(relative_path): path = self.winpython_directory / relative_path if self.winpython_directory else None return path if path and (path.is_file() or path.is_dir()) else None - nodejs_path = get_tool_path(self.NODEJS_RELATIVE_PATH) - if nodejs_path: - node_version = utils.get_nodejs_version(str(nodejs_path)) - installed_tools.append(("Nodejs", node_version)) - npm_version = utils.get_npmjs_version(str(nodejs_path)) - installed_tools.append(("npmjs", npm_version)) - - pandoc_executable = get_tool_path(r"\t\pandoc.exe") - if pandoc_executable: + if nodejs_path := get_tool_path(self.NODEJS_RELATIVE_PATH): + node_version = utils.get_nodejs_version(nodejs_path) + npm_version = utils.get_npmjs_version(nodejs_path) + installed_tools += [("Nodejs", node_version), ("npmjs", npm_version)] + + if pandoc_executable := get_tool_path("t/pandoc.exe"): pandoc_version = utils.get_pandoc_version(str(pandoc_executable.parent)) installed_tools.append(("Pandoc", pandoc_version)) - - vscode_executable = get_tool_path(r"\t\VSCode\Code.exe") - if vscode_executable: + + if vscode_executable := get_tool_path("t/VSCode/Code.exe"): vscode_version = utils.getFileProperties(str(vscode_executable))["FileVersion"] installed_tools.append(("VSCode", vscode_version)) @@ -278,7 +260,7 @@ def pre_path_entries(self) -> list[str]: "DLLs", "Scripts", r"..\t", - r".." + self.NODEJS_RELATIVE_PATH, + "..\\" + self.NODEJS_RELATIVE_PATH, ] def create_installer_7zip(self, installer_type: str = ".exe"): @@ -320,23 +302,23 @@ def _extract_python_archive(self): def _copy_essential_files(self): """Copies pre-made objects""" self._print_action("Copying default scripts") - _copy_items([PORTABLE_DIRECTORY / "scripts"], self.winpython_directory / "scripts", self.verbose) + copy_items([PORTABLE_DIRECTORY / "scripts"], self.winpython_directory / "scripts", self.verbose) self._print_action("Copying launchers") - _copy_items([PORTABLE_DIRECTORY / "launchers_final"], self.winpython_directory, self.verbose) + copy_items([PORTABLE_DIRECTORY / "launchers_final"], self.winpython_directory, self.verbose) docs_target_directory = self.winpython_directory / "notebooks" / "docs" self._print_action(f"Copying documentation to {docs_target_directory}") - _copy_items(self.documentation_directories, docs_target_directory, self.verbose) + copy_items(self.documentation_directories, docs_target_directory, self.verbose) tools_target_directory = self.winpython_directory / "t" self._print_action(f"Copying tools to {tools_target_directory}") - _copy_items(self.tools_directories, tools_target_directory, self.verbose) + copy_items(self.tools_directories, tools_target_directory, self.verbose) - # Special handling for Node.js to move it up one level if (nodejs_current_directory := tools_target_directory / "n").is_dir(): + self._print_action(f"moving tools from {nodejs_current_directory} to {tools_target_directory.parent / self.NODEJS_RELATIVE_PATH} ") try: - shutil.move(nodejs_current_directory, self.winpython_directory / self.NODEJS_RELATIVE_PATH) + shutil.move(nodejs_current_directory, tools_target_directory.parent / self.NODEJS_RELATIVE_PATH) except Exception as e: print(f"Error moving Node.js directory: {e}") @@ -366,7 +348,6 @@ def _create_initial_batch_scripts(self): def build(self, rebuild: bool = True, requirements_files_list=None, winpy_dirname: str = None): """Make or finalise WinPython distribution in the target directory""" print(f"Building WinPython with Python archive: {self.python_zip_file.name}") - if winpy_dirname is None: raise RuntimeError("WinPython base directory to create is undefined") else: @@ -392,7 +373,6 @@ def build(self, rebuild: bool = True, requirements_files_list=None, winpy_dirnam utils.python_execmodule("ensurepip", self.distribution.target) self.distribution.patch_standard_packages("pip") - # Upgrade essential packages essential_packages = ["pip", "setuptools", "wheel", "winpython"] for package_name in essential_packages: actions = ["install", "--upgrade", "--pre", package_name] + self.install_options @@ -405,25 +385,22 @@ def build(self, rebuild: bool = True, requirements_files_list=None, winpy_dirnam actions = ["install", "-r", req] if self.install_options is not None: actions += self.install_options - self._print_action(f"piping {' '.join(actions)}") + self._print_action(f"Piping: {' '.join(actions)}") self.distribution.do_pip_action(actions) self.distribution.patch_standard_packages() self._print_action("Cleaning up distribution") self.distribution.clean_up() # still usefull ? - # Writing package index self._print_action("Writing package index") - # winpyver2 = the version without build part but with self.distribution.architecture self.winpyver2 = f"{self.python_full_version}.{self.build_number}" output_markdown_filename = str(self.winpython_directory.parent / f"WinPython{self.flavor}-{self.distribution.architecture}bit-{self.winpyver2}.md") - open(output_markdown_filename, "w", encoding='utf-8').write(self.package_index_markdown) + with open(output_markdown_filename, "w", encoding='utf-8') as f: + f.write(self.package_index_markdown) - # Writing changelog self._print_action("Writing changelog") shutil.copyfile(output_markdown_filename, str(Path(CHANGELOGS_DIRECTORY) / Path(output_markdown_filename).name)) diff.write_changelog(self.winpyver2, None, self.base_directory, self.flavor, self.distribution.architecture) - def rebuild_winpython_package(source_directory: Path, target_directory: Path, architecture: int = 64, verbose: bool = False): """Rebuilds the winpython package from source using flit.""" for filename in os.listdir(target_directory): @@ -431,7 +408,6 @@ def rebuild_winpython_package(source_directory: Path, target_directory: Path, ar os.remove(Path(target_directory) / filename) utils.buildflit_wininst(source_directory, copy_to=target_directory, verbose=verbose) - def make_all(build_number: int, release_level: str, pyver: str, architecture: int, basedir: Path, verbose: bool = False, rebuild: bool = True, create_installer: str = "True", install_options=["--no-index"], flavor: str = "", requirements: str | list[Path] = None, find_links: str | list[Path] = None, @@ -461,18 +437,17 @@ def make_all(build_number: int, release_level: str, pyver: str, architecture: in assert basedir is not None, "The *basedir* directory must be specified" assert architecture in (32, 64) - # Parse list arguments - tools_dirs_list = _parse_list_argument(toolsdirs, ",") - docs_dirs_list = _parse_list_argument(docsdirs, ",") - install_options_list = _parse_list_argument(install_options, " ") - find_links_dirs_list = _parse_list_argument(find_links, ",") - requirements_files_list = [Path(f) for f in _parse_list_argument(requirements, ",") if f] # ensure Path objects + tools_dirs_list = parse_list_argument(toolsdirs, ",") + docs_dirs_list = parse_list_argument(docsdirs, ",") + install_options_list = parse_list_argument(install_options, " ") + find_links_dirs_list = parse_list_argument(find_links, ",") + requirements_files_list = [Path(f) for f in parse_list_argument(requirements, ",") if f] find_links_options = [f"--find-links={link}" for link in find_links_dirs_list + [source_dirs]] build_directory = str(Path(basedir) / ("bu" + flavor)) if rebuild: utils.print_box(f"Making WinPython {architecture}bits at {Path(basedir) / ('bu' + flavor)}") - os.makedirs(Path(build_directory), exist_ok=True) + os.makedirs(Path(build_directory), exist_ok=True) # use source_dirs as the directory to re-build Winpython wheel winpython_source_dir = Path(__file__).resolve().parent rebuild_winpython_package(winpython_source_dir, source_dirs, architecture, verbose) From d6551e9e6bef18c5b956c98e562a6cea95f9c33c Mon Sep 17 00:00:00 2001 From: stonebig Date: Sun, 23 Mar 2025 23:30:21 +0100 Subject: [PATCH 119/305] modernise to Pathlib --- make.py | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/make.py b/make.py index 1a02006b..dd43d4bc 100644 --- a/make.py +++ b/make.py @@ -89,9 +89,8 @@ def copy_items(source_directories: list[Path], target_directory: Path, verbose: if not source_dir.is_dir(): print(f"Warning: Source directory not found: {source_dir}") continue - for item_name in os.listdir(source_dir): - source_item = source_dir / item_name - target_item = target_directory / item_name + for source_item in source_dir.iterdir(): + target_item = target_directory / source_item.name copy_function = shutil.copytree if source_item.is_dir() else shutil.copy2 try: copy_function(source_item, target_item) @@ -149,9 +148,9 @@ def __init__(self, build_number: int, release_level: str, target_directory: Path def _get_python_zip_file(self) -> Path: """Finds the Python .zip file in the wheels directory.""" - for filename in os.listdir(self.wheels_directory): - if re.match("(pypy3|python-)([0-9]|[a-zA-Z]|.)*.zip", filename): - return self.wheels_directory / filename + for source_item in self.wheels_directory.iterdir(): + if re.match("(pypy3|python-)([0-9]|[a-zA-Z]|.)*.zip", source_item.name): + return source_item raise RuntimeError(f"Could not find Python zip package in {self.wheels_directory}") @property From 412e1df9f361347457fcb99f939583fd9c67815b Mon Sep 17 00:00:00 2001 From: stonebig Date: Tue, 25 Mar 2025 23:16:51 +0100 Subject: [PATCH 120/305] small tweak --- make.py | 26 ++++++++++++-------------- 1 file changed, 12 insertions(+), 14 deletions(-) diff --git a/make.py b/make.py index dd43d4bc..d4bb85f0 100644 --- a/make.py +++ b/make.py @@ -47,9 +47,9 @@ def replace_lines_in_file(filepath: Path, replacements: list[tuple[str, str]]): for index, line in enumerate(lines): for prefix, new_text in replacements: - start_prefix = "set " + prefix if not prefix.startswith("!") else prefix - if line.startswith(start_prefix + "="): - updated_lines[index] = f"{start_prefix}={new_text}\n" + start_prefix = f"set {prefix}=" if not prefix.startswith("!") else prefix + if line.startswith(start_prefix): + updated_lines[index] = f"{start_prefix}{new_text}\n" with open(filepath, "w") as f: f.writelines(updated_lines) @@ -148,9 +148,9 @@ def __init__(self, build_number: int, release_level: str, target_directory: Path def _get_python_zip_file(self) -> Path: """Finds the Python .zip file in the wheels directory.""" - for source_item in self.wheels_directory.iterdir(): + for source_item in self.wheels_directory.iterdir(): if re.match("(pypy3|python-)([0-9]|[a-zA-Z]|.)*.zip", source_item.name): - return source_item + return source_item raise RuntimeError(f"Could not find Python zip package in {self.wheels_directory}") @property @@ -190,15 +190,15 @@ def get_tool_path(relative_path): path = self.winpython_directory / relative_path if self.winpython_directory else None return path if path and (path.is_file() or path.is_dir()) else None - if nodejs_path := get_tool_path(self.NODEJS_RELATIVE_PATH): + if nodejs_path := get_tool_path(self.NODEJS_RELATIVE_PATH): node_version = utils.get_nodejs_version(nodejs_path) npm_version = utils.get_npmjs_version(nodejs_path) installed_tools += [("Nodejs", node_version), ("npmjs", npm_version)] - + if pandoc_executable := get_tool_path("t/pandoc.exe"): pandoc_version = utils.get_pandoc_version(str(pandoc_executable.parent)) installed_tools.append(("Pandoc", pandoc_version)) - + if vscode_executable := get_tool_path("t/VSCode/Code.exe"): vscode_version = utils.getFileProperties(str(vscode_executable))["FileVersion"] installed_tools.append(("VSCode", vscode_version)) @@ -239,9 +239,8 @@ def python_executable_directory(self) -> str: python_path_directory = self.winpython_directory / self.python_directory_name if self.winpython_directory else None if python_path_directory and python_path_directory.is_dir(): return str(python_path_directory) - else: - python_path_executable = self.winpython_directory / self.python_name if self.winpython_directory else None - return str(python_path_executable) if python_path_executable else "" + python_path_executable = self.winpython_directory / self.python_name if self.winpython_directory else None + return str(python_path_executable) if python_path_executable else "" @property def architecture_bits(self) -> int: @@ -259,7 +258,7 @@ def pre_path_entries(self) -> list[str]: "DLLs", "Scripts", r"..\t", - "..\\" + self.NODEJS_RELATIVE_PATH, + rf"..\{self.NODEJS_RELATIVE_PATH}", ] def create_installer_7zip(self, installer_type: str = ".exe"): @@ -349,8 +348,7 @@ def build(self, rebuild: bool = True, requirements_files_list=None, winpy_dirnam print(f"Building WinPython with Python archive: {self.python_zip_file.name}") if winpy_dirname is None: raise RuntimeError("WinPython base directory to create is undefined") - else: - self.winpython_directory = self.target_directory / winpy_dirname # Create/re-create the WinPython base directory + self.winpython_directory = self.target_directory / winpy_dirname if rebuild: self._print_action(f"Creating WinPython {self.winpython_directory} base directory") From cbd5539033997b997ef2758431daa30227879550 Mon Sep 17 00:00:00 2001 From: stonebig Date: Sun, 30 Mar 2025 16:51:18 +0200 Subject: [PATCH 121/305] make scripts\scripts programs no more dynamically created --- make.py | 30 +++--------------------- portable/scripts/WinPython_PS_Prompt.ps1 | 21 +++++++++++++---- portable/scripts/env.bat | 15 ++++++++---- winpython/__init__.py | 4 ++-- 4 files changed, 33 insertions(+), 37 deletions(-) diff --git a/make.py b/make.py index d4bb85f0..75ea991b 100644 --- a/make.py +++ b/make.py @@ -249,18 +249,6 @@ def architecture_bits(self) -> int: return self.distribution.architecture return 64 - @property - def pre_path_entries(self) -> list[str]: - """Returns a list of PATH entries to prepend to the environment.""" - return [ - r"Lib\site-packages\PyQt5", - "", # Python root directory - "DLLs", - "Scripts", - r"..\t", - rf"..\{self.NODEJS_RELATIVE_PATH}", - ] - def create_installer_7zip(self, installer_type: str = ".exe"): """Creates a WinPython installer using 7-Zip: ".exe", ".7z", ".zip")""" self._print_action(f"Creating WinPython installer ({installer_type})") @@ -324,24 +312,12 @@ def _create_initial_batch_scripts(self): """Creates initial batch scripts, including environment setup.""" self._print_action("Creating initial batch scripts") - path_entries_string = ";".join([rf"%WINPYDIR%\{path}" for path in self.pre_path_entries]) - full_path_environment_variable = f"{path_entries_string};%PATH%" - - path_entries_powershell_string = ";".join([rf"$env:WINPYDIR\\{path}" for path in self.pre_path_entries]) - full_path_powershell_environment_variable = f"{path_entries_powershell_string};$env:path" - # Replacements for batch scripts (PyPy compatibility) executable_name = self.distribution.short_exe if self.distribution else "python.exe" # default to python.exe if distribution is not yet set - destination = self.winpython_directory / "scripts" - for script_name in ('env.bat', 'WinPython_PS_Prompt.ps1'): - destination_script_path = str(destination / script_name) - print('destination_script_path:', destination_script_path) - utils.patch_sourcefile(destination_script_path, 'python.exe', executable_name) - utils.patch_sourcefile(destination_script_path, '{self.python_dir_name}', self.python_directory_name) - utils.patch_sourcefile(destination_script_path, '{self.winpython_version_name}', self.winpython_version_name) - utils.patch_sourcefile(destination_script_path, '{full_path_env_var}', full_path_environment_variable) - utils.patch_sourcefile(destination_script_path, '{full_path_ps_env_var}', full_path_powershell_environment_variable) + init_variables = [('WINPYthon_exe', executable_name), ('WINPYthon_subdirectory_name', self.python_directory_name), ('WINPYVER', self.winpython_version_name)] + with open(self.winpython_directory / "scripts" / "env.ini", "w") as f: + f.writelines([f'{a}={b}\n' for a , b in init_variables]) def build(self, rebuild: bool = True, requirements_files_list=None, winpy_dirname: str = None): """Make or finalise WinPython distribution in the target directory""" diff --git a/portable/scripts/WinPython_PS_Prompt.ps1 b/portable/scripts/WinPython_PS_Prompt.ps1 index c2f148b5..ecd2d6aa 100644 --- a/portable/scripts/WinPython_PS_Prompt.ps1 +++ b/portable/scripts/WinPython_PS_Prompt.ps1 @@ -1,6 +1,18 @@ ### WinPython_PS_Prompt.ps1 ### $0 = $myInvocation.MyCommand.Definition $dp0 = [System.IO.Path]::GetDirectoryName($0) + +# default if env.cfg fails +$env:WINPYthon_subdirectory_name = "python" +$env:WINPYthon_exe = "python.exe" +# Define the path to the config file +Get-Content (${PSScriptRoot} +"\env.ini") | ForEach-Object { + $parts = $_ -split '=', 2 + if ($parts.Count -eq 2) { + Set-Variable -Name ($parts[0]).Trim() -Value $parts[1].Trim() -Scope Global + } +} + # $env:PYTHONUTF8 = 1 would create issues in "movable" patching $env:WINPYDIRBASE = "$dp0\.." # get a normalize path @@ -9,12 +21,12 @@ $env:WINPYDIRBASE = [System.IO.Path]::GetFullPath( $env:WINPYDIRBASE ) # avoid double_init (will only resize screen) if (-not ($env:WINPYDIR -eq [System.IO.Path]::GetFullPath( $env:WINPYDIRBASE+"\{self.python_dir_name}")) ) { -$env:WINPYDIR = $env:WINPYDIRBASE+"\{self.python_dir_name}" +$env:WINPYDIR = $env:WINPYDIRBASE+ "\" +$env:WINPYthon_subdirectory_name # 2019-08-25 pyjulia needs absolutely a variable PYTHON=%WINPYDIR%python.exe -$env:PYTHON = "%WINPYDIR%\python.exe" +$env:PYTHON = $env:WINPYthon_exe $env:PYTHONPATHz = "%WINPYDIR%;%WINPYDIR%\Lib;%WINPYDIR%\DLLs" -$env:WINPYVER = '{self.winpython_version_name}' +$env:WINPYVER = $env:WINPYVER # rem 2023-02-12 try utf-8 on console # rem see https://github.com/pypa/pip/issues/11798#issuecomment-1427069681 $env:PYTHONIOENCODING = "utf-8" @@ -28,7 +40,8 @@ $env:WINPYDIRBASE = "" $env:JUPYTER_DATA_DIR = "$env:HOME" if (-not $env:PATH.ToLower().Contains(";"+ $env:WINPYDIR.ToLower()+ ";")) { - $env:PATH = "{full_path_ps_env_var}" } + $env:PATH = "$env:WINPYDIR\\Lib\site-packages\PyQt5;$env:WINPYDIR\\;$env:WINPYDIR\\DLLs;$env:WINPYDIR\\Scripts;$env:WINPYDIR\\..\t;$env:WINPYDIR\\..\n;$env:path" } + #rem force default pyqt5 kit for Spyder if PyQt5 module is there if (Test-Path "$env:WINPYDIR\Lib\site-packages\PyQt5\__init__.py") { $env:QT_API = "pyqt5" } diff --git a/portable/scripts/env.bat b/portable/scripts/env.bat index dc8aa552..8320dab2 100644 --- a/portable/scripts/env.bat +++ b/portable/scripts/env.bat @@ -1,4 +1,11 @@ @echo off + +rem default if init fails +set WINPYthon_subdirectory_name=python +set WINPYthon_exe=python.exe +rem read init variables +FOR /F "usebackq tokens=1,2 delims==" %%G IN ("%~dp0env.ini") DO (set %%G=%%H) + set WINPYDIRBASE=%~dp0.. rem get a normalized path @@ -9,11 +16,11 @@ if "%WINPYDIRBASE:~-1%"=="\" set WINPYDIRBASE=%WINPYDIRBASE:~0,-1% set WINPYDIRBASETMP= popd -set WINPYDIR=%WINPYDIRBASE%\{self.python_dir_name} +set WINPYDIR=%WINPYDIRBASE%\%WINpython_subdirectory_name% rem 2019-08-25 pyjulia needs absolutely a variable PYTHON=%WINPYDIR%\python.exe -set PYTHON=%WINPYDIR%\python.exe +set PYTHON=%WINPYDIR%\%WINpython_exe% set PYTHONPATHz=%WINPYDIR%;%WINPYDIR%\Lib;%WINPYDIR%\DLLs -set WINPYVER={self.winpython_version_name} +set WINPYVER=%WINPYVER% rem 2023-02-12 utf-8 on console to avoid pip crash rem see https://github.com/pypa/pip/issues/11798#issuecomment-1427069681 @@ -32,7 +39,7 @@ rem Remove all double quotes set PATH_CLEANED=%PATH:"=% echo ";%PATH_CLEANED%;" | %FINDDIR%\find.exe /C /I ";%WINPYDIR%\;" >nul if %ERRORLEVEL% NEQ 0 ( - set "PATH={full_path_env_var}" + set "PATH=%WINPYDIR%\Lib\site-packages\PyQt5;%WINPYDIR%\;%WINPYDIR%\DLLs;%WINPYDIR%\Scripts;%WINPYDIR%\..\t;%WINPYDIR%\..\n;%PATH%" cd . ) set PATH_CLEANED= diff --git a/winpython/__init__.py b/winpython/__init__.py index bc06e9a6..74e6fb08 100644 --- a/winpython/__init__.py +++ b/winpython/__init__.py @@ -4,7 +4,7 @@ ----------------------------------------- Copyright (c) 2012-2013 Pierre Raybaut -Copyright (c) 2014-2024+ The Winpython development team https://github.com/winpython/ +Copyright (c) 2014-2025+ The Winpython development team https://github.com/winpython/ Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation @@ -28,6 +28,6 @@ OTHER DEALINGS IN THE SOFTWARE. """ -__version__ = '14.0.20250321' +__version__ = '15.0.20250330' __license__ = __doc__ __project_url__ = 'http://winpython.github.io/' From 3a9a1e76973176de0e07c8f0b0a55cc7839d839a Mon Sep 17 00:00:00 2001 From: stonebig Date: Sat, 5 Apr 2025 09:58:39 +0200 Subject: [PATCH 122/305] remove unsused utils.patch_sourcelines() --- winpython/utils.py | 58 ---------------------------------------------- 1 file changed, 58 deletions(-) diff --git a/winpython/utils.py b/winpython/utils.py index d1ff43d7..7de5d17c 100644 --- a/winpython/utils.py +++ b/winpython/utils.py @@ -358,7 +358,6 @@ def patch_shebang_line(fname, pad=b" ", to_movable=True, targetdir=""): def patch_shebang_line_py(fname, to_movable=True, targetdir=""): - """Changes shebang line in '.py' file to relative or absolue path""" """Changes shebang line in '.py' file to relative or absolue path""" import fileinput import re @@ -419,63 +418,6 @@ def patch_sourcefile(fname, in_text, out_text, silent_mode=False): fh.write(new_content) -def patch_sourcelines( - fname, - in_line_start, - out_line, - endline="\n", - silent_mode=False, -): - """Replace the middle of lines between in_line_start and endline""" - import io - - if Path(fname).is_file(): - the_encoding = guess_encoding(fname)[0] - with io.open(fname, "r", encoding=the_encoding) as fh: - contents = fh.readlines() - content = "".join(contents) - for l in range(len(contents)): - if contents[l].startswith(in_line_start): - begining, middle = ( - in_line_start, - contents[l][len(in_line_start) :], - ) - ending = "" - if middle.find(endline) > 0: - ending = endline + endline.join(middle.split(endline)[1:]) - middle = middle.split(endline)[0] - middle = out_line - new_line = begining + middle + ending - if not new_line == contents[l]: - if not silent_mode: - print( - "patching ", - fname, - " from\n", - contents[l], - "\nto\n", - new_line, - ) - contents[l] = new_line - new_content = "".join(contents) - if not new_content == content: - # if not silent_mode: - # print("patching ", fname, "from", content, "to", new_content) - - with io.open(fname, "wt", encoding=the_encoding) as fh: - try: - fh.write(new_content) - except: - print( - "impossible to patch", - fname, - "from", - content, - "to", - new_content, - ) - - def _create_temp_dir(): """Create a temporary directory and remove it at exit""" tmpdir = tempfile.mkdtemp(prefix='wppm_') From 1787163ab894dccff863215dd4c8ec46761e3335 Mon Sep 17 00:00:00 2001 From: stonebig Date: Sat, 5 Apr 2025 17:42:48 +0200 Subject: [PATCH 123/305] simplify utils.get_package_metadata and make two parallel build possible --- make.py | 2 +- winpython/__init__.py | 2 +- winpython/utils.py | 30 ++---------------------------- 3 files changed, 4 insertions(+), 30 deletions(-) diff --git a/make.py b/make.py index 75ea991b..7d702a81 100644 --- a/make.py +++ b/make.py @@ -267,7 +267,7 @@ def create_installer_7zip(self, installer_type: str = ".exe"): ("INSTALLER_OPTION", installer_type), ] - build_installer_7zip(PORTABLE_DIRECTORY / template_name, PORTABLE_DIRECTORY / output_name, replacements) + build_installer_7zip(PORTABLE_DIRECTORY / template_name, self.target_directory / output_name, replacements) def _print_action(self, text: str): """Prints an action message with progress indicator.""" diff --git a/winpython/__init__.py b/winpython/__init__.py index 74e6fb08..780c2b5d 100644 --- a/winpython/__init__.py +++ b/winpython/__init__.py @@ -28,6 +28,6 @@ OTHER DEALINGS IN THE SOFTWARE. """ -__version__ = '15.0.20250330' +__version__ = '15.1.20250405' __license__ = __doc__ __project_url__ = 'http://winpython.github.io/' diff --git a/winpython/utils.py b/winpython/utils.py index 7de5d17c..dcfe52f6 100644 --- a/winpython/utils.py +++ b/winpython/utils.py @@ -659,19 +659,12 @@ def normalize(this): """apply https://peps.python.org/pep-0503/#normalized-names""" return re.sub(r"[-_.]+", "-", this).lower() -def get_package_metadata(database, name, update=False, suggested_summary=None): +def get_package_metadata(database, name): """Extract infos (description, url) from the local database""" - # for package.ini safety belt - # Note: we could use the PyPI database but this has been written on - # machine which is not connected to the internet - # we store only normalized names now (PEP 503) DATA_PATH = str(Path(sys.modules['winpython'].__file__).parent /'data') db = cp.ConfigParser() filepath = Path(database) if Path(database).is_absolute() else Path(DATA_PATH) / database - try: - db.read_file(open(str(filepath), encoding = 'utf-8')) - except: - db.read_file(open(str(filepath))) + db.read_file(open(str(filepath), encoding = guess_encoding(filepath)[0])) my_metadata = dict( description="", url="https://pypi.org/project/" + name, @@ -684,26 +677,7 @@ def get_package_metadata(database, name, update=False, suggested_summary=None): break except (cp.NoSectionError, cp.NoOptionError): pass - db_desc = my_metadata.get("description") - if my_metadata.get("description") == "" and suggested_summary: - # nothing in package.ini, we look in our installed packages - try: - my_metadata["description"] = ( - suggested_summary + "\n" - ).splitlines()[0] - except: - pass - - if update == True and db_desc == "" and my_metadata["description"] != "": - # we add new findings in our packgages.ini list, if it's required - try: - db[normalize(name)] = {} - db[normalize(name)]["description"] = my_metadata["description"] - with open(str(Path(DATA_PATH) / database), "w", encoding='UTF-8') as configfile: - db.write(configfile) - except: - pass return my_metadata From 3910176e5cde8fb33c74b19bfcdc4c5ce93e707b Mon Sep 17 00:00:00 2001 From: stonebig Date: Sat, 5 Apr 2025 19:33:54 +0200 Subject: [PATCH 124/305] use a generic utils.replace_in_file() to prepare 7zip scripts --- make.py | 35 +++++------------------------- winpython/utils.py | 54 ++++++++++++++++++++-------------------------- 2 files changed, 28 insertions(+), 61 deletions(-) diff --git a/make.py b/make.py index 7d702a81..0be98caa 100644 --- a/make.py +++ b/make.py @@ -32,29 +32,6 @@ def find_7zip_executable() -> str: return str(executable_path) raise RuntimeError("7ZIP is not installed on this computer.") -def replace_lines_in_file(filepath: Path, replacements: list[tuple[str, str]]): - """ - Replaces lines in a file that start with a given prefix. - Args: - filepath: Path to the file to modify. - replacements: A list of tuples, where each tuple contains: - - The prefix of the line to replace (str). - - The new text for the line (str). - """ - with open(filepath, "r") as f: - lines = f.readlines() - updated_lines = lines.copy() # Create a mutable copy of lines - - for index, line in enumerate(lines): - for prefix, new_text in replacements: - start_prefix = f"set {prefix}=" if not prefix.startswith("!") else prefix - if line.startswith(start_prefix): - updated_lines[index] = f"{start_prefix}{new_text}\n" - - with open(filepath, "w") as f: - f.writelines(updated_lines) - print(f"Updated 7-zip script: {filepath}") - def build_installer_7zip(script_template_path: Path, output_script_path: Path, replacements: list[tuple[str, str]]): """ Creates a 7-Zip installer script by copying a template and applying text replacements. @@ -64,15 +41,13 @@ def build_installer_7zip(script_template_path: Path, output_script_path: Path, r output_script_path: Path to save the generated 7-Zip script. replacements: A list of tuples for text replacements (prefix, new_text). """ - shutil.copy(script_template_path, output_script_path) - # Standard replacements for all 7zip scripts data_to_replace = [ - ("PORTABLE_DIR", str(PORTABLE_DIRECTORY)), - ("SEVENZIP_EXE", find_7zip_executable()), - ] + replacements - - replace_lines_in_file(output_script_path, data_to_replace) + ("PORTABLE_DIR=", f"PORTABLE_DIR={PORTABLE_DIRECTORY}& rem "), + ("SEVENZIP_EXE=", f"SEVENZIP_EXE={find_7zip_executable()}& rem "), + ] + [(f"{a}=", f"{a}={b}& rem ") for a, b in replacements] + + utils.replace_in_file(script_template_path, data_to_replace, output_script_path) try: # Execute the generated 7-Zip script, with stdout=sys.stderr to see 7zip compressing diff --git a/winpython/utils.py b/winpython/utils.py index dcfe52f6..71779d86 100644 --- a/winpython/utils.py +++ b/winpython/utils.py @@ -394,29 +394,31 @@ def guess_encoding(csv_file): except: return [locale.getdefaultlocale()[1], "utf-8"] +def replace_in_file(filepath: Path, replacements: list[tuple[str, str]], filedest: Path = None, verbose=False): + """ + Replaces strings in a file + Args: + filepath: Path to the file to modify. + replacements: A list of tuples of ('old string 'new string') + filedest: optional output file, otherwise will be filepath + """ + the_encoding = guess_encoding(filepath)[0] + with open(filepath, "r", encoding=the_encoding) as f: + content = f.read() + new_content = content + for old_text, new_text in replacements: + new_content = new_content.replace(old_text, new_text) + outfile = filedest if filedest else filepath + if new_content != content or str(outfile) != str(filepath): + with open(outfile, "w", encoding=the_encoding) as f: + f.write(new_content) + if verbose: + print(f"patched {filepath} into {outfile} !") def patch_sourcefile(fname, in_text, out_text, silent_mode=False): """Replace a string in a source file""" - import io - if Path(fname).is_file() and not in_text == out_text: - the_encoding = guess_encoding(fname)[0] - with io.open(fname, 'r', encoding=the_encoding) as fh: - content = fh.read() - new_content = content.replace(in_text, out_text) - if not new_content == content: - if not silent_mode: - print( - "patching ", - fname, - "from", - in_text, - "to", - out_text, - ) - with io.open(fname, 'wt', encoding=the_encoding) as fh: - fh.write(new_content) - + replace_in_file(Path(fname), [(in_text , out_text)], verbose=True) def _create_temp_dir(): """Create a temporary directory and remove it at exit""" @@ -480,8 +482,7 @@ def buildflit_wininst( copy_to=None, verbose=False, ): - """Build Wheel from Python package located in *root* - with flit""" + """Build Wheel from Python package located in *root*with flit""" if python_exe is None: python_exe = sys.executable assert Path(python_exe).is_file() @@ -531,16 +532,7 @@ def buildflit_wininst( dst_fname = str(Path(copy_to) / distname) shutil.move(src_fname, dst_fname) if verbose: - print( - ( - f"Move: {src_fname} --> {dst_fname}" - ) - ) - # remove tempo dir 'root' no more needed - #try: - # shutil.rmtree(root, onexc=onerror) - #except TypeError: # before 3.12 - # shutil.rmtree(root, onerror=onerror) + print(f"Move: {src_fname} --> {dst_fname}") return dst_fname From 634a0c9db6e3552bd8c0dbfe044df98cd5a1ad40 Mon Sep 17 00:00:00 2001 From: stonebig Date: Sun, 6 Apr 2025 09:45:33 +0200 Subject: [PATCH 125/305] simplify utils.py syntax using github copilote of 2025-04-06 --- winpython/utils.py | 111 ++++++++++++++------------------------------- 1 file changed, 35 insertions(+), 76 deletions(-) diff --git a/winpython/utils.py b/winpython/utils.py index 71779d86..3b8bf162 100644 --- a/winpython/utils.py +++ b/winpython/utils.py @@ -413,12 +413,14 @@ def replace_in_file(filepath: Path, replacements: list[tuple[str, str]], filedes with open(outfile, "w", encoding=the_encoding) as f: f.write(new_content) if verbose: - print(f"patched {filepath} into {outfile} !") + print(f"patched from {Path(filepath).name} into {outfile} !") def patch_sourcefile(fname, in_text, out_text, silent_mode=False): """Replace a string in a source file""" + if not silent_mode: + print(f"patching {fname} from {in_text} to {out_text}") if Path(fname).is_file() and not in_text == out_text: - replace_in_file(Path(fname), [(in_text , out_text)], verbose=True) + replace_in_file(Path(fname), [(in_text , out_text)]) def _create_temp_dir(): """Create a temporary directory and remove it at exit""" @@ -429,26 +431,18 @@ def _create_temp_dir(): ) return tmpdir - def extract_archive(fname, targetdir=None, verbose=False): """Extract .zip, .exe (considered to be a zip archive) or .tar.gz archive to a temporary directory (if targetdir is None). Return the temporary directory path""" - if targetdir is None: - targetdir = _create_temp_dir() - else: - try: - Path(targetdir).mkdir(parents=True, exist_ok=True) - except: - pass + targetdir = targetdir or create_temp_dir() + Path(targetdir).mkdir(parents=True, exist_ok=True) if Path(fname).suffix in ('.zip', '.exe'): obj = zipfile.ZipFile(fname, mode="r") elif fname.endswith('.tar.gz'): obj = tarfile.open(fname, mode='r:gz') else: - raise RuntimeError( - f"Unsupported archive filename {fname}" - ) + raise RuntimeError(f"Unsupported archive filename {fname}") obj.extractall(path=targetdir) return targetdir @@ -468,13 +462,11 @@ def extract_archive(fname, targetdir=None, verbose=False): def get_source_package_infos(fname): - """Return a tuple (name, version) of the Python source package""" - if fname[-4:] == '.whl': + """Return a tuple (name, version) of the Python source package.""" + if fname.endswith('.whl'): return Path(fname).name.split("-")[:2] match = re.match(SOURCE_PATTERN, Path(fname).name) - if match is not None: - return match.groups()[:2] - + return match.groups()[:2] if match else None def buildflit_wininst( root, @@ -522,9 +514,8 @@ def buildflit_wininst( if match is not None: break else: - raise RuntimeError( - f"Build failed: not a pure Python package? {distdir}" - ) + raise RuntimeError(f"Build failed: not a pure Python package? {distdir}") + src_fname = str(Path(distdir) / distname) if copy_to is None: return src_fname @@ -583,16 +574,9 @@ def direct_pip_install( return src_fname -def do_script( - this_script, - python_exe=None, - copy_to=None, - verbose=False, - install_options=None, -): - """Execute a script (get-pip typically)""" - if python_exe is None: - python_exe = sys.executable +def do_script(this_script, python_exe=None, copy_to=None, verbose=False, install_options=None): + """Execute a script (get-pip typically).""" + python_exe = python_exe or sys.executable myroot = os.path.dirname(python_exe) # cmd = [python_exe, myroot + r'\Scripts\pip-script.py', 'install'] @@ -618,49 +602,36 @@ def do_script( p.stdout.close() p.stderr.close() if verbose: - print("Executed " , cmd) + print("Executed ", cmd) return 'ok' def columns_width(list_of_lists): - """return the maximum string length of each column of a list of list""" - if not isinstance(list_of_lists, list): - return [0] - - # Transpose the list of lists using zip - transposed_lists = list(zip(*list_of_lists)) - # Calculate the maximum width for each column - column_widths = [max(len(str(item)) for item in sublist) for sublist in transposed_lists] - return column_widths + """Return the maximum string length of each column of a list of lists.""" + if not isinstance(list_of_lists, list): + return [0] + return [max(len(str(item)) for item in sublist) for sublist in zip(*list_of_lists)] def formatted_list(list_of_list, full=False, max_width=70): - """format a list_of_list to fix length columns""" - columns_size = columns_width(list_of_list) - nb_columns = len(columns_size) - - # normalize each columns to columns_size[col] width, in the limit of max_width - - zz = [ - list( - line[col].ljust(columns_size[col])[:max_width] for col in range(nb_columns) - ) - for line in list_of_list - ] - return zz + """Format a list_of_list to fixed length columns.""" + columns_size = columns_width(list_of_list) + columns = range(len(columns_size)) + return [list(line[col].ljust(columns_size[col])[:max_width] for col in columns) for line in list_of_list] def normalize(this): - """apply https://peps.python.org/pep-0503/#normalized-names""" + """Apply PEP 503 normalization to the string.""" return re.sub(r"[-_.]+", "-", this).lower() def get_package_metadata(database, name): - """Extract infos (description, url) from the local database""" - DATA_PATH = str(Path(sys.modules['winpython'].__file__).parent /'data') + """Extract infos (description, url) from the local database.""" + DATA_PATH = str(Path(sys.modules['winpython'].__file__).parent / 'data') db = cp.ConfigParser() filepath = Path(database) if Path(database).is_absolute() else Path(DATA_PATH) / database - db.read_file(open(str(filepath), encoding = guess_encoding(filepath)[0])) - my_metadata = dict( - description="", - url="https://pypi.org/project/" + name, - ) + db.read_file(open(str(filepath), encoding=guess_encoding(filepath)[0])) + + my_metadata = { + "description": "", + "url": f"https://pypi.org/project/{name}", + } for key in my_metadata: # wheel replace '-' per '_' in key for name2 in (name, normalize(name)): @@ -672,23 +643,11 @@ def get_package_metadata(database, name): return my_metadata - if __name__ == '__main__': - print_box("Test") dname = sys.prefix print((dname + ':', '\n', get_python_infos(dname))) - # dname = r'E:\winpython\sandbox\python-2.7.3' - # print dname+':', '\n', get_python_infos(dname) tmpdir = r'D:\Tests\winpython_tests' - Path(tmpdir).mkdir(parents=True, exist_ok=True) - print( - ( - extract_archive( - str(Path(r'D:\WinP\bd37') / 'packages.win-amd64' / - 'python-3.7.3.amd64.zip'), - tmpdir, - ) - ) - ) + Path(tmpdir).mkdir(parents=True, exist_ok=True) + print(extract_archive(str(Path(r'D:\WinP\bd37') / 'packages.win-amd64' / 'python-3.7.3.amd64.zip'), tmpdir)) From f35109ee2460efd3f411b1ec75fade7c5b934d3f Mon Sep 17 00:00:00 2001 From: stonebig Date: Sun, 6 Apr 2025 10:40:31 +0200 Subject: [PATCH 126/305] simplify utils.py syntax using github copilote of 2025-04-06 bis --- winpython/utils.py | 181 +++--------- winpython/utils_o.py | 653 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 692 insertions(+), 142 deletions(-) create mode 100644 winpython/utils_o.py diff --git a/winpython/utils.py b/winpython/utils.py index 3b8bf162..ea05d248 100644 --- a/winpython/utils.py +++ b/winpython/utils.py @@ -26,6 +26,12 @@ import io import winreg +# SOURCE_PATTERN defines what an acceptable source package name is +SOURCE_PATTERN = r'([a-zA-Z0-9\-\_\.]*)-([0-9\.\_]*[a-z]*[\-]?[0-9]*)(\.zip|\.tar\.gz|\-(py[2-7]*|py[2-7]*\.py[2-7]*)\-none\-any\.whl)' + +# WHEELBIN_PATTERN defines what an acceptable binary wheel package is +WHEELBIN_PATTERN = r'([a-zA-Z0-9\-\_\.]*)-([0-9\.\_]*[a-z0-9\+]*[0-9]?)-cp([0-9]*)\-[0-9|c|o|n|e|p|m]*\-(win32|win\_amd64)\.whl' + def get_python_executable(path=None): """Return the path to the Python executable.""" python_path = sys.executable if path is None else path @@ -43,36 +49,24 @@ def get_site_packages_path(path=None): return str(pypy_site_packages if pypy_site_packages.is_dir() else site_packages) def onerror(function, path, excinfo): - """Error handler for `shutil.rmtree`. - - If the error is due to an access error (read-only file), it - attempts to add write permission and then retries. - If the error is for another reason, it re-raises the error. - - Usage: `shutil.rmtree(path, onexc=onerror)""" + """Error handler for `shutil.rmtree`.""" if not os.access(path, os.W_OK): - # Is the error an access error? os.chmod(path, stat.S_IWUSR) function(path) else: raise - def getFileProperties(fname): - """ - Read all properties of the given file return them as a dictionary. - """ - # from https://stackoverflow.com/questions/580924/how-to-access-a-files-properties-on-windows + """Read all properties of the given file return them as a dictionary.""" import win32api - propNames = ('Comments', 'InternalName', 'ProductName', - 'CompanyName', 'LegalCopyright', 'ProductVersion', - 'FileDescription', 'LegalTrademarks', 'PrivateBuild', - 'FileVersion', 'OriginalFilename', 'SpecialBuild') - + propNames = ( + 'Comments', 'InternalName', 'ProductName', 'CompanyName', 'LegalCopyright', + 'ProductVersion', 'FileDescription', 'LegalTrademarks', 'PrivateBuild', + 'FileVersion', 'OriginalFilename', 'SpecialBuild' + ) props = {'FixedFileInfo': None, 'StringFileInfo': None, 'FileVersion': None} try: - # backslash as parm returns dictionary of numeric info corresponding to VS_FIXEDFILEINFO struc fixedInfo = win32api.GetFileVersionInfo(fname, '\\') props['FixedFileInfo'] = fixedInfo props['FileVersion'] = "%d.%d.%d.%d" % (fixedInfo['FileVersionMS'] / 65536, @@ -85,7 +79,6 @@ def getFileProperties(fname): # any other must be of the form \StringfileInfo\%04X%04X\parm_name, middle # two are language/codepage pair returned from above - strInfo = {} for propName in propNames: strInfoPath = u'\\StringFileInfo\\%04X%04X\\%s' % (lang, codepage, propName) @@ -100,9 +93,8 @@ def getFileProperties(fname): def get_special_folder_path(path_name): - """Return special folder path""" + """Return special folder path.""" from win32com.shell import shell, shellcon - for maybe in """ CSIDL_COMMON_STARTMENU CSIDL_STARTMENU CSIDL_COMMON_APPDATA CSIDL_LOCAL_APPDATA CSIDL_APPDATA CSIDL_COMMON_DESKTOPDIRECTORY @@ -111,9 +103,7 @@ def get_special_folder_path(path_name): CSIDL_PROGRAM_FILES CSIDL_FONTS""".split(): if maybe == path_name: csidl = getattr(shellcon, maybe) - return shell.SHGetSpecialFolderPath( - 0, csidl, False - ) + return shell.SHGetSpecialFolderPath(0, csidl, False) raise ValueError( f"{path_name} is an unknown path ID" ) @@ -126,14 +116,9 @@ def get_winpython_start_menu_folder(current=True): folder = get_special_folder_path("CSIDL_PROGRAMS") else: try: - folder = get_special_folder_path( - "CSIDL_COMMON_PROGRAMS" - ) + folder = get_special_folder_path("CSIDL_COMMON_PROGRAMS") except OSError: - # No CSIDL_COMMON_PROGRAMS on this platform - folder = get_special_folder_path( - "CSIDL_PROGRAMS" - ) + folder = get_special_folder_path("CSIDL_PROGRAMS") return str(Path(folder) / 'WinPython') def remove_winpython_start_menu_folder(current=True): @@ -143,47 +128,24 @@ def remove_winpython_start_menu_folder(current=True): try: shutil.rmtree(path, onexc=onerror) except WindowsError: - print( - f"Directory {path} could not be removed", - file=sys.stderr, - ) + print(f"Directory {path} could not be removed", file=sys.stderr) def create_winpython_start_menu_folder(current=True): - """Create WinPython Start menu folder -- remove it if it already exists""" + """Create WinPython Start menu folder.""" path = get_winpython_start_menu_folder(current=current) if Path(path).is_dir(): try: shutil.rmtree(path, onexc=onerror) except WindowsError: - print( - f"Directory {path} could not be removed", - file=sys.stderr, - ) - # create, or re-create ! + print(f"Directory {path} could not be removed", file=sys.stderr) Path(path).mkdir(parents=True, exist_ok=True) return path -def create_shortcut( - path, - description, - filename, - arguments="", - workdir="", - iconpath="", - iconindex=0, - verbose=True, -): - """Create Windows shortcut (.lnk file)""" +def create_shortcut(path, description, filename, arguments="", workdir="", iconpath="", iconindex=0, verbose=True): + """Create Windows shortcut (.lnk file).""" import pythoncom - from win32com.shell import shell - - ilink = pythoncom.CoCreateInstance( - shell.CLSID_ShellLink, - None, - pythoncom.CLSCTX_INPROC_SERVER, - shell.IID_IShellLink, - ) + ilink = pythoncom.CoCreateInstance(shell.CLSID_ShellLink, None, pythoncom.CLSCTX_INPROC_SERVER, shell.IID_IShellLink) ilink.SetPath(path) ilink.SetDescription(description) if arguments: @@ -201,105 +163,64 @@ def create_shortcut( try: ipf.Save(filename, 0) except: - print ("a fail !") - pass - + print("a fail !") def print_box(text): """Print text in a box""" line0 = "+" + ("-" * (len(text) + 2)) + "+" line1 = "| " + text + " |" - print( - ("\n\n" + "\n".join([line0, line1, line0]) + "\n") - ) - + print("\n\n" + "\n".join([line0, line1, line0]) + "\n") def is_python_distribution(path): - """Return True if path is a Python distribution""" - # XXX: This test could be improved but it seems to be sufficient + """Return True if path is a Python distribution.""" has_exec = Path(get_python_executable(path)).is_file() - has_site = Path(get_site_packages_path(path)).is_dir() + has_site = Path(get_site_packages_path(path)).is_dir() return has_exec and has_site - def decode_fs_string(string): """Convert string from file system charset to unicode""" - charset = sys.getfilesystemencoding() - if charset is None: - charset = locale.getpreferredencoding() + charset = sys.getfilesystemencoding() or locale.getpreferredencoding() return string.decode(charset) - def exec_shell_cmd(args, path): - """Execute shell command (*args* is a list of arguments) in *path*""" - # print " ".join(args) - process = subprocess.Popen( - args, - stdout=subprocess.PIPE, - stderr=subprocess.PIPE, - cwd=path, - shell=True - ) + """Execute shell command (*args* is a list of arguments) in *path*.""" + process = subprocess.Popen(args, stdout=subprocess.PIPE, stderr=subprocess.PIPE, cwd=path, shell=True) return decode_fs_string(process.stdout.read()) def exec_run_cmd(args, path=None): - """run a single command (*args* is a list of arguments) in optional *path*""" - # only applicable to Python-3.5+ - # python-3.7+ allows to replace "stdout and stderr ", per "capture_output=True" - if path: - process = subprocess.run(args, - capture_output=True, - cwd=path, text=True) - #return decode_fs_string(process.stdout) - return process.stdout - else: - process = subprocess.run(args, - capture_output=True, - cwd=path, text=True) - #return decode_fs_string(process.stdout) - return process.stdout - + """Run a single command (*args* is a list of arguments) in optional *path*.""" + process = subprocess.run(args, capture_output=True, cwd=path, text=True) + return process.stdout def get_nodejs_version(path): - """Return version of the Nodejs installed in *path*""" + """Return version of the Nodejs installed in *path*.""" return exec_shell_cmd("node -v", path).splitlines()[0] - def get_npmjs_version(path): """Return version of the Nodejs installed in *path*""" return exec_shell_cmd("npm -v", path).splitlines()[0] - def get_pandoc_version(path): """Return version of the Pandoc executable in *path*""" return exec_shell_cmd("pandoc -v", path).splitlines()[0].split(" ")[-1] - def python_query(cmd, path): - """Execute Python command using the Python interpreter located in *path*""" + """Execute Python command using the Python interpreter located in *path*.""" the_exe = get_python_executable(path) - # debug2021-09-12 - # print(f'"{the_exe}" -c "{cmd}"', ' * ', path) - return exec_shell_cmd(f'"{the_exe}" -c "{cmd}"', path).splitlines()[0] - def python_execmodule(cmd, path): - """Execute Python command using the Python interpreter located in *path*""" + """Execute Python command using the Python interpreter located in *path*.""" the_exe = get_python_executable(path) exec_shell_cmd(f'{the_exe} -m {cmd}', path) - def get_python_infos(path): """Return (version, architecture) for the Python distribution located in *path*. The version number is limited to MAJOR.MINOR, the architecture is an integer: 32 or 64""" is_64 = python_query("import sys; print(sys.maxsize > 2**32)", path) arch = {"True": 64, "False": 32}.get(is_64, None) - ver = python_query( - "import sys;print(f'{sys.version_info.major}.{sys.version_info.minor}')", - path, - ) + ver = python_query("import sys;print(f'{sys.version_info.major}.{sys.version_info.minor}')", path) if re.match(r"([0-9]*)\.([0-9]*)", ver) is None: ver = None return ver, arch @@ -446,20 +367,6 @@ def extract_archive(fname, targetdir=None, verbose=False): obj.extractall(path=targetdir) return targetdir -# SOURCE_PATTERN defines what an acceptable source package name is -# As of 2014-09-08 : -# - the wheel package format is accepte in source directory -# - the tricky regexp is tuned also to support the odd jolib naming : -# . joblib-0.8.3_r1-py2.py3-none-any.whl, -# . joblib-0.8.3-r1.tar.gz - -SOURCE_PATTERN = r'([a-zA-Z0-9\-\_\.]*)-([0-9\.\_]*[a-z]*[\-]?[0-9]*)(\.zip|\.tar\.gz|\-(py[2-7]*|py[2-7]*\.py[2-7]*)\-none\-any\.whl)' - -# WHEELBIN_PATTERN defines what an acceptable binary wheel package is -# "cp([0-9]*)" to replace per cp(34) for python3.4 -# "win32|win\_amd64" to replace per "win\_amd64" for 64bit -WHEELBIN_PATTERN = r'([a-zA-Z0-9\-\_\.]*)-([0-9\.\_]*[a-z0-9\+]*[0-9]?)-cp([0-9]*)\-[0-9|c|o|n|e|p|m]*\-(win32|win\_amd64)\.whl' - def get_source_package_infos(fname): """Return a tuple (name, version) of the Python source package.""" @@ -506,12 +413,7 @@ def buildflit_wininst( ) for distname in os.listdir(distdir): - # for wheels (winpython here) - match = re.match(SOURCE_PATTERN, distname) - if match is not None: - break - match = re.match(WHEELBIN_PATTERN, distname) - if match is not None: + if re.match(SOURCE_PATTERN, distname) or re.match(WHEELBIN_PATTERN, distname): break else: raise RuntimeError(f"Build failed: not a pure Python package? {distdir}") @@ -527,12 +429,7 @@ def buildflit_wininst( return dst_fname -def direct_pip_install( - fname, - python_exe=None, - verbose=False, - install_options=None, -): +def direct_pip_install(fname, python_exe=None, verbose=False, install_options=None): """Direct install via python -m pip !""" copy_to = str(Path(fname).parent) diff --git a/winpython/utils_o.py b/winpython/utils_o.py new file mode 100644 index 00000000..f1cc326b --- /dev/null +++ b/winpython/utils_o.py @@ -0,0 +1,653 @@ +# -*- coding: utf-8 -*- +# +# Copyright © 2012 Pierre Raybaut +# Licensed under the terms of the MIT License +# (see winpython/__init__.py for details) + +""" +WinPython utilities + +Created on Tue Aug 14 14:08:40 2012 +""" + +import os +import sys +import stat +import shutil +import locale +import tempfile +import subprocess +import configparser as cp +from pathlib import Path +import re +import tarfile +import zipfile +import atexit +import io +import winreg + +def get_python_executable(path=None): + """Return the path to the Python executable.""" + python_path = sys.executable if path is None else path + base_dir = Path(python_path).parent if not Path(python_path).is_dir() else Path(python_path) + python_exe = base_dir / 'python.exe' + pypy_exe = base_dir / 'pypy3.exe' # For PyPy + return str(python_exe if python_exe.is_file() else pypy_exe) + +def get_site_packages_path(path=None): + """Return the path to the Python site-packages directory.""" + python_path = sys.executable if path is None else path + base_dir = Path(python_path).parent if not Path(python_path).is_dir() else Path(python_path) + site_packages = base_dir / 'Lib' / 'site-packages' + pypy_site_packages = base_dir / 'site-packages' # For PyPy + return str(pypy_site_packages if pypy_site_packages.is_dir() else site_packages) + +def onerror(function, path, excinfo): + """Error handler for `shutil.rmtree`. + + If the error is due to an access error (read-only file), it + attempts to add write permission and then retries. + If the error is for another reason, it re-raises the error. + + Usage: `shutil.rmtree(path, onexc=onerror)""" + if not os.access(path, os.W_OK): + # Is the error an access error? + os.chmod(path, stat.S_IWUSR) + function(path) + else: + raise + + +def getFileProperties(fname): + """ + Read all properties of the given file return them as a dictionary. + """ + # from https://stackoverflow.com/questions/580924/how-to-access-a-files-properties-on-windows + import win32api + propNames = ('Comments', 'InternalName', 'ProductName', + 'CompanyName', 'LegalCopyright', 'ProductVersion', + 'FileDescription', 'LegalTrademarks', 'PrivateBuild', + 'FileVersion', 'OriginalFilename', 'SpecialBuild') + + props = {'FixedFileInfo': None, 'StringFileInfo': None, 'FileVersion': None} + + try: + # backslash as parm returns dictionary of numeric info corresponding to VS_FIXEDFILEINFO struc + fixedInfo = win32api.GetFileVersionInfo(fname, '\\') + props['FixedFileInfo'] = fixedInfo + props['FileVersion'] = "%d.%d.%d.%d" % (fixedInfo['FileVersionMS'] / 65536, + fixedInfo['FileVersionMS'] % 65536, fixedInfo['FileVersionLS'] / 65536, + fixedInfo['FileVersionLS'] % 65536) + + # \VarFileInfo\Translation returns list of available (language, codepage) + # pairs that can be used to retreive string info. We are using only the first pair. + lang, codepage = win32api.GetFileVersionInfo(fname, '\\VarFileInfo\\Translation')[0] + + # any other must be of the form \StringfileInfo\%04X%04X\parm_name, middle + # two are language/codepage pair returned from above + + strInfo = {} + for propName in propNames: + strInfoPath = u'\\StringFileInfo\\%04X%04X\\%s' % (lang, codepage, propName) + ## print str_info + strInfo[propName] = win32api.GetFileVersionInfo(fname, strInfoPath) + + props['StringFileInfo'] = strInfo + except: + pass + + return props + + +def get_special_folder_path(path_name): + """Return special folder path""" + from win32com.shell import shell, shellcon + + for maybe in """ + CSIDL_COMMON_STARTMENU CSIDL_STARTMENU CSIDL_COMMON_APPDATA + CSIDL_LOCAL_APPDATA CSIDL_APPDATA CSIDL_COMMON_DESKTOPDIRECTORY + CSIDL_DESKTOPDIRECTORY CSIDL_COMMON_STARTUP CSIDL_STARTUP + CSIDL_COMMON_PROGRAMS CSIDL_PROGRAMS CSIDL_PROGRAM_FILES_COMMON + CSIDL_PROGRAM_FILES CSIDL_FONTS""".split(): + if maybe == path_name: + csidl = getattr(shellcon, maybe) + return shell.SHGetSpecialFolderPath( + 0, csidl, False + ) + raise ValueError( + f"{path_name} is an unknown path ID" + ) + + +def get_winpython_start_menu_folder(current=True): + """Return WinPython Start menu shortcuts folder""" + if current: + # non-admin install - always goes in this user's start menu. + folder = get_special_folder_path("CSIDL_PROGRAMS") + else: + try: + folder = get_special_folder_path( + "CSIDL_COMMON_PROGRAMS" + ) + except OSError: + # No CSIDL_COMMON_PROGRAMS on this platform + folder = get_special_folder_path( + "CSIDL_PROGRAMS" + ) + return str(Path(folder) / 'WinPython') + +def remove_winpython_start_menu_folder(current=True): + """Remove WinPython Start menu folder -- remove it if it already exists""" + path = get_winpython_start_menu_folder(current=current) + if Path(path).is_dir(): + try: + shutil.rmtree(path, onexc=onerror) + except WindowsError: + print( + f"Directory {path} could not be removed", + file=sys.stderr, + ) + +def create_winpython_start_menu_folder(current=True): + """Create WinPython Start menu folder -- remove it if it already exists""" + path = get_winpython_start_menu_folder(current=current) + if Path(path).is_dir(): + try: + shutil.rmtree(path, onexc=onerror) + except WindowsError: + print( + f"Directory {path} could not be removed", + file=sys.stderr, + ) + # create, or re-create ! + Path(path).mkdir(parents=True, exist_ok=True) + return path + + +def create_shortcut( + path, + description, + filename, + arguments="", + workdir="", + iconpath="", + iconindex=0, + verbose=True, +): + """Create Windows shortcut (.lnk file)""" + import pythoncom + from win32com.shell import shell + + ilink = pythoncom.CoCreateInstance( + shell.CLSID_ShellLink, + None, + pythoncom.CLSCTX_INPROC_SERVER, + shell.IID_IShellLink, + ) + ilink.SetPath(path) + ilink.SetDescription(description) + if arguments: + ilink.SetArguments(arguments) + if workdir: + ilink.SetWorkingDirectory(workdir) + if iconpath or iconindex: + ilink.SetIconLocation(iconpath, iconindex) + # now save it. + ipf = ilink.QueryInterface(pythoncom.IID_IPersistFile) + if not filename.endswith('.lnk'): + filename += '.lnk' + if verbose: + print(f'create menu *{filename}*') + try: + ipf.Save(filename, 0) + except: + print ("a fail !") + pass + + +def print_box(text): + """Print text in a box""" + line0 = "+" + ("-" * (len(text) + 2)) + "+" + line1 = "| " + text + " |" + print( + ("\n\n" + "\n".join([line0, line1, line0]) + "\n") + ) + + +def is_python_distribution(path): + """Return True if path is a Python distribution""" + # XXX: This test could be improved but it seems to be sufficient + has_exec = Path(get_python_executable(path)).is_file() + has_site = Path(get_site_packages_path(path)).is_dir() + return has_exec and has_site + + +def decode_fs_string(string): + """Convert string from file system charset to unicode""" + charset = sys.getfilesystemencoding() + if charset is None: + charset = locale.getpreferredencoding() + return string.decode(charset) + + +def exec_shell_cmd(args, path): + """Execute shell command (*args* is a list of arguments) in *path*""" + # print " ".join(args) + process = subprocess.Popen( + args, + stdout=subprocess.PIPE, + stderr=subprocess.PIPE, + cwd=path, + shell=True + ) + return decode_fs_string(process.stdout.read()) + +def exec_run_cmd(args, path=None): + """run a single command (*args* is a list of arguments) in optional *path*""" + # only applicable to Python-3.5+ + # python-3.7+ allows to replace "stdout and stderr ", per "capture_output=True" + if path: + process = subprocess.run(args, + capture_output=True, + cwd=path, text=True) + #return decode_fs_string(process.stdout) + return process.stdout + else: + process = subprocess.run(args, + capture_output=True, + cwd=path, text=True) + #return decode_fs_string(process.stdout) + return process.stdout + + +def get_nodejs_version(path): + """Return version of the Nodejs installed in *path*""" + return exec_shell_cmd("node -v", path).splitlines()[0] + + +def get_npmjs_version(path): + """Return version of the Nodejs installed in *path*""" + return exec_shell_cmd("npm -v", path).splitlines()[0] + + +def get_pandoc_version(path): + """Return version of the Pandoc executable in *path*""" + return exec_shell_cmd("pandoc -v", path).splitlines()[0].split(" ")[-1] + + +def python_query(cmd, path): + """Execute Python command using the Python interpreter located in *path*""" + the_exe = get_python_executable(path) + # debug2021-09-12 + # print(f'"{the_exe}" -c "{cmd}"', ' * ', path) + + return exec_shell_cmd(f'"{the_exe}" -c "{cmd}"', path).splitlines()[0] + + +def python_execmodule(cmd, path): + """Execute Python command using the Python interpreter located in *path*""" + the_exe = get_python_executable(path) + exec_shell_cmd(f'{the_exe} -m {cmd}', path) + + +def get_python_infos(path): + """Return (version, architecture) for the Python distribution located in + *path*. The version number is limited to MAJOR.MINOR, the architecture is + an integer: 32 or 64""" + is_64 = python_query("import sys; print(sys.maxsize > 2**32)", path) + arch = {"True": 64, "False": 32}.get(is_64, None) + ver = python_query( + "import sys;print(f'{sys.version_info.major}.{sys.version_info.minor}')", + path, + ) + if re.match(r"([0-9]*)\.([0-9]*)", ver) is None: + ver = None + return ver, arch + + +def get_python_long_version(path): + """Return long version (X.Y.Z) for the Python distribution located in + *path*""" + ver = python_query( + "import sys; print(f'{sys.version_info.major}.{sys.version_info.minor}.{sys.version_info.micro}')", + path, + ) + if re.match(r"([0-9]*)\.([0-9]*)\.([0-9]*)", ver) is None: + ver = None + return ver + + +def patch_shebang_line(fname, pad=b" ", to_movable=True, targetdir=""): + """Remove absolute path to python.exe in shebang lines in binary files, or re-add it""" + + import re + import sys + import os + + target_dir = targetdir # movable option + if to_movable == False: + target_dir = os.path.abspath(os.path.dirname(fname)) + target_dir = os.path.abspath(os.path.join(target_dir, r"..")) + "\\" + executable = sys.executable + + shebang_line = re.compile(rb"""(#!.*pythonw?\.exe)"?""") # Python3+ + if "pypy3" in sys.executable: + shebang_line = re.compile(rb"""(#!.*pypy3w?\.exe)"?""") # Pypy3+ + target_dir = target_dir.encode("utf-8") + + with open(fname, "rb") as fh: + initial_content = fh.read() + fh.close + fh = None + content = shebang_line.split(initial_content, maxsplit=1) + if len(content) != 3: + return + exe = os.path.basename(content[1][2:]) + content[1] = b"#!" + target_dir + exe # + (pad * (len(content[1]) - len(exe) - 2)) + final_content = b"".join(content) + if initial_content == final_content: + return + try: + with open(fname, "wb") as fo: + fo.write(final_content) + fo.close + fo = None + print("patched", fname) + except Exception: + print("failed to patch", fname) + + +def patch_shebang_line_py(fname, to_movable=True, targetdir=""): + """Changes shebang line in '.py' file to relative or absolue path""" + import fileinput + import re + import sys + + if to_movable: + exec_path = r'#!.\python.exe' + if 'pypy3' in sys.executable: # PyPy ! + exec_path = r'#!.\pypy3.exe' + else: + exec_path = '#!' + sys.executable + for line in fileinput.input(fname, inplace=True): + if re.match(r'^#\!.*python\.exe$', line) is not None: + print(exec_path) + elif re.match(r'^#\!.*pypy3\.exe$', line) is not None:# PyPy ! + print(exec_path) + else: + print(line, end='') + + +def guess_encoding(csv_file): + """guess the encoding of the given file""" + # UTF_8_BOM = "\xEF\xBB\xBF" + # Python behavior on UTF-16 not great on write, so we drop it + with io.open(csv_file, "rb") as f: + data = f.read(5) + if data.startswith(b"\xEF\xBB\xBF"): # UTF-8 with a "BOM" (normally no BOM in utf-8) + return ["utf-8-sig"] + else: # in Windows, guessing utf-8 doesn't work, so we have to try + try: + with io.open(csv_file, encoding="utf-8") as f: + preview = f.read(222222) + return ["utf-8"] + except: + return [locale.getdefaultlocale()[1], "utf-8"] + +def replace_in_file(filepath: Path, replacements: list[tuple[str, str]], filedest: Path = None, verbose=False): + """ + Replaces strings in a file + Args: + filepath: Path to the file to modify. + replacements: A list of tuples of ('old string 'new string') + filedest: optional output file, otherwise will be filepath + """ + the_encoding = guess_encoding(filepath)[0] + with open(filepath, "r", encoding=the_encoding) as f: + content = f.read() + new_content = content + for old_text, new_text in replacements: + new_content = new_content.replace(old_text, new_text) + outfile = filedest if filedest else filepath + if new_content != content or str(outfile) != str(filepath): + with open(outfile, "w", encoding=the_encoding) as f: + f.write(new_content) + if verbose: + print(f"patched from {Path(filepath).name} into {outfile} !") + +def patch_sourcefile(fname, in_text, out_text, silent_mode=False): + """Replace a string in a source file""" + if not silent_mode: + print(f"patching {fname} from {in_text} to {out_text}") + if Path(fname).is_file() and not in_text == out_text: + replace_in_file(Path(fname), [(in_text , out_text)]) + +def _create_temp_dir(): + """Create a temporary directory and remove it at exit""" + tmpdir = tempfile.mkdtemp(prefix='wppm_') + atexit.register( + lambda path: shutil.rmtree(path, onexc=onerror), + tmpdir, + ) + return tmpdir + +def extract_archive(fname, targetdir=None, verbose=False): + """Extract .zip, .exe (considered to be a zip archive) or .tar.gz archive + to a temporary directory (if targetdir is None). + Return the temporary directory path""" + targetdir = targetdir or create_temp_dir() + Path(targetdir).mkdir(parents=True, exist_ok=True) + if Path(fname).suffix in ('.zip', '.exe'): + obj = zipfile.ZipFile(fname, mode="r") + elif fname.endswith('.tar.gz'): + obj = tarfile.open(fname, mode='r:gz') + else: + raise RuntimeError(f"Unsupported archive filename {fname}") + obj.extractall(path=targetdir) + return targetdir + +# SOURCE_PATTERN defines what an acceptable source package name is +# As of 2014-09-08 : +# - the wheel package format is accepte in source directory +# - the tricky regexp is tuned also to support the odd jolib naming : +# . joblib-0.8.3_r1-py2.py3-none-any.whl, +# . joblib-0.8.3-r1.tar.gz + +SOURCE_PATTERN = r'([a-zA-Z0-9\-\_\.]*)-([0-9\.\_]*[a-z]*[\-]?[0-9]*)(\.zip|\.tar\.gz|\-(py[2-7]*|py[2-7]*\.py[2-7]*)\-none\-any\.whl)' + +# WHEELBIN_PATTERN defines what an acceptable binary wheel package is +# "cp([0-9]*)" to replace per cp(34) for python3.4 +# "win32|win\_amd64" to replace per "win\_amd64" for 64bit +WHEELBIN_PATTERN = r'([a-zA-Z0-9\-\_\.]*)-([0-9\.\_]*[a-z0-9\+]*[0-9]?)-cp([0-9]*)\-[0-9|c|o|n|e|p|m]*\-(win32|win\_amd64)\.whl' + + +def get_source_package_infos(fname): + """Return a tuple (name, version) of the Python source package.""" + if fname.endswith('.whl'): + return Path(fname).name.split("-")[:2] + match = re.match(SOURCE_PATTERN, Path(fname).name) + return match.groups()[:2] if match else None + +def buildflit_wininst( + root, + python_exe=None, + copy_to=None, + verbose=False, +): + """Build Wheel from Python package located in *root*with flit""" + if python_exe is None: + python_exe = sys.executable + assert Path(python_exe).is_file() + cmd = [python_exe, '-m' ,'flit', 'build'] + + # root = a tmp dir in windows\tmp, + if verbose: + subprocess.call(cmd, cwd=root) + else: + p = subprocess.Popen( + cmd, + cwd=root, + stdout=subprocess.PIPE, + stderr=subprocess.PIPE, + ) + p.communicate() + p.stdout.close() + p.stderr.close() + distdir = str(Path(root) / 'dist') + if not Path(distdir).is_dir(): + raise RuntimeError( + "Build failed: see package README file for further" + " details regarding installation requirements.\n\n" + "For more concrete debugging infos, please try to build " + "the package from the command line:\n" + "1. Open a WinPython command prompt\n" + "2. Change working directory to the appropriate folder\n" + "3. Type `python -m filt build`" + ) + + for distname in os.listdir(distdir): + # for wheels (winpython here) + match = re.match(SOURCE_PATTERN, distname) + if match is not None: + break + match = re.match(WHEELBIN_PATTERN, distname) + if match is not None: + break + else: + raise RuntimeError(f"Build failed: not a pure Python package? {distdir}") + + src_fname = str(Path(distdir) / distname) + if copy_to is None: + return src_fname + else: + dst_fname = str(Path(copy_to) / distname) + shutil.move(src_fname, dst_fname) + if verbose: + print(f"Move: {src_fname} --> {dst_fname}") + return dst_fname + + +def direct_pip_install( + fname, + python_exe=None, + verbose=False, + install_options=None, +): + """Direct install via python -m pip !""" + copy_to = str(Path(fname).parent) + + if python_exe is None: + python_exe = sys.executable + assert Path(python_exe).is_file() + myroot = str(Path(python_exe).parent) + + cmd = [python_exe, "-m", "pip", "install"] + if install_options: + cmd += install_options # typically ['--no-deps'] + print("python -m pip install_options", install_options) + cmd += [fname] + + if verbose: + subprocess.call(cmd, cwd=myroot) + else: + p = subprocess.Popen( + cmd, + cwd=myroot, + stdout=subprocess.PIPE, + stderr=subprocess.PIPE, + ) + stdout, stderr = p.communicate() + the_log = f"{stdout}" + f"\n {stderr}" + + if " not find " in the_log or " not found " in the_log: + print(f"Failed to Install: \n {fname} \n") + print(f"msg: {the_log}") + raise RuntimeError + p.stdout.close() + p.stderr.close() + src_fname = fname + if copy_to is None: + return src_fname + else: + if verbose: + print(f"Installed {src_fname}") + return src_fname + + +def do_script(this_script, python_exe=None, copy_to=None, verbose=False, install_options=None): + """Execute a script (get-pip typically).""" + python_exe = python_exe or sys.executable + myroot = os.path.dirname(python_exe) + + # cmd = [python_exe, myroot + r'\Scripts\pip-script.py', 'install'] + cmd = [python_exe] + if install_options: + cmd += install_options # typically ['--no-deps'] + print('script install_options', install_options) + if this_script: + cmd += [this_script] + # print('build_wheel', myroot, cmd) + print("Executing ", cmd) + + if verbose: + subprocess.call(cmd, cwd=myroot) + else: + p = subprocess.Popen( + cmd, + cwd=myroot, + stdout=subprocess.PIPE, + stderr=subprocess.PIPE, + ) + p.communicate() + p.stdout.close() + p.stderr.close() + if verbose: + print("Executed ", cmd) + return 'ok' + +def columns_width(list_of_lists): + """Return the maximum string length of each column of a list of lists.""" + if not isinstance(list_of_lists, list): + return [0] + return [max(len(str(item)) for item in sublist) for sublist in zip(*list_of_lists)] + +def formatted_list(list_of_list, full=False, max_width=70): + """Format a list_of_list to fixed length columns.""" + columns_size = columns_width(list_of_list) + columns = range(len(columns_size)) + return [list(line[col].ljust(columns_size[col])[:max_width] for col in columns) for line in list_of_list] + +def normalize(this): + """Apply PEP 503 normalization to the string.""" + return re.sub(r"[-_.]+", "-", this).lower() + +def get_package_metadata(database, name): + """Extract infos (description, url) from the local database.""" + DATA_PATH = str(Path(sys.modules['winpython'].__file__).parent / 'data') + db = cp.ConfigParser() + filepath = Path(database) if Path(database).is_absolute() else Path(DATA_PATH) / database + db.read_file(open(str(filepath), encoding=guess_encoding(filepath)[0])) + + my_metadata = { + "description": "", + "url": f"https://pypi.org/project/{name}", + } + for key in my_metadata: + # wheel replace '-' per '_' in key + for name2 in (name, normalize(name)): + try: + my_metadata[key] = db.get(name2, key) + break + except (cp.NoSectionError, cp.NoOptionError): + pass + + return my_metadata + +if __name__ == '__main__': + print_box("Test") + dname = sys.prefix + print((dname + ':', '\n', get_python_infos(dname))) + + tmpdir = r'D:\Tests\winpython_tests' + Path(tmpdir).mkdir(parents=True, exist_ok=True) + print(extract_archive(str(Path(r'D:\WinP\bd37') / 'packages.win-amd64' / 'python-3.7.3.amd64.zip'), tmpdir)) From 6ebdb9ccfc127b5e13cc08e0c6ed19a137e74277 Mon Sep 17 00:00:00 2001 From: stonebig Date: Sun, 6 Apr 2025 13:45:03 +0200 Subject: [PATCH 127/305] simplify utils.py syntax using github copilote of 2025-04-06 --- winpython/utils.py | 136 +++------ winpython/utils_o.py | 653 ------------------------------------------- 2 files changed, 36 insertions(+), 753 deletions(-) delete mode 100644 winpython/utils_o.py diff --git a/winpython/utils.py b/winpython/utils.py index ea05d248..e00c5af0 100644 --- a/winpython/utils.py +++ b/winpython/utils.py @@ -59,39 +59,32 @@ def onerror(function, path, excinfo): def getFileProperties(fname): """Read all properties of the given file return them as a dictionary.""" import win32api - propNames = ( + prop_names = ( 'Comments', 'InternalName', 'ProductName', 'CompanyName', 'LegalCopyright', 'ProductVersion', 'FileDescription', 'LegalTrademarks', 'PrivateBuild', 'FileVersion', 'OriginalFilename', 'SpecialBuild' - ) + ) props = {'FixedFileInfo': None, 'StringFileInfo': None, 'FileVersion': None} try: - fixedInfo = win32api.GetFileVersionInfo(fname, '\\') - props['FixedFileInfo'] = fixedInfo - props['FileVersion'] = "%d.%d.%d.%d" % (fixedInfo['FileVersionMS'] / 65536, - fixedInfo['FileVersionMS'] % 65536, fixedInfo['FileVersionLS'] / 65536, - fixedInfo['FileVersionLS'] % 65536) - - # \VarFileInfo\Translation returns list of available (language, codepage) - # pairs that can be used to retreive string info. We are using only the first pair. + fixed_info = win32api.GetFileVersionInfo(fname, '\\') + props['FixedFileInfo'] = fixed_info + props['FileVersion'] = "{}.{}.{}.{}".format( + fixed_info['FileVersionMS'] // 65536, + fixed_info['FileVersionMS'] % 65536, + fixed_info['FileVersionLS'] // 65536, + fixed_info['FileVersionLS'] % 65536 + ) lang, codepage = win32api.GetFileVersionInfo(fname, '\\VarFileInfo\\Translation')[0] - - # any other must be of the form \StringfileInfo\%04X%04X\parm_name, middle - # two are language/codepage pair returned from above - strInfo = {} - for propName in propNames: - strInfoPath = u'\\StringFileInfo\\%04X%04X\\%s' % (lang, codepage, propName) - ## print str_info - strInfo[propName] = win32api.GetFileVersionInfo(fname, strInfoPath) - - props['StringFileInfo'] = strInfo + props['StringFileInfo'] = { + prop_name: win32api.GetFileVersionInfo(fname, f'\\StringFileInfo\\{lang:04X}{codepage:04X}\\{prop_name}') + for prop_name in prop_names + } except: pass return props - def get_special_folder_path(path_name): """Return special folder path.""" from win32com.shell import shell, shellcon @@ -104,21 +97,16 @@ def get_special_folder_path(path_name): if maybe == path_name: csidl = getattr(shellcon, maybe) return shell.SHGetSpecialFolderPath(0, csidl, False) - raise ValueError( - f"{path_name} is an unknown path ID" - ) - + raise ValueError(f"{path_name} is an unknown path ID") def get_winpython_start_menu_folder(current=True): - """Return WinPython Start menu shortcuts folder""" - if current: - # non-admin install - always goes in this user's start menu. - folder = get_special_folder_path("CSIDL_PROGRAMS") - else: + """Return WinPython Start menu shortcuts folder.""" + folder = get_special_folder_path("CSIDL_PROGRAMS") + if not current: try: folder = get_special_folder_path("CSIDL_COMMON_PROGRAMS") except OSError: - folder = get_special_folder_path("CSIDL_PROGRAMS") + pass return str(Path(folder) / 'WinPython') def remove_winpython_start_menu_folder(current=True): @@ -141,7 +129,6 @@ def create_winpython_start_menu_folder(current=True): Path(path).mkdir(parents=True, exist_ok=True) return path - def create_shortcut(path, description, filename, arguments="", workdir="", iconpath="", iconindex=0, verbose=True): """Create Windows shortcut (.lnk file).""" import pythoncom @@ -178,7 +165,7 @@ def is_python_distribution(path): return has_exec and has_site def decode_fs_string(string): - """Convert string from file system charset to unicode""" + """Convert string from file system charset to unicode.""" charset = sys.getfilesystemencoding() or locale.getpreferredencoding() return string.decode(charset) @@ -197,11 +184,11 @@ def get_nodejs_version(path): return exec_shell_cmd("node -v", path).splitlines()[0] def get_npmjs_version(path): - """Return version of the Nodejs installed in *path*""" + """Return version of the Nodejs installed in *path*.""" return exec_shell_cmd("npm -v", path).splitlines()[0] def get_pandoc_version(path): - """Return version of the Pandoc executable in *path*""" + """Return version of the Pandoc executable in *path*.""" return exec_shell_cmd("pandoc -v", path).splitlines()[0].split(" ")[-1] def python_query(cmd, path): @@ -215,40 +202,20 @@ def python_execmodule(cmd, path): exec_shell_cmd(f'{the_exe} -m {cmd}', path) def get_python_infos(path): - """Return (version, architecture) for the Python distribution located in - *path*. The version number is limited to MAJOR.MINOR, the architecture is - an integer: 32 or 64""" + """Return (version, architecture) for the Python distribution located in *path*.""" is_64 = python_query("import sys; print(sys.maxsize > 2**32)", path) arch = {"True": 64, "False": 32}.get(is_64, None) ver = python_query("import sys;print(f'{sys.version_info.major}.{sys.version_info.minor}')", path) - if re.match(r"([0-9]*)\.([0-9]*)", ver) is None: - ver = None return ver, arch - def get_python_long_version(path): - """Return long version (X.Y.Z) for the Python distribution located in - *path*""" - ver = python_query( - "import sys; print(f'{sys.version_info.major}.{sys.version_info.minor}.{sys.version_info.micro}')", - path, - ) - if re.match(r"([0-9]*)\.([0-9]*)\.([0-9]*)", ver) is None: - ver = None - return ver - + """Return long version (X.Y.Z) for the Python distribution located in *path*.""" + ver = python_query("import sys; print(f'{sys.version_info.major}.{sys.version_info.minor}.{sys.version_info.micro}')", path) + return ver if re.match(r"([0-9]*)\.([0-9]*)\.([0-9]*)", ver) else None def patch_shebang_line(fname, pad=b" ", to_movable=True, targetdir=""): - """Remove absolute path to python.exe in shebang lines in binary files, or re-add it""" - - import re - import sys - import os - - target_dir = targetdir # movable option - if to_movable == False: - target_dir = os.path.abspath(os.path.dirname(fname)) - target_dir = os.path.abspath(os.path.join(target_dir, r"..")) + "\\" + """Remove absolute path to python.exe in shebang lines in binary files, or re-add it.""" + target_dir = targetdir if to_movable else os.path.abspath(os.path.join(os.path.dirname(fname), r"..")) + "\\" executable = sys.executable shebang_line = re.compile(rb"""(#!.*pythonw?\.exe)"?""") # Python3+ @@ -258,8 +225,6 @@ def patch_shebang_line(fname, pad=b" ", to_movable=True, targetdir=""): with open(fname, "rb") as fh: initial_content = fh.read() - fh.close - fh = None content = shebang_line.split(initial_content, maxsplit=1) if len(content) != 3: return @@ -271,18 +236,13 @@ def patch_shebang_line(fname, pad=b" ", to_movable=True, targetdir=""): try: with open(fname, "wb") as fo: fo.write(final_content) - fo.close - fo = None print("patched", fname) except Exception: print("failed to patch", fname) - def patch_shebang_line_py(fname, to_movable=True, targetdir=""): """Changes shebang line in '.py' file to relative or absolue path""" import fileinput - import re - import sys if to_movable: exec_path = r'#!.\python.exe' @@ -298,7 +258,6 @@ def patch_shebang_line_py(fname, to_movable=True, targetdir=""): else: print(line, end='') - def guess_encoding(csv_file): """guess the encoding of the given file""" # UTF_8_BOM = "\xEF\xBB\xBF" @@ -328,7 +287,7 @@ def replace_in_file(filepath: Path, replacements: list[tuple[str, str]], filedes content = f.read() new_content = content for old_text, new_text in replacements: - new_content = new_content.replace(old_text, new_text) + new_content = new_content.replace(old_text, new_text) outfile = filedest if filedest else filepath if new_content != content or str(outfile) != str(filepath): with open(outfile, "w", encoding=the_encoding) as f: @@ -337,7 +296,7 @@ def replace_in_file(filepath: Path, replacements: list[tuple[str, str]], filedes print(f"patched from {Path(filepath).name} into {outfile} !") def patch_sourcefile(fname, in_text, out_text, silent_mode=False): - """Replace a string in a source file""" + """Replace a string in a source file.""" if not silent_mode: print(f"patching {fname} from {in_text} to {out_text}") if Path(fname).is_file() and not in_text == out_text: @@ -367,7 +326,6 @@ def extract_archive(fname, targetdir=None, verbose=False): obj.extractall(path=targetdir) return targetdir - def get_source_package_infos(fname): """Return a tuple (name, version) of the Python source package.""" if fname.endswith('.whl'): @@ -375,15 +333,9 @@ def get_source_package_infos(fname): match = re.match(SOURCE_PATTERN, Path(fname).name) return match.groups()[:2] if match else None -def buildflit_wininst( - root, - python_exe=None, - copy_to=None, - verbose=False, -): - """Build Wheel from Python package located in *root*with flit""" - if python_exe is None: - python_exe = sys.executable +def buildflit_wininst(root, python_exe=None, copy_to=None, verbose=False): + """Build Wheel from Python package located in *root* with flit.""" + python_exe = python_exe or sys.executable assert Path(python_exe).is_file() cmd = [python_exe, '-m' ,'flit', 'build'] @@ -391,12 +343,7 @@ def buildflit_wininst( if verbose: subprocess.call(cmd, cwd=root) else: - p = subprocess.Popen( - cmd, - cwd=root, - stdout=subprocess.PIPE, - stderr=subprocess.PIPE, - ) + p = subprocess.Popen(cmd, cwd=root, stdout=subprocess.PIPE, stderr=subprocess.PIPE) p.communicate() p.stdout.close() p.stderr.close() @@ -428,7 +375,6 @@ def buildflit_wininst( print(f"Move: {src_fname} --> {dst_fname}") return dst_fname - def direct_pip_install(fname, python_exe=None, verbose=False, install_options=None): """Direct install via python -m pip !""" copy_to = str(Path(fname).parent) @@ -447,12 +393,7 @@ def direct_pip_install(fname, python_exe=None, verbose=False, install_options=No if verbose: subprocess.call(cmd, cwd=myroot) else: - p = subprocess.Popen( - cmd, - cwd=myroot, - stdout=subprocess.PIPE, - stderr=subprocess.PIPE, - ) + p = subprocess.Popen(cmd, cwd=myroot, stdout=subprocess.PIPE, stderr=subprocess.PIPE) stdout, stderr = p.communicate() the_log = f"{stdout}" + f"\n {stderr}" @@ -489,12 +430,7 @@ def do_script(this_script, python_exe=None, copy_to=None, verbose=False, install if verbose: subprocess.call(cmd, cwd=myroot) else: - p = subprocess.Popen( - cmd, - cwd=myroot, - stdout=subprocess.PIPE, - stderr=subprocess.PIPE, - ) + p = subprocess.Popen(cmd, cwd=myroot, stdout=subprocess.PIPE, stderr=subprocess.PIPE) p.communicate() p.stdout.close() p.stderr.close() diff --git a/winpython/utils_o.py b/winpython/utils_o.py deleted file mode 100644 index f1cc326b..00000000 --- a/winpython/utils_o.py +++ /dev/null @@ -1,653 +0,0 @@ -# -*- coding: utf-8 -*- -# -# Copyright © 2012 Pierre Raybaut -# Licensed under the terms of the MIT License -# (see winpython/__init__.py for details) - -""" -WinPython utilities - -Created on Tue Aug 14 14:08:40 2012 -""" - -import os -import sys -import stat -import shutil -import locale -import tempfile -import subprocess -import configparser as cp -from pathlib import Path -import re -import tarfile -import zipfile -import atexit -import io -import winreg - -def get_python_executable(path=None): - """Return the path to the Python executable.""" - python_path = sys.executable if path is None else path - base_dir = Path(python_path).parent if not Path(python_path).is_dir() else Path(python_path) - python_exe = base_dir / 'python.exe' - pypy_exe = base_dir / 'pypy3.exe' # For PyPy - return str(python_exe if python_exe.is_file() else pypy_exe) - -def get_site_packages_path(path=None): - """Return the path to the Python site-packages directory.""" - python_path = sys.executable if path is None else path - base_dir = Path(python_path).parent if not Path(python_path).is_dir() else Path(python_path) - site_packages = base_dir / 'Lib' / 'site-packages' - pypy_site_packages = base_dir / 'site-packages' # For PyPy - return str(pypy_site_packages if pypy_site_packages.is_dir() else site_packages) - -def onerror(function, path, excinfo): - """Error handler for `shutil.rmtree`. - - If the error is due to an access error (read-only file), it - attempts to add write permission and then retries. - If the error is for another reason, it re-raises the error. - - Usage: `shutil.rmtree(path, onexc=onerror)""" - if not os.access(path, os.W_OK): - # Is the error an access error? - os.chmod(path, stat.S_IWUSR) - function(path) - else: - raise - - -def getFileProperties(fname): - """ - Read all properties of the given file return them as a dictionary. - """ - # from https://stackoverflow.com/questions/580924/how-to-access-a-files-properties-on-windows - import win32api - propNames = ('Comments', 'InternalName', 'ProductName', - 'CompanyName', 'LegalCopyright', 'ProductVersion', - 'FileDescription', 'LegalTrademarks', 'PrivateBuild', - 'FileVersion', 'OriginalFilename', 'SpecialBuild') - - props = {'FixedFileInfo': None, 'StringFileInfo': None, 'FileVersion': None} - - try: - # backslash as parm returns dictionary of numeric info corresponding to VS_FIXEDFILEINFO struc - fixedInfo = win32api.GetFileVersionInfo(fname, '\\') - props['FixedFileInfo'] = fixedInfo - props['FileVersion'] = "%d.%d.%d.%d" % (fixedInfo['FileVersionMS'] / 65536, - fixedInfo['FileVersionMS'] % 65536, fixedInfo['FileVersionLS'] / 65536, - fixedInfo['FileVersionLS'] % 65536) - - # \VarFileInfo\Translation returns list of available (language, codepage) - # pairs that can be used to retreive string info. We are using only the first pair. - lang, codepage = win32api.GetFileVersionInfo(fname, '\\VarFileInfo\\Translation')[0] - - # any other must be of the form \StringfileInfo\%04X%04X\parm_name, middle - # two are language/codepage pair returned from above - - strInfo = {} - for propName in propNames: - strInfoPath = u'\\StringFileInfo\\%04X%04X\\%s' % (lang, codepage, propName) - ## print str_info - strInfo[propName] = win32api.GetFileVersionInfo(fname, strInfoPath) - - props['StringFileInfo'] = strInfo - except: - pass - - return props - - -def get_special_folder_path(path_name): - """Return special folder path""" - from win32com.shell import shell, shellcon - - for maybe in """ - CSIDL_COMMON_STARTMENU CSIDL_STARTMENU CSIDL_COMMON_APPDATA - CSIDL_LOCAL_APPDATA CSIDL_APPDATA CSIDL_COMMON_DESKTOPDIRECTORY - CSIDL_DESKTOPDIRECTORY CSIDL_COMMON_STARTUP CSIDL_STARTUP - CSIDL_COMMON_PROGRAMS CSIDL_PROGRAMS CSIDL_PROGRAM_FILES_COMMON - CSIDL_PROGRAM_FILES CSIDL_FONTS""".split(): - if maybe == path_name: - csidl = getattr(shellcon, maybe) - return shell.SHGetSpecialFolderPath( - 0, csidl, False - ) - raise ValueError( - f"{path_name} is an unknown path ID" - ) - - -def get_winpython_start_menu_folder(current=True): - """Return WinPython Start menu shortcuts folder""" - if current: - # non-admin install - always goes in this user's start menu. - folder = get_special_folder_path("CSIDL_PROGRAMS") - else: - try: - folder = get_special_folder_path( - "CSIDL_COMMON_PROGRAMS" - ) - except OSError: - # No CSIDL_COMMON_PROGRAMS on this platform - folder = get_special_folder_path( - "CSIDL_PROGRAMS" - ) - return str(Path(folder) / 'WinPython') - -def remove_winpython_start_menu_folder(current=True): - """Remove WinPython Start menu folder -- remove it if it already exists""" - path = get_winpython_start_menu_folder(current=current) - if Path(path).is_dir(): - try: - shutil.rmtree(path, onexc=onerror) - except WindowsError: - print( - f"Directory {path} could not be removed", - file=sys.stderr, - ) - -def create_winpython_start_menu_folder(current=True): - """Create WinPython Start menu folder -- remove it if it already exists""" - path = get_winpython_start_menu_folder(current=current) - if Path(path).is_dir(): - try: - shutil.rmtree(path, onexc=onerror) - except WindowsError: - print( - f"Directory {path} could not be removed", - file=sys.stderr, - ) - # create, or re-create ! - Path(path).mkdir(parents=True, exist_ok=True) - return path - - -def create_shortcut( - path, - description, - filename, - arguments="", - workdir="", - iconpath="", - iconindex=0, - verbose=True, -): - """Create Windows shortcut (.lnk file)""" - import pythoncom - from win32com.shell import shell - - ilink = pythoncom.CoCreateInstance( - shell.CLSID_ShellLink, - None, - pythoncom.CLSCTX_INPROC_SERVER, - shell.IID_IShellLink, - ) - ilink.SetPath(path) - ilink.SetDescription(description) - if arguments: - ilink.SetArguments(arguments) - if workdir: - ilink.SetWorkingDirectory(workdir) - if iconpath or iconindex: - ilink.SetIconLocation(iconpath, iconindex) - # now save it. - ipf = ilink.QueryInterface(pythoncom.IID_IPersistFile) - if not filename.endswith('.lnk'): - filename += '.lnk' - if verbose: - print(f'create menu *{filename}*') - try: - ipf.Save(filename, 0) - except: - print ("a fail !") - pass - - -def print_box(text): - """Print text in a box""" - line0 = "+" + ("-" * (len(text) + 2)) + "+" - line1 = "| " + text + " |" - print( - ("\n\n" + "\n".join([line0, line1, line0]) + "\n") - ) - - -def is_python_distribution(path): - """Return True if path is a Python distribution""" - # XXX: This test could be improved but it seems to be sufficient - has_exec = Path(get_python_executable(path)).is_file() - has_site = Path(get_site_packages_path(path)).is_dir() - return has_exec and has_site - - -def decode_fs_string(string): - """Convert string from file system charset to unicode""" - charset = sys.getfilesystemencoding() - if charset is None: - charset = locale.getpreferredencoding() - return string.decode(charset) - - -def exec_shell_cmd(args, path): - """Execute shell command (*args* is a list of arguments) in *path*""" - # print " ".join(args) - process = subprocess.Popen( - args, - stdout=subprocess.PIPE, - stderr=subprocess.PIPE, - cwd=path, - shell=True - ) - return decode_fs_string(process.stdout.read()) - -def exec_run_cmd(args, path=None): - """run a single command (*args* is a list of arguments) in optional *path*""" - # only applicable to Python-3.5+ - # python-3.7+ allows to replace "stdout and stderr ", per "capture_output=True" - if path: - process = subprocess.run(args, - capture_output=True, - cwd=path, text=True) - #return decode_fs_string(process.stdout) - return process.stdout - else: - process = subprocess.run(args, - capture_output=True, - cwd=path, text=True) - #return decode_fs_string(process.stdout) - return process.stdout - - -def get_nodejs_version(path): - """Return version of the Nodejs installed in *path*""" - return exec_shell_cmd("node -v", path).splitlines()[0] - - -def get_npmjs_version(path): - """Return version of the Nodejs installed in *path*""" - return exec_shell_cmd("npm -v", path).splitlines()[0] - - -def get_pandoc_version(path): - """Return version of the Pandoc executable in *path*""" - return exec_shell_cmd("pandoc -v", path).splitlines()[0].split(" ")[-1] - - -def python_query(cmd, path): - """Execute Python command using the Python interpreter located in *path*""" - the_exe = get_python_executable(path) - # debug2021-09-12 - # print(f'"{the_exe}" -c "{cmd}"', ' * ', path) - - return exec_shell_cmd(f'"{the_exe}" -c "{cmd}"', path).splitlines()[0] - - -def python_execmodule(cmd, path): - """Execute Python command using the Python interpreter located in *path*""" - the_exe = get_python_executable(path) - exec_shell_cmd(f'{the_exe} -m {cmd}', path) - - -def get_python_infos(path): - """Return (version, architecture) for the Python distribution located in - *path*. The version number is limited to MAJOR.MINOR, the architecture is - an integer: 32 or 64""" - is_64 = python_query("import sys; print(sys.maxsize > 2**32)", path) - arch = {"True": 64, "False": 32}.get(is_64, None) - ver = python_query( - "import sys;print(f'{sys.version_info.major}.{sys.version_info.minor}')", - path, - ) - if re.match(r"([0-9]*)\.([0-9]*)", ver) is None: - ver = None - return ver, arch - - -def get_python_long_version(path): - """Return long version (X.Y.Z) for the Python distribution located in - *path*""" - ver = python_query( - "import sys; print(f'{sys.version_info.major}.{sys.version_info.minor}.{sys.version_info.micro}')", - path, - ) - if re.match(r"([0-9]*)\.([0-9]*)\.([0-9]*)", ver) is None: - ver = None - return ver - - -def patch_shebang_line(fname, pad=b" ", to_movable=True, targetdir=""): - """Remove absolute path to python.exe in shebang lines in binary files, or re-add it""" - - import re - import sys - import os - - target_dir = targetdir # movable option - if to_movable == False: - target_dir = os.path.abspath(os.path.dirname(fname)) - target_dir = os.path.abspath(os.path.join(target_dir, r"..")) + "\\" - executable = sys.executable - - shebang_line = re.compile(rb"""(#!.*pythonw?\.exe)"?""") # Python3+ - if "pypy3" in sys.executable: - shebang_line = re.compile(rb"""(#!.*pypy3w?\.exe)"?""") # Pypy3+ - target_dir = target_dir.encode("utf-8") - - with open(fname, "rb") as fh: - initial_content = fh.read() - fh.close - fh = None - content = shebang_line.split(initial_content, maxsplit=1) - if len(content) != 3: - return - exe = os.path.basename(content[1][2:]) - content[1] = b"#!" + target_dir + exe # + (pad * (len(content[1]) - len(exe) - 2)) - final_content = b"".join(content) - if initial_content == final_content: - return - try: - with open(fname, "wb") as fo: - fo.write(final_content) - fo.close - fo = None - print("patched", fname) - except Exception: - print("failed to patch", fname) - - -def patch_shebang_line_py(fname, to_movable=True, targetdir=""): - """Changes shebang line in '.py' file to relative or absolue path""" - import fileinput - import re - import sys - - if to_movable: - exec_path = r'#!.\python.exe' - if 'pypy3' in sys.executable: # PyPy ! - exec_path = r'#!.\pypy3.exe' - else: - exec_path = '#!' + sys.executable - for line in fileinput.input(fname, inplace=True): - if re.match(r'^#\!.*python\.exe$', line) is not None: - print(exec_path) - elif re.match(r'^#\!.*pypy3\.exe$', line) is not None:# PyPy ! - print(exec_path) - else: - print(line, end='') - - -def guess_encoding(csv_file): - """guess the encoding of the given file""" - # UTF_8_BOM = "\xEF\xBB\xBF" - # Python behavior on UTF-16 not great on write, so we drop it - with io.open(csv_file, "rb") as f: - data = f.read(5) - if data.startswith(b"\xEF\xBB\xBF"): # UTF-8 with a "BOM" (normally no BOM in utf-8) - return ["utf-8-sig"] - else: # in Windows, guessing utf-8 doesn't work, so we have to try - try: - with io.open(csv_file, encoding="utf-8") as f: - preview = f.read(222222) - return ["utf-8"] - except: - return [locale.getdefaultlocale()[1], "utf-8"] - -def replace_in_file(filepath: Path, replacements: list[tuple[str, str]], filedest: Path = None, verbose=False): - """ - Replaces strings in a file - Args: - filepath: Path to the file to modify. - replacements: A list of tuples of ('old string 'new string') - filedest: optional output file, otherwise will be filepath - """ - the_encoding = guess_encoding(filepath)[0] - with open(filepath, "r", encoding=the_encoding) as f: - content = f.read() - new_content = content - for old_text, new_text in replacements: - new_content = new_content.replace(old_text, new_text) - outfile = filedest if filedest else filepath - if new_content != content or str(outfile) != str(filepath): - with open(outfile, "w", encoding=the_encoding) as f: - f.write(new_content) - if verbose: - print(f"patched from {Path(filepath).name} into {outfile} !") - -def patch_sourcefile(fname, in_text, out_text, silent_mode=False): - """Replace a string in a source file""" - if not silent_mode: - print(f"patching {fname} from {in_text} to {out_text}") - if Path(fname).is_file() and not in_text == out_text: - replace_in_file(Path(fname), [(in_text , out_text)]) - -def _create_temp_dir(): - """Create a temporary directory and remove it at exit""" - tmpdir = tempfile.mkdtemp(prefix='wppm_') - atexit.register( - lambda path: shutil.rmtree(path, onexc=onerror), - tmpdir, - ) - return tmpdir - -def extract_archive(fname, targetdir=None, verbose=False): - """Extract .zip, .exe (considered to be a zip archive) or .tar.gz archive - to a temporary directory (if targetdir is None). - Return the temporary directory path""" - targetdir = targetdir or create_temp_dir() - Path(targetdir).mkdir(parents=True, exist_ok=True) - if Path(fname).suffix in ('.zip', '.exe'): - obj = zipfile.ZipFile(fname, mode="r") - elif fname.endswith('.tar.gz'): - obj = tarfile.open(fname, mode='r:gz') - else: - raise RuntimeError(f"Unsupported archive filename {fname}") - obj.extractall(path=targetdir) - return targetdir - -# SOURCE_PATTERN defines what an acceptable source package name is -# As of 2014-09-08 : -# - the wheel package format is accepte in source directory -# - the tricky regexp is tuned also to support the odd jolib naming : -# . joblib-0.8.3_r1-py2.py3-none-any.whl, -# . joblib-0.8.3-r1.tar.gz - -SOURCE_PATTERN = r'([a-zA-Z0-9\-\_\.]*)-([0-9\.\_]*[a-z]*[\-]?[0-9]*)(\.zip|\.tar\.gz|\-(py[2-7]*|py[2-7]*\.py[2-7]*)\-none\-any\.whl)' - -# WHEELBIN_PATTERN defines what an acceptable binary wheel package is -# "cp([0-9]*)" to replace per cp(34) for python3.4 -# "win32|win\_amd64" to replace per "win\_amd64" for 64bit -WHEELBIN_PATTERN = r'([a-zA-Z0-9\-\_\.]*)-([0-9\.\_]*[a-z0-9\+]*[0-9]?)-cp([0-9]*)\-[0-9|c|o|n|e|p|m]*\-(win32|win\_amd64)\.whl' - - -def get_source_package_infos(fname): - """Return a tuple (name, version) of the Python source package.""" - if fname.endswith('.whl'): - return Path(fname).name.split("-")[:2] - match = re.match(SOURCE_PATTERN, Path(fname).name) - return match.groups()[:2] if match else None - -def buildflit_wininst( - root, - python_exe=None, - copy_to=None, - verbose=False, -): - """Build Wheel from Python package located in *root*with flit""" - if python_exe is None: - python_exe = sys.executable - assert Path(python_exe).is_file() - cmd = [python_exe, '-m' ,'flit', 'build'] - - # root = a tmp dir in windows\tmp, - if verbose: - subprocess.call(cmd, cwd=root) - else: - p = subprocess.Popen( - cmd, - cwd=root, - stdout=subprocess.PIPE, - stderr=subprocess.PIPE, - ) - p.communicate() - p.stdout.close() - p.stderr.close() - distdir = str(Path(root) / 'dist') - if not Path(distdir).is_dir(): - raise RuntimeError( - "Build failed: see package README file for further" - " details regarding installation requirements.\n\n" - "For more concrete debugging infos, please try to build " - "the package from the command line:\n" - "1. Open a WinPython command prompt\n" - "2. Change working directory to the appropriate folder\n" - "3. Type `python -m filt build`" - ) - - for distname in os.listdir(distdir): - # for wheels (winpython here) - match = re.match(SOURCE_PATTERN, distname) - if match is not None: - break - match = re.match(WHEELBIN_PATTERN, distname) - if match is not None: - break - else: - raise RuntimeError(f"Build failed: not a pure Python package? {distdir}") - - src_fname = str(Path(distdir) / distname) - if copy_to is None: - return src_fname - else: - dst_fname = str(Path(copy_to) / distname) - shutil.move(src_fname, dst_fname) - if verbose: - print(f"Move: {src_fname} --> {dst_fname}") - return dst_fname - - -def direct_pip_install( - fname, - python_exe=None, - verbose=False, - install_options=None, -): - """Direct install via python -m pip !""" - copy_to = str(Path(fname).parent) - - if python_exe is None: - python_exe = sys.executable - assert Path(python_exe).is_file() - myroot = str(Path(python_exe).parent) - - cmd = [python_exe, "-m", "pip", "install"] - if install_options: - cmd += install_options # typically ['--no-deps'] - print("python -m pip install_options", install_options) - cmd += [fname] - - if verbose: - subprocess.call(cmd, cwd=myroot) - else: - p = subprocess.Popen( - cmd, - cwd=myroot, - stdout=subprocess.PIPE, - stderr=subprocess.PIPE, - ) - stdout, stderr = p.communicate() - the_log = f"{stdout}" + f"\n {stderr}" - - if " not find " in the_log or " not found " in the_log: - print(f"Failed to Install: \n {fname} \n") - print(f"msg: {the_log}") - raise RuntimeError - p.stdout.close() - p.stderr.close() - src_fname = fname - if copy_to is None: - return src_fname - else: - if verbose: - print(f"Installed {src_fname}") - return src_fname - - -def do_script(this_script, python_exe=None, copy_to=None, verbose=False, install_options=None): - """Execute a script (get-pip typically).""" - python_exe = python_exe or sys.executable - myroot = os.path.dirname(python_exe) - - # cmd = [python_exe, myroot + r'\Scripts\pip-script.py', 'install'] - cmd = [python_exe] - if install_options: - cmd += install_options # typically ['--no-deps'] - print('script install_options', install_options) - if this_script: - cmd += [this_script] - # print('build_wheel', myroot, cmd) - print("Executing ", cmd) - - if verbose: - subprocess.call(cmd, cwd=myroot) - else: - p = subprocess.Popen( - cmd, - cwd=myroot, - stdout=subprocess.PIPE, - stderr=subprocess.PIPE, - ) - p.communicate() - p.stdout.close() - p.stderr.close() - if verbose: - print("Executed ", cmd) - return 'ok' - -def columns_width(list_of_lists): - """Return the maximum string length of each column of a list of lists.""" - if not isinstance(list_of_lists, list): - return [0] - return [max(len(str(item)) for item in sublist) for sublist in zip(*list_of_lists)] - -def formatted_list(list_of_list, full=False, max_width=70): - """Format a list_of_list to fixed length columns.""" - columns_size = columns_width(list_of_list) - columns = range(len(columns_size)) - return [list(line[col].ljust(columns_size[col])[:max_width] for col in columns) for line in list_of_list] - -def normalize(this): - """Apply PEP 503 normalization to the string.""" - return re.sub(r"[-_.]+", "-", this).lower() - -def get_package_metadata(database, name): - """Extract infos (description, url) from the local database.""" - DATA_PATH = str(Path(sys.modules['winpython'].__file__).parent / 'data') - db = cp.ConfigParser() - filepath = Path(database) if Path(database).is_absolute() else Path(DATA_PATH) / database - db.read_file(open(str(filepath), encoding=guess_encoding(filepath)[0])) - - my_metadata = { - "description": "", - "url": f"https://pypi.org/project/{name}", - } - for key in my_metadata: - # wheel replace '-' per '_' in key - for name2 in (name, normalize(name)): - try: - my_metadata[key] = db.get(name2, key) - break - except (cp.NoSectionError, cp.NoOptionError): - pass - - return my_metadata - -if __name__ == '__main__': - print_box("Test") - dname = sys.prefix - print((dname + ':', '\n', get_python_infos(dname))) - - tmpdir = r'D:\Tests\winpython_tests' - Path(tmpdir).mkdir(parents=True, exist_ok=True) - print(extract_archive(str(Path(r'D:\WinP\bd37') / 'packages.win-amd64' / 'python-3.7.3.amd64.zip'), tmpdir)) From 257d02c26ecda16a86a9c96ce3ab53c016136e90 Mon Sep 17 00:00:00 2001 From: stonebig Date: Sun, 6 Apr 2025 15:49:11 +0200 Subject: [PATCH 128/305] simplify utils.py syntax using github copilote of 2025-04-06 --- winpython/utils.py | 108 ++++++++++++++------------------------------- 1 file changed, 34 insertions(+), 74 deletions(-) diff --git a/winpython/utils.py b/winpython/utils.py index e00c5af0..49fd39a0 100644 --- a/winpython/utils.py +++ b/winpython/utils.py @@ -132,6 +132,7 @@ def create_winpython_start_menu_folder(current=True): def create_shortcut(path, description, filename, arguments="", workdir="", iconpath="", iconindex=0, verbose=True): """Create Windows shortcut (.lnk file).""" import pythoncom + from win32com.shell import shel ilink = pythoncom.CoCreateInstance(shell.CLSID_ShellLink, None, pythoncom.CLSCTX_INPROC_SERVER, shell.IID_IShellLink) ilink.SetPath(path) ilink.SetDescription(description) @@ -243,7 +244,6 @@ def patch_shebang_line(fname, pad=b" ", to_movable=True, targetdir=""): def patch_shebang_line_py(fname, to_movable=True, targetdir=""): """Changes shebang line in '.py' file to relative or absolue path""" import fileinput - if to_movable: exec_path = r'#!.\python.exe' if 'pypy3' in sys.executable: # PyPy ! @@ -251,17 +251,14 @@ def patch_shebang_line_py(fname, to_movable=True, targetdir=""): else: exec_path = '#!' + sys.executable for line in fileinput.input(fname, inplace=True): - if re.match(r'^#\!.*python\.exe$', line) is not None: + if re.match(r'^#\!.*python\.exe$', line) or re.match(r'^#\!.*pypy3\.exe$', line): print(exec_path) - elif re.match(r'^#\!.*pypy3\.exe$', line) is not None:# PyPy ! - print(exec_path) else: print(line, end='') def guess_encoding(csv_file): """guess the encoding of the given file""" # UTF_8_BOM = "\xEF\xBB\xBF" - # Python behavior on UTF-16 not great on write, so we drop it with io.open(csv_file, "rb") as f: data = f.read(5) if data.startswith(b"\xEF\xBB\xBF"): # UTF-8 with a "BOM" (normally no BOM in utf-8) @@ -273,7 +270,7 @@ def guess_encoding(csv_file): return ["utf-8"] except: return [locale.getdefaultlocale()[1], "utf-8"] - + def replace_in_file(filepath: Path, replacements: list[tuple[str, str]], filedest: Path = None, verbose=False): """ Replaces strings in a file @@ -285,7 +282,7 @@ def replace_in_file(filepath: Path, replacements: list[tuple[str, str]], filedes the_encoding = guess_encoding(filepath)[0] with open(filepath, "r", encoding=the_encoding) as f: content = f.read() - new_content = content + new_content = content for old_text, new_text in replacements: new_content = new_content.replace(old_text, new_text) outfile = filedest if filedest else filepath @@ -305,15 +302,11 @@ def patch_sourcefile(fname, in_text, out_text, silent_mode=False): def _create_temp_dir(): """Create a temporary directory and remove it at exit""" tmpdir = tempfile.mkdtemp(prefix='wppm_') - atexit.register( - lambda path: shutil.rmtree(path, onexc=onerror), - tmpdir, - ) + atexit.register(lambda path: shutil.rmtree(path, onexc=onerror), tmpdir) return tmpdir def extract_archive(fname, targetdir=None, verbose=False): - """Extract .zip, .exe (considered to be a zip archive) or .tar.gz archive - to a temporary directory (if targetdir is None). + """Extract .zip, .exe or .tar.gz archive to a temporary directory. Return the temporary directory path""" targetdir = targetdir or create_temp_dir() Path(targetdir).mkdir(parents=True, exist_ok=True) @@ -336,24 +329,19 @@ def get_source_package_infos(fname): def buildflit_wininst(root, python_exe=None, copy_to=None, verbose=False): """Build Wheel from Python package located in *root* with flit.""" python_exe = python_exe or sys.executable - assert Path(python_exe).is_file() cmd = [python_exe, '-m' ,'flit', 'build'] - - # root = a tmp dir in windows\tmp, if verbose: subprocess.call(cmd, cwd=root) else: - p = subprocess.Popen(cmd, cwd=root, stdout=subprocess.PIPE, stderr=subprocess.PIPE) - p.communicate() - p.stdout.close() - p.stderr.close() + process = subprocess.Popen(cmd, cwd=root, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + process.communicate() + process.stdout.close() + process.stderr.close() distdir = str(Path(root) / 'dist') if not Path(distdir).is_dir(): raise RuntimeError( - "Build failed: see package README file for further" - " details regarding installation requirements.\n\n" - "For more concrete debugging infos, please try to build " - "the package from the command line:\n" + "Build failed: see package README file for further details regarding installation requirements.\n\n" + "For more concrete debugging infos, please try to build the package from the command line:\n" "1. Open a WinPython command prompt\n" "2. Change working directory to the appropriate folder\n" "3. Type `python -m filt build`" @@ -366,75 +354,48 @@ def buildflit_wininst(root, python_exe=None, copy_to=None, verbose=False): raise RuntimeError(f"Build failed: not a pure Python package? {distdir}") src_fname = str(Path(distdir) / distname) - if copy_to is None: - return src_fname - else: + if copy_to: dst_fname = str(Path(copy_to) / distname) shutil.move(src_fname, dst_fname) if verbose: print(f"Move: {src_fname} --> {dst_fname}") return dst_fname + return src_fname def direct_pip_install(fname, python_exe=None, verbose=False, install_options=None): """Direct install via python -m pip !""" - copy_to = str(Path(fname).parent) - - if python_exe is None: - python_exe = sys.executable - assert Path(python_exe).is_file() + python_exe = python_exe or sys.executable myroot = str(Path(python_exe).parent) - cmd = [python_exe, "-m", "pip", "install"] - if install_options: - cmd += install_options # typically ['--no-deps'] - print("python -m pip install_options", install_options) - cmd += [fname] - - if verbose: - subprocess.call(cmd, cwd=myroot) - else: - p = subprocess.Popen(cmd, cwd=myroot, stdout=subprocess.PIPE, stderr=subprocess.PIPE) - stdout, stderr = p.communicate() - the_log = f"{stdout}" + f"\n {stderr}" - + cmd = [python_exe, "-m", "pip", "install"] + (install_options or []) +[fname] + if not verbose: + process = subprocess.Popen(cmd, cwd=myroot, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + stdout, stderr = process.communicate() + the_log = f"{stdout}\n {stderr}" if " not find " in the_log or " not found " in the_log: - print(f"Failed to Install: \n {fname} \n") - print(f"msg: {the_log}") + print(f"Failed to Install: \n {fname} \n msg: {the_log}") raise RuntimeError - p.stdout.close() - p.stderr.close() - src_fname = fname - if copy_to is None: - return src_fname + process.stdout.close() + process.stderr.close() else: - if verbose: - print(f"Installed {src_fname}") - return src_fname - + subprocess.call(cmd, cwd=myroot) + print(f"Installed {fname} via {' '.join(cmd)}") + return fname def do_script(this_script, python_exe=None, copy_to=None, verbose=False, install_options=None): """Execute a script (get-pip typically).""" python_exe = python_exe or sys.executable myroot = os.path.dirname(python_exe) - # cmd = [python_exe, myroot + r'\Scripts\pip-script.py', 'install'] - cmd = [python_exe] - if install_options: - cmd += install_options # typically ['--no-deps'] - print('script install_options', install_options) - if this_script: - cmd += [this_script] - # print('build_wheel', myroot, cmd) + cmd = [python_exe] + (install_options or []) + ([this_script] if this_script else []) print("Executing ", cmd) - - if verbose: - subprocess.call(cmd, cwd=myroot) + if not verbose: + process = subprocess.Popen(cmd, cwd=myroot, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + process.communicate() + process.stdout.close() + process.stderr.close() else: - p = subprocess.Popen(cmd, cwd=myroot, stdout=subprocess.PIPE, stderr=subprocess.PIPE) - p.communicate() - p.stdout.close() - p.stderr.close() - if verbose: + subprocess.call(cmd, cwd=myroot) print("Executed ", cmd) return 'ok' @@ -442,7 +403,7 @@ def columns_width(list_of_lists): """Return the maximum string length of each column of a list of lists.""" if not isinstance(list_of_lists, list): return [0] - return [max(len(str(item)) for item in sublist) for sublist in zip(*list_of_lists)] + return [max(len(str(item)) for item in sublist) for sublist in zip(*list_of_lists)] def formatted_list(list_of_list, full=False, max_width=70): """Format a list_of_list to fixed length columns.""" @@ -466,7 +427,6 @@ def get_package_metadata(database, name): "url": f"https://pypi.org/project/{name}", } for key in my_metadata: - # wheel replace '-' per '_' in key for name2 in (name, normalize(name)): try: my_metadata[key] = db.get(name2, key) From 3b30c32cb4293aae85a1dbb889635bd33ee7cf52 Mon Sep 17 00:00:00 2001 From: stonebig Date: Sun, 6 Apr 2025 15:51:09 +0200 Subject: [PATCH 129/305] typo --- winpython/utils.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/winpython/utils.py b/winpython/utils.py index 49fd39a0..05d88556 100644 --- a/winpython/utils.py +++ b/winpython/utils.py @@ -132,7 +132,7 @@ def create_winpython_start_menu_folder(current=True): def create_shortcut(path, description, filename, arguments="", workdir="", iconpath="", iconindex=0, verbose=True): """Create Windows shortcut (.lnk file).""" import pythoncom - from win32com.shell import shel + from win32com.shell import shell ilink = pythoncom.CoCreateInstance(shell.CLSID_ShellLink, None, pythoncom.CLSCTX_INPROC_SERVER, shell.IID_IShellLink) ilink.SetPath(path) ilink.SetDescription(description) From 677932c4c9258f3f3020f87a76c83c3f028b2be4 Mon Sep 17 00:00:00 2001 From: stonebig Date: Tue, 8 Apr 2025 23:13:13 +0200 Subject: [PATCH 130/305] small simplification --- winpython/utils.py | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) diff --git a/winpython/utils.py b/winpython/utils.py index 05d88556..523b6fa0 100644 --- a/winpython/utils.py +++ b/winpython/utils.py @@ -1,15 +1,11 @@ # -*- coding: utf-8 -*- # +# WinPython utilities # Copyright © 2012 Pierre Raybaut +# Copyright © 2014-2025+ The Winpython development team https://github.com/winpython/ # Licensed under the terms of the MIT License # (see winpython/__init__.py for details) -""" -WinPython utilities - -Created on Tue Aug 14 14:08:40 2012 -""" - import os import sys import stat @@ -23,7 +19,6 @@ import tarfile import zipfile import atexit -import io import winreg # SOURCE_PATTERN defines what an acceptable source package name is @@ -259,13 +254,13 @@ def patch_shebang_line_py(fname, to_movable=True, targetdir=""): def guess_encoding(csv_file): """guess the encoding of the given file""" # UTF_8_BOM = "\xEF\xBB\xBF" - with io.open(csv_file, "rb") as f: + with open(csv_file, "rb") as f: data = f.read(5) if data.startswith(b"\xEF\xBB\xBF"): # UTF-8 with a "BOM" (normally no BOM in utf-8) return ["utf-8-sig"] else: # in Windows, guessing utf-8 doesn't work, so we have to try try: - with io.open(csv_file, encoding="utf-8") as f: + with open(csv_file, encoding="utf-8") as f: preview = f.read(222222) return ["utf-8"] except: From 2a6fbd9d701177a3ac26e2704dd49befd148a42e Mon Sep 17 00:00:00 2001 From: stonebig Date: Tue, 8 Apr 2025 23:14:36 +0200 Subject: [PATCH 131/305] small simplification --- winpython/wppm.py | 19 ++++++------------- 1 file changed, 6 insertions(+), 13 deletions(-) diff --git a/winpython/wppm.py b/winpython/wppm.py index 9d13b195..7e55f72a 100644 --- a/winpython/wppm.py +++ b/winpython/wppm.py @@ -1,15 +1,11 @@ # -*- coding: utf-8 -*- # +# WinPython Package Manager # Copyright © 2012 Pierre Raybaut +# Copyright © 2014-2025+ The Winpython development team https://github.com/winpython/ # Licensed under the terms of the MIT License # (see winpython/__init__.py for details) -""" -WinPython Package Manager - -Created on Fri Aug 03 14:32:26 2012 -""" - import os from pathlib import Path import shutil @@ -22,15 +18,14 @@ # Local imports from winpython import utils, piptree - # Workaround for installing PyVISA on Windows from source: os.environ["HOME"] = os.environ["USERPROFILE"] class Package: "standardize a Package from filename or pip list" - def __init__(self, fname, suggested_summary=None): + def __init__(self, fname, suggested_summary=None): self.fname = fname - self.description = piptree.sum_up(suggested_summary) if suggested_summary else "" + self.description = piptree.sum_up(suggested_summary) if suggested_summary else "" self.name = None self.version = None if fname.endswith((".zip", ".tar.gz", ".whl")): @@ -39,14 +34,12 @@ def __init__(self, fname, suggested_summary=None): if infos is not None: self.name, self.version = infos self.name = utils.normalize(self.name) - self.url = None + self.url = f"https://pypi.org/project/{self.name}" self.files = [] - setattr(self,'url',"https://pypi.org/project/" + self.name) - def __str__(self): return f"{self.name} {self.version}\r\n{self.description}\r\nWebsite: {self.url}" - + class Distribution: def __init__(self, target=None, verbose=False): From 649907ec907d74bb425931471391d5b6695a9c3b Mon Sep 17 00:00:00 2001 From: stonebig Date: Tue, 8 Apr 2025 23:52:01 +0200 Subject: [PATCH 132/305] simplify a bit --- winpython/wppm.py | 102 ++++++++-------------------------------------- 1 file changed, 18 insertions(+), 84 deletions(-) diff --git a/winpython/wppm.py b/winpython/wppm.py index 7e55f72a..63eaa68f 100644 --- a/winpython/wppm.py +++ b/winpython/wppm.py @@ -26,14 +26,12 @@ class Package: def __init__(self, fname, suggested_summary=None): self.fname = fname self.description = piptree.sum_up(suggested_summary) if suggested_summary else "" - self.name = None - self.version = None + self.name, self.version = None, None if fname.endswith((".zip", ".tar.gz", ".whl")): bname = Path(self.fname).name #wheel style name like "sqlite_bro-1.0.0..." infos = utils.get_source_package_infos(bname) # get name, version - if infos is not None: - self.name, self.version = infos - self.name = utils.normalize(self.name) + if infos: + self.name, self.version = utils.normalize(infos[0]), infos[1] self.url = f"https://pypi.org/project/{self.name}" self.files = [] @@ -67,14 +65,7 @@ def remove_directory(self, path): except WindowsError: self.to_be_removed.append(path) - def copy_files( - self, - package, - targetdir, - srcdir, - dstdir, - create_bat_files=False, - ): + def copy_files(self, package, targetdir, srcdir, dstdir, create_bat_files=False): """Add copy task""" srcdir = str(Path(targetdir) / srcdir) if not Path(srcdir).is_dir(): @@ -148,29 +139,16 @@ def find_package(self, name): if utils.normalize(pack.name) == utils.normalize(name): return pack - def patch_all_shebang( - self, - to_movable=True, - max_exe_size=999999, - targetdir="", - ): + def patch_all_shebang(self, to_movable=True, max_exe_size=999999, targetdir=""): """make all python launchers relatives""" import glob for ffname in glob.glob(r"%s\Scripts\*.exe" % self.target): size = os.path.getsize(ffname) if size <= max_exe_size: - utils.patch_shebang_line( - ffname, - to_movable=to_movable, - targetdir=targetdir, - ) + utils.patch_shebang_line(ffname, to_movable=to_movable, targetdir=targetdir) for ffname in glob.glob(r"%s\Scripts\*.py" % self.target): - utils.patch_shebang_line_py( - ffname, - to_movable=to_movable, - targetdir=targetdir, - ) + utils.patch_shebang_line_py(ffname, to_movable=to_movable, targetdir=targetdir) def install(self, package, install_options=None): """Install package in distribution""" @@ -187,27 +165,12 @@ def do_pip_action(self, actions=None, install_options=None): my_actions = actions or [] executing = str(Path(self.target).parent / "scripts" / "env.bat") if Path(executing).is_file(): - complement = [ - r"&&", - "cd", - "/D", - self.target, - r"&&", - utils.get_python_executable(self.target), - # Before PyPy: osp.join(self.target, 'python.exe') - ] - complement += ["-m", "pip"] + complement = [r"&&", "cd", "/D", self.target, r"&&", utils.get_python_executable(self.target)] else: executing = utils.get_python_executable(self.target) - # Before PyPy: osp.join(self.target, 'python.exe') - complement = ["-m", "pip"] + complement = ["-m", "pip"] try: - fname = utils.do_script( - this_script=None, - python_exe=executing, - verbose=self.verbose, - install_options=complement + my_actions + my_list, - ) + fname = utils.do_script(this_script=None, python_exe=executing, verbose=self.verbose, install_options=complement + my_actions + my_list) except RuntimeError: if not self.verbose: print("Failed!") @@ -306,31 +269,14 @@ def create_pybat( def handle_specific_packages(self, package): """Packages requiring additional configuration""" - if package.name.lower() in ( - "pyqt4", - "pyqt5", - "pyside2", - ): + if package.name.lower() in ("pyqt4", "pyqt5", "pyside2"): # Qt configuration file (where to find Qt) name = "qt.conf" contents = """[Paths] Prefix = . Binaries = .""" - self.create_file( - package, - name, - str(Path("Lib") / "site-packages" / package.name), - contents, - ) - self.create_file( - package, - name, - ".", - contents.replace( - ".", - f"./Lib/site-packages/{package.name}", - ), - ) + self.create_file(package, name, str(Path("Lib") / "site-packages" / package.name), contents) + self.create_file(package, name, ".", contents.replace(".", f"./Lib/site-packages/{package.name}")) # pyuic script if package.name.lower() == "pyqt5": # see http://code.activestate.com/lists/python-list/666469/ @@ -344,27 +290,15 @@ def handle_specific_packages(self, package): # PyPy adaption: python.exe or pypy3.exe my_exec = Path(utils.get_python_executable(self.target)).name tmp_string = tmp_string.replace("python.exe", my_exec) - - self.create_file( - package, - f"pyuic{package.name[-1]}.bat", - "Scripts", - tmp_string.replace("package.name", package.name), - ) + self.create_file(package, f"pyuic{package.name[-1]}.bat", "Scripts", tmp_string.replace("package.name", package.name)) # Adding missing __init__.py files (fixes Issue 8) uic_path = str(Path("Lib") / "site-packages" / package.name / "uic") for dirname in ("Loader", "port_v2", "port_v3"): - self.create_file( - package, - "__init__.py", - str(Path(uic_path) / dirname), - "", - ) + self.create_file(package, "__init__.py", str(Path(uic_path) / dirname), "") def _print(self, package, action): - """Print package-related action text (e.g. 'Installing') - indicating progress""" - text = " ".join([action, package.name, package.version]) + """Print package-related action text (e.g. 'Installing')""" + text = f"{action} {package.name} {package.version}" if self.verbose: utils.print_box(text) else: @@ -572,7 +506,7 @@ def main(test=False): title = f"** Package: {l[0]} **" print("\n"+"*"*len(title), f"\n{title}", "\n"+"*"*len(title) ) for key, value in pip.raw[l[0]].items(): - rawtext=json.dumps(value, indent=2, ensure_ascii=False) + rawtext = json.dumps(value, indent=2, ensure_ascii=False) lines = [l for l in rawtext.split(r"\n") if len(l.strip()) > 2] if key.lower() != 'description' or args.verbose==True: print(f"{key}: ", "\n".join(lines).replace('"', "")) From a3ec835296c8535bc28534303de717d974672fb1 Mon Sep 17 00:00:00 2001 From: stonebig Date: Thu, 10 Apr 2025 14:08:45 +0200 Subject: [PATCH 133/305] small simplification --- winpython/wppm.py | 126 ++++++++++++++++++++++------------------------ 1 file changed, 59 insertions(+), 67 deletions(-) diff --git a/winpython/wppm.py b/winpython/wppm.py index 63eaa68f..3f9aa29a 100644 --- a/winpython/wppm.py +++ b/winpython/wppm.py @@ -22,8 +22,8 @@ os.environ["HOME"] = os.environ["USERPROFILE"] class Package: - "standardize a Package from filename or pip list" - def __init__(self, fname, suggested_summary=None): + """Standardize a Package from filename or pip list.""" + def __init__(self, fname: str, suggested_summary: str = None): self.fname = fname self.description = piptree.sum_up(suggested_summary) if suggested_summary else "" self.name, self.version = None, None @@ -40,33 +40,32 @@ def __str__(self): class Distribution: - def __init__(self, target=None, verbose=False): - # if no target path given, take the current python interpreter one - self.target = target or os.path.dirname(sys.executable) + """Handles operations on a WinPython distribution.""" + def __init__(self, target: str = None, verbose: bool = False): + self.target = target or os.path.dirname(sys.executable) # Default target more explicit self.verbose = verbose self.pip = None - self.to_be_removed = [] # list of directories to be removed later - self.version, self.architecture = utils.get_python_infos(target) - # name of the exe (python.exe or pypy3.exe) + self.to_be_removed = [] + self.version, self.architecture = utils.get_python_infos(self.target) self.short_exe = Path(utils.get_python_executable(self.target)).name def clean_up(self): - """Remove directories which couldn't be removed when building""" + """Remove directories that were marked for removal.""" for path in self.to_be_removed: try: shutil.rmtree(path, onexc=utils.onerror) - except WindowsError: - print(f"Directory {path} could not be removed", file=sys.stderr) + except OSError as e: + print(f"Error: Could not remove directory {path}: {e}", file=sys.stderr) - def remove_directory(self, path): - """Try to remove directory -- on WindowsError, remove it later""" + def remove_directory(self, path: str): + """Try to remove a directory, add to removal list on failure.""" try: shutil.rmtree(path) - except WindowsError: + except OSError: self.to_be_removed.append(path) - def copy_files(self, package, targetdir, srcdir, dstdir, create_bat_files=False): - """Add copy task""" + def copy_files(self, package: Package, targetdir: str, srcdir: str, dstdir: str, create_bat_files: bool = False): + """Copy files from srcdir to dstdir within the target distribution.""" srcdir = str(Path(targetdir) / srcdir) if not Path(srcdir).is_dir(): return @@ -112,8 +111,8 @@ def create_file(self, package, name, dstdir, contents): fd.write(contents) package.files.append(dst) - def get_installed_packages(self, update=False): - """Return installed packages""" + def get_installed_packages(self, update: bool = False) -> list[Package]: + """Return installed packages.""" # Include package installed via pip (not via WPPM) wppm = [] @@ -133,14 +132,14 @@ def get_installed_packages(self, update=False): ] return sorted(wppm, key=lambda tup: tup.name.lower()) - def find_package(self, name): - """Find installed package""" + def find_package(self, name: str) -> Package | None: + """Find installed package by name.""" for pack in self.get_installed_packages(): if utils.normalize(pack.name) == utils.normalize(name): return pack - def patch_all_shebang(self, to_movable=True, max_exe_size=999999, targetdir=""): - """make all python launchers relatives""" + def patch_all_shebang(self, to_movable: bool = True, max_exe_size: int = 999999, targetdir: str = ""): + """Make all python launchers relative.""" import glob for ffname in glob.glob(r"%s\Scripts\*.exe" % self.target): @@ -150,10 +149,9 @@ def patch_all_shebang(self, to_movable=True, max_exe_size=999999, targetdir=""): for ffname in glob.glob(r"%s\Scripts\*.py" % self.target): utils.patch_shebang_line_py(ffname, to_movable=to_movable, targetdir=targetdir) - def install(self, package, install_options=None): - """Install package in distribution""" - # wheel addition - if package.fname.endswith((".whl", ".tar.gz", ".zip")): + def install(self, package: Package, install_options: list[str] = None): # Type hint install_options + """Install package in distribution.""" + if package.fname.endswith((".whl", ".tar.gz", ".zip")): # Check extension with tuple self.install_bdist_direct(package, install_options=install_options) self.handle_specific_packages(package) # minimal post-install actions @@ -206,9 +204,7 @@ def patch_standard_packages(self, package_name="", to_movable=True): # sheb_mov2 = tried way, but doesn't work for pip (at least) sheb_fix = " executable = get_executable()" sheb_mov1 = " executable = os.path.join(os.path.basename(get_executable()))" - sheb_mov2 = ( - " executable = os.path.join('..',os.path.basename(get_executable()))" - ) + sheb_mov2 = " executable = os.path.join('..',os.path.basename(get_executable()))" # Adpating to PyPy the_place = site_package_place + r"pip\_vendor\distlib\scripts.py" @@ -240,30 +236,25 @@ def patch_standard_packages(self, package_name="", to_movable=True): else: self.create_pybat(package_name.lower()) - def create_pybat( - self, - names="", - contents=r"""@echo off + + def create_pybat(self, names="", contents=r"""@echo off ..\python "%~dpn0" %*""", ): """Create launcher batch script when missing""" - scriptpy = str(Path(self.target) / "Scripts") # std Scripts of python - - # PyPy has no initial Scipts directory - if not Path(scriptpy).is_dir(): - os.mkdir(scriptpy) + scriptpy = Path(self.target) / "Scripts" # std Scripts of python + os.makedirs(scriptpy, exist_ok=True) if not list(names) == names: my_list = [f for f in os.listdir(scriptpy) if "." not in f and f.startswith(names)] else: my_list = names for name in my_list: - if Path(scriptpy).is_dir() and (Path(scriptpy) / name).is_file(): + if scriptpy.is_dir() and (scriptpy / name).is_file(): if ( - not (Path(scriptpy) / (name + ".exe")).is_file() - and not (Path(scriptpy) / (name + ".bat")).is_file() + not (scriptpy / (name + ".exe")).is_file() + and not (scriptpy / (name + ".bat")).is_file() ): - with open(Path(scriptpy) / (name + ".bat"), "w") as fd: + with open(scriptpy / (name + ".bat"), "w") as fd: fd.write(contents) fd.close() @@ -272,9 +263,7 @@ def handle_specific_packages(self, package): if package.name.lower() in ("pyqt4", "pyqt5", "pyside2"): # Qt configuration file (where to find Qt) name = "qt.conf" - contents = """[Paths] -Prefix = . -Binaries = .""" + contents = """[Paths]\nPrefix = .\nBinaries = .""" self.create_file(package, name, str(Path("Lib") / "site-packages" / package.name), contents) self.create_file(package, name, ".", contents.replace(".", f"./Lib/site-packages/{package.name}")) # pyuic script @@ -296,13 +285,14 @@ def handle_specific_packages(self, package): for dirname in ("Loader", "port_v2", "port_v3"): self.create_file(package, "__init__.py", str(Path(uic_path) / dirname), "") - def _print(self, package, action): - """Print package-related action text (e.g. 'Installing')""" + + def _print(self, package: Package, action: str): + """Print package-related action text.""" text = f"{action} {package.name} {package.version}" if self.verbose: utils.print_box(text) else: - print(" " + text + "...", end=" ") + print(f" {text}...", end=" ") def _print_done(self): """Print OK at the end of a process""" @@ -318,6 +308,7 @@ def uninstall(self, package): subprocess.call([this_exec, "-m", "pip", "uninstall", package.name, "-y"], cwd=self.target) self._print_done() + def install_bdist_direct(self, package, install_options=None): """Install a package directly !""" self._print(package,f"Installing {package.fname.split('.')[-1]}") @@ -335,7 +326,9 @@ def install_bdist_direct(self, package, install_options=None): package = Package(fname) self._print_done() - def install_script(self, script, install_options=None): + + def install_script(self, script: str, install_options: list[str] = None): # Type hint install_options + """Install a script using pip.""" try: fname = utils.do_script( script, @@ -343,10 +336,12 @@ def install_script(self, script, install_options=None): verbose=self.verbose, install_options=install_options, ) - except RuntimeError: + except RuntimeError as e: # Catch specific RuntimeError if not self.verbose: print("Failed!") - raise + raise # Re-raise if not verbose + else: + print(f"Script installation failed: {e}") # Print error if verbose def main(test=False): @@ -415,7 +410,7 @@ def main(test=False): const=True, default=False, help=f"list packages matching the given [optionnal] package expression: wppm -ls, wppm -ls pand", - ) + ) parser.add_argument( "-p", dest="pipdown", @@ -473,9 +468,8 @@ def main(test=False): ) args = parser.parse_args() targetpython = None - if args.target and not args.target==sys.prefix: - targetpython = args.target if args.target[-4:] == '.exe' else str(Path(args.target) / 'python.exe') - # print(targetpython.resolve() to check) + if args.target and args.target != sys.prefix: + targetpython = args.target if args.target.lower().endswith('.exe') else str(Path(args.target) / 'python.exe') if args.install and args.uninstall: raise RuntimeError("Incompatible arguments: --install and --uninstall") if args.registerWinPython and args.unregisterWinPython: @@ -492,37 +486,36 @@ def main(test=False): sys.exit() elif args.list: pip = piptree.PipData(targetpython) - todo = [l for l in pip.pip_list(full=True) if bool(re.search(args.fname, l[0])) ] - titles = [['Package', 'Version', 'Summary'],['_' * max(x, 6) for x in utils.columns_width(todo)]] + todo = [l for l in pip.pip_list(full=True) if bool(re.search(args.fname, l[0]))] + titles = [['Package', 'Version', 'Summary'], ['_' * max(x, 6) for x in utils.columns_width(todo)]] listed = utils.formatted_list(titles + todo, max_width=70) for p in listed: print(*p) sys.exit() elif args.all: pip = piptree.PipData(targetpython) - todo = [l for l in pip.pip_list(full=True) if bool(re.search(args.fname, l[0])) ] + todo = [l for l in pip.pip_list(full=True) if bool(re.search(args.fname, l[0]))] for l in todo: # print(pip.distro[l[0]]) title = f"** Package: {l[0]} **" - print("\n"+"*"*len(title), f"\n{title}", "\n"+"*"*len(title) ) + print("\n" + "*" * len(title), f"\n{title}", "\n" + "*" * len(title)) for key, value in pip.raw[l[0]].items(): rawtext = json.dumps(value, indent=2, ensure_ascii=False) lines = [l for l in rawtext.split(r"\n") if len(l.strip()) > 2] - if key.lower() != 'description' or args.verbose==True: + if key.lower() != 'description' or args.verbose: print(f"{key}: ", "\n".join(lines).replace('"', "")) - sys.exit() + sys.exit() if args.registerWinPython: print(registerWinPythonHelp) if utils.is_python_distribution(args.target): dist = Distribution(args.target) else: - raise WindowsError(f"Invalid Python distribution {args.target}") + raise OSError(f"Invalid Python distribution {args.target}") print(f"registering {args.target}") print("continue ? Y/N") theAnswer = input() if theAnswer == "Y": from winpython import associate - associate.register(dist.target, verbose=args.verbose) sys.exit() if args.unregisterWinPython: @@ -530,13 +523,12 @@ def main(test=False): if utils.is_python_distribution(args.target): dist = Distribution(args.target) else: - raise WindowsError(f"Invalid Python distribution {args.target}") + raise OSError(f"Invalid Python distribution {args.target}") print(f"unregistering {args.target}") print("continue ? Y/N") theAnswer = input() if theAnswer == "Y": from winpython import associate - associate.unregister(dist.target, verbose=args.verbose) sys.exit() elif not args.install and not args.uninstall: @@ -546,7 +538,7 @@ def main(test=False): parser.print_help() sys.exit() else: - raise IOError(f"File not found: {args.fname}") + raise FileNotFoundError(f"File not found: {args.fname}") if utils.is_python_distribution(args.target): dist = Distribution(args.target, verbose=True) try: @@ -560,7 +552,7 @@ def main(test=False): except NotImplementedError: raise RuntimeError("Package is not (yet) supported by WPPM") else: - raise WindowsError(f"Invalid Python distribution {args.target}") + raise OSError(f"Invalid Python distribution {args.target}") if __name__ == "__main__": From 57f7007e3cf46b6574327d8cc643108ed1f34f3b Mon Sep 17 00:00:00 2001 From: stonebig Date: Thu, 10 Apr 2025 14:34:47 +0200 Subject: [PATCH 134/305] remove no more used functions --- winpython/wppm.py | 65 +++++------------------------------------------ 1 file changed, 6 insertions(+), 59 deletions(-) diff --git a/winpython/wppm.py b/winpython/wppm.py index 3f9aa29a..cd08e107 100644 --- a/winpython/wppm.py +++ b/winpython/wppm.py @@ -64,43 +64,6 @@ def remove_directory(self, path: str): except OSError: self.to_be_removed.append(path) - def copy_files(self, package: Package, targetdir: str, srcdir: str, dstdir: str, create_bat_files: bool = False): - """Copy files from srcdir to dstdir within the target distribution.""" - srcdir = str(Path(targetdir) / srcdir) - if not Path(srcdir).is_dir(): - return - offset = len(srcdir) + len(os.pathsep) - for dirpath, dirnames, filenames in os.walk(srcdir): - for dname in dirnames: - t_dname = str(Path(dirpath) / dname)[offset:] - src = str(Path(srcdir) / t_dname) - dst = str(Path(dstdir) / t_dname) - if self.verbose: - print(f"mkdir: {dst}") - full_dst = str(Path(self.target) / dst) - if not Path(full_dst).exists(): - os.mkdir(full_dst) - package.files.append(dst) - for fname in filenames: - t_fname = str(Path(dirpath) / fname)[offset:] - src = str(Path(srcdir) / t_fname) - dst = fname if dirpath.endswith("_system32") else str(Path(dstdir) / t_fname) - if self.verbose: - print(f"file: {dst}") - full_dst = str(Path(self.target) / dst) - shutil.move(src, full_dst) - package.files.append(dst) - name, ext = Path(dst).stem, Path(dst).suffix - if create_bat_files and ext in ("", ".py"): - dst = name + ".bat" - if self.verbose: - print(f"file: {dst}") - full_dst = str(Path(self.target) / dst) - fd = open(full_dst, "w") - fd.write(f"""@echo off\npython "%~dpn0{ext}" %*""") - fd.close() - package.files.append(dst) - def create_file(self, package, name, dstdir, contents): """Generate data file -- path is relative to distribution root dir""" dst = str(Path(dstdir) / name) @@ -157,8 +120,8 @@ def install(self, package: Package, install_options: list[str] = None): # Type h # minimal post-install actions self.patch_standard_packages(package.name) - def do_pip_action(self, actions=None, install_options=None): - """Do pip action in a distribution""" + def do_pip_action(self, actions: list[str] = None, install_options: list[str] = None): + """Execute pip action in the distribution.""" my_list = install_options or [] my_actions = actions or [] executing = str(Path(self.target).parent / "scripts" / "env.bat") @@ -169,10 +132,12 @@ def do_pip_action(self, actions=None, install_options=None): complement = ["-m", "pip"] try: fname = utils.do_script(this_script=None, python_exe=executing, verbose=self.verbose, install_options=complement + my_actions + my_list) - except RuntimeError: + except RuntimeError as e: if not self.verbose: print("Failed!") raise + else: + print(f"Pip action failed with error: {e}") # Print error if verbose def patch_standard_packages(self, package_name="", to_movable=True): """patch Winpython packages in need""" @@ -256,7 +221,6 @@ def create_pybat(self, names="", contents=r"""@echo off ): with open(scriptpy / (name + ".bat"), "w") as fd: fd.write(contents) - fd.close() def handle_specific_packages(self, package): """Packages requiring additional configuration""" @@ -302,7 +266,7 @@ def _print_done(self): def uninstall(self, package): """Uninstall package from distribution""" self._print(package, "Uninstalling") - if not package.name == "pip": + if package.name != "pip": # trick to get true target (if not current) this_exec = utils.get_python_executable(self.target) # PyPy ! subprocess.call([this_exec, "-m", "pip", "uninstall", package.name, "-y"], cwd=self.target) @@ -327,23 +291,6 @@ def install_bdist_direct(self, package, install_options=None): self._print_done() - def install_script(self, script: str, install_options: list[str] = None): # Type hint install_options - """Install a script using pip.""" - try: - fname = utils.do_script( - script, - python_exe=utils.get_python_executable(self.target), # PyPy3 ! - verbose=self.verbose, - install_options=install_options, - ) - except RuntimeError as e: # Catch specific RuntimeError - if not self.verbose: - print("Failed!") - raise # Re-raise if not verbose - else: - print(f"Script installation failed: {e}") # Print error if verbose - - def main(test=False): if test: sbdir = str(Path(__file__).parents[0].parent.parent.parent / "sandbox") From c13b4f0c40ae17c471508646f60f56dc28acad62 Mon Sep 17 00:00:00 2001 From: stonebig Date: Fri, 11 Apr 2025 19:18:51 +0200 Subject: [PATCH 135/305] fix a premature optimization, and remove further dead wood --- winpython/wppm.py | 29 ++--------------------------- 1 file changed, 2 insertions(+), 27 deletions(-) diff --git a/winpython/wppm.py b/winpython/wppm.py index cd08e107..e857f252 100644 --- a/winpython/wppm.py +++ b/winpython/wppm.py @@ -126,10 +126,10 @@ def do_pip_action(self, actions: list[str] = None, install_options: list[str] = my_actions = actions or [] executing = str(Path(self.target).parent / "scripts" / "env.bat") if Path(executing).is_file(): - complement = [r"&&", "cd", "/D", self.target, r"&&", utils.get_python_executable(self.target)] + complement = [r"&&", "cd", "/D", self.target, r"&&", utils.get_python_executable(self.target), "-m", "pip"] else: executing = utils.get_python_executable(self.target) - complement = ["-m", "pip"] + complement = ["-m", "pip"] try: fname = utils.do_script(this_script=None, python_exe=executing, verbose=self.verbose, install_options=complement + my_actions + my_list) except RuntimeError as e: @@ -195,32 +195,7 @@ def patch_standard_packages(self, package_name="", to_movable=True): "'check_updates_on_startup': True,", "'check_updates_on_startup': False,", ) - # workaround bad installers - if package_name.lower() == "numba": - self.create_pybat(["numba"]) - else: - self.create_pybat(package_name.lower()) - - def create_pybat(self, names="", contents=r"""@echo off -..\python "%~dpn0" %*""", - ): - """Create launcher batch script when missing""" - - scriptpy = Path(self.target) / "Scripts" # std Scripts of python - os.makedirs(scriptpy, exist_ok=True) - if not list(names) == names: - my_list = [f for f in os.listdir(scriptpy) if "." not in f and f.startswith(names)] - else: - my_list = names - for name in my_list: - if scriptpy.is_dir() and (scriptpy / name).is_file(): - if ( - not (scriptpy / (name + ".exe")).is_file() - and not (scriptpy / (name + ".bat")).is_file() - ): - with open(scriptpy / (name + ".bat"), "w") as fd: - fd.write(contents) def handle_specific_packages(self, package): """Packages requiring additional configuration""" From f31281b1d2741e708b4dc09ae9bbaac3b7895f77 Mon Sep 17 00:00:00 2001 From: stonebig Date: Sat, 12 Apr 2025 11:09:18 +0200 Subject: [PATCH 136/305] fix build failing to deactivate spyder update --- generate_a_winpython_distro.bat | 3 ++- winpython/wppm.py | 37 ++++++++++----------------------- 2 files changed, 13 insertions(+), 27 deletions(-) diff --git a/generate_a_winpython_distro.bat b/generate_a_winpython_distro.bat index 59102fed..3193b53f 100644 --- a/generate_a_winpython_distro.bat +++ b/generate_a_winpython_distro.bat @@ -2,7 +2,7 @@ rem generate_a_winpython_distro.bat: to be launched from a winpython directory, @echo on REM Initialize variables -if "%my_release_level%"=="" set my_release_level=b2 +if "%my_release_level%"=="" set my_release_level=b3 if "%my_create_installer%"=="" set my_create_installer=True rem Set archive directory and log file @@ -99,6 +99,7 @@ echo -------------------------------------- >>%my_archive_log% echo "(%date% %time%) Add requirement packages">>%my_archive_log% echo -------------------------------------- >>%my_archive_log% python -m pip install -r %my_requirements% -c %my_constraints% --pre --no-index --trusted-host=None --find-links=%my_find_links% >>%my_archive_log% +python -c "from winpython import wppm;dist=wppm.Distribution(r'%WINPYDIR%');dist.patch_standard_packages('spyder', to_movable=True)" REM Archive success echo -------------------------------------- >>%my_archive_log% diff --git a/winpython/wppm.py b/winpython/wppm.py index e857f252..71486b94 100644 --- a/winpython/wppm.py +++ b/winpython/wppm.py @@ -143,23 +143,14 @@ def patch_standard_packages(self, package_name="", to_movable=True): """patch Winpython packages in need""" import filecmp - # Adpating to PyPy - if "pypy3" in Path(utils.get_python_executable(self.target)).name: - site_package_place = "\\site-packages\\" - else: - site_package_place = "\\Lib\\site-packages\\" # 'pywin32' minimal post-install (pywin32_postinstall.py do too much) if package_name.lower() == "pywin32" or package_name == "": - origin = self.target + site_package_place + "pywin32_system32" - - destin = self.target - if Path(origin).is_dir(): + origin = Path(self.target) / "site-packages" / "pywin32_system32" + destin = Path(self.target) + if origin.is_dir(): for name in os.listdir(origin): - here, there = ( - str(Path(origin) / name), - str(Path(destin) / name), - ) - if not Path(there).exists() or not filecmp.cmp(here, there): + here, there = (origin / name), (destin / name) + if not there.exists() or not filecmp.cmp(here, there): shutil.copyfile(here, there) # 'pip' to do movable launchers (around line 100) !!!! # rational: https://github.com/pypa/pip/issues/2328 @@ -171,27 +162,21 @@ def patch_standard_packages(self, package_name="", to_movable=True): sheb_mov1 = " executable = os.path.join(os.path.basename(get_executable()))" sheb_mov2 = " executable = os.path.join('..',os.path.basename(get_executable()))" - # Adpating to PyPy - the_place = site_package_place + r"pip\_vendor\distlib\scripts.py" + the_place = Path(self.target ) / "lib" / "site-packages" / "pip" / "_vendor" / "distlib" / "scripts.py" print(the_place) if to_movable: - utils.patch_sourcefile(self.target + the_place, sheb_fix, sheb_mov1) - utils.patch_sourcefile(self.target + the_place, sheb_mov2, sheb_mov1) + utils.patch_sourcefile(the_place, sheb_fix, sheb_mov1) + utils.patch_sourcefile(the_place, sheb_mov2, sheb_mov1) else: - utils.patch_sourcefile(self.target + the_place, sheb_mov1, sheb_fix) - utils.patch_sourcefile(self.target + the_place, sheb_mov2, sheb_fix) + utils.patch_sourcefile(the_place, sheb_mov1, sheb_fix) + utils.patch_sourcefile(the_place, sheb_mov2, sheb_fix) # create movable launchers for previous package installations self.patch_all_shebang(to_movable=to_movable) if package_name.lower() == "spyder" or package_name == "": # spyder don't goes on internet without I ask utils.patch_sourcefile( - self.target + (site_package_place + r"spyderlib\config\main.py"), - "'check_updates_on_startup': True,", - "'check_updates_on_startup': False,", - ) - utils.patch_sourcefile( - self.target + (site_package_place + r"spyder\config\main.py"), + Path(self.target) / "lib" / "site-packages" / "spyder" / "config" /"main.py", "'check_updates_on_startup': True,", "'check_updates_on_startup': False,", ) From 2181c4fec7d6ecde49b097bba52556f1f91bcdf0 Mon Sep 17 00:00:00 2001 From: stonebig Date: Sat, 12 Apr 2025 12:12:26 +0200 Subject: [PATCH 137/305] update version as tweaks/fix recently --- winpython/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/winpython/__init__.py b/winpython/__init__.py index 780c2b5d..b1267b4e 100644 --- a/winpython/__init__.py +++ b/winpython/__init__.py @@ -28,6 +28,6 @@ OTHER DEALINGS IN THE SOFTWARE. """ -__version__ = '15.1.20250405' +__version__ = '15.2.20250412' __license__ = __doc__ __project_url__ = 'http://winpython.github.io/' From 5e1a8f25294ed197aa732df3a21d93aa0b86ab4e Mon Sep 17 00:00:00 2001 From: stonebig Date: Sat, 12 Apr 2025 12:40:06 +0200 Subject: [PATCH 138/305] fixup in version --- generate_a_winpython_distro.bat | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/generate_a_winpython_distro.bat b/generate_a_winpython_distro.bat index 3193b53f..7fdbc12f 100644 --- a/generate_a_winpython_distro.bat +++ b/generate_a_winpython_distro.bat @@ -26,8 +26,8 @@ if "%target_python_exe%"=="" set target_python_exe=python.exe rem Set Python target release based on my_python_target if %my_python_target%==311 set my_python_target_release=3119& set my_release=1 -if %my_python_target%==312 set my_python_target_release=3129& set my_release=1 -if %my_python_target%==313 set my_python_target_release=3132& set my_release=1 +if %my_python_target%==312 set my_python_target_release=31210& set my_release=0 +if %my_python_target%==313 set my_python_target_release=3133& set my_release=0 if %my_python_target%==314 set my_python_target_release=3140& set my_release=0 echo -------------------------------------- >>%my_archive_log% From b7f1e21795242b8fa7622fbfcdd49b57f97e4fe3 Mon Sep 17 00:00:00 2001 From: stonebig Date: Sun, 13 Apr 2025 15:07:20 +0200 Subject: [PATCH 139/305] carefully picked tweaks from Mistral AI --- make.py | 68 ++++++++++++++++++++++++--------------------------------- 1 file changed, 28 insertions(+), 40 deletions(-) diff --git a/make.py b/make.py index 0be98caa..de329f90 100644 --- a/make.py +++ b/make.py @@ -46,14 +46,13 @@ def build_installer_7zip(script_template_path: Path, output_script_path: Path, r ("PORTABLE_DIR=", f"PORTABLE_DIR={PORTABLE_DIRECTORY}& rem "), ("SEVENZIP_EXE=", f"SEVENZIP_EXE={find_7zip_executable()}& rem "), ] + [(f"{a}=", f"{a}={b}& rem ") for a, b in replacements] - + utils.replace_in_file(script_template_path, data_to_replace, output_script_path) try: # Execute the generated 7-Zip script, with stdout=sys.stderr to see 7zip compressing - command = f'"{output_script_path}"' - print(f"Executing 7-Zip script: {command}") - subprocess.run(command, shell=True, check=True, stderr=sys.stderr, stdout=sys.stderr) + print(f'Executing 7-Zip script: "{output_script_path}"') + subprocess.run(f'"{output_script_path}"', shell=True, check=True, stderr=sys.stderr, stdout=sys.stderr) except subprocess.CalledProcessError as e: print(f"Error executing 7-Zip script: {e}", file=sys.stderr) @@ -76,11 +75,9 @@ def copy_items(source_directories: list[Path], target_directory: Path, verbose: def parse_list_argument(argument_value: str | list[str], separator=" ") -> list[str]: """Parse a separated list argument into a list of strings.""" - if argument_value is None: + if not argument_value: return [] - if isinstance(argument_value, str): - return argument_value.split(separator) - return list(argument_value) + return argument_value.split(separator) if isinstance(argument_value, str) else list(argument_value) class WinPythonDistributionBuilder: """Builds a WinPython distribution.""" @@ -163,20 +160,17 @@ def _get_installed_tools_markdown(self) -> str: def get_tool_path(relative_path): path = self.winpython_directory / relative_path if self.winpython_directory else None - return path if path and (path.is_file() or path.is_dir()) else None + return path if path and path.exists() else None if nodejs_path := get_tool_path(self.NODEJS_RELATIVE_PATH): - node_version = utils.get_nodejs_version(nodejs_path) - npm_version = utils.get_npmjs_version(nodejs_path) - installed_tools += [("Nodejs", node_version), ("npmjs", npm_version)] + installed_tools.append(("Nodejs", utils.get_nodejs_version(nodejs_path))) + installed_tools.append(("npmjs", utils.get_npmjs_version(nodejs_path))) - if pandoc_executable := get_tool_path("t/pandoc.exe"): - pandoc_version = utils.get_pandoc_version(str(pandoc_executable.parent)) - installed_tools.append(("Pandoc", pandoc_version)) + if pandoc_exe := get_tool_path("t/pandoc.exe"): + installed_tools.append(("Pandoc", utils.get_pandoc_version(str(pandoc_exe.parent)))) - if vscode_executable := get_tool_path("t/VSCode/Code.exe"): - vscode_version = utils.getFileProperties(str(vscode_executable))["FileVersion"] - installed_tools.append(("VSCode", vscode_version)) + if vscode_exe := get_tool_path("t/VSCode/Code.exe"): + installed_tools.append(("VSCode", utils.getFileProperties(str(vscode_exe))["FileVersion"])) tool_lines = [] for name, version in installed_tools: @@ -187,7 +181,7 @@ def get_tool_path(relative_path): def _get_installed_packages_markdown(self) -> str: """Generates Markdown for installed packages section in package index.""" - if self.distribution is None: + if not self.distribution: return "" # Distribution not initialized yet. self.installed_packages = self.distribution.get_installed_packages(update=True) package_lines = [ @@ -204,25 +198,20 @@ def winpython_version_name(self) -> str: @property def python_full_version(self) -> str: """Retrieves the Python full version string from the distribution.""" - if self.distribution is None: - return "0.0.0" # Placeholder before initialization - return utils.get_python_long_version(self.distribution.target) + return utils.get_python_long_version(self.distribution.target) if self.distribution else "0.0.0" @property def python_executable_directory(self) -> str: """Returns the directory containing the Python executable.""" - python_path_directory = self.winpython_directory / self.python_directory_name if self.winpython_directory else None - if python_path_directory and python_path_directory.is_dir(): - return str(python_path_directory) - python_path_executable = self.winpython_directory / self.python_name if self.winpython_directory else None - return str(python_path_executable) if python_path_executable else "" + if self.winpython_directory: + python_path_directory = self.winpython_directory / self.python_directory_name + return str(python_path_directory) if python_path_directory.is_dir() else str(self.winpython_directory / self.python_name) + return "" @property def architecture_bits(self) -> int: """Returns the architecture (32 or 64 bits) of the distribution.""" - if self.distribution: - return self.distribution.architecture - return 64 + return self.distribution.architecture if self.distribution else 64 def create_installer_7zip(self, installer_type: str = ".exe"): """Creates a WinPython installer using 7-Zip: ".exe", ".7z", ".zip")""" @@ -241,7 +230,6 @@ def create_installer_7zip(self, installer_type: str = ".exe"): ("RELEASELEVEL", self.release_level), ("INSTALLER_OPTION", installer_type), ] - build_installer_7zip(PORTABLE_DIRECTORY / template_name, self.target_directory / output_name, replacements) def _print_action(self, text: str): @@ -351,9 +339,9 @@ def build(self, rebuild: bool = True, requirements_files_list=None, winpy_dirnam def rebuild_winpython_package(source_directory: Path, target_directory: Path, architecture: int = 64, verbose: bool = False): """Rebuilds the winpython package from source using flit.""" - for filename in os.listdir(target_directory): - if filename.startswith("winpython-") and filename.endswith((".exe", ".whl", ".gz")): - os.remove(Path(target_directory) / filename) + for file in target_directory.glob("winpython-*"): + if file.suffix in (".exe", ".whl", ".gz"): + file.unlink() utils.buildflit_wininst(source_directory, copy_to=target_directory, verbose=verbose) def make_all(build_number: int, release_level: str, pyver: str, architecture: int, basedir: Path, @@ -391,14 +379,14 @@ def make_all(build_number: int, release_level: str, pyver: str, architecture: in find_links_dirs_list = parse_list_argument(find_links, ",") requirements_files_list = [Path(f) for f in parse_list_argument(requirements, ",") if f] find_links_options = [f"--find-links={link}" for link in find_links_dirs_list + [source_dirs]] - build_directory = str(Path(basedir) / ("bu" + flavor)) + build_directory = Path(basedir) / ("bu" + flavor) if rebuild: utils.print_box(f"Making WinPython {architecture}bits at {Path(basedir) / ('bu' + flavor)}") - os.makedirs(Path(build_directory), exist_ok=True) + os.makedirs(build_directory, exist_ok=True) # use source_dirs as the directory to re-build Winpython wheel winpython_source_dir = Path(__file__).resolve().parent - rebuild_winpython_package(winpython_source_dir, source_dirs, architecture, verbose) + rebuild_winpython_package(winpython_source_dir, Path(source_dirs), architecture, verbose) builder = WinPythonDistributionBuilder( build_number, release_level, build_directory, wheels_directory=source_dirs, @@ -420,11 +408,11 @@ def make_all(build_number: int, release_level: str, pyver: str, architecture: in builder.build(rebuild=rebuild, requirements_files_list=requirements_files_list, winpy_dirname=winpython_dirname) - if ".zip" in str(create_installer).lower(): + if ".zip" in create_installer.lower(): builder.create_installer_7zip(".zip") - if ".7z" in str(create_installer).lower(): + if ".7z" in create_installer.lower(): builder.create_installer_7zip(".7z") - if "7zip" in str(create_installer).lower(): + if "7zip" in create_installer.lower(): builder.create_installer_7zip(".exe") if __name__ == "__main__": From 26d3f24852373c616bca68b20fd9c78fbb52c17a Mon Sep 17 00:00:00 2001 From: stonebig Date: Sun, 13 Apr 2025 15:49:49 +0200 Subject: [PATCH 140/305] handpicked suggestions from Mistral AI --- winpython/utils.py | 36 +++++++++++++++--------------------- winpython/wppm.py | 35 ++++++++++++++--------------------- 2 files changed, 29 insertions(+), 42 deletions(-) diff --git a/winpython/utils.py b/winpython/utils.py index 523b6fa0..324403cc 100644 --- a/winpython/utils.py +++ b/winpython/utils.py @@ -213,7 +213,6 @@ def patch_shebang_line(fname, pad=b" ", to_movable=True, targetdir=""): """Remove absolute path to python.exe in shebang lines in binary files, or re-add it.""" target_dir = targetdir if to_movable else os.path.abspath(os.path.join(os.path.dirname(fname), r"..")) + "\\" executable = sys.executable - shebang_line = re.compile(rb"""(#!.*pythonw?\.exe)"?""") # Python3+ if "pypy3" in sys.executable: shebang_line = re.compile(rb"""(#!.*pypy3w?\.exe)"?""") # Pypy3+ @@ -239,12 +238,9 @@ def patch_shebang_line(fname, pad=b" ", to_movable=True, targetdir=""): def patch_shebang_line_py(fname, to_movable=True, targetdir=""): """Changes shebang line in '.py' file to relative or absolue path""" import fileinput - if to_movable: - exec_path = r'#!.\python.exe' - if 'pypy3' in sys.executable: # PyPy ! - exec_path = r'#!.\pypy3.exe' - else: - exec_path = '#!' + sys.executable + exec_path = r'#!.\python.exe' if to_movable else '#!' + sys.executable + if 'pypy3' in sys.executable: + exec_path = r'#!.\pypy3.exe' if to_movable else exec_path for line in fileinput.input(fname, inplace=True): if re.match(r'^#\!.*python\.exe$', line) or re.match(r'^#\!.*pypy3\.exe$', line): print(exec_path) @@ -253,18 +249,16 @@ def patch_shebang_line_py(fname, to_movable=True, targetdir=""): def guess_encoding(csv_file): """guess the encoding of the given file""" - # UTF_8_BOM = "\xEF\xBB\xBF" with open(csv_file, "rb") as f: data = f.read(5) if data.startswith(b"\xEF\xBB\xBF"): # UTF-8 with a "BOM" (normally no BOM in utf-8) return ["utf-8-sig"] - else: # in Windows, guessing utf-8 doesn't work, so we have to try - try: - with open(csv_file, encoding="utf-8") as f: - preview = f.read(222222) - return ["utf-8"] - except: - return [locale.getdefaultlocale()[1], "utf-8"] + try: + with open(csv_file, encoding="utf-8") as f: + preview = f.read(222222) + return ["utf-8"] + except: + return [locale.getdefaultlocale()[1], "utf-8"] def replace_in_file(filepath: Path, replacements: list[tuple[str, str]], filedest: Path = None, verbose=False): """ @@ -290,9 +284,9 @@ def replace_in_file(filepath: Path, replacements: list[tuple[str, str]], filedes def patch_sourcefile(fname, in_text, out_text, silent_mode=False): """Replace a string in a source file.""" if not silent_mode: - print(f"patching {fname} from {in_text} to {out_text}") - if Path(fname).is_file() and not in_text == out_text: - replace_in_file(Path(fname), [(in_text , out_text)]) + print(f"patching {fname} from {in_text} to {out_text}") + if Path(fname).is_file() and in_text != out_text: + replace_in_file(Path(fname), [(in_text, out_text)]) def _create_temp_dir(): """Create a temporary directory and remove it at exit""" @@ -324,7 +318,7 @@ def get_source_package_infos(fname): def buildflit_wininst(root, python_exe=None, copy_to=None, verbose=False): """Build Wheel from Python package located in *root* with flit.""" python_exe = python_exe or sys.executable - cmd = [python_exe, '-m' ,'flit', 'build'] + cmd = [python_exe, '-m', 'flit', 'build'] if verbose: subprocess.call(cmd, cwd=root) else: @@ -362,7 +356,7 @@ def direct_pip_install(fname, python_exe=None, verbose=False, install_options=No python_exe = python_exe or sys.executable myroot = str(Path(python_exe).parent) - cmd = [python_exe, "-m", "pip", "install"] + (install_options or []) +[fname] + cmd = [python_exe, "-m", "pip", "install"] + (install_options or []) + [fname] if not verbose: process = subprocess.Popen(cmd, cwd=myroot, stdout=subprocess.PIPE, stderr=subprocess.PIPE) stdout, stderr = process.communicate() @@ -416,7 +410,7 @@ def get_package_metadata(database, name): db = cp.ConfigParser() filepath = Path(database) if Path(database).is_absolute() else Path(DATA_PATH) / database db.read_file(open(str(filepath), encoding=guess_encoding(filepath)[0])) - + my_metadata = { "description": "", "url": f"https://pypi.org/project/{name}", diff --git a/winpython/wppm.py b/winpython/wppm.py index 71486b94..397188f9 100644 --- a/winpython/wppm.py +++ b/winpython/wppm.py @@ -144,12 +144,12 @@ def patch_standard_packages(self, package_name="", to_movable=True): import filecmp # 'pywin32' minimal post-install (pywin32_postinstall.py do too much) - if package_name.lower() == "pywin32" or package_name == "": + if package_name.lower() in ("", "pywin32"): origin = Path(self.target) / "site-packages" / "pywin32_system32" destin = Path(self.target) if origin.is_dir(): for name in os.listdir(origin): - here, there = (origin / name), (destin / name) + here, there = origin / name, destin / name if not there.exists() or not filecmp.cmp(here, there): shutil.copyfile(here, there) # 'pip' to do movable launchers (around line 100) !!!! @@ -162,7 +162,7 @@ def patch_standard_packages(self, package_name="", to_movable=True): sheb_mov1 = " executable = os.path.join(os.path.basename(get_executable()))" sheb_mov2 = " executable = os.path.join('..',os.path.basename(get_executable()))" - the_place = Path(self.target ) / "lib" / "site-packages" / "pip" / "_vendor" / "distlib" / "scripts.py" + the_place = Path(self.target) / "lib" / "site-packages" / "pip" / "_vendor" / "distlib" / "scripts.py" print(the_place) if to_movable: utils.patch_sourcefile(the_place, sheb_fix, sheb_mov1) @@ -173,7 +173,7 @@ def patch_standard_packages(self, package_name="", to_movable=True): # create movable launchers for previous package installations self.patch_all_shebang(to_movable=to_movable) - if package_name.lower() == "spyder" or package_name == "": + if package_name.lower() in ("", "spyder"): # spyder don't goes on internet without I ask utils.patch_sourcefile( Path(self.target) / "lib" / "site-packages" / "spyder" / "config" /"main.py", @@ -202,14 +202,13 @@ def handle_specific_packages(self, package): "%WINPYDIR%\python.exe" "%WINPYDIR%\Lib\site-packages\package.name\uic\pyuic.py" %1 %2 %3 %4 %5 %6 %7 %8 %9""" # PyPy adaption: python.exe or pypy3.exe my_exec = Path(utils.get_python_executable(self.target)).name - tmp_string = tmp_string.replace("python.exe", my_exec) - self.create_file(package, f"pyuic{package.name[-1]}.bat", "Scripts", tmp_string.replace("package.name", package.name)) + tmp_string = tmp_string.replace("python.exe", my_exec).replace("package.name", package.name) + self.create_file(package, f"pyuic{package.name[-1]}.bat", "Scripts", tmp_string) # Adding missing __init__.py files (fixes Issue 8) uic_path = str(Path("Lib") / "site-packages" / package.name / "uic") for dirname in ("Loader", "port_v2", "port_v3"): self.create_file(package, "__init__.py", str(Path(uic_path) / dirname), "") - def _print(self, package: Package, action: str): """Print package-related action text.""" text = f"{action} {package.name} {package.version}" @@ -232,7 +231,6 @@ def uninstall(self, package): subprocess.call([this_exec, "-m", "pip", "uninstall", package.name, "-y"], cwd=self.target) self._print_done() - def install_bdist_direct(self, package, install_options=None): """Install a package directly !""" self._print(package,f"Installing {package.fname.split('.')[-1]}") @@ -250,22 +248,17 @@ def install_bdist_direct(self, package, install_options=None): package = Package(fname) self._print_done() - def main(test=False): if test: - sbdir = str(Path(__file__).parents[0].parent.parent.parent / "sandbox") - tmpdir = str(Path(sbdir) / "tobedeleted") - - fname = str(Path(sbdir) / "VTK-5.10.0-Qt-4.7.4.win32-py2.7.exe") - print(Package(fname)) + sbdir = Path(__file__).parents[0].parent.parent.parent / "sandbox" + tmpdir = sbdir / "tobedeleted" + fname = sbdir / "VTK-5.10.0-Qt-4.7.4.win32-py2.7.exe") + print(Package(str(fname))) sys.exit() - target = str( - Path(utils.BASE_DIR) / "build" / "winpython-2.7.3" / "python-2.7.3" - ) - fname = str(Path(utils.BASE_DIR) / "packages.src" / "docutils-0.9.1.tar.gz") - - dist = Distribution(target, verbose=True) - pack = Package(fname) + target = Path(utils.BASE_DIR) / "build" / "winpython-2.7.3" / "python-2.7.3" + fname = Path(utils.BASE_DIR) / "packages.src" / "docutils-0.9.1.tar.gz" + dist = Distribution(str(target), verbose=True) + pack = Package(str(fname)) print(pack.description) # dist.install(pack) # dist.uninstall(pack) From 0c845f6120d6a414b087eb6d870d1f26e14a27fc Mon Sep 17 00:00:00 2001 From: stonebig Date: Mon, 14 Apr 2025 18:22:27 +0200 Subject: [PATCH 141/305] simplify publishing preparation --- hash.py | 11 ++++------- hash_launch.bat | 2 +- 2 files changed, 5 insertions(+), 8 deletions(-) diff --git a/hash.py b/hash.py index 525ab1f8..781b8bba 100644 --- a/hash.py +++ b/hash.py @@ -22,13 +22,9 @@ def give_hashblake(file_in, with_this): if __name__ == '__main__': if len(sys.argv) < 2: - print( - "Usage: " - + sys.argv[0] - + " github-user [github-project]" - ) + print( "Usage: hash.py files_to_copte_hash" ) exit(1) - file = sys.argv[1] + files = [str(i) for i in sys.argv[1:] if str(i)[-3:].lower() != ".py"] header = ( " MD5" @@ -53,7 +49,8 @@ def give_hashblake(file_in, with_this): print(header) print(line) - print(""+ + for file in files: + print(""+ f"{give_hash(file, hashlib.md5)} | " + f"{give_hash(file, hashlib.sha1)} | " + f"{give_hash(file, hashlib.sha256)} | " + diff --git a/hash_launch.bat b/hash_launch.bat index 08105e73..714925a4 100644 --- a/hash_launch.bat +++ b/hash_launch.bat @@ -3,6 +3,6 @@ call C:\WPy64-3890\scripts\env.bat cd %~dp0 rem echo %date% %time%>>gdc_counting.txt -python hash.py %1 >>hash_counting_%date:/=_%.txt +python hash.py %* >>hash_counting_%date:/=_%.txt start notepad.exe hash_counting_%date:/=_%.txt From 04aebb4dc04e9862e2014c5adb53f3832c5fd4eb Mon Sep 17 00:00:00 2001 From: stonebig Date: Mon, 14 Apr 2025 21:01:21 +0200 Subject: [PATCH 142/305] simplify diff.py using some copilote AI suggestions --- diff.py | 241 ++++++++++------------------------------------ winpython/wppm.py | 2 +- 2 files changed, 51 insertions(+), 192 deletions(-) diff --git a/diff.py b/diff.py index 73498001..f092437e 100644 --- a/diff.py +++ b/diff.py @@ -1,26 +1,20 @@ # -*- coding: utf-8 -*- # +# WinPython diff.py script # Copyright © 2013 Pierre Raybaut +# Copyright © 2014-2025+ The Winpython development team https://github.com/winpython/ # Licensed under the terms of the MIT License # (see winpython/__init__.py for details) -""" -WinPython diff script - -Created on Tue Jan 29 11:56:54 2013 -""" import os from pathlib import Path import re import shutil - -# Local imports from winpython import utils - -CHANGELOGS_DIR = str(Path(__file__).parent / "changelogs") -assert Path(CHANGELOGS_DIR).is_dir() +CHANGELOGS_DIR = Path(__file__).parent / "changelogs" +assert CHANGELOGS_DIR.is_dir() class Package(object): @@ -54,10 +48,7 @@ def to_wiki(self): return f" * [{self.name}]({self.url}) {self.version} ({self.description})\r\n" def upgrade_wiki(self, other): - # wheel replace '-' per '_' in package name - assert ( - self.name.replace("-", "_").lower() == other.name.replace("-", "_").lower() - ) + assert self.name.replace("-", "_").lower() == other.name.replace("-", "_").lower() return f" * [{self.name}]({self.url}) {other.version} → {self.version} ({self.description})\r\n" @@ -68,48 +59,34 @@ class PackageIndex(object): HEADER_LINE1 = "Name | Version | Description" HEADER_LINE2 = "-----|---------|------------" - def __init__( - self, - version, - basedir=None, - flavor="", - architecture=64, - ): + def __init__(self, version, basedir=None, flavor="", architecture=64): self.version = version - self.other_packages = {} - self.python_packages = {} self.flavor = flavor self.basedir = basedir self.architecture = architecture + self.other_packages = {} + self.python_packages = {} self.from_file(basedir) def from_file(self, basedir): - fname = str( - Path(CHANGELOGS_DIR) - / f"WinPython{self.flavor}-{self.architecture}bit-{self.version}.md" - ) - - try: - with open(fname, "r", encoding = 'utf-8') as fdesc: # python3 doesn't like 'rb' - text = fdesc.read() - except: - with open(fname, "r") as fdesc: # python3 doesn't like 'rb' - text = fdesc.read() + fname = CHANGELOGS_DIR / f"WinPython{self.flavor}-{self.architecture}bit-{self.version}.md" + if not fname.exists(): + raise FileNotFoundError(f"Changelog file not found: {fname}") + with open(fname, "r", encoding = 'utf-8') as fdesc: + text = fdesc.read() self.from_text(text) def from_text(self, text): version = re.match(self.WINPYTHON_PATTERN + self.flavor, text).groups()[0] assert version == self.version - tools_flag = False - python_flag = False + tools_flag = python_flag = False for line in text.splitlines(): if line: if line == self.TOOLS_LINE: - tools_flag = True + tools_flag, python_flag = True, False continue elif line == self.PYTHON_PACKAGES_LINE: - tools_flag = False - python_flag = True + tools_flag, python_flag = False, True continue elif line in ( self.HEADER_LINE1, @@ -127,42 +104,24 @@ def from_text(self, text): self.python_packages[package.name] = package -def diff_package_dicts(dict1_in, dict2_in): - """Return difference between package dict1 and package dict2""" - text = "" +def diff_package_dicts(old_packages, new_packages): + """Return difference between package old and package new""" + # wheel replace '-' per '_' in key - dict1 = {} - dict2 = {} - for key in dict1_in: - dict1[key.replace("-", "_").lower()] = dict1_in[key] - for key in dict2_in: - dict2[key.replace("-", "_").lower()] = dict2_in[key] - set1, set2 = set(dict1.keys()), set(dict2.keys()) + old = {k.replace("-", "_").lower(): v for k, v in old_packages.items()} + new = {k.replace("-", "_").lower(): v for k, v in new_packages.items()} + text = "" # New packages - new = sorted(set2 - set1) - if new: - text += "New packages:\r\n\r\n" - for name in new: - package = dict2[name] - text += package.to_wiki() - text += "\r\n" + if new_keys := sorted(set(new) - set(old)): + text += "New packages:\r\n\r\n" + "".join(new[k].to_wiki() for k in new_keys) + "\r\n" + # Upgraded packages - upgraded_list = [] - for name in sorted(set1 & set2): - package1 = dict1[name] - package2 = dict2[name] - if package1.version != package2.version: - upgraded_list.append(package2.upgrade_wiki(package1)) - if upgraded_list: - text += "Upgraded packages:\r\n\r\n" + f"{''.join(upgraded_list)}" + "\r\n" + if upgraded := [new[k].upgrade_wiki(old[k]) for k in sorted(set(old) & set(new)) if old[k].version != new[k].version]: + text += "Upgraded packages:\r\n\r\n" + f"{''.join(upgraded)}" + "\r\n" + # Removed packages - removed = sorted(set1 - set2) - if removed: - text += "Removed packages:\r\n\r\n" - for name in removed: - package = dict1[name] - text += package.to_wiki() - text += "\r\n" + if removed_keys := sorted(set(old) - set(new)): + text += "Removed packages:\r\n\r\n" + "".join(old[k].to_wiki() for k in removed_keys) + "\r\n" return text @@ -190,23 +149,13 @@ def find_closer_version(version1, basedir=None, flavor="", architecture=64): else: return version_below -def compare_package_indexes( - version2, - version1=None, - basedir=None, - flavor="", - flavor1=None, - architecture=64, -): +def compare_package_indexes(version2, version1=None, basedir=None, flavor="", flavor1=None,architecture=64): """Compare two package index Wiki pages""" - if version1 is None: - version1 = find_closer_version( - version2, - basedir=basedir, - flavor=flavor, - architecture=architecture, - ) - flavor1 = flavor1 if flavor1 is not None else flavor + version1 = version1 if version1 else find_closer_version(version2, basedir, flavor, architecture) + flavor1 = flavor1 if flavor1 else flavor + pi1 = PackageIndex(version1, basedir, flavor1, architecture) + pi2 = PackageIndex(version2, basedir, flavor, architecture) + text = "\r\n".join( [ f"## History of changes for WinPython-{architecture}bit {version2 + flavor}", @@ -218,18 +167,7 @@ def compare_package_indexes( "", ] ) - pi1 = PackageIndex( - version1, - basedir=basedir, - flavor=flavor1, - architecture=architecture, - ) - pi2 = PackageIndex( - version2, - basedir=basedir, - flavor=flavor, - architecture=architecture, - ) + tools_text = diff_package_dicts(pi1.other_packages, pi2.other_packages) if tools_text: text += PackageIndex.TOOLS_LINE + "\r\n\r\n" + tools_text @@ -248,101 +186,22 @@ def _copy_all_changelogs(version, basedir, flavor="", architecture=64): % (flavor, architecture, basever), name, ): - shutil.copyfile( - str(Path(CHANGELOGS_DIR) / name), - str(Path(basedir) / f"bu{flavor}" / name), - ) - - -def write_changelog( - version2, - version1=None, - basedir=None, - flavor="", - architecture=64, -): - """Write changelog between version1 and version2 of WinPython""" - _copy_all_changelogs( - version2, - basedir, - flavor=flavor, - architecture=architecture, - ) - print( - "comparing_package_indexes", - version2, - basedir, - flavor, - architecture, - ) - text = compare_package_indexes( - version2, - version1, - basedir=basedir, - flavor=flavor, - architecture=architecture, - ) - fname = str( - Path(basedir) - / f"bu{flavor}" - / f"WinPython{flavor}-{architecture}bit-{version2}_History.md" - ) + shutil.copyfile(CHANGELOGS_DIR / name, Path(basedir) / f"bu{flavor}" / name) - with open(fname, "w", encoding="utf-8-sig") as fdesc: # python 3 need - fdesc.write(text) - # Copy to winpython/changelogs - shutil.copyfile(fname, str(Path(CHANGELOGS_DIR) / Path(fname).name)) +def write_changelog(version2, version1=None, basedir=None, flavor="", architecture=64): + """Write changelog between version1 and version2 of WinPython""" + _copy_all_changelogs(version2, basedir, flavor, architecture) + print("comparing_package_indexes", version2, basedir, flavor, architecture) + changelog_text = compare_package_indexes(version2, version1, basedir, flavor, architecture=architecture) + output_file = Path(basedir) / f"bu{flavor}" / f"WinPython{flavor}-{architecture}bit-{version2}_History.md" -def test_parse_package_index_wiki(version, basedir=None, flavor="", architecture=64): - """Parse the package index Wiki page""" - pi = PackageIndex( - version, - basedir=basedir, - flavor=flavor, - architecture=architecture, - ) - utils.print_box(f"WinPython {pi.version}:") - utils.print_box("Tools:") - for package in pi.other_packages.values(): - print(package) - print("") - utils.print_box("Python packages:") - for package in pi.python_packages.values(): - print(package) - print("") - - -def test_compare(basedir, version2, version1, architecture=64): - print( - compare_package_indexes( - basedir, - version2, - version1, - architecture=architecture, - ) - ) + with open(output_file, "w", encoding="utf-8-sig") as fdesc: + fdesc.write(changelog_text) + # Copy to winpython/changelogs + shutil.copyfile(output_file, CHANGELOGS_DIR / output_file.name) if __name__ == "__main__": - print( - compare_package_indexes( - version2="3.7.4.0", - version1="3.7.2.0", - basedir=r"C:\WinP\bd37", - flavor="Zero", - flavor1="Zero", - architecture=32, - ) - ) - write_changelog( - version2="3.7.4.0", - version1="3.7.2.0", - basedir=r"C:\WinP\bd37", - flavor="Ps2", - architecture=64, - ) - # test_parse_package_index_wiki('2.7.3.3') - # print(compare_package_indexes('2.7.3.3', '2.7.3.1')) - # write_changelog('2.7.4.1', '2.7.4.0') - # write_changelog('3.3.0.0beta2', '3.3.0.0beta1') + print(compare_package_indexes("3.7.4.0", "3.7.2.0", "C:\WinP\bd37", "Zero", architecture=32)) + write_changelog("3.7.4.0", "3.7.2.0", r"C:\WinP\bd37", "Ps2", architecture=64) diff --git a/winpython/wppm.py b/winpython/wppm.py index 397188f9..f97e4a13 100644 --- a/winpython/wppm.py +++ b/winpython/wppm.py @@ -252,7 +252,7 @@ def main(test=False): if test: sbdir = Path(__file__).parents[0].parent.parent.parent / "sandbox" tmpdir = sbdir / "tobedeleted" - fname = sbdir / "VTK-5.10.0-Qt-4.7.4.win32-py2.7.exe") + fname = sbdir / "VTK-5.10.0-Qt-4.7.4.win32-py2.7.exe" print(Package(str(fname))) sys.exit() target = Path(utils.BASE_DIR) / "build" / "winpython-2.7.3" / "python-2.7.3" From 3769003d0be005fd44604a61c7fdb5bc52e1e897 Mon Sep 17 00:00:00 2001 From: stonebig Date: Mon, 14 Apr 2025 23:39:51 +0200 Subject: [PATCH 143/305] simplify diff.py using some Mistral AI free suggestions --- diff.py | 103 ++++++++++++++++++-------------------------------------- 1 file changed, 32 insertions(+), 71 deletions(-) diff --git a/diff.py b/diff.py index f092437e..1fd01586 100644 --- a/diff.py +++ b/diff.py @@ -6,43 +6,33 @@ # Licensed under the terms of the MIT License # (see winpython/__init__.py for details) - import os from pathlib import Path import re import shutil +from packaging import version from winpython import utils CHANGELOGS_DIR = Path(__file__).parent / "changelogs" assert CHANGELOGS_DIR.is_dir() - -class Package(object): +class Package: # SourceForge Wiki syntax: PATTERN = r"\[([a-zA-Z\-\:\/\.\_0-9]*)\]\(([^\]\ ]*)\) \| ([^\|]*) \| ([^\|]*)" # Google Code Wiki syntax: PATTERN_OLD = r"\[([a-zA-Z\-\:\/\.\_0-9]*) ([^\]\ ]*)\] \| ([^\|]*) \| ([^\|]*)" def __init__(self): - self.name = None - self.version = None - self.description = None - self.url = None + self.name = self.version = self.description = self.url = None def __str__(self): - text = f"{self.name} {self.version}" - text += f"\r\n{self.description}\r\nWebsite: {self.url}" - return text + return f"{self.name} {self.version}\r\n{self.description}\r\nWebsite: {self.url}" def from_text(self, text): - try: - self.url, self.name, self.version, self.description = re.match( - self.PATTERN_OLD, text - ).groups() - except AttributeError: - self.name, self.url, self.version, self.description = re.match( - self.PATTERN, text - ).groups() + match = re.match(self.PATTERN_OLD, text) or re.match(self.PATTERN, text) + if not match: + raise ValueError("Text does not match expected pattern") + self.name, self.url, self.version, self.description = match.groups() def to_wiki(self): return f" * [{self.name}]({self.url}) {self.version} ({self.description})\r\n" @@ -51,8 +41,7 @@ def upgrade_wiki(self, other): assert self.name.replace("-", "_").lower() == other.name.replace("-", "_").lower() return f" * [{self.name}]({self.url}) {other.version} → {self.version} ({self.description})\r\n" - -class PackageIndex(object): +class PackageIndex: WINPYTHON_PATTERN = r"\#\# WinPython\-*[0-9b-t]* ([0-9\.a-zA-Z]*)" TOOLS_LINE = "### Tools" PYTHON_PACKAGES_LINE = "### Python packages" @@ -72,9 +61,8 @@ def from_file(self, basedir): fname = CHANGELOGS_DIR / f"WinPython{self.flavor}-{self.architecture}bit-{self.version}.md" if not fname.exists(): raise FileNotFoundError(f"Changelog file not found: {fname}") - with open(fname, "r", encoding = 'utf-8') as fdesc: - text = fdesc.read() - self.from_text(text) + with open(fname, "r", encoding=utils.guess_encoding(fname)[0]) as fdesc: + self.from_text(fdesc.read()) def from_text(self, text): version = re.match(self.WINPYTHON_PATTERN + self.flavor, text).groups()[0] @@ -88,12 +76,7 @@ def from_text(self, text): elif line == self.PYTHON_PACKAGES_LINE: tools_flag, python_flag = False, True continue - elif line in ( - self.HEADER_LINE1, - self.HEADER_LINE2, - "
    ", - "
    ", - ): + elif line in (self.HEADER_LINE1, self.HEADER_LINE2, "
    ", "
    "): continue if tools_flag or python_flag: package = Package() @@ -103,7 +86,6 @@ def from_text(self, text): else: self.python_packages[package.name] = package - def diff_package_dicts(old_packages, new_packages): """Return difference between package old and package new""" @@ -111,43 +93,32 @@ def diff_package_dicts(old_packages, new_packages): old = {k.replace("-", "_").lower(): v for k, v in old_packages.items()} new = {k.replace("-", "_").lower(): v for k, v in new_packages.items()} text = "" - # New packages + if new_keys := sorted(set(new) - set(old)): text += "New packages:\r\n\r\n" + "".join(new[k].to_wiki() for k in new_keys) + "\r\n" - # Upgraded packages if upgraded := [new[k].upgrade_wiki(old[k]) for k in sorted(set(old) & set(new)) if old[k].version != new[k].version]: text += "Upgraded packages:\r\n\r\n" + f"{''.join(upgraded)}" + "\r\n" - # Removed packages if removed_keys := sorted(set(old) - set(new)): text += "Removed packages:\r\n\r\n" + "".join(old[k].to_wiki() for k in removed_keys) + "\r\n" return text - def find_closer_version(version1, basedir=None, flavor="", architecture=64): """Find version which is the closest to `version`""" - builddir = str(Path(basedir) / f"bu{flavor}") - func = lambda name: re.match( - r"WinPython%s-%sbit-([0-9\.]*)\.(txt|md)" % (flavor, architecture), - name, - ) - versions = [func(name).groups()[0] for name in os.listdir(builddir) if func(name)] - # versions:['3.10.0.1', '3.10.10.0', '3.10.2.0'.... '3.10.8.1', '3.10.9.0'] - try: - index = versions.index(version1) - except ValueError: + builddir = Path(basedir) / f"bu{flavor}" + pattern = re.compile(rf"WinPython{flavor}-{architecture}bit-([0-9\.]*)\.(txt|md)") + versions = [pattern.match(name).groups()[0] for name in os.listdir(builddir) if pattern.match(name)] + + if version1 not in versions: raise ValueError(f"Unknown version {version1}") - from packaging import version version_below = '0.0.0.0' for v in versions: - if version.parse(v) > version.parse(version_below) and version.parse(v)", - "", - ] + + text = ( + f"## History of changes for WinPython-{architecture}bit {version2 + flavor}\r\n\r\n" + f"The following changes were made to WinPython-{architecture}bit distribution since version {version1 + flavor1}.\r\n\r\n" + "
    \r\n\r\n" ) tools_text = diff_package_dicts(pi1.other_packages, pi2.other_packages) if tools_text: text += PackageIndex.TOOLS_LINE + "\r\n\r\n" + tools_text + py_text = diff_package_dicts(pi1.python_packages, pi2.python_packages) if py_text: text += PackageIndex.PYTHON_PACKAGES_LINE + "\r\n\r\n" + py_text + text += "\r\n
    \r\n* * *\r\n" return text - def _copy_all_changelogs(version, basedir, flavor="", architecture=64): basever = ".".join(version.split(".")[:2]) + pattern = re.compile(rf"WinPython{flavor}-{architecture}bit-{basever}([0-9\.]*)\.(txt|md)") for name in os.listdir(CHANGELOGS_DIR): - if re.match( - r"WinPython%s-%sbit-%s([0-9\.]*)\.(txt|md)" - % (flavor, architecture, basever), - name, - ): + if pattern.match(name): shutil.copyfile(CHANGELOGS_DIR / name, Path(basedir) / f"bu{flavor}" / name) - def write_changelog(version2, version1=None, basedir=None, flavor="", architecture=64): """Write changelog between version1 and version2 of WinPython""" _copy_all_changelogs(version2, basedir, flavor, architecture) @@ -196,12 +158,11 @@ def write_changelog(version2, version1=None, basedir=None, flavor="", architectu changelog_text = compare_package_indexes(version2, version1, basedir, flavor, architecture=architecture) output_file = Path(basedir) / f"bu{flavor}" / f"WinPython{flavor}-{architecture}bit-{version2}_History.md" - with open(output_file, "w", encoding="utf-8-sig") as fdesc: + with open(output_file, "w", encoding="utf-8") as fdesc: fdesc.write(changelog_text) # Copy to winpython/changelogs shutil.copyfile(output_file, CHANGELOGS_DIR / output_file.name) - if __name__ == "__main__": - print(compare_package_indexes("3.7.4.0", "3.7.2.0", "C:\WinP\bd37", "Zero", architecture=32)) + print(compare_package_indexes("3.7.4.0", "3.7.2.0", r"C:\WinP\bd37", "Zero", architecture=32)) write_changelog("3.7.4.0", "3.7.2.0", r"C:\WinP\bd37", "Ps2", architecture=64) From a26fc9541b15d309ce5feb1ccc9f77b8d2d73563 Mon Sep 17 00:00:00 2001 From: stonebig Date: Tue, 15 Apr 2025 11:53:16 +0200 Subject: [PATCH 144/305] tweaks picked from MistralAI free --- winpython/wppm.py | 43 ++++++++++++++----------------------------- 1 file changed, 14 insertions(+), 29 deletions(-) diff --git a/winpython/wppm.py b/winpython/wppm.py index f97e4a13..2fd43817 100644 --- a/winpython/wppm.py +++ b/winpython/wppm.py @@ -7,15 +7,13 @@ # (see winpython/__init__.py for details) import os -from pathlib import Path -import shutil import re import sys +import shutil import subprocess import json +from pathlib import Path from argparse import ArgumentParser, RawTextHelpFormatter - -# Local imports from winpython import utils, piptree # Workaround for installing PyVISA on Windows from source: @@ -66,34 +64,26 @@ def remove_directory(self, path: str): def create_file(self, package, name, dstdir, contents): """Generate data file -- path is relative to distribution root dir""" - dst = str(Path(dstdir) / name) + dst = Path(dstdir) / name if self.verbose: print(f"create: {dst}") - full_dst = str(Path(self.target) / dst) + full_dst = Path(self.target) / dst with open(full_dst, "w") as fd: fd.write(contents) - package.files.append(dst) + package.files.append(str(dst)) def get_installed_packages(self, update: bool = False) -> list[Package]: """Return installed packages.""" # Include package installed via pip (not via WPPM) - wppm = [] if str(Path(sys.executable).parent) == self.target: self.pip = piptree.PipData() else: self.pip = piptree.PipData(utils.get_python_executable(self.target)) pip_list = self.pip.pip_list() - # create pip package list - wppm = [ - Package( - f"{i[0].replace('-', '_').lower()}-{i[1]}-py3-none-any.whl", #faking wheel - suggested_summary=self.pip.summary(i[0]) if self.pip else None - ) - for i in pip_list - ] - return sorted(wppm, key=lambda tup: tup.name.lower()) + # return a list of package objects + return [Package(f"{utils.normalize(i[0])}-{i[1]}-py3-none-any.whl") for i in pip_list] def find_package(self, name: str) -> Package | None: """Find installed package by name.""" @@ -103,16 +93,13 @@ def find_package(self, name: str) -> Package | None: def patch_all_shebang(self, to_movable: bool = True, max_exe_size: int = 999999, targetdir: str = ""): """Make all python launchers relative.""" - import glob - - for ffname in glob.glob(r"%s\Scripts\*.exe" % self.target): - size = os.path.getsize(ffname) - if size <= max_exe_size: + for ffname in Path(self.target).glob("Scripts/*.exe"): + if ffname.stat().st_size <= max_exe_size: utils.patch_shebang_line(ffname, to_movable=to_movable, targetdir=targetdir) - for ffname in glob.glob(r"%s\Scripts\*.py" % self.target): + for ffname in Path(self.target).glob("Scripts/*.py"): utils.patch_shebang_line_py(ffname, to_movable=to_movable, targetdir=targetdir) - def install(self, package: Package, install_options: list[str] = None): # Type hint install_options + def install(self, package: Package, install_options: list[str] = None): """Install package in distribution.""" if package.fname.endswith((".whl", ".tar.gz", ".zip")): # Check extension with tuple self.install_bdist_direct(package, install_options=install_options) @@ -158,12 +145,10 @@ def patch_standard_packages(self, package_name="", to_movable=True): # ensure pip will create movable launchers # sheb_mov1 = classic way up to WinPython 2016-01 # sheb_mov2 = tried way, but doesn't work for pip (at least) + the_place = Path(self.target) / "lib" / "site-packages" / "pip" / "_vendor" / "distlib" / "scripts.py" sheb_fix = " executable = get_executable()" sheb_mov1 = " executable = os.path.join(os.path.basename(get_executable()))" sheb_mov2 = " executable = os.path.join('..',os.path.basename(get_executable()))" - - the_place = Path(self.target) / "lib" / "site-packages" / "pip" / "_vendor" / "distlib" / "scripts.py" - print(the_place) if to_movable: utils.patch_sourcefile(the_place, sheb_fix, sheb_mov1) utils.patch_sourcefile(the_place, sheb_mov2, sheb_mov1) @@ -176,7 +161,7 @@ def patch_standard_packages(self, package_name="", to_movable=True): if package_name.lower() in ("", "spyder"): # spyder don't goes on internet without I ask utils.patch_sourcefile( - Path(self.target) / "lib" / "site-packages" / "spyder" / "config" /"main.py", + Path(self.target) / "lib" / "site-packages" / "spyder" / "config" / "main.py", "'check_updates_on_startup': True,", "'check_updates_on_startup': False,", ) @@ -250,7 +235,7 @@ def install_bdist_direct(self, package, install_options=None): def main(test=False): if test: - sbdir = Path(__file__).parents[0].parent.parent.parent / "sandbox" + sbdir = Path(__file__).parents[3] / "sandbox" tmpdir = sbdir / "tobedeleted" fname = sbdir / "VTK-5.10.0-Qt-4.7.4.win32-py2.7.exe" print(Package(str(fname))) From a2c3d4c75a7ac0c3e542d8d584ad41258f9f37bf Mon Sep 17 00:00:00 2001 From: stonebig Date: Tue, 15 Apr 2025 14:03:17 +0200 Subject: [PATCH 145/305] rectify bad tweaks --- winpython/utils.py | 40 +++++++++++++++------------------------- winpython/wppm.py | 2 +- 2 files changed, 16 insertions(+), 26 deletions(-) diff --git a/winpython/utils.py b/winpython/utils.py index 324403cc..7302e943 100644 --- a/winpython/utils.py +++ b/winpython/utils.py @@ -29,16 +29,16 @@ def get_python_executable(path=None): """Return the path to the Python executable.""" - python_path = sys.executable if path is None else path - base_dir = Path(python_path).parent if not Path(python_path).is_dir() else Path(python_path) + python_path = Path(path) if path else Path(sys.executable) + base_dir = python_path if python_path.is_dir() else python_path.parent python_exe = base_dir / 'python.exe' pypy_exe = base_dir / 'pypy3.exe' # For PyPy return str(python_exe if python_exe.is_file() else pypy_exe) def get_site_packages_path(path=None): """Return the path to the Python site-packages directory.""" - python_path = sys.executable if path is None else path - base_dir = Path(python_path).parent if not Path(python_path).is_dir() else Path(python_path) + python_path = Path(path) if path else Path(sys.executable) + base_dir = python_path if python_path.is_dir() else python_path.parent site_packages = base_dir / 'Lib' / 'site-packages' pypy_site_packages = base_dir / 'site-packages' # For PyPy return str(pypy_site_packages if pypy_site_packages.is_dir() else site_packages) @@ -322,40 +322,33 @@ def buildflit_wininst(root, python_exe=None, copy_to=None, verbose=False): if verbose: subprocess.call(cmd, cwd=root) else: - process = subprocess.Popen(cmd, cwd=root, stdout=subprocess.PIPE, stderr=subprocess.PIPE) - process.communicate() - process.stdout.close() - process.stderr.close() - distdir = str(Path(root) / 'dist') - if not Path(distdir).is_dir(): + subprocess.Popen(cmd, cwd=root, stdout=subprocess.PIPE, stderr=subprocess.PIPE).communicate() + distdir = Path(root) / 'dist' + if not distdir.is_dir(): raise RuntimeError( "Build failed: see package README file for further details regarding installation requirements.\n\n" "For more concrete debugging infos, please try to build the package from the command line:\n" "1. Open a WinPython command prompt\n" "2. Change working directory to the appropriate folder\n" - "3. Type `python -m filt build`" + "3. Type `python -m flit build`" ) - for distname in os.listdir(distdir): if re.match(SOURCE_PATTERN, distname) or re.match(WHEELBIN_PATTERN, distname): break else: raise RuntimeError(f"Build failed: not a pure Python package? {distdir}") - src_fname = str(Path(distdir) / distname) + src_fname = distdir / distname if copy_to: - dst_fname = str(Path(copy_to) / distname) + dst_fname = Path(copy_to) / distname shutil.move(src_fname, dst_fname) if verbose: print(f"Move: {src_fname} --> {dst_fname}") - return dst_fname - return src_fname def direct_pip_install(fname, python_exe=None, verbose=False, install_options=None): """Direct install via python -m pip !""" python_exe = python_exe or sys.executable - myroot = str(Path(python_exe).parent) - + myroot = Path(python_exe).parent cmd = [python_exe, "-m", "pip", "install"] + (install_options or []) + [fname] if not verbose: process = subprocess.Popen(cmd, cwd=myroot, stdout=subprocess.PIPE, stderr=subprocess.PIPE) @@ -374,15 +367,12 @@ def direct_pip_install(fname, python_exe=None, verbose=False, install_options=No def do_script(this_script, python_exe=None, copy_to=None, verbose=False, install_options=None): """Execute a script (get-pip typically).""" python_exe = python_exe or sys.executable - myroot = os.path.dirname(python_exe) + myroot = Path(python_exe).parent # cmd = [python_exe, myroot + r'\Scripts\pip-script.py', 'install'] cmd = [python_exe] + (install_options or []) + ([this_script] if this_script else []) print("Executing ", cmd) if not verbose: - process = subprocess.Popen(cmd, cwd=myroot, stdout=subprocess.PIPE, stderr=subprocess.PIPE) - process.communicate() - process.stdout.close() - process.stderr.close() + subprocess.Popen(cmd, cwd=myroot, stdout=subprocess.PIPE, stderr=subprocess.PIPE).communicate() else: subprocess.call(cmd, cwd=myroot) print("Executed ", cmd) @@ -406,9 +396,9 @@ def normalize(this): def get_package_metadata(database, name): """Extract infos (description, url) from the local database.""" - DATA_PATH = str(Path(sys.modules['winpython'].__file__).parent / 'data') + DATA_PATH = Path(sys.modules['winpython'].__file__).parent / 'data' db = cp.ConfigParser() - filepath = Path(database) if Path(database).is_absolute() else Path(DATA_PATH) / database + filepath = Path(database) if Path(database).is_absolute() else DATA_PATH / database db.read_file(open(str(filepath), encoding=guess_encoding(filepath)[0])) my_metadata = { diff --git a/winpython/wppm.py b/winpython/wppm.py index 2fd43817..640748d9 100644 --- a/winpython/wppm.py +++ b/winpython/wppm.py @@ -83,7 +83,7 @@ def get_installed_packages(self, update: bool = False) -> list[Package]: pip_list = self.pip.pip_list() # return a list of package objects - return [Package(f"{utils.normalize(i[0])}-{i[1]}-py3-none-any.whl") for i in pip_list] + return [Package(f"{i[0].replace('-', '_').lower()}-{i[1]}-py3-none-any.whl") for i in pip_list] def find_package(self, name: str) -> Package | None: """Find installed package by name.""" From 8b7eafc85f479ee77486945457e301544bbd74b9 Mon Sep 17 00:00:00 2001 From: stonebig Date: Wed, 16 Apr 2025 11:51:46 +0200 Subject: [PATCH 146/305] modernise hash.py with Mistral AI help --- hash.py | 86 +++++++++++++++++++++++---------------------------------- 1 file changed, 34 insertions(+), 52 deletions(-) diff --git a/hash.py b/hash.py index 781b8bba..f9af0792 100644 --- a/hash.py +++ b/hash.py @@ -1,63 +1,45 @@ # -*- coding: utf-8 -*- -""" -Created on Tue Jun 23 21:30:06 2015 +# +# WinPython hash.py script +# Copyright © 2014-2025+ The Winpython development team https://github.com/winpython/ +# Licensed under the terms of the MIT License +# (see winpython/__init__.py for details) -@author: famille -""" - -import io -import os +from pathlib import Path import sys import hashlib - -def give_hash(file_in, with_this): - with io.open(file_in, 'rb') as f: - return with_this(f.read()).hexdigest() - -def give_hashblake(file_in, with_this): - with io.open(file_in, 'rb') as f: - return with_this(f.read(),digest_size=32).hexdigest() - - -if __name__ == '__main__': - if len(sys.argv) < 2: - print( "Usage: hash.py files_to_copte_hash" ) - exit(1) - files = [str(i) for i in sys.argv[1:] if str(i)[-3:].lower() != ".py"] - - header = ( - " MD5" - + " " * (32 - 4) - + " | SHA-1" - + " " * (40 - 5) - + " | SHA-256" - + " " * (64 - 7) - + " | Binary" - + " " * (33 - 5) - + "| Size" - + " " * (20 - 6) - #+ " | SHA3-256" - #+ " " * (64 - 8) - + " | blake2b-256" - + " " * (64 - 11) - ) - line = "|".join( - ["-" * len(i) for i in header.split("|")] - ) +def compute_hash(file_path, hash_function, digest_size=None): + """Compute the hash of a file using the specified hash function.""" + try: + with open(file_path, 'rb') as file: + if digest_size: + return hash_function(file.read(), digest_size=digest_size).hexdigest() + return hash_function(file.read()).hexdigest() + except IOError as e: + print(f"Error reading file {file_path}: {e}") + return None + +def print_hashes(files): + """Print the hashes of the given files.""" + header = f"{'MD5':<32} | {'SHA-1':<40} | {'SHA-256':<64} | {'Binary':<33} | {'Size':<20} | {'blake2b-256':<64}" + line = "|".join(["-" * len(part) for part in header.split("|")]) print(header) print(line) for file in files: - print(""+ - f"{give_hash(file, hashlib.md5)} | " + - f"{give_hash(file, hashlib.sha1)} | " + - f"{give_hash(file, hashlib.sha256)} | " + - f"{os.path.basename(file):33} |"+ - f"{os.path.getsize(file):13,}".replace(",", " ") + ' Bytes | ' + - # f" | {give_hash(file, hashlib.sha3_256)}" - f"{give_hashblake(file, hashlib.blake2b)}") + md5 = compute_hash(file, hashlib.md5) + sha1 = compute_hash(file, hashlib.sha1) + sha256 = compute_hash(file, hashlib.sha256) + name = Path(file).name.ljust(33) + size = f"{Path(file).stat().st_size:,} Bytes".replace(",", " ").ljust(20) + blake2b = compute_hash(file, hashlib.blake2b, digest_size=32) + print(f"{md5} | {sha1} | {sha256} | {name} | {size} | {blake2b}") - - +if __name__ == '__main__': + if len(sys.argv) < 2: + print("Usage: hash.py files_to_compute_hash") + sys.exit(1) + files = [file for file in sys.argv[1:] if file[-3:].lower() != ".py"] + print_hashes(files) From c6903afba6bdc20ba62ad4ed232c44ab11924790 Mon Sep 17 00:00:00 2001 From: stonebig Date: Wed, 16 Apr 2025 11:54:21 +0200 Subject: [PATCH 147/305] glitch --- hash.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hash.py b/hash.py index f9af0792..08ff8b92 100644 --- a/hash.py +++ b/hash.py @@ -33,7 +33,7 @@ def print_hashes(files): sha1 = compute_hash(file, hashlib.sha1) sha256 = compute_hash(file, hashlib.sha256) name = Path(file).name.ljust(33) - size = f"{Path(file).stat().st_size:,} Bytes".replace(",", " ").ljust(20) + size = f"{Path(file).stat().st_size:,} Bytes".replace(",", " ").rjust(20) blake2b = compute_hash(file, hashlib.blake2b, digest_size=32) print(f"{md5} | {sha1} | {sha256} | {name} | {size} | {blake2b}") From 8275320d8ab64ecb8bf4fa361aa2c3c7d7743303 Mon Sep 17 00:00:00 2001 From: stonebig Date: Wed, 16 Apr 2025 15:37:29 +0200 Subject: [PATCH 148/305] simplify 7zip installer creation --- make.py | 50 +++++++----------------- portable/installer_7zip.bat | 78 ------------------------------------- 2 files changed, 14 insertions(+), 114 deletions(-) delete mode 100644 portable/installer_7zip.bat diff --git a/make.py b/make.py index de329f90..8a3e2d2f 100644 --- a/make.py +++ b/make.py @@ -32,30 +32,6 @@ def find_7zip_executable() -> str: return str(executable_path) raise RuntimeError("7ZIP is not installed on this computer.") -def build_installer_7zip(script_template_path: Path, output_script_path: Path, replacements: list[tuple[str, str]]): - """ - Creates a 7-Zip installer script by copying a template and applying text replacements. - - Args: - script_template_path: Path to the template 7-Zip script (.bat file). - output_script_path: Path to save the generated 7-Zip script. - replacements: A list of tuples for text replacements (prefix, new_text). - """ - # Standard replacements for all 7zip scripts - data_to_replace = [ - ("PORTABLE_DIR=", f"PORTABLE_DIR={PORTABLE_DIRECTORY}& rem "), - ("SEVENZIP_EXE=", f"SEVENZIP_EXE={find_7zip_executable()}& rem "), - ] + [(f"{a}=", f"{a}={b}& rem ") for a, b in replacements] - - utils.replace_in_file(script_template_path, data_to_replace, output_script_path) - - try: - # Execute the generated 7-Zip script, with stdout=sys.stderr to see 7zip compressing - print(f'Executing 7-Zip script: "{output_script_path}"') - subprocess.run(f'"{output_script_path}"', shell=True, check=True, stderr=sys.stderr, stdout=sys.stderr) - except subprocess.CalledProcessError as e: - print(f"Error executing 7-Zip script: {e}", file=sys.stderr) - def copy_items(source_directories: list[Path], target_directory: Path, verbose: bool = False): """Copies items from source directories to the target directory.""" target_directory.mkdir(parents=True, exist_ok=True) @@ -216,21 +192,23 @@ def architecture_bits(self) -> int: def create_installer_7zip(self, installer_type: str = ".exe"): """Creates a WinPython installer using 7-Zip: ".exe", ".7z", ".zip")""" self._print_action(f"Creating WinPython installer ({installer_type})") - template_name = "installer_7zip.bat" - output_name = "installer_7zip-tmp.bat" if installer_type not in [".exe", ".7z", ".zip"]: print(f"Warning: Unsupported installer type '{installer_type}'. Defaulting to .exe") installer_type = ".exe" - - replacements = [ - ("DISTDIR", str(self.winpython_directory)), - ("ARCH", str(self.architecture_bits)), - ("VERSION", f"{self.python_full_version}.{self.build_number}{self.flavor}"), - ("VERSION_INSTALL", f'{self.python_full_version.replace(".", "")}{self.build_number}'), - ("RELEASELEVEL", self.release_level), - ("INSTALLER_OPTION", installer_type), - ] - build_installer_7zip(PORTABLE_DIRECTORY / template_name, self.target_directory / output_name, replacements) + DISTDIR = self.winpython_directory + filname_stemp = f"Winpython{str(self.architecture_bits)}-{self.python_full_version}.{self.build_number}{self.flavor}{self.release_level}" + fullfilename = DISTDIR.parent / (filname_stemp + installer_type) + if installer_type == ".zip": + other = f'"{find_7zip_executable()}" -tzip -mx5 a "{fullfilename}" "{DISTDIR}" ' + if installer_type == ".7z": + other = f'"{find_7zip_executable()}" -mx5 a "{fullfilename}" "{DISTDIR}" ' + if installer_type == ".exe": + other = f'"{find_7zip_executable()}" -mx5 a "{fullfilename}" "{DISTDIR}" -sfx7z.sfx' + print(f'Executing 7-Zip script: "{other}"') + try: + subprocess.run(other, shell=True, check=True, stderr=sys.stderr, stdout=sys.stderr) + except subprocess.CalledProcessError as e: + print(f"Error executing 7-Zip script: {e}", file=sys.stderr) def _print_action(self, text: str): """Prints an action message with progress indicator.""" diff --git a/portable/installer_7zip.bat b/portable/installer_7zip.bat deleted file mode 100644 index 0b308f2a..00000000 --- a/portable/installer_7zip.bat +++ /dev/null @@ -1,78 +0,0 @@ -rem Copyright @ 2018 WinPython team -rem Licensed under the terms of the MIT License -rem (see winpython/__init__.py for details) - -rem This is to do a 7-zip installer - -rem ================================================================ -rem These lines are automatically replaced when creating installer: -rem (see winpython/make.py) -set SEVENZIP_EXE=C:\Program Files (x86)\7-Zip\7z -set DISTDIR=C:\WinP\bd36\buPs2\winp64-3.6.x.0 -set ARCH=64 -set VERSION=3.6.7.0Ps2 - -rem 2018-04-04 need to minimize path length of installation further: remove flavor in install path - -set VERSION_INSTALL=3670 - -set RELEASELEVEL=beta3 -set PORTABLE_DIR=C:\WinPython-64bit-3.4.3.7Qt5\winpython_github20181029\portable -set INSTALLER_OPTION=.exe - -rem ================================================================ -rem these lines are static definitions -set ID=Winpython -set ID_INSTALL=WPy -set FILE_DESCRIPTION=%ID% Installer -set COMPANY=%ID% -set BRANDING=%ID%, the portable Python Distribution for Scientists -set COPYRIGHT=Copyright © 2018+ WinPython Team -set MyAppPublisher=WinPython team -set MyAppURL=https://winpython.github.io/ - -rem OutputBaseFilename "{#ID}{#ARCH}-{#VERSION}{#RELEASELEVEL}" - -rem ================================================================ [Setup] -rem OutFile "${DISTDIR}\..\${ID}${ARCH}-${VERSION}${RELEASELEVEL}.exe" -set MyBinaryOutputDir=%DISTDIR%\.. -set OutputBaseFilename=%ID%%ARCH%-%VERSION%%RELEASELEVEL% - -rem 7-zip uncompress the directory compressed %DISTDIR% (no option to change it in gui) - -rem ================================================================ -rem 2019-03-16 copy license at source (due to 7zip limitations) - -REM 2025-01-05 done in make.py -rem copy/Y %PORTABLE_DIR%\license.txt %DISTDIR%\license.txt - -rem ================================================================ - -echo %time% - -rem compression + include auto_extract in GUI mode -if "%INSTALLER_OPTION%"==".exe" ( - "%SEVENZIP_EXE%" -mx5 a "%MyBinaryOutputDir%\%OutputBaseFilename%.exe" %DISTDIR% -sfx7z.sfx - echo autoextract using command line options - echo "%MyBinaryOutputDir%\%OutputBaseFilename%.exe" -y -o%MyBinaryOutputDir%\zz > NUL - ) - -if "%INSTALLER_OPTION%"==".7z" ( - "%SEVENZIP_EXE%" -mx5 a "%MyBinaryOutputDir%\%OutputBaseFilename%.7z" %DISTDIR% - echo no autoextract - ) -if "%INSTALLER_OPTION%"==".zip" ( - "%SEVENZIP_EXE%" -tzip -mx5 a "%MyBinaryOutputDir%\%OutputBaseFilename%.zip" %DISTDIR% - echo no autoextract - ) - - - -rem -mx1 = speed fastest -rem -mx3 = speed fast -rem -mx5 = speed normal -rem -mx7 = compress maximum -rem -mx9 = compress ultra - -rem -t7z = [by default] 7 zip compression , the only choice with auto-extract -rem -tzip = Zip compatible compression. From 0ac86148268319c0a4f71c06b207c6b513556a92 Mon Sep 17 00:00:00 2001 From: stonebig Date: Wed, 16 Apr 2025 19:55:18 +0200 Subject: [PATCH 149/305] small tweaks to make.py with mistral AI free --- make.py | 54 ++++++++++++++++++++---------------------------------- 1 file changed, 20 insertions(+), 34 deletions(-) diff --git a/make.py b/make.py index 8a3e2d2f..c560d594 100644 --- a/make.py +++ b/make.py @@ -19,6 +19,7 @@ # Define constant paths for clarity CHANGELOGS_DIRECTORY = Path(__file__).parent / "changelogs" PORTABLE_DIRECTORY = Path(__file__).parent / "portable" +NODEJS_RELATIVE_PATH = "n" # Relative path within WinPython dir # Ensure necessary directories exist at the start assert CHANGELOGS_DIRECTORY.is_dir(), f"Changelogs directory not found: {CHANGELOGS_DIRECTORY}" @@ -58,14 +59,11 @@ def parse_list_argument(argument_value: str | list[str], separator=" ") -> list[ class WinPythonDistributionBuilder: """Builds a WinPython distribution.""" - NODEJS_RELATIVE_PATH = "n" # Relative path within WinPython dir - def __init__(self, build_number: int, release_level: str, target_directory: Path, wheels_directory: Path, tools_directories: list[Path] = None, documentation_directories: list[Path] = None, verbose: bool = False, base_directory: Path = None, install_options: list[str] = None, flavor: str = ""): """ Initializes the WinPythonDistributionBuilder. - Args: build_number: The build number (integer). release_level: The release level (e.g., "beta", ""). @@ -97,7 +95,7 @@ def __init__(self, build_number: int, release_level: str, target_directory: Path def _get_python_zip_file(self) -> Path: """Finds the Python .zip file in the wheels directory.""" for source_item in self.wheels_directory.iterdir(): - if re.match("(pypy3|python-)([0-9]|[a-zA-Z]|.)*.zip", source_item.name): + if re.match(r"(pypy3|python-)([0-9]|[a-zA-Z]|.)*.zip", source_item.name): return source_item raise RuntimeError(f"Could not find Python zip package in {self.wheels_directory}") @@ -138,7 +136,7 @@ def get_tool_path(relative_path): path = self.winpython_directory / relative_path if self.winpython_directory else None return path if path and path.exists() else None - if nodejs_path := get_tool_path(self.NODEJS_RELATIVE_PATH): + if nodejs_path := get_tool_path(NODEJS_RELATIVE_PATH): installed_tools.append(("Nodejs", utils.get_nodejs_version(nodejs_path))) installed_tools.append(("npmjs", utils.get_npmjs_version(nodejs_path))) @@ -151,8 +149,7 @@ def get_tool_path(relative_path): tool_lines = [] for name, version in installed_tools: metadata = utils.get_package_metadata("tools.ini", name) - url, description = metadata["url"], metadata["description"] - tool_lines.append(f"[{name}]({url}) | {version} | {description}") + tool_lines.append(f"[{name}]({metadata['url']}) | {version} | {metadata['description']}") return "\n".join(tool_lines) def _get_installed_packages_markdown(self) -> str: @@ -193,20 +190,16 @@ def create_installer_7zip(self, installer_type: str = ".exe"): """Creates a WinPython installer using 7-Zip: ".exe", ".7z", ".zip")""" self._print_action(f"Creating WinPython installer ({installer_type})") if installer_type not in [".exe", ".7z", ".zip"]: - print(f"Warning: Unsupported installer type '{installer_type}'. Defaulting to .exe") - installer_type = ".exe" + raise RuntimeError("installer_type {installer_type} is undefined") DISTDIR = self.winpython_directory - filname_stemp = f"Winpython{str(self.architecture_bits)}-{self.python_full_version}.{self.build_number}{self.flavor}{self.release_level}" - fullfilename = DISTDIR.parent / (filname_stemp + installer_type) - if installer_type == ".zip": - other = f'"{find_7zip_executable()}" -tzip -mx5 a "{fullfilename}" "{DISTDIR}" ' - if installer_type == ".7z": - other = f'"{find_7zip_executable()}" -mx5 a "{fullfilename}" "{DISTDIR}" ' - if installer_type == ".exe": - other = f'"{find_7zip_executable()}" -mx5 a "{fullfilename}" "{DISTDIR}" -sfx7z.sfx' - print(f'Executing 7-Zip script: "{other}"') + filename_stem = f"Winpython{self.architecture_bits}-{self.python_full_version}.{self.build_number}{self.flavor}{self.release_level}" + fullfilename = DISTDIR.parent / (filename_stem + installer_type) + sfx_option = "-sfx7z.sfx" if installer_type == ".exe" else "" + zip_option = "-tzip" if installer_type == ".zip" else "" + command = f'"{find_7zip_executable()}" {zip_option} -mx5 a "{fullfilename}" "{DISTDIR}" {sfx_option}' + print(f'Executing 7-Zip script: "{command}"') try: - subprocess.run(other, shell=True, check=True, stderr=sys.stderr, stdout=sys.stderr) + subprocess.run(command, shell=True, check=True, stderr=sys.stderr, stdout=sys.stderr) except subprocess.CalledProcessError as e: print(f"Error executing 7-Zip script: {e}", file=sys.stderr) @@ -243,22 +236,20 @@ def _copy_essential_files(self): copy_items(self.tools_directories, tools_target_directory, self.verbose) if (nodejs_current_directory := tools_target_directory / "n").is_dir(): - self._print_action(f"moving tools from {nodejs_current_directory} to {tools_target_directory.parent / self.NODEJS_RELATIVE_PATH} ") + self._print_action(f"Moving tools from {nodejs_current_directory} to {tools_target_directory.parent / NODEJS_RELATIVE_PATH}") try: - shutil.move(nodejs_current_directory, tools_target_directory.parent / self.NODEJS_RELATIVE_PATH) + shutil.move(nodejs_current_directory, tools_target_directory.parent / NODEJS_RELATIVE_PATH) except Exception as e: print(f"Error moving Node.js directory: {e}") def _create_initial_batch_scripts(self): """Creates initial batch scripts, including environment setup.""" self._print_action("Creating initial batch scripts") - # Replacements for batch scripts (PyPy compatibility) executable_name = self.distribution.short_exe if self.distribution else "python.exe" # default to python.exe if distribution is not yet set - init_variables = [('WINPYthon_exe', executable_name), ('WINPYthon_subdirectory_name', self.python_directory_name), ('WINPYVER', self.winpython_version_name)] with open(self.winpython_directory / "scripts" / "env.ini", "w") as f: - f.writelines([f'{a}={b}\n' for a , b in init_variables]) + f.writelines([f'{a}={b}\n' for a, b in init_variables]) def build(self, rebuild: bool = True, requirements_files_list=None, winpy_dirname: str = None): """Make or finalise WinPython distribution in the target directory""" @@ -296,9 +287,7 @@ def build(self, rebuild: bool = True, requirements_files_list=None, winpy_dirnam if requirements_files_list: for req in requirements_files_list: - actions = ["install", "-r", req] - if self.install_options is not None: - actions += self.install_options + actions = ["install", "-r", req] + (self.install_options or []) self._print_action(f"Piping: {' '.join(actions)}") self.distribution.do_pip_action(actions) self.distribution.patch_standard_packages() @@ -386,12 +375,9 @@ def make_all(build_number: int, release_level: str, pyver: str, architecture: in builder.build(rebuild=rebuild, requirements_files_list=requirements_files_list, winpy_dirname=winpython_dirname) - if ".zip" in create_installer.lower(): - builder.create_installer_7zip(".zip") - if ".7z" in create_installer.lower(): - builder.create_installer_7zip(".7z") - if "7zip" in create_installer.lower(): - builder.create_installer_7zip(".exe") + for installer_type in [".zip", ".7z", ".exe"]: + if installer_type in create_installer.lower().replace("7zip",".exe"): + builder.create_installer_7zip(installer_type) if __name__ == "__main__": # DO create only one Winpython distribution at a time @@ -409,4 +395,4 @@ def make_all(build_number: int, release_level: str, pyver: str, architecture: in source_dirs=r"D:\WinPython\basedir34\packages.win-amd64", toolsdirs=r"D:\WinPython\basedir34\t.Slim", docsdirs=r"D:\WinPython\basedir34\docs.Slim", - ) \ No newline at end of file + ) From 63f0e95d7238b72f63386f74256d444b8941986a Mon Sep 17 00:00:00 2001 From: stonebig Date: Wed, 16 Apr 2025 22:52:41 +0200 Subject: [PATCH 150/305] remove what is useless --- winpython/utils.py | 23 +++++++---------------- 1 file changed, 7 insertions(+), 16 deletions(-) diff --git a/winpython/utils.py b/winpython/utils.py index 7302e943..c86d202f 100644 --- a/winpython/utils.py +++ b/winpython/utils.py @@ -54,11 +54,7 @@ def onerror(function, path, excinfo): def getFileProperties(fname): """Read all properties of the given file return them as a dictionary.""" import win32api - prop_names = ( - 'Comments', 'InternalName', 'ProductName', 'CompanyName', 'LegalCopyright', - 'ProductVersion', 'FileDescription', 'LegalTrademarks', 'PrivateBuild', - 'FileVersion', 'OriginalFilename', 'SpecialBuild' - ) + prop_names = ('ProductName', 'ProductVersion', 'FileDescription', 'FileVersion') props = {'FixedFileInfo': None, 'StringFileInfo': None, 'FileVersion': None} try: @@ -83,16 +79,11 @@ def getFileProperties(fname): def get_special_folder_path(path_name): """Return special folder path.""" from win32com.shell import shell, shellcon - for maybe in """ - CSIDL_COMMON_STARTMENU CSIDL_STARTMENU CSIDL_COMMON_APPDATA - CSIDL_LOCAL_APPDATA CSIDL_APPDATA CSIDL_COMMON_DESKTOPDIRECTORY - CSIDL_DESKTOPDIRECTORY CSIDL_COMMON_STARTUP CSIDL_STARTUP - CSIDL_COMMON_PROGRAMS CSIDL_PROGRAMS CSIDL_PROGRAM_FILES_COMMON - CSIDL_PROGRAM_FILES CSIDL_FONTS""".split(): - if maybe == path_name: - csidl = getattr(shellcon, maybe) - return shell.SHGetSpecialFolderPath(0, csidl, False) - raise ValueError(f"{path_name} is an unknown path ID") + try: + csidl = getattr(shellcon, path_name) + return shell.SHGetSpecialFolderPath(0, csidl, False) + except OSError: + print(f"{path_name} is an unknown path ID") def get_winpython_start_menu_folder(current=True): """Return WinPython Start menu shortcuts folder.""" @@ -337,7 +328,7 @@ def buildflit_wininst(root, python_exe=None, copy_to=None, verbose=False): break else: raise RuntimeError(f"Build failed: not a pure Python package? {distdir}") - + src_fname = distdir / distname if copy_to: dst_fname = Path(copy_to) / distname From 49079a001a9303220e538ead8b5cd38230a799d0 Mon Sep 17 00:00:00 2001 From: stonebig Date: Wed, 16 Apr 2025 23:06:29 +0200 Subject: [PATCH 151/305] remove what is useless --- winpython/utils.py | 6 ------ 1 file changed, 6 deletions(-) diff --git a/winpython/utils.py b/winpython/utils.py index c86d202f..7939c3a3 100644 --- a/winpython/utils.py +++ b/winpython/utils.py @@ -279,12 +279,6 @@ def patch_sourcefile(fname, in_text, out_text, silent_mode=False): if Path(fname).is_file() and in_text != out_text: replace_in_file(Path(fname), [(in_text, out_text)]) -def _create_temp_dir(): - """Create a temporary directory and remove it at exit""" - tmpdir = tempfile.mkdtemp(prefix='wppm_') - atexit.register(lambda path: shutil.rmtree(path, onexc=onerror), tmpdir) - return tmpdir - def extract_archive(fname, targetdir=None, verbose=False): """Extract .zip, .exe or .tar.gz archive to a temporary directory. Return the temporary directory path""" From caa4020bec215c6cd36ce9210c4fbe4574bdef27 Mon Sep 17 00:00:00 2001 From: stonebig Date: Thu, 17 Apr 2025 14:03:23 +0200 Subject: [PATCH 152/305] simplify tools.ini tricky plumbery for just 4 tools --- make.py | 28 ++++++++++-------------- winpython/__init__.py | 2 +- winpython/data/tools.ini | 47 ---------------------------------------- winpython/utils.py | 21 ------------------ 4 files changed, 13 insertions(+), 85 deletions(-) delete mode 100644 winpython/data/tools.ini diff --git a/make.py b/make.py index c560d594..8d6e57c0 100644 --- a/make.py +++ b/make.py @@ -130,26 +130,22 @@ def package_index_markdown(self) -> str: def _get_installed_tools_markdown(self) -> str: """Generates Markdown for installed tools section in package index.""" - installed_tools = [] - - def get_tool_path(relative_path): - path = self.winpython_directory / relative_path if self.winpython_directory else None - return path if path and path.exists() else None + tool_lines = [] - if nodejs_path := get_tool_path(NODEJS_RELATIVE_PATH): - installed_tools.append(("Nodejs", utils.get_nodejs_version(nodejs_path))) - installed_tools.append(("npmjs", utils.get_npmjs_version(nodejs_path))) + if (nodejs_path := self.winpython_directory / NODEJS_RELATIVE_PATH).exists(): + version = utils.get_nodejs_version(nodejs_path) + tool_lines.append(f"[Nodejs](https://nodejs.org) | {version} | a JavaScript runtime built on Chrome's V8 JavaScript engine") + version = utils.get_npmjs_version(nodejs_path) + tool_lines.append(f"[npmjs](https://www.npmjs.com) | {version} | a package manager for JavaScript") - if pandoc_exe := get_tool_path("t/pandoc.exe"): - installed_tools.append(("Pandoc", utils.get_pandoc_version(str(pandoc_exe.parent)))) + if (pandoc_exe := self.winpython_directory / "t" / "pandoc.exe").exists(): + version = utils.get_pandoc_version(str(pandoc_exe.parent)) + tool_lines.append(f"[Pandoc](https://pandoc.org) | {version} | an universal document converter") - if vscode_exe := get_tool_path("t/VSCode/Code.exe"): - installed_tools.append(("VSCode", utils.getFileProperties(str(vscode_exe))["FileVersion"])) + if vscode_exe := (self.winpython_directory / "t" / "VSCode" / "Code.exe").exists(): + version = utils.getFileProperties(str(vscode_exe))["FileVersion"] + tool_lines.append(f"[VSCode](https://code.visualstudio.com) | {version} | a source-code editor developed by Microsoft") - tool_lines = [] - for name, version in installed_tools: - metadata = utils.get_package_metadata("tools.ini", name) - tool_lines.append(f"[{name}]({metadata['url']}) | {version} | {metadata['description']}") return "\n".join(tool_lines) def _get_installed_packages_markdown(self) -> str: diff --git a/winpython/__init__.py b/winpython/__init__.py index b1267b4e..8bddcb81 100644 --- a/winpython/__init__.py +++ b/winpython/__init__.py @@ -28,6 +28,6 @@ OTHER DEALINGS IN THE SOFTWARE. """ -__version__ = '15.2.20250412' +__version__ = '15.3.20250417' __license__ = __doc__ __project_url__ = 'http://winpython.github.io/' diff --git a/winpython/data/tools.ini b/winpython/data/tools.ini deleted file mode 100644 index 0f27fc8f..00000000 --- a/winpython/data/tools.ini +++ /dev/null @@ -1,47 +0,0 @@ -[gettext] -description=GNU gettext Win32 porting - the GNU translation tool (useful tools for pygettext, a standard library module) -url=https://sourceforge.net/projects/gettext - -[julia] -description=The Julia Langage -url=https://julialang.org/ - -[mingw32] -description=C/C++ and Fortran compilers (Mingwpy static toolchain version) -url=https://github.com/numpy/numpy/wiki/Mingw-static-toolchain - -[pandoc] -description=a universal document converter -url=https://pandoc.org/ - -[r] -description=The R Project for Statistical Computing -url=https://www.r-project.org - -[scite] -description=SCIntilla based Text Editor - Multilanguage, powerful and light-weight text editor -url=http://www.scintilla.org/SciTE.html - -[tortoisehg] -description=Set of graphical tools and a shell extension for the Mercurial distributed revision control system -url=https://tortoisehg.bitbucket.io/ - -[winmerge] -description=Open Source differencing and merging tool for Windows -url=http://winmerge.org - -[nodejs] -description=a JavaScript runtime built on Chrome's V8 JavaScript engine -url=https://nodejs.org - -[npmjs] -description=a package manager for JavaScript -url=https://www.npmjs.com/ - -[yarnpkg] -description=a package manager for JavaScriptFast, reliable, and secure dependency management -url=https://yarnpkg.com/lang/en/ - -[ffmpeg] -description=a collection of libraries and tools to process multimedia content such as audio, video, subtitles and related metadata -url=https://ffmpeg.org diff --git a/winpython/utils.py b/winpython/utils.py index 7939c3a3..0ee7c875 100644 --- a/winpython/utils.py +++ b/winpython/utils.py @@ -379,27 +379,6 @@ def normalize(this): """Apply PEP 503 normalization to the string.""" return re.sub(r"[-_.]+", "-", this).lower() -def get_package_metadata(database, name): - """Extract infos (description, url) from the local database.""" - DATA_PATH = Path(sys.modules['winpython'].__file__).parent / 'data' - db = cp.ConfigParser() - filepath = Path(database) if Path(database).is_absolute() else DATA_PATH / database - db.read_file(open(str(filepath), encoding=guess_encoding(filepath)[0])) - - my_metadata = { - "description": "", - "url": f"https://pypi.org/project/{name}", - } - for key in my_metadata: - for name2 in (name, normalize(name)): - try: - my_metadata[key] = db.get(name2, key) - break - except (cp.NoSectionError, cp.NoOptionError): - pass - - return my_metadata - if __name__ == '__main__': print_box("Test") dname = sys.prefix From 82616fca78d1f6a5adf820192501857c51061be9 Mon Sep 17 00:00:00 2001 From: stonebig Date: Thu, 17 Apr 2025 21:52:50 +0200 Subject: [PATCH 153/305] simplify further tools plumbery --- make.py | 8 ++++---- winpython/utils.py | 12 ------------ 2 files changed, 4 insertions(+), 16 deletions(-) diff --git a/make.py b/make.py index 8d6e57c0..aae72726 100644 --- a/make.py +++ b/make.py @@ -133,13 +133,13 @@ def _get_installed_tools_markdown(self) -> str: tool_lines = [] if (nodejs_path := self.winpython_directory / NODEJS_RELATIVE_PATH).exists(): - version = utils.get_nodejs_version(nodejs_path) - tool_lines.append(f"[Nodejs](https://nodejs.org) | {version} | a JavaScript runtime built on Chrome's V8 JavaScript engine") - version = utils.get_npmjs_version(nodejs_path) + version = utils.exec_shell_cmd("node -v", nodejs_path).splitlines()[0] + tool_lines.append(f"[Nodejs](https://nodejs.org) | {version} | xa JavaScript runtime built on Chrome's V8 JavaScript engine") + version = utils.exec_shell_cmd("npm -v", nodejs_path).splitlines()[0] tool_lines.append(f"[npmjs](https://www.npmjs.com) | {version} | a package manager for JavaScript") if (pandoc_exe := self.winpython_directory / "t" / "pandoc.exe").exists(): - version = utils.get_pandoc_version(str(pandoc_exe.parent)) + version = utils.exec_shell_cmd("pandoc -v", pandoc_exe.parent).splitlines()[0].split(" ")[-1] tool_lines.append(f"[Pandoc](https://pandoc.org) | {version} | an universal document converter") if vscode_exe := (self.winpython_directory / "t" / "VSCode" / "Code.exe").exists(): diff --git a/winpython/utils.py b/winpython/utils.py index 0ee7c875..98a2b1f0 100644 --- a/winpython/utils.py +++ b/winpython/utils.py @@ -166,18 +166,6 @@ def exec_run_cmd(args, path=None): process = subprocess.run(args, capture_output=True, cwd=path, text=True) return process.stdout -def get_nodejs_version(path): - """Return version of the Nodejs installed in *path*.""" - return exec_shell_cmd("node -v", path).splitlines()[0] - -def get_npmjs_version(path): - """Return version of the Nodejs installed in *path*.""" - return exec_shell_cmd("npm -v", path).splitlines()[0] - -def get_pandoc_version(path): - """Return version of the Pandoc executable in *path*.""" - return exec_shell_cmd("pandoc -v", path).splitlines()[0].split(" ")[-1] - def python_query(cmd, path): """Execute Python command using the Python interpreter located in *path*.""" the_exe = get_python_executable(path) From cae5cacada2e237dc4ba28ddea74e29c4ddf72b7 Mon Sep 17 00:00:00 2001 From: stonebig Date: Thu, 17 Apr 2025 23:01:03 +0200 Subject: [PATCH 154/305] cosmetic simplification sorting into gemini flash2.5 output --- winpython/wppm.py | 70 ++++++++++++++--------------------------------- 1 file changed, 21 insertions(+), 49 deletions(-) diff --git a/winpython/wppm.py b/winpython/wppm.py index 640748d9..48c3246b 100644 --- a/winpython/wppm.py +++ b/winpython/wppm.py @@ -25,8 +25,8 @@ def __init__(self, fname: str, suggested_summary: str = None): self.fname = fname self.description = piptree.sum_up(suggested_summary) if suggested_summary else "" self.name, self.version = None, None - if fname.endswith((".zip", ".tar.gz", ".whl")): - bname = Path(self.fname).name #wheel style name like "sqlite_bro-1.0.0..." + if fname.lower().endswith((".zip", ".tar.gz", ".whl")): + bname = Path(self.fname).name # e.g., "sqlite_bro-1.0.0..." infos = utils.get_source_package_infos(bname) # get name, version if infos: self.name, self.version = utils.normalize(infos[0]), infos[1] @@ -40,7 +40,7 @@ def __str__(self): class Distribution: """Handles operations on a WinPython distribution.""" def __init__(self, target: str = None, verbose: bool = False): - self.target = target or os.path.dirname(sys.executable) # Default target more explicit + self.target = target or str(Path(sys.executable).parent) # Default target more explicit self.verbose = verbose self.pip = None self.to_be_removed = [] @@ -265,90 +265,62 @@ def main(test=False): parser.add_argument( "--register", dest="registerWinPython", - action="store_const", - const=True, - default=False, + action="store_true", # Store True when flag is present help=registerWinPythonHelp, ) parser.add_argument( "--unregister", dest="unregisterWinPython", - action="store_const", - const=True, - default=False, + action="store_true", help=unregisterWinPythonHelp, ) parser.add_argument( - "-v", - "--verbose", - dest="verbose", - action="store_const", - const=True, - default=False, + "-v", "--verbose", + action="store_true", help="show more details on packages and actions", ) parser.add_argument( - "-ls", - "--list", - dest="list", - action="store_const", - const=True, - default=False, - help=f"list packages matching the given [optionnal] package expression: wppm -ls, wppm -ls pand", + "-ls", "--list", + action="store_true", + help="list installed packages matching the given [optional] package expression: wppm -ls, wppm -ls pand", ) parser.add_argument( "-p", dest="pipdown", - action="store_const", - const=True, - default=False, - help=f"show Package dependancies of the given package[option]: wppm -p pandas[test]", + action="store_true", + help="show Package dependencies of the given package[option]: wppm -p pandas[test]", ) parser.add_argument( "-r", dest="pipup", - action="store_const", - const=True, - default=False, + action="store_true", help=f"show Reverse dependancies of the given package[option]: wppm -r pytest[test]", ) parser.add_argument( - "-l", - dest="levels", + "-l", "--levels", type=int, default=2, - help=f"show 'LEVELS' levels of dependancies of the package, default is 2: wppm -p pandas -l1", + help="show 'LEVELS' levels of dependencies (with -p, -r), default is 2: wppm -p pandas -l1", ) parser.add_argument( "-lsa", dest="all", - action="store_const", - const=True, - default=False, + action="store_true", help=f"list details of package names matching given regular expression: wppm -lsa pandas -l1", ) parser.add_argument( - "-t", - dest="target", + "-t", "--target", default=sys.prefix, help=f'path to target Python distribution (default: "{sys.prefix}")', ) parser.add_argument( - "-i", - "--install", - dest="install", - action="store_const", - const=True, - default=False, + "-i", "--install", + action="store_true", help="install a given package wheel (use pip for more features)", ) parser.add_argument( - "-u", - "--uninstall", - dest="uninstall", - action="store_const", - const=True, - default=False, + "-u", "--uninstall", + action="store_true", # Store True when flag is present help="uninstall package (use pip for more features)", ) args = parser.parse_args() From 35e5f2d6e2142ce4aaca4213a9e93820df92a668 Mon Sep 17 00:00:00 2001 From: stonebig Date: Thu, 17 Apr 2025 23:21:27 +0200 Subject: [PATCH 155/305] cosmetic simplification sorting into gemini flash2.5 output --- winpython/wppm.py | 329 ++++++++++++++++++++++------------------------ 1 file changed, 157 insertions(+), 172 deletions(-) diff --git a/winpython/wppm.py b/winpython/wppm.py index 48c3246b..3989a3c5 100644 --- a/winpython/wppm.py +++ b/winpython/wppm.py @@ -14,7 +14,7 @@ import json from pathlib import Path from argparse import ArgumentParser, RawTextHelpFormatter -from winpython import utils, piptree +from winpython import utils, piptree, associate # Workaround for installing PyVISA on Windows from source: os.environ["HOME"] = os.environ["USERPROFILE"] @@ -234,182 +234,167 @@ def install_bdist_direct(self, package, install_options=None): self._print_done() def main(test=False): - if test: - sbdir = Path(__file__).parents[3] / "sandbox" - tmpdir = sbdir / "tobedeleted" - fname = sbdir / "VTK-5.10.0-Qt-4.7.4.win32-py2.7.exe" - print(Package(str(fname))) + + registerWinPythonHelp = f"Register distribution: associate file extensions, icons and context menu with this WinPython" + unregisterWinPythonHelp = f"Unregister distribution: de-associate file extensions, icons and context menu from this WinPython" + parser = ArgumentParser( + description="WinPython Package Manager: handle a WinPython Distribution and its packages", + formatter_class=RawTextHelpFormatter, + ) + parser.add_argument( + "fname", + metavar="package", + nargs="?", + default="", + type=str, + help="optional package name or package wheel", + ) + parser.add_argument( + "--register", + dest="registerWinPython", + action="store_true", # Store True when flag is present + help=registerWinPythonHelp, + ) + parser.add_argument( + "--unregister", + dest="unregisterWinPython", + action="store_true", + help=unregisterWinPythonHelp, + ) + parser.add_argument( + "-v", "--verbose", + action="store_true", + help="show more details on packages and actions", + ) + parser.add_argument( + "-ls", "--list", + action="store_true", + help="list installed packages matching the given [optional] package expression: wppm -ls, wppm -ls pand", + ) + parser.add_argument( + "-p", + dest="pipdown", + action="store_true", + help="show Package dependencies of the given package[option]: wppm -p pandas[test]", + ) + parser.add_argument( + "-r", + dest="pipup", + action="store_true", + help=f"show Reverse dependancies of the given package[option]: wppm -r pytest[test]", + ) + parser.add_argument( + "-l", "--levels", + type=int, + default=2, + help="show 'LEVELS' levels of dependencies (with -p, -r), default is 2: wppm -p pandas -l1", + ) + parser.add_argument( + "-lsa", + dest="all", + action="store_true", + help=f"list details of package names matching given regular expression: wppm -lsa pandas -l1", + ) + parser.add_argument( + "-t", "--target", + default=sys.prefix, + help=f'path to target Python distribution (default: "{sys.prefix}")', + ) + parser.add_argument( + "-i", "--install", + action="store_true", + help="install a given package wheel (use pip for more features)", + ) + parser.add_argument( + "-u", "--uninstall", + action="store_true", # Store True when flag is present + help="uninstall package (use pip for more features)", + ) + args = parser.parse_args() + targetpython = None + if args.target and args.target != sys.prefix: + targetpython = args.target if args.target.lower().endswith('.exe') else str(Path(args.target) / 'python.exe') + if args.install and args.uninstall: + raise RuntimeError("Incompatible arguments: --install and --uninstall") + if args.registerWinPython and args.unregisterWinPython: + raise RuntimeError("Incompatible arguments: --install and --uninstall") + if args.pipdown: + pip = piptree.PipData(targetpython) + pack, extra, *other = (args.fname + "[").replace("]", "[").split("[") + print(pip.down(pack, extra, args.levels, verbose=args.verbose)) sys.exit() - target = Path(utils.BASE_DIR) / "build" / "winpython-2.7.3" / "python-2.7.3" - fname = Path(utils.BASE_DIR) / "packages.src" / "docutils-0.9.1.tar.gz" - dist = Distribution(str(target), verbose=True) - pack = Package(str(fname)) - print(pack.description) - # dist.install(pack) - # dist.uninstall(pack) - else: - registerWinPythonHelp = f"Register distribution: associate file extensions, icons and context menu with this WinPython" - unregisterWinPythonHelp = f"Unregister distribution: de-associate file extensions, icons and context menu from this WinPython" - parser = ArgumentParser( - description="WinPython Package Manager: handle a WinPython Distribution and its packages", - formatter_class=RawTextHelpFormatter, - ) - parser.add_argument( - "fname", - metavar="package", - nargs="?", - default="", - type=str, - help="optional package name or package wheel", - ) - parser.add_argument( - "--register", - dest="registerWinPython", - action="store_true", # Store True when flag is present - help=registerWinPythonHelp, - ) - parser.add_argument( - "--unregister", - dest="unregisterWinPython", - action="store_true", - help=unregisterWinPythonHelp, - ) - parser.add_argument( - "-v", "--verbose", - action="store_true", - help="show more details on packages and actions", - ) - parser.add_argument( - "-ls", "--list", - action="store_true", - help="list installed packages matching the given [optional] package expression: wppm -ls, wppm -ls pand", - ) - parser.add_argument( - "-p", - dest="pipdown", - action="store_true", - help="show Package dependencies of the given package[option]: wppm -p pandas[test]", - ) - parser.add_argument( - "-r", - dest="pipup", - action="store_true", - help=f"show Reverse dependancies of the given package[option]: wppm -r pytest[test]", - ) - parser.add_argument( - "-l", "--levels", - type=int, - default=2, - help="show 'LEVELS' levels of dependencies (with -p, -r), default is 2: wppm -p pandas -l1", - ) - parser.add_argument( - "-lsa", - dest="all", - action="store_true", - help=f"list details of package names matching given regular expression: wppm -lsa pandas -l1", - ) - parser.add_argument( - "-t", "--target", - default=sys.prefix, - help=f'path to target Python distribution (default: "{sys.prefix}")', - ) - parser.add_argument( - "-i", "--install", - action="store_true", - help="install a given package wheel (use pip for more features)", - ) - parser.add_argument( - "-u", "--uninstall", - action="store_true", # Store True when flag is present - help="uninstall package (use pip for more features)", - ) - args = parser.parse_args() - targetpython = None - if args.target and args.target != sys.prefix: - targetpython = args.target if args.target.lower().endswith('.exe') else str(Path(args.target) / 'python.exe') - if args.install and args.uninstall: - raise RuntimeError("Incompatible arguments: --install and --uninstall") - if args.registerWinPython and args.unregisterWinPython: - raise RuntimeError("Incompatible arguments: --install and --uninstall") - if args.pipdown: - pip = piptree.PipData(targetpython) - pack, extra, *other = (args.fname + "[").replace("]", "[").split("[") - print(pip.down(pack, extra, args.levels, verbose=args.verbose)) - sys.exit() - elif args.pipup: - pip = piptree.PipData(targetpython) - pack, extra, *other = (args.fname + "[").replace("]", "[").split("[") - print(pip.up(pack, extra, args.levels, verbose=args.verbose)) - sys.exit() - elif args.list: - pip = piptree.PipData(targetpython) - todo = [l for l in pip.pip_list(full=True) if bool(re.search(args.fname, l[0]))] - titles = [['Package', 'Version', 'Summary'], ['_' * max(x, 6) for x in utils.columns_width(todo)]] - listed = utils.formatted_list(titles + todo, max_width=70) - for p in listed: - print(*p) - sys.exit() - elif args.all: - pip = piptree.PipData(targetpython) - todo = [l for l in pip.pip_list(full=True) if bool(re.search(args.fname, l[0]))] - for l in todo: - # print(pip.distro[l[0]]) - title = f"** Package: {l[0]} **" - print("\n" + "*" * len(title), f"\n{title}", "\n" + "*" * len(title)) - for key, value in pip.raw[l[0]].items(): - rawtext = json.dumps(value, indent=2, ensure_ascii=False) - lines = [l for l in rawtext.split(r"\n") if len(l.strip()) > 2] - if key.lower() != 'description' or args.verbose: - print(f"{key}: ", "\n".join(lines).replace('"', "")) + elif args.pipup: + pip = piptree.PipData(targetpython) + pack, extra, *other = (args.fname + "[").replace("]", "[").split("[") + print(pip.up(pack, extra, args.levels, verbose=args.verbose)) + sys.exit() + elif args.list: + pip = piptree.PipData(targetpython) + todo = [l for l in pip.pip_list(full=True) if bool(re.search(args.fname, l[0]))] + titles = [['Package', 'Version', 'Summary'], ['_' * max(x, 6) for x in utils.columns_width(todo)]] + listed = utils.formatted_list(titles + todo, max_width=70) + for p in listed: + print(*p) + sys.exit() + elif args.all: + pip = piptree.PipData(targetpython) + todo = [l for l in pip.pip_list(full=True) if bool(re.search(args.fname, l[0]))] + for l in todo: + # print(pip.distro[l[0]]) + title = f"** Package: {l[0]} **" + print("\n" + "*" * len(title), f"\n{title}", "\n" + "*" * len(title)) + for key, value in pip.raw[l[0]].items(): + rawtext = json.dumps(value, indent=2, ensure_ascii=False) + lines = [l for l in rawtext.split(r"\n") if len(l.strip()) > 2] + if key.lower() != 'description' or args.verbose: + print(f"{key}: ", "\n".join(lines).replace('"', "")) + sys.exit() + if args.registerWinPython: + print(registerWinPythonHelp) + if utils.is_python_distribution(args.target): + dist = Distribution(args.target) + else: + raise OSError(f"Invalid Python distribution {args.target}") + print(f"registering {args.target}") + print("continue ? Y/N") + theAnswer = input() + if theAnswer == "Y": + associate.register(dist.target, verbose=args.verbose) sys.exit() - if args.registerWinPython: - print(registerWinPythonHelp) - if utils.is_python_distribution(args.target): - dist = Distribution(args.target) - else: - raise OSError(f"Invalid Python distribution {args.target}") - print(f"registering {args.target}") - print("continue ? Y/N") - theAnswer = input() - if theAnswer == "Y": - from winpython import associate - associate.register(dist.target, verbose=args.verbose) - sys.exit() - if args.unregisterWinPython: - print(unregisterWinPythonHelp) - if utils.is_python_distribution(args.target): - dist = Distribution(args.target) - else: - raise OSError(f"Invalid Python distribution {args.target}") - print(f"unregistering {args.target}") - print("continue ? Y/N") - theAnswer = input() - if theAnswer == "Y": - from winpython import associate - associate.unregister(dist.target, verbose=args.verbose) - sys.exit() - elif not args.install and not args.uninstall: - args.install = True - if not Path(args.fname).is_file() and args.install: - if args.fname == "": - parser.print_help() - sys.exit() - else: - raise FileNotFoundError(f"File not found: {args.fname}") + if args.unregisterWinPython: + print(unregisterWinPythonHelp) if utils.is_python_distribution(args.target): - dist = Distribution(args.target, verbose=True) - try: - if args.uninstall: - package = dist.find_package(args.fname) - dist.uninstall(package) - else: - package = Package(args.fname) - if args.install: - dist.install(package) - except NotImplementedError: - raise RuntimeError("Package is not (yet) supported by WPPM") + dist = Distribution(args.target) else: raise OSError(f"Invalid Python distribution {args.target}") + print(f"unregistering {args.target}") + print("continue ? Y/N") + theAnswer = input() + if theAnswer == "Y": + associate.unregister(dist.target, verbose=args.verbose) + sys.exit() + elif not args.install and not args.uninstall: + args.install = True + if not Path(args.fname).is_file() and args.install: + if args.fname == "": + parser.print_help() + sys.exit() + else: + raise FileNotFoundError(f"File not found: {args.fname}") + if utils.is_python_distribution(args.target): + dist = Distribution(args.target, verbose=True) + try: + if args.uninstall: + package = dist.find_package(args.fname) + dist.uninstall(package) + else: + package = Package(args.fname) + if args.install: + dist.install(package) + except NotImplementedError: + raise RuntimeError("Package is not (yet) supported by WPPM") + else: + raise OSError(f"Invalid Python distribution {args.target}") if __name__ == "__main__": From 16eb23b148757b18dcbc2c18b72316e237e2337a Mon Sep 17 00:00:00 2001 From: stonebig Date: Sun, 20 Apr 2025 13:18:12 +0200 Subject: [PATCH 156/305] tweak associate.py, manual step --- winpython/associate.py | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/winpython/associate.py b/winpython/associate.py index 8868ea7a..c318ff24 100644 --- a/winpython/associate.py +++ b/winpython/associate.py @@ -130,7 +130,7 @@ def register(target, current=True, verbose=True): spyder = str((Path(target).parent / "Spyder.exe").resolve()) if not Path(spyder).is_file(): - spyder = f'{pythonw}" "{target}\Scripts\spyder' + spyder = rf'{pythonw}" "{target}\Scripts\spyder' winreg.SetValueEx( winreg.CreateKey(root, KEY_C2 % ("", "open")), "", @@ -157,14 +157,14 @@ def register(target, current=True, verbose=True): "", 0, winreg.REG_SZ, - '"%s" "%s\Lib\idlelib\idle.pyw" -n -e "%%1"' % (pythonw, target), + rf'"{pythonw}" "{target}\Lib\idlelib\idle.pyw" -n -e "%1"', ) winreg.SetValueEx( winreg.CreateKey(root, KEY_C2 % ("NoCon", EWI)), "", 0, winreg.REG_SZ, - '"%s" "%s\Lib\idlelib\idle.pyw" -n -e "%%1"' % (pythonw, target), + rf'"{pythonw}" "{target}\Lib\idlelib\idle.pyw" -n -e "%1"', ) winreg.SetValueEx( winreg.CreateKey(root, KEY_C2 % ("", EWS)), @@ -338,9 +338,9 @@ def register(target, current=True, verbose=True): # Create start menu entries for all WinPython launchers spec = importlib.util.find_spec('pythoncom') - if verbose and spec is None: - print(f"Can't create WinPython menu as pywin32 package is not installed") - if verbose and spec is not None: + if spec is None: + print(f"Registered WinPython, but not start menu as pywin32 package is needed") + if spec is not None: print(f'Creating WinPython menu for all icons in {target}') for path, desc, fname in _get_shortcut_data(target, current=current): utils.create_shortcut(path, desc, fname, verbose=verbose) @@ -414,8 +414,8 @@ def unregister(target, current=True, verbose=True): ) # remove menu shortcuts spec = importlib.util.find_spec('pythoncom') - if verbose and spec is None: - print(f"Can't remove WinPython menu as pywin32 package is not installed") + if spec is None: + print(f"un-Registered WinPython, but not start menu as pywin32 package is needed") if verbose and spec is not None: print(f'Removing WinPython menu for all icons in {target}') _remove_start_menu_folder(target, current=current) From 9a6e1a75d37870ac29701189847d2c6594cbf802 Mon Sep 17 00:00:00 2001 From: stonebig Date: Sun, 20 Apr 2025 23:21:17 +0200 Subject: [PATCH 157/305] modernize registering with flash 2.5 and care --- portable/scripts/register_python.bat | 3 +- portable/scripts/register_python_for_all.bat | 2 +- portable/scripts/unregister_python.bat | 3 +- .../scripts/unregister_python_for_all.bat | 2 +- winpython/associate.py | 705 ++++++++---------- 5 files changed, 325 insertions(+), 390 deletions(-) diff --git a/portable/scripts/register_python.bat b/portable/scripts/register_python.bat index 945110e6..0298a25f 100644 --- a/portable/scripts/register_python.bat +++ b/portable/scripts/register_python.bat @@ -1,4 +1,3 @@ @echo off call "%~dp0env_for_icons.bat" -cd /D "%WINPYDIR%\Scripts" -"%WINPYDIR%\python.exe" "%WINPYDIR%\Lib\site-packages\winpython\register_python.py" %* \ No newline at end of file +"%WINPYDIR%\python.exe" "%WINPYDIR%\Lib\site-packages\winpython\associate.py" diff --git a/portable/scripts/register_python_for_all.bat b/portable/scripts/register_python_for_all.bat index e9e4e7f9..9f45aa70 100644 --- a/portable/scripts/register_python_for_all.bat +++ b/portable/scripts/register_python_for_all.bat @@ -1,3 +1,3 @@ @echo off call "%~dp0env.bat" -call "%~dp0register_python.bat" --all \ No newline at end of file +"%WINPYDIR%\python.exe" "%WINPYDIR%\Lib\site-packages\winpython\associate.py" --all diff --git a/portable/scripts/unregister_python.bat b/portable/scripts/unregister_python.bat index 40a9b12e..6b170231 100644 --- a/portable/scripts/unregister_python.bat +++ b/portable/scripts/unregister_python.bat @@ -1,4 +1,3 @@ @echo off call "%~dp0env_for_icons.bat" -cd /D "%WINPYDIR%\Scripts" -"%WINPYDIR%\python.exe" "%WINPYDIR%\Lib\site-packages\winpython\unregister_python.py" %* \ No newline at end of file +"%WINPYDIR%\python.exe" "%WINPYDIR%\Lib\site-packages\winpython\associate.py" --unregister diff --git a/portable/scripts/unregister_python_for_all.bat b/portable/scripts/unregister_python_for_all.bat index 6aca706f..b1600226 100644 --- a/portable/scripts/unregister_python_for_all.bat +++ b/portable/scripts/unregister_python_for_all.bat @@ -1,3 +1,3 @@ @echo off call "%~dp0env.bat" -call "%~dp0unregister_python.bat" --all \ No newline at end of file +"%WINPYDIR%\python.exe" "%WINPYDIR%\Lib\site-packages\winpython\associate.py" --unregister --all diff --git a/winpython/associate.py b/winpython/associate.py index c318ff24..1d2796c1 100644 --- a/winpython/associate.py +++ b/winpython/associate.py @@ -1,430 +1,367 @@ # -*- coding: utf-8 -*- # +# associate.py = Register a Python distribution # Copyright © 2012 Pierre Raybaut # Licensed under the terms of the MIT License # (see winpython/__init__.py for details) -""" -Register a Python distribution - -Created on Tue Aug 21 21:46:30 2012 -""" - import sys import os from pathlib import Path import platform -import importlib - -# import subprocess - - -# Local imports +import importlib.util import winreg from winpython import utils +from argparse import ArgumentParser +# --- Constants --- KEY_C = r"Software\Classes\%s" -KEY_C0 = KEY_C % r"Python.%sFile\shell" -KEY_C1 = KEY_C % r"Python.%sFile\shell\%s" -KEY_C2 = KEY_C1 + r"\command" -KEY_DROP0 = KEY_C % r"Python.%sFile\shellex" -KEY_DROP1 = KEY_C % r"Python.%sFile\shellex\DropHandler" -KEY_I = KEY_C % r"Python.%sFile\DefaultIcon" -KEY_D = KEY_C % r"Python.%sFile" +KEY_CP = r"Software\Classes" +KEY_S = r"Software\Python" +KEY_S0 = KEY_S + r"\WinPython" # was PythonCore before PEP-0514 EWI = "Edit with IDLE" EWS = "Edit with Spyder" +DROP_HANDLER_CLSID = "{60254CA5-953B-11CF-8C96-00AA00B8708C}" -KEY_S = r"Software\Python" -KEY_S0 = KEY_S + r"\WinPython" # was PythonCore before PEP-0514 -KEY_S1 = KEY_S0 + r"\%s" +# --- Helper functions for Registry --- -def _remove_start_menu_folder(target, current=True): - "remove menu Folder for target WinPython" - import importlib.util - win32com_exists = importlib.util.find_spec('win32com') is not None +def _set_reg_value(root, key_path, name, value, reg_type=winreg.REG_SZ, verbose=False): + """Helper to create key and set a registry value using CreateKeyEx.""" + rootkey_name = "HKEY_CURRENT_USER" if root == winreg.HKEY_CURRENT_USER else "HKEY_LOCAL_MACHINE" + try: + # Use CreateKeyEx with context manager for automatic closing + # KEY_WRITE access is needed to set values + + if verbose: + print(f"{rootkey_name}\\{key_path}\\{name if name else ''}:{value}") + with winreg.CreateKeyEx(root, key_path, 0, winreg.KEY_WRITE) as key: + winreg.SetValueEx(key, name, 0, reg_type, value) + except OSError as e: + print(f"Error creating/setting registry value {rootkey_name}\\{key_path}\\{name}: {e}", file=sys.stderr) - # we return nothing if no win32com package - if win32com_exists: - utils.remove_winpython_start_menu_folder(current=current) +def _delete_reg_key(root, key_path, verbose=False): + """Helper to delete a registry key, ignoring if not found.""" + rootkey_name = "HKEY_CURRENT_USER" if root == winreg.HKEY_CURRENT_USER else "HKEY_LOCAL_MACHINE" + try: + if verbose: + print(f"{rootkey_name}\\{key_path}") + # DeleteKey can only delete keys with no subkeys. + # For keys with (still) subkeys, use DeleteKeyEx on the parent key if available + winreg.DeleteKey(root, key_path) + except FileNotFoundError: + if verbose: + print(f"Registry key not found (skipping deletion): {rootkey_name}\\{key_path}") + except OSError as e: # Catch other potential errors like key not empty + print(f"Error deleting registry key {rootkey_name}\\{key_path}: {e}", file=sys.stderr) + + +# --- Helper functions for Start Menu Shortcuts --- + +def _has_pywin32(): + """Check if pywin32 (pythoncom) is installed.""" + return importlib.util.find_spec('pythoncom') is not None -def _get_shortcut_data(target, current=True): - "get windows menu access, if win32com exists otherwise nothing" - import importlib.util - win32com_exists = importlib.util.find_spec('win32com') is not None +def _remove_start_menu_folder(target, current=True, has_pywin32=False): + "remove menu Folder for target WinPython if pywin32 exists" + if has_pywin32: + utils.remove_winpython_start_menu_folder(current=current) + else: + print("Skipping start menu removal as pywin32 package is not installed.") - # we return nothing if no win32com package - if not win32com_exists: +def _get_shortcut_data(target, current=True, has_pywin32=False): + "get windows menu access data if pywin32 exists, otherwise empty list" + if not has_pywin32: return [] - wpgroup = utils.create_winpython_start_menu_folder(current=current) + wpdir = str(Path(target).parent) data = [] for name in os.listdir(wpdir): bname, ext = Path(name).stem, Path(name).suffix - if ext == ".exe": + if ext.lower() == ".exe": + # Path for the shortcut file in the start menu folder + # This depends on utils.create_winpython_start_menu_folder creating the right path + shortcut_name = str(Path(utils.create_winpython_start_menu_folder(current=current)) / bname) + '.lnk' data.append( ( - str(Path(wpdir) / name), - bname, - str(Path(wpgroup) / bname), + str(Path(wpdir) / name), # Target executable path + bname, # Description/Name + shortcut_name, # Shortcut file path ) ) return data +# --- Registry Entry Definitions --- -def register(target, current=True, verbose=True): - """Register a Python distribution in Windows registry""" - root = winreg.HKEY_CURRENT_USER if current else winreg.HKEY_LOCAL_MACHINE +# Structure: (key_path, value_name, value, reg_type) +# Use None for value_name to set the default value of the key +REGISTRY_ENTRIES = [] - # Creating Registry entries - if verbose: - print(f'Creating WinPython registry entries for {target}') - # Extensions - winreg.SetValueEx( - winreg.CreateKey(root, KEY_C % ".py"), - "", - 0, - winreg.REG_SZ, - "Python.File", - ) - winreg.SetValueEx( - winreg.CreateKey(root, KEY_C % ".pyw"), - "", - 0, - winreg.REG_SZ, - "Python.NoConFile", - ) - winreg.SetValueEx( - winreg.CreateKey(root, KEY_C % ".pyc"), - "", - 0, - winreg.REG_SZ, - "Python.CompiledFile", - ) - winreg.SetValueEx( - winreg.CreateKey(root, KEY_C % ".pyo"), - "", - 0, - winreg.REG_SZ, - "Python.CompiledFile", - ) - - # MIME types - winreg.SetValueEx( - winreg.CreateKey(root, KEY_C % ".py"), - "Content Type", - 0, - winreg.REG_SZ, - "text/plain", - ) - winreg.SetValueEx( - winreg.CreateKey(root, KEY_C % ".pyw"), - "Content Type", - 0, - winreg.REG_SZ, - "text/plain", - ) +# --- Extensions --- +EXTENSIONS = { + ".py": "Python.File", + ".pyw": "Python.NoConFile", + ".pyc": "Python.CompiledFile", + ".pyo": "Python.CompiledFile", +} +for ext, file_type in EXTENSIONS.items(): + REGISTRY_ENTRIES.append((KEY_C % ext, None, file_type)) - # Verbs +# --- MIME types --- +MIME_TYPES = { + ".py": "text/plain", + ".pyw": "text/plain", +} +for ext, mime_type in MIME_TYPES.items(): + REGISTRY_ENTRIES.append((KEY_C % ext, "Content Type", mime_type)) + +# --- Verbs (Open, Edit with IDLE, Edit with Spyder) --- +# These depend on the python/pythonw/spyder paths +def _get_verb_entries(target): python = str((Path(target) / "python.exe").resolve()) pythonw = str((Path(target) / "pythonw.exe").resolve()) - spyder = str((Path(target).parent / "Spyder.exe").resolve()) - - if not Path(spyder).is_file(): - spyder = rf'{pythonw}" "{target}\Scripts\spyder' - winreg.SetValueEx( - winreg.CreateKey(root, KEY_C2 % ("", "open")), - "", - 0, - winreg.REG_SZ, - '"%s" "%%1" %%*' % python, - ) - winreg.SetValueEx( - winreg.CreateKey(root, KEY_C2 % ("NoCon", "open")), - "", - 0, - winreg.REG_SZ, - '"%s" "%%1" %%*' % pythonw, - ) - winreg.SetValueEx( - winreg.CreateKey(root, KEY_C2 % ("Compiled", "open")), - "", - 0, - winreg.REG_SZ, - '"%s" "%%1" %%*' % python, - ) - winreg.SetValueEx( - winreg.CreateKey(root, KEY_C2 % ("", EWI)), - "", - 0, - winreg.REG_SZ, - rf'"{pythonw}" "{target}\Lib\idlelib\idle.pyw" -n -e "%1"', - ) - winreg.SetValueEx( - winreg.CreateKey(root, KEY_C2 % ("NoCon", EWI)), - "", - 0, - winreg.REG_SZ, - rf'"{pythonw}" "{target}\Lib\idlelib\idle.pyw" -n -e "%1"', - ) - winreg.SetValueEx( - winreg.CreateKey(root, KEY_C2 % ("", EWS)), - "", - 0, - winreg.REG_SZ, - '"%s" "%%1"' % spyder, - ) - winreg.SetValueEx( - winreg.CreateKey(root, KEY_C2 % ("NoCon", EWS)), - "", - 0, - winreg.REG_SZ, - '"%s" "%%1"' % spyder, - ) - - # Drop support - handler = "{60254CA5-953B-11CF-8C96-00AA00B8708C}" - for ftype in ("", "NoCon", "Compiled"): - winreg.SetValueEx( - winreg.CreateKey(root, KEY_DROP1 % ftype), - "", - 0, - winreg.REG_SZ, - handler, - ) - # Icons - dlls = str(Path(target) / "DLLs") - winreg.SetValueEx( - winreg.CreateKey(root, KEY_I % ""), - "", - 0, - winreg.REG_SZ, - r"%s\py.ico" % dlls, - ) - winreg.SetValueEx( - winreg.CreateKey(root, KEY_I % "NoCon"), - "", - 0, - winreg.REG_SZ, - r"%s\py.ico" % dlls, - ) - winreg.SetValueEx( - winreg.CreateKey(root, KEY_I % "Compiled"), - "", - 0, - winreg.REG_SZ, - r"%s\pyc.ico" % dlls, - ) - - # Descriptions - winreg.SetValueEx( - winreg.CreateKey(root, KEY_D % ""), - "", - 0, - winreg.REG_SZ, - "Python File", - ) - winreg.SetValueEx( - winreg.CreateKey(root, KEY_D % "NoCon"), - "", - 0, - winreg.REG_SZ, - "Python File (no console)", - ) - winreg.SetValueEx( - winreg.CreateKey(root, KEY_D % "Compiled"), - "", - 0, - winreg.REG_SZ, - "Compiled Python File", - ) - - # PythonCore entries - python_infos = utils.get_python_infos(target) # ('3.11', 64) - short_version = python_infos[0] # 3.11 from ('3.11', 64) - long_version = utils.get_python_long_version(target) # 3.11.5 - key_core = (KEY_S1 % short_version) + r"\%s" # Winpython\3.11 - - # PEP-0514 additions, with standard Python practice - SupportUrl="https://winpython.github.io" - SysArchitecture = platform.architecture()[0] # '64bit' - SysVersion = '.'.join(platform.python_version_tuple()[:2]) # '3.11' - Version = platform.python_version() # '3.11.5' - - # But keep consistent with past possibilities until more alignement - SysArchitecture = f'{python_infos[1]}bit' # '64bit' - SysVersion = short_version - Version = long_version + spyder_exe = str((Path(target).parent / "Spyder.exe").resolve()) + + # Command string for Spyder, fallback to script if exe not found + spyder_cmd = rf'"{spyder_exe}" "%1"' if Path(spyder_exe).is_file() else rf'"{pythonw}" "{target}\Scripts\spyder" "%1"' + + verbs_data = [ + # Open verb + (rf"{KEY_CP}\Python.File\shell\open\command", None, rf'"{python}" "%1" %*'), + (rf"{KEY_CP}\Python.NoConFile\shell\open\command", None, rf'"{pythonw}" "%1" %*'), + (rf"{KEY_CP}\Python.CompiledFile\shell\open\command", None, rf'"{python}" "%1" %*'), + # Edit with IDLE verb + (rf"{KEY_CP}\Python.File\shell\{EWI}\command", None, rf'"{pythonw}" "{target}\Lib\idlelib\idle.pyw" -n -e "%1"'), + (rf"{KEY_CP}\Python.NoConFile\shell\{EWI}\command", None, rf'"{pythonw}" "{target}\Lib\idlelib\idle.pyw" -n -e "%1"'), + # Edit with Spyder verb + (rf"{KEY_CP}\Python.File\shell\{EWS}\command", None, spyder_cmd), + (rf"{KEY_CP}\Python.NoConFile\shell\{EWS}\command", None, spyder_cmd), + ] + return verbs_data + +# --- Drop support --- +DROP_SUPPORT_FILE_TYPES = ["Python.File", "Python.NoConFile", "Python.CompiledFile"] +for file_type in DROP_SUPPORT_FILE_TYPES: + REGISTRY_ENTRIES.append((rf"{KEY_C % file_type}\shellex\DropHandler", None, DROP_HANDLER_CLSID)) + +# --- Icons --- +def _get_icon_entries(target): + dlls_path = str(Path(target) / "DLLs") + icon_data = [ + (rf"{KEY_CP}\Python.File\DefaultIcon", None, rf"{dlls_path}\py.ico"), + (rf"{KEY_CP}\Python.NoConFile\DefaultIcon", None, rf"{dlls_path}\py.ico"), + (rf"{KEY_CP}\Python.CompiledFile\DefaultIcon", None, rf"{dlls_path}\pyc.ico"), + ] + return icon_data + +# --- Descriptions --- +DESCRIPTIONS = { + "Python.File": "Python File", + "Python.NoConFile": "Python File (no console)", + "Python.CompiledFile": "Compiled Python File", +} +for file_type, desc in DESCRIPTIONS.items(): + REGISTRY_ENTRIES.append((KEY_C % file_type, None, desc)) + +# --- PythonCore entries (PEP-0514 and WinPython specific) --- +def _get_pythoncore_entries(target): + python_infos = utils.get_python_infos(target) # ('3.11', 64) + short_version = python_infos[0] # e.g., '3.11' + long_version = utils.get_python_long_version(target) # e.g., '3.11.5' + + SupportUrl = "https://winpython.github.io" + SysArchitecture = f'{python_infos[1]}bit' # e.g., '64bit' + SysVersion = short_version # e.g., '3.11' + Version = long_version # e.g., '3.11.5' DisplayName = f'Python {Version} ({SysArchitecture})' - key_short = (KEY_S1 % short_version) # WinPython\3.11 - key_keys={'DisplayName':DisplayName, - 'SupportUrl':SupportUrl, - 'SysVersion':SysVersion, - 'SysArchitecture':SysArchitecture, - 'Version':Version} - - regkey = winreg.CreateKey(root, key_short) - # see https://www.programcreek.com/python/example/106949/winreg.CreateKey - # winreg.SetValueEx(key, '', reg.REG_SZ, '') - for k, v in key_keys.items(): - winreg.SetValueEx( - regkey, - k, - 0, - winreg.REG_SZ, - v, - ) - winreg.CloseKey(regkey) - - # pep-0514 additions at InstallPathLevel - ExecutablePath = python - WindowedExecutablePath = pythonw - - key_short = key_core % "InstallPath" # WinPython\3.11\InstallPath - key_keys={'ExecutablePath':ExecutablePath, - 'WindowedExecutablePath':WindowedExecutablePath} - - regkey = winreg.CreateKey(root, key_core % "InstallPath") - winreg.SetValueEx( - regkey, - "", - 0, - winreg.REG_SZ, - target + '\\', - ) - for k, v in key_keys.items(): - winreg.SetValueEx( - regkey, - k, - 0, - winreg.REG_SZ, - v, - ) - winreg.CloseKey(regkey) - - - - winreg.SetValueEx( - winreg.CreateKey(root, key_core % r"InstallPath\InstallGroup"), - "", - 0, - winreg.REG_SZ, - "Python %s" % short_version, - ) - winreg.SetValueEx( - winreg.CreateKey(root, key_core % "Modules"), - "", - 0, - winreg.REG_SZ, - "", - ) - winreg.SetValueEx( - winreg.CreateKey(root, key_core % "PythonPath"), - "", - 0, - winreg.REG_SZ, - r"%s\Lib;%s\DLLs" % (target, target), - ) - winreg.SetValueEx( - winreg.CreateKey( - root, - key_core % r"Help\Main Python Documentation", - ), - "", - 0, - winreg.REG_SZ, - r"%s\Doc\python%s.chm" % (target, long_version), - ) - - # Create start menu entries for all WinPython launchers - spec = importlib.util.find_spec('pythoncom') - if spec is None: - print(f"Registered WinPython, but not start menu as pywin32 package is needed") - if spec is not None: - print(f'Creating WinPython menu for all icons in {target}') - for path, desc, fname in _get_shortcut_data(target, current=current): - utils.create_shortcut(path, desc, fname, verbose=verbose) + python_exe = str((Path(target) / "python.exe").resolve()) + pythonw_exe = str((Path(target) / "pythonw.exe").resolve()) + + core_entries = [] + + # Main version key (WinPython\3.11) + version_key = f"{KEY_S0}\\{short_version}" + core_entries.extend([ + (version_key, 'DisplayName', DisplayName), + (version_key, 'SupportUrl', SupportUrl), + (version_key, 'SysVersion', SysVersion), + (version_key, 'SysArchitecture', SysArchitecture), + (version_key, 'Version', Version), + ]) + + # InstallPath key (WinPython\3.11\InstallPath) + install_path_key = f"{version_key}\\InstallPath" + core_entries.extend([ + (install_path_key, None, str(Path(target) / '')), # Default value is the install dir + (install_path_key, 'ExecutablePath', python_exe), + (install_path_key, 'WindowedExecutablePath', pythonw_exe), + ]) + + # InstallGroup key (WinPython\3.11\InstallPath\InstallGroup) + core_entries.append((f"{install_path_key}\\InstallGroup", None, f"Python {short_version}")) + + # Modules key (WinPython\3.11\Modules) - seems to be a placeholder key + core_entries.append((f"{version_key}\\Modules", None, "")) + + # PythonPath key (WinPython\3.11\PythonPath) + core_entries.append((f"{version_key}\\PythonPath", None, rf"{target}\Lib;{target}\DLLs")) + + # Help key (WinPython\3.11\Help\Main Python Documentation) + core_entries.append((f"{version_key}\\Help\\Main Python Documentation", None, rf"{target}\Doc\python{long_version}.chm")) + + return core_entries + + +# --- Main Register/Unregister Functions --- + +def register(target, current=True, reg_type=winreg.REG_SZ, verbose=True): + """Register a Python distribution in Windows registry and create Start Menu shortcuts""" + root = winreg.HKEY_CURRENT_USER if current else winreg.HKEY_LOCAL_MACHINE + has_pywin32 = _has_pywin32() -def unregister(target, current=True, verbose=True): - """Unregister a Python distribution in Windows registry""" - # Removing Registry entries if verbose: - print(f'Removing WinPython registry entries for {target}') + print(f'Creating WinPython registry entries for {target}') + + # Set static registry entries + for key_path, name, value in REGISTRY_ENTRIES: + _set_reg_value(root, key_path, name, value, verbose=verbose) + + # Set dynamic registry entries (verbs, icons, pythoncore) + dynamic_entries = [] + dynamic_entries.extend(_get_verb_entries(target)) + dynamic_entries.extend(_get_icon_entries(target)) + dynamic_entries.extend(_get_pythoncore_entries(target)) + + for key_path, name, value in dynamic_entries: + _set_reg_value(root, key_path, name, value) + + # Create start menu entries + if has_pywin32: + if verbose: + print(f'Creating WinPython menu for all icons in {target.parent}') + for path, desc, fname in _get_shortcut_data(target, current=current, has_pywin32=True): + try: + utils.create_shortcut(path, desc, fname, verbose=verbose) + except Exception as e: + print(f"Error creating shortcut for {desc} at {fname}: {e}", file=sys.stderr) + else: + print("Skipping start menu shortcut creation as pywin32 package is needed.") + + +def unregister(target, current=True, verbose=True): + """Unregister a Python distribution from Windows registry and remove Start Menu shortcuts""" root = winreg.HKEY_CURRENT_USER if current else winreg.HKEY_LOCAL_MACHINE - short_version = utils.get_python_infos(target)[0] - key_core = (KEY_S1 % short_version) + r"\%s" - for key in ( - # Drop support - KEY_DROP1 % "", - KEY_DROP1 % "NoCon", - KEY_DROP1 % "Compiled", - KEY_DROP0 % "", - KEY_DROP0 % "NoCon", - KEY_DROP0 % "Compiled", - # Icons - KEY_I % "NoCon", - KEY_I % "Compiled", - KEY_I % "", - # Edit with IDLE - KEY_C2 % ("", EWI), - KEY_C2 % ("NoCon", EWI), - KEY_C1 % ("", EWI), - KEY_C1 % ("NoCon", EWI), - # Edit with Spyder - KEY_C2 % ("", EWS), - KEY_C2 % ("NoCon", EWS), - KEY_C1 % ("", EWS), - KEY_C1 % ("NoCon", EWS), - # Verbs - KEY_C2 % ("", "open"), - KEY_C2 % ("NoCon", "open"), - KEY_C2 % ("Compiled", "open"), - KEY_C1 % ("", "open"), - KEY_C1 % ("NoCon", "open"), - KEY_C1 % ("Compiled", "open"), - KEY_C0 % "", - KEY_C0 % "NoCon", - KEY_C0 % "Compiled", - # Descriptions - KEY_D % "NoCon", - KEY_D % "Compiled", - KEY_D % "", - # PythonCore - key_core % r"InstallPath\InstallGroup", - key_core % "InstallPath", - key_core % "Modules", - key_core % "PythonPath", - key_core % r"Help\Main Python Documentation", - key_core % "Help", - KEY_S1 % short_version, - KEY_S0, - KEY_S, - ): - try: - if verbose: - print(key) - winreg.DeleteKey(root, key) - except WindowsError: - rootkey = "HKEY_CURRENT_USER" if current else "HKEY_LOCAL_MACHINE" - if verbose: - print( - r"Unable to remove %s\%s" % (rootkey, key), - file=sys.stderr, - ) - # remove menu shortcuts - spec = importlib.util.find_spec('pythoncom') - if spec is None: - print(f"un-Registered WinPython, but not start menu as pywin32 package is needed") - if verbose and spec is not None: - print(f'Removing WinPython menu for all icons in {target}') - _remove_start_menu_folder(target, current=current) - - #for path, desc, fname in _get_shortcut_data(target, current=current): - # if Path(fname).exists(): - # os.remove(fname) + has_pywin32 = _has_pywin32() + if verbose: + print(f'Removing WinPython registry entries for {target}') + + # List of keys to attempt to delete, ordered from most specific to general + keys_to_delete = [] + + # Add dynamic keys first (helps DeleteKey succeed) + dynamic_entries = [] + dynamic_entries.extend(_get_verb_entries(target)) + dynamic_entries.extend(_get_icon_entries(target)) + dynamic_entries.extend(_get_pythoncore_entries(target)) + + # Collect parent keys from dynamic entries + dynamic_parent_keys = {entry[0] for entry in dynamic_entries} + # Add keys from static entries + static_parent_keys = {entry[0] for entry in REGISTRY_ENTRIES} + + # Combine and add the key templates that might become empty and should be removed + python_infos = utils.get_python_infos(target) + short_version = python_infos[0] + version_key_base = f"{KEY_S0}\\{short_version}" + + # Keys from static REGISTRY_ENTRIES (mostly Class registrations) + keys_to_delete.extend([ + KEY_C % file_type + rf"\shellex\DropHandler" for file_type in DROP_SUPPORT_FILE_TYPES + ]) + keys_to_delete.extend([ + KEY_C % file_type + rf"\shellex" for file_type in DROP_SUPPORT_FILE_TYPES + ]) + #keys_to_delete.extend([ + # KEY_C % file_type + rf"\DefaultIcon" for file_type in set(EXTENSIONS.values()) # Use values as file types + #]) + keys_to_delete.extend([ + KEY_C % file_type + rf"\shell\{EWI}\command" for file_type in ["Python.File", "Python.NoConFile"] # Specific types for IDLE verb + ]) + keys_to_delete.extend([ + KEY_C % file_type + rf"\shell\{EWS}\command" for file_type in ["Python.File", "Python.NoConFile"] # Specific types for Spyder verb + ]) + # General open command keys (cover all file types) + keys_to_delete.extend([ + KEY_C % file_type + rf"\shell\open\command" for file_type in ["Python.File", "Python.NoConFile", "Python.CompiledFile"] + ]) + + + # Keys from dynamic entries (Verbs, Icons, PythonCore) - add parents + # Verbs + keys_to_delete.extend([KEY_C % file_type + rf"\shell\{EWI}" for file_type in ["Python.File", "Python.NoConFile"]]) + keys_to_delete.extend([KEY_C % file_type + rf"\shell\{EWS}" for file_type in ["Python.File", "Python.NoConFile"]]) + keys_to_delete.extend([KEY_C % file_type + rf"\shell\open" for file_type in ["Python.File", "Python.NoConFile", "Python.CompiledFile"]]) + keys_to_delete.extend([KEY_C % file_type + rf"\shell" for file_type in ["Python.File", "Python.NoConFile", "Python.CompiledFile"]]) # Shell parent + + # Icons + keys_to_delete.extend([KEY_C % file_type + rf"\DefaultIcon" for file_type in set(EXTENSIONS.values())]) # Already added above? Check for duplicates or order + keys_to_delete.extend([KEY_C % file_type for file_type in set(EXTENSIONS.values())]) # Parent keys for file types + + # Extensions/Descriptions parents + # keys_to_delete.extend([KEY_C % ext for ext in EXTENSIONS.keys()]) # e.g., .py, .pyw + + # PythonCore keys (from most specific down to the base) + keys_to_delete.extend([ + f"{version_key_base}\\InstallPath\\InstallGroup", + f"{version_key_base}\\InstallPath", + f"{version_key_base}\\Modules", + f"{version_key_base}\\PythonPath", + f"{version_key_base}\\Help\\Main Python Documentation", + f"{version_key_base}\\Help", + version_key_base, # e.g., Software\Python\WinPython\3.11 + KEY_S0, # Software\Python\WinPython + #KEY_S, # Software\Python (only if WinPython key is the only subkey - risky to delete) + ]) + + # Attempt to delete keys + # Use a set to avoid duplicates, then sort by length descending to try deleting children first + # (although DeleteKey only works on empty keys anyway, so explicit ordering is clearer) + + for key in keys_to_delete: + _delete_reg_key(root, key, verbose=verbose) + + # Remove start menu shortcuts + if has_pywin32: + if verbose: + print(f'Removing WinPython menu for all icons in {target.parent}') + _remove_start_menu_folder(target, current=current, has_pywin32=True) + # The original code had commented out code to delete .lnk files individually. + # remove_winpython_start_menu_folder is likely the intended method. + else: + print("Skipping start menu removal as pywin32 package is needed.") if __name__ == "__main__": - register(sys.prefix) - unregister(sys.prefix) \ No newline at end of file + # Ensure we are running from the target WinPython environment + parser = ArgumentParser(description="Register or Un-register Python file extensions, icons "\ + "and Windows explorer context menu to this "\ + "Python distribution.") + parser.add_argument('--unregister', action="store_true", + help='register to all users, requiring administrative '\ + 'privileges (default: register to current user only)') + parser.add_argument('--all', action="store_true", + help='action is to all users, requiring administrative '\ + 'privileges (default: to current user only)') + args = parser.parse_args() + expected_target = Path(sys.prefix) + command = "unregister" if args.unregister else "register" + users = "all" if args.all else "user" + print(f"Attempting to {command} the Python environment for {users} at: {expected_target}") + + target_dir = sys.prefix # Or get from arguments + is_current_user = True # Or get from arguments + if command == "register": + register(expected_target, current=not args.all) + else: + unregister(expected_target, current=not args.all) From 15f6202be4ef8197d93e71f0b94e26f86513183c Mon Sep 17 00:00:00 2001 From: stonebig Date: Sun, 20 Apr 2025 23:39:49 +0200 Subject: [PATCH 158/305] simplification after registering modernization --- winpython/register_python.py | 26 -------------------------- winpython/unregister_python.py | 26 -------------------------- 2 files changed, 52 deletions(-) delete mode 100644 winpython/register_python.py delete mode 100644 winpython/unregister_python.py diff --git a/winpython/register_python.py b/winpython/register_python.py deleted file mode 100644 index fc24c96b..00000000 --- a/winpython/register_python.py +++ /dev/null @@ -1,26 +0,0 @@ -#!/usr/bin/env python -import sys -from winpython import associate, utils -from argparse import ArgumentParser - -parser = ArgumentParser(description="Register Python file extensions, icons "\ - "and Windows explorer context menu to a target "\ - "Python distribution.") -try: - str_type = unicode -except NameError: - str_type = str -parser.add_argument('--target', metavar='path', type=str, - default=sys.prefix, - help='path to the target Python distribution') -parser.add_argument('--all', dest='all', action='store_const', - const=True, default=False, - help='register to all users, requiring administrative '\ - 'privileges (default: register to current user only)') -args = parser.parse_args() - -print(args.target) -if utils.is_python_distribution(args.target): - associate.register(args.target, current=not args.all) -else: - raise WindowsError(f"Invalid Python distribution {args.target}") diff --git a/winpython/unregister_python.py b/winpython/unregister_python.py deleted file mode 100644 index f0bcefda..00000000 --- a/winpython/unregister_python.py +++ /dev/null @@ -1,26 +0,0 @@ -#!/usr/bin/env python -import sys -from winpython import associate, utils -from argparse import ArgumentParser - -parser = ArgumentParser(description="unRegister Python file extensions, icons "\ - "and Windows explorer context menu to a target "\ - "Python distribution.") -try: - str_type = unicode -except NameError: - str_type = str -parser.add_argument('--target', metavar='path', type=str, - default=sys.prefix, - help='path to the target Python distribution') -parser.add_argument('--all', dest='all', action='store_const', - const=True, default=False, - help='unregister to all users, requiring administrative '\ - 'privileges (default: register to current user only)') -args = parser.parse_args() - -print(args.target) -if utils.is_python_distribution(args.target): - associate.unregister(args.target, current=not args.all) -else: - raise WindowsError(f"Invalid Python distribution {args.target}") From eeb0840b6171d08a9411a3d69a3521fac83977e5 Mon Sep 17 00:00:00 2001 From: stonebig Date: Tue, 22 Apr 2025 21:14:17 +0200 Subject: [PATCH 159/305] flash- 2.5 beta complicated things, chatgpt + manual restored order --- winpython/associate.py | 315 ++++++++++++----------------------------- 1 file changed, 93 insertions(+), 222 deletions(-) diff --git a/winpython/associate.py b/winpython/associate.py index 1d2796c1..673baf3d 100644 --- a/winpython/associate.py +++ b/winpython/associate.py @@ -8,32 +8,21 @@ import sys import os from pathlib import Path -import platform import importlib.util import winreg from winpython import utils from argparse import ArgumentParser -# --- Constants --- -KEY_C = r"Software\Classes\%s" -KEY_CP = r"Software\Classes" -KEY_S = r"Software\Python" -KEY_S0 = KEY_S + r"\WinPython" # was PythonCore before PEP-0514 -EWI = "Edit with IDLE" -EWS = "Edit with Spyder" -DROP_HANDLER_CLSID = "{60254CA5-953B-11CF-8C96-00AA00B8708C}" # --- Helper functions for Registry --- def _set_reg_value(root, key_path, name, value, reg_type=winreg.REG_SZ, verbose=False): """Helper to create key and set a registry value using CreateKeyEx.""" rootkey_name = "HKEY_CURRENT_USER" if root == winreg.HKEY_CURRENT_USER else "HKEY_LOCAL_MACHINE" + if verbose: + print(f"{rootkey_name}\\{key_path}\\{name if name else ''}:{value}") try: # Use CreateKeyEx with context manager for automatic closing - # KEY_WRITE access is needed to set values - - if verbose: - print(f"{rootkey_name}\\{key_path}\\{name if name else ''}:{value}") with winreg.CreateKeyEx(root, key_path, 0, winreg.KEY_WRITE) as key: winreg.SetValueEx(key, name, 0, reg_type, value) except OSError as e: @@ -42,9 +31,9 @@ def _set_reg_value(root, key_path, name, value, reg_type=winreg.REG_SZ, verbose= def _delete_reg_key(root, key_path, verbose=False): """Helper to delete a registry key, ignoring if not found.""" rootkey_name = "HKEY_CURRENT_USER" if root == winreg.HKEY_CURRENT_USER else "HKEY_LOCAL_MACHINE" + if verbose: + print(f"{rootkey_name}\\{key_path}") try: - if verbose: - print(f"{rootkey_name}\\{key_path}") # DeleteKey can only delete keys with no subkeys. # For keys with (still) subkeys, use DeleteKeyEx on the parent key if available winreg.DeleteKey(root, key_path) @@ -79,7 +68,6 @@ def _get_shortcut_data(target, current=True, has_pywin32=False): bname, ext = Path(name).stem, Path(name).suffix if ext.lower() == ".exe": # Path for the shortcut file in the start menu folder - # This depends on utils.create_winpython_start_menu_folder creating the right path shortcut_name = str(Path(utils.create_winpython_start_menu_folder(current=current)) / bname) + '.lnk' data.append( ( @@ -90,128 +78,86 @@ def _get_shortcut_data(target, current=True, has_pywin32=False): ) return data -# --- Registry Entry Definitions --- - -# Structure: (key_path, value_name, value, reg_type) -# Use None for value_name to set the default value of the key -REGISTRY_ENTRIES = [] - -# --- Extensions --- -EXTENSIONS = { - ".py": "Python.File", - ".pyw": "Python.NoConFile", - ".pyc": "Python.CompiledFile", - ".pyo": "Python.CompiledFile", -} -for ext, file_type in EXTENSIONS.items(): - REGISTRY_ENTRIES.append((KEY_C % ext, None, file_type)) - -# --- MIME types --- -MIME_TYPES = { - ".py": "text/plain", - ".pyw": "text/plain", -} -for ext, mime_type in MIME_TYPES.items(): - REGISTRY_ENTRIES.append((KEY_C % ext, "Content Type", mime_type)) - -# --- Verbs (Open, Edit with IDLE, Edit with Spyder) --- -# These depend on the python/pythonw/spyder paths -def _get_verb_entries(target): - python = str((Path(target) / "python.exe").resolve()) - pythonw = str((Path(target) / "pythonw.exe").resolve()) - spyder_exe = str((Path(target).parent / "Spyder.exe").resolve()) - - # Command string for Spyder, fallback to script if exe not found - spyder_cmd = rf'"{spyder_exe}" "%1"' if Path(spyder_exe).is_file() else rf'"{pythonw}" "{target}\Scripts\spyder" "%1"' - - verbs_data = [ - # Open verb - (rf"{KEY_CP}\Python.File\shell\open\command", None, rf'"{python}" "%1" %*'), - (rf"{KEY_CP}\Python.NoConFile\shell\open\command", None, rf'"{pythonw}" "%1" %*'), - (rf"{KEY_CP}\Python.CompiledFile\shell\open\command", None, rf'"{python}" "%1" %*'), - # Edit with IDLE verb - (rf"{KEY_CP}\Python.File\shell\{EWI}\command", None, rf'"{pythonw}" "{target}\Lib\idlelib\idle.pyw" -n -e "%1"'), - (rf"{KEY_CP}\Python.NoConFile\shell\{EWI}\command", None, rf'"{pythonw}" "{target}\Lib\idlelib\idle.pyw" -n -e "%1"'), - # Edit with Spyder verb - (rf"{KEY_CP}\Python.File\shell\{EWS}\command", None, spyder_cmd), - (rf"{KEY_CP}\Python.NoConFile\shell\{EWS}\command", None, spyder_cmd), - ] - return verbs_data - -# --- Drop support --- -DROP_SUPPORT_FILE_TYPES = ["Python.File", "Python.NoConFile", "Python.CompiledFile"] -for file_type in DROP_SUPPORT_FILE_TYPES: - REGISTRY_ENTRIES.append((rf"{KEY_C % file_type}\shellex\DropHandler", None, DROP_HANDLER_CLSID)) - -# --- Icons --- -def _get_icon_entries(target): - dlls_path = str(Path(target) / "DLLs") - icon_data = [ - (rf"{KEY_CP}\Python.File\DefaultIcon", None, rf"{dlls_path}\py.ico"), - (rf"{KEY_CP}\Python.NoConFile\DefaultIcon", None, rf"{dlls_path}\py.ico"), - (rf"{KEY_CP}\Python.CompiledFile\DefaultIcon", None, rf"{dlls_path}\pyc.ico"), - ] - return icon_data - -# --- Descriptions --- -DESCRIPTIONS = { - "Python.File": "Python File", - "Python.NoConFile": "Python File (no console)", - "Python.CompiledFile": "Compiled Python File", -} -for file_type, desc in DESCRIPTIONS.items(): - REGISTRY_ENTRIES.append((KEY_C % file_type, None, desc)) - - # --- PythonCore entries (PEP-0514 and WinPython specific) --- -def _get_pythoncore_entries(target): - python_infos = utils.get_python_infos(target) # ('3.11', 64) - short_version = python_infos[0] # e.g., '3.11' - long_version = utils.get_python_long_version(target) # e.g., '3.11.5' - - SupportUrl = "https://winpython.github.io" - SysArchitecture = f'{python_infos[1]}bit' # e.g., '64bit' - SysVersion = short_version # e.g., '3.11' - Version = long_version # e.g., '3.11.5' - DisplayName = f'Python {Version} ({SysArchitecture})' - - python_exe = str((Path(target) / "python.exe").resolve()) - pythonw_exe = str((Path(target) / "pythonw.exe").resolve()) - - core_entries = [] - - # Main version key (WinPython\3.11) - version_key = f"{KEY_S0}\\{short_version}" - core_entries.extend([ - (version_key, 'DisplayName', DisplayName), - (version_key, 'SupportUrl', SupportUrl), - (version_key, 'SysVersion', SysVersion), - (version_key, 'SysArchitecture', SysArchitecture), - (version_key, 'Version', Version), - ]) - # InstallPath key (WinPython\3.11\InstallPath) - install_path_key = f"{version_key}\\InstallPath" - core_entries.extend([ - (install_path_key, None, str(Path(target) / '')), # Default value is the install dir - (install_path_key, 'ExecutablePath', python_exe), - (install_path_key, 'WindowedExecutablePath', pythonw_exe), - ]) - # InstallGroup key (WinPython\3.11\InstallPath\InstallGroup) - core_entries.append((f"{install_path_key}\\InstallGroup", None, f"Python {short_version}")) +def register_in_registery(target, current=True, reg_type=winreg.REG_SZ, verbose=True) -> tuple[list[any], ...]: + """Register in Windows (like regedit)""" - # Modules key (WinPython\3.11\Modules) - seems to be a placeholder key - core_entries.append((f"{version_key}\\Modules", None, "")) - - # PythonPath key (WinPython\3.11\PythonPath) - core_entries.append((f"{version_key}\\PythonPath", None, rf"{target}\Lib;{target}\DLLs")) - - # Help key (WinPython\3.11\Help\Main Python Documentation) - core_entries.append((f"{version_key}\\Help\\Main Python Documentation", None, rf"{target}\Doc\python{long_version}.chm")) - - return core_entries + # --- Constants --- + DROP_HANDLER_CLSID = "{60254CA5-953B-11CF-8C96-00AA00B8708C}" + # --- CONFIG --- + target_path = Path(target).resolve() + python_exe = str(target_path / "python.exe") + pythonw_exe = str(target_path / "pythonw.exe") + spyder_exe = str(target_path.parent / "Spyder.exe") + icon_py = str(target / "DLLs" / "py.ico") + icon_pyc = str(target / "DLLs" / "pyc.ico") + idle_path = str(target / "Lib" / "idlelib" / "idle.pyw") + doc_path = str(target / "Doc" / "html" / "index.html") + python_infos = utils.get_python_infos(target) # ('3.11', 64) + short_version = python_infos[0] # e.g., '3.11' + version = utils.get_python_long_version(target) # e.g., '3.11.5' + arch = f'{python_infos[1]}bit' # e.g., '64bit' + display = f"Python {version} ({arch})" + + permanent_entries = [] # key_path, name, value + dynamic_entries = [] # key_path, name, value + core_entries = [] # key_path, name, value + lost_entries = [] # intermediate keys to remove later + # --- File associations --- + ext_map = {".py": "Python.File", ".pyw": "Python.NoConFile", ".pyc": "Python.CompiledFile"} + ext_label = {".py": "Python File", ".pyw": "Python File (no console)", ".pyc": "Compiled Python File"} + for ext, ftype in ext_map.items(): + permanent_entries.append((f"Software\\Classes\\{ext}", None, ftype)) + if ext in (".py", ".pyw"): + permanent_entries.append((f"Software\\Classes\\{ext}", "Content Type", "text/plain")) + + # --- Descriptions, Icons, DropHandlers --- + for ext, ftype in ext_map.items(): + dynamic_entries.append((f"Software\\Classes\\{ftype}", None, ext_label[ext])) + dynamic_entries.append((f"Software\\Classes\\{ftype}\\DefaultIcon", None, icon_py if "Compiled" not in ftype else icon_pyc)) + dynamic_entries.append((f"Software\\Classes\\{ftype}\\shellex\\DropHandler", None, DROP_HANDLER_CLSID)) + lost_entries.append((f"Software\\Classes\\{ftype}\\shellex", None, None)) + + # --- Shell commands --- + for ext, ftype in ext_map.items(): + dynamic_entries.append((f"Software\\Classes\\{ftype}\\shell\\open\\command", None, f'"{pythonw_exe if ftype=='Python.NoConFile' else python_exe} if " "%1" %*')) + lost_entries.append((f"Software\\Classes\\{ftype}\\shell\\open", None, None)) + lost_entries.append((f"Software\\Classes\\{ftype}\\shell", None, None)) + + dynamic_entries.append((rf"Software\Classes\Python.File\shell\Edit with IDLE\command", None, f'"{pythonw_exe}" "{idle_path}" -n -e "%1"')) + dynamic_entries.append((rf"Software\Classes\Python.NoConFile\shell\Edit with IDLE\command", None, f'"{pythonw_exe}" "{idle_path}" -n -e "%1"')) + lost_entries.append((rf"Software\Classes\Python.File\shell\Edit with IDLE", None, None)) + lost_entries.append((rf"Software\Classes\Python.NoConFile\shell\Edit with IDLE", None, None)) + + if Path(spyder_exe).exists(): + dynamic_entries.append((rf"Software\Classes\Python.File\shell\Edit with Spyder\command", None, f'"{spyder_exe}" "%1"')) + dynamic_entries.append((rf"Software\Classes\Python.NoConFile\shell\Edit with Spyder\command", None, f'"{spyder_exe}" "%1"')) + lost_entries.append((rf"Software\Classes\Python.File\shell\Edit with Spyder", None, None)) + lost_entries.append((rf"Software\Classes\Python.NoConFile\shell\Edit with Spyder", None, None)) + + # --- WinPython Core registry entries (PEP 514 style) --- + base = f"Software\\Python\\WinPython\\{short_version}" + core_entries.append((base, "DisplayName", display)) + core_entries.append((base, "SupportUrl", "https://winpython.github.io")) + core_entries.append((base, "SysVersion", short_version)) + core_entries.append((base, "SysArchitecture", arch)) + core_entries.append((base, "Version", version)) + + core_entries.append((f"{base}\\InstallPath", None, str(target))) + core_entries.append((f"{base}\\InstallPath", "ExecutablePath", python_exe)) + core_entries.append((f"{base}\\InstallPath", "WindowedExecutablePath", pythonw_exe)) + core_entries.append((f"{base}\\InstallPath\\InstallGroup", None, f"Python {short_version}")) + + core_entries.append((f"{base}\\Modules", None, "")) + core_entries.append((f"{base}\\PythonPath", None, f"{target}\\Lib;{target}\\DLLs")) + core_entries.append((f"{base}\\Help\\Main Python Documentation", None, doc_path)) + lost_entries.append((f"{base}\\Help", None, None)) + lost_entries.append((f"Software\\Python\\WinPython", None, None)) + + return permanent_entries, dynamic_entries, core_entries, lost_entries # --- Main Register/Unregister Functions --- @@ -223,19 +169,11 @@ def register(target, current=True, reg_type=winreg.REG_SZ, verbose=True): if verbose: print(f'Creating WinPython registry entries for {target}') - # Set static registry entries - for key_path, name, value in REGISTRY_ENTRIES: - _set_reg_value(root, key_path, name, value, verbose=verbose) - - # Set dynamic registry entries (verbs, icons, pythoncore) - dynamic_entries = [] - dynamic_entries.extend(_get_verb_entries(target)) - dynamic_entries.extend(_get_icon_entries(target)) - dynamic_entries.extend(_get_pythoncore_entries(target)) - - for key_path, name, value in dynamic_entries: - _set_reg_value(root, key_path, name, value) - + permanent_entries, dynamic_entries, core_entries, lost_entries = register_in_registery(target) + # Set registry entries for given target + for key_path, name, value in permanent_entries + dynamic_entries + core_entries: + _set_reg_value(root, key_path, name, value, verbose=verbose) + # Create start menu entries if has_pywin32: if verbose: @@ -246,8 +184,7 @@ def register(target, current=True, reg_type=winreg.REG_SZ, verbose=True): except Exception as e: print(f"Error creating shortcut for {desc} at {fname}: {e}", file=sys.stderr) else: - print("Skipping start menu shortcut creation as pywin32 package is needed.") - + print("Skipping start menu shortcut creation as pywin32 package is needed.") def unregister(target, current=True, verbose=True): """Unregister a Python distribution from Windows registry and remove Start Menu shortcuts""" @@ -256,81 +193,15 @@ def unregister(target, current=True, verbose=True): if verbose: print(f'Removing WinPython registry entries for {target}') + + permanent_entries, dynamic_entries, core_entries , lost_entries = register_in_registery(target) # List of keys to attempt to delete, ordered from most specific to general - keys_to_delete = [] - - # Add dynamic keys first (helps DeleteKey succeed) - dynamic_entries = [] - dynamic_entries.extend(_get_verb_entries(target)) - dynamic_entries.extend(_get_icon_entries(target)) - dynamic_entries.extend(_get_pythoncore_entries(target)) - - # Collect parent keys from dynamic entries - dynamic_parent_keys = {entry[0] for entry in dynamic_entries} - # Add keys from static entries - static_parent_keys = {entry[0] for entry in REGISTRY_ENTRIES} - - # Combine and add the key templates that might become empty and should be removed - python_infos = utils.get_python_infos(target) - short_version = python_infos[0] - version_key_base = f"{KEY_S0}\\{short_version}" - - # Keys from static REGISTRY_ENTRIES (mostly Class registrations) - keys_to_delete.extend([ - KEY_C % file_type + rf"\shellex\DropHandler" for file_type in DROP_SUPPORT_FILE_TYPES - ]) - keys_to_delete.extend([ - KEY_C % file_type + rf"\shellex" for file_type in DROP_SUPPORT_FILE_TYPES - ]) - #keys_to_delete.extend([ - # KEY_C % file_type + rf"\DefaultIcon" for file_type in set(EXTENSIONS.values()) # Use values as file types - #]) - keys_to_delete.extend([ - KEY_C % file_type + rf"\shell\{EWI}\command" for file_type in ["Python.File", "Python.NoConFile"] # Specific types for IDLE verb - ]) - keys_to_delete.extend([ - KEY_C % file_type + rf"\shell\{EWS}\command" for file_type in ["Python.File", "Python.NoConFile"] # Specific types for Spyder verb - ]) - # General open command keys (cover all file types) - keys_to_delete.extend([ - KEY_C % file_type + rf"\shell\open\command" for file_type in ["Python.File", "Python.NoConFile", "Python.CompiledFile"] - ]) - - - # Keys from dynamic entries (Verbs, Icons, PythonCore) - add parents - # Verbs - keys_to_delete.extend([KEY_C % file_type + rf"\shell\{EWI}" for file_type in ["Python.File", "Python.NoConFile"]]) - keys_to_delete.extend([KEY_C % file_type + rf"\shell\{EWS}" for file_type in ["Python.File", "Python.NoConFile"]]) - keys_to_delete.extend([KEY_C % file_type + rf"\shell\open" for file_type in ["Python.File", "Python.NoConFile", "Python.CompiledFile"]]) - keys_to_delete.extend([KEY_C % file_type + rf"\shell" for file_type in ["Python.File", "Python.NoConFile", "Python.CompiledFile"]]) # Shell parent - - # Icons - keys_to_delete.extend([KEY_C % file_type + rf"\DefaultIcon" for file_type in set(EXTENSIONS.values())]) # Already added above? Check for duplicates or order - keys_to_delete.extend([KEY_C % file_type for file_type in set(EXTENSIONS.values())]) # Parent keys for file types - - # Extensions/Descriptions parents - # keys_to_delete.extend([KEY_C % ext for ext in EXTENSIONS.keys()]) # e.g., .py, .pyw - - # PythonCore keys (from most specific down to the base) - keys_to_delete.extend([ - f"{version_key_base}\\InstallPath\\InstallGroup", - f"{version_key_base}\\InstallPath", - f"{version_key_base}\\Modules", - f"{version_key_base}\\PythonPath", - f"{version_key_base}\\Help\\Main Python Documentation", - f"{version_key_base}\\Help", - version_key_base, # e.g., Software\Python\WinPython\3.11 - KEY_S0, # Software\Python\WinPython - #KEY_S, # Software\Python (only if WinPython key is the only subkey - risky to delete) - ]) - - # Attempt to delete keys - # Use a set to avoid duplicates, then sort by length descending to try deleting children first - # (although DeleteKey only works on empty keys anyway, so explicit ordering is clearer) - - for key in keys_to_delete: - _delete_reg_key(root, key, verbose=verbose) + keys_to_delete = sorted(list(set(key_path for key_path , name, value in (dynamic_entries + core_entries + lost_entries))), key=len, reverse=True) + + rootkey_name = "HKEY_CURRENT_USER" if root == winreg.HKEY_CURRENT_USER else "HKEY_LOCAL_MACHINE" + for key_path in keys_to_delete: + _delete_reg_key(root, key_path, verbose=verbose) # Remove start menu shortcuts if has_pywin32: @@ -338,10 +209,10 @@ def unregister(target, current=True, verbose=True): print(f'Removing WinPython menu for all icons in {target.parent}') _remove_start_menu_folder(target, current=current, has_pywin32=True) # The original code had commented out code to delete .lnk files individually. - # remove_winpython_start_menu_folder is likely the intended method. else: print("Skipping start menu removal as pywin32 package is needed.") + if __name__ == "__main__": # Ensure we are running from the target WinPython environment parser = ArgumentParser(description="Register or Un-register Python file extensions, icons "\ From 023e4637b301c9d2d3d3a3450588fd103d1f8c17 Mon Sep 17 00:00:00 2001 From: stonebig Date: Wed, 23 Apr 2025 10:07:04 +0200 Subject: [PATCH 160/305] piptree bug for ~= constraint --- winpython/piptree.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/winpython/piptree.py b/winpython/piptree.py index abb1a082..23a53ff3 100644 --- a/winpython/piptree.py +++ b/winpython/piptree.py @@ -119,7 +119,7 @@ def _get_requires(self, package: Distribution) -> List[Dict[str, str]]: if package.requires: for req in package.requires: req_nameextra, req_marker = (req + ";").split(";")[:2] - req_nameextra = self.normalize(re.split(r" |;|==|!|>|<", req_nameextra + ";")[0]) + req_nameextra = self.normalize(re.split(r" |;|==|!|>|<|~=", req_nameextra + ";")[0]) req_key = self.normalize((req_nameextra + "[").split("[")[0]) req_key_extra = req_nameextra[len(req_key) + 1:].split("]")[0] req_version = req[len(req_nameextra):].translate(replacements) From 5a8a70ce09835c7c5c937d33a3b2fe0a61fbda14 Mon Sep 17 00:00:00 2001 From: firai Date: Fri, 25 Apr 2025 11:50:19 +0800 Subject: [PATCH 161/305] Forward command line arguments in console launcher --- portable/launchers_src/launcher_template_CONSOLE.cpp | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/portable/launchers_src/launcher_template_CONSOLE.cpp b/portable/launchers_src/launcher_template_CONSOLE.cpp index 93614b9e..2a4ceadc 100644 --- a/portable/launchers_src/launcher_template_CONSOLE.cpp +++ b/portable/launchers_src/launcher_template_CONSOLE.cpp @@ -19,6 +19,11 @@ int main() { std::wstring exeDir = exePath; exeDir = exeDir.substr(0, exeDir.find_last_of(L"\\/")); + // Get command line string + LPWSTR commandLine = GetCommandLineW(); + // Find first space to skip the current executable name + LPWSTR args = wcschr(commandLine, L' '); + // Define the path to the "scripts" directory std::wstring scriptsDir = exeDir + L"\\scripts"; @@ -40,6 +45,12 @@ int main() { // Define the command to run std::wstring target = L"cmd.exe /c \"" LAUNCH_TARGET L"\""; + // Append arguments if present + if (args) { + target += L" "; + target += args; + } + // Configure the process startup info STARTUPINFO si = { sizeof(si) }; si.dwFlags = STARTF_USESHOWWINDOW; // Prevent the window from appearing From d0fa0d2863f3523f77e56bb00f6250d67e5c2288 Mon Sep 17 00:00:00 2001 From: stonebig Date: Fri, 25 Apr 2025 11:51:20 +0200 Subject: [PATCH 162/305] adapt to recent official pypandoc wheels --- portable/scripts/env.bat | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/portable/scripts/env.bat b/portable/scripts/env.bat index 8320dab2..316f6587 100644 --- a/portable/scripts/env.bat +++ b/portable/scripts/env.bat @@ -46,3 +46,7 @@ set PATH_CLEANED= rem force default pyqt5 kit for Spyder if PyQt5 module is there if exist "%WINPYDIR%\Lib\site-packages\PyQt5\__init__.py" set QT_API=pyqt5 + +rem modern Pandoc wheel need this +if exist "%WINPYDIRBASE%\t\pandoc.exe" set PYPANDOC_PANDOC=%WINPYDIRBASE%\t\pandoc.exe + From 042ace718c72c57fbcfeebb3f74aaef2a624795a Mon Sep 17 00:00:00 2001 From: firai Date: Fri, 25 Apr 2025 18:32:35 +0800 Subject: [PATCH 163/305] Handle spaces in launcher path --- .../launcher_template_CONSOLE.cpp | 22 +++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/portable/launchers_src/launcher_template_CONSOLE.cpp b/portable/launchers_src/launcher_template_CONSOLE.cpp index 2a4ceadc..1463c980 100644 --- a/portable/launchers_src/launcher_template_CONSOLE.cpp +++ b/portable/launchers_src/launcher_template_CONSOLE.cpp @@ -21,8 +21,23 @@ int main() { // Get command line string LPWSTR commandLine = GetCommandLineW(); - // Find first space to skip the current executable name - LPWSTR args = wcschr(commandLine, L' '); + // Skip the current executable path and name + std::wstring args; + if (commandLine) { + // If path is double quoted, skip the entire double quote + if (commandLine[0] == L'"') { + LPWSTR closingQuote = wcschr(commandLine + 1, L'"'); + if (closingQuote) { + args = closingQuote + 1; // Skip closing quote and space + } + // Otherwise skip to first space + } else { + LPWSTR spacePos = wcschr(commandLine, L' '); + if (spacePos) { + args = spacePos + 1; // Skip space + } + } + } // Define the path to the "scripts" directory std::wstring scriptsDir = exeDir + L"\\scripts"; @@ -47,8 +62,7 @@ int main() { // Append arguments if present if (args) { - target += L" "; - target += args; + target += L" " + args; } // Configure the process startup info From c4564c0480dd5bb568f000946a18957431a68d66 Mon Sep 17 00:00:00 2001 From: firai Date: Fri, 25 Apr 2025 18:37:20 +0800 Subject: [PATCH 164/305] Fix args test --- portable/launchers_src/launcher_template_CONSOLE.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/portable/launchers_src/launcher_template_CONSOLE.cpp b/portable/launchers_src/launcher_template_CONSOLE.cpp index 1463c980..4156e36d 100644 --- a/portable/launchers_src/launcher_template_CONSOLE.cpp +++ b/portable/launchers_src/launcher_template_CONSOLE.cpp @@ -61,7 +61,7 @@ int main() { std::wstring target = L"cmd.exe /c \"" LAUNCH_TARGET L"\""; // Append arguments if present - if (args) { + if (!args.empty()) { target += L" " + args; } From 2684ed0766f152adee7ffe086a5e92e0870d79c6 Mon Sep 17 00:00:00 2001 From: firai Date: Fri, 25 Apr 2025 18:53:36 +0800 Subject: [PATCH 165/305] Replace console launchers --- portable/launchers_final/Jupyter Lab.exe | Bin 150528 -> 173056 bytes portable/launchers_final/Jupyter Notebook.exe | Bin 150528 -> 173056 bytes .../WinPython Command Prompt.exe | Bin 148480 -> 171008 bytes .../WinPython Control Panel.exe | Bin 150528 -> 173056 bytes .../launchers_final/WinPython Interpreter.exe | Bin 135680 -> 158208 bytes 5 files changed, 0 insertions(+), 0 deletions(-) diff --git a/portable/launchers_final/Jupyter Lab.exe b/portable/launchers_final/Jupyter Lab.exe index 98bb8bde1e2eb892eff87091b02f875179517de6..0eeec1b01af11e71d57d222f570a25af274e5a0a 100644 GIT binary patch literal 173056 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 A`v3p{ diff --git a/portable/launchers_final/Jupyter Notebook.exe b/portable/launchers_final/Jupyter Notebook.exe index 5d59af59cff017f32bfe545849be988ac711610e..419c1184126d647f2a29d4f9dfd7a0f51617b1bc 100644 GIT binary patch literal 173056 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翚@MQes6%vi%wrtA67sl^<#Jz`z) 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 Tij!t-KxAEyoxXU(66L=E_-lGX diff --git a/portable/launchers_final/WinPython Command Prompt.exe b/portable/launchers_final/WinPython Command Prompt.exe index e4e824c5310020148f960c4e867df83185c00bae..191f30bfe8e2ac876b08dfc95202c872f9447b5a 100644 GIT binary patch literal 171008 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
    4u+VwMf_D81Kw!%PA{TDrD?mpCj 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 diff --git a/portable/launchers_final/WinPython Control Panel.exe b/portable/launchers_final/WinPython Control Panel.exe index 5795bf9c7d21bed97783602689c0e32337cea753..feec0d212777638799f5ab40e87cfbb3bbd61632 100644 GIT binary patch literal 173056 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 BW-0&x diff --git a/portable/launchers_final/WinPython Interpreter.exe b/portable/launchers_final/WinPython Interpreter.exe index dfa43135546a85d8df192d519033d667cdbcbb7e..6d7cc37bc11e7a2c0df24c8a32da7f58d0c129ee 100644 GIT binary patch literal 158208 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 z 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 f&b8iB?X9+ Date: Fri, 25 Apr 2025 19:27:06 +0800 Subject: [PATCH 166/305] Pass on arguments in wpcp.bat --- portable/scripts/wpcp.bat | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/portable/scripts/wpcp.bat b/portable/scripts/wpcp.bat index 069b3544..769d4a4c 100644 --- a/portable/scripts/wpcp.bat +++ b/portable/scripts/wpcp.bat @@ -1,3 +1,3 @@ @echo off call "%~dp0env_for_icons.bat" %* -cmd.exe /k "echo wppm & wppm" \ No newline at end of file +cmd.exe /k "echo wppm & wppm" %* \ No newline at end of file From 35c7ef4ede83d27ecb90fd3d8a758cf4b54c4886 Mon Sep 17 00:00:00 2001 From: firai Date: Fri, 25 Apr 2025 20:22:10 +0800 Subject: [PATCH 167/305] Pass arguments in windows launcher template --- .../launcher_template_WINDOWS.cpp | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/portable/launchers_src/launcher_template_WINDOWS.cpp b/portable/launchers_src/launcher_template_WINDOWS.cpp index 9c878be6..e178f31e 100644 --- a/portable/launchers_src/launcher_template_WINDOWS.cpp +++ b/portable/launchers_src/launcher_template_WINDOWS.cpp @@ -19,6 +19,26 @@ int WINAPI WinMain(HINSTANCE /*hInstance*/, HINSTANCE /*hPrevInstance*/, LPSTR / std::wstring exeDir = exePath; exeDir = exeDir.substr(0, exeDir.find_last_of(L"\\/")); + // Get command line string + LPWSTR commandLine = GetCommandLineW(); + // Skip the current executable path and name + std::wstring args; + if (commandLine) { + // If path is double quoted, skip the entire double quote + if (commandLine[0] == L'"') { + LPWSTR closingQuote = wcschr(commandLine + 1, L'"'); + if (closingQuote) { + args = closingQuote + 1; // Skip closing quote and space + } + // Otherwise skip to first space + } else { + LPWSTR spacePos = wcschr(commandLine, L' '); + if (spacePos) { + args = spacePos + 1; // Skip space + } + } + } + // Define the path to the "scripts" directory std::wstring scriptsDir = exeDir + L"\\scripts"; @@ -40,6 +60,11 @@ int WINAPI WinMain(HINSTANCE /*hInstance*/, HINSTANCE /*hPrevInstance*/, LPSTR / // Define the command to run std::wstring target = L"cmd.exe /c \"" LAUNCH_TARGET L"\""; + // Append arguments if present + if (!args.empty()) { + target += L" " + args; + } + // Configure the process startup info STARTUPINFO si = { sizeof(si) }; si.dwFlags = STARTF_USESHOWWINDOW; // Prevent the window from appearing From cc06b87d0c7e3b2043e50cc7252f4c039a76bb39 Mon Sep 17 00:00:00 2001 From: firai Date: Fri, 25 Apr 2025 21:00:46 +0800 Subject: [PATCH 168/305] Revert "Replace console launchers" This reverts commit 2684ed0766f152adee7ffe086a5e92e0870d79c6. --- portable/launchers_final/Jupyter Lab.exe | Bin 173056 -> 150528 bytes portable/launchers_final/Jupyter Notebook.exe | Bin 173056 -> 150528 bytes .../WinPython Command Prompt.exe | Bin 171008 -> 148480 bytes .../WinPython Control Panel.exe | Bin 173056 -> 150528 bytes .../launchers_final/WinPython Interpreter.exe | Bin 158208 -> 135680 bytes 5 files changed, 0 insertions(+), 0 deletions(-) diff --git a/portable/launchers_final/Jupyter Lab.exe b/portable/launchers_final/Jupyter Lab.exe index 0eeec1b01af11e71d57d222f570a25af274e5a0a..98bb8bde1e2eb892eff87091b02f875179517de6 100644 GIT binary patch delta 61716 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 A`v3p{ literal 173056 zcmd?Sdwi6|_4vQZ?ve!(o<)g91zmNiv3QBbOX7m=!md0E8;KVxUXa)b(rT5$E=0K{ zZlWv?tF*PBPy4BDt-WYl+uGJDU|SP{B;0RaKwHIXb>dl)s?<{rn$Kfx|KElr_T~ zPY&L4>Z*d+mQ$~p{grvXIdkv4b?(hy^VQ#c#~pXZeP5pGo13`9_mw+*;VD=9zINv= zGtVh08RE}@{`oQMX1_b{7lHi$&xZc|5=H!HLw|G0t@`=vOWx-B(fdEoJ%4@4$2$I- zOIr2&U+Vnt&iiHH_r#C?*KaP_r=L>;_VY0vzv?UXx}MMKQEkNGxaHnKj+R+NXXo>D zJ5F;9EgUw+@dY}%f`9(@eSsgZ4hD6KgbN*xK{~1b>F6d=kjkIaQP-3&lq*ZB4J7}N ze7O_}Ixff-IL1n#w$M?vjAuomWA`zVko((P=vYRj-LDroM&{Fw@_b@%fx~WS?j?~% zn)X?L=fr0=#ChrS(>rO9^gY*)d>Nm^QFqSVTW*fu>~Q?9gH)-Yljj$C4)_c5<{Uel z!yLs6FBKQ_Jn*S}t>?_KGwMFlSH}qQee$V%!E@%$n_JH-jT3O=SWe`a!#fm|dgso( z{Z29pjvRY=@8S8-r}B*__5as@X6i_G?O0|E%2ME>%6A(m6+9Tc7)1`c&SDoTi}RP_RI>WE~xDK6)7e!Q;YmT zGuc_h3p4QC{L9Q$HuUULGhOU3n+^$q&ArAvEl{7CJXuTH_1Nbi)~D z^6kB5YGQBZg4ILxdqv&>kc{zNX1b=p40JBI(sXV}JQlS+$#_(;z_5DF)J@)~^%AW$ zQqdXAnOx@!&A4fLyL#zPhhww)KBT`{o#E!! z{u6xpz7)zM?3p~mYOF&s>i`Hd1G|j-Dj-}lb-Q$bW07fnrA%;P#!|QVYa^9!l4U{A zw6+M2c66Cz+RT7jaITqlooQMxn}O}7F@E=e9;PQt?~MCiknYpNV?)+QnaKk)^ds}E zK4d1jlQQ zdzNS%GiH&>R>Ac&!Ly*aE(WrFHR-X($;it91YXMFyW>;%{=mj}??7};vGIMpRAA$K z_rJ$?R}SCbGAJeZ-l_3D4FY}x0-n$dQ7({o)^5|f#y@9D+6A_kcx%#rsACCKxha+& zdrZ{%Vk~{Z)f(qlnHDH~Np%_pjvA{YYP}G(Hmfzn=y7f=W`$CN`o_bwrs(l7#~d=# z6YcT1!n6*_a9&K^nUSXTqPpuaaJOl28cgbB226&jP6iBog4`J6=VQRiLpOz{&tSx! zy9^_2Go$77x_n!ro%|AJ*KtROqZ0LTi`IRrL|Xk%+ydbZF-F1h3bKm!9&{Z zJgEZa zJ=xVDviGzX#7owcN#hx|#u9nn=&ykO1xquI=m6L@&2-G~Q-v^BGhO=2w}Gh>UZ>T4 z_`DJV+hZm_&@*{3)HC(p&g4^MCOfDfYU`Mw`8;&&oyCah;Zje2^@z^VQ<=DodkZ~N zXTh)!>pYR*)lQs?C;HjOK9~M#!tDn`XJ$&RFV6e}kk4o{Oda=+~*ncoj=03ZltR zyz>XKgn8!A4L$3SOoFF~)ls=qxmdu!%1x%V)eIbnpJtrWEcD|ro-UXb3Uti7#CWQe zAu3!ScKKir8xwD_hTS=9W&Zup#ziil!)W=Yj9Xxv(fptUl3j(Fzv_C&#hBmL`l$7y zjOwhREU1>UTP*=3#qIi(G9PQk2I6-6lPv9$Gl|jU=3fJdC(lQ&D;SSXv?I`j#fc#*J6Hh z;Y@S?D4EukGGS(p0Ua$nO(U}QaDvnHYa$DHWl1ZW8oEZ#WPG z{Xxb*tqZc)JJjU|v)PrhPNhr7NJ}N{5o(WFt#BIv`T$nJf0bDs@y3kt5wDq^%6Ke> zgp7%V(ltKi0E%f%Ez{HDqP{s{)zJL5JX1YE7C6(2_R2b)Y}HKFxNkOMrFwHP^x=*8 zqyvVxrotFrlg{N=<5|h7(-LFWoF-{$vrsus z&@bZ)V#JJ78cEmmA4-nB&XIUObF#I=WJ>OVHvl7EE7@dzT!KH)_3VCN~vD1Am=AHfsHKpa3|j zPiFZC(w6ja3c|X^(ua~TP-gjp8Q6n(w8zW~MbAhM7U|zb5sEyjR7#52x0t3S=Fs^D zQ^Xnw30Z*NFG6WGyzY<7c?@@*GVAh`e*p-ngESfhVKsHxQqSlDN3u6-G@lA3Kjt-> zPY{YeBGW4JJm=@7MYSS~Q`d7o;)GGn*6w@9$O_XuJJ%LUKcSf1{S1r8ebuAl-0UNgB3)P6kw z@~HK3KlTSA`T9O2e_Kz_PW28XtdYE2_ilioa*>(L4q2t8ZDV||nMNM!m)u1Xy-G@e z^hcuBUqJf90tvAuMWa%Q3XoqltHbG|%aaRZh&iBMxr(4VkUcNP%rmXUzL=G$f-_1# zx5cc*NQN~?9Bt7t9pI!E?#H@-JyOnsK6na zm|Ok{2sf}LpQh;-HMXC4UpPXdN~)8p=3h7|JtDz4(b|q9=J!(OHw$cje$OYDkV^qw z>j?Yj%%+eYjIh6f>AsBr@9_T^|Eu`#e1@TPq^3VEv;2ulI8Ye*DHZn5hV9Vy#nUv~ z37Y9#I%_siB?r`Ui@!>KD#HAf%MYE{KtF^>K6siYvy(%sMV^VJ-8aBqpt(2Uo$~&1 z$S`x}8e!?C74uKamR?VZTySD82u+VA7_$BXyPNhYb{G7&?CxuHPrc7n6VisGP0Mq% zVCGaB^EMNvuYqfbNXw3)Wg0Ei+3=}4>;7$>7^57j$*yw_bvESdr07)GFrv&rp1t?q z0(?>cR@eX!XUlzy!1fcK!zMpjj<yH%}&5H_Xc=7|UanD>r=$zNp0q~;rt(l4R zk*D3qOf~#_N)6J>nYKI|&2|bi4jhUfJHdE*M0i%f8?V;lY@jW1fQ*U1=A=~NX%#Zb zQW{M+!amVb;VkQddT!l_b{e%>GcWZEvxK@fAr|uNqsxqermgO}$-(L!KUTtjCoJ;R z+qPPRf{=|5Vr_xk)b|fix~pBnwr*2ng;-BEB1T$SY){Z##nxLnqzSebccg(rNtnZASz9U-SKFJ#4HLVF=%k=Q@^n?qXMtrF8 z6wl<|?wGSPR!KD*Zs__hRctmbNP8Me^lSw0IamxDeA-Ili(1#wpaV5lw~2W~M7*t0 zY*Fb6E_FLo$cni9vwC*xc1BKW4ISJacD9CFCb;6mp_m#}3DHQls5*?uIX&}sKLF#{ zuC(a}RWEeY;X1(P&9nOG-wc$j&J;KjUbC&uJL_OuHk&ADH`_LNyEba0Sq|@M_cNC> zKT$zb1wCsE;zP88s~*9+)2~?Dc~=Wc)td~8${>Rv4#v?l)h-F|R%c;;&^c0NDh8Q1 zx5nqG38EyYOB#5nw-L(KFYJOh+$^JjOu~tmhZMoCVhxBdI-)1D|NJNNKEQ* zSCS-Hf9?Bv^hx`2x3LGK?Wjw*B3Upn| zHz_~3RJ*{P2y)3PM;u#Fr<$)D7C#1IB$Tc#tlVH)&TQ#4f%TgKc}GazNp@a{d8nE{ z8)(nnBG7u(=LOqKGCG1skKmPb9gAKKilHh>@yJvG?elW?okDOS1jw*_hqu&nmX z3FLUx&Jk$D4&@-vKW~*+LaITbQcTk8DrV%yV+?ItX%CH$Aana{Ag<)Ohf*u`xV#2v zJs@+TJ$pQuQE^n+Ynf2iJ~DYl^fDd^TWw)$XQ=7GSMHb@4K;P&5ubT`*xD4fx+^#6 z`D8p28M-|c=?*pRpE&c5L~8oKB13niYI?0hsi_|&ZZMN2AFBdKc69e;S;Opb|DA}V z(cu`^I;g-AFCSMosL&BVb=(|zoalby&_~&1uMg`wG?5!#TuGo#7-SDN7+06>K-#{^m1>ZZ}g? zeH0yOBzvR|E8;t?{gQU0MG>>y4^i%Sdy}1>4tI(mvX&#|zK>9-r_C3ip6v8>xaSas z0rBDvLaW(?+fK8;L^yo<2HNwnnR1&F3v5W7uPa!4$=bxJ3wYfNI)M?r;>C2X~mKmpn&FGgb0u9t_C*p=R>+XNmth2e5P=Q!C=5p1sG;8_eUv zZ}Emk+~}_o-CekJa-BDH(~Rk`Xh;{m0x?DHMDu|;ocp}YeMxwM>9D!$Alyu^Q{?o) zj73bZKaM=srflg|1hSS*Vh!7fKDpnW%(+0nIm)a_`qG(fP9Rf$T)Sasj(Jf!!Y^krV zzrOWS-<-qid+}Ikt|OT(T=ZLA<4t-KfcnbS+ss}%aOzCca*eLg=r%nWH#=eR5tXgo zrt#a7s(&GP{NsF~)AIHw3Niwe zxN?KKjr7brPZVeXc^R>BoPs?%tUZZaS#}qERZX{BQr_}P!q1rO{dV(~7Rk7q{ ziPz|O{2XeiL{)JAVI25Rc4pr*mb!mL1_{-o2RL0^I-+DuiLFSavCHK{ljXq!948t-wo#R9E!nb>Q~Gp|+d#N=yZ zDS5Zwu~_gm1iTL7S*X!m)^5va%lD{>sJfLq8KI%guOy1h`$~Ty^I8i>cAmy@KP1Jm zd{5lfyfaa(UIs-78VA|f&v&?=7bVBtO=e`lJ&7Xq_)LZcF&)cf$t@(S`L*UtX#80JZ!JrOsP zGewmad+q-W=dFc-m?bV-+Dy!9HP4gq96Ow@DYN6#Bp$&=UDIv0?e&?JgexQ6W@VeX znpW@!^wWt{_E$xd+ZgR{@0ChqgZUtfn|r-P5nQIXSGKlq*1`n*dzB;Ta0nkym;7`; z8M31XQRC*#PZYFoUJFs6Z-1Y3tlqh&o+ngmCOv-jmK|UpKyXmmTJ2s*Eyjbbl7H&Q zcDaZ=lcQ$>1~?*%P8G|2@I!z!?Q4Yqtvxx`_hqkUeJ*R$mNQq&8mrb(12jVSL#wtk z{A$}FVLLUT>SIIt_kCHP&Gff-^O7}1bE1sAflS8cIYWA{eycO}a|arkR`Nplk;X6q zpDa+n)1X^AFr$?Yf)0KC(`2C0)Q@8ueN8eCvmP>Z;mycow@ny>z}Ws$<@s?Y1sVYF0wl^^{xv@A#M z$~JxQyKE+Ey$){8w3*Sa-Vx(V3O#j(M;)-kYW^*n=M31J9CZU?sF@yj4Ufz*i2c%` zLC6PCg_&&kn1R>kc4@#i*a7WIk2=>bTYf}Y-)EE+TKx%130-eDo?Z*vL$IA?+|hc# znA3?xWzG(4Ijy6!vU@(Ro8JYeiFE?w7P%6g{I4~>#N(wl#%k0mF_dP8&k9w0J~PAi(Xp(7&%`>(-5TdC*wIt0NvWtpY(o z7*l)J%yu-6t#Tv|ifvr|^a|RA*2LS9F$;EkErLg7=Y9T%udgMJOQ8+yw^{`0*(62cnpNf5^ zcEF}Jc8plcWS=02;9To9Q>I5e2FSZ7S=R}Cb1(0d`VONgZJK5crNOZ2H%gGBsDnm0 zG7c>`CfCie<%RzcX81^$4}1q*b zv5sYSrCHB9;%p1daV>EN=6IG2LS}eD1a&>ieTEeVPf&7Hn@)K739t2UhQy3> z;SC$J*{E!b%fNG7^`6|!KWj<<#J>%*x@-bnS3xEZZK#&o{$8MT;W zwuh~&J__x6Cjy0yu?nq8E;D_VC(r@>Y+EF-ac(9vA~o5YF|;ba<;=_=+L0RXrIrHS zdXL@u2ajm|+K^TI(XMw=SEKaY==a9heZ<0tYZ3^=A|f*cHg8Pw8~_-< zmK4c@*=W7gl1;o0)q2z8$>M6PNf#$$&P^F-jkPgk?Tn_2PpSbc!$VfcRb8;;WS*Yt zkZWmaIB?z~Z#eLE*U}-8z`C&YPS^;q%_51mjR?Fj7e#-qb~=ltF-u8^ou3;j$QiY6 zs|p#BR=8t%C><#SD+j?OC} zxH=OkOpOnWGv~l0x+Gdr`3l?%DXMn2QLZP>wpqr~IlDn(Wse$C*krLGRYYGE7_;eoivml#jsDV_G&?FIxwU@E!rG0m6Vh*|j+qG(5+GhTANt z6`F?y#ZnVJsflHh^FPQp@;}VS#BfBDtu7n7KNQ$uv_z3gv+L=g7(*cWAPW<#={9v8 ztG?j7LPn*|w4P&31jCrj7nXzWghM)0ODIC}ZSa{la%(R#@$LTC5s3GK9TbR{o@Ygq zy`_i|v!>!N;C`+Gam5Sf@I+t$4X^1nhBLZBHpik~qBw(ue8hvq<#jFbAn`ilwT5?D zBalg|BZ;-IQAnQX9AkJ&-k7N-Nui=A&ytcyB8JQ4@Hb{&a>Q_ubX2nP?HEf_f*0lH&WQ>&reKf?FshX!XUNu^P_EHW_%uhC(bNKnQvmZalygd*IV~d_9;wM5HB=H((^&D?+p#@W2k1N2 zA@z=^gMo%=i3`xf3#C_2kZdzMRXKh_&>$0#d^j8SS zu@@ncH&kY{6wu;<$OZ^*(h6-%JW4z2l68N9za2`}?d8#(tb3EfUCBD-NY?EmrwZ*G~NJ7`|h$Mv(+34&_2!iW7ZU}EN1vH_#6mfPO~n8;`AV1S0srUR5X1o zlobT=!6sA=50{?VjFFAdO4_d%3|0%4gxh?q7;w}#5ZLvY56}q?ms|F81V9UHDrUW- zIxiAw?N(2Xb#c_1QB^bMUp<$*W`(S!rqQxrb9mGzfmPMDm8i81e=6&rR(O*u7U(wa zStV)VO&*CPe@P^{Xp`4rG(T(yiwoi>@w!-C!kz2%5|rJJ+`H@n-Y;3wbg4E9l$*(M zzn3#PZ04m)enCjpysE9L!)#?vEVthx8RJJmNL!&yXDcwR;`XR>v)X>4a1b0KA_b&t z@6|2V2-M|?!Km~3+)^`17K=vK@hdanBc7mAn2-b1GZA{>US0-RX;t z+1K?$!eMrvog2pY^)^MC#H73PmVzi>{4$YGTH_a38wD|-g)dSU^64W%ZU zVFB^mf*R+#PQ|KhJIW^Bf_gX}gay=y}e@e2jVu(St~l z3Xz)Gm$NX7e$c!jF+{z_YxMF85qg>`e@z6O=fBk>aFQ zHUObP#M4`sU4!V%W=~VK9_Op^jCLjPOz@p8%R0871wqpaRft96ViU&$SkZ9Pc_mU& zv|N1=WM_PtlY1OqYP3S-rsWZ+n2FF_MAdF!B$>0OmesR=8^CXHgkiSTPRk57t51w$ z7P^X}I}-=e@3rSbr6~rg(6y-ZiAg*%ozT^Bl-O zt6^D9mt8es!ru5XO_$Y7;W?z~GU;0Uw9K(8O@osS6^U3mUx%%;yT5uMetI3j>Z1vGb;h#DU{Y}!CBmHT2_LmWi3`hQo{e|hlo`YMh z0g9bjm&Y4P8~NNiO|{xZ^E?9oXsu@^$DOzdyLO_8Ss)T!wsancsjLz=scem30u69N zB`XJ{*2Zs@0du2-W~N&uZ){|`ewp{AU9qN-vgt`p>bF#5m2~hfXL0hI)^-)JvoRj+ z9TOT@+>qm66*whU$@j>Me|wqKgogaDNy2QhrT_Xs;wadMtFRh3FpEO~QNU2W)={vq8>z~hrNE9`NR z5$cn9RDTtRT-Ygh71}mEJq(yq+l!=uifX5i(y9&HrqoU26N zJ~ot&W>HKx!nMkBt!A4j^S)X-#irMz`S~QbU;^5myh{|0oksKH(ysa_^5=!)aLhHW zyFHaXF{kYO!Ox7R1|Qux)ETj^!)%j@Ac)+KOzg!5@Hx5BebM8b-5gqQt~H(bXziXm zM)HTUt)Edr$hs2yO?G1>&_4I4;KB&M!0CfR@uI_?qm4O-TXGmL+s>9hPmnuIfM-mN zwO_Dp9f(<7mDx~rgDY;-)Hk@)i+D*!(<6#9gD}N}Elf0^WC4sRf?aO7dYadmU!e{c z2KNjej@yD&cj3e>rvK`No`k15V8Hr`1Qrb;o5yqlsk_J77(YMMGsqi1%e34zyP07O zChOW)WjBGoG^6eiz;F8t65!aC)tQ-rku-i%)T$|mE)3Z`va?`tA8Osm77ey06z2$Ff@>fJOn$MC0%jkSL4yKN z`t8v>LjpDh)b&ho{qITO?=O8m3H-eGs3h>}dnBj-&q&}V0o6wWw^Q+_N#I_A`+tc9 ze#VNUek4B+$oQE)n$tz@B^8mX#E_9^nA5} z&B~-Ih>yi%CUGmKSD$H_zd>Y1YqxfOm)3g%VkuwT{i>t?K+U z>2XD0u_*(K-QQoVzrg$DG;_d0IbfqkZHUUd&u{-USFQtM)s+r-Ff1RX1JA*^`a0n1 zZ^@Az_&V(w(1H607TbbbU9R8#9k}3gI^dBG^xGF@UxovE12mhunDw~7Rb!9=`5R}B zVB}pjVoiHVj-v*;q}40@+sQ)fO-{3QN^UsDFwv`IZQr6!Ku9pjwVPKcbyl@9bW5)& zuCcbptY-fcyg+DNzQQlNpr-Z0GPZhwFUC|;%)~*ETqTy(7)q0^bEvEL3Dk%D4@;5c zy1KlNy&T~F-}LF?|EN#yPxUDvqDB1`-v3RXlAqtF;8YxP`i2KHwxCV}hDbo5=?x;{(GM2PrX|CBGi1ZrCr2q(9i+9h88cVRz)-1!8%RJ#&K&>}~>Wars zl&yzY+O<4ncwMaFF^4x*vr3@Iv7=C6z45@=0GVZylC#ts4~WUnbY9`%u%%t8ew(WK zj^v=HD`gRTi)JIY{sg#9z{1SXYMM%WSWdgsuhjxN;uV8(d_4_yYeqc3|nV; zGv}#UIth2Km^GootjE&Q1_q$P?bOn!9w^q{QNB=ii^#DP92UmF2&i*dA~Nit0W~vNKVnwRvJk3$U@?mQ{mfjeXf!Q2W!$M~%*H)( z!$oqb&k-M{=F0@EpW>rWiBqkKeh!exxe-Jq`lt8)7QKh)cpCc+l6(Qpc`QTsx_C_MBa0GFq2Ty$z2uvQ5JlpRBOpD8x0 zpaY4kN;VQHqW9q?)rU<7TFZq^5PkTl)Fx4b$6yhm~NHiZfdo^2gMB`aDtTieJEc zB!1g#a+GQGc(fU{OZZ`mDZf$cTrs9x$}CqN{qlbKWuM_Ne)hP(fl+~_EfZ3<+|!@Q zvouKU58Z+}>w}o}Q!QVM;TBdFl@kv;IGF}3+pk$!jiuBC7SQAp6D>P_yqZM)$%ckc zjF$UgX4Voj`Om`4DXKD;93P>|30e&e%Ez-KsCDQhQ+UO-StG+UkbC}|gdF$$0YUX0!LQ9d z=L*YPCUFZ?F4ciP?m4?$x!?Iu80Y;0WxNelGtP?$YsPstfq{&3|EPY(`NGLI<2+v& z=inUUWbuG;;`haAcD2jfzdAGuht#WsoS!_be>3IP;%=B{P+qk-WPH<8yY-xfZZws$ zR~fcCl$YrM^L*@6%yU^F(rP5R83{MMmBKr>#ZrqK0WljcIk8MLLs;6fK!@?b1yTWQ zk1=>aXgFqFfw$(=Wx2M)r3Wjys{{9H*rlAhyahnF3x_xIb+7}Mo;=kQ!xtSS~xn_AwFU^!S2RGXW;( zO~EyN6Sld`W}E3qr#^A2S*G0V<5SzT7`eEy2Kzado;M%OW^+47CVnP*lXv-w!}oY= z*yF`~n%_A3clq-BS)ZAY175R%=gYPUkb26v`8SufESSo}K+WmhUvQ(!D zW3#ZqATN z*kC(>Sc)k-NT;um-<aK8N$ElDLt;xy z&HhHJ0B2-Dbn&Lvce>yX8mL=O>M&O8^L(u#+daJKc0?`9%nEyWdLGL>p{P)Ti}*eY8v%! zsZn9utQlc>aj5r4m_!~C*z*IS|NGJUq&V3 zoGRVUojTT6T8#|Y^mfFWd%M4r1y@F&1$W=?^9ycyp6a+aq-7Pb*w$hVewdJ4!9=6E z`9Y4uH{UI!_%>`VZ2j~JUWcteiOOLU;Ppa)_rEEHcB{3*A%y_LIRYG;BftwZYt&nD zfMi=nQz00VdhCPo_B8eGw&{;UQ#43eRSlZUiz+rm))!{{y~VuIC+Xq#WMPSby=elh zS*iZ;7rnHsJd*Hg8Uq~WPd)(>tjMxhy5!AAvRNU#PU^4IniES*uy2WJ)bzx((rZju z7MYic$Oa_UHs)IPge)@W43@q}T50JMNXM(xC{~?(f;HVv8%$ay#Q&`YCTpPh@j25j_%>MF}}j6=ZgE1eP>QT)g!N}(N&QBQGG4N z&Q$q|K05mjzSPy%xr}C!G0pm~yVMM2#@F%YxH}$G%VB+u~3_V{qf1wGdPc{ zK0LAvxwmKBt0a)KaP>KViIxI#(KQwZ@$5ZDY5MzB@hYIO%1&xZFlxMx$?&)Sq79 z>KOzIX(}ibj>AFq;p#1xchgd!5V2bc3NyJhF;Uwn?21pRp5Y<$YMoi|P39cFB@I*i ze~iM*r6o@k3Yv!Y4D!U!=9s%n>ir}nsB{Zb!6&FBsPS3!S@;afo`)%>@mh^axUu*V z9Bq#WTC9TxQDLH1r%jS7$@wI8Khm%mxmJRZ)n_6HtoZ^z$%ddKQI*>zt*AB<-sI9U zBQeZuT3RQY!10mQ$8*xhX)C#>kurBk&jdftFAp$6JriBCjAq$SkhRTdUPxNJ=Jr9i7~dxD}H*o z+6nb6gnA6KX`xL$!@|`=NMBsX6lEea*E&csp@+7(4 zE}tXGjvO2S*d)0Ll9VcJlBBGf{f|D9e8}I(D_mcEP$dLE54}lWWrNe&mI{cn>s(B2 z=rDSJJP4>|HYnzdEzoKK4xzn4nrAD(gna5;HbIaGpMW{%>@Bc^8iNm_xTap*Ztg#l=JEPg5KCj57X{N z;wcQu@)*kBMHJWR3{u*CoeqLTaq^dQ!+qNn`h3r!NM%-}dSCd|KWc>~b}IUJjEIo6 zdK88nvt}cHq5!GyYW9o-$it;yAnA{D^JO-)rCVG9aNmxvj&7HH9x>9>mS|uu|o_aCAsaoaq96ky*W!ro<)4(AmQNJDPg;!WD>w;vl+sy*|1nJ!QASTqU z>O4K)ZOE~7)Q1mAnRTVh8k{MKrLQ1*d71Skmo+R~dM=x^VdOCyjy4!WrU>Twx?Ejc zD;91z!e%v#?qEPloS*Xm{91!W=*UjBs@?EO1NOkg^Zfk386qqT#7b>ga2yr7wxTR&MxCwU;nLa7M5?X0i3Jk6t&Ixaar_) zm&0&sIV2ZlO~ARlr>!7HYjKpco z7aG$lE~s9UV<^$;P*ic#3|;gO|e`xgp!v!*zuc&N}1FIop z9ujZPu3XOY%ker}x6KvVq$W^++v{Ru@GFsGw6a3C66gLHop_jvL+H)4xmNvvW?H@U zA*?sD_3{2YIkT5@jKCVZmB=2H%q1IIHgG<&Q^q=|PbfA5C_S-|d+yUAtPchAkBioC zFrCBl#QnUg!or$i3j<57X?X$kYB7u@F$8GcG0Wx6cxHtp=v~rLdT4mykTTsX8t&jqmx>?M=f9}heMHzO?ZTdNakYbu zJq)*#oT6~LD8^-9{h6|4%6R+ZPZO6}g?%s2BeN7$LaT*h}tj8n+}?i3*w=~Q9zbti5qAvsf@nlvImFOr9x z2`(Tj#5Z1icv57TRK|jMc!Fsi^BEFG-gP0G8V=}@lw2FdJeJ*ye$OF%e9sx^2zNAd zCM0J4C7QaStR^+t2a`H%&r(x#$P+yO-N^Yp(bNP_Wwyq8J%TVTr)B5R(NC(YmrRIQ z^SJ^_89lUypL1r`!QLW|GGovzF5#i_d0rs8B9_=7!j-Jo6_D zTS4)@#$T>ZqUF-&@@%_VJ<+q^&CJ;$YmebAva?s$dggOrp)dPB%pwvk&u%iSuOK`2 zd1tay6LwH&M{M$3cqseE{eS)UaoTC09hZfawe1>zS(qv4jdrw&;MRo!#G#8G0eG{- zS)!+IgsG)V=RZyBIH_{_OtbG+u9S%JX2A5$9mKC^e$i@lEUtvh-_yXwC+v%3{L>eP z6@L%g|Hd^Bi-NwpP<$Wa!?W)Dd7W+NmYun~^hpvn^X!u(`cQ{$r?5uNCRb(@mWGQZ z`z8Phu+D7hL{__ONt9IX+jvc%FX@vPkA7ayCwFU%%iatBNp2PLjB>4l^-k1k&OUrv zp<`tf2Rm)G6Tk14M`=zCUntTp237(w>Y;3q5k;r>g_}zJd#6Zy?`zg|o5|-~(ZD{V<#uL9&3#Ymb|Wea0~GEzO^BuLFhXZSw*zJHKqyo> zmgU3K_eshKyAi4XXFD>UfLPy5e-u_t%|ZRU7++I>0!`rwy7SVHTR<9-O7 zFp=50wrC7vlMnx9y{59R>!10$3StMSANw8Dcp~MFaKZJe;3!3c4G>*9u^2a9>VUQ11RHRAIUS5)q?v(FkAX|J9{BZz2Y2Ikti{fw|bbl z>nC~(GMoitvjO3%LS1?)va8RJt9JtX+_nv z&a0$>dpKQ_2xLp=Q&uVqRxOmnovDSM^%Lyc7P6us)=Pz3eEAByvAAYSqf()+NEFjP z>7h?%%dJ`LWOEG&t{GL=dlO~Z(jgRM+)^_<(xYr?A#v#!C(_d{P6rCL_LEb8yY)S| z>Bs$E!Clk7Zk7fXfakxF)6rV?LaiaI*E+zBO&slWt6%-rz7`JW9s4de_4F^9YcI-%ck4U~YsGj53#wOTyV_Ed`v*^VV!J)+o=`WTb0FHfWqB_^IN{XPXN zH(0&d(#Zk>=v)X_MG)rg#jsi|mxC7}kgP)5H!b@vJB0uDe;)yCr=)CHi7k zGgUJ4$8!H3G{}8>`i|i_+(6jsNRE5uCj}12`p9gzl#`Q%|1l&Jxw2#x^+`Ao zT{Gv4*Ir#&55C^l2zE!%FaV@%?fv7i5{%C?_?TmAlPdo5*k}8Elii$U|L| zi3(2@Iy`)=!QTPQV9QTJy{qJwZ+)BHDRRozYKx_tXow@qDd>{ws<;p3!W#{=Cf>89 z4anqhwMM$~W=!t9C-6!%+3QXW;m$WtC>{JLvxRs;!i_|mS!-Ii(TsVXWP^*NkL##| z`;@SWenX5F8D#e;icA|{7}%J2uc<2SaI{(rz45!7s&HIrjo;Q(g#y|dzp<%`{H^ht zrmAnq^U|iOZ_4xBrmAnr)7Mn>WFgPtO;sH3XtiES1lIt|k-2CMa2%O)*R;r^e9dxs zoVuo29w)A8lE<-Y?v+RJnxs73YwqE}h9TorxvOHzDGyot`e1Y;_yr@JTIkK3C|xDP zyq9XD_qMI)(lGt{ETM_iZJsXqOdDfhxxb9nt9^5-#5Vn2ph08)_=iDob|%Kw9)^`WUc}$E?1^KSw^qC?5ztz&aXD z`u&b*2XY)8#5JwROr03Teunzjc-d(&E1NLT=Ymh27Bn7wj*AmBmqfFu`b_DfYCLpW;=Jayi885mNYxYwR$4x|awiG&WBm@58P099)IMmv^G5n0O=gM6Nd584 z$(8WXfN^67$E(4~*^<+p>#U(xa2B6_9;^GA?HGuQTvFFes3ZqoJ^?1lT|UyJ`8YCt z!69uImRkE+vOeQz^NGH1H=Tlc0cCaGIF@GSU-V#ijM%wm+w0C6<2RkmbS|fj2HNJ2 zj5;@Hyr?_i2bvwIzYv0x46w%M=tR7g#iFZMwFM?2(O^CPZA;Nr^77k5zWPEF_S$&Coivm*u_wH3!CH|Evc~ryH z&{Cz35K%J+fVfVFxylSfAT|K8U)Tp7H9yzu39@GOxKk;peF3Max#xoCA93|UuJ^^@ z_ZYwk`#n!u3?<4U4ny9S%?vYB?vK7FXm|gW2YKH@rj=~3@}yQRGun%gY2hG#l<$$S z8tg|ewAL>_E;G9EgK=DEQees*$gnhO#aS`bIF>7`d-$*){*0mJUM`1z2^8qh(WsBh z`r0~_`e#uulXGs&dT;q4X4VXos}RiWbB$xqk=s|Z&y5`yzfhB^95QXyg?nZF8Lc;Q z&}KW;ddv}(8|dT2XzEg#_R1^0a=xE=T)H+vQ-b=4vY9khzNdk}XAc)wum?@kSicFC zXP}gzUOgxbT~5dc`Uk?4yHpUJ4#_>%o$3byG`*D7v`DbMPbyxnD>}N)C=TCc`VQKl zX^orqKl1s9tuTbFp-;?(L=iah%zY3?OFgvy;Uiw{a5GMC#@XI#o#n*_z&D)L_!3vSi30wCFu>z>h)U_NzS z&kyf@%)741guxMVl*zSBfs+6FE+pz!9kxuCzmvs&H`jjm%Ol^pqr4F8eZj1DM+hgx z-}MCb2@{m&3|8{xLSEy^>poesih63xda|v~OZ-?$T)a{92(xQalKl>mdvwGqDU>%C zO08DOKX^g;s;<$*bM1D&E{Rl7O$C3-g{3X43Fq1}H{X`?`rGnN$(nNiSRT4b$YErY zb(TAS4x<^gH)uv*wJb7*`SO?k>(c!#*a4mr{OU`W6R!=Ng*hIalO=U=V2;kg7y*om zt8SWjhI?1G^q0V(@tmX8a58)H(pzpmi%b|3xm^Q`ia%kmHAFqe@jgV%ZHgyfQW>f; z1O_xguQ5#eJ&ogb%h?a3<>zEvCEWKu_tT^>6D$u`Q{Wxxejq9F(#Iq@uswd7Ewfgx zHFtH=)bc$Ik#h>Zo0Gk>rHB4NP3e-223nb@y$~8)l1+{Q7kvBsFZezof5Epmcfq$-AAbve z){VRD@e=YMzg!CCgOQz#8lvG-+jWFYRKwb6$A>h@|d>eoe0ZOMCMfKDBkK>spdgb zHmu5>T?Y^&Y@DQ<9Ie^x&$E~D{e@%rVtp%4H$(0#*#Zs0eM;3?$MDq~$8msGEu5iU zB_Rzkhg0k@((#o04g6TKFFc_muM+9I21)Mq{}l;xPrv=N^)u``eG?M5%R|h@6TO0+ z^r*MUZl*8%XCn_X`zZN}Bn5UOdQ?}6Z3<<4lltT`sm>{LKJ%hwsBJT!!scbRj0vs1G*tFV8^sEN zcG38^!k(8;+91}Fi;#V*8}%M5SgN6 z$(;MZSUMyhG|<}s=uE%+R)J%swmHHN=9j8p_rog6!SdW!vVvR)vo`-vyPJr%L$u_D zXrrFCjb+r`eh3WN>a)kWz8T_&#U$z4lsLQT7df5T`ckU~O zK3HYtyLh9piLEzVX9FT;m0q`m<)7^))UC?%AzV7P+ z$=<0j$Gp1A!IUxEK6FA6ruCs|Ozaf~<0KU38^IsWJvp3?uw3JWwpDFF1QL<0TODLq z1`Q)oZl)LF(!=fr)S~nJv@g#tJCD)Kj*ztOnZ(k$*kXw_46CtHy$ z7}t{B+L)WWQDmrHTg^(8Pmh^8kHX}*P;%r!@P3l%9*qP=5%^7MXe+$Sp~**NS$9yDc6ws7i8e_CM%OE`N_@qb2fhD%l23uK=> z@Y=5h_3j|mm=>3-i|MCE@BorqW0gb9%JCje6rDAJZRoCn=i)!pw^Kq|3RNKU9lr3J zm2H}B$_aS_>t7rJ0TvjEi668b5Z~)uh;O3h7{^iY!xm|}`TTYT^puX+@@NSMETn+cJ@1xgXbLteAG zAi=<+-`S^&E)9eJRGXnP8)~i zkTkbW>xG4r?>sy0R33bXQPPs5M@pox&*{>sisW?36>lTlM}v&H)YrTrejHbhKK5Va zMY_LvVqX!YfYa>~BPk)Ax$99Wm6JQZhc%U}C(H8kK_8*_{1UCqq3WS3e8_B^h^=%3 znzPuNurMZ0T6Ti^85_pW$kK~O{|N}kV5%1locCj6+9oV_c|ywyqS-ctp*Kyg07e7j z%-kMI-Yz9iqhw~CEd%|Kc1b&itk#SAUZOqjnRoG3yZ9G#MqrbPOOB%4=M8LI!)_KqSbD8b`1UxH73N-9a33q=6E&TMDIHlqv7Gz%58vIf>+b*U_YW|~ z><}~UR}Z!oQCEDF@l?Sjt|5u(XykmFHGUNsyTY_zCfp4(Uj0=OMO#0q=;VRtgQ;>C2?m z=}F^tEIqY+R%)5Jj7gN>S{MV|7fJ_4^5KUm#yz;K5AbRZ?}+*{m0D}c)Hk#!FM5s4 z8L)7od?m(*o~c-`fX5jR86Q2%^ZgCd2SuOx7f_{Mn!D<-p30ki5BH`bZ)$2?3p2q+ z^MS@9g{|lu^=^M;n%dhRsZ+c9BeT`|{)nko_eW~gQ76qX~3_FJZo;91$y-~0s5Q*tw) zDtow>lwIIaY6_+x{P;BMM7+r&X?~KKYn23~Law+~7mV6GSZ+s!TaN%u3=4)2TBHruf zFVGE$*AHlUElQGAa=qlRjmy&VDdeLmkMk~b5e8*-sV-(&>nzhvvj z`!~o;bN<0Q8}E&FX<9#5s@iDgnTv&H*6D(R`KQQ9 z+ka0&AI-c79gy8gcJnK*3O$<6*K9&LV!u_(Qt6TeomJBSk#f%h9wef_l~}5-5oQI7 z<&%=Kv5@J?OG@xA7+{w=0Nk7uEM@~;4weQ}X58dy{GSG+4Nxp2! z7G59jL)QoMo_?6y9v%QwY?jGGdl!s_?`TT`Gk-UhktGB4> z1KD1=ll^VL2)}qfQ=;Ca9~}H~|Sn6d5IGG@{X<1_yKoX5c|p1!veMaz{95!}&uF5;V0?;QX82Dvm;F&Ovr=bf}eBC6$+W!UFYn zKz%n|Js#9*kG)v!v51z15X$)*1#sUVA2PLvqxbYH)?BN38C$ZmC*4n_+Cr3(wi`TVq8b1{Vm8mbG!@oHFK)%pB9 z?St7R0;Ly3XM`s#%#Q|pW!LTOO7YK}CtG8D3P<3#t@}W?#oDs9N7tf3@n}=S^g=9s z^F^7nk?A7b->N{oIQdJtluP-;LtRCAJ~1}?6WnTcB6B08&!{Bers>qqfk(kaD<>~?*aBzfe9CIt?co@ zf5XmiZQ`HHLHhX4o&fmUZQutQfW5#QOZ<(P4RRRb4MVZrG&v+yoTymOLQNE0FcO()c!4*AIanXk<7L>D?2)g+dQl690lm!V7ee+OO0`T;S9-$0+|EO& z=pSWB>76sm#jLvJGKB>3)ezK?>{nbFFDNc^?iXQl*xMO>xnyG~ext)&1x3-jQP0S; z0u7Cl7Cj~;M`PNV3sa=Lw-JIRqwS@AR`;$V1JgW%9{%ICJ#O+vAdb%%F|nYB*y-#+ zD()+tcy{!VI_;r2t~)=HTZg^oB2QwnEiy9hWQsx*qlVbaYOlF0u_Pnx{7Q5tga!rR zqHuCD{){b$&vH(BX_5d#tA7i)mK7ZXv?XegHHdIE>opcs^6eL^)Ft{1By z7sT;$eKCY7PWohTdpU#Sxx+&S?%Y0OdFHw2PaL;+AkGiD#`?F-3v*>cY*34qv1y5Z z5Llk+uj#rp%3VEE;h}7cfELX+e~KHwtxl;3v{1_yo||=kx}}CxZQV21;qaT&yMbg_pr-18E{& z2BTmP6e=2Dpfg{jf6?bSIjKU6+~Cv$+Rt=cwW?1`mM}}Nyk}wa+>J`odpb&sU9f}?u;P(*VU4>|xFpy+MZf*2%B=KEmc3b*-|I)d?igzx)+ zb|1WLB%MVyOLsb~O1F~&v6;%#$y>u-heXsGh8KC`m)0g^9f(on`;c@PL&`ew-(*|* z_wX)y&bAx;`HTbx5#N&wg(5D@sgk*|Nw3NXMRU-Go;4@K!8X`0d8K*RXOtO-OZK*I zG$_VJ9C@eWJn3=#?}4N4SIiHb>0O^|?zQ4ZZEsGgde|^EA5q8Gj;ov6r!rPO=kIR3 z3vKT!`NWU&!*1&J6kqA>g^?^@!|l+QwBqDSX0YnIshKR@fJO|j$-X=IN zl~?eHB8yI@RP#yxK$?beA_Qr=eNncr^p3(vLMll*-t4_z;;8BCaj~=3nKK)rND#R9?#u z)p8n^%A4~e)%+U{$Run39bl1Na4z|1mt5k7=uK4nXdm26G4Lg!0*{6Z9Oi1l!QiK2 zzgoWmL0fsuN1sFV(*p&C_7YA`Fc*%okX9)YYzwKSU)l?Jxb>aFcj;H)A;DT6L0LL$ zxW-IUBL%Z_CZuCB!T%ExF5Tk=(sS#^xO+SyV_(l4@8%c#kbWWsM2decCu8{4XfwKP zel=Sj^F}%F&AFO6uN3Iz_%~lh<3`JxC5V_bQGOrSj;gCh<;GFDYE-Tq^?R%*mBHR`M6xl(t&PLdcucHl%Z6l>3ju3YYD$Vi@5vI8oM-k2HR=g%yZ7;NeM ze{EwmD}kL<+qb>0lcoQ(m_f>UW|7t6VrlVB(&F&{okqg_Uzr>w4a7L5@CcQeF`;2#)k4#UGSqesuja?n3ZLy=rqC;C;e;XcuBiRisK{m(;+vaUNb#{>3&Q$JiL!jw-Bu!pw)wr% zh*(p;J#<$rfp0>q?#b3(Tnk>mu2M$i8g*ZF{1FdxGcm1S)xkf(_qc{vxKJ-@gfh}Z zIhqSe8v^cPy*4GY;9iqF#R9aVo#fyGy0yz|Ww0CS23;ttyY`6m@ZNnE;*5zYnykrQ zxS&ReE8Nm4`HAZnH&T|OjTR`b_hBQHReM;-46SY|CCTc-2W<4J-<7K-I% zsi+|%)yN5f3#Goqv-Ne7`#M?vo+Q^OubiBrt!zyW^1e}>y&;gj0MF5WZ|kBCksU41 zWLy2GF*Qrpu-x=mjCzXlk!I;VCh8Z^9U=7u_5GToCV6}uf2f(S#J1jeOdyB$Bl<6h z78cOWVm0T9c+B^_$9=*q6#(`9svh=^qwj~m=0oV71>vHWa3Ue^!$r_VKbH1D`<>jG znGqRSX3pcXU@s0EmZCd3fc5{;J67|GYCo7Pl8ubLW z7M@tw$&1}J1GwwjlZ3%wJ#hqRqmagiS}BAR7qESE;U+Me8Xhp(ISVX|Cgax^qjmEY z7Qmg+J?gF)l)v@FGfOP=FFgn>$1n_rU5IVi%d_!@xlT@*M&d~-6knlALg)ATved13 z$4FgWNJjH7N-`%I<;{m8@~4T@u1*uxf@f6_5KpP&;D122%ZhUyl+$e?vXS*3%JLylGwn zI5?CV9h?hBnj0<6fwa!l$Lv8ZVpHr86M2_;*?R(A3qBSVWVDF3fU`xE1$w8mvM0@A zHLB|j2T_jYVJDp_{!@hutxt>w!9MjlAA<^_*XjwY99BZHtdIf{o{<5OrJ+cBC1;b> z3G)l&MS20hLbD4}igwB=-TDGt9nbm6x8cWcG#{jAV%Yq6fy^As%b>b!70q^bP#drG z*is&VL^ND8X;Qr+;1KY{Rtp8_5F_TFN%NDpD$^{p15eZJu}@g&T^6qQw8&**QgMd0 zQ8;Cz7!F9zp)G=N$syM~9{fna$${}f>r;BncA&7GRq{vT!wa1EpcbfWUVXZbqv zaYj9f}-Q2V=Nm&xK0Gq(%uGS=}@Ph6SbO^_`39?O7(cxL>*ba^7d=S-xWA>SKIg>0 z5beVJfb%Uo&!RTj97;zbJRkK(9cn~NQ8clDkl<3+*^s$33ls3NQ)%pY!l||FBXe(^Oj^dRG zzOwsl|2{*wY167df52pJU3^s}u&RWaNpy5%g3%N+&xu?(E|Zi<5!xw{Gv&|eu`XwF zq|r3)B1u1K-0YzQ`naKP0+-+!xdA9Ow)_D$z@~A3q2$P?@?E?9`Ir3JEq~sVKX1vO zZR0K)O{R_V?S|N1cM|V+Li;6Z^RXWcVtL(#2hW|Vk$&wbYfDnJ&mURR)6~1HrdC-^ zy;%yqLH^8;ref-4HFc`hRG(^U^4xUeiX~_7?(ul4q>Ye2L#@UQq79LL+DixeGx<>x zMF~7uhq(w_wD|qjf-U^EVh_l9ATwSnru#YqDLD`Mf^4Xu&fJ@U%H(ocn+L>|3nxpC-0NpKt$6@ zy8AXrH~CLhEQP3Ir97)Np(VjqNRrN{}m97Xaj5YuM=Uzo1ss*Xftmj zVe|G)^oBm3W}e&K1d9{B)%+VN#`^XutGY+|fa;zih~6u;+|yml-J~VwV$*5)#Z;0? z;kF;f`Ln>%RY3-GHpS8GFmd5U|BOcHQrP+3`8THX7fb#U@{^~4xK=lpwamww^|4l0 z!86`W%Zz`Q73~jkM>2DBd>P_0abUI8e6d(|vnbfaiIrN`q=@D(9iIhlVM{=^g^E59 zt?J}JJE9*#8FAN=>q8SRj$F+Z*B_WK&=|S|^EN*5gZ5vj0SSD7?kg@Au;ZLC{)6bJ zY0YYU3~n)}BUGZdh*a<9Qz0zwM3wW#TY=4Nv3KoneA@n$Z0uB(xF%EgzNy`>w4+wh z7x_0DUa=Otk1STXQfOzM6e=p+1r#cSSa%~Cq)qrs`T!l@i;m6~!r>TBs=2`fRx8V9 zGqCy+;mnlM@t35<2Z<{)&AG~txFXC&ZIL=_^@fyUG=~yp z8KI&UTy}NhZb?67$K;0bh5DH7lJzbN!l#>GsEZNaXmOmwN9KJLX?!UQCL*y7$s);Y z)w|WKBn=ki2y+b|F-|rm93ojQ{~k{Uy&MqU*sS>YEbufR{~`=IdhIVgHg?6fC>lLP z!Ad?M=ydS_B`5!4qCG zf4!=wx&1nZ{cF;q>(t zcG})x63?p!iQ(O0-Md9DwTCACa;Y?h3cSanpUPbP=Lg+IcdL^16lKjNVa*g9pJOHD zaX1#9ZRYaL%L9M|V%@o~GOyKn;rQuwb8|^5aaDiwvVU@PFm@ZRyKj>t0W1b@$GsQh zuj#w2)X;>9yCa#&Gt3n%W9H3n!M?7{)my`3*1H85!i=89in77fifl_G&~5sibQ)f(q=uQhDPU7%4-Kh4~n)Fx>nD z-E46PoXz`)#ymoG+tWbCiiPZxe2NX*$=(AnqGgAFNV3h& z$F*M88ku>z^8*fV;Zm^a4V)molL}=oylT?v1SmyT`i)QZm^UQ@fFNAm5i^l{PB5=D z24Sa1Rp7C6bYnf;|D;m7zgcfO+>dc&hie4{jlwLA2eub3@7EC6UW&jO6sPvc*k>8h z-^zJjnhu4Z`}MmlzOlb@7f&amD}DABJuxYwDz@M*v-MO^@Wd7XzPpg)DB9sT0v%Wr z-d$SLF5AwA!0ysoV+#bra9G=sftZJ#U;-g;fX6L1FgR;LX)R;XIL^-afg+VYd$g5} zpt0SBv98Q$e<|FTya0MRdalIX*t1KL-a;E#g-kKmYk*X+{vakrzZPG(u~bX|O()F^}>Q3hOE^ye>;BD4+w)r7rXKts&zh_ukzDJhjwqb*{ zk11X-ij;{-!JB2Avb}=h2AU^Ph8`>Mg2GVUs6Fb)0w00kXo+GW2+vlWG|0&`tyhiO zGeV=B$W_WR`;&L2f84g>&AHu5*=3~^l2U1e56da zQXa8Vz^pkq)(|_9S}SEPDOXr2^R1Kxq)fC@ZnRRCkaD4wGF_z@H4Hw9W39xCtwhDS z@#f@PiKknMYBhOt23d*Ol4xyTYG0`8frA*R&$v=GO?;XI1~)0wtrYQTPD(B*ek*0I zl~O^&*9JYYjeqIY%gR!fED`zjCP<=rjXA~I|2jZ2M{ za1-nehmBTUk^ZV+d5SRJGM|!}mY7~j^yfqqQ5VwD#PkK`L+XXGjhx()cAxcB%(y3J z95v_5qha`XG>@{;6W1mFnH4XW_&$jz43?vV!Y5e;{M33n-!5F9-ZoFS3x~kxNjM>V zw}L0BDoY*><4GRP6;|=jNW9L9KPT}eR$N3*=AA0uy>x)YP0hX;y*$xWa@GSx@f$1k zcyum4GZwHO&kM2)O4jSxH3W>0f{Jw@>KKVKx4B#>%U5M;;KvKp9n3YBWFPvaOpBng zl|z8B^^_gR05HntFPq3-cWSNq1wtU}XxP6b)h=KZBS$AE%`2D#9r`I7^)anl-7k5e zv+=Xg7GHqR3r+Vnq3p2=VU_&T^jKSm*)fAmMYKk`#a?$;i*u9kSWYtk_78!MA|MC0 zINpDse6ePXKzBt#II@6w00r`$n^Z&9VN;GQLLn$o26+BTS_vA$O@5+=mIN@LG~VZ(TxF3{z%~FrDBoDf6c`2l>f$3byW^;6fGz$nD zK-d7ni8v^;$~l6klN#|Dk7V!-%pE+G)_ymC(sX?v8kDwmN#UYN+ZeeUrt5vv zsKnb8xl1=yR2%n#>$^d(wZ6)^rEfiomN`DWaIHh>rsj^zh%Xx z@8(mIJ@NNK;;&kOya!R0>#~3Vb81Iqq}U^|Ck&N7<(R|Or-RMG62_JRTe#R)0b6zr z$>B1;cvIeN;DpoS(PN)vM4xBw*~C=$9wvCH{dIC$G&Ss9SKv7s0s}pF6-{v*cpa2+qPr1x6h&>|Mh=zlD#0OLu+Z z9FjG3g$%Y|H%`{Q??vHqw_v3bpCHAK`;S#pQn1aRAv|LDU?TKBz<dQhq53MKK-r{aV-9kkVUv2B@RS>NMN4Ie2`K-xbJA(KK{KCjjyuB z=q*iPMw!{l*Y8xov1%+%_H0^*HA#{GUZa>%3D-^{l=m)yxe4l4%FFBVQ6uYvqiCiS zB1oiXz4YZRl;f0AoYNej?5Ctiqn*Y+Vio=Il@hFmhvP6mWjE{v`@Pqf ze`oZs_x)dn{kt?d4f{#d`o9DFi|lTG9roRL66KggPW`I_j(6$QJ;YX@MDg_VHsa<` z+3A_NBbZbd?!0zPzxO{9@dv9=mj;2m-!K=BN<&itQqH`H26*L?n=m=A&A1L`z-UT6 zs52#bB_0Q?by&ACdOp_uu^EEw(dWl?21nIY1V7LZ-$AjlG5k0tBwTI^0WC*&T8FwG z9ihHs#!NMp#^UFK|52yvF(|6m%sbu??nyRHftlhLS9=4^>s9l+aQ258=dU`aT>VBGp6mqTR5MN|AtITi1-U6kDjl9O^?VC>{s6AeHx;bfBI?w(DBjj$cb_ zjmO3YcvM~&>?2M$drtY76h~QeWjNqFP`miG`pv9a>wfjXStlD;L}$sp?D3ykftk1``?$)Bs`&nWqWLW?spCH4_F;l@7d7a0&c!X>l! z)3jK7rdIcYiezbZD^z5FR`)X%>8I7nP7MzxayJJnk?Nb->ji5FRHLIH^LmMitGmU- za#Nv|#_!kS%|J=j`TI z3e_9L`-w^ax&}eZ$wc0i2s2^QdlG>SKWR0QV96(=OVe3hT3#e(Z>S|k7$jQMq$KBI$*@+6}M1vr-(hXv0 z%uPbSxyI5obflC0tQM#~SUxF==!CRXDPPI8Hd4nJGoMOX9JX6qqdZskM{e10RnMgx zscp%8-ll!p$}8y63SOmlNbg=yz58ofe7;+Xd&=C{M4!TRNY70^Cbhd0S31pS8DOgw zp%)Z&dZIOfTw7;dJk3!WqL*8iEX_>t;4C9FY=zO(WaboPM6NQL3Y-%&qpr>-q!Zdp zdj>7cN@XV5wx{IQaLCHFzBBy8R%|!PKU$C}I-rLb7P0Q8+$nAx#{$qP`7t+3OfxU1 zPHXY^?0;&#ijPxH7?nzew}aOGaGjb8qh9?MaGve@D?vChUQzd@avwxpT&96ylcGRu z3>QpshN1T~Kd*Q52dn10<-Cidu9tMi1u%7y5&H=6mNTEth&|=CWoHOR_tEC{OJ?=@Ul1N8FaS$0x1lLC%UZ(m7v|oNKI{ z&q+?@+B=GR2L9>ZnIOyJqE!T;#FfR}g1!=jIv}YU@JkoTeUpPMAsT=D> zWR%EmgsHv_#i3SallX(-uE2gR{pc(b)%Eb$QQv_KQXyi8UwwVhfs-zjtO$NA+REI_ z=Vr|r5IeXZ$Vrt+&Dn#@Gsehjb$w<%<1eqNIF`sQrowfQE95{F35 z#CdD+D98@Y{yh2NL#X&)B%VH3xh@gj7B(XjG9$wcrMXz|dW8Kx>NY=ybEk`kK2=iM zRvqHbX?-&dX;Yu?zHNQ?!im2#Tw|EX$Jce1_02lrsh+5=&#qA4e66m}E>UfK=(z8` zNmqvf?o>|nOcV^2Onrw|HwHN2xR`lC10P-HDBKLg<7C=QHGqor{p6uPfiyP0AQk)Dd&nhL()r$ zesv19%B4I?l_Ig~2DOQn&@WW6k@c%+vLiVFjg0to5eUj6_Xz>5%So(U7CRGNsUg@r zE@YQ0*L2f08n{7_U>3IruOOq6HiFpge-i-qlqsNY9YWM$`G(G-!fuJ`%{^tUp3STHF zRpBcI#f0JbD+PrTCcdA-!T7PT^ROTnw1ca9{7(ss25Z~(p+m6LD-g;Zb!!j)0+5t> zzgiTXo)~{#$lw5SEaW}3_#ADt11co`!A(DYG5UzG9}M&)*QN5d-Ylq1*RI+fa*{K( z=v}S`!6-GvDWD)!w7XY*N|Q4Cq=u}M8c=DtIwK^kyZJ zjRJ&aJH>NlDUHV*GICm&+YSN4H}qfkqHEWzYe6!1v|k~k=KZp|a7C!-Q{DUNqS42- z#~Qc?RXvei$+2V$c|ZADbF6HYb~aRz*sSy-JYKGc23M2k-lDMglj=NZ{7nd_{;VdA zC=JQ92M}89SBfo_YwNg`|6WyN0Bi#V}wFGC|tu8BCD ziVj=Ovcqa+EeH1J)yn%cc^+vfMy8X0F3FL8x@Z#on|%X0o4Aq!K{rO7frg>7mDDd} zI8}jzuV}dTWGq&cgcpU`-_L8RR z#Tx=y9+YMpCE?zV<(bLR+Dc4iKXRfB5NqqNtqc$IXn(>PUQ+`x|8lX`eLp#xMc1UH zZ$vi6_TcT*biTQ_?%FI*bTlhExZE9tk)xb!qwgxCv11~m5nERQG#Zob=CUbDKdaYx z$o-0mi|&A$^vCvUu>9kd+NgWrp^q43=Y~|9T%4Mb ztdt-#Ia2~>@@fgPlG7z{B?A)lOHPuYfAV4p+{yDL7?3QKU|{le2?ixcN|2pANrIeY zwgiKdE(tW8QTP>8u}X_HRcY@u%AQ`r=B2%|4JLiGUobKAKyp|Rn}W5gbAf-Th}$Nb z{MwIj#M4x?*3bQU4{jyhc<6yv)%Go^J(PSnLyFI67e;|RX3Aq``&0I#Qy!h|BGr+% z+z?C06q8>bRnuI_dnDdZUiC}Pmw11P_fO82xLe}x-W+;M(27ipPj!J05w|x zieAJfg&~xz98PrT#@*b02a8(ZwJlJ3J?w&K__FuwFt4>&T8*Yq(OSjMh;`*IUL7df z2)&{$zI(Fq&=1^68F>qOM>3LgXv>kzl?+MHFF9F){zJCCEKTzoYyznYsh`ppgH;!|6tB44}!%=)`jctX7jt!^i%D*z>qqKGtE#?4Zv zpz-Fh&GMySxaY~Hq(bP3NGRNH35y}n2nr?c@f-gzx8n7c%EXF5tHYBp{;j3y!TPqy zw~XKdNxhR)Z-@3U7O~%4rW_KCf1sW+S4o-7#j0HK#G}<0@nQRD`5KPAbEBR>|H9jv z)q5jE&6227u6VYszGty?hXz8zXQ1Z<4{$@c-akaa(P+D?T&fk*r z8^M4rg)~_mYg(~k6UaqwqSFDIX~7IbeqaV@*~W)=!_7PsI4dVZBa`Q;6IXY)v+XyL zQ&0v@E3BMn&R|HBXDLy3DuOOc_bZoqsf>1KavyA8(QFAKkVmtH zMamj5SObYUxoJ^rkL`Z9n(zV+w47{}Arh=FaXI3BmGbHe8U-*URM31MBq>R&NP<~K zLa8vU>I$ACfu~}T13n}9rK`lBw9-B1w;}LY#W>PHwSdBH({EvbFR-*ItMfy~KCwZU zGobkk1koiMxzg&`fF?eNk2|Z26r)m|&bh%0uiZLV zgmszoUjZ7T6;-mUT^gm=a{;qlSvkTCKi`eHo>~EA1x>Xqxl9EhuSG-6qMi(OWJu0d zmO#3(LX^y)C8Hzy-ezug4ub~Rne-aIVFEY-28(Jlv!~dq6iTzV&M6SV7YF6S-H-s z$d2MfX6bI_M5e`V95UhL#pWky@6#Kc$Q<|DVihEDB6Hjea1Mszi)FPZW{fbO0SbZ! z8fZAEhIX3&1+^=cPoUnD)b}VC1=IB=FEW={mF9n~?3WoH#|i568@p+)sx~nL8<{QU z1ysu#IYirsuzpy5@1*j6ca<7Nr(`c(stG$C`6ENQ5w3UlY)#Vi0$7 zVjB3iNt^n5QB!nKkON3Rb&^~Rj!&h2sIZa!5dT0yK-RoxcpILaL<>1xdEcq+(A@EV!7L7B1pz5%M zyFw78m4p8Fxa!z$VY$ttayrTJE@ut=GdWfpEuw0FI<<=2Vmq$Ut#e}^*(K*j1R+mu zRe}(wKARZ;le9^U3&IK43m2mKkEuao7zfO>!u%L>={A{5s9bL<6CNzXJ_>udu*@a1 ziC%Epe2>6V=a0RSLUK_>4SiIbHgT4Q@B48n_6o5h$3PEHcYl(+6BYgnZ{9`7zp9~Z zUZ*K%OHW{U7GZ?+r+$Y=<57Lf42xzeBhN`RX!yH{JQr z8`30S>4eDO)LQZEhvRr`#qa$@tj>PWCV7myq~w{*S-R`8E40^scXIK`nFtlv`Hgi& zYvaLZxfJgSoKl5nH-^1ywTG8L$AM0!C5G8`JgVwgp4kw{f%o4810m$ya_?tgjr-6I zEK7x)C@8#bK6$S2L1sKnqsP){@YHnUAyqZrZzea~d-yW-<=gl;i7&=83Lhz21v)aoi}nh|^!Kb*5$b?4{pN9iA2 z<}0<={+zEmh3#9|2tE-m+JHA+T()Wt3!zDU&q8kRHd1tH!H#(E2 zlo{AZzAd-T$otfO`#m}e@J%3`@mV8(in(H^5K$fEP*79rCunS9A9)1NRb?-lUSvc8 zMaI^hB45e|50D=dUFF0KEo{tTv)Po&dqbB!U#t6+l8m>DW~^~ue7L8egzpPVdRUcGZaD2c#xVJ5kF(oTGW-0@8S@(*lVYITi$tun(cPj7tsjOiH zU{Eb(BZO!4t8-);KVBfJ!Eo{fpQNc&>*~ieKkv?he34PFDu=i-8_ps(bUylj!)iKfY z@(ByIV0k}Aed56AfYem?1}7Gg&FW%PJyBP1Id!0rwD28EgI?j*A}%oFNUJm{QLcla zz~1Hx8RN)MWZ1(agOPdvD;T)X{ojFs7P}wtcf;WV?M1kh8#1e6T?3=Jv8nFN)j7Pc zipvdqnN=cYYsM!+UBP8GP+&RUTHv7oHXNKQDX8e%kIHuAbMCVAPuUlPCj?D{fTomp zUjxlOh5sFB`p%DQg(6zDfCibjj!nbo2%v6HAm2|TpPsCo!T#R%yTUGlsP-f zj4rv=sC$~+YE2VonRf$QiWb|VK!mflkoQ>iIPFFFl`Vki@W5#HOBQ%gW@`jIY~WaN zB_1m1>PJJoO$$+L|5ay$AHLaGTnJz%sd$8RW~eefDI zg2|K$iR;5iNgC9Tst?5bBuv-7en6Y>O?K`v$jg24C!}d~-I9>M}Tk)fnX}-XIOq>mTo2k6LqQ88W5cpc%Fpx4} z**m%PUb9q7xOnuH-cuNbb^nGr?5AMvMBZP>D^g;8!YXKMM^sCHFhQ&P2R)!Id)c(w zrWxV(!c^Xd$=2rgH(qJ4m8}vZy%=$^X&ivSTC3+!;J7kTfX@EX#;}M*zo?!CD{dVp zrvBQCt?Y=aOgC-TUMyQxg(}>|esEME9$lvv;V6Zp%>4t=X;sUS9K-yn4U&P~jkQ|l z{ZI9v&y7X$R50Q(d{i9U-YwV&ZLNN;8F)u@dJh@7W?@7DjC~3dzn>O??X)6?5%Cnd!(iDU@Ly^eF8xCro2JKNHvzW(!^ln0c}VSHf!FgG!R-F36JR^<1C^e zjC19Z`Vq&?>-d!M?SFh^!=p=Qo2)V+cgQ)soLAJI`*kh;wm zfKo^8>|tv-^9TWfVy&Du!1|Vgi}0_+{yN7zKo!zl3OuWL_~FfaEQohfK(wanA)uEA0NAM{QDDZLZ_41?7eq$2skSNMSp2Y0%snssLv zf02qjBNf{9S*|^1iMLf;)b!pDWiFO9vQG_$5{K86YOI;)c0>=zIsABj(#nCM)LMj4 zCw+~T6yhS4Z{#LzP-l9XtCJ=O!##SjthtdMpglfAa zVew8$YX2T_*`XvZ^B_%&rF~l|MOP%eGLPW2?)^n~(cW~?TrW?#|H6b@l`GC>ly9r6 z74sGv$b8}VvV;Q#D00-uDS^W%{n&tqbeOXo)YGFnellb9%LfDiw}QX zMb2>}M9O6fh!ANCh=D1V91ug$`B10q^Rxe}k+14IB@aq8o6ONFPX~F9k!J^a0>-PY zQio-_i@<3~Hm(fZuo&upPrCOQ_mPrKG_W5wNQk8}mf;;_Mm~Et`azdk+iC+@Xv&1x z()`SYTumH2El_&bX_3)^(zzLtll{vFU+P{s;8Hz9dtj-w3ko$*S{U84N-%PJnS9)N z-=*r~bGkqFsEqcuiF$3XxB&zuo6Vvga(UR@=D!|2AU5en+VT_e%0#! z%@~R$mlOW(G^9J*@t=e59Ib8>FZ9(N%me;u;)WIJ(&F>5<>2hJb}^?$Bmo#18yIid zM#h#@>=8b+rDDT{S$Ks|CYD`Px0DCd2@#;pC2Oxns{P(la-fkPAs>w4YlEFfrU>b_rxKkDf3g zd4n+niU&h4&J9Z9CkA0W6mv4qRi#=q=Zzavsn?_sqsu?xVyl?v)5Tm6b(z280UJwh zDeq-={V<7OcB8CVWKpX}O0{$JJ`{qrS^V=joKbna9Li_@{Wnx#%azzaWV1t@B66rF z0fZ%oqSeX>O)X$s__Ttz!sIlETf!$xph9##ZYB-3kP`bC9)`^L*f5k4E$P!#`^hBpz*c| zKJ%#kkMqPkaBy!s)nX%)pyq{^oDt5_!Buqru*3DIHx zgyR*{WwbP+)S3`N9hje5=}^ybBa*IFvdaq2h7N%76|X>Uq$`VEpa`}`ziDIiybY7t zrzWdIh#oKR&`;OR^g+vfKBCSc(lVQLvWTQ?tPuK})3YH0+RWBB72jM8$IM)YLJrk$ zn6Ht_Y!QCDsvBr8u&BhIy2na|vahH*8+)~cgYZRG-HJZM^^{GeO){g3@BRi3!7k~P zmGg%A>|0a?(BCn~LNnGk-t8hk^VHy`B!ndc&5ux2&||YP2_W~6IZ{AwTfi3YST;$R zo}c#~r&AxBl$p=+KcPbX4>>7q2%73vo1Nh3M)MKyz39aoUE+YRtkIr=HA_1j5zV;q zV>ua^mo7MgX8c%{ctXv12A_WneMObF4BMvIB(IpvYxV7*;wr6hC%-lnT;3dCrEB-0 zy>fKa`K#3%vr4;m+(CA-D((DnNkXlz-uhz(BPC(mzC&bYtRR-SY2u)hnqkPN1w7w7@h--|evTkta8A(~Hv5iht95 z8kl?0pLwP%27lKm>-$;Fyl*27rLDqEcKLK{<`#Y*@J>3_#ErIpls!6&D| zdMmV)`5zW%@|+&{>0Z}NUUP|u*X5JQ7JZQGHX<^W8mm_HYNIw97MEVqxPDLdw(;xs z9KMg((NWXMyZ*?B2iG6oH4c3)$NIzPkLypU)%lst>$iXQ2`S9&eXJGoHD0Q{2e|Oi|W#px_v6sj<_djpX?)B}- zyn4z1c`|1yA(ObXg~x-lUSHQ#&Fm&&y?l9aX4CqkxuZ5p-lMtWen_}(@8^FQ^^6@E zcR3Nj*``wOSJ`Iruzhvwy1jc=Z=!&lKmV8Y@xKVy?cMmNo;kd5jXj6gCoA6K)oRys zDsRQw^@qF1c?A{cty1Z;T#XVYE4HmadeiHqk8M;n=8oHG)%^MTgB2U8bNjlz?SB~i z2#FFI_eXh~oVk7du9H`o=_fVqnmKl` zg!^W?)bqZXqdt9s=c5(t_yL-V=3XrosE$?*oRv31!tK>N#;$&) zEFw=zMCNA;5ryiQ^Ka4w^Gv=;b&V{%soC*064Iv4So#vuw_-X$Z%2ErMP59Yy- z`$O#i+r_xWzr3lSZ6etDXJ=q>-4?a8x)%O_{~jiLVKH}u1G|FMag+Jmo<&3Ebh+Wi2};lFgJ7W*R+ zZDlg#{S4=`W!jXj$q2nX-wAs+SDz}? z`_Fl|${(McrLAn1u%ACZwB1Rs6ZboiBuq-txWT6J>~~KM1rruH7&l?Z zqlfA6UR#&HaHIl?KR*1>dm+@9#T(LQb39N?vXOI^d)+*r2TQ3D?)er?XbNt|Lt6qv z-kWYzHtWhx3L?(+1e5_o7wb9}Jx_?u;y_}Glduq8?r#ADR8K%?R<=BcFO}y;-mAx5 z-{mWz7Sk>%)nyq%^1?Zo-mto46t55^nh1%=$_5@|X(W?x2U4MZ|UVVMYXk}&o8vcZMcR}FWqldA! z6OLX+WW0#QDwT$zjPMd=#VRpn*}6p0?CNMEJhBDm5t(7a|rt-djwg8%U zucAa^oogPZ4pEZnd#>4lPet*!j2z)@Nbd*YssoCT4E+tR>vqsVe`2A0#b>4Oes>&w z(769peuWSEhsit_k4xojk#z;qWaC|;mSylujU030ItKvD%L)8(A2i_*-Q-UN_s03Q znI3R~z}sU!aEF}z@kRWG`7-i4N(pf4;{L+kJ}1&JRZ^VTzR||v&L($cn6Iw$ZcPEn zoKAtUeTS0QE7wK7y2Ge&YA<~_pn9NLtX>^WPV{xQWZ++d=}Rv3*~uq+#+tyE0&=8sJk|Rtp${sWx4=3uJ zrEd1SPEX9;h{{eIA8BVV04}aQopfI|nBZslnlV0CAX{BC8f>g?axxv1ZIs0#Zk~^>kyiLZ!8U+^x`Dt#MC?jnA%`jcDO{Z^5=Bt4 z>%*aJw)oN%g}mRyvrv7_b>z#5drT|v$YMEWdt0ODmTc5Akhtvi={!sW4#=Q3ob zR`|K!*bZ&)7Zaj$z)u;`?*`(&o!a#r35Jw!3mP0VhWJ`re2u5`eTz>SuqVf{qv7C+ zalgJ%0j|`q7Cv$2ifnghNNz>}jvD~%UNG=R!i>Ta^F<)66>iW9#b7hGZmuAjKL2{r z@3D{F+FwsCFtQ5B>24NaX@BK{zGm&Oa9370vK61+omQot=Q^?uEy7_E>ms&j-~nA5 z*UF!BniM{ZeQfVJ(h>m<+nxwN6quNx0w%o|FT?V!FFcJImJvLI!6gfym+V-BM6fab ztt`Z2x$$zh6=eH68*}A)=3wrchj|~NHwy|e3xX?ERVlp@?yw6CY z@*?m5BSGzlDTF{xAG&HiqaDZCEP}ZMR6(e#m&SBYMr^6iftCa5FX7cPb$U627%Vod zF~gifiqb1_WE0Fiy}VKaV{lwAPwD~*|Ehg_WB5J(F^#d-%(!2DjDnctV`B9Bd`7M@ zxzf%yS(PKcEaK(m>b`ci*hE>b5|n48@|Lqor1(z1I~VP7?WL0bMBP?&0MRTfI*@3l z6&*wrpAC{X+sKHuIU~igbVtjd!Lob{_1ZxKUX)wOlf$2)!SJYv50-ciP^%r2dV&p7 z0Mg&^m&f}FB>iB`euC=Jz(>DBjHrcW<+)MtNns3W^a%OmLL?ogf9NJ#Haam0& zHKujU(Lq~T@5MEf)=7uN@_=W|w z7b_48HRgw$jTo~YW2O7HDi6g%43kUnrxr{Xy2EA`A+-te4?#6D4p0c}+ zxOLK>cguX;YL2Hba9ht1A5qFs+XSx4ZM(tsYS})UzcEs8+J_GvyroUaGOx@8ropU&s?MECM03iHL+?4a)nAhp83IwRtc+orZ#MgR zgj`dESGQNI^n6k-#k*nA6X}ERk$?>=2n*d=CK~A17UYMEwv}m<-<%URP8}=E-!ku; z)x)d&wR;^MWr<%n5c2ppI3+cTMmpb8yPE;bwdfV4N&K}whm4sg=(FnStr>lL8a$=Z ze`sgG*%+vwa(r*Mjr#9<+cVxu5A0oY|7odI=aj6fXilwncJ*DHd|9|+{U8uiqiSwC zgEHe49n_&o=Fq9U&(cmqWu^;PntJ zhMu8Pv7YftwH^2B`1fOPfB-x`PtW((o1W+EuM;Ccu^wtY_&Y2F;BRmgdf=bOFktS| zv}DgxSz)3V`3Ts=4(hiZ4@IYZA5G?Wi+ z<~{GouyWc!-c|83(4Y@&#*hLfyXF2iA&DW8#bvMA^U z8hn{O^{~yVmh3awTG#pzw8g#c^w3WNruHUX&J+7RbrAp5N7z1@0DV`AA zypr|;70==k*wPL>I9Z#2ZDt3T{th6z?AnZu<|`A~T!8X=Si53l$h%RyU;H)2CN*$` zb!zwT1v?;smo0eFaEUnb9gA~1T?xqeOs&2eN__pX`I+l}ec${$GutEspw}K~X8nbY zjiK0{(YRsogo-wXinfzLC1BRFgiibSw3Xo-vnlDCYCQh)ay5q!N7X0)w8w#>1o%UfN%~6v!+FY+61bGZ7}-A}00=2i3&>IU79dB~#YRotYhEsA0xv z4?uL=6I)|q=k}i1l3~&J6#rMPG;RLXxkPU8@aH?lh|92(U-m69>av+0{@hYb`ZOPZ zt}d5sm6B}%FG4=aS1$P~CEo((sg%t;m4JC_1*%2Wk1|JT${v)6WsYXa9Q|oG%%%Cv zDOu{k$a-2~JxL%l%zBc5r{}CE31q%mPZIF7&3cl6r#9xxC97;@5@@V7CevHNqkcHMRGTd`~+&BRTvy z{dL?A|reD7j7w)MoSARFxo**E#lPpct}RiF4vR)Yx|S< z^FV~(dhn0zi`M>RaPdjrzPHf5S-B(ha)$jctUdc)RY;rHY;9aI=@kBWoUO8DHFj@V z;rL9ne`X$LtC{&#pkZc;8{cLg;Ngg*9J9rN-SFq-LDG+^oRr7&7d-z*zWTCH8Hdt^ zby@|Hp{sdCm3AlYbJ#Po8P^OM=>Qu=Y*O{V)uteq$A-PGc|0u|PUJ2kvMDU-P;2KH zo5H$%OY<8s+WE#UV9^{t9M6Z^gInly-}MOQ&fw<YN0uV04dhx;si_`6Tln4SYO#v08N0Mp-tws1hQ%rD5!FUZbcEPn*C z`31501+n?li0wFxw)O-VP4Dirnv4pSF$gQHrzfpIu$GLB6)1ES7@!aovsWRgz7*y+ zuU|c}Txfyz$o^xZ?y`wz8Kd@Fd!8%h{k1*MK6wuGJbUDMJkP!voQ`1ze54z&4z?R^ zbH_CzQGkj^Wtq3?P07aEQWxACWqdB_*UYdaD7=lAaquqF&G&}ODI!rrOJFE0(2ZAr zDpBKRx4A}M#VaadHo%R5=P{F9Y77xsb9<=&;Bv|BL%QSuYrsDDxw6A;~VTs73g zI-;l_H>hBM`Ta|9>GxeJAy&D-(GryI5pV+nr|DpT*86T2In#;SdEqy=bHoYS>9pHv z9?9cGl|ViZF}~#gsMVV;rqzF^nE!RFg=Hb2kC&l>R#sfI6jiM|0bj9zFJ8vGU}0^k zI(soh!NS;*{H*A7mAb^^aXoUfxIZS#63^-KAiO+zID?01fqA~PLGJtDMsMCwXocGx zDT(olLi5HdCO}KjLr=xEC%`OJu#}nN6NRsiVen3Ta{o6yS?9Cni9L(rWmwemk?~`J zl(~9RugP?cl%Tq0l$Dx)9V{#yk3*a>{8BR8XUPe%d+19^?LAgMh7wVI7(hg|KVS5f z%x|BhOqd7#jcNOa`R-8aF|Vg#OuYs?vpyQ=R>Xg!|p6n zBl>4jTl+un;w0Y-aRhZHrFyfr?;AByGYogUte~W^_OMJ>_&D*P$C_4s8qPedNEdTY z-(qkOl74ebpEv4qZmVX!?+c_y!pozv=l6ZV>Ct{Myw8i8r3<(b$8uEspF2+gSXuG- z61EB*h&Zn|1nPfEvFSFx%ICdb_JHT%73nuJ4n|oer4`@UzN9-@pseIyRyEb#B}sl- z;Ilq3{**39J^*uD*g2A2TRI9X9mzti-nt4|mD58LT02ayp~JAM7iPC})0hAM-~Wdp zut=OH@$WbNt#Dwb6`pE`e*cGzf# zrX7A^hnY6Ka_w-W9TwW*rFIy$!&!DX*A5@D!(Z9qAMJ3Z9j>**x9#vlJM6N<%zjq? z2HW9CJ1n-tE9|h+4!>`QkJ{ny?C@`PxXuo@+2IFv_^};!+M(NqZ@wL#V}}>pVZaV6 z>~NkP*4SZs33X&x?N2{HbG}0nZ0Rs}OonUtp)FpRXNjeV=|#hnNbhasu}I z=RUKZ=dQQH*7vQjc%)Td`nzw@a~4FtJAa;C@XmjoIDgkSl=GciZuQ)jcHH8KI_B|iu44}GJ&quM z7dqzilYiH$bdTe#_d+ILl* zx2l};`73oxP3h7XtJdG4>b#Bg6ZK1acp@lB9lig}rk%IaQ|Yzz@O+@-LDslfm45sG z!`_>~H&v|t|tb$Sz z759n=b*17~5w$96-RoXlBO>B@)3TNQ|2#9#BqyO>@Bh8;{k`w+^ScAn@A=O2%*-?E znKN^eKv`{2PY!PXVz4Wl<$!h$po5=Cwr8)lTpp{n?dh?C_lv^9lH6?STtBwouPXl} zoayv_{sDnO1VK#DAOV3vOvlAR0)TTG7{meML41r3@ezO%a^P|iu0udhh=3mR2f+LR zFup(zTrRi{0XZQ8#fK}jpX7uHLN3B}k`n^(BJlEy{QW6^j!=G)9~7LYFF7Fs>LdeSEZAh`(FNlq9@EiBrf*S~*& zsDF;w{=B}i;jw-tCq$6t=W=Lpu1|%qh{(=(%KoZpcy#4$rzCdVyS$+{;azX$Z zU&!^OPY6JA5w4S*FhE;=k-xvN-;X1dU*^v_lwWW{0GYp#>q$-sKyneTlbq0BlRxGQ z{a>U{2te^gxK46HKTmufPp2n+LcLoq!gZ1pVurH*5e4Pr4=D8x-ae=%+CLCEQa}Xw zPvalsi*P>vAsnfYi*OwOoD%}L^XKW~fXDO*5x71MdJKu!6vd_XCGjz}qg&T$$L`3nRp^A~a$@FIVKKuIn*jDNui{WbaX^1*-?@dW~< z_=3au7o5<~6Q9R}@h{|ru#TkoB3vgqVPJdhFY4bv0NW2@%km?~@lWOF2$a%?mPR=M zm7gO}l8bO?f58d;1EhV>(mcK&#TN*n6kl*?f58d;Jn?xvnE!>G5Z3V&Uxe!NdbeDJ>m(=izchcc-;bl-Po^)pPI5xOOX8Eh zUZCDr?!(2r9~fi^g2^v15Tmnn+;B@^-e1GL=3Jn^-1y`N-K?#(5WD9bOjW%&h@`3DAhIF?^9@mG}JBggW4 z%e}c|-uY|e`v-W(_vVsm<7@Txeu8=A-dr$GE6DO2g0Zx+{DOJP@8P2TQ6f?j<@d-% z`)lQxmxoK{u@8HkHojyseQz$AHoi7}Y=6wnBlqTlU0QyOgI@H1kG-P*dpMRKnJ0ZL zu}3bMNA9gJm~Z~t`2GRj>3eg*yyI*2^?t~-a&L}IJBB^&9}=o%CF5oFvvT9 zEyuXt>0^mK`hscg^VUapY5v;y{sG?Udvj#I@wNJTKVP{wmouEU{j}-H-hi#|J^lsv z=*s>fT3qUTn3T)95L`0v`~}1OMEj$zj4wvKAdKHuRJq z?~9)DBSTHk{4cqPt1X{saVeKfTYgMUafy*P&0iZI@9-Xd%wNlq`Nr4E@&4~E z_vT?8v?E;G{-V7-Qt$Q;2^CzXE!$J{e`GSgu-zl~=7MRsRe~S`p^T#nN(-ZCQ;TTt&o*e&DAKTws?#+>1n!hJ~w8lHWH%I0h zU#pMf-&^j@Lqa_*tS!ICei2)8QGP?Pic7WU|4 z{#uUAH@;Sm?e8u3=7!*Zru^Rd31INIXpQU5s)paZVqeoPasHjNvQIU~GiFh4pG=}+d8ICesOZ=7GS6{}H>yUpn z{$Hi5=(8x02S>rw9YlxRJi->^4}wSb)O#QH+64+P5R1erd@ z7y1I_bAU%K`-eB0qN0pZMxy~e+6HgQdpW}q@xGLW-Y2Z=uIKL+ntBMlc;VuC@aG86 zMn^=4g7+t6@TE_caEf?|gYWm?4nLo9iSYkm!2eeJ>Qcn}k(E^czVA)u!26EA?@VH~ zIZH)*$zJ9njvoR**XAQPID~$%5VI)aA;e>ScmnY-lBfE_&mnRFpLIajL|mrdOkDQSuZhdIbe%r@u#f&xANg-S+~vdD zh|BizFBA1I^D_{a_JsM!jXpfmM?cDk_weB+;(nq!SU(?mtPdaR!_CB{z41Qs1RwbX zA9<3Ge3Fkm)rZgY;b}hcGktiL55LNXTYPw)56}1Eg~Vlj*?hReN59;MulC`U#N~La z_Te?eW&f-tF8fP8@knaFCLg(zcm&DYi1#2KwL1Pq|N4(NUUQ2uk$(xDG^xKG=NN%bS`Sl^5N<5Z$ zIdS-gOzvul<5$C>Ya}k`=Vs#JLd;ym<^1V8U$Rvqf2kiuT&ABuT=uUt;)Uw&QHGM+jl;Q^@;D>|EnqgE>zydi*vF|t$DKg*y6>xdDh%QKwEZcZgwH5 z0WWpr0ha-b7d!F`P=Nv#FJ6*e>d^8P)?7!4U4}rqg_0~@Y|YLo5Gg~tD+`u57LRb- zBlt)kKFZB)4*TeMu*Yu2&o1OTWIAQV*@Xp5i>-M)KuWP-_>l*S&P;jMLaW2d5+Oi= zUnre0fwA6jod^NF!7u!q&@8c8?b%>IvN+Jg{xk$SXj4So@L%ZeqA z?3_aDK!}UZvLeTaV+{{v7Dt86TCzl{F$=!ZUuY_Izt^j2W| zL#;q~88#S6ETZ{Db>SyOd^9Y1)+O0xg$`40NwJJ-$}KD@Ewgi5E!a1*?SCGh($_{W zaELlb6Fm95Q`d^!a$)|TrGn`c*d1k16L|%tw!-XOYmv3sVJgbD$#PorO@CpEsCSQ^ zrzT7ulPn(jKQzgbTVkvDvr5Bqm*qK3cB`YzUJSJk?K(M?S<*8zr*SJlF51=IE4+F8 z31k14{aQ4LRZ?atDJm{7VIL|jfb5vXQ%Pc^Xd4yn^OZ0Bo0o>AD7!d&sWtDfD%Dr7 z-Acv$JoS1>&3S6yOHbCnPd#h3K|imeIJ*djMnQ3bqX1@(RaU!cNr~Mg`-PNeJFMje z4o&yhYC$^g&hrnmbL;(6#$mZHsmH%a-)p=(^6gf50P+lbCg(F#pFSo?-otZC7H6-_ zE}&`D9X=ruXEB&NGhtpaO|q8e+6!!+>4BLh;5g zCA9#Cx;;0)LKB&5m{LlLY&b)kX6Gz}JBVo}el*EFEip@WaY=DSQAt^;3EIzEYJ(w- z5gX{f#;y_f=On^x`217>%-BWnDXuvBR8<^&#tJ`wW`&R?AkE>Qu0nYs8v%cX=f#K5 zS^eYqrSR!2@o6|2dnBY_7Lnoaa-McE{4Hdon7peopLB&fJ~K=yEKSCbW4RN63ksiN zw_15H@u^nFyzIg<5rzT^&(MbBIs(I|xx0Ca9XdP=_zb9B_&nj{a*XPB0Z^54?Sp|m zfy-w@bmveaOW;d_Klgr5>N6MjwT zBs@%bl+Z=kM(Dp@lrM}>rXNYX2Vp-#Ghq^8Dq$939$`MAjj)n%J0bQhbhX6m2q#SWUQ{u!gXfu#T{vuz|3Vu$j8y=vpC|SWKS;Z{};=r>)1;(@U3rG{<=jH=K z8U;9aK^pv~1L=UZ5MH*ltdtfIkfy_0lw;)&P9THyOOQbx+F;Dj&68&_mIfZ(tXaeJ z@`hLNbdl$Q8)}*b&V&~g;4qk_rj9Er8izBda2fnl=@1|8?8Ok22^@`_4}bBA5I>h* z1~>)o`}pXY!9PKbh@WQ9118cH@jYCmQ|i_b>EZp{69&mq`gWgCnV%;;kuQFN-4llK zr-KD(_Y_Du2XGc}tixnje;^`93#U^#5wR_j0ha=1Ks+1ZY=)n%hu?sPdRPHC3Bs{u zMfzntRZK_ZV~5z7k0?6?Q@;4=e&Iy^_=$MoME<<_d4RCP6JOX<2K691gs=-gzg|S^ zERl||v&0=H?Df@>_IrmXgO%vg2=RIr{2LB+ng@R?H08k%{5O=DxDM)>+##qbv{P9s z8wWNP!QWE&C!G~qC63L7`V|i6$*$mWO@$uU8Hl(>iUN=K{0`u8KMmI&LEyu{;~EAL z!w_-59%Z=Jk}^ye<09hz9;Ryqk72mq6hR)tdxOXD%fTa0CZ0k(4G`m`Q#jg>`t!kK z`U}8g-q@}fUIg9*9{W%a@Yv_j)=Kbb>pH^qfEa!qcuZ#lc#IG0I6TW@_Y;2*5bfFt z9`o4^9`)dNySQB+0HXX0@F-sZ6^MH*QBWyZKifBo`LdRYw>1Q?DH?04}SU8*WY~mo%8!cKOFw?$WKRq{^i%- ze*fd|u9ntg$4{I*)pq*K*>mSFT$JbU@_hhfctq#OE?v7tMaOjS(etuirrv$}_Uk`j zVC(qvx&D(Urc9bVWoqiQ=`&`|x?*Km5Hk_2dsMW8r?OaH`5b|BcZ7<*}dTstAWa0m%^l*k1U(Tv!+0`^VlE;`e`Hk1c^V z%Ynb;?bwNFq5Egj)0P-*#@h5A1)es+p0H4vBY5i}CVXF_yM#POLJT{H1$L79`de9z-3 zarqvFi#R@uqH7}#=Mlo~5bbptQ3G-L9*vQ>iR4kldlNSi??c?VS)|vOcr3~L5jPX> zPdtG*z5{?RiTFT4St@aSCPtS=9G`K~Wf31DD6hdBlyxasLBd6!9wsWhUZcmW1(7d@ae%#C0?Q zBoNmVPbKb0Jc~GfBn+M0w+JAfPx3(G<-~)CR}nW5-%dQ3xZF<;C0coy*?#Pf*{C0t`JWmjz7_bE{%8+aSQQe;x^(b#4CwUBEFsY zWa72Nrx33vK9zVQ@oB`HiBBhfl=uwdZNz61H|!SWzk+xa@!7;m}ka#Web;Rq5>u3SeNZg;e+-D6U-c0gf;zx;x5N{(M zM%+*<>cdDpig;(@vBV>ZClK#SJe7D1@hsv!iQ9+|C0tTQ;63SUrro; z*fj~)emYuEIf?rdcM%Vg3$90melT$(@etxB;$g(i#AApj5g$)Hi}-Tl`NVa!Kr1Ki zPrQnF5b^EAgNfG?4cS(KX>~T@v5aLGSI5f3JAmiok#q<*~6Pm}t@EmEJj zP3k8I{Yoh(UM=MlguF(|iPuSal8`q@Iq@dRCkeSz@>IcHlFt;JJwfG96WmDLf3@Hy z;xWX{#KkEsgXjLGToL!K(8=?tR604#g(q-yxF07_tTgfI8XcZ93KV*{?}ly(Jb9zT zZ(A3Lr`QanLJ#*h(BXL)Iz0D6S4`>Rx2mJF5yx+HM~Ays0!4bbZ-uUu_CrhA)x=kD z#GNg4xI2Xo_g2sqK#9=dJ9Owu-Q^Ma6!KGOJZBVq3E8=V%9juOGU&3Q#?Vf;|y5$rPceT*vQ+(W)LARXrms5JBuv>(#jM8;b{x(WyDdmH^E9h`%2;FjOhaz`< z2ze2OFQxKfJue4++*iVyz&#*QQ>qJ#B9qTQ*iYi%yYn+p2oC!P zo?pu65$q>%aC$GFe{dfL`DCFE40mOwy3aSUzr?|*zI>j-euF%n^s)cMfmC*Pd>bMT z&b;T69QzZ>r9IfMkY|z{`%@g8uFCkuP$J~BNsj$14o+jG9QzrTSLToXEe@E}$NePa zGJouUXphv#eu(ua%a8pr4r)`TUkbI2a#uVxEC&waUzsCGz{o9%#Bqw}^0J@fcttM91&&+f zGJhPu*e<^Hfa6))e{y)aJ$B(Z*V>8WUCVLYdvh^9WVvu2(8`N=`+L&I`9UkkU!2f# zoG-9lWO}*0oKvAk35WBDwjITM;z>cwE7;@kO$|A}V2YxLT@B^Inwdx~BX+Sp?OMd! z=?Zr}i}`38nLY2#JhisaqXGMwBsO!&$WfzBGJ!0<6rc%iSGK=_8V8J_morGl}0rz?3(EwH^QzA zx1GYSnHoE=zj^W%c1?BLE$x!?qnK|eYV0h6HH2s6iu@3U_|AL$<82W0u=aQUBB2{ZQnS=9Y_mW>M?nyp8>= z{d{o5${s56$#nN0k&kCQiF_ux%dbt>yIqU;OyF(*Y#2$xiFBuHIM%~FcX_b<7$SRy zuxo)^F5;)S=Mh=Y^1h1ku_e6Y%UMLMGqFD8{448E&bK1J>F#oh{4(ABNa!cK+g0e# z)YyZ$U+I3&O6becCdbS||67<-9NV>4%b1<%{CEL#(zv z=TI_@YLYioKn?LPiPsT-ig*L@8sbgFw-9#{|B$$g_-Dk~eqqnY#ErxsA#Ni60&z3( z1H_Yve@#4%xI8DY5Py&4HsY@kuO!|`Jb#C1PqYm3TgJIWLzJf12b~#2+IbOZ)tCy||s^n@Db<{DX+sl3bqCUcr5WJi6;=3_xDud&yhTf_nhcO>3Ma@vM-zo*cNxtJrDC`R-9!2x3N<5$RZzNt$JVVB(^hXk}BDvTl zgZE5G-k;>#NxqbL63P1!uO+$IMT7S^h~Gl;a?&3{ypiNZ#G8pptR9#KrC%oWm0@BY6Vxxy0)q6!9a7r;_{*;#tHqiRTl) zlem13r8DtzlHW|cX@^LEH1R5uuOZ$@`9~7pPV#v&KFPZfuO<0>;`PM06K^EGnRqkt z2Z$dfUMuC4epljcB+nu)-?QmP-0-?6kJwd!Kx)qkB#$Eb^~7U|?xOs=jzYpuHNxqJ_f#f}i*OGh@@p|IL#EqoilXxS^7fVj^ z%ZWFWd^K_T-j#{?QIh8nkD~aO5pN^8g?IzW@#KrzBz6mXyc;3y1=TbV~99I^B_c8J(&~zMM`^Brk;Ber+oC#_aE?m zY2n1a6uvQwZ!de&5$83yJ0P4mugP`SGujfz-~SbIaek8ryWNtb9hjb$dp>6=_S5jM zR*rAMdvkdo6z5I&Ub2{p#d*+D_wIw(x53|P7EbUSx4nYP(@ME7l35SL|*-A(y9*GJTt-KCwLFv%a4E z@wcC~>EZ6UmY4a+S7_41{dTK{)C@q8W6ALVH~o}XiTdd8zT zCzPk^D97_BnHzGP2l20P;(SXh7vs$%M_%Oaf8rbv{|YD0hvnM`;(Y{d{}Ja!@+}3F zWByuwOy4sfi1R#;J>tAszSV&5H(-Cyao3mN@@)qO_d9VSBxelC<%pMDj!1D{E#H#B z_a(6Z;9udyd7sA~ah~HDKZ1M8BRKw*@$no~zHK4Tm+_N3QjYgjPmSQdK606YJSUMk zNUoJ*jY^A9jy3Axc%F`*T9Nt5@q^!vgzq#6i8$xD^nNJ9OQGJ|(-+~|`=>b9leuGg zvA;@dk>j~9eriS9gEpXsm;uFkt*5@lC$_X4&;R9HD)>GJmfq8U#QOm9?G=<`fAO@Z zIR7tm&mZD_0h{~&EqagmtF0exxVF6Fe18R4A)Gje_t+!O4RAgYGmM9e5hS^cFL=J& z9>MVwI>HHF>Yg72cewAL;@sbp|DS!&k>#w8$!E&|N}Dm)MfWAYaIN*`Z9Z~?TYOP2 zoGC=-mWT`SW!jy*LtQ@HlN{^#8~y4==(Ew{hmK&)A@ z?HZ1=;@2Uj8SdGD*l_iQ8xSk27i~gxEqn16#G30uZbfuH`|MW4wAqWdA+n61I}n>* zf8tI=*Ut325KX5~+>K~^{my$4YXTGQN346}^9MNB?W;jFeSgD)hzmqj}Hf;ZzW7C<3YB_&&*&~QekC-1t1UopgyZ1eY zy!z%fk0TmCOMU{e=4$^Z5p8*Ia;$suhCRp|V*By-cMaIUvHIg5IGTs1JcaV4_#GTA zzp}l^jp>UyI`d!Rm}c(&G=@8C%Q>1q`HW-Do{`UBc$2b)qiNl*9L+1I^8R7z{Se2b z$_oOwEqD&~U4MIqW8F6$pGVFj3piSIuX8l->QT?b{Z?=^M}5dK>BztrFub~`l4H%2 z%^abA_F;I<;wp}|rtdh`og4ikhBqC)nWOo}!yJ=-8Mhz9ZH8Mp8V?`gSaa=!moU8Y zvs*c`-;Qvsd3F5D7+yE8nq$plhdDMhB)r1)@7T=I9OvX%^ICKRPk(j_N6Slv94o`_ z;K&kR;b@$Fl%s26_^YU26E%)wWm68v>Sdca8h?74qj}2Lf>-&!hWgIOhjMIsCX=J< zfz=!3T!IiSb4IVqeWNG(dqh@qxp@11H2q-hH`A` zks)|Zg}~q%jx6gTN>F>xZtr1zF^tV!I&(R}9~j>dzZ za7^=S<7n#IqY>j(hbM7tIFZZI`PvN}S;b=H) z^)ALwTAR$#R+-DuRd_wex=FhQ4|r90Z5+)lw+cS+ zX^xfCKILf4I>C`;bbTM=TgHtM*fEPE`>>p&ZS`FoYr5{^*mU2Q99`jOIhsqme}M5} z9C1uLzmTJ4z-o@p3HJ(2+Rw3a8wD=t#nGHKj3b+!$gwGL zCdZn73pv{SmT^q`vYcbmBR6og*zVw1GyGwWFh6i?xZ^dBb;?H^UEhAk(YEprjuyjt zjy1Q2evI~{b&la^yE&Glk&WSKUOt&)(+3$G*^nH;*V;HHy}yQ|rSr`kP3iY=thwsf^_yn@oY=)Y@$b!5OnIVW$ga-*2Iasfe>8NvGeFT# z`}B#G)1OG}XddHIS9DZfKN&dni=6KhBlpkh^`0(JdF98GbDYP1N&NL#%w?ggf|a-Q z4YnH}YDk>(7M$D+Gb$a6-~WRx?4s;>*3UL*<9CTg4~>5Mh51Hh_Ai0c8)tM@p4k83 z{a>bZRR;fZ>Y3e3dMbZEcPhcT_he#~%l2mG&&LvOm%m%jOa;&X$Pp^qKdKU6S#KKlzjv9keR}%o zpS$!{>PL)NkkoCsa(O~t|4kouS1Nzs)U$SRFXiyTL8oU;@26}F>(gx79-##P;D1|c z=wRi7b=PC_X7y5X=Zuc74(qLq9=PB_d8f9-cX~ATuSz#6%N#}5X58*f6!jCOOt@|G zZ?$!S$|GN$=-zgvQR(v8+yQ3}byHqB{NyXYE$E;;q~?D)d{a+l%$RZKzp3x1_(wdM zy=Hx9<$+E=PrGLGP^IUBJG;1k8KjK9W<>F>N28Uwf%f2e_F+oqM=k`-;w>{ zkR^i@^S}e)jVV#e=y$ISeKF6Z?9>h15EdVzd|t8T*}1pGD0knt=-%FOKPN6bzqZ4X zTvdt8opZ3`J;Ri+%X6Zu`wmjpEh*uesSZK6R`zAnVaTI({==**8YN;F|+u zmABsc)%o+W80GN}1J`GKaJjPYg~1t)*<+Q=ja9b~j1N*=GkyqVSB6nL4piDU|NcyW z)?calxb=fgA3^!bLc)f{_Ez56yNVUaoMr(&ZCvPJMFmYhF-&zhhG>w&3^k(h^#HCEo9WUk0=cSAyr=vfxCFh*II__Oojql1+_y}P>JtQ)K>S@?}((`9C5TjqBp4``^G7|t{wF5sL?|e{V#vND`7)# z<%q#_-`nqvSJFOtX;J`7P`+Pg8SvVzLzM4^JU8IGRfCnci`O^KUJ<3Z@;m*QIJ=kf z!|fGi?^sSHPMuTv$(kkS5=*{Y7JYKm7-ji&$}!{f!sex;VIRAsbd?4sb@amu&RFU;FGF<#kqaIbFbJEN5zw+$Y*K4G9@-rB8W zRrmzuLVD57Unh=Gy8Ybe#?StMe)`Sw4OU>Z16S@_}SU5AxVS5lXJS#ed` zB&GNJvwr#Xk(tW=&sOIoUOPzX{OJDES3PA?zFF~Mu4&;2C3WDV$BtY#NZI!D#p8K1 zRi)FFM_2EAd5TiM>x%OQ_l{Q{+qw9&cdk1cs?mNNf%*zVi>XDVU49{%9->!vIF=D*Rw_PJRJ zdFg0G;oFmxE`5KvEqZ98GI9Ol&b{C2qg?Cwa+Y%UKxN48#clM zwr=%|C$3OJe#*UIF1SJ&{>Qiqt-Gi``&G^3#@vhQ)f1=RZ=D1@r0=AY z{V%G9UaMWN23=J3w@hw(>*oteA<3kBzwXf_gaZ&WB?h z7gWcOy0^#8zo3@Jd|h$txC`oK+yOdu@c)8()5f+RKL7E&`cBW9uXXR7SHD{K!V1fi z=hd6mUe>pD>v=VPXnp2$E6=NY?PZmZUv*yX`DrrzKd;6tJonJhf#+36L-Cep!_KR3 zzB1{m;?{F&=skWn&TBrW{`9Wyj-r>(skeT=DB$Ux=hTTeoxO6vrgLhKx2}f&=hThU zI()P(>zwLpdtJ9hh47kTW1k&xPIWe{^9$;DPTh3##y_q*aaKJQxb4Ov-<(yiQL3!x z51dt-_PrW;`th@B--}U0F1!7#x@pvxiG|mmRRjKb`G-T+v+C^bN1s`D#aZ=(z~kM+J^IxdwY%+&7~30X)bqdIFudoU zGwRE^%PfE2enwsJy?M@&^=H(gn5JF2qBH9BoAQH_=buqyb|%CBGiptbH*Od_^o**X zvFh|ET_L>QB+UvvG4%<$vPpGQYMOS|bXxta zS{E_9!)f(Q)V*6?J>90NV_H_FA8AuRi89};`=m`BcM%p+ue7O;9$Vh&g~!{}dvDa8 zY`CjUonH5t>&K04>I+*N_78NlsZkrV;eVSN8Cd=ro86{<^YY$RcTQ+iYj&>JO&<($ z?%LGAC`+X-uuV-`t2-ZX{FK^r_LXz`A3CKT54bjYanmVvwQktfr(Zs$zW$rj(C3L$ z>ZY;JEr0Z$Q)=VR@^v$BI;D1a^X_m%#VPfvN8%5Ez4Vk?RHl3Foq4C!Dc%0&_-OJe z_2vu7Z@A)5sr$d3vNpEgDK&WYy+!4nPpP(bp;tNer_^qi)~=S;lj>VzQkI|k{-m1S zxNg9%k4~!H3SaG7`07bDG3KF=X-}P0tL+&dO?dF6+R#)rZtATd&tKOyf89wnW~pxU z16Q9^PxqO#?6>Tb>O<4VUq3tjq?*?|bV1|9lj^q(H`UJ@by7{r(XBkw_oTY*$r1Ta zN1jvzyJlI|1)NmR#SMzjJ9$F=sY_G+!kE>3C}J*c0lEfZBN%2cJ;8v>o~-sOJgwjRWD|_vr*YO$Yx^ zsQ1kLCTGjB}${rcsU=HqJdp8hw~zjIvue#@?Jl$VaH3tvgE`FziD zb-HfF6Ki)ISC=;J{bB6w$JNSIU7vue9`un9mKbG{Ahg; z=y$GDb!U&ML3j80JpQR;YM;hc3H=^Ersl4V8rtKoW9lu2C7<-U8RQA;Iw!0ZG0?r==C=no8T)E!gvhd=nzhLf%8jE^onc*U=+>YbG{ z8u~k1)ta<8UC3vEL)XnZ`*y1uKIY0>PQTo$CJoU&;r~pl8u03|tvw!TRqu~DJSh48 zR`p^3`i1t}TGh^VRS|Vnt?H}~9!xlMZL50uz;*R$rLF2f-RG;H&Tmy)wpQBuENWHv zuDo^4eHpFl)_&9Af2+FC((TUYl~(n;{dbqoi*Hp2N7VGu4Q^G-&-PyTe6LpZ$lTP* ziY~3{!G@(_Q$t(T2$K%}x2m>YuU_kaszseyzjng$-&#~hy*mEyhg#H^rVm?sqPa!w zxo*c3fgiT03!FX9^?9R39rXK@r0FlVs6Xs$UAp?I7WIy6VzOV@-J;$f?u^#m-=f~T zV{>K3wiflPA=TH_-PEE+M6C;tTGyg(_`G}cO)Fc}iqeTU1{Sxdx{>G7Zq92_I}9va zeA&Vl_3h8jKlH+!7IpmlAsrW|wy6E4#^2mgZBfG;FNgmv>f;T+-?(XLi#p2ux1X~5 zwx|PAcSoCJK+au@T4~h1d^QNU>w?jB!KLo#|MZ#PPq@_TdygzX@taExx2&HVc-W=h zF=b1w=_{8y?*7Z?P5RiSj{kE1?5p2)saGd&+PJ&Hr8eHz|FiQVst4bx9_dI%d_J(fy)8pF5XY313X=Z*bv01~`du z&Rw!}gjodgzvBEtO(A?esonD#O@#mIrBUB*(v=g%`)1XImn8r1vgeYFM8LTt!X967 z71_6)u!gXfu#OPpUB4uhzsAu4uH)h0Ci19`MSd&_a(`bP+t5$PngKfj-UPk`yal`y z!mb6J41P5D2H+WhCh%==T?2l}03BNleh&B)@Rx({4ZZ{T)BSbqNAPzH)Uhq#*MTnu zZv{UGd?NTk;Jbitjn%PV!G8n(L-4PHe;WM5;O_)~BY1Q z0KWzN_291oe>M1};BSl5vCZJG2fqgVO7J%D1>keQF9hG7(}t$S=vnO#U?2EDb0}%h z$eT3R7zfjk4#x~$CxORwwNA^*A&%)Vw4slVRv*vz5q;1dQG4g`y+&){}YG#Cu!taaNS-V zU|KR2ZMk^*nzW@32DPD`kY1%GeT^!=#CB-V$enQgXEtC2OtZaqzAZv=lc_-){y1YZyS74WZv{}B8^@JGNO10P_9c@}&> z@I%1k7ps~h;ot`j;w>4%o_nDKxq88T4&u7rI+h050CQ7`KNLLP^BY+FOIbVX*f98c zJV(DG@tR6s9ZLc=8P?BiW=RlM8KMarIfAEW36x<_0ZE_(4L1ya#>SD|4{8Vw(I$$z z9%eS@E?EknTLEssv{TYE`(>phqfUcQ7zQ?ahh2$!Ormw+M+i^_vSF*L67<9MJIG% z10Ac`z`SeN!1z^cpw7XfTwR@!O%V;oG`N>SJ`;Y^v8~XDVkg5z0r-%Rq%JV^`Hw?b z=O-Y5gHFIY|E^v1Y_ooZzyArpz;6ww{X+gQ+#bxb{G$y0V5(rc4uPygdGT0Sl z2~6u9pl1PxgZUgb2nJadWW&Q828Mhg`0W@5alJW|3*&(v4o-JmtUe9bbqr)3<3m}; zks&UFGtknzTOjLpAcRFYf>}VOftjICTnWC7=K&UijDd_@B7^a*(ba_pu+WJ?&VVLA zo8AKL(cQqhANOZn4}`G}nV~EI%2*Bk>t*n1zoY$NC&(Gd8OYfsa(KZ(qtE+Cy51b! zKZJG7?8LgpcVu1d5iX;%V?&rN)PnuM3`N!HbxaQzy66xV4R%N88CY~?5Q~OB6+N0HmEP8V=_US(G8_JL;+VVgg zv=!V-2Sc8S-2OB`_<~#BFVX`czW~TIb;c|?vh+C&~fkO$P~$WWWEE4ED-v`r}MI?~fN(LMZFNBDw5J=l)z)CBqJ zdW5kac}CU)+Oh}O*u(A~Z8ly1FxEdm0NO7c+Rq5>*9qFMBa7Y(?Z@rt0Ct3d9ic4J z4tDUca0oL(SSJ>_*Jull(zB?KBh9j&e}&mI6z;&kKs_V6+XUtiU)?)F_j&LWK^HN& z1FSFBd)n;h6c``iYhdkxs0;FAK@)K{g6qpd*kxerWg}x;QO>SSkqr^HaEmcb)Rm{t zMPFuMm!*5@a9jPLZkE8yuWjI88Ug784guc_TJ00y=&pooi-t$Tmy;Sl4s(S#4NZX! zqMu>8^`ILEYcgDyrNg=i5&1jdR{}>DJtUMx=XZj>Wnvv&Va|{yLqnh~z~XOaY`+P{ z66ic`hq{Bi#!1K@@xaw!6JXd#k;V_8L*p|o8on5{v#v7(YuqWJEilqq3akxreRv-7 zMnoP0uVW9Ta@_>i)!?OEaw!*mrUUdD=sPf9^cd;sGvRpuu*3ZT@56bdf8p~*81y%&4@f&Yy^E`}GrURGWAHTi9rNiT z?Q+0H;1Mw|#J`FkG6TN5f2PpC1~3~uBF0Ay#yQ2|J%(jj_JTZime5rI|B-Gf$bTl? zi-^2j?Tn-DA*_2|SJpkV3+o;q$-1|SdWaqfW!Lp*9bBQ#;HIDkexEh#({SA4x+;1w z)Vpp(yK)=Ibul3<2GWb!+tn56jA$}8bhLG_gr(_vhqB)BeOYh#B2=$lp9X32JO{R$ zCT(}nd;#qa_X^*(hbn}dFwCntkk+tZ)-&$_>lyz#>#2L0iP>4qJ5E?PiMb*K=89mL zD_}lLhxvog)j?v-!RJl5FTmW+=QKVK8(D{s1JigPgEfk5m)F)Y_7(WyG!Asw_v6D@ z=X5?6ZFoNqhq(joIt)90jjMJ19b&^|u%nZ|XWry(1pN;BWi;3o4R%5QbBcLA4Cdlc zn1@4H7dvd$c7lEm_d!h01?jE1MZA|B4POX;8RQ+lH6#sXQP)CafZKaB2NsOu1L8^B zvo|xg5By@VJpgpVHTFoI{vaO)ezGiIkPhZK(2a!oAMT&B{-plXTNwKl{AQ^ip=S~H z(6n%Po(iQp$S1otZxeR4mv8i~jP(UC^KDOOF31;abfU5S!8UUr{G~Osjztmfl zZt)SU+g76s`fpQ6gMs%YF_t?(KY@7)#sQzF?9fm6y%g@DnJ_m(ALxb34(ll1*F9^Va6V6a>9}P7-|{+RpMyV0Hu%mLx4gyJ!{DV{ z*8}Dkjpb%nO;0&N!wb8CcHZ*|n;8r`gm3WR%A5ZDViGSU(q*WvPB4w$d=I`cl# zc~r-}d?nxH-yqjlSx_J0n&&8K-yEn+X9;VrU^6F}!j@KZ@Ix>o?} zpu33$I{lmU4We%wVKLG>HiX3Hk<;QCOUwB) zPM#kNg?BS(%2u@0AYG5I*uH~2iN3tc44 z*@t}Z><|~9)gZ6#>D^pioSmD(8#=k`v-bs9>wsS)>vL2njMYA{Mu_oVFM=(&uh#sA zj=c+Y(eD)9m*Rq9jZv-d9)F9zyY42vXf3L3ivJ(R-d6gpLJt zL|+bOA?blOS+=b@9SetNz1wBku)k(@g#OxrbxZg3SFh)wz0eK=L+3_kM8XR7(t5yo zuM*o4pW!9~8UvXT<^m(k1;+F+TR3zaV?1!UmUdhl3TH*&pOkil__2_DJ?|H|#)mn| z73`#S6zx}-F%NuRguc_>IQgiHj&p6I&XD(ge3(lFq zzX@eR3~pyGnPq~#De$;=ipcYU=XG@QEJp4>M`0lBkodYZ3af!VGGFHh0Syp-6g=*s zwde4x1)VmZYUnRoX9R-hAn3GuX+C-=m-d)1T$&%I@MpH*nFl(r^i4d->yJ#ox}Ef~ zymb(s3jWW^i)R|>wE4W(iwAlAk@>W>lMkj~yx4vocy@qJoBlc6BqisBy+`RTz_o26 z?8!n}(gk8iOY(3Tj<^EuHRyH(2@KH->_He$IGr$yu$Zut@D9R92@eo96CNjw@Du3| zARI?HkI+WAk?>x^=Lp{;bP~1_ZX^36v8>=?3C9tp5@r$R6P6QJ6V?(o5FRBwPN=8) zG7`oR#uAProJn{UVLstz!utsyC47$XHNwvcj}W#I>R~QH*O4%W&`dam&_cM1a2w%H z!o7qC2%8AMCH#%>B%y)oH;QmD;b_81gjs~egq4KcX!wKs7%=d^x z>p_$M%AW&%&M&9TVJ(HwZ7ij*q|}-U(F?827&t$>z%ix7o>5S|w9q;`XBk9iCs~T! zn(eUCFZMyKTQRL!C3$6q{C5MdfFJsU&=daYj>42|o1@HbO(`kHGbnZ*!)BJ0EHAT7 zDJ#x(6qFQCE_T=}U{56gB=ZXFj~;(hH7?o;>U+lI z^eZOMls(}h)^u8KW(nqpDTCcN_@`$Vlv>?&2`8sm>!P~h_Z+XqRA*+FIwsrgB~ZtC zSjQSZSvR>jw`CYuP`-k^6l?+*{p>x=D>(&LP0yh%vnS8O>#w*4Y1mO%g#WCvLPx>G3J3i3 z=KO*@Yf65$os9{UmzgDQIm^H_CKsc+Y7RD z(Au>q$#A&qaT%u0`+kMZ%G!{L3^IX39?$5exZCzQyaol)n$IJ1x9zjYcm+P{{d=U4 z#;1NWJ-TMLP~S7tQeC91`H+kCC!qe?WT)fL}`I(|E+H1j_=~`8uDLH z^8LS=K3?)Eu9SqsRgbvi;AuX0oR)1D>nYz=5yp~=h~9TA&l*hXIByW|zsYnYqFj3| z_5Tc`BJ_WgfQ^#R{X03 z{$;s%Gqk$A{}l;j=j7&Dmn_XMShl>dsJO&-HB9JbD^`|QtPk>ECA3|761dmv<9< z>swoWJK=%fvc6({ZwlP?ow#`LVS(!&aGt}fq&1ZsYeE0jhrWEsB*d5eT?cz~=#mJZ z{U`O4N&h*}|8U3Q9Wm_39Y=R86p3m6y3=3tAdfL80N&&Ka?zJ2w)o3sUyjshipzDM zG=J+n&De-FBBmiq%(IO{|9fyPxiCuiJxcfgFTyJq4E+V4`|%|Of&iTf{`?!9-UMm? zo6_}NSNt2Y`M)Ab-CsDpkMkoZ3y1v!o#ejl6}#Mf{V_~Uo@bR0;7O&9yrd)^wLQI@ z?7YR%I)dFXG#ik7hCbc)UDaB9?#KRu{}Ms z)3;3R={ex>WN`sJOHr9+o&B#uBfNJ79^bFizDI}e*9C;bJ1-E97zG|aTg$N@TsOfr z;$ZMc;ad9+9KJWVCIZ%u@O~TOP2l^%H6p&tmIT*`@*OxtGwefKARKW5_)54&oCv-K zu5q7wGkAQjv>Na|y2kzVk>D}h2DlgecDQZ;bb{Xr*NDmR9wh3d0cL}*Lw&#|@c4ct z;!WLv!!_bA@JHbq@jUo8xJC?&65(dRM_|v{2xZ5;XM;(kk2o8A9oh`InZgnGfJb}k z06*yi`GU?-zuz~O{)F7z$KcFmtzkx?Pj|0XI7HJ}$1)l{v z=KziH%!qLjp8%f*;dOvLheA8TwF&T6@P%-_4e)*NsNVz_5+|<10Ph4}4dL4X&2R%M z2Ytj$@EDGGEnQav?xXAdfS-WJG(QEb91i^i;_e6h0z8JF1DrGh`Y?pg1iTMChSvdx zjuibQ3^0|h5jW7aVHATiHRxv$cRS!q;L)B2z@_of77%U&d=-3{OUDiXcDWqF{|;jW za20qnT(1UvdNhn5xPAukTkx39QNWpFz&;2^Tmv3$s{~9-fbv7Q1MuOoP&T-(1q>h0 z*u8Ka3D|7{)Gb^`0gg!&*XI;?&r22QCjf2&k7Hpo;Qin+{Tjf%bdBHkhTjl{_8{W> zGI))+ED8E2q+bX)BpLMJdMIE@im+!AU?F%+6Y+Ywt^@2j3C`l6PWl06fX6h;0lx*0 z_Ba7s!DHOxfPs_6HNFoNLD!Lhqv$#wa28#s0d|@q>dgo^A3Ua$1-Oc?R|7so*E<2< z2ah&<4cKj}upt)k7VsEe4R~#;XroHNHPfMgw?bP0uA2$%0oNM7Z3k^J z3GmiJunqKMiy=+$SoX&OzXp%(g1E#6?F;((fF-3cuYtY|Fwi0TvjOk~_-7!z4Y0CI zgeR;3ot2P2#5DlcgSWx83ox`CY=-`01PrHZ6JT$;z6x*$c(i9H;8%40HQ*3<`mKZV z4h6g#JnA?A_tEu!K>al$+#hf*cq~g6;0xe!e6iI~Z{X`79B~<4+W_yN>l(nH==vz& z>}z3M|9|bBeUMvMdB*QLPEbMyG!RlzJhAFH=_a^Sk-D&@CK1$7wbSYBA8BUkxUfTk z*`Y2KY3$jVrm;d@5Rg!jhM+QoF2D|RCY>NN*2=g<( z9fV&HVy;BT1wRJrq>JZ43HcO!^_`Zy8~zg@e{O?64dn9!@DIRV?3{uR{goBlD~{5~ z{@RMearighXVrHf{Q37YSD^ne{F<<3X9)i7574hj55OM)A>_N@cYTn#9r+;qJ|G{$ zaNL%Y@Z+{zfv^4$zom`-ZunLp{oCP(fNU1v7u;o)>w^8j{S)F0zwmCpe?sSS_^Y6V z{1|-6hb{kI@O3~o_rRY3bLf=d7yXTuz5{-u@Z4s_nl;wtR1bbC3oCOiZ z6Mh`X{sR1(k8q!Z&Jg_PAdh?-y!&shu_oSsuO;6Me+(Q%rvSS?%6A&bJK&puZ2IA0 zTNd99RBjY5+p_rA?z8j*@L$?;2+n~LHuLZcKW62<9DW;+{UH1#X!hYKc|lG3@DIS{ zPjelIulqZ$o5*|M_W&RAZSdE?&B%|z6CdZgPu?W_FgS%Q{-;my{TVvP;H&Sq+Hp7h z3{bgs_~Ur;$5GzA;_Okp6~zKYa6NxGzE$KLAuOamkj&cYl_-8=VMz(LZx7KsMp`9i!cm!|;6%S@nv- zwE}HQy7=q=%DY{4?hQWAH5w@9`{Dlux)1pwyzk$rKRV(QUtoQ&>-NiAbBa83) z8smk%YV5@BXG`Q~WL< zI|tzhz$kXaPk_DDYkQfo{9gt?2+X|!yyIK+Ph|1WK>^t~&X@xCB9Fp91kHAYKlg3Q zCcOxM?>knzRN>!x+^#!(w=GBDFW7Ps{;4f5z^|%U`g`I0cdfA_{u)rdTKD{EFJS3^ z48wSqIKV#!yOC?~<4;<3ufTVF51I539QXnCMIMGvfSZxUFMEo1MfSkcU=(>4{t{@G z3s-8ykaY2pdHh3u1pc#=*8CiVvq1WJ_}Wue%m?9r1SRwzfZzBN_M0OI;D>%npXc|_ z3-ITk<+_IaF#PSGS#kv){yAfobn%~_rf(nz;ll%5ld&@nU(bHKJn4JjcY_E%1mUj$ z`BQ>ldJ%IHWAh65LH3@N(BE+}zf%CDa}a*{CDad{9q^~vYgb1n248m>^QG*=UkAFE zsKBpyA-W3yz7On0j>50Ioa-~PA1(v+jSBpsm*4~GCVb}=?4v_I3V#F0w=#SR$RF{i zUxpphAAnzZCG!pXd*B~|5ONKE=ogq*m`{$wulEoK()YusLGwEG@&V(Qe-Rs```{RO z3|U+Nx)&1P@(OH_9)v@nid=xd2lVV&g=<#<(#2l(-^ow$>p%qA4<7^D*%v4NmYsea z{t=MA-^=^cV2^a**Z&f+(X%r=4TeeAe$8LqWu_Fn*vU-#7m#!EnfxzPu|8WfR7 z;UK6Xi@$vxT#d=>#>0-SrrF600Taql+J4?g=XR+SfkSx}oWa)_Y zPK0E!-er(1*4}c-V(nj-EY^N*$ztuTmMqp@Xvt#jTb3-=-ek#Q?ah@ezQdNq+Se-I z#M)ab9kKRgDqTEpr#IhU-)reGQ}sVRM_`+A5qZ4a+P?@MfuWYq#Rfgp2$H@H<}o8A z{TRF*o`Wxjxg>|6#gFogGR&(>(zV)usWM98IUg(C-67rEA)R5c!m4$XUsuW(uGxz)H4eVQXZC*T9d57lf98=ExCEb*RuA4js%Z6op zsjTBRC{RYrmFw)%t~rF?)_m&3;W)=p${T|NV8}+mPK$CZ9Ymg+Beyq>m}E2n?1`v|OOo3yh<+B-D{y7#EPCgW3cV!QsS^yBnhfBT#( zr(ScI@ny{yZT)2K&|Iv!S7Tjs&5B0Jqp>61=KO$vZRZCW!saE^uYis-Cu_dY9QK^~ zjWo@5V>$;G=Qm{K?Kr>LWw^=9Jh(U~I&&+Sf1A)JBhDdsWxR4rN`2O|Ol0xxTk6r`I%XZEC`37z@TtM%~zH z)b4n(@!yRv8BaByvCcU!oz*gHHm-PCJ(EQ#MxeQMS7F0bTjrTIM{*d2kTy10JwwPqLk+bJCHn z^0eCMc>QXP4SCewPJJFh{zI^;^$0t!Y{(DUT(&=OUj6(VpbADnt81&0Wy7{5o3h<; zTyX9H(DQo7HJ?>EK_=O>Z6D}lgYzE*mv=h9)^yoc8SU(lu4l9>+nrm_G?k&U*3)L+ zRzCvI_Xuo-@rMtaHvg#oD1Wo(-%Y*#*fH3&>#sA0XopR^|FC1QsrO$kJ}3^(y-@4D zRJXG7%EsconiJ!0nY`)`x|i;@Oh-?7mc8HV!3T{CjZHmUEEf-*la6#d-e+}NZaY2f zp7ZCgc7B{MX?n-1`8j>0(Wtzj(FhGRPO}wif$gXDo&0MwcAjiBzVb|?@zhg|2DJP~ zI?`1h<&_QDl1s(Q~=)D%K`uerj#>58~I0(v%Yto0EwQ0CjUR<+o zId82k>sok_di1=Gv0DG}bsN6vI(UNETk#clkW~+Ko98>pvV~pQ+|c%5P5(;#e6Z;CWrI0o*gzWNU6Ht=p6l6Aj)zpW!(N6GWYrohq@Zew9p&_<%y0Oie3EY~6-578NoCW{{*}8w`-hL(jbsqhL+;i*M z>mKAye12j7ubyA!vnt`<*BwxCXy`x9oZM4CIEf;P}k?$vUomTV*xZWa5<7vd6l) z-X|Zr>i3TC4%2>DGJc)__Bw{Oe#ktg^_dE7ySRR(an|hze+}|_u+dz zOYQnsw`q*kwe|N-zB}pouIuvw>f)>~u1B9@>}b7pb@PnlTQ5u<7Qeq!KkC$%7}K2N z8l-jXrLwiArtbiIx;FLV=SsSY8L?x{Zaz$#6v5MgHfj5QjLz{LE4s?Fj@OWt{OtBT z{#oB&ADZ8X91!q#A2HqqZ`!?7xBmC_F02Sx+l8#Z)1mjw&ps|(WTo5hsxPqVNP0DX z$5UM4_XEWRe)CKmx~MQ9#uEP-r`h^cIRfu&H0toekw)Y6O|S}reWT$1lfE$8V<|i}iBq>D1eagA!qhM*L6Q*FMWfuwVodY*1ocHUw_3>Wy^Fh9_`xpF@i$#`&eoBx@+hxt$d*&bl~_Kmd5kYLfKAOaE0z6abZ!T)2J3cDD_gcr z*;W}V`4L>||5}bI?*`Cmok`|VtKJFLt$(jICi2DhNxrql;nua-#+L5qTkmO; z9B;^P2Cc944OMPl+ zH8wUgk9@X$R~>qu2gq{^_#yCZWe7o}=xZM7 zIcB|-aV~XL7uBiTGSTgMymV`Ov-Hl#I&D@g`{ni{(2qbr0{sZ|BhZgPKLY&-^doRS zMc{mVR_LWp=w8szzv|1x;DTNMuz{TXxM0`6?fPHP-+$OKxM08kvg@yT z;DY`B(~iLn#6aIEJKw9dvc7{pZ@>Rm{q>=a7wrBAyZ(wntV17Y?GKJTkM8Hdd9nY+ zj)CTa2YZNt6N{z%G&c0T>XSAkD{ZM>ugCIjL%+Mh{sp`LO?^Ng#TfK57J6;RUiIb6 zhPJy^^E3Zbp5mZ6vD0;-*E+05UuDaOGmf2OiL!NVYvTM`fQ-}4?!AJFnTfi*P zJ1pJQubqza%7$!hx%TcRR`{*!<$j>H)0&dTZM$)zG@X-Lhx9#9^ z8(U^C*3VPsi#wKCk{?roH#jgbK>a4burErJMJj%RQ;WHY5v8Y zt^=Z9hq%~qb5EsTi5TNLG+=l<)=~IU!`Nncz1ES5&P9gLXCGZ-7~2iM-#Qw6gMpR) z=RAslf4~S(olra+kHn+#SbR2Kh?nD)cr{*&*W*UQlkg@66Jv>BVmuK|#1dv=HZhkd zBx36da^K55O^Z%p3E?{ITKKXe<~D#Uim-Y&KSi zm131xEoMx(C%hBB3ID|K#OOqDA~X@1h)v8+6eda&m5JJf5qHPEabMgYAC8a4gYghi zv0_ppCN<*WCLX?oKQWvbB_^RngqX|{k5atR97*B`N;dCTj%hzdP7j5jJl?Q3(AzC^>TaVD% zW3=};Egq)L@gp)|bj; zt!G_1Pi`oiuAHmp>N(e>htV=L8JHZI9Ge`U3{OTU&B?jR z;$(TUI$57|c~icWKQ){hO$Ae-R3sHk&87;eQmT@wF;lwJ-n1|6 zPYA%kxVQzn<->UnM$UXF-*7V zHGQVv95zSIpcyhFX3U&53ueizm^IVLy0hM_FYC_^XGgQaY$zMa#-$7h}FE+RAEG+QyEliKcaGRh|M!sSvML6>2tiY|r8~x`79;p^%zWf6+>X zroSdY>9u6;Z1-%HYRj`IMN1W-e^bTAX;KE5(vjYRvN$}SY2JlOm8Viw^eR%?3iN=c zsx9ih&Ysg`^l3nD9dhOWr&V6BCG!?8o}&_jP+>4C9qQRX{6*7N{dB=(b-Xuk(iGby z+hp4m$#*{6DgW+}xl_JmIV{!Ggz?WMFOHYOHS=w`2`fBTq#ZY@FdX(ua-}2dbIDp` z_-AMI>hO7!Vs?EQ^0$(2Z;WI;zHFqlUFm_kI4%X^RMMJjMA9Xbq=2oPWUVx;eFse>xt4Ej ziDzkrq2ymw5Gd*<`Och{{39DfeYUrvBI_~9F#K3Eh=DO`$y&R7u@qJ3c}4 zAVHBE9R2|g|4iWZ_2@v_BD7Yy{PW|Ta+M_S=huQNl`{}MOp?C>N){eOUXn3dOU3-* z{^3`SxVnX4z)iX3UyV#mikPRXu+ll&|M~qwu$$$do)up}2|ZqX$LJ z3#!=Y=+T;mI`*&V;hIbx`zAU)>SL~Azei_eKJKKpt3c&?9z$@He|ZxyV$y1R@{w}OiVJ4-(1fArMl>(B^&_=^wOJv8AkIXgaVYMi2rGV=+ z_qIT98>GOD(~@shV~k`Ng_OLiK`IR!O6oB<+h?G;DqpU_(hIl>dDrvQxjy42J&b91 z7&1yw56^At`8I3K(h-KO71efaAyHllAQSw!2BwtYN zxkS)f3us53SyhfhjiHzbLBKMgR-R!>-LIVtURQy`+UPV4uaN?iZczcLfGdxm`#l_H zAGICmeFJ^*bC>}`JQ{-3hIm(jp^dA-8PJCQAT&e^6;He-=;=~{o)A5TQ7%>3m;(9h zYXn6f1T9~WHqytr8nr+)|7GpM^MhyTk z@g%~qbDO+a6FSVH4kww|18w@wo2-EAVB0|}2x$HWJ^}2<(303@GIT+xdpR+PBsOiBBCnbvxhB8CDB=%L?#4Z86=KE2J z03QXF32;0CrrM37c3-xuZ4&F+&gix9VpJu;7@(yhS?c-YK*||-#!PF;A>SSEkRM5Q z$#YCD`H@VA{3FER4yfl1{6q2g9sI4Ae6!<0ChbI;R7L6pfhq|SNS*rnzlgVI@s1>r zKQ>WFp@;~&7c>WuygyXzdb^HM)32#mMncLclTv(*W}->pWkcZo1t_tL0<<~I9}NQL z%hy%Ro6vFGRA_ufD9s1dW{8ChlDwB2F__W{cRNZiLK+ImeO3`slJ9!h-GZMbsn2JF zU+aU{qgc13mC?_F;7`A2RQG4!CfyMo2l32i?@VRgk_}H67}e2^+iOp<>bpOwR(ay3 z%F6ipS1ZF|kGe{#tcwrc1kG<@6VRrD%}5#e)mL__-K~V2<0`X`PL*m0v4%gH7i(3jk_z`yz8snpa_4P4cq*hWKZ!qRxObFTHFt_UPX`1H z6l+LdPL<|S7sn`dg#NsWKWH;+Jkq-+A_LG`{% z@}1A*FCh)N@7t3JRfYU=)aQ4iP_CuI;3MPN{VDCekAU4up#KM85P5yCX7UE}DP%pG_-9S{4Db$_?q&6tY ziAaKZX9MI0JloJyP`w?7Cdj=6R-c#|Nm&SoAqzpnouy4HqkA0YE_fAaV+L<6GK&}T z=jlr{roCa~S|q~84I*1x-ZEN6^J}_W3U?`?GQZQTL$5hIuozHp1AHoEDa?yGL%J>m$lXO@M{O6 zdW|+6e--SLkW#Sk7)doDMA)aGOr8k4%AcS{HmdwL6?-A0L+Xx;)Zb1h9Mqab0y-?*q^-(>WQdKk|(rnIOrcxIcDqH^&ZZR!`*3ePpBWX*><_Fq#+jeRrQWlHPP zb2D%db{9X;jyTg3-M1o?z~vjP$5+D{+c2CKZ+~9`Y7S zRO^nrqe~8Z;`kRp11tP~Y_zt($cmWE5%%^CS&Pb0>Bl`W{AH{eQU^ycf+7_27%T#hte-A>3}O)$*(`JV!b=(v^j)*DJ}2<>FPm{L9?E%=$z5%ed3#NmqBP$U%y3N zRlgevsL3}_UL~GvN9WFIucNWy$qFjD?{($PUG(&IdGHz5*tt{Gzd|aOZZ>t>`7QB` z3wZPi5r)rl!9-6TgYd!H7HpJ(x^vA#qt2XDu~*E!HRf;GQL`!Q+&K*5n5B-myFl{O zat!1*P(lhDOYxEoO3g8k`nOtT^VO>De(hi+Los$)Ye6F4QfHGd<;%zO3746cKI6?o0c}^2&U6N<9~ivqkqyLSl0UlK@MpjwQpCCm-2Q&Ewl7{lL2}@H^>0*uc+1sxkL(-rAQQ{OLg?QTrP_LNTb|J%p5@{7ll)ILT1nkc@Yqp~Pk= z|FPZD(YIjb+2k*5SO%5B_%2~MMttAL__Yr|4OnaHGF2+IboG$bSzjuE>sR9eN-m3) zeBXa2`SlMd0Dmwph4#!hp`X+3mbS#B|Ae(&)heJd-JAn!0V)ny?uoa}#J;<}-cpgP zJ^v!Gd#a*}HGGu7(z-?JNP#Jk;kEpvgNmzc)gyIkhrfm81X*(( z?d-vBgET*nVDEGrlRo{dFiF6;CaLsOCoQHM(;ThEv-BZ|CPbcKs*QGcESC*HFzQHT$lY zWNfzvQ%;-ge1lV-v>bwG_E{Ahnmu3hM;d!Idqw9fr-_Cx18pjP2+{t04@y*+Pp52) zcLvgL9ALIS#wM&%fK_3ijON*negBmGpwHmuZyWzVE06Bmvw7t;ebbv~-?=+2HYGAH z>i9t4K^+*GNY<%Sm&WokO3KpIkOtDuKSsxwYgso-hIg{4vSO;IKOZBi6ik&$54*cb z@-&@f{oUP))CM>zF?50VpbGw}Q;ChTNomZg;{O;fq#c>Tv7&umVPqbKk#<$c;JgKq zvRlR%KS?kAQ`zU1Hk#^acFdB&y#2D09#)DAC3!{;U!-If@VTtAUuVrnjqFUnEKN)j zYu7(tv%$=!^deLuXiWaP(=BVEEq_xZGBLbmXEu9aLd+55`7fQ=%7L5G zOr&&tdnDpuDg482vyxwdfs(V-y9T}aR%EMI>-aJx!xCIcAe-1X5aDJMHvSbRNxoah zCyLC}Or9}>$f;~IhEbuf!ql9eP|H*XOH8a4qOnw3=WYXDRnbn+T8o{`oddCB>y_I+ zXRrcIQAXtYj29ZoH{|3B=n_wir6RZi0K>*%*jC8;I+ViBZ{3*{=cdel4LLpl>k`sv zYRb!E zy}{aBlU~Crt!YiGgT&EUtGRjBIJkTBtTgzZ?mD-@ zHD?7Ts}UkDkPs7UA<19clnMgMes4;V#{5f>^3;&%uMF1ud<3^eY-BBxAMV=-}aBsV3%1PxvMhW z_erH!+;g$c+VHMdS#sX!v|hPjw(j)DOn)-yPka2?z!P%W>bx#&j;+m%+8g1pkE`8- zp^-fILSN_{^4LuNEOtOnxgmE}GN?5dJ2Yv|tYj(bm`&`bUE~gi-M63X+XI2@Tg~P- zZ`Sh)J7jC8J(z+nnYUYF3to^z$>YNZYhG$#Nh8b&$1%~8yxx2aW0mjH$+>*-Z*1I% z;hJri*k{Aj*_IIo_P7+Ud0`2ALCTqAz~FtWC9s$~iI>CS;9IfcrlIsvta5p^3G#qI>Y2}yay3cdl)nmoZ&zHr#EehTW_e5-Zj%u3kJdO4Dsrc#ZG9_MiM)S-ps zTVYZeN|r={Y>k*wNuFxr7e!)BPPN@!sCLQ=GI`7YvGv%aJx0|&ptrsi*d!0;uOjV~ zSLE<#k$~47oGbYXb5y*KQOE?N15RRNBI`KXr0E>TMvNY>N&bcXYxKREA6v2T=ziWs zm#NP&5R(U&tV zwGR19-Vf#&b|8HuA6`Yg?mpXi2I=$=&s*+#2U_jX%UbciO$nG0*&o z-y&4<+yhluM5^%OaTKlDgLSJ?P8Mv_XU)8OM%4$fUiR|fuXr19mGQyCcVkSMgQY|H z3XXj{PwWec#|INsKc>ingwv0ix!H%xSI}Gh%bPS|GHV={ta*MBYg;f-Q}aJIrXaP| zp#3CNj`0`&$BGK_+7|;NPFzY`Kv0vNfNtRMJIdp9?2Cdfnx5y_rGjpnO`ov#zXD$K#`kll=1-jdYk{~t=rIw(*?ao_joU#l4oPGRGYx>rs zg1k9@B`;soTk+GiXX*(lsXv^j*{*d)?KhO1z)V4)7^FGNqj}wV)_+0|=~=voNS5Y| zik6}pLO5vol`Cbn(wuyh)k@Y&?lHNuq9KHe{-!dOIp^fFa}&F>gA@FzFTnzG$`#J2 zYC{S3a*+-f>-f45b5HCwVj5XUFc#-vBBD5T7~)D#nyb+?uuW6D zHi-r*t(}^#3CFOrQ*W73RNCRL&Ph9e42OeYB`{4sn8r!&hp+j^Z0cPW&8M6N?s96p zwd}-QxtjQ2S>m)V(X)F%(~O$dx8*E=)Ih=RyzQr;0`pdfqj_y+Pcdp`#!oi?D_yxGO z$`ac&vta<+o3*2K(aGwc>{VP@|e$9xD%ofZ|)BH4( zt(|+vOwIR%Ddd7AA0^>97UPf`oq=VN6Xw|pn{TKJ%CX_+CgtdZB(upw73Fw5QViv| zA4yV<)p$mfBQO7%#m~!0FufZN({4;*8N=4~#3a+_&Cz@p#VY5G(tN97t>*XEyrp5* z`B~}~?B4k^G%xE|_5A*EdN{J_=w|`{`Xr0Fw~Of+ER2W|yAerY#I84=26;*D|5C%8 z_jb^JU?RI9X2GD8jFYG$A9Tq1+0HqIaSq>}XlK+9Tz8U9ThKZCN3f$qo&h_!(J?35 zEJZc)Pl!X|4xCCB(HvK_6o}q{r3YEW{SEA$1tYY3GN1t1B~KEIyDx4?KdL`x9Arne zZ>2g~Osr-hFH%YsXeDY^8bNK32BS+)=_| zUML-QcoGufy*P;fFMhSKt+&I%)_1>;?OWI<=~a-xw;yo}-(wr?l+QWjl5p{EH8UiZM`)xE&kJi4A5szR^a-V{L#KDiej ziaOYAJ|uu*2_9S~3li<ZjR2C51I|3O6J{(xjaNY3NuX>1 z1t0(x*VKA9VHJV8Oh8ihp8`%#f`ipXW@L&2r#->BcH{rRY5j0BKpnO|u{fb$BLpTQ z2m;27NbG?1NMKGN&EG_OIvP1ZsOZARUT7PFv+v}`Y~`x<`CCU@nwPr`&Pxr5*jel1(;a7TpczZzz_)1y&r%0+TxLFreBik{okE1rbJx8X)=rD zM)|UQoOVfCz7Y{JbXxB;7umLNBAAc9Om1ITGV!+U2T`3bLjk!yA*12(q!-vJ$5W;t zY&`w}>BEn8klW-Q%5%v3g)6lVy*b_(RjWLjU&r}nI0)#M0kyk!tj-?rs=aP$;oTie0p&2;1&B;WoY@2-C zAvYo#Mv{a4B3PRG9wN!b+d*|o_aOmNXvf_9;qwv)QxL8D!p6fNLP=NLG!{B#jw4?{5W8Txfdif9LI=EnP*z4D z$2oJ&CUUTfWrc%;fngSMchDq-S**vbNq?X9@uYhn!1RTUd<#&NYs-_AsOFB@4%(}PAR{hrIv_@$*Fgse%Jhr^?3MRoAd)40 z?>%6JBYW|-PdfGkx8i7m!_wJBPlk6;Dg}{Sm|=Bo(PWI-G(8;fVy` z`!SD8b-oqRIzuTWr%GavFMGAu4u~%Zjf$`_^?j)5N8&^AvJ_2#L}3dQO8)zG!FHgY zrGgcFk+ewG_L>b+)%*2b#Z!`vGsa@nUq}{X8cJyJm__W;;Yp=A^6Rx!5%v0`o>Q(A zRWB7btLlleR8%=|T8rrpcUetS0tbRtJCc*!>)lSh7nU_5dymHU*6*-j#1rdZ2-ozC9n9V$=w2fTY6q*yH+G+eThy7o7~ZZ zTjH1~T(d4Fbcs%xKSi+%Hh+x6-+^#(grm(*Jd~o&X6+x!Fvf>#356EbQPY6|I>e$p z&&EBJI$ptPU5sHDbZ+0<2!(5!<4h=qYl8F122kMO2#4SVJCUwHztIj~S40;@o7u*% zl5{4q5u9GdPCPUsZW`PSg7J85d)DJ&>yTgJR0zyU#9@gaE(iH~usBU2GU2* zgoj>0(u zhQPpSSH1*W(TNBiWffmVkdw`KQ|(EV^YcIu92lT4zxD+FTIxdgA$kWVx2tln2KnaB z5Y7!)ktx{a=I|#0n{*W3@-n35o1tM6d+?Do)1#uXXy!Nm6B$0fS>5~;_Rb?+y=s)Z zqb(I7i7&YWLmh(6ZA5`q8f*Ol@LmFVkw0yY&rc@o~wuob4FFz z*2Uvw@t72@ET?tK8`O7)3jz=w9g?@o zO|p2Qc`CHI2wt33MUo6U!X%_HPr`Pa);?UJ)@CPfGWH4xK)l8ZSG7p|4?zrgA@Q&p z!Tr?n+9XoSUQ#r9l00PWbPyaNZ>3KHA)*h63)~8H5ZxBBWXgQ66pv6|H0Z72smyd@E@w` z*SrkA}drj@pBfB42{$Py2B?@6ao^~)MXVbU>`ayW`e-pI>#+gdd zI4W8zCS-(;s<*Dz_5cVhml5&RcnEWY+p!&_eY2%v&9ym87o8TT@noXe!Klfww&IPG zB>6mMzW^uAAkSzD>0__3fot--FJPRIz{%D5nV2L5r3PGIB5y*PI|KQrkp{!#usty8 z*mknRVSXO;=YQ$XKgK5kHQy?e%8e6A3fjhD<%}vYI_cY6djY;UoAy0wcji1vj_y*3 zck+f$@VD}u?#gbj+S4X%Ttx=1Tq_?58y`jzAY!Q+Osom72#YQ0w#5&Rp$C zfb+D4z2mSPl>Ekl$O_KqvoZGs$8tE>NdRSOzSL>QF{fC*Mn16(qKQ-x6Dl6O6b^5v zlxP@{7-8d3!rQM6PsZlen5$%dN9NW63q@$up@8Bs>L#;|zVzWU4a9JP^nZ|^3iQ8Q z!UODKLXBBeWIYD$nQL*kjyOAZ52ij4Azh^l9hD7yiGelvQZbgnH~`P!KqT3Nfz;$iXeU_H2ZWiAEmSNY1Ou7^zt@|+pESL!0r!cQ zH&OB@1&oQFPFt3RW<(f3CrxRx8?m@87o6DH$;q&q3?&Ny0-KSi^2jb71Dp4Bs?xzUY8+ z&2NFI3L9@cPq=8;0*)lN04MBL`;xLOs zFG@J+p)J_~-XFvUtU(GaY*?HWf{U{`B;dMarZV$9C@=XCB;81ChJ*7k2pIFmP0uxNM%XI|C#N#=YZ-d?ds~{?lj0jIOcnCWPTfCI3 z#(I;r{~f~KD;sBNrButCL8~C0)+o*{r_w4BTMuv~(C}cd$;pL+^qTRkk3Yd%gHw&j zN@~&w=@$nRdG_)w;rZUnm%_bHc|#sn37#^YEzoAGVk%>n_T&m9iO1nF|jUPopwl7l|@W(t@Hr+o<9WJb%Om=x-;q|Tiv z`G(YkW@Ma9vfpZhCcTv=nP@`GHaLM=DV7O;O-mT&fmwxD#rzyhMU^;2-@x8p*WP;$ zx@sqhHEaY{!}AP(q7WEPxz3qYIbvP3&Q_*&gezgeBChwG8unl5VbAfh6uyO8(*8TN zN1({Zpj+yu)ea#r*CTsH`;HaCPwpO(_|HxM6^bE7gsAT8j(B{GM^%oq!8}_)((oYM zy22~OeOHBu58jVnnCJQKDe7^k>d_nGwGB2AB-kP}mT!#4+ilNhv`!pJ!^CORlz2XL zB>U<4Y}O!u+1}YgNGJpo=_Gkg8Tx7nt01S!TCkJryC%meuMs8#(~rLjbwj4e=oTz3 zkZGz1<({NV1$hmRQ`7kPmxP zPmgavC78oQuqxe2Shjc2y2Bu2eGkP`AoBX2c<);lC#Kh=UjmdzM)9kPr7#eSRb7AL?> z5`QB9XW(^NzmIC%CVwL80i9IBUXWia8WQ#|p(e2Z-we1zKzW7y42S8ce;%+R((*dt%W1OYHXj+OdF297B=FMjjt#Bbh0y0~IPkEvV$v>ydBL6iu<} zi1!N^e;!2#4sq)h4^5k}_KJgTVO_1yjl!q`akcPc#R4CQOGPor=^w#x5(g5Gpi1)t ziC-BVNId0WZJtcgkG|dhGsXr!+1b$w1|sIa3(Z-NA4EC@x*-d43#T-e!(n3s01)?l z8PfAw@OO>46sklv(Y-x7X4Aj)CVS~goA>r^T)xKVfQ8Y}(-O<@@xDMW8ooxeKZlQ| z7lHKUC?mi)2byXE%P)r#rGv{`u8xQ@NNomZ)GauqGr&@aM7vIETJ#eg(01<2d`}JQ zw(Fu8N+u2K~@d#IS_JBW!%(2^M^+^WcHv@*-S^BvAFwp-R|T^aL#nPZA#? zHnqpX#$6l1R<-;Q*xO{(M$A)Y|5s11<%Eqancop5N#;bSoN1Ym7xL(M?m_FaS=jl^ zg29NO9RDm+ur-84PKsxelshfiGxBy_hf-IZQta=xMXrg%HITcc}e8Sqi`KDIrJR4D`1~uS5Ymjb9tXFFuoOU1LfuW6k1@g9w)mhk^c;I6&LR# z-;y;Jd>-@{x7h|^S421XPQz!43#JwB$#4M_%&*BW=rIg?^}MoGcXF9bFvKH+UI?po zomRYj0e}d_3Fm=)(92^;DG>v=6kZuQD)fOVEE>1F&s)d7eu!bC@*h%izIiqUH zRcfvDobo#Tt^%9z@G8Jr0}YSuxd5z$iM!rH)6jKyA=LYaJmG4iLvWIBl3j>ks(qx(3b zK6m&gS7RFT0rr2Mk6?^JC*kq|6jTfdj~nag+>vz(gu&=SkR>bSX8^2-C{Wr7iHOmzjPA=thPWgK{e)Dqr zv19+WdEbKi#<=MaAjL)g=Fdf(M=d`(NEyR1jKP(4b2RRzFj|OI;XrGCr|qgrO#4f?m$nLP5wF{MRN&Vki$2IZxx*xXpV-%n{AT(vEx99QSqTg z&a8p#`Dct?!NTRi2lswy2jx<*locvW|k&pO?bmyH&4WftkK)3mwO1 zBeC6;dI66LXXkTRXtl6%?(&L#CR|^(&w@7)ZJ)a$&Xb&%v(hY)%EGlU-}A3y1UGQ` zJ2Z$Jx(YRz`ZpDn#SlvTn^$)DO9GRgrxA33s~*g}1N%7>E9mS0%dpw-an16PnX-{YpM~c(0qJqtVHM~0 z^0ZlJQ)BOG8r;j%A}{A5jXMzo!%~rC?@^vE#sxOL+Y-*pS+&Ux*U$m}5(VxC5L`&M z{vbc*Tucy21wHuHAxE1XIQrH>c1V@KM>(yR-Q68oM~RPNf4zd%HgWTguZ3kBYF)f) zlS%U+Q}jep*mw>)9_S^6jb&>EdI1E+A_D(;l67!E7os9U5AeYW!Y7Y- znu0ROJw*it2wGmC;>9AW&JH#1-L5Rxyf}{$mueBVJc>Bn6yerTF3$x)(PR4@EN+F_ zn_f1tveHg0^QKpj`6AqdkSXFGxZzQ`6UD`>=ryPHwp>VB;sljGh7y3j6O%MQuYKY>EGgfai$MHt7gUf7#SR)^8hx z8m^aTwVg;cLI4!0QGA%~dbyK91uqL6a2OM%By0H>U=To;{NrpAe^@L64^ zqp5ks4OmeKkWoGqLK+Gm3W3K4Y9nK> zY@3a^n*HqJtI1vub`&VcLnsu$p$ejwB$?58alQ#2#F0-C(1soYNs%z|FLM9V1QBki z{+CvzMZoOO4L72pu)U$Qu~KBVbe zSGGPm8A%!kEIY~fi`r8Y8eussh8`HL#tF@4M6{TEjVa4p6+2^-;{(G@p|-YLc~fBc zX#lDyD~TmQ(6FG@(Iq4@i@Zc{tdBUHdWx@2U_zATu~aM%NK3_fc2b0q6EwhQcBUxj zXL)(+5Vs}l$Xfn1AY+sIEtCSJayG(46_=mQninnZ>}&@k?a0Kad4f=DzK!0U*rHN;CrjwpQg#DU3#6LhN~US(*bMsYmK;^AP0 zL1n|%yCc3BafG))A95o(ExPcH=t^0R2v`7go(#Kzl!bCYmp5zXj4I{!{}CAcgoh-T zQU6W8X)m19*m2(~hY#SN8DLhp;fj)h zDKnxhCJF*Di8!-svNpFX`}obyn#ObNn>RDP|LFicambggAbU!9>RU+uM`?V-&Dn6r z3MsS$&PNr$OhOvAHi#&8u;^B~{V6Vf!Kbo;+!Vz_Jn;6YJWe=KSJ1Nc>&K%2bm>9; z1@se4RH(IksnoCUi3iW5nCF1L57LM}_&~h_0y@kG;BU3I8w%AC7rgL;bb}ijn+dp& z)C2iNJPYGNF#^* z59oripha%_gYXC$N`C`HuwL-$Um*`)MC!TPg=j|vz)l2>ZM$g2I0I>Uj>;dST~T|n z5N$ar?x8vCg?CKq7`FSJPU;)%=XcDDcfrR-_@uu>3E-3d3?+b1x{QP~>!jp=PFPQY z$#FvBj|mLUGHkOaHO}{Iq`;jTDQlnSVlaiK0TgKgTM_bC93Vq>%vwvu&zOZX8e4Am z{)I&L^t&l{%soXfz-Wf8NAgNmYEnGyvE4%dkfh*g!?x)0ovSHQ5S9x2=G`9N`g)8( zgp!I##o#i*?Q5>}2c?&r0&BjsLM=A7TpnjDe+^S>GrY8WiPm?mho`sYa42idwM|EH zKx0~S?TwQv)w0wz*FL1@PiwAmXcG6gibnB7`F=puM3=FTkmHfKN;f62CK;Ql{HcgS zZB#qtV>ZLTc3Z-ce$$%wyFJox#S#np4Rww5iKpl@Inrlhq|eq$pKRzBd-Q7$!^MB- z=`?TH7(g=Laz)v98%kcrMB2uRM*GXa;NLssr(2QTV7F`SDd)luAbNg2N6!^bleFe}bLh@w)AJ5%d*77q?d~ zd+YspZvu}!(iJFLmhfyHDa!yZ=4pCy;OE;yMUO^caizC_Uo@E?+1t?j8lVh9fXpLr$V+juVG@ zma~G762?fK59O6Th-!QJD>(T=xt_bxPX4V%)r0WCi$9PLCGi;q4xTPWpUc0gnu63kA7k}|eqir?oO);1D(G5XhB`2U>Vv<+M|JC@!g2zFBYU0{iQ&N|byMzL zx|O)n428?3c!=?p=4`cFyOX%E>ClK3-J1|wE}K&&II12Rz&Yk_7vRCz*?+bjLr z9^Kf=9X&Khi`eTs2DhxmdNPa~QrUxD*kO);>p`mK?jgyaqr*T~*0FrKCZQ|)PkDFs z<7`iP)})?A#CjZlR)m!yTqhQc8#Zo3X+&L_3|ngvJ97%bJQ`0-vGY_;UZ{`nT9oGw zO6x*hM3GcuKa~lA3jWsKlg09OrmK6hnLB%QNjO1P3RvwWFcp|Sj{g8-i0?z)57o*n z<)2{h>}+rNp0t6*sV>I|q49MiC_WiZEHnm~c*}THP)hPp@{3Y3MkxUk>VHy7a+Q(=D7oxain=L9MJVD*iBTz8fs&I- zNt7s&i@^mbJfsxH$6f#^db zBKNYi15-)=GNitpFNsf~j=D;B;Bf&WmeZWVJuL+gc!b4!UfJNohK`(UvzI^Z>|KM_ zQeaGu{1qqTCg9P^N0Be$3&acgASi{qztfalHiSoD(se$Dva+0qEPwnPkw(~>iu;tb zh-g_(>402_asW?J0BllnWMbmoK{d|U0R0Bo4B2dGGUP5QIdY6pU#BT6%g-ar%?f<_ z(kf3@(pxAUr=%$|iK|4Kd>J_W5<{J-oM(RhCG|pI&63N+v|9U_l2?nCqEps(dmiDhsp2Zn3Dj{ULAY*+|K zigF$pW5H!u*88(Wje7zc^I1px`3dMG3#|z?Xu!oaQT6p$zwP*duW5uLl%REu>bvhy z&sPVDEWwu?&_?+9|UYfL!n|J z`^Pk_$t8FmEnf(=QM@WyM1$t5BJM5PdAdxJWgqYEVHp+a>Uw6a7^|_wGr3}p<|rZy zD|$#{1$r_a2Jwe~7n32>HTXZ#m#gx$;deBvG55Ntahhr;G%MGA&F-n})aR$8;&nXu z;Im@Xk+Kf(gG!ljDj-{_WL3maA0K5OS9TnH28X*+?x+R|I2NZCZK-2De^^v)&6m*A z=jAHeERI8D17s7`(DJEAS=-&2@x4$1#x=^*urqY7VWW3<8k((qT{oc3SVQxFoc5(j z@|x-BSm^zq#9;UGFTWz_%E>f=Xb%wQi`kpI*Jw8CS>$F2{!^hy5x`#OO`{>gzIYQ8jtmBL&@D31>LHF;k-LY z3({rXV<KtL)Jdfm#UPSgfLqq#%m0d8`3M6H`mXT28uk&$1VU3CQs?93RSx8QpZD zvaP6F;qHsr$Lc6{`tuIiM7vN=RDTxLL)(#f5($uSM;-<*B7{Yh=I>)3{e%e3_AN4D z8`u;lNOvbUU{pKOP#e0s7-@`s6&_qgf(mLp5zA4ksRZ*VT!Xz`DG=G-MWd>?#YXU4 z0Mw4hgb^FizKsOnyn_ed4$Vt&5GKEeF1twvYK<9;$fkPse07Fx4YiPiz+th{wg`_M zREy7y0JzgBmzbYN30>=x*PAyXDIX=DSsqSr*~Z$84(rXuC=|E#urI^i*13>KeM#Kx z<8Nq~tEQ_)JC|LmP4YIUz`+2zf-i|E@Cnku{MqH`c+(#W<_M3wbrIDJh+@F<;h8NZi9IOV49{x+(I2sfV2vrAqt=Y z1gPcz1@y0Ga0cB&mr&!-0HQr$j71aSY`~~4u1E87AvA!yl{0X zmr!@2y10b;CKAde)QV+*))qMNnE(ThXnqMbgb@%V-)yQbbQRPx8@4BfZK*ccCJ87s zw<9POFxv6hkwCyMlS~3-{{QE;?Rs-DTHK!7A@{IPYx`U}|`t|?CcX{1Du zCi?Rs&ATdckGg3ke;qb%1(qQ#e=W5MSs|t9h!AJIL$89}LBBfgV@nbz%+Hn{TOnDnwIIXxW&{4FV;l1zR2O?+d`>Cww7ipUCI5y^s&Z#{J8otoz z*AkYv+ek|a)qGyn{qbL&=jWJEd9}O8!Yj z*VJw|tRcuq6<=3F!kRoOo@ClD(XlAXF)xUWvCW`w-ar+CE%fnA*{Ag#y}1~18}bMY2Y3?$L;gVt%*BugDS;jJkOCwm-^=D=bfL<}bp#bm&!eFD6~c*iV-E(A7mrmeD)dE{9k9QZDo;l{ zqVj39Nh15b_?`=zWa2+TaHmVYLRP;o*8An})CE4Kr656Aw^9c31IS6(iW7~;pn$0V z6#gjslMCWW>{mngMb7~K;e(;pq5$`zew_}bewYSRD+aS$f~KH>IQ;oK0`We#69^~p zm*U%pUZO5_fw5712|84|uHOn8;^s$!7k3VhNnqVr$np)6jQ>A?4lZfoxu?lef?Qe2 z^{=blW93S76vBYCS1Kz!tqkSg$1aHuYeEC*x>PZ)PeE&-nNGGP9O9^+p=9~bAU?&{ z0_q4|Sa^v?B>Qw=9Rq&_EH8PRA6(vEQ{eB(;O#<(d4#&e8 z=qFZT4t*=4L@*+7ped8&B*MRAGyILs@oz2g*M)JT#(;}BJ0*DvBm*K`(pYtDZP0slQ~7gB`q0fw~YxvIC?N6dD5xxkt*@tVeXd zIrwm_ycC>f!6&Z3ID2^_$Sl`Vummrn4XbZs~H#fw;<6RD5?Z4)zMa7k{ucI|?AN00Mh@uOKtFNiDEV!b`f# z7^V0+=sNxT>fj*^mOgdfK3dk=64=j&I(yTwjpbDsyYNOPQm!ZHFXg7ULfX??I3E2& ze#4HK%;JAH)jW>^9;MVgjWq7@Vo)AQ4&iQ;0h$HoV#7@^YG7i zEvOG2_P!nm;Ex_&wBVVJ&=-iB*7p{@#KrQVoiGWqHbcoH+_W+qVt)$F4AhP9da?&Q zYrP7uc@oW=ugkA(!G3~3bXTe}8@7lV^_$W+CL;}dEWvBJ;E2RgQtY0gBnR!pRsY^d zT%u#SA_nPLvbXVds> zfq5;60Vq-}nF1f3!1Q;Ae)iaL@jgCF3HVJq%LOvJ~C zYC8&t)1BhT#4bB@HVEm}y=~S@D|^U}I0V#`o`8v1PTn$TO(BrTpU0EPr$FZ{-~)UY z3wMXC4NHdRmX z++?68Tz^o=%8?+#2@0@O!Eg1y;z4JECFXdPU^6Eo0D}auJ#EsATzebpe*iU@1Ib2C z?K7^@pWNT$e`nAb{%K}8M`t)l%et&LmdzUz=-103!|=K3uwGqmGGw4DGBXjQ88$vR ziDpE(L72upZ&J zpVXU>2~MZ^I23Zo`y7V%P6GPqK))==p0M%qMCxR9cf>1#Q=Qgd+#L)VZ1LCWW{MQu zClJ}H)ajvg@3LNWXCOG!m33ePi$B)B3%&`sU(|a@sn@d!&8zNCPJ}^b9l-xn!VJf{ zOiOn}orFQQ)TrEp6phSEqn|?^@Df8?j=k4WNG$O(Ch}4c=At9(CcI$FAkR=iq0t$5 zWJ)W%Kd^U><=W@bD6PLC${_0($@PwNk5p>*OuO1)Z?FeEb1dRAXF?X8GG36`Q`Sgh)d>!K(7dYb% zVh{W|j4xGrcEQ^Y@k`$JmYc(2JIyr2I(=|ivBu$-IPQWd_>!7x?PYC3IG;J8q$;GW z^DD z6y%T3RL(50Hk$r5b89-`y$JMwYbawUx@w$z*v=E>nzB7?`L_quXV|FkdYEQ`i1@sW z=b$}j3JkNi(JPG}3K!u!vx0eS<9D4jwR_md-!0Q0!pG$4t5jsk_hUIHCwl)`39{k0 z0l%m5dk()>@OvA-5AiFYS5 z#BVEpyYbtP-#7T3!S6DDH}P9prLwAgRfs^sZzF!2@Y{^vtN6Wx-$(fE#BVo#b@&~` z?`!-{;`ehE8+po<*%w~khy`5pZz$A?P$9|uvxqrfdf6c#BpqVnd){M@om$}?aE?R` z`7CwPoEe3<5Q?yA{Fg%`P zqWC&6&MC0psgzO=<2=nhL0a=WJ_xQ_-b)G$H%Qjq%W;ZZfsc(h@C6p2OHNU`n?R=a zel>2wv=EL_tmQBGTd*?edyBBeZuv&5$v1jMRLB2NprQ|UW-8c9be3!?MUYuW~})UV6@b zr<`9zg*{McZ8SViYP>n*F@FI~nv|6jwFbFgs`A~!3;}66U{;x8GVS{9~ zv~liS3zAvCVBSC4d;9f`5QxsT>Gtz~(BhWo_~DOST8DrwN)K zZ!-JOom*6e2JoN1XN!JL&e;xTP=ylgIjc_5Hy842ZpTC;q$-IbRT@83%$^d|1f2t} z8vgzptn%j!jr)7{!_WQf@T5+{+4_E7ikkS(!>*#^HgM8+gB=()>PEu!KNgCz$*0f@ zHsatN9)p_54HMzV-FV{%Z04CHe6eWRnFqZ1Z~mY~u>FRcb;x2%IQ-d<=s6IbVcQM^ zLG^F+l(qX%BSJGI`Uu@`QWO->lV2a43=5d_KDeUYL)yS9*f@b1YU`=hd&u62m7=cL zMvr8;FR~mhNV#WyX-8TclKr;6dS-Od={9lx`Tx(8(Uz*@GXuud_N4s z|HXyDM^{|2AIwp^&0KqkW&p>m(RSKLU?Mtj{T3?2wYArWL#agZbmWyIVBg*_Hl!CI zasK4X#~Bkg7Uy$tlHJYs`%N%W2qRLOgcjnod8*Yo119Iv0!TaHGQLs8&Tz^5&s(*4 z(gtB=f-ZEiUWpL89lbI|3M@1qhpnk1Q6y_GoW_G}&HN;3&Se)xP~*m$3-?;`FCrRl ze>Q-f9+oc$T~XZW&p+jq&p7>y-g8v`0aEm<7%i84f4Umya-(H?Lnaz+3mf-hti-Ii z7vRr-jX(bi(E$I;S-$0j-9O`Ln|#7QYio`2F?Fi{P@AEF2+*qv92 z)PQz&ox%1QEt4{**=~pMfoc$8wIVtdJlY%h+2kW$m%P3Pct9loIwlZ($(}Pkd#F2> zLPa6BZ)#WmLgN21j8!#8E;&mz@zvS)oLM!)4O^WJLq{5ReUclGjfgE=lP_PiXPtA+ z`O0NIXn1@D^cCVA5qojOnN>Ruu(1m9smm{52n}CnR}V#?u=S{S<+=RQ3#*Ov&IKDQ z3eLr^`A3KV!Jw&WK>KL#a2TgCr>SqH`N*>AmxiM8N}SW@5McS4jZR1= z)!2MtT*`EsC0sTPSK#2zjt|98i337#a2QIy#%OHRQeNbJ51&7hqOJzdpvgCdMim&VmgZDKlNuiX3Dkt24!s?qUi_=R25|Iw0HL{oN%;0U9_SIFHy2}- zj@(ND*pBaotpjZMSUV zH#R0Pbo1o{`0Plg7J$KuP#z|}iab=f zxn?LiEc$hAqmXGQjhM6=ur-8@|4)109v4-${=N2a8*a|1pj<=;MH|fv8rpcPLD2?7 zn-p_0D@Y(L62hUd<8km-C|VTd=A5kXk`P#jI+b)EZ$)NC{p>_(HFh0C3(aGwCGYpy z>)DE&-rMK%zJI;%=JW7f-)BARy4PN}eVOkjYp0B?w!$h6d(rlaudlrI>(qd+(Q5I0 zP=;ycNyLih(bK|8($UrKOx-Zm6RE|OhlJ9mZJ4TL$QUz|(mJCbyA&k_#B((nifQEw zaH6qw?n%SGxE)c`18Z~*_~3!T;Kz!&4aWj8kwxpq#CrJ%Jg|;E@M$ADJJ$tX-MM>4 z#rkh$Q#y$1^h_yFLt9$78=nwd=Bv2%$<%<>wv1`mzgzRk@+oK_zs#)IGqd8;)K%YK zo4)H@@T?8}P9PmIGvLeAb%D0j&RuAlpJ^A6_OczK`}~@8t;sC=3QaiR3*<1(cIzX! zj_qyf>q5|=-xz+WL3=v)z(C6ct}od%$}-v~2ioR7(slsv@uCjaPE#o~o!B-bxhOul z@8IN-59R*t6n^DVJ!R^NZwaH@o!OV3?oM=27qThIPA6`~Uh2BKz7f+IZ8l#@0I{|` zSLHns6?uFx%rRT62r?WIRYy+@2=JZ~RUy9&sv7e14OiVgk%nn^FYGfUE7t{1+*6FX z=D&-dY%_L7kD7%1Vt$J~v-L^#C`5x?gk4uv_j7WjKS_`E!WS~uH&0TmYp-%n_|q86 zDaI(I_8&3+G7T~ItNQwv*vRHVdaPf4E~hLEmL8C&qeE`G$0w#Q_iIMFyKwc2s#QI zZ@8n(Y7gnL<8jBui2YZ~wAxJ5wA};*Nkyx}_UZ@zeh7=FxZ?f2rH%i}OToMkB3|0< zUx3$euxQJ|U?x9qNIU-YjVD~NUB@)-O;}Hs_HuH@!lQUU8DGXSt$vz1Z!81{`2T@H z2y5YH0I!X1m1!JX1{*9$FxHLwSu5zwisR|K{y@nmVRVZ)HpTR|`|S7)(>o_A_lM#U z=HFVd&G`>h!daWe-GkmXK7fb)4gL+`9$G~pZ@2pVV=<6X2EwVqZV37pF18sJf&MAB z1syiihJT|D{O@8WqCZ(O{%_jeTpyS=bTJ(-zc2*t6Pgz9M{bzgKBFSzthF=x3!6-$ z4v}e(+pj?S!hYc(zFMi69vX?1@hi($BRee_)V2I>T18J$RFoXT@3jV-b~fkXX@39F zFpL*FXSV0z?b>m8Aa`xap}bXR!%E^`i=<5MhPUP-|301X!W$o;gdN_1HLdc(r0vDd z=#Fu8b+>qqH9|41;vhyrq=~iQA^*>(J3Dbjiwc+VmGZRbDhXMt*zAIw4lSmyU`VpU49EJa^OVgFoM3h8t;E%tA45Y@6wz! zt{mHq-njz5;~N6iu~+^;`Y7EmZG5WFq;=Tr?x3=3qjkJ+v`cz7Mj|pT>YNSn3%qSCMMvUG%?|Bj4SSY z9G->e(be4v;;4wAhgwPuZJD?|B5$YQ`T5A}rQccq3v_P^H%S6JwF(LvqX*J@xGI#;rAb#Ib5xCp*YFe{xmCxSR%l|bpD8u{RE48GsT;Ol| z+R-J_)WYJww;GSKO;sk-z;Zvf{4jHn&-dRvSd^iSV{KC9dm+k$yN>z?fs?hH;S`u^ z0u!>p`{OFG*u|?MLaace#dUSv$F%Vhkhius)eL>4Lpz`7rt#6T%erVs#RS|@)t}lq zMPDzY-G3An<-dxO1un^(jPKcqLV1tLwYzb|F z+=*eC*;XVw1S5adxr73VmaMw zGp)PMaHe%;yf^)~*7U07zXcD$g^DLi$I&ZwRD!=z306_fme2=$@#T7Y2Kf1^S38E! z$A(?+4XN+o6|uAp>3Bcvoix*R@27X}PVd~aVFtZPmRhmPblv_dca?9mFU zu66>bX-!W39yM4pj;@h7|BcU3VQ9D1|AVJ$(%D&&XP&;Osqj>(XNMX}pQze>_AXC3 zoe(Ubu=)x*{t?{T)|u6@@TnU3;1|L(DxRkf8T)8yYp3C4&~};;8)?{k)Hc$tLwm>M zx-Asn7*EAkC&7HWy&C6E?z*968L_5W zvmG9EH*ziP=sxr#+HLjoipPP$0w1`;(^Kb@6c5GZxlfucw~u>3 znk@^RZ|XYJ1Y>dN1czdJa1vzdw9uzn>1}db#e1aBw*u~HmEp%M!x|!l) z@C#_5dT^iCT92KEs>{wB{qDL&yI({bZ*O2Lh4%;d!wzpI@cy8-J%}s)M(lO%cf@P8&bI5){@}zIBux8*%V_%xYowbI-FqSY;N*%Ysq(c)EiP^jzDJvb zvco+hQ7%V zfTi#ZcQ-W;uOZ-zPKZYY(Ob~*3s%cYQ;c<$xAf!D`FTbytGU28&@ZE;?D z{BsViC$PPFkY01AY0||K+>ET@iW>7DyL|7FCRtR>MSGoz&x|6x7ScZz&r;y$#I()R z!}xjk4UUTsh=%%qL}f}Z{6ZIgGXB#3-G}h0c(*N7Th>wEiD<2~l~-v)&Nt-RQg5%i ztEOMo3xD)BJo#wVoMKunfq-|Q|QvaLmKPB}c zrkz+%v;{R$r;BbMgU!V;+(Kgpx}0eL8sv<-oVW+Hxo+Ey7$H}E|Wzts(r8;W7YMvSBB@CK0uU?RSU84j>+`}%-d-3LU-~p zqVkj(0}rhYPz*gM{r$gV=;NF`x)fWS+@13?-`c1hfl)iePrv@%cGQ3CA#GFa1HTm& zL%T&E_-}#=Gx=s7-DqBZQ!1rmM=zPWAJrh=Z^RAwPw-PPSNw?naSbl&$=6{mgU3y= zIGJghMz_IJH_W;VpUR$gF0JCzl+SEzl$m!_4^!;w0n)wF6G9Hv*>(kK3$hMSJ2sRwZjPfKClt|afIGWlhg zirsj*W0xYTT{|_<^y(hM;MBFfj|Fsg z_UYWPQlQo*cVdLQ?;70Wz<|DFoZ8>0B+iSX+#A;R`R$9Dm@Uw^<@UApg3}+O()k&N zd}+I%7|@exEt-=;ZDN7;o1%7_F>13#oB`Zd%QN9hvaFiC%-5t-%c-wn#ZDMBVWB1UHCVQLbJvD3d)aG@Av{OEonA1i$Dn*TBwUT8<1X`7|ZZbZ*3X`2K48 z;orwjV!@DCS<)ZTMcxFnw2GidkX!#xMqHQ<(}2}D1+pGp(zk?s50LM$ygc3CF)?T; zyzx=S$caH_avgMp2VK2J#f#v>Jn>NMJNLt{`_3L7@iijccXrf>&w!@YsTltEef-M_ zX!e;N{1y!aHqqf^e}2K>D#Ej)#>OMFrqvHi-^f3-7!D@{k?+wZzbgBV9(sT8(X-2& z_kDhN@C~pR=S{d;#UK?{Q72@3k_ z&AaxUHz)j!Y|ooVWCQnpbMm=_Qg)0m!GX&1Y1-ME+07syzt+6>o1?ECKm?J?D2E9A zGH~xV?+<9W)J~>6%^n$?0m`wqK&`wrh6`L9)o?eNWm zzasqh<{*uKdvn6utJKCIC1KDnq;Fdg{UhPWOFl{2ckFQV3?gT(yZ3#3Zp7l%YCE#m z#)UFNMe1Q5e zY+OIF2OH0FDJAdqR79@P{LcPyKOX5_J5W7gR8q!Ig|0Jt>_CiUtyq!Y)fufIqE#Ki zCAVX7I=D-Sp|Fv280_M_xk{ZMs`N{Inw1vxV7Q^$j2s;PfNBPhNPXHF{a&J~hALw{ zn{eZ#k{%uGc9X}6_0fOapl}Ie$Q^;lsn*q8v>{=?C{Sevx$4$ZzD)Lx#{ke z-J;E+>N}&)z*W%-zk6RGzt1pr`u1N!EeluTqarZwf4D);T(lV;W*X|wa3!}-QV1f~ zR@Fo9r3q&V{rb>5>X-;+qH=?}I6{e2Qq;8(O1u)IJ{zGV#-BlZT=nfA_A~F9@gf?2 zI6PuWZVZBa~5*?Qolh7Gd@lbkEyrLZmWaU?9R&%)Fg8_U$yia^gD2m!;`P ziR{?Q!Guq}Em9dV33ml(EsuxT>{zfA(v%%p%aS()%m$=!e_>}QJ^F!PC&1JX(cyt2 zEi#AtUZgVk#z3@tx_f1R-HQpGe;TOt#-#Qa8i}tTifOy`0(n=H5{f@Xao)YKlz5T3bM|lTNHP)GN^VjtHRUzayN_Qx^1Eo8R+y?0mC%3wymr^(l1)xbUJ(3;0A@u@1 z#2w@R3OlFo30z*HE!_XHMiQy;+GLmae*BZ^U5eIK-(KsVsgCKbBq=@AdA*eZqetw9 zseAC5U3Ry{fATyUc;dT3F{Gra4SwC-e*{XJgSQ!p9aL)(Y}C_GBC_y3xR5cSz2(?b zP-uDcVnp(hsP3b#h_A@Q_Y*PLxt>n4hTr9;FO1ygk0^_BRr$u81+I&S)h| zUDii=Pz~;@3^%OntETi-rUd*euv1;ySBW>2RqWi@R~exs`u-_IfNAA7Xe{X~I)nvt zw?5<$G2;HnGeMj8s^7&ZzZtw0JHL!oMkT=Ww*h&e&>pQO0{CR z>Vg{IA4w&zSJV3|k0gG8Stla?5?5o!#GrS3?Z`zxai>z`ML4N#UC ziq@;o3{c)SJicDN-J;}#9cw@U*fqVWerQov8=BUua}pK&(BFo2KGf#1q#p7aDsbA? zIu-?P$6HV|_x}lBgTyWE3jFZ$eAO~g8E4oydgCA^cEDdo<4Rxa%EC@4mQ_Ya#mzSV zol=+YziqT?8>HAn%xQQAv+rotGe}u!slp9dZGE@afr#;q80_@=my>cWey1}19yKvZ z8DP$Yf`2g)=gEGndOk@RY^X?A?@3bn20HwkhN+VWV@kAZq_##4mp@{AEm)=h#Zg)c z$quC8-zEtj40TxjDoDkK7L*phJ4xsNR@$ATG9nv4`I{*?)XBIMFKO>UApUj5d2rIN zD_%4)%i6i>eW)zA9up;M_7zIZ)jzmVm0jx&75DTVGIEO^xvW-vg9FP%3jCs5eQSu) zH@^C^z^|cqq$>pm9=G}n3~tH0%%JSAMR?~@J~E#HA1Xk%G-l$|;H49a<6PtAIa^bW z==B^#y0z@j2*Kkkm$F|m(<#HYKi*ZX?dM95JxjWJ;N(&bA+f(Ss(Y?b#%{DKPR|1k zXj3?9o|ibGPU39Fe8&42*E2rN_%dTN<2Q_F7<)Y@<4a~tV{}RM2sbMpX57a3I^!Y6 zpBOJNn(Jl6k8#GwFrUuoV$5T_kMTjqjT(A{c!3q~GJeGv%r(=C(ZV>A(Z)EP(ZzTd z5DH|@dM*2#^4>YgnbyTjAIzDVVuF3#dsfMC1X9~UdBU=-vB9n zahesuT$Ozot&Ay*Qy6bzEMQ#DNO93&;d3vU5CuuXPDRntdrorSIWbi8fI~w)faUz< z{JVa_t|q>yL=Eo;7e#f5G4p-NtDlir)FiRy6o=@2=pLylJ0Y?1HKBUm?Y-oV`U7^FUT4GuPv{F_%{-eol}$H3Q5nw8PE@ zI#25sz|qY=qZ@a2<1Xgou1bvOU= z0g6YvnDhwOcQdGDuGh%p-TbS&`ETmxU(?NhTQ~o@0Umjd^$hIjX3*Fzf|tATrf&Sr zZrt0A@9oB$J>3)snCn&6(v2VLX5ZS4AL+(@%=Jdw-i>>NMb?1cN{!6*MiavvPnu{) zayNfF^Iq)lVovwE=_qBMAgQRn+}|Ubx*4=yZXi0CW9_dUmPDChtZlTz&fLO0pZNgh z<;;gLZ@er#uD=#m;LR}Y@G;jDMnx-5e3S3!Hy&Tnp2{uSKIGFTdBG1d&; zxj#qgVNjiSDpt>%#XQ)`SOq>irA5nB9B5?zqQrcj0qMAYnbfy49$~uXss9md7_-`hUmhXFSf>&Ul)!gYkF9z!5UMnK6dZ%9z4vXUt%9O7w_KR=5}! zFlI64Fy=EBFcvYo8A}<<7|R(SXWYc7$G=VExCVBx$IFaf#umm_MnB_e#tud?l52p` z%BVMZ8*@9OgV9My*Px3PS&aFNMT}*Pm5eovO^hv!KE@74F-m64$Y^GaVYC3XIf#`N z$&5BeJEMcq$>?ItXDnl^WYiO=Vcy8-Wo%*ek5aDHuE7pgn3H9W@ldFyAI@lFbTXDQ zRwnP9f4A~(Ky7QhLD|`UuVN1JIIosr_1>V8d5f;MN&hlNyg;C(rS}@<@sc|kD;ZlD zEfY9AV+*5YqNeXJYPkEcNriASRuihv->=*sfER_-+jEt^I~SKK^8-wag}4B8Is(I74S)u1^lE%&9`? zNM+Tc!Caw#kH zv9pZ1K30}9*C%9^%=>c!)yxMluVHRsUdKFzS7^pT)eK`3=k~nLC+RGrx&>4fA=->zI4yv!am|xy+k%1Lj`l3U>s}%ni(2 znFlcUGY@2L941d;5c3Y{?-9Ye!Axlo!aRn#k-3$5DDz70&FPyYblBKGg1LivBy$(@ z9?bJKj`}yTqLdBj1%5ipnfGL_&xv|5*XKmNnOC!Y6!SXf(af8e)7L%dXeLhQKZX^p zY!J)b&peKK2lII5##yq)`Z14Tp1|D7ygzdr^8w5q;Mz!TVTFqg5}D^SAIQ9v`5@-y z%#)Z`Gat;nj`V5b^Xbg-^RwE#F%;l6yoeD{f)~Kl6FaJDAUBZoE;JAeVUz^ShZ_nHMm(F<-&l z!CcX1B)I-utO(>OioWIvVV=+aq0CE}hcPc_9>KhtxtVz#^WMyxm`4$(>%W;5eb}It zc^q>;^91H%wyc5S%+1UvGPg3nhPjRTROSxmcY{;Tnmc_{N5 z=3&emnMW}9GLK{4!hB)`kH3Ca+|33Z%oU!r8Ry6n2QrUg9>UzpJe0YOc^GpC^9bfH z=5c1N{6gfjVj>%qGFN!gSI#_;c{TG8=5@?NnKv;HW8Ta>f_W?RI1elQteD7LWXcjN zJc~3l4`ps)9>zSGc?5Gi^El>C=JdEV9r?^X3ePf2SrN*-oOu}YYUXjw>zGeu?q#l6 zD0=MCF%Pw9RQQ;OF>jaLBPOy!%;gd%$pB{Nq0BAJ!-GH43`1Q^Z?8&^#IIkm@CQBzEQVl?$zy?x9IjM(%z@rGjAtO?JtZK;wG*E zn+#xP9>(0F`%jYo$+|ytyY6q7{!ZPWd6v%8q<;}OJ((-Q98yuH8)QgcsdJ~~HOvE- zN#4jjj=A@yox>`WArT&ZvN%QB2{TUyxh91IS^brt?il7W;Es z5Jk-YD!oM+^PSA~eE@x*pql-svA@0#5C~4`i#j&Ympo0(AL0P|MuEPO(9Hha7KOfX zpl>X+vi}wi?`Qrf^A6_e`l8Z!r>tT;4Wu10%o~{ND;#}IXJ!8i_SbhRLYUjwUtgl> z8y80Qcd-9f9@K=36(6!eKJy*SOPRmVyqx)C%&VEd&b*HKKITo#UuNFS{9juAL)prT z7B=uRzn*yqb1!ove%yrG$A2*wybKRz9>e}0Gq*DTlDUn!=QCC~Sh1hEi}@?e^O^5r zUdsFs^K$0fm{&7@o_QVfubDSV?h#e2Xl4T+^H%0>F!wV*$h?F3QRc=)vPKRwk715q z`Oyw5^Us;vG>-azmlgU}iN3Ys-~jqETX4^)Z;iOvzktK*TPONfOFsMOv%ir~Q5f@5 z@~88k!3ql}Fp_yWN3evsnIi~iUd{fGGp}R*Eb}JjFEDRrK9hMXxVET#l@)$Ac$0Yz zXXqN{9qeDuJfHpby&U6R@)YQeI)*bG!S*riukValGk8&{Zx&hEz|8?lIRc&u2^;(W zgZ&-M^_>w5+efm$i~Vn4u5Vshndjfdi^{uL(Z~@DU|z}*WHYz2e-Gy6?9Zd_#T`o% z`&Y9+9xT<4I_5Vrw|O{1Gb@_dU^ep@uHq5Qo7ulukAVG0GjC=8Qs!msKY_WQ{Z}&g z*f|3|Sy9IUu4UfA0oF1%-Yw7Z9OibmAHzI`{g*Ot<@g6Px3d48l6yo88zixTjScdc zJD5Mr+{g)D$=t>M_b|_AzKVG@+fQa*%Ki^(98I;H4JNWdIUB5Ip3MHq%&Xb|Ddu&| z?`Ph`yo7l(^SR6&*UK90MVu~`RyNqk27cz5%sZH?%$*!TZ|24V8Q})zS)5^g%Qc4m zm$Sc%!$*Nr`ohWv`VM3k8$@#e8~e{=?qFWc+{Ju7^L*ydFfV0Zr~7mKef06aoDE!T zP{am(nOC#_&CK;J)Je?i*nbW4Cg!!wo0;Foyp{PTef%%u1Y_C2&jze4GIwOi8n}vi2m3$3T;H^|GdC{Q>^))~ zD~dP*8}k@xAj+7Rvj2GIR`y@PyqYuIkGYNgZ)5IYzL($V1{IF@-n z`!CZY7$-|?VP4AqcQCKx4E1MT&i+}BbV`8Ujsg}kV&WJL@V3f!BSTbaMa+{V0~xr6z1=B~n>E1y;J!XCBu*x9F1 z35XA9ROBj%ohz-5(ehzVO78U=muf=@ z4fQD~q5Dz%z>_wc!KYcyL-#v+cHldZ32+a9m?4$mBY^(~{s1Y01c0}kM_*6};)L|M zfO`!P1@h}3`1mK}W5`>O=O9l&rgsW)Eo3xg5F{F+Ku#dc=a7AnEkY4bLN-7=kb5Bu zA#)+uLB>Pq=w(nu4+CMa4 zJP7eXN+5SbvLW*zx8NsgG9fb|(;?SF#zL-yBtrTQ#=ogSikJi$3mFNy0%C#0LV7{) z^4hNb$`CqxVaa$w+qwZI*g(2CwedqGaJ-!qd^o$fNkswlgC3V9w;iHIqV77S^bK>t zqz1uC^*BFL0{b*|iKms^cn8v{8T6S#0Spuoj;?W1Bwdek*y)Yy`!Rx@ww6G}nK_$rEC2Xq}wo60{KagB39gG8eJ{av!7&@(`o~qCz%9UVyv-`4I9c zH~u8V zNOx|jJLw*6fNF%j9iF-_DLGlRLst~mMK@-&7GF`It}8`GsFMI+l#}hwPQuvbL8AD2 zJyqw(ZT*5SJ!#8MAB2I zLfH(Z1t=3vCzbH)hSE+;r2R6TQ%j@+I#d*gb>gJrSxNjjz@>sXU1Vs!TsI%($9>z& zl$lzD7U(WTn5iY444o6TII@_k52vgG?Lg5vodg`{S(f44N}D8YC5ACfbij*s_Z1en z@1eONMkS9}aLM?A2Oh||gT}3v$2sT4?uAL|sal3wFVoG}GUV&3%anHh%XHGN9l9p0 zN=KH;jMr^d#1YDPsYh!FC=-59=UH5}KyDn`l5Gccv=CsOHhuF#*QF6@^Amc1q%!ED zom^WqVickVDbv*YcdZt*B#X6v#7dI`%^<0G37i72PKXw)Hb>sEMB}1G5pUu=j4a|< z+Vv`5QoJxJSzFkaomAATKUG$G#)gZe(@%(`y^o6|ca=y=c}yfJl_J`S0Uwv1{Ru@B z<7%*`!{LGihE?{)7o!3u5Ga9R(FSpEpy5#9m%)ZbxJs1BU=cYxv^~TZ)Dlo+a3-39 zg=udO5tb7vf>N+;fqY#L$wyR)A{f^aJOw<(e|Vx~U5vGeQ^G{#7(|{G>`V+Yh@kI6 zMG*@AH;9)aB%Rx+@eiPD(GrpVmpDp;Z~}G+n|LWO((4+T5^NB`vkl2=>t{;JsGO_h ziw{E+P_O;*<#Y5pgm*yPUAPu%j6uDjRTQ@;m!35gLZc!tDS99R_KL|Mu{SNcr~jZ{SBO4K@MFA+^I z8Iq4~mrw}_5Ft~@9&S2+IU&N70vr=wq`JOPhN_{5mH2^^&dMsW&%rm}Azy?j8oFj< zjtJf!qE0`o44Fd7pw7iY3?DRv#KDe`_^?@cO%?D^YPh z>8unRlJ&gLpMe($As2$xpAIY63?V(5p%^wnh-?fS6!nw96%azn)rXHLePZ-D{tNo_ zNz(6j;KnbN*sF(yiGIpx5!oK@3vCJU1{DQn1tc4sRPjZKM2QO%aVb$E?xjBMQNCU+ zW^a$8$gBvby8cTg#?Ta}ZvRr5F^;T#xWpCQ?vBa{6H%F=A}R&$+2$gxBx5d>LH+^uC^?A(X45eD^lJ<>vVYq@!HR8+Gz@DbS_=^eX z)f5en{*a+Yb>!Dde~+%e{~jU!0l5u<=}>wZM6cp-rxK1?z#ZUP29dc;WG*FC#Eg*{ zL?Zu@#+QqQ_z^Oc%uT6Px#u&Sx?$v;iFI`mdDOQL$kn)*UHgan53K&SG(X zVvD1FNeOl)l<9R zjW{#7=yAd875C+%LJWTl&ui*uIW`zsM-hs974^(AJGInvP9ybSk$U^Z)Qdv2<|Hh7 zd(|VPUwS!&{Vlzg)%K&xf-$=9J5LD_{4{=4LT?D&TI}x4SQA1XHLAB~Y~ z{fZEKIN9gm-qnTwS$q8AC0w`=y&y`2K|~Y>IseS|8^ksJ`d2Xm>E-GbEPADwMX#5% zAwbIrwc9e-Sa)KM&UUc_f<&aUP6Yb`TMS-0>FT*}mHy)_Z({xqan{gyDnwVVga?W6 zoB$Dy0VKQ#4FprMz%5$XS>GvB22q{45JvV+X7o-bG?5-6>Lv6Z1JK~yaq2(6Q-)r= zcustXZMB0!^utt}j-K&hA|A~+J|$elkLlYU?d#pr(`&j|@&3<{XsZz8*dD7f(Kn^9 z==;*;Z7_CNIGVl{9j@iiTK53aj>KX|go^mgN<)0g!-jZeok7-@R+^RHD+4D`Y3KvP zvIQ7L*z8L!;HJZ9Ymk{;Gm;sB%!G@+W7Mw@Ug@bSKVWS|(Uc-N1*W0sRODH_{935| z9%DHqkE4qnU=-#QlQ0)Yw1@fRbxH9gBOW@GumBO3Z_q0L&sxROpYhpR2Z=HrYg{Y9vc8fs8-AeuQv-lBf|gVGm`R{h}zW#q+kbnZ8#*CE7m*znYUqC1gYDq zEv0Xvtpqx{M&{#$G!OhULufmIj;?k!-R#I;Pqb{CqCRs_iN0PYCIgd!e$c)E9bF@g zLZx*-^ayvG-G7Zv2Dy4}T#?kI8RE}4ffn24zbg-dcB*^6@ua>Y+U^RgGYrxzB_S+w}h zg4`SKxGQ&|8$TI6wKzB1o$D+vT$sCrLj6@;aa@Ux{xop5yI^W|k-MZgcWU8c+N2Rj z)Q00qZ1lI}b7dNq;(Hb?zLWb)nF=$OG>;>*lOIdamGm0u0&(Wh zlxb=)^13j)U=GfT_OXV&0U2u5&q{P`l#-TPkn7IvZgID|>u2Q(Ph(JK!ID(^$^)$@ z;YRW|Wfzp>ihmMA;*z~cYabo~#xJZ^{uIAQqE0!zM(ZsZ-ELLmo>5Gb&Xw4mQ--`PZnsOFeC}n7# zcnqf)WnPpsm8v=W&Rp>ZC6+oBqw;3T-VM`cl6$|F1t*gaYQIzE*GO~b!K+aMgBI0;Y)>TM~L}a&CEfY z#>7x_&(4)~RyRqRUQn_mpAwu>l9!iDJ5Qk$0j}RAg}CHP+(jjBDtS;BEzT99x=LMf zQt6#=kh=p}kxBA2bMSd;>P^ax8&4@2n2KOF;W(vO)Us1bQV_O`gpqu+cdk3F{16yg zGg{vFQq+?lD!tVMrsYr7t=?b{X4!N27KUm ze7pr%&-@d{bBqK3kajcvP6Iiv$_!p9-Tjkv!C{5!+~H%<4BKs>bXN^``1m|&8dCZ8+W?FAYz z$M1mN3`~XuB2vOfA!J_zd=X-X-UlqgY%K_HRmPaza(EAXm#teO#+wn+a8vBTX0{2Ahco9&cH@IS0-yQO z;vxKl-E_-*8MYA@Y{V@~ay$&7#43S}5Xw*!@Hm8WO8CwIA+{kgFYpkA>`ntNXLlJ; zg;1o`z_cV}7GcYPPeMrV1saFo^g(Y1W>u;cf(e3ZYtQ1$waOX@|ZH_%Wmf?nA)v5!k7PI|?`*LJ1cDKOKqd8TwY>Z=-Pj z*Mqz{T8J|cinIfG{TP{{4B%}L3Y-NjX15!-9zynn+t^LG@G2qRM4Yt8@RzYd{0{dr z;5G=wL--cE{bM~iPvcPC)wpd2tbkCYjle!v%S^-ohe0UtaNsrUwgYcxcNTCdyO#kc z+Hgt`=Oo}N2!&k@+|KSs;8WvKLmuR=29C`WaaZea$Q>|u5+137J0CcHGHxdR9T5R1 zPr+phw;h-=O^8gm3GbaQuLw8ro$Iiffv{d+<_t7s*bqJgaY0`L9C*DfBrS?OY4}Ga z&H=tS3)d`i?ZCM50fh7ifWJeiu@DAi;?jXlAn+u_ibzkBZZ1j;cgjuZGv*<2vH`vf zDS*2j81BNJ0Sase_LOdqu)vYX9t(h5Ae8Vn;9+(j0bV&DJtImp9C$B;Y}~-t+5INa zaEsIj0_Q>~(=Om^5IP-V0cr|Dr-SgW1vvjiia<89M-A{tcKd--Z$pbk!WqDG5HH-n z1LJPTDTBKo@OpM<0IMJr=O*9>5Um!0A`ATn?2W*6*|N6!dG0_d7veH|61Tg6<8x$y zNx{BPfZ3Fs?AP7r%;a+(~n2S+Jh!1)<5MNsntxux=$2UpDuMmn9-zlNbu4rz;R0t)E z@0kdE<3w{4{s_@(4mjE^-6_CKhy$4*{3nFMz6=a2kv37le?X`)dV!NY_u)nm0u%rn zAgkft0Xzn2hx<5i^!=y_xKn^tkOOc(4$Lk^2Lg8va5ba=Zo;KYaXG@h4EQaCPTzOH zrUzuggtz}iX3moZ2R;O&<%lpBLM6jTVZ=IiGU07CH)E@L<0NeIPr8aUd6^G~^Uc!YSnOo*tbP%Xe2E0HOed! zNDM|tfPa4!T`b(2fSHfs@Sy0rr0ek)kWL0H1(p znFDUF!4>fgdQV{EW;repwn2OddmK1?i#$z)o^e}IVg#@Ow?XK15dIFKR!SK7EG{kB z5MBkL#8QB}wqqcI-dT%Fw@zld9XRAU8IKd#0U>+Byn38I*yjU3grH&K@o6}=?~r|a z9q_G2oE%R zq!B)?B>sSuAp!9su6qb2kOur5LXG7JumeJ+3495c9E2hz^g`$|BMkZ{Iu^uZ1dfAH zC*}g~egzE^`n|y0UPZ0eU{d3O!@d*4C1Me1Za0gL4DN#KR~tJSG88Kq9svQeg5CS&f8`Kqy0% zz{3#gOpXAfzl0s8*fGF|zk(ZKPXniZE$!2QCm}R6p9bFeEgCRvGJ#)u@XrC_11|lJ z8x-&z$TH}?z^UKM(x(BpLsmmy2mI@gXk2iY0k1rPQo=nPxEw;6!^cU*CJ1GkaQ@G- zms|k+5ON6io)$Rn{Y6%z8#uaMCgudbLT(r}0gF${%(;P2p2GRVjR<@XRhWMj!U8v8 zGK6MCgzrME(EEVx5F6adr%~+?T3xw-xxeB3+u@P_8>U|n%4s$56$rK7CSXbjx?()Lb%P$?h84RZ7WA0-EUfqeVx@`bc@LE5 zu_C3e6u3dbH3@ek&A%SizU>2U#a6Vly(aud=$VsaDG4P0^) z*0YHyX)JNH-D5O-T3g$W2H$;mA!$H@(PBSkG>{$euNz_ar+6^E6e`9kZRA<;X=tQG7U*a+N{(jxyOWZrwAgog^ zasT~0XZJSzqde1$T12OvwIzQ`(U#IJWm_t@)NE`+wd)EJK`?DR-itWbj=It@tE!(ZzJGP5jW35?TyVg;un zx~Av6&ow{S@|>mKTAy5RtGCxX>Yeqj`mFl=`l9;M`m*}+`pWw1`kMN>`o{XEdT)Jm zeM^07y|3P1-(KJ0sTU2#26ID9gQdaRklbKvus1jwoDHsqtcLuCqK2}D@`lQWYLuxC zrD{UCno+V=l+BOQb)bAklrRQmw4#(Yl+%Hdx=_}9l(rP*Ek}u~QRX_7x(VfO-qEt7 z6{ECBM%Pb2Le#juX}foO^Y)hQt=oOu{oC91`mBwqwbWW`lWT3Y_F6}+y6qW5Nst|v zl%n>pF<5Q3&5q5k&H0;4H;@D*3JIS9h;3?VzyYf*tR&fxNw3?x0G+G z-cpCt+l*7|-=eyoHgtp`2TpV@Xawr=&4%j#z4MkAg0_P>w@~+QGL)$UHye`BC(tvK z{Q#v}ja#}@CX|infB?Q{t=k>j^S768uS0odS*d)^S{KfJ{$*#suD0>Av!9IfT8^{W Tij!t-KxAEyoxXU(66L=E_-lGX literal 173056 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翚@MQes6%vi%wrtA67sl^<#Jz`z) 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

    4u+VwMf_D81Kw!%PA{TDrD?mpCj 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 literal 171008 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 BW-0&x literal 173056 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 diff --git a/portable/launchers_final/WinPython Interpreter.exe b/portable/launchers_final/WinPython Interpreter.exe index 6d7cc37bc11e7a2c0df24c8a32da7f58d0c129ee..dfa43135546a85d8df192d519033d667cdbcbb7e 100644 GIT binary patch delta 61781 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 z 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 Date: Fri, 25 Apr 2025 22:38:28 +0800 Subject: [PATCH 169/305] Remove extra space from CLI argument --- portable/launchers_src/launcher_template_CONSOLE.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/portable/launchers_src/launcher_template_CONSOLE.cpp b/portable/launchers_src/launcher_template_CONSOLE.cpp index 4156e36d..fbc51bcf 100644 --- a/portable/launchers_src/launcher_template_CONSOLE.cpp +++ b/portable/launchers_src/launcher_template_CONSOLE.cpp @@ -28,13 +28,13 @@ int main() { if (commandLine[0] == L'"') { LPWSTR closingQuote = wcschr(commandLine + 1, L'"'); if (closingQuote) { - args = closingQuote + 1; // Skip closing quote and space + args = closingQuote + 2; // Skip closing quote and space } // Otherwise skip to first space } else { LPWSTR spacePos = wcschr(commandLine, L' '); if (spacePos) { - args = spacePos + 1; // Skip space + args = spacePos + 2; // GetCommandLineW puts 2 spaces when path isn't double quoted } } } From 1aeef746950fa5b8c76e5b3f46aacd1fb48fd86b Mon Sep 17 00:00:00 2001 From: stonebig Date: Fri, 25 Apr 2025 16:39:46 +0200 Subject: [PATCH 170/305] last tweaks for the cycle --- README.rst | 4 ++-- make.py | 3 +-- winpython/__init__.py | 2 +- winpython/associate.py | 2 +- 4 files changed, 5 insertions(+), 6 deletions(-) diff --git a/README.rst b/README.rst index 1294e96b..a5f445e9 100644 --- a/README.rst +++ b/README.rst @@ -3,7 +3,7 @@ WinPython tools Copyright @ 2012-2013 Pierre Raybaut -Copyright @ 2014-2024+ The Winpython development team https://github.com/winpython/ +Copyright @ 2014-2025+ The Winpython development team https://github.com/winpython/ Licensed under the terms of the MIT License (see winpython/__init__.py for details) @@ -29,7 +29,7 @@ WinPython build toolchain Dependencies ------------ -* Python3 >= 3.8 +* Python3 >= 3.9 Requirements diff --git a/make.py b/make.py index aae72726..ed896854 100644 --- a/make.py +++ b/make.py @@ -104,7 +104,6 @@ def package_index_markdown(self) -> str: """Generates a Markdown formatted package index page.""" installed_tools_markdown = self._get_installed_tools_markdown() installed_packages_markdown = self._get_installed_packages_markdown() - python_description = "Python programming language with standard library" return f"""## WinPython {self.winpyver2 + self.flavor} @@ -122,7 +121,7 @@ def package_index_markdown(self) -> str: Name | Version | Description -----|---------|------------ -[Python](http://www.python.org/) | {self.python_full_version} | {python_description} +[Python](http://www.python.org/) | {self.python_full_version} | Python programming language with standard library {installed_packages_markdown} diff --git a/winpython/__init__.py b/winpython/__init__.py index 8bddcb81..32bccb82 100644 --- a/winpython/__init__.py +++ b/winpython/__init__.py @@ -28,6 +28,6 @@ OTHER DEALINGS IN THE SOFTWARE. """ -__version__ = '15.3.20250417' +__version__ = '15.3.20250425' __license__ = __doc__ __project_url__ = 'http://winpython.github.io/' diff --git a/winpython/associate.py b/winpython/associate.py index 673baf3d..2bc2d1d1 100644 --- a/winpython/associate.py +++ b/winpython/associate.py @@ -123,7 +123,7 @@ def register_in_registery(target, current=True, reg_type=winreg.REG_SZ, verbose= # --- Shell commands --- for ext, ftype in ext_map.items(): - dynamic_entries.append((f"Software\\Classes\\{ftype}\\shell\\open\\command", None, f'"{pythonw_exe if ftype=='Python.NoConFile' else python_exe} if " "%1" %*')) + dynamic_entries.append((f"Software\\Classes\\{ftype}\\shell\\open\\command", None, f'''"{pythonw_exe if ftype=='Python.NoConFile' else python_exe}" "%1" %*''')) lost_entries.append((f"Software\\Classes\\{ftype}\\shell\\open", None, None)) lost_entries.append((f"Software\\Classes\\{ftype}\\shell", None, None)) From 85d0e85c1024c10cdb429a4ec216d29b69ff6301 Mon Sep 17 00:00:00 2001 From: firai Date: Fri, 25 Apr 2025 22:43:00 +0800 Subject: [PATCH 171/305] Remove extra space from argument --- portable/launchers_src/launcher_template_WINDOWS.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/portable/launchers_src/launcher_template_WINDOWS.cpp b/portable/launchers_src/launcher_template_WINDOWS.cpp index e178f31e..9f03e097 100644 --- a/portable/launchers_src/launcher_template_WINDOWS.cpp +++ b/portable/launchers_src/launcher_template_WINDOWS.cpp @@ -28,13 +28,13 @@ int WINAPI WinMain(HINSTANCE /*hInstance*/, HINSTANCE /*hPrevInstance*/, LPSTR / if (commandLine[0] == L'"') { LPWSTR closingQuote = wcschr(commandLine + 1, L'"'); if (closingQuote) { - args = closingQuote + 1; // Skip closing quote and space + args = closingQuote + 2; // Skip closing quote and space } // Otherwise skip to first space } else { LPWSTR spacePos = wcschr(commandLine, L' '); if (spacePos) { - args = spacePos + 1; // Skip space + args = spacePos + 2; // GetCommandLineW puts 2 spaces when path isn't double quoted } } } From 2b5d86e62b17c07ee0c678539e9c6f5353341910 Mon Sep 17 00:00:00 2001 From: firai Date: Sat, 26 Apr 2025 00:23:56 +0800 Subject: [PATCH 172/305] Remove space from concat rather than from pointer offset --- portable/launchers_src/launcher_template_CONSOLE.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/portable/launchers_src/launcher_template_CONSOLE.cpp b/portable/launchers_src/launcher_template_CONSOLE.cpp index fbc51bcf..c4a26784 100644 --- a/portable/launchers_src/launcher_template_CONSOLE.cpp +++ b/portable/launchers_src/launcher_template_CONSOLE.cpp @@ -28,13 +28,13 @@ int main() { if (commandLine[0] == L'"') { LPWSTR closingQuote = wcschr(commandLine + 1, L'"'); if (closingQuote) { - args = closingQuote + 2; // Skip closing quote and space + args = closingQuote + 1; // Skip closing quote and space } // Otherwise skip to first space } else { LPWSTR spacePos = wcschr(commandLine, L' '); if (spacePos) { - args = spacePos + 2; // GetCommandLineW puts 2 spaces when path isn't double quoted + args = spacePos + 1; // GetCommandLineW puts 2 spaces when path isn't double quoted } } } @@ -62,7 +62,7 @@ int main() { // Append arguments if present if (!args.empty()) { - target += L" " + args; + target += args; } // Configure the process startup info From eeda305313d06f4c88124f909806f5d19bd9d286 Mon Sep 17 00:00:00 2001 From: firai Date: Sat, 26 Apr 2025 00:25:32 +0800 Subject: [PATCH 173/305] Remove space from concat rather than from pointer offset --- portable/launchers_src/launcher_template_WINDOWS.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/portable/launchers_src/launcher_template_WINDOWS.cpp b/portable/launchers_src/launcher_template_WINDOWS.cpp index 9f03e097..c02aea61 100644 --- a/portable/launchers_src/launcher_template_WINDOWS.cpp +++ b/portable/launchers_src/launcher_template_WINDOWS.cpp @@ -28,13 +28,13 @@ int WINAPI WinMain(HINSTANCE /*hInstance*/, HINSTANCE /*hPrevInstance*/, LPSTR / if (commandLine[0] == L'"') { LPWSTR closingQuote = wcschr(commandLine + 1, L'"'); if (closingQuote) { - args = closingQuote + 2; // Skip closing quote and space + args = closingQuote + 1; // Skip closing quote and space } // Otherwise skip to first space } else { LPWSTR spacePos = wcschr(commandLine, L' '); if (spacePos) { - args = spacePos + 2; // GetCommandLineW puts 2 spaces when path isn't double quoted + args = spacePos + 1; // GetCommandLineW puts 2 spaces when path isn't double quoted } } } @@ -62,7 +62,7 @@ int WINAPI WinMain(HINSTANCE /*hInstance*/, HINSTANCE /*hPrevInstance*/, LPSTR / // Append arguments if present if (!args.empty()) { - target += L" " + args; + target += args; } // Configure the process startup info From 9692aa07a1b5437b3b836c8956347cd43a05f619 Mon Sep 17 00:00:00 2001 From: firai Date: Sat, 26 Apr 2025 01:22:23 +0800 Subject: [PATCH 174/305] Wrap everything in outer quotes if arguments are passed --- portable/launchers_src/launcher_template_CONSOLE.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/portable/launchers_src/launcher_template_CONSOLE.cpp b/portable/launchers_src/launcher_template_CONSOLE.cpp index c4a26784..edf9d0b6 100644 --- a/portable/launchers_src/launcher_template_CONSOLE.cpp +++ b/portable/launchers_src/launcher_template_CONSOLE.cpp @@ -57,12 +57,12 @@ int main() { return 1; } - // Define the command to run - std::wstring target = L"cmd.exe /c \"" LAUNCH_TARGET L"\""; - - // Append arguments if present + // Define the command to run and append arguments if present + std::wstring target; if (!args.empty()) { - target += args; + target = L"cmd.exe /c \"\"" LAUNCH_TARGET L"\"" + args + L"\""; + } else { + target = L"cmd.exe /c \"" LAUNCH_TARGET L"\""; } // Configure the process startup info From 164cf600c94064b2b7cc670ca4656bad0aef6f32 Mon Sep 17 00:00:00 2001 From: firai Date: Sat, 26 Apr 2025 01:28:04 +0800 Subject: [PATCH 175/305] Wrap everything in outer quotes if arguments are passed --- portable/launchers_src/launcher_template_WINDOWS.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/portable/launchers_src/launcher_template_WINDOWS.cpp b/portable/launchers_src/launcher_template_WINDOWS.cpp index c02aea61..04b25fef 100644 --- a/portable/launchers_src/launcher_template_WINDOWS.cpp +++ b/portable/launchers_src/launcher_template_WINDOWS.cpp @@ -57,12 +57,12 @@ int WINAPI WinMain(HINSTANCE /*hInstance*/, HINSTANCE /*hPrevInstance*/, LPSTR / return 1; } - // Define the command to run - std::wstring target = L"cmd.exe /c \"" LAUNCH_TARGET L"\""; - - // Append arguments if present + // Define the command to run and append arguments if present + std::wstring target; if (!args.empty()) { - target += args; + target = L"cmd.exe /c \"\"" LAUNCH_TARGET L"\"" + args + L"\""; + } else { + target = L"cmd.exe /c \"" LAUNCH_TARGET L"\""; } // Configure the process startup info From 7883dce97eef6ea6cde29be68e00092cb5a86fe9 Mon Sep 17 00:00:00 2001 From: firai Date: Sat, 26 Apr 2025 01:47:20 +0800 Subject: [PATCH 176/305] Remove quotes and .exe when calling from %PATH% --- portable/scripts/winvscode.bat | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/portable/scripts/winvscode.bat b/portable/scripts/winvscode.bat index efcb4208..d9697b89 100644 --- a/portable/scripts/winvscode.bat +++ b/portable/scripts/winvscode.bat @@ -6,5 +6,5 @@ if exist "%WINPYDIR%\..\t\vscode\code.exe" ( if exist "%LOCALAPPDATA%\Programs\Microsoft VS Code\code.exe" ( "%LOCALAPPDATA%\Programs\Microsoft VS Code\code.exe" %* ) else ( - "code.exe" %* + code %* )) \ No newline at end of file From 2e8878254f138a515b769bdeac8f37bed6d6b67d Mon Sep 17 00:00:00 2001 From: stonebig Date: Fri, 25 Apr 2025 20:32:18 +0200 Subject: [PATCH 177/305] respect heaven's order --- hash.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hash.py b/hash.py index 08ff8b92..d16bff0a 100644 --- a/hash.py +++ b/hash.py @@ -28,7 +28,7 @@ def print_hashes(files): print(header) print(line) - for file in files: + for file in sorted(files): md5 = compute_hash(file, hashlib.md5) sha1 = compute_hash(file, hashlib.sha1) sha256 = compute_hash(file, hashlib.sha256) From 4a624c67f912ad3b4bafa17cbe07342a82a2a9d0 Mon Sep 17 00:00:00 2001 From: firai Date: Sat, 26 Apr 2025 14:46:51 +0800 Subject: [PATCH 178/305] More reliable way to deal with whitespace --- .../launcher_template_WINDOWS.cpp | 32 +++++++++---------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/portable/launchers_src/launcher_template_WINDOWS.cpp b/portable/launchers_src/launcher_template_WINDOWS.cpp index 04b25fef..6b10a89a 100644 --- a/portable/launchers_src/launcher_template_WINDOWS.cpp +++ b/portable/launchers_src/launcher_template_WINDOWS.cpp @@ -19,25 +19,25 @@ int WINAPI WinMain(HINSTANCE /*hInstance*/, HINSTANCE /*hPrevInstance*/, LPSTR / std::wstring exeDir = exePath; exeDir = exeDir.substr(0, exeDir.find_last_of(L"\\/")); - // Get command line string + // Get command line string and extract arguments LPWSTR commandLine = GetCommandLineW(); - // Skip the current executable path and name std::wstring args; - if (commandLine) { - // If path is double quoted, skip the entire double quote - if (commandLine[0] == L'"') { - LPWSTR closingQuote = wcschr(commandLine + 1, L'"'); - if (closingQuote) { - args = closingQuote + 1; // Skip closing quote and space - } - // Otherwise skip to first space - } else { - LPWSTR spacePos = wcschr(commandLine, L' '); - if (spacePos) { - args = spacePos + 1; // GetCommandLineW puts 2 spaces when path isn't double quoted - } + // If executable path is double quoted, skip the entire quoted section + if (commandLine[0] == L'"') { + LPWSTR closingQuote = wcschr(commandLine + 1, L'"'); + if (closingQuote) { + args = closingQuote + 1; + } + // For non-quoted path, skip to character after first space if it exists + } else { + LPWSTR spacePos = wcschr(commandLine, L' '); + if (spacePos) { + args = spacePos + 1; } } + // Strip leading whitespace + size_t args_start = args.find_first_not_of(L" "); + args = (args_start != std::wstring::npos) ? args.substr(args_start) : L""; // Define the path to the "scripts" directory std::wstring scriptsDir = exeDir + L"\\scripts"; @@ -60,7 +60,7 @@ int WINAPI WinMain(HINSTANCE /*hInstance*/, HINSTANCE /*hPrevInstance*/, LPSTR / // Define the command to run and append arguments if present std::wstring target; if (!args.empty()) { - target = L"cmd.exe /c \"\"" LAUNCH_TARGET L"\"" + args + L"\""; + target = L"cmd.exe /c \"\"" LAUNCH_TARGET L"\" " + args + L"\""; } else { target = L"cmd.exe /c \"" LAUNCH_TARGET L"\""; } From 3e8c1b44428f2f60a6b7f802c80fc8b1089c672b Mon Sep 17 00:00:00 2001 From: firai Date: Sat, 26 Apr 2025 14:47:02 +0800 Subject: [PATCH 179/305] More reliable way to deal with whitespace --- .../launcher_template_CONSOLE.cpp | 32 +++++++++---------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/portable/launchers_src/launcher_template_CONSOLE.cpp b/portable/launchers_src/launcher_template_CONSOLE.cpp index edf9d0b6..1008d7f0 100644 --- a/portable/launchers_src/launcher_template_CONSOLE.cpp +++ b/portable/launchers_src/launcher_template_CONSOLE.cpp @@ -19,25 +19,25 @@ int main() { std::wstring exeDir = exePath; exeDir = exeDir.substr(0, exeDir.find_last_of(L"\\/")); - // Get command line string + // Get command line string and extract arguments LPWSTR commandLine = GetCommandLineW(); - // Skip the current executable path and name std::wstring args; - if (commandLine) { - // If path is double quoted, skip the entire double quote - if (commandLine[0] == L'"') { - LPWSTR closingQuote = wcschr(commandLine + 1, L'"'); - if (closingQuote) { - args = closingQuote + 1; // Skip closing quote and space - } - // Otherwise skip to first space - } else { - LPWSTR spacePos = wcschr(commandLine, L' '); - if (spacePos) { - args = spacePos + 1; // GetCommandLineW puts 2 spaces when path isn't double quoted - } + // If executable path is double quoted, skip the entire quoted section + if (commandLine[0] == L'"') { + LPWSTR closingQuote = wcschr(commandLine + 1, L'"'); + if (closingQuote) { + args = closingQuote + 1; + } + // For non-quoted path, skip to character after first space if it exists + } else { + LPWSTR spacePos = wcschr(commandLine, L' '); + if (spacePos) { + args = spacePos + 1; } } + // Strip leading whitespace + size_t args_start = args.find_first_not_of(L' '); + args = (args_start != std::wstring::npos) ? args.substr(args_start) : L""; // Define the path to the "scripts" directory std::wstring scriptsDir = exeDir + L"\\scripts"; @@ -60,7 +60,7 @@ int main() { // Define the command to run and append arguments if present std::wstring target; if (!args.empty()) { - target = L"cmd.exe /c \"\"" LAUNCH_TARGET L"\"" + args + L"\""; + target = L"cmd.exe /c \"\"" LAUNCH_TARGET L"\" " + args + L"\""; } else { target = L"cmd.exe /c \"" LAUNCH_TARGET L"\""; } From 3ee9c365d2740fbb9118f4460aecdb91a1e287c8 Mon Sep 17 00:00:00 2001 From: stonebig Date: Sun, 27 Apr 2025 08:23:47 +0200 Subject: [PATCH 180/305] a bug at rc shall fix https://github.com/winpython/winpython/issues/1576 (for this rc at least) --- winpython/associate.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/winpython/associate.py b/winpython/associate.py index 2bc2d1d1..5d5854ff 100644 --- a/winpython/associate.py +++ b/winpython/associate.py @@ -92,10 +92,10 @@ def register_in_registery(target, current=True, reg_type=winreg.REG_SZ, verbose= python_exe = str(target_path / "python.exe") pythonw_exe = str(target_path / "pythonw.exe") spyder_exe = str(target_path.parent / "Spyder.exe") - icon_py = str(target / "DLLs" / "py.ico") - icon_pyc = str(target / "DLLs" / "pyc.ico") - idle_path = str(target / "Lib" / "idlelib" / "idle.pyw") - doc_path = str(target / "Doc" / "html" / "index.html") + icon_py = str(target_path / "DLLs" / "py.ico") + icon_pyc = str(target_path / "DLLs" / "pyc.ico") + idle_path = str(target_path / "Lib" / "idlelib" / "idle.pyw") + doc_path = str(target_path / "Doc" / "html" / "index.html") python_infos = utils.get_python_infos(target) # ('3.11', 64) short_version = python_infos[0] # e.g., '3.11' version = utils.get_python_long_version(target) # e.g., '3.11.5' From bffefa3ad0dfe4d37c8474c1050c096470cf89a8 Mon Sep 17 00:00:00 2001 From: firai Date: Wed, 30 Apr 2025 01:33:02 +0800 Subject: [PATCH 181/305] Shift arguments inside quotes --- portable/scripts/wpcp.bat | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/portable/scripts/wpcp.bat b/portable/scripts/wpcp.bat index 769d4a4c..5edb982c 100644 --- a/portable/scripts/wpcp.bat +++ b/portable/scripts/wpcp.bat @@ -1,3 +1,3 @@ @echo off call "%~dp0env_for_icons.bat" %* -cmd.exe /k "echo wppm & wppm" %* \ No newline at end of file +cmd.exe /k "echo wppm & wppm %*" \ No newline at end of file From 4994a8dacf2a1d619a4353310516241d36352efe Mon Sep 17 00:00:00 2001 From: stonebig Date: Sun, 4 May 2025 11:34:30 +0200 Subject: [PATCH 182/305] WinPython 20205-03 final --- changelogs/WinPythondot-64bit-3.12.10.0.md | 29 + .../WinPythondot-64bit-3.12.10.0_History.md | 22 + changelogs/WinPythondot-64bit-3.13.3.0.md | 29 + .../WinPythondot-64bit-3.13.3.0_History.md | 22 + changelogs/WinPythonslim-64bit-3.12.10.0.md | 515 ++++++++++++++++++ .../WinPythonslim-64bit-3.12.10.0_History.md | 147 +++++ changelogs/WinPythonslim-64bit-3.13.3.0.md | 515 ++++++++++++++++++ .../WinPythonslim-64bit-3.13.3.0_History.md | 148 +++++ changelogs/md5_sha1.txt | 18 + 9 files changed, 1445 insertions(+) create mode 100644 changelogs/WinPythondot-64bit-3.12.10.0.md create mode 100644 changelogs/WinPythondot-64bit-3.12.10.0_History.md create mode 100644 changelogs/WinPythondot-64bit-3.13.3.0.md create mode 100644 changelogs/WinPythondot-64bit-3.13.3.0_History.md create mode 100644 changelogs/WinPythonslim-64bit-3.12.10.0.md create mode 100644 changelogs/WinPythonslim-64bit-3.12.10.0_History.md create mode 100644 changelogs/WinPythonslim-64bit-3.13.3.0.md create mode 100644 changelogs/WinPythonslim-64bit-3.13.3.0_History.md diff --git a/changelogs/WinPythondot-64bit-3.12.10.0.md b/changelogs/WinPythondot-64bit-3.12.10.0.md new file mode 100644 index 00000000..54058837 --- /dev/null +++ b/changelogs/WinPythondot-64bit-3.12.10.0.md @@ -0,0 +1,29 @@ +## WinPython 3.12.10.0dot + +The following packages are included in WinPython-64bit v3.12.10.0dot . + +

    + +### Tools + +Name | Version | Description +-----|---------|------------ + + +### Python packages + +Name | Version | Description +-----|---------|------------ +[Python](http://www.python.org/) | 3.12.10 | Python programming language with standard library +[build](https://pypi.org/project/build) | 1.2.2.post1 | +[colorama](https://pypi.org/project/colorama) | 0.4.6 | +[packaging](https://pypi.org/project/packaging) | 24.2 | +[pip](https://pypi.org/project/pip) | 25.0.1 | +[pyproject-hooks](https://pypi.org/project/pyproject-hooks) | 1.1.0 | +[setuptools](https://pypi.org/project/setuptools) | 75.8.2 | +[sqlite-bro](https://pypi.org/project/sqlite-bro) | 0.13.1 | +[sv-ttk](https://pypi.org/project/sv-ttk) | 2.6.0 | +[wheel](https://pypi.org/project/wheel) | 0.45.1 | +[winpython](https://pypi.org/project/winpython) | 15.3.20250425 | + +
    diff --git a/changelogs/WinPythondot-64bit-3.12.10.0_History.md b/changelogs/WinPythondot-64bit-3.12.10.0_History.md new file mode 100644 index 00000000..b613a876 --- /dev/null +++ b/changelogs/WinPythondot-64bit-3.12.10.0_History.md @@ -0,0 +1,22 @@ +## History of changes for WinPython-64bit 3.12.10.0dot + +The following changes were made to WinPython-64bit distribution since version 3.12.9.0dot. + +
    + +### Python packages + +New packages: + + * [sv-ttk](https://pypi.org/project/sv-ttk) 2.6.0 () + +Upgraded packages: + + * [pip](https://pypi.org/project/pip) 24.3.1 → 25.0.1 () + * [Python](http://www.python.org/) 3.12.9 → 3.12.10 (Python programming language with standard library) + * [setuptools](https://pypi.org/project/setuptools) 75.6.0 → 75.8.2 () + * [winpython](https://pypi.org/project/winpython) 13.1.20250215 → 15.3.20250425 () + + +
    +* * * diff --git a/changelogs/WinPythondot-64bit-3.13.3.0.md b/changelogs/WinPythondot-64bit-3.13.3.0.md new file mode 100644 index 00000000..3e806313 --- /dev/null +++ b/changelogs/WinPythondot-64bit-3.13.3.0.md @@ -0,0 +1,29 @@ +## WinPython 3.13.3.0dot + +The following packages are included in WinPython-64bit v3.13.3.0dot . + +
    + +### Tools + +Name | Version | Description +-----|---------|------------ + + +### Python packages + +Name | Version | Description +-----|---------|------------ +[Python](http://www.python.org/) | 3.13.3 | Python programming language with standard library +[build](https://pypi.org/project/build) | 1.2.2.post1 | +[colorama](https://pypi.org/project/colorama) | 0.4.6 | +[packaging](https://pypi.org/project/packaging) | 24.2 | +[pip](https://pypi.org/project/pip) | 25.0.1 | +[pyproject-hooks](https://pypi.org/project/pyproject-hooks) | 1.1.0 | +[setuptools](https://pypi.org/project/setuptools) | 75.8.2 | +[sqlite-bro](https://pypi.org/project/sqlite-bro) | 0.13.1 | +[sv-ttk](https://pypi.org/project/sv-ttk) | 2.6.0 | +[wheel](https://pypi.org/project/wheel) | 0.45.1 | +[winpython](https://pypi.org/project/winpython) | 15.3.20250425 | + +
    diff --git a/changelogs/WinPythondot-64bit-3.13.3.0_History.md b/changelogs/WinPythondot-64bit-3.13.3.0_History.md new file mode 100644 index 00000000..3adc0bce --- /dev/null +++ b/changelogs/WinPythondot-64bit-3.13.3.0_History.md @@ -0,0 +1,22 @@ +## History of changes for WinPython-64bit 3.13.3.0dot + +The following changes were made to WinPython-64bit distribution since version 3.13.2.0dot. + +
    + +### Python packages + +New packages: + + * [sv-ttk](https://pypi.org/project/sv-ttk) 2.6.0 () + +Upgraded packages: + + * [pip](https://pypi.org/project/pip) 24.3.1 → 25.0.1 () + * [Python](http://www.python.org/) 3.13.2 → 3.13.3 (Python programming language with standard library) + * [setuptools](https://pypi.org/project/setuptools) 75.6.0 → 75.8.2 () + * [winpython](https://pypi.org/project/winpython) 13.1.20250222 → 15.3.20250425 () + + +
    +* * * diff --git a/changelogs/WinPythonslim-64bit-3.12.10.0.md b/changelogs/WinPythonslim-64bit-3.12.10.0.md new file mode 100644 index 00000000..3e036135 --- /dev/null +++ b/changelogs/WinPythonslim-64bit-3.12.10.0.md @@ -0,0 +1,515 @@ +## WinPython 3.12.10.0slim + +The following packages are included in WinPython-64bit v3.12.10.0slim . + +
    + +### Tools + +Name | Version | Description +-----|---------|------------ +[Pandoc](https://pandoc.org) | 3.1.9 | an universal document converter + +### Python packages + +Name | Version | Description +-----|---------|------------ +[Python](http://www.python.org/) | 3.12.10 | Python programming language with standard library +[absl-py](https://pypi.org/project/absl-py) | 2.0.0 | +[adbc-driver-manager](https://pypi.org/project/adbc-driver-manager) | 1.3.0 | +[aiofiles](https://pypi.org/project/aiofiles) | 23.2.1 | +[aiohappyeyeballs](https://pypi.org/project/aiohappyeyeballs) | 2.4.4 | +[aiohttp](https://pypi.org/project/aiohttp) | 3.11.11 | +[aiosignal](https://pypi.org/project/aiosignal) | 1.3.1 | +[aiosqlite](https://pypi.org/project/aiosqlite) | 0.20.0 | +[alabaster](https://pypi.org/project/alabaster) | 0.7.16 | +[alembic](https://pypi.org/project/alembic) | 1.15.1 | +[altair](https://pypi.org/project/altair) | 5.5.0 | +[aniso8601](https://pypi.org/project/aniso8601) | 9.0.1 | +[annotated-types](https://pypi.org/project/annotated-types) | 0.6.0 | +[ansicolors](https://pypi.org/project/ansicolors) | 1.1.8 | +[anthropic](https://pypi.org/project/anthropic) | 0.49.0 | +[anyio](https://pypi.org/project/anyio) | 4.8.0 | +[anywidget](https://pypi.org/project/anywidget) | 0.9.12 | +[appdirs](https://pypi.org/project/appdirs) | 1.4.4 | +[argon2-cffi](https://pypi.org/project/argon2-cffi) | 23.1.0 | +[argon2-cffi-bindings](https://pypi.org/project/argon2-cffi-bindings) | 21.2.0 | +[array-api-compat](https://pypi.org/project/array-api-compat) | 1.11.1 | +[arrow](https://pypi.org/project/arrow) | 1.3.0 | +[asgi-csrf](https://pypi.org/project/asgi-csrf) | 0.9 | +[asgiref](https://pypi.org/project/asgiref) | 3.8.1 | +[asn1crypto](https://pypi.org/project/asn1crypto) | 1.5.1 | +[asteval](https://pypi.org/project/asteval) | 0.9.31 | +[astroid](https://pypi.org/project/astroid) | 3.1.0 | +[astropy](https://pypi.org/project/astropy) | 6.1.6 | +[astropy-iers-data](https://pypi.org/project/astropy-iers-data) | 0.2024.12.23.0.33.24 | +[asttokens](https://pypi.org/project/asttokens) | 2.4.1 | +[async-lru](https://pypi.org/project/async-lru) | 2.0.4 | +[asyncssh](https://pypi.org/project/asyncssh) | 2.20.0 | +[atomicwrites](https://pypi.org/project/atomicwrites) | 1.4.0 | +[attrs](https://pypi.org/project/attrs) | 23.2.0 | +[autopep8](https://pypi.org/project/autopep8) | 2.0.4 | +[azure-core](https://pypi.org/project/azure-core) | 1.32.0 | +[azure-cosmos](https://pypi.org/project/azure-cosmos) | 4.9.0 | +[azure-identity](https://pypi.org/project/azure-identity) | 1.21.0 | +[babel](https://pypi.org/project/babel) | 2.16.0 | +[baresql](https://pypi.org/project/baresql) | 1.0.0 | +[beautifulsoup4](https://pypi.org/project/beautifulsoup4) | 4.12.2 | +[binaryornot](https://pypi.org/project/binaryornot) | 0.4.4 | +[black](https://pypi.org/project/black) | 25.1.0 | +[bleach](https://pypi.org/project/bleach) | 6.1.0 | +[blinker](https://pypi.org/project/blinker) | 1.9.0 | +[bokeh](https://pypi.org/project/bokeh) | 3.7.2 | +[branca](https://pypi.org/project/branca) | 0.8.0 | +[brotli](https://pypi.org/project/brotli) | 1.1.0 | +[build](https://pypi.org/project/build) | 1.2.2.post1 | +[cachetools](https://pypi.org/project/cachetools) | 5.5.2 | +[certifi](https://pypi.org/project/certifi) | 2025.1.31 | +[cffi](https://pypi.org/project/cffi) | 1.17.1 | +[chardet](https://pypi.org/project/chardet) | 5.2.0 | +[charset-normalizer](https://pypi.org/project/charset-normalizer) | 3.4.0 | +[clarabel](https://pypi.org/project/clarabel) | 0.10.0 | +[click](https://pypi.org/project/click) | 8.1.8 | +[click-default-group](https://pypi.org/project/click-default-group) | 1.2.4 | +[cloudpickle](https://pypi.org/project/cloudpickle) | 3.1.1 | +[cohere](https://pypi.org/project/cohere) | 5.13.12 | +[colorama](https://pypi.org/project/colorama) | 0.4.6 | +[colorcet](https://pypi.org/project/colorcet) | 3.1.0 | +[colorlog](https://pypi.org/project/colorlog) | 6.8.2 | +[comm](https://pypi.org/project/comm) | 0.2.2 | +[contourpy](https://pypi.org/project/contourpy) | 1.3.1 | +[cookiecutter](https://pypi.org/project/cookiecutter) | 2.6.0 | +[cryptography](https://pypi.org/project/cryptography) | 44.0.0 | +[cvxopt](https://pypi.org/project/cvxopt) | 1.3.2 | +[cvxpy](https://pypi.org/project/cvxpy) | 1.6.4 | +[cycler](https://pypi.org/project/cycler) | 0.12.1 | +[cython](https://pypi.org/project/cython) | 3.0.12 | +[cytoolz](https://pypi.org/project/cytoolz) | 1.0.1 | +[dask](https://pypi.org/project/dask) | 2025.3.0 | +[datasette](https://pypi.org/project/datasette) | 0.65.1 | +[datasette-graphql](https://pypi.org/project/datasette-graphql) | 2.2 | +[datashader](https://pypi.org/project/datashader) | 0.17.0 | +[deap](https://pypi.org/project/deap) | 1.4.2 | +[debugpy](https://pypi.org/project/debugpy) | 1.8.0 | +[decorator](https://pypi.org/project/decorator) | 5.1.1 | +[defusedxml](https://pypi.org/project/defusedxml) | 0.7.1 | +[deprecated](https://pypi.org/project/deprecated) | 1.2.14 | +[diff-match-patch](https://pypi.org/project/diff-match-patch) | 20241021 | +[dill](https://pypi.org/project/dill) | 0.3.9 | +[distributed](https://pypi.org/project/distributed) | 2025.3.0 | +[distro](https://pypi.org/project/distro) | 1.8.0 | +[django](https://pypi.org/project/django) | 5.0.7 | +[dnspython](https://pypi.org/project/dnspython) | 2.6.1 | +[docstring-to-markdown](https://pypi.org/project/docstring-to-markdown) | 0.15 | +[docutils](https://pypi.org/project/docutils) | 0.21.2 | +[duckdb](https://pypi.org/project/duckdb) | 1.2.2 | +[entrypoints](https://pypi.org/project/entrypoints) | 0.4 | +[et-xmlfile](https://pypi.org/project/et-xmlfile) | 1.1.0 | +[eval-type-backport](https://pypi.org/project/eval-type-backport) | 0.2.2 | +[executing](https://pypi.org/project/executing) | 2.0.1 | +[faker](https://pypi.org/project/faker) | 36.1.1 | +[fast-histogram](https://pypi.org/project/fast-histogram) | 0.14 | +[fastapi](https://pypi.org/project/fastapi) | 0.115.8 | +[fastavro](https://pypi.org/project/fastavro) | 1.10.0 | +[fastjsonschema](https://pypi.org/project/fastjsonschema) | 2.18.0 | +[filelock](https://pypi.org/project/filelock) | 3.17.0 | +[flake8](https://pypi.org/project/flake8) | 7.1.1 | +[flask](https://pypi.org/project/flask) | 3.1.0 | +[flexcache](https://pypi.org/project/flexcache) | 0.3 | +[flexparser](https://pypi.org/project/flexparser) | 0.4 | +[flit](https://pypi.org/project/flit) | 3.10.1 | +[flit-core](https://pypi.org/project/flit-core) | 3.10.1 | +[folium](https://pypi.org/project/folium) | 0.19.5 | +[fonttools](https://pypi.org/project/fonttools) | 4.55.3 | +[fqdn](https://pypi.org/project/fqdn) | 1.5.1 | +[frozenlist](https://pypi.org/project/frozenlist) | 1.5.0 | +[fsspec](https://pypi.org/project/fsspec) | 2024.6.1 | +[fuzzywuzzy](https://pypi.org/project/fuzzywuzzy) | 0.18.0 | +[geographiclib](https://pypi.org/project/geographiclib) | 2.0 | +[geopandas](https://pypi.org/project/geopandas) | 1.0.1 | +[geopy](https://pypi.org/project/geopy) | 2.4.1 | +[gitdb](https://pypi.org/project/gitdb) | 4.0.10 | +[gitpython](https://pypi.org/project/gitpython) | 3.1.32 | +[google-auth](https://pypi.org/project/google-auth) | 2.37.0 | +[graphene](https://pypi.org/project/graphene) | 3.3 | +[graphql-core](https://pypi.org/project/graphql-core) | 3.2.3 | +[graphql-relay](https://pypi.org/project/graphql-relay) | 3.2.0 | +[greenlet](https://pypi.org/project/greenlet) | 3.1.1 | +[griffe](https://pypi.org/project/griffe) | 1.5.5 | +[groq](https://pypi.org/project/groq) | 0.13.1 | +[guidata](https://pypi.org/project/guidata) | 3.7.1 | +[h11](https://pypi.org/project/h11) | 0.14.0 | +[h2](https://pypi.org/project/h2) | 4.1.0 | +[h5py](https://pypi.org/project/h5py) | 3.12.1 | +[hatchling](https://pypi.org/project/hatchling) | 1.27.0 | +[holoviews](https://pypi.org/project/holoviews) | 1.20.2 | +[hpack](https://pypi.org/project/hpack) | 4.1.0 | +[html5lib](https://pypi.org/project/html5lib) | 1.1 | +[httpcore](https://pypi.org/project/httpcore) | 1.0.5 | +[httpie](https://pypi.org/project/httpie) | 3.2.4 | +[httpx](https://pypi.org/project/httpx) | 0.27.2 | +[httpx-sse](https://pypi.org/project/httpx-sse) | 0.4.0 | +[huggingface-hub](https://pypi.org/project/huggingface-hub) | 0.29.3 | +[hupper](https://pypi.org/project/hupper) | 1.12 | +[hvplot](https://pypi.org/project/hvplot) | 0.11.2 | +[hypercorn](https://pypi.org/project/hypercorn) | 0.17.3 | +[hyperframe](https://pypi.org/project/hyperframe) | 6.1.0 | +[hypothesis](https://pypi.org/project/hypothesis) | 6.130.4 | +[id](https://pypi.org/project/id) | 1.5.0 | +[idna](https://pypi.org/project/idna) | 3.10 | +[imageio](https://pypi.org/project/imageio) | 2.37.0 | +[imagesize](https://pypi.org/project/imagesize) | 1.4.1 | +[imbalanced-learn](https://pypi.org/project/imbalanced-learn) | 0.13.0 | +[importlib-metadata](https://pypi.org/project/importlib-metadata) | 8.6.1 | +[inflection](https://pypi.org/project/inflection) | 0.5.1 | +[iniconfig](https://pypi.org/project/iniconfig) | 2.0.0 | +[intervaltree](https://pypi.org/project/intervaltree) | 3.0.2 | +[ipycanvas](https://pypi.org/project/ipycanvas) | 0.13.3 | +[ipykernel](https://pypi.org/project/ipykernel) | 6.29.5 | +[ipyleaflet](https://pypi.org/project/ipyleaflet) | 0.19.2 | +[ipympl](https://pypi.org/project/ipympl) | 0.9.7 | +[ipython](https://pypi.org/project/ipython) | 8.34.0 | +[ipython-genutils](https://pypi.org/project/ipython-genutils) | 0.2.0 | +[ipython-sql](https://pypi.org/project/ipython-sql) | 0.5.0 | +[ipywidgets](https://pypi.org/project/ipywidgets) | 8.1.6 | +[isoduration](https://pypi.org/project/isoduration) | 20.11.0 | +[isort](https://pypi.org/project/isort) | 5.13.2 | +[itsdangerous](https://pypi.org/project/itsdangerous) | 2.2.0 | +[janus](https://pypi.org/project/janus) | 2.0.0 | +[jaraco-classes](https://pypi.org/project/jaraco-classes) | 3.4.0 | +[jaraco-context](https://pypi.org/project/jaraco-context) | 6.0.1 | +[jaraco-functools](https://pypi.org/project/jaraco-functools) | 4.1.0 | +[jedi](https://pypi.org/project/jedi) | 0.19.2 | +[jellyfish](https://pypi.org/project/jellyfish) | 1.1.3 | +[jinja2](https://pypi.org/project/jinja2) | 3.1.2 | +[jiter](https://pypi.org/project/jiter) | 0.8.2 | +[joblib](https://pypi.org/project/joblib) | 1.4.2 | +[json5](https://pypi.org/project/json5) | 0.9.14 | +[jsonpatch](https://pypi.org/project/jsonpatch) | 1.33 | +[jsonpath-python](https://pypi.org/project/jsonpath-python) | 1.0.6 | +[jsonpointer](https://pypi.org/project/jsonpointer) | 2.4 | +[jsonschema](https://pypi.org/project/jsonschema) | 4.19.2 | +[jsonschema-specifications](https://pypi.org/project/jsonschema-specifications) | 2023.12.1 | +[julia](https://pypi.org/project/julia) | 0.6.2 | +[jupyter](https://pypi.org/project/jupyter) | 1.1.1 | +[jupyter-bokeh](https://pypi.org/project/jupyter-bokeh) | 4.0.5 | +[jupyter-client](https://pypi.org/project/jupyter-client) | 8.6.3 | +[jupyter-console](https://pypi.org/project/jupyter-console) | 6.6.3 | +[jupyter-core](https://pypi.org/project/jupyter-core) | 5.7.2 | +[jupyter-events](https://pypi.org/project/jupyter-events) | 0.12.0 | +[jupyter-leaflet](https://pypi.org/project/jupyter-leaflet) | 0.19.2 | +[jupyter-lsp](https://pypi.org/project/jupyter-lsp) | 2.2.5 | +[jupyter-server](https://pypi.org/project/jupyter-server) | 2.14.2 | +[jupyter-server-terminals](https://pypi.org/project/jupyter-server-terminals) | 0.5.3 | +[jupyterlab](https://pypi.org/project/jupyterlab) | 4.4.1 | +[jupyterlab-pygments](https://pypi.org/project/jupyterlab-pygments) | 0.3.0 | +[jupyterlab-server](https://pypi.org/project/jupyterlab-server) | 2.27.3 | +[jupyterlab-widgets](https://pypi.org/project/jupyterlab-widgets) | 3.0.14 | +[keras](https://pypi.org/project/keras) | 3.9.2 | +[keyring](https://pypi.org/project/keyring) | 25.6.0 | +[kiwisolver](https://pypi.org/project/kiwisolver) | 1.4.8 | +[langchain](https://pypi.org/project/langchain) | 0.3.23 | +[langchain-core](https://pypi.org/project/langchain-core) | 0.3.51 | +[langchain-text-splitters](https://pypi.org/project/langchain-text-splitters) | 0.3.8 | +[langsmith](https://pypi.org/project/langsmith) | 0.3.24 | +[lazy-loader](https://pypi.org/project/lazy-loader) | 0.4 | +[linkify-it-py](https://pypi.org/project/linkify-it-py) | 2.0.2 | +[llvmlite](https://pypi.org/project/llvmlite) | 0.44.0 | +[lmfit](https://pypi.org/project/lmfit) | 1.3.1 | +[locket](https://pypi.org/project/locket) | 1.0.0 | +[logfire-api](https://pypi.org/project/logfire-api) | 3.5.3 | +[lxml](https://pypi.org/project/lxml) | 5.3.0 | +[mako](https://pypi.org/project/mako) | 1.3.5 | +[markdown](https://pypi.org/project/markdown) | 3.7 | +[markdown-it-py](https://pypi.org/project/markdown-it-py) | 2.2.0 | +[markupsafe](https://pypi.org/project/markupsafe) | 3.0.2 | +[matplotlib](https://pypi.org/project/matplotlib) | 3.10.1 | +[matplotlib-inline](https://pypi.org/project/matplotlib-inline) | 0.1.7 | +[maturin](https://pypi.org/project/maturin) | 1.8.1 | +[mccabe](https://pypi.org/project/mccabe) | 0.7.0 | +[mdit-py-plugins](https://pypi.org/project/mdit-py-plugins) | 0.3.5 | +[mdurl](https://pypi.org/project/mdurl) | 0.1.2 | +[mercantile](https://pypi.org/project/mercantile) | 1.2.1 | +[mergedeep](https://pypi.org/project/mergedeep) | 1.3.4 | +[missingno](https://pypi.org/project/missingno) | 0.5.1 | +[mistralai](https://pypi.org/project/mistralai) | 1.2.5 | +[mistune](https://pypi.org/project/mistune) | 2.0.5 | +[mizani](https://pypi.org/project/mizani) | 0.11.4 | +[ml-dtypes](https://pypi.org/project/ml-dtypes) | 0.5.0 | +[mlxtend](https://pypi.org/project/mlxtend) | 0.23.3 | +[more-itertools](https://pypi.org/project/more-itertools) | 10.2.0 | +[mpl-scatter-density](https://pypi.org/project/mpl-scatter-density) | 0.7 | +[mpld3](https://pypi.org/project/mpld3) | 0.5.8 | +[mpmath](https://pypi.org/project/mpmath) | 1.3.0 | +[msal](https://pypi.org/project/msal) | 1.30.0 | +[msal-extensions](https://pypi.org/project/msal-extensions) | 1.2.0 | +[msgpack](https://pypi.org/project/msgpack) | 1.1.0 | +[multidict](https://pypi.org/project/multidict) | 6.1.0 | +[multipledispatch](https://pypi.org/project/multipledispatch) | 1.0.0 | +[mypy](https://pypi.org/project/mypy) | 1.15.0 | +[mypy-extensions](https://pypi.org/project/mypy-extensions) | 1.0.0 | +[mysql-connector-python](https://pypi.org/project/mysql-connector-python) | 9.2.0 | +[namex](https://pypi.org/project/namex) | 0.0.8 | +[narwhals](https://pypi.org/project/narwhals) | 1.30.0 | +[nbclient](https://pypi.org/project/nbclient) | 0.10.0 | +[nbconvert](https://pypi.org/project/nbconvert) | 7.16.1 | +[nbformat](https://pypi.org/project/nbformat) | 5.10.4 | +[nest-asyncio](https://pypi.org/project/nest-asyncio) | 1.6.0 | +[networkx](https://pypi.org/project/networkx) | 3.4.2 | +[nh3](https://pypi.org/project/nh3) | 0.2.18 | +[nltk](https://pypi.org/project/nltk) | 3.9.1 | +[notebook](https://pypi.org/project/notebook) | 7.4.0 | +[notebook-shim](https://pypi.org/project/notebook-shim) | 0.2.4 | +[numba](https://pypi.org/project/numba) | 0.61.2 | +[numpy](https://pypi.org/project/numpy) | 2.2.4 | +[numpydoc](https://pypi.org/project/numpydoc) | 1.6.0 | +[openai](https://pypi.org/project/openai) | 1.72.0 | +[opencv-python](https://pypi.org/project/opencv-python) | 4.11.0.86 | +[openpyxl](https://pypi.org/project/openpyxl) | 3.1.2 | +[optree](https://pypi.org/project/optree) | 0.14.0 | +[optuna](https://pypi.org/project/optuna) | 3.6.1 | +[orjson](https://pypi.org/project/orjson) | 3.10.12 | +[osqp](https://pypi.org/project/osqp) | 0.6.7.post3 | +[outcome](https://pypi.org/project/outcome) | 1.3.0.post0 | +[overrides](https://pypi.org/project/overrides) | 7.7.0 | +[packaging](https://pypi.org/project/packaging) | 24.2 | +[pandas](https://pypi.org/project/pandas) | 2.2.3 | +[pandocfilters](https://pypi.org/project/pandocfilters) | 1.5.0 | +[panel](https://pypi.org/project/panel) | 1.6.2 | +[papermill](https://pypi.org/project/papermill) | 2.6.0 | +[param](https://pypi.org/project/param) | 2.2.0 | +[parso](https://pypi.org/project/parso) | 0.8.4 | +[partd](https://pypi.org/project/partd) | 1.4.0 | +[pathspec](https://pypi.org/project/pathspec) | 0.11.0 | +[patsy](https://pypi.org/project/patsy) | 0.5.6 | +[pep8](https://pypi.org/project/pep8) | 1.7.1 | +[pexpect](https://pypi.org/project/pexpect) | 4.8.0 | +[pg8000](https://pypi.org/project/pg8000) | 1.23.0 | +[pickleshare](https://pypi.org/project/pickleshare) | 0.7.5 | +[pillow](https://pypi.org/project/pillow) | 11.1.0 | +[pip](https://pypi.org/project/pip) | 25.0.1 | +[platformdirs](https://pypi.org/project/platformdirs) | 4.3.6 | +[plotly](https://pypi.org/project/plotly) | 6.0.1 | +[plotnine](https://pypi.org/project/plotnine) | 0.13.6 | +[plotpy](https://pypi.org/project/plotpy) | 2.7.2 | +[pluggy](https://pypi.org/project/pluggy) | 1.5.0 | +[ply](https://pypi.org/project/ply) | 3.11 | +[polars](https://pypi.org/project/polars) | 1.27.1 | +[portalocker](https://pypi.org/project/portalocker) | 2.7.0 | +[prettytable](https://pypi.org/project/prettytable) | 3.3.0 | +[prince](https://pypi.org/project/prince) | 0.15.0 | +[priority](https://pypi.org/project/priority) | 2.0.0 | +[prometheus-client](https://pypi.org/project/prometheus-client) | 0.21.1 | +[prompt-toolkit](https://pypi.org/project/prompt-toolkit) | 3.0.50 | +[propcache](https://pypi.org/project/propcache) | 0.2.1 | +[protobuf](https://pypi.org/project/protobuf) | 5.27.3 | +[psutil](https://pypi.org/project/psutil) | 5.9.8 | +[psygnal](https://pypi.org/project/psygnal) | 0.11.1 | +[ptpython](https://pypi.org/project/ptpython) | 3.0.29 | +[ptyprocess](https://pypi.org/project/ptyprocess) | 0.7.0 | +[pure-eval](https://pypi.org/project/pure-eval) | 0.2.2 | +[pyarrow](https://pypi.org/project/pyarrow) | 19.0.1 | +[pyasn1](https://pypi.org/project/pyasn1) | 0.6.1 | +[pyasn1-modules](https://pypi.org/project/pyasn1-modules) | 0.4.1 | +[pybind11](https://pypi.org/project/pybind11) | 2.13.6 | +[pycodestyle](https://pypi.org/project/pycodestyle) | 2.12.0 | +[pycparser](https://pypi.org/project/pycparser) | 2.22 | +[pyct](https://pypi.org/project/pyct) | 0.5.0 | +[pydantic](https://pypi.org/project/pydantic) | 2.10.6 | +[pydantic-ai](https://pypi.org/project/pydantic-ai) | 0.0.24 | +[pydantic-ai-slim](https://pypi.org/project/pydantic-ai-slim) | 0.0.24 | +[pydantic-core](https://pypi.org/project/pydantic-core) | 2.27.2 | +[pydantic-graph](https://pypi.org/project/pydantic-graph) | 0.0.24 | +[pydeck](https://pypi.org/project/pydeck) | 0.9.1 | +[pydocstyle](https://pypi.org/project/pydocstyle) | 6.3.0 | +[pydub](https://pypi.org/project/pydub) | 0.25.1 | +[pyerfa](https://pypi.org/project/pyerfa) | 2.0.1.4 | +[pyflakes](https://pypi.org/project/pyflakes) | 3.2.0 | +[pygithub](https://pypi.org/project/pygithub) | 2.6.1 | +[pygments](https://pypi.org/project/pygments) | 2.19.1 | +[pyjwt](https://pypi.org/project/pyjwt) | 2.10.1 | +[pylint](https://pypi.org/project/pylint) | 3.1.0 | +[pylint-venv](https://pypi.org/project/pylint-venv) | 3.0.3 | +[pyls-spyder](https://pypi.org/project/pyls-spyder) | 0.4.0 | +[pymongo](https://pypi.org/project/pymongo) | 4.10.1 | +[pympler](https://pypi.org/project/pympler) | 1.1 | +[pynacl](https://pypi.org/project/pynacl) | 1.5.0 | +[pynndescent](https://pypi.org/project/pynndescent) | 0.5.12 | +[pyodbc](https://pypi.org/project/pyodbc) | 5.2.0 | +[pyogrio](https://pypi.org/project/pyogrio) | 0.10.0 | +[pyomo](https://pypi.org/project/pyomo) | 6.9.1 | +[pypandoc](https://pypi.org/project/pypandoc) | 1.15 | +[pyparsing](https://pypi.org/project/pyparsing) | 3.2.1 | +[pypdf](https://pypi.org/project/pypdf) | 5.1.0 | +[pyproj](https://pypi.org/project/pyproj) | 3.7.0 | +[pyproject-hooks](https://pypi.org/project/pyproject-hooks) | 1.1.0 | +[pyqt5](https://pypi.org/project/pyqt5) | 5.15.10 | +[pyqt5-qt5](https://pypi.org/project/pyqt5-qt5) | 5.15.2 | +[pyqt5-sip](https://pypi.org/project/pyqt5-sip) | 12.16.1 | +[pyqtgraph](https://pypi.org/project/pyqtgraph) | 0.13.7 | +[pyqtwebengine](https://pypi.org/project/pyqtwebengine) | 5.15.6 | +[pyqtwebengine-qt5](https://pypi.org/project/pyqtwebengine-qt5) | 5.15.2 | +[pyserial](https://pypi.org/project/pyserial) | 3.5 | +[pysocks](https://pypi.org/project/pysocks) | 1.7.1 | +[pyspnego](https://pypi.org/project/pyspnego) | 0.11.2 | +[pytest](https://pypi.org/project/pytest) | 8.3.4 | +[python-barcode](https://pypi.org/project/python-barcode) | 0.15.1 | +[python-dateutil](https://pypi.org/project/python-dateutil) | 2.8.2 | +[python-dotenv](https://pypi.org/project/python-dotenv) | 1.0.1 | +[python-json-logger](https://pypi.org/project/python-json-logger) | 2.0.7 | +[python-lsp-black](https://pypi.org/project/python-lsp-black) | 2.0.0 | +[python-lsp-jsonrpc](https://pypi.org/project/python-lsp-jsonrpc) | 1.1.2 | +[python-lsp-server](https://pypi.org/project/python-lsp-server) | 1.12.0 | +[python-multipart](https://pypi.org/project/python-multipart) | 0.0.9 | +[python-slugify](https://pypi.org/project/python-slugify) | 8.0.4 | +[pythonqwt](https://pypi.org/project/pythonqwt) | 0.14.4 | +[pytoolconfig](https://pypi.org/project/pytoolconfig) | 1.3.1 | +[pytz](https://pypi.org/project/pytz) | 2024.2 | +[pyuca](https://pypi.org/project/pyuca) | 1.2 | +[pyusb](https://pypi.org/project/pyusb) | 1.3.1 | +[pyviz-comms](https://pypi.org/project/pyviz-comms) | 3.0.3 | +[pywavelets](https://pypi.org/project/pywavelets) | 1.8.0 | +[pywin32](https://pypi.org/project/pywin32) | 308 | +[pywin32-ctypes](https://pypi.org/project/pywin32-ctypes) | 0.2.2 | +[pywinpty](https://pypi.org/project/pywinpty) | 2.0.14 | +[pyyaml](https://pypi.org/project/pyyaml) | 6.0.2 | +[pyzmq](https://pypi.org/project/pyzmq) | 26.2.1 | +[qdarkstyle](https://pypi.org/project/qdarkstyle) | 3.2.3 | +[qdldl](https://pypi.org/project/qdldl) | 0.1.7.post5 | +[qrcode](https://pypi.org/project/qrcode) | 8.0 | +[qstylizer](https://pypi.org/project/qstylizer) | 0.2.2 | +[qtawesome](https://pypi.org/project/qtawesome) | 1.4.0 | +[qtconsole](https://pypi.org/project/qtconsole) | 5.6.1 | +[qtpy](https://pypi.org/project/qtpy) | 2.4.1 | +[quantecon](https://pypi.org/project/quantecon) | 0.7.2 | +[quart](https://pypi.org/project/quart) | 0.20.0 | +[rapidfuzz](https://pypi.org/project/rapidfuzz) | 3.9.6 | +[readme-renderer](https://pypi.org/project/readme-renderer) | 44.0 | +[redis](https://pypi.org/project/redis) | 5.0.8 | +[referencing](https://pypi.org/project/referencing) | 0.35.1 | +[regex](https://pypi.org/project/regex) | 2024.11.6 | +[reportlab](https://pypi.org/project/reportlab) | 4.2.5 | +[requests](https://pypi.org/project/requests) | 2.32.3 | +[requests-ntlm](https://pypi.org/project/requests-ntlm) | 1.3.0 | +[requests-toolbelt](https://pypi.org/project/requests-toolbelt) | 1.0.0 | +[rfc3339-validator](https://pypi.org/project/rfc3339-validator) | 0.1.4 | +[rfc3986](https://pypi.org/project/rfc3986) | 2.0.0 | +[rfc3986-validator](https://pypi.org/project/rfc3986-validator) | 0.1.1 | +[rich](https://pypi.org/project/rich) | 13.9.4 | +[rope](https://pypi.org/project/rope) | 1.12.0 | +[rpds-py](https://pypi.org/project/rpds-py) | 0.22.3 | +[rsa](https://pypi.org/project/rsa) | 4.7.2 | +[rtree](https://pypi.org/project/rtree) | 1.3.0 | +[rx](https://pypi.org/project/rx) | 3.2.0 | +[scikit-image](https://pypi.org/project/scikit-image) | 0.25.2 | +[scikit-learn](https://pypi.org/project/scikit-learn) | 1.6.1 | +[scipy](https://pypi.org/project/scipy) | 1.15.2 | +[scramp](https://pypi.org/project/scramp) | 1.4.5 | +[scs](https://pypi.org/project/scs) | 3.2.7.post2 | +[seaborn](https://pypi.org/project/seaborn) | 0.13.2 | +[send2trash](https://pypi.org/project/send2trash) | 1.8.3 | +[setuptools](https://pypi.org/project/setuptools) | 75.8.2 | +[shapely](https://pypi.org/project/shapely) | 2.0.6 | +[shellingham](https://pypi.org/project/shellingham) | 1.5.4 | +[simplejson](https://pypi.org/project/simplejson) | 3.19.3 | +[simpy](https://pypi.org/project/simpy) | 4.1.1 | +[six](https://pypi.org/project/six) | 1.16.0 | +[sklearn-compat](https://pypi.org/project/sklearn-compat) | 0.1.3 | +[skrub](https://pypi.org/project/skrub) | 0.5.1 | +[smmap](https://pypi.org/project/smmap) | 5.0.0 | +[sniffio](https://pypi.org/project/sniffio) | 1.3.0 | +[snowballstemmer](https://pypi.org/project/snowballstemmer) | 2.2.0 | +[sortedcontainers](https://pypi.org/project/sortedcontainers) | 2.4.0 | +[sounddevice](https://pypi.org/project/sounddevice) | 0.5.1 | +[soupsieve](https://pypi.org/project/soupsieve) | 2.6 | +[sphinx](https://pypi.org/project/sphinx) | 7.3.7 | +[sphinx-rtd-theme](https://pypi.org/project/sphinx-rtd-theme) | 3.0.2 | +[sphinxcontrib-applehelp](https://pypi.org/project/sphinxcontrib-applehelp) | 2.0.0 | +[sphinxcontrib-devhelp](https://pypi.org/project/sphinxcontrib-devhelp) | 2.0.0 | +[sphinxcontrib-htmlhelp](https://pypi.org/project/sphinxcontrib-htmlhelp) | 2.1.0 | +[sphinxcontrib-jquery](https://pypi.org/project/sphinxcontrib-jquery) | 4.1 | +[sphinxcontrib-jsmath](https://pypi.org/project/sphinxcontrib-jsmath) | 1.0.1 | +[sphinxcontrib-qthelp](https://pypi.org/project/sphinxcontrib-qthelp) | 2.0.0 | +[sphinxcontrib-serializinghtml](https://pypi.org/project/sphinxcontrib-serializinghtml) | 2.0.0 | +[spyder](https://pypi.org/project/spyder) | 6.0.5 | +[spyder-kernels](https://pypi.org/project/spyder-kernels) | 3.0.3 | +[sqlalchemy](https://pypi.org/project/sqlalchemy) | 2.0.38 | +[sqlite-bro](https://pypi.org/project/sqlite-bro) | 0.13.1 | +[sqlite-fts4](https://pypi.org/project/sqlite-fts4) | 1.0.3 | +[sqlite-utils](https://pypi.org/project/sqlite-utils) | 3.38 | +[sqlparse](https://pypi.org/project/sqlparse) | 0.5.3 | +[squarify](https://pypi.org/project/squarify) | 0.4.4 | +[sspilib](https://pypi.org/project/sspilib) | 0.2.0 | +[stack-data](https://pypi.org/project/stack-data) | 0.6.3 | +[starlette](https://pypi.org/project/starlette) | 0.45.3 | +[statsmodels](https://pypi.org/project/statsmodels) | 0.14.4 | +[streamlit](https://pypi.org/project/streamlit) | 1.44.0 | +[superqt](https://pypi.org/project/superqt) | 0.7.1 | +[sv-ttk](https://pypi.org/project/sv-ttk) | 2.6.0 | +[sympy](https://pypi.org/project/sympy) | 1.13.3 | +[tabulate](https://pypi.org/project/tabulate) | 0.9.0 | +[tblib](https://pypi.org/project/tblib) | 3.0.0 | +[tenacity](https://pypi.org/project/tenacity) | 9.0.0 | +[termcolor](https://pypi.org/project/termcolor) | 2.5.0 | +[terminado](https://pypi.org/project/terminado) | 0.18.1 | +[text-unidecode](https://pypi.org/project/text-unidecode) | 1.3 | +[textdistance](https://pypi.org/project/textdistance) | 4.6.3 | +[thefuzz](https://pypi.org/project/thefuzz) | 0.22.1 | +[threadpoolctl](https://pypi.org/project/threadpoolctl) | 3.5.0 | +[three-merge](https://pypi.org/project/three-merge) | 0.1.1 | +[tifffile](https://pypi.org/project/tifffile) | 2025.1.10 | +[tiktoken](https://pypi.org/project/tiktoken) | 0.8.0 | +[tinycss2](https://pypi.org/project/tinycss2) | 1.4.0 | +[tokenizers](https://pypi.org/project/tokenizers) | 0.21.0 | +[toml](https://pypi.org/project/toml) | 0.10.2 | +[tomli](https://pypi.org/project/tomli) | 2.2.1 | +[tomli-w](https://pypi.org/project/tomli-w) | 1.2.0 | +[tomlkit](https://pypi.org/project/tomlkit) | 0.13.2 | +[toolz](https://pypi.org/project/toolz) | 1.0.0 | +[tornado](https://pypi.org/project/tornado) | 6.4.2 | +[tqdm](https://pypi.org/project/tqdm) | 4.66.4 | +[traitlets](https://pypi.org/project/traitlets) | 5.14.1 | +[traittypes](https://pypi.org/project/traittypes) | 0.2.1 | +[trio](https://pypi.org/project/trio) | 0.29.0 | +[trove-classifiers](https://pypi.org/project/trove-classifiers) | 2024.10.21.16 | +[twine](https://pypi.org/project/twine) | 6.1.0 | +[typer](https://pypi.org/project/typer) | 0.15.2 | +[types-python-dateutil](https://pypi.org/project/types-python-dateutil) | 2.9.0.20240316 | +[types-requests](https://pypi.org/project/types-requests) | 2.32.0.20241016 | +[typing-extensions](https://pypi.org/project/typing-extensions) | 4.12.2 | +[typing-inspect](https://pypi.org/project/typing-inspect) | 0.9.0 | +[tzdata](https://pypi.org/project/tzdata) | 2024.1 | +[tzlocal](https://pypi.org/project/tzlocal) | 5.2 | +[uc-micro-py](https://pypi.org/project/uc-micro-py) | 1.0.1 | +[ujson](https://pypi.org/project/ujson) | 5.10.0 | +[umap-learn](https://pypi.org/project/umap-learn) | 0.5.6 | +[uncertainties](https://pypi.org/project/uncertainties) | 3.2.2 | +[uri-template](https://pypi.org/project/uri-template) | 1.3.0 | +[urllib3](https://pypi.org/project/urllib3) | 2.2.3 | +[uvicorn](https://pypi.org/project/uvicorn) | 0.34.0 | +[vega-datasets](https://pypi.org/project/vega-datasets) | 0.9.0 | +[waitress](https://pypi.org/project/waitress) | 3.0.0 | +[watchdog](https://pypi.org/project/watchdog) | 6.0.0 | +[wcwidth](https://pypi.org/project/wcwidth) | 0.2.13 | +[webcolors](https://pypi.org/project/webcolors) | 24.11.1 | +[webencodings](https://pypi.org/project/webencodings) | 0.5.1 | +[websocket-client](https://pypi.org/project/websocket-client) | 1.8.0 | +[werkzeug](https://pypi.org/project/werkzeug) | 3.1.3 | +[whatthepatch](https://pypi.org/project/whatthepatch) | 1.0.7 | +[wheel](https://pypi.org/project/wheel) | 0.45.1 | +[widgetsnbextension](https://pypi.org/project/widgetsnbextension) | 4.0.14 | +[winpython](https://pypi.org/project/winpython) | 15.3.20250425 | +[wordcloud](https://pypi.org/project/wordcloud) | 1.9.4 | +[wrapt](https://pypi.org/project/wrapt) | 1.16.0 | +[wsproto](https://pypi.org/project/wsproto) | 1.2.0 | +[xarray](https://pypi.org/project/xarray) | 2025.3.0 | +[xlsxwriter](https://pypi.org/project/xlsxwriter) | 3.1.9 | +[xyzservices](https://pypi.org/project/xyzservices) | 2023.10.1 | +[yapf](https://pypi.org/project/yapf) | 0.40.1 | +[yarl](https://pypi.org/project/yarl) | 1.18.3 | +[yt-dlp](https://pypi.org/project/yt-dlp) | 2025.2.19 | +[zict](https://pypi.org/project/zict) | 3.0.0 | +[zipp](https://pypi.org/project/zipp) | 3.21.0 | +[zstandard](https://pypi.org/project/zstandard) | 0.23.0 | + +
    diff --git a/changelogs/WinPythonslim-64bit-3.12.10.0_History.md b/changelogs/WinPythonslim-64bit-3.12.10.0_History.md new file mode 100644 index 00000000..bc4168ea --- /dev/null +++ b/changelogs/WinPythonslim-64bit-3.12.10.0_History.md @@ -0,0 +1,147 @@ +## History of changes for WinPython-64bit 3.12.10.0slim + +The following changes were made to WinPython-64bit distribution since version 3.12.9.0slim. + +
    + +### Tools + +New packages: + + * [Pandoc](https://pandoc.org) 3.1.9 (an universal document converter) + +### Python packages + +New packages: + + * [asyncssh](https://pypi.org/project/asyncssh) 2.20.0 () + * [deprecated](https://pypi.org/project/deprecated) 1.2.14 () + * [flexcache](https://pypi.org/project/flexcache) 0.3 () + * [flexparser](https://pypi.org/project/flexparser) 0.4 () + * [id](https://pypi.org/project/id) 1.5.0 () + * [pygithub](https://pypi.org/project/pygithub) 2.6.1 () + * [pyuca](https://pypi.org/project/pyuca) 1.2 () + * [shellingham](https://pypi.org/project/shellingham) 1.5.4 () + * [skrub](https://pypi.org/project/skrub) 0.5.1 () + * [superqt](https://pypi.org/project/superqt) 0.7.1 () + * [sv-ttk](https://pypi.org/project/sv-ttk) 2.6.0 () + * [typer](https://pypi.org/project/typer) 0.15.2 () + * [wrapt](https://pypi.org/project/wrapt) 1.16.0 () + +Upgraded packages: + + * [alembic](https://pypi.org/project/alembic) 1.13.1 → 1.15.1 () + * [anthropic](https://pypi.org/project/anthropic) 0.42.0 → 0.49.0 () + * [anyio](https://pypi.org/project/anyio) 4.7.0 → 4.8.0 () + * [array-api-compat](https://pypi.org/project/array-api-compat) 1.10.0 → 1.11.1 () + * [azure-core](https://pypi.org/project/azure-core) 1.30.2 → 1.32.0 () + * [azure-cosmos](https://pypi.org/project/azure-cosmos) 4.7.0 → 4.9.0 () + * [azure-identity](https://pypi.org/project/azure-identity) 1.16.1 → 1.21.0 () + * [black](https://pypi.org/project/black) 24.10.0 → 25.1.0 () + * [bokeh](https://pypi.org/project/bokeh) 3.6.3 → 3.7.2 () + * [cachetools](https://pypi.org/project/cachetools) 5.4.0 → 5.5.2 () + * [certifi](https://pypi.org/project/certifi) 2024.6.2 → 2025.1.31 () + * [click](https://pypi.org/project/click) 8.1.7 → 8.1.8 () + * [cloudpickle](https://pypi.org/project/cloudpickle) 3.0.0 → 3.1.1 () + * [cvxpy](https://pypi.org/project/cvxpy) 1.6.0 → 1.6.4 () + * [cython](https://pypi.org/project/cython) 3.0.11 → 3.0.12 () + * [dask](https://pypi.org/project/dask) 2024.12.1 → 2025.3.0 () + * [datasette](https://pypi.org/project/datasette) 0.64.8 → 0.65.1 () + * [datashader](https://pypi.org/project/datashader) 0.16.3 → 0.17.0 () + * [diff-match-patch](https://pypi.org/project/diff-match-patch) 20230430 → 20241021 () + * [distributed](https://pypi.org/project/distributed) 2024.12.1 → 2025.3.0 () + * [docstring-to-markdown](https://pypi.org/project/docstring-to-markdown) 0.13 → 0.15 () + * [duckdb](https://pypi.org/project/duckdb) 1.2.0 → 1.2.2 () + * [faker](https://pypi.org/project/faker) 33.3.1 → 36.1.1 () + * [fastapi](https://pypi.org/project/fastapi) 0.115.6 → 0.115.8 () + * [filelock](https://pypi.org/project/filelock) 3.14.0 → 3.17.0 () + * [folium](https://pypi.org/project/folium) 0.18.0 → 0.19.5 () + * [holoviews](https://pypi.org/project/holoviews) 1.20.0 → 1.20.2 () + * [hpack](https://pypi.org/project/hpack) 4.0.0 → 4.1.0 () + * [huggingface-hub](https://pypi.org/project/huggingface-hub) 0.28.1 → 0.29.3 () + * [hypercorn](https://pypi.org/project/hypercorn) 0.16.0 → 0.17.3 () + * [hyperframe](https://pypi.org/project/hyperframe) 6.0.1 → 6.1.0 () + * [hypothesis](https://pypi.org/project/hypothesis) 6.122.3 → 6.130.4 () + * [idna](https://pypi.org/project/idna) 3.7 → 3.10 () + * [imageio](https://pypi.org/project/imageio) 2.33.1 → 2.37.0 () + * [importlib-metadata](https://pypi.org/project/importlib-metadata) 7.1.0 → 8.6.1 () + * [ipympl](https://pypi.org/project/ipympl) 0.9.6 → 0.9.7 () + * [ipython](https://pypi.org/project/ipython) 8.32.0 → 8.34.0 () + * [ipywidgets](https://pypi.org/project/ipywidgets) 8.1.5 → 8.1.6 () + * [jupyter-client](https://pypi.org/project/jupyter-client) 8.6.2 → 8.6.3 () + * [jupyter-events](https://pypi.org/project/jupyter-events) 0.10.0 → 0.12.0 () + * [jupyterlab](https://pypi.org/project/jupyterlab) 4.3.5 → 4.4.1 () + * [jupyterlab-widgets](https://pypi.org/project/jupyterlab-widgets) 3.0.13 → 3.0.14 () + * [keras](https://pypi.org/project/keras) 3.8.0 → 3.9.2 () + * [langchain](https://pypi.org/project/langchain) 0.3.18 → 0.3.23 () + * [langchain-core](https://pypi.org/project/langchain-core) 0.3.34 → 0.3.51 () + * [langchain-text-splitters](https://pypi.org/project/langchain-text-splitters) 0.3.6 → 0.3.8 () + * [langsmith](https://pypi.org/project/langsmith) 0.2.11 → 0.3.24 () + * [markdown](https://pypi.org/project/markdown) 3.5.1 → 3.7 () + * [matplotlib](https://pypi.org/project/matplotlib) 3.10.0 → 3.10.1 () + * [mypy](https://pypi.org/project/mypy) 1.14.0 → 1.15.0 () + * [mysql-connector-python](https://pypi.org/project/mysql-connector-python) 8.0.21 → 9.2.0 () + * [narwhals](https://pypi.org/project/narwhals) 1.21.1 → 1.30.0 () + * [notebook](https://pypi.org/project/notebook) 7.3.1 → 7.4.0 () + * [numba](https://pypi.org/project/numba) 0.61.0 → 0.61.2 () + * [numpy](https://pypi.org/project/numpy) 2.1.3 → 2.2.4 () + * [openai](https://pypi.org/project/openai) 1.61.1 → 1.72.0 () + * [opencv-python](https://pypi.org/project/opencv-python) 4.10.0.84 → 4.11.0.86 () + * [optree](https://pypi.org/project/optree) 0.13.1 → 0.14.0 () + * [panel](https://pypi.org/project/panel) 1.6.0 → 1.6.2 () + * [param](https://pypi.org/project/param) 2.1.1 → 2.2.0 () + * [pip](https://pypi.org/project/pip) 24.3.1 → 25.0.1 () + * [platformdirs](https://pypi.org/project/platformdirs) 4.2.2 → 4.3.6 () + * [plotly](https://pypi.org/project/plotly) 5.24.1 → 6.0.1 () + * [polars](https://pypi.org/project/polars) 1.22.0 → 1.27.1 () + * [prometheus-client](https://pypi.org/project/prometheus-client) 0.18.0 → 0.21.1 () + * [prompt-toolkit](https://pypi.org/project/prompt-toolkit) 3.0.48 → 3.0.50 () + * [pyarrow](https://pypi.org/project/pyarrow) 19.0.0 → 19.0.1 () + * [pyasn1](https://pypi.org/project/pyasn1) 0.4.8 → 0.6.1 () + * [pyasn1-modules](https://pypi.org/project/pyasn1-modules) 0.2.8 → 0.4.1 () + * [pyjwt](https://pypi.org/project/pyjwt) 2.8.0 → 2.10.1 () + * [pympler](https://pypi.org/project/pympler) 1.0.1 → 1.1 () + * [pyomo](https://pypi.org/project/pyomo) 6.8.2 → 6.9.1 () + * [pypandoc](https://pypi.org/project/pypandoc) 1.5 → 1.15 () + * [pytest](https://pypi.org/project/pytest) 8.2.2 → 8.3.4 () + * [Python](http://www.python.org/) 3.12.9 → 3.12.10 (Python programming language with standard library) + * [pytz](https://pypi.org/project/pytz) 2024.1 → 2024.2 () + * [pyzmq](https://pypi.org/project/pyzmq) 26.2.0 → 26.2.1 () + * [qtawesome](https://pypi.org/project/qtawesome) 1.3.1 → 1.4.0 () + * [qtconsole](https://pypi.org/project/qtconsole) 5.5.2 → 5.6.1 () + * [quart](https://pypi.org/project/quart) 0.19.4 → 0.20.0 () + * [rtree](https://pypi.org/project/rtree) 1.1.0 → 1.3.0 () + * [rx](https://pypi.org/project/rx) 3.1.1 → 3.2.0 () + * [scikit-image](https://pypi.org/project/scikit-image) 0.25.0 → 0.25.2 () + * [scipy](https://pypi.org/project/scipy) 1.15.1 → 1.15.2 () + * [send2trash](https://pypi.org/project/send2trash) 1.8.2 → 1.8.3 () + * [setuptools](https://pypi.org/project/setuptools) 75.6.0 → 75.8.2 () + * [simpy](https://pypi.org/project/simpy) 4.0.1 → 4.1.1 () + * [spyder](https://pypi.org/project/spyder) 5.5.6 → 6.0.5 () + * [spyder-kernels](https://pypi.org/project/spyder-kernels) 2.5.2 → 3.0.3 () + * [sqlalchemy](https://pypi.org/project/sqlalchemy) 2.0.35 → 2.0.38 () + * [starlette](https://pypi.org/project/starlette) 0.41.3 → 0.45.3 () + * [streamlit](https://pypi.org/project/streamlit) 1.41.1 → 1.44.0 () + * [tomli-w](https://pypi.org/project/tomli-w) 1.1.0 → 1.2.0 () + * [trio](https://pypi.org/project/trio) 0.28.0 → 0.29.0 () + * [twine](https://pypi.org/project/twine) 6.0.1 → 6.1.0 () + * [widgetsnbextension](https://pypi.org/project/widgetsnbextension) 4.0.13 → 4.0.14 () + * [winpython](https://pypi.org/project/winpython) 13.1.20250222 → 15.3.20250425 () + * [xarray](https://pypi.org/project/xarray) 2025.1.1 → 2025.3.0 () + * [yt-dlp](https://pypi.org/project/yt-dlp) 2023.7.6 → 2025.2.19 () + +Removed packages: + + * [bcrypt](https://pypi.org/project/bcrypt) 4.0.1 (Modern password hashing for your software and your servers) + * [dask_expr](https://pypi.org/project/dask_expr) 1.1.21 (High Level Expressions for Dask ) + * [mutagen](https://pypi.org/project/mutagen) 1.47.0 (read and write audio tags for many formats) + * [paramiko](https://pypi.org/project/paramiko) 2.8.0 (SSH2 protocol library) + * [pint](https://pypi.org/project/pint) 0.23 (Physical quantities module) + * [pkginfo](https://pypi.org/project/pkginfo) 1.11.2 (Query metadata from sdists / bdists / installed packages.) + * [pycryptodomex](https://pypi.org/project/pycryptodomex) 3.20.0 (Cryptographic library for Python) + * [streamz](https://pypi.org/project/streamz) 0.6.3 (Streams) + * [websockets](https://pypi.org/project/websockets) 14.2 (An implementation of the WebSocket Protocol (RFC 6455 & 7692)) + + +
    +* * * diff --git a/changelogs/WinPythonslim-64bit-3.13.3.0.md b/changelogs/WinPythonslim-64bit-3.13.3.0.md new file mode 100644 index 00000000..d0a2202d --- /dev/null +++ b/changelogs/WinPythonslim-64bit-3.13.3.0.md @@ -0,0 +1,515 @@ +## WinPython 3.13.3.0slim + +The following packages are included in WinPython-64bit v3.13.3.0slim . + +
    + +### Tools + +Name | Version | Description +-----|---------|------------ +[Pandoc](https://pandoc.org) | 3.1.9 | an universal document converter + +### Python packages + +Name | Version | Description +-----|---------|------------ +[Python](http://www.python.org/) | 3.13.3 | Python programming language with standard library +[absl-py](https://pypi.org/project/absl-py) | 2.0.0 | +[adbc-driver-manager](https://pypi.org/project/adbc-driver-manager) | 1.3.0 | +[aiofiles](https://pypi.org/project/aiofiles) | 23.2.1 | +[aiohappyeyeballs](https://pypi.org/project/aiohappyeyeballs) | 2.4.4 | +[aiohttp](https://pypi.org/project/aiohttp) | 3.11.11 | +[aiosignal](https://pypi.org/project/aiosignal) | 1.3.1 | +[aiosqlite](https://pypi.org/project/aiosqlite) | 0.20.0 | +[alabaster](https://pypi.org/project/alabaster) | 0.7.16 | +[alembic](https://pypi.org/project/alembic) | 1.15.1 | +[altair](https://pypi.org/project/altair) | 5.5.0 | +[aniso8601](https://pypi.org/project/aniso8601) | 9.0.1 | +[annotated-types](https://pypi.org/project/annotated-types) | 0.6.0 | +[ansicolors](https://pypi.org/project/ansicolors) | 1.1.8 | +[anthropic](https://pypi.org/project/anthropic) | 0.49.0 | +[anyio](https://pypi.org/project/anyio) | 4.8.0 | +[anywidget](https://pypi.org/project/anywidget) | 0.9.12 | +[appdirs](https://pypi.org/project/appdirs) | 1.4.4 | +[argon2-cffi](https://pypi.org/project/argon2-cffi) | 23.1.0 | +[argon2-cffi-bindings](https://pypi.org/project/argon2-cffi-bindings) | 21.2.0 | +[array-api-compat](https://pypi.org/project/array-api-compat) | 1.11.1 | +[arrow](https://pypi.org/project/arrow) | 1.3.0 | +[asgi-csrf](https://pypi.org/project/asgi-csrf) | 0.9 | +[asgiref](https://pypi.org/project/asgiref) | 3.8.1 | +[asn1crypto](https://pypi.org/project/asn1crypto) | 1.5.1 | +[asteval](https://pypi.org/project/asteval) | 0.9.31 | +[astroid](https://pypi.org/project/astroid) | 3.1.0 | +[astropy](https://pypi.org/project/astropy) | 6.1.6 | +[astropy-iers-data](https://pypi.org/project/astropy-iers-data) | 0.2024.12.23.0.33.24 | +[asttokens](https://pypi.org/project/asttokens) | 2.4.1 | +[async-lru](https://pypi.org/project/async-lru) | 2.0.4 | +[asyncssh](https://pypi.org/project/asyncssh) | 2.20.0 | +[atomicwrites](https://pypi.org/project/atomicwrites) | 1.4.0 | +[attrs](https://pypi.org/project/attrs) | 23.2.0 | +[autopep8](https://pypi.org/project/autopep8) | 2.0.4 | +[azure-core](https://pypi.org/project/azure-core) | 1.32.0 | +[azure-cosmos](https://pypi.org/project/azure-cosmos) | 4.9.0 | +[azure-identity](https://pypi.org/project/azure-identity) | 1.21.0 | +[babel](https://pypi.org/project/babel) | 2.16.0 | +[baresql](https://pypi.org/project/baresql) | 1.0.0 | +[beautifulsoup4](https://pypi.org/project/beautifulsoup4) | 4.12.2 | +[binaryornot](https://pypi.org/project/binaryornot) | 0.4.4 | +[black](https://pypi.org/project/black) | 25.1.0 | +[bleach](https://pypi.org/project/bleach) | 6.1.0 | +[blinker](https://pypi.org/project/blinker) | 1.9.0 | +[bokeh](https://pypi.org/project/bokeh) | 3.7.2 | +[branca](https://pypi.org/project/branca) | 0.8.0 | +[brotli](https://pypi.org/project/brotli) | 1.1.0 | +[build](https://pypi.org/project/build) | 1.2.2.post1 | +[cachetools](https://pypi.org/project/cachetools) | 5.5.2 | +[certifi](https://pypi.org/project/certifi) | 2025.1.31 | +[cffi](https://pypi.org/project/cffi) | 1.17.1 | +[chardet](https://pypi.org/project/chardet) | 5.2.0 | +[charset-normalizer](https://pypi.org/project/charset-normalizer) | 3.4.0 | +[clarabel](https://pypi.org/project/clarabel) | 0.10.0 | +[click](https://pypi.org/project/click) | 8.1.8 | +[click-default-group](https://pypi.org/project/click-default-group) | 1.2.4 | +[cloudpickle](https://pypi.org/project/cloudpickle) | 3.1.1 | +[cohere](https://pypi.org/project/cohere) | 5.13.12 | +[colorama](https://pypi.org/project/colorama) | 0.4.6 | +[colorcet](https://pypi.org/project/colorcet) | 3.1.0 | +[colorlog](https://pypi.org/project/colorlog) | 6.8.2 | +[comm](https://pypi.org/project/comm) | 0.2.2 | +[contourpy](https://pypi.org/project/contourpy) | 1.3.1 | +[cookiecutter](https://pypi.org/project/cookiecutter) | 2.6.0 | +[cryptography](https://pypi.org/project/cryptography) | 44.0.0 | +[cvxopt](https://pypi.org/project/cvxopt) | 1.3.2 | +[cvxpy](https://pypi.org/project/cvxpy) | 1.6.4 | +[cycler](https://pypi.org/project/cycler) | 0.12.1 | +[cython](https://pypi.org/project/cython) | 3.0.12 | +[cytoolz](https://pypi.org/project/cytoolz) | 1.0.1 | +[dask](https://pypi.org/project/dask) | 2025.3.0 | +[datasette](https://pypi.org/project/datasette) | 0.65.1 | +[datasette-graphql](https://pypi.org/project/datasette-graphql) | 2.2 | +[datashader](https://pypi.org/project/datashader) | 0.17.0 | +[deap](https://pypi.org/project/deap) | 1.4.2 | +[debugpy](https://pypi.org/project/debugpy) | 1.8.0 | +[decorator](https://pypi.org/project/decorator) | 5.1.1 | +[defusedxml](https://pypi.org/project/defusedxml) | 0.7.1 | +[deprecated](https://pypi.org/project/deprecated) | 1.2.14 | +[diff-match-patch](https://pypi.org/project/diff-match-patch) | 20241021 | +[dill](https://pypi.org/project/dill) | 0.3.9 | +[distributed](https://pypi.org/project/distributed) | 2025.3.0 | +[distro](https://pypi.org/project/distro) | 1.8.0 | +[django](https://pypi.org/project/django) | 5.0.7 | +[dnspython](https://pypi.org/project/dnspython) | 2.6.1 | +[docstring-to-markdown](https://pypi.org/project/docstring-to-markdown) | 0.15 | +[docutils](https://pypi.org/project/docutils) | 0.21.2 | +[duckdb](https://pypi.org/project/duckdb) | 1.2.2 | +[entrypoints](https://pypi.org/project/entrypoints) | 0.4 | +[et-xmlfile](https://pypi.org/project/et-xmlfile) | 1.1.0 | +[eval-type-backport](https://pypi.org/project/eval-type-backport) | 0.2.2 | +[executing](https://pypi.org/project/executing) | 2.2.0 | +[faker](https://pypi.org/project/faker) | 36.1.1 | +[fast-histogram](https://pypi.org/project/fast-histogram) | 0.14 | +[fastapi](https://pypi.org/project/fastapi) | 0.115.8 | +[fastavro](https://pypi.org/project/fastavro) | 1.10.0 | +[fastjsonschema](https://pypi.org/project/fastjsonschema) | 2.18.0 | +[filelock](https://pypi.org/project/filelock) | 3.17.0 | +[flake8](https://pypi.org/project/flake8) | 7.1.1 | +[flask](https://pypi.org/project/flask) | 3.1.0 | +[flexcache](https://pypi.org/project/flexcache) | 0.3 | +[flexparser](https://pypi.org/project/flexparser) | 0.4 | +[flit](https://pypi.org/project/flit) | 3.10.1 | +[flit-core](https://pypi.org/project/flit-core) | 3.10.1 | +[folium](https://pypi.org/project/folium) | 0.19.5 | +[fonttools](https://pypi.org/project/fonttools) | 4.55.3 | +[fqdn](https://pypi.org/project/fqdn) | 1.5.1 | +[frozenlist](https://pypi.org/project/frozenlist) | 1.5.0 | +[fsspec](https://pypi.org/project/fsspec) | 2024.6.1 | +[fuzzywuzzy](https://pypi.org/project/fuzzywuzzy) | 0.18.0 | +[geographiclib](https://pypi.org/project/geographiclib) | 2.0 | +[geopandas](https://pypi.org/project/geopandas) | 1.0.1 | +[geopy](https://pypi.org/project/geopy) | 2.4.1 | +[gitdb](https://pypi.org/project/gitdb) | 4.0.10 | +[gitpython](https://pypi.org/project/gitpython) | 3.1.32 | +[google-auth](https://pypi.org/project/google-auth) | 2.37.0 | +[graphene](https://pypi.org/project/graphene) | 3.3 | +[graphql-core](https://pypi.org/project/graphql-core) | 3.2.3 | +[graphql-relay](https://pypi.org/project/graphql-relay) | 3.2.0 | +[greenlet](https://pypi.org/project/greenlet) | 3.1.1 | +[griffe](https://pypi.org/project/griffe) | 1.5.5 | +[groq](https://pypi.org/project/groq) | 0.13.1 | +[guidata](https://pypi.org/project/guidata) | 3.7.1 | +[h11](https://pypi.org/project/h11) | 0.14.0 | +[h2](https://pypi.org/project/h2) | 4.1.0 | +[h5py](https://pypi.org/project/h5py) | 3.12.1 | +[hatchling](https://pypi.org/project/hatchling) | 1.27.0 | +[holoviews](https://pypi.org/project/holoviews) | 1.20.2 | +[hpack](https://pypi.org/project/hpack) | 4.1.0 | +[html5lib](https://pypi.org/project/html5lib) | 1.1 | +[httpcore](https://pypi.org/project/httpcore) | 1.0.5 | +[httpie](https://pypi.org/project/httpie) | 3.2.4 | +[httpx](https://pypi.org/project/httpx) | 0.27.2 | +[httpx-sse](https://pypi.org/project/httpx-sse) | 0.4.0 | +[huggingface-hub](https://pypi.org/project/huggingface-hub) | 0.29.3 | +[hupper](https://pypi.org/project/hupper) | 1.12 | +[hvplot](https://pypi.org/project/hvplot) | 0.11.2 | +[hypercorn](https://pypi.org/project/hypercorn) | 0.17.3 | +[hyperframe](https://pypi.org/project/hyperframe) | 6.1.0 | +[hypothesis](https://pypi.org/project/hypothesis) | 6.130.4 | +[id](https://pypi.org/project/id) | 1.5.0 | +[idna](https://pypi.org/project/idna) | 3.10 | +[imageio](https://pypi.org/project/imageio) | 2.37.0 | +[imagesize](https://pypi.org/project/imagesize) | 1.4.1 | +[imbalanced-learn](https://pypi.org/project/imbalanced-learn) | 0.13.0 | +[importlib-metadata](https://pypi.org/project/importlib-metadata) | 8.6.1 | +[inflection](https://pypi.org/project/inflection) | 0.5.1 | +[iniconfig](https://pypi.org/project/iniconfig) | 2.0.0 | +[intervaltree](https://pypi.org/project/intervaltree) | 3.0.2 | +[ipycanvas](https://pypi.org/project/ipycanvas) | 0.13.3 | +[ipykernel](https://pypi.org/project/ipykernel) | 6.29.5 | +[ipyleaflet](https://pypi.org/project/ipyleaflet) | 0.19.2 | +[ipympl](https://pypi.org/project/ipympl) | 0.9.7 | +[ipython](https://pypi.org/project/ipython) | 8.34.0 | +[ipython-genutils](https://pypi.org/project/ipython-genutils) | 0.2.0 | +[ipython-sql](https://pypi.org/project/ipython-sql) | 0.5.0 | +[ipywidgets](https://pypi.org/project/ipywidgets) | 8.1.6 | +[isoduration](https://pypi.org/project/isoduration) | 20.11.0 | +[isort](https://pypi.org/project/isort) | 5.13.2 | +[itsdangerous](https://pypi.org/project/itsdangerous) | 2.2.0 | +[janus](https://pypi.org/project/janus) | 2.0.0 | +[jaraco-classes](https://pypi.org/project/jaraco-classes) | 3.4.0 | +[jaraco-context](https://pypi.org/project/jaraco-context) | 6.0.1 | +[jaraco-functools](https://pypi.org/project/jaraco-functools) | 4.1.0 | +[jedi](https://pypi.org/project/jedi) | 0.19.2 | +[jellyfish](https://pypi.org/project/jellyfish) | 1.1.3 | +[jinja2](https://pypi.org/project/jinja2) | 3.1.2 | +[jiter](https://pypi.org/project/jiter) | 0.8.2 | +[joblib](https://pypi.org/project/joblib) | 1.4.2 | +[json5](https://pypi.org/project/json5) | 0.9.14 | +[jsonpatch](https://pypi.org/project/jsonpatch) | 1.33 | +[jsonpath-python](https://pypi.org/project/jsonpath-python) | 1.0.6 | +[jsonpointer](https://pypi.org/project/jsonpointer) | 2.4 | +[jsonschema](https://pypi.org/project/jsonschema) | 4.19.2 | +[jsonschema-specifications](https://pypi.org/project/jsonschema-specifications) | 2023.12.1 | +[julia](https://pypi.org/project/julia) | 0.6.2 | +[jupyter](https://pypi.org/project/jupyter) | 1.1.1 | +[jupyter-bokeh](https://pypi.org/project/jupyter-bokeh) | 4.0.5 | +[jupyter-client](https://pypi.org/project/jupyter-client) | 8.6.3 | +[jupyter-console](https://pypi.org/project/jupyter-console) | 6.6.3 | +[jupyter-core](https://pypi.org/project/jupyter-core) | 5.7.2 | +[jupyter-events](https://pypi.org/project/jupyter-events) | 0.12.0 | +[jupyter-leaflet](https://pypi.org/project/jupyter-leaflet) | 0.19.2 | +[jupyter-lsp](https://pypi.org/project/jupyter-lsp) | 2.2.5 | +[jupyter-server](https://pypi.org/project/jupyter-server) | 2.14.2 | +[jupyter-server-terminals](https://pypi.org/project/jupyter-server-terminals) | 0.5.3 | +[jupyterlab](https://pypi.org/project/jupyterlab) | 4.4.1 | +[jupyterlab-pygments](https://pypi.org/project/jupyterlab-pygments) | 0.3.0 | +[jupyterlab-server](https://pypi.org/project/jupyterlab-server) | 2.27.3 | +[jupyterlab-widgets](https://pypi.org/project/jupyterlab-widgets) | 3.0.14 | +[keras](https://pypi.org/project/keras) | 3.9.2 | +[keyring](https://pypi.org/project/keyring) | 25.6.0 | +[kiwisolver](https://pypi.org/project/kiwisolver) | 1.4.8 | +[langchain](https://pypi.org/project/langchain) | 0.3.23 | +[langchain-core](https://pypi.org/project/langchain-core) | 0.3.51 | +[langchain-text-splitters](https://pypi.org/project/langchain-text-splitters) | 0.3.8 | +[langsmith](https://pypi.org/project/langsmith) | 0.3.24 | +[lazy-loader](https://pypi.org/project/lazy-loader) | 0.4 | +[linkify-it-py](https://pypi.org/project/linkify-it-py) | 2.0.2 | +[llvmlite](https://pypi.org/project/llvmlite) | 0.44.0 | +[lmfit](https://pypi.org/project/lmfit) | 1.3.1 | +[locket](https://pypi.org/project/locket) | 1.0.0 | +[logfire-api](https://pypi.org/project/logfire-api) | 3.5.3 | +[lxml](https://pypi.org/project/lxml) | 5.3.0 | +[mako](https://pypi.org/project/mako) | 1.3.5 | +[markdown](https://pypi.org/project/markdown) | 3.7 | +[markdown-it-py](https://pypi.org/project/markdown-it-py) | 2.2.0 | +[markupsafe](https://pypi.org/project/markupsafe) | 3.0.2 | +[matplotlib](https://pypi.org/project/matplotlib) | 3.10.1 | +[matplotlib-inline](https://pypi.org/project/matplotlib-inline) | 0.1.7 | +[maturin](https://pypi.org/project/maturin) | 1.8.1 | +[mccabe](https://pypi.org/project/mccabe) | 0.7.0 | +[mdit-py-plugins](https://pypi.org/project/mdit-py-plugins) | 0.3.5 | +[mdurl](https://pypi.org/project/mdurl) | 0.1.2 | +[mercantile](https://pypi.org/project/mercantile) | 1.2.1 | +[mergedeep](https://pypi.org/project/mergedeep) | 1.3.4 | +[missingno](https://pypi.org/project/missingno) | 0.5.1 | +[mistralai](https://pypi.org/project/mistralai) | 1.2.5 | +[mistune](https://pypi.org/project/mistune) | 2.0.5 | +[mizani](https://pypi.org/project/mizani) | 0.11.4 | +[ml-dtypes](https://pypi.org/project/ml-dtypes) | 0.5.0 | +[mlxtend](https://pypi.org/project/mlxtend) | 0.23.3 | +[more-itertools](https://pypi.org/project/more-itertools) | 10.2.0 | +[mpl-scatter-density](https://pypi.org/project/mpl-scatter-density) | 0.7 | +[mpld3](https://pypi.org/project/mpld3) | 0.5.8 | +[mpmath](https://pypi.org/project/mpmath) | 1.3.0 | +[msal](https://pypi.org/project/msal) | 1.30.0 | +[msal-extensions](https://pypi.org/project/msal-extensions) | 1.2.0 | +[msgpack](https://pypi.org/project/msgpack) | 1.1.0 | +[multidict](https://pypi.org/project/multidict) | 6.1.0 | +[multipledispatch](https://pypi.org/project/multipledispatch) | 1.0.0 | +[mypy](https://pypi.org/project/mypy) | 1.15.0 | +[mypy-extensions](https://pypi.org/project/mypy-extensions) | 1.0.0 | +[mysql-connector-python](https://pypi.org/project/mysql-connector-python) | 9.2.0 | +[namex](https://pypi.org/project/namex) | 0.0.8 | +[narwhals](https://pypi.org/project/narwhals) | 1.30.0 | +[nbclient](https://pypi.org/project/nbclient) | 0.10.0 | +[nbconvert](https://pypi.org/project/nbconvert) | 7.16.1 | +[nbformat](https://pypi.org/project/nbformat) | 5.10.4 | +[nest-asyncio](https://pypi.org/project/nest-asyncio) | 1.6.0 | +[networkx](https://pypi.org/project/networkx) | 3.4.2 | +[nh3](https://pypi.org/project/nh3) | 0.2.18 | +[nltk](https://pypi.org/project/nltk) | 3.9.1 | +[notebook](https://pypi.org/project/notebook) | 7.4.0 | +[notebook-shim](https://pypi.org/project/notebook-shim) | 0.2.4 | +[numba](https://pypi.org/project/numba) | 0.61.2 | +[numpy](https://pypi.org/project/numpy) | 2.2.4 | +[numpydoc](https://pypi.org/project/numpydoc) | 1.6.0 | +[openai](https://pypi.org/project/openai) | 1.72.0 | +[opencv-python](https://pypi.org/project/opencv-python) | 4.11.0.86 | +[openpyxl](https://pypi.org/project/openpyxl) | 3.1.2 | +[optree](https://pypi.org/project/optree) | 0.14.0 | +[optuna](https://pypi.org/project/optuna) | 3.6.1 | +[orjson](https://pypi.org/project/orjson) | 3.10.12 | +[osqp](https://pypi.org/project/osqp) | 0.6.7.post3 | +[outcome](https://pypi.org/project/outcome) | 1.3.0.post0 | +[overrides](https://pypi.org/project/overrides) | 7.7.0 | +[packaging](https://pypi.org/project/packaging) | 24.2 | +[pandas](https://pypi.org/project/pandas) | 2.2.3 | +[pandocfilters](https://pypi.org/project/pandocfilters) | 1.5.0 | +[panel](https://pypi.org/project/panel) | 1.6.2 | +[papermill](https://pypi.org/project/papermill) | 2.6.0 | +[param](https://pypi.org/project/param) | 2.2.0 | +[parso](https://pypi.org/project/parso) | 0.8.4 | +[partd](https://pypi.org/project/partd) | 1.4.0 | +[pathspec](https://pypi.org/project/pathspec) | 0.11.0 | +[patsy](https://pypi.org/project/patsy) | 0.5.6 | +[pep8](https://pypi.org/project/pep8) | 1.7.1 | +[pexpect](https://pypi.org/project/pexpect) | 4.8.0 | +[pg8000](https://pypi.org/project/pg8000) | 1.23.0 | +[pickleshare](https://pypi.org/project/pickleshare) | 0.7.5 | +[pillow](https://pypi.org/project/pillow) | 11.1.0 | +[pip](https://pypi.org/project/pip) | 25.0.1 | +[platformdirs](https://pypi.org/project/platformdirs) | 4.3.6 | +[plotly](https://pypi.org/project/plotly) | 6.0.1 | +[plotnine](https://pypi.org/project/plotnine) | 0.13.6 | +[plotpy](https://pypi.org/project/plotpy) | 2.7.2 | +[pluggy](https://pypi.org/project/pluggy) | 1.5.0 | +[ply](https://pypi.org/project/ply) | 3.11 | +[polars](https://pypi.org/project/polars) | 1.27.1 | +[portalocker](https://pypi.org/project/portalocker) | 2.7.0 | +[prettytable](https://pypi.org/project/prettytable) | 3.3.0 | +[prince](https://pypi.org/project/prince) | 0.15.0 | +[priority](https://pypi.org/project/priority) | 2.0.0 | +[prometheus-client](https://pypi.org/project/prometheus-client) | 0.21.1 | +[prompt-toolkit](https://pypi.org/project/prompt-toolkit) | 3.0.50 | +[propcache](https://pypi.org/project/propcache) | 0.2.1 | +[protobuf](https://pypi.org/project/protobuf) | 5.27.3 | +[psutil](https://pypi.org/project/psutil) | 5.9.8 | +[psygnal](https://pypi.org/project/psygnal) | 0.11.1 | +[ptpython](https://pypi.org/project/ptpython) | 3.0.29 | +[ptyprocess](https://pypi.org/project/ptyprocess) | 0.7.0 | +[pure-eval](https://pypi.org/project/pure-eval) | 0.2.2 | +[pyarrow](https://pypi.org/project/pyarrow) | 19.0.1 | +[pyasn1](https://pypi.org/project/pyasn1) | 0.6.1 | +[pyasn1-modules](https://pypi.org/project/pyasn1-modules) | 0.4.1 | +[pybind11](https://pypi.org/project/pybind11) | 2.13.6 | +[pycodestyle](https://pypi.org/project/pycodestyle) | 2.12.0 | +[pycparser](https://pypi.org/project/pycparser) | 2.22 | +[pyct](https://pypi.org/project/pyct) | 0.5.0 | +[pydantic](https://pypi.org/project/pydantic) | 2.10.6 | +[pydantic-ai](https://pypi.org/project/pydantic-ai) | 0.0.24 | +[pydantic-ai-slim](https://pypi.org/project/pydantic-ai-slim) | 0.0.24 | +[pydantic-core](https://pypi.org/project/pydantic-core) | 2.27.2 | +[pydantic-graph](https://pypi.org/project/pydantic-graph) | 0.0.24 | +[pydeck](https://pypi.org/project/pydeck) | 0.9.1 | +[pydocstyle](https://pypi.org/project/pydocstyle) | 6.3.0 | +[pydub](https://pypi.org/project/pydub) | 0.25.1 | +[pyerfa](https://pypi.org/project/pyerfa) | 2.0.1.4 | +[pyflakes](https://pypi.org/project/pyflakes) | 3.2.0 | +[pygithub](https://pypi.org/project/pygithub) | 2.6.1 | +[pygments](https://pypi.org/project/pygments) | 2.19.1 | +[pyjwt](https://pypi.org/project/pyjwt) | 2.10.1 | +[pylint](https://pypi.org/project/pylint) | 3.1.0 | +[pylint-venv](https://pypi.org/project/pylint-venv) | 3.0.3 | +[pyls-spyder](https://pypi.org/project/pyls-spyder) | 0.4.0 | +[pymongo](https://pypi.org/project/pymongo) | 4.10.1 | +[pympler](https://pypi.org/project/pympler) | 1.1 | +[pynacl](https://pypi.org/project/pynacl) | 1.5.0 | +[pynndescent](https://pypi.org/project/pynndescent) | 0.5.12 | +[pyodbc](https://pypi.org/project/pyodbc) | 5.2.0 | +[pyogrio](https://pypi.org/project/pyogrio) | 0.10.0 | +[pyomo](https://pypi.org/project/pyomo) | 6.9.1 | +[pypandoc](https://pypi.org/project/pypandoc) | 1.15 | +[pyparsing](https://pypi.org/project/pyparsing) | 3.2.1 | +[pypdf](https://pypi.org/project/pypdf) | 5.1.0 | +[pyproj](https://pypi.org/project/pyproj) | 3.7.0 | +[pyproject-hooks](https://pypi.org/project/pyproject-hooks) | 1.1.0 | +[pyqt5](https://pypi.org/project/pyqt5) | 5.15.10 | +[pyqt5-qt5](https://pypi.org/project/pyqt5-qt5) | 5.15.2 | +[pyqt5-sip](https://pypi.org/project/pyqt5-sip) | 12.16.1 | +[pyqtgraph](https://pypi.org/project/pyqtgraph) | 0.13.7 | +[pyqtwebengine](https://pypi.org/project/pyqtwebengine) | 5.15.6 | +[pyqtwebengine-qt5](https://pypi.org/project/pyqtwebengine-qt5) | 5.15.2 | +[pyserial](https://pypi.org/project/pyserial) | 3.5 | +[pysocks](https://pypi.org/project/pysocks) | 1.7.1 | +[pyspnego](https://pypi.org/project/pyspnego) | 0.11.2 | +[pytest](https://pypi.org/project/pytest) | 8.3.4 | +[python-barcode](https://pypi.org/project/python-barcode) | 0.15.1 | +[python-dateutil](https://pypi.org/project/python-dateutil) | 2.8.2 | +[python-dotenv](https://pypi.org/project/python-dotenv) | 1.0.1 | +[python-json-logger](https://pypi.org/project/python-json-logger) | 2.0.7 | +[python-lsp-black](https://pypi.org/project/python-lsp-black) | 2.0.0 | +[python-lsp-jsonrpc](https://pypi.org/project/python-lsp-jsonrpc) | 1.1.2 | +[python-lsp-server](https://pypi.org/project/python-lsp-server) | 1.12.0 | +[python-multipart](https://pypi.org/project/python-multipart) | 0.0.9 | +[python-slugify](https://pypi.org/project/python-slugify) | 8.0.4 | +[pythonqwt](https://pypi.org/project/pythonqwt) | 0.14.4 | +[pytoolconfig](https://pypi.org/project/pytoolconfig) | 1.3.1 | +[pytz](https://pypi.org/project/pytz) | 2024.2 | +[pyuca](https://pypi.org/project/pyuca) | 1.2 | +[pyusb](https://pypi.org/project/pyusb) | 1.3.1 | +[pyviz-comms](https://pypi.org/project/pyviz-comms) | 3.0.3 | +[pywavelets](https://pypi.org/project/pywavelets) | 1.8.0 | +[pywin32](https://pypi.org/project/pywin32) | 308 | +[pywin32-ctypes](https://pypi.org/project/pywin32-ctypes) | 0.2.2 | +[pywinpty](https://pypi.org/project/pywinpty) | 2.0.14 | +[pyyaml](https://pypi.org/project/pyyaml) | 6.0.2 | +[pyzmq](https://pypi.org/project/pyzmq) | 26.2.1 | +[qdarkstyle](https://pypi.org/project/qdarkstyle) | 3.2.3 | +[qdldl](https://pypi.org/project/qdldl) | 0.1.7.post5 | +[qrcode](https://pypi.org/project/qrcode) | 8.0 | +[qstylizer](https://pypi.org/project/qstylizer) | 0.2.2 | +[qtawesome](https://pypi.org/project/qtawesome) | 1.4.0 | +[qtconsole](https://pypi.org/project/qtconsole) | 5.6.1 | +[qtpy](https://pypi.org/project/qtpy) | 2.4.1 | +[quantecon](https://pypi.org/project/quantecon) | 0.7.2 | +[quart](https://pypi.org/project/quart) | 0.20.0 | +[rapidfuzz](https://pypi.org/project/rapidfuzz) | 3.9.6 | +[readme-renderer](https://pypi.org/project/readme-renderer) | 44.0 | +[redis](https://pypi.org/project/redis) | 5.0.8 | +[referencing](https://pypi.org/project/referencing) | 0.35.1 | +[regex](https://pypi.org/project/regex) | 2024.11.6 | +[reportlab](https://pypi.org/project/reportlab) | 4.2.5 | +[requests](https://pypi.org/project/requests) | 2.32.3 | +[requests-ntlm](https://pypi.org/project/requests-ntlm) | 1.3.0 | +[requests-toolbelt](https://pypi.org/project/requests-toolbelt) | 1.0.0 | +[rfc3339-validator](https://pypi.org/project/rfc3339-validator) | 0.1.4 | +[rfc3986](https://pypi.org/project/rfc3986) | 2.0.0 | +[rfc3986-validator](https://pypi.org/project/rfc3986-validator) | 0.1.1 | +[rich](https://pypi.org/project/rich) | 13.9.4 | +[rope](https://pypi.org/project/rope) | 1.12.0 | +[rpds-py](https://pypi.org/project/rpds-py) | 0.22.3 | +[rsa](https://pypi.org/project/rsa) | 4.7.2 | +[rtree](https://pypi.org/project/rtree) | 1.3.0 | +[rx](https://pypi.org/project/rx) | 3.2.0 | +[scikit-image](https://pypi.org/project/scikit-image) | 0.25.2 | +[scikit-learn](https://pypi.org/project/scikit-learn) | 1.6.1 | +[scipy](https://pypi.org/project/scipy) | 1.15.2 | +[scramp](https://pypi.org/project/scramp) | 1.4.5 | +[scs](https://pypi.org/project/scs) | 3.2.7.post2 | +[seaborn](https://pypi.org/project/seaborn) | 0.13.2 | +[send2trash](https://pypi.org/project/send2trash) | 1.8.3 | +[setuptools](https://pypi.org/project/setuptools) | 75.8.2 | +[shapely](https://pypi.org/project/shapely) | 2.0.6 | +[shellingham](https://pypi.org/project/shellingham) | 1.5.4 | +[simplejson](https://pypi.org/project/simplejson) | 3.19.3 | +[simpy](https://pypi.org/project/simpy) | 4.1.1 | +[six](https://pypi.org/project/six) | 1.16.0 | +[sklearn-compat](https://pypi.org/project/sklearn-compat) | 0.1.3 | +[skrub](https://pypi.org/project/skrub) | 0.5.1 | +[smmap](https://pypi.org/project/smmap) | 5.0.0 | +[sniffio](https://pypi.org/project/sniffio) | 1.3.0 | +[snowballstemmer](https://pypi.org/project/snowballstemmer) | 2.2.0 | +[sortedcontainers](https://pypi.org/project/sortedcontainers) | 2.4.0 | +[sounddevice](https://pypi.org/project/sounddevice) | 0.5.1 | +[soupsieve](https://pypi.org/project/soupsieve) | 2.6 | +[sphinx](https://pypi.org/project/sphinx) | 7.3.7 | +[sphinx-rtd-theme](https://pypi.org/project/sphinx-rtd-theme) | 3.0.2 | +[sphinxcontrib-applehelp](https://pypi.org/project/sphinxcontrib-applehelp) | 2.0.0 | +[sphinxcontrib-devhelp](https://pypi.org/project/sphinxcontrib-devhelp) | 2.0.0 | +[sphinxcontrib-htmlhelp](https://pypi.org/project/sphinxcontrib-htmlhelp) | 2.1.0 | +[sphinxcontrib-jquery](https://pypi.org/project/sphinxcontrib-jquery) | 4.1 | +[sphinxcontrib-jsmath](https://pypi.org/project/sphinxcontrib-jsmath) | 1.0.1 | +[sphinxcontrib-qthelp](https://pypi.org/project/sphinxcontrib-qthelp) | 2.0.0 | +[sphinxcontrib-serializinghtml](https://pypi.org/project/sphinxcontrib-serializinghtml) | 2.0.0 | +[spyder](https://pypi.org/project/spyder) | 6.0.5 | +[spyder-kernels](https://pypi.org/project/spyder-kernels) | 3.0.3 | +[sqlalchemy](https://pypi.org/project/sqlalchemy) | 2.0.38 | +[sqlite-bro](https://pypi.org/project/sqlite-bro) | 0.13.1 | +[sqlite-fts4](https://pypi.org/project/sqlite-fts4) | 1.0.3 | +[sqlite-utils](https://pypi.org/project/sqlite-utils) | 3.38 | +[sqlparse](https://pypi.org/project/sqlparse) | 0.5.3 | +[squarify](https://pypi.org/project/squarify) | 0.4.4 | +[sspilib](https://pypi.org/project/sspilib) | 0.2.0 | +[stack-data](https://pypi.org/project/stack-data) | 0.6.3 | +[starlette](https://pypi.org/project/starlette) | 0.45.3 | +[statsmodels](https://pypi.org/project/statsmodels) | 0.14.4 | +[streamlit](https://pypi.org/project/streamlit) | 1.44.0 | +[superqt](https://pypi.org/project/superqt) | 0.7.1 | +[sv-ttk](https://pypi.org/project/sv-ttk) | 2.6.0 | +[sympy](https://pypi.org/project/sympy) | 1.13.3 | +[tabulate](https://pypi.org/project/tabulate) | 0.9.0 | +[tblib](https://pypi.org/project/tblib) | 3.0.0 | +[tenacity](https://pypi.org/project/tenacity) | 9.0.0 | +[termcolor](https://pypi.org/project/termcolor) | 2.5.0 | +[terminado](https://pypi.org/project/terminado) | 0.18.1 | +[text-unidecode](https://pypi.org/project/text-unidecode) | 1.3 | +[textdistance](https://pypi.org/project/textdistance) | 4.6.3 | +[thefuzz](https://pypi.org/project/thefuzz) | 0.22.1 | +[threadpoolctl](https://pypi.org/project/threadpoolctl) | 3.5.0 | +[three-merge](https://pypi.org/project/three-merge) | 0.1.1 | +[tifffile](https://pypi.org/project/tifffile) | 2025.1.10 | +[tiktoken](https://pypi.org/project/tiktoken) | 0.8.0 | +[tinycss2](https://pypi.org/project/tinycss2) | 1.4.0 | +[tokenizers](https://pypi.org/project/tokenizers) | 0.21.0 | +[toml](https://pypi.org/project/toml) | 0.10.2 | +[tomli](https://pypi.org/project/tomli) | 2.2.1 | +[tomli-w](https://pypi.org/project/tomli-w) | 1.2.0 | +[tomlkit](https://pypi.org/project/tomlkit) | 0.13.2 | +[toolz](https://pypi.org/project/toolz) | 1.0.0 | +[tornado](https://pypi.org/project/tornado) | 6.4.2 | +[tqdm](https://pypi.org/project/tqdm) | 4.66.4 | +[traitlets](https://pypi.org/project/traitlets) | 5.14.1 | +[traittypes](https://pypi.org/project/traittypes) | 0.2.1 | +[trio](https://pypi.org/project/trio) | 0.29.0 | +[trove-classifiers](https://pypi.org/project/trove-classifiers) | 2024.10.21.16 | +[twine](https://pypi.org/project/twine) | 6.1.0 | +[typer](https://pypi.org/project/typer) | 0.15.2 | +[types-python-dateutil](https://pypi.org/project/types-python-dateutil) | 2.9.0.20240316 | +[types-requests](https://pypi.org/project/types-requests) | 2.32.0.20241016 | +[typing-extensions](https://pypi.org/project/typing-extensions) | 4.12.2 | +[typing-inspect](https://pypi.org/project/typing-inspect) | 0.9.0 | +[tzdata](https://pypi.org/project/tzdata) | 2024.1 | +[tzlocal](https://pypi.org/project/tzlocal) | 5.2 | +[uc-micro-py](https://pypi.org/project/uc-micro-py) | 1.0.1 | +[ujson](https://pypi.org/project/ujson) | 5.10.0 | +[umap-learn](https://pypi.org/project/umap-learn) | 0.5.6 | +[uncertainties](https://pypi.org/project/uncertainties) | 3.2.2 | +[uri-template](https://pypi.org/project/uri-template) | 1.3.0 | +[urllib3](https://pypi.org/project/urllib3) | 2.2.3 | +[uvicorn](https://pypi.org/project/uvicorn) | 0.34.0 | +[vega-datasets](https://pypi.org/project/vega-datasets) | 0.9.0 | +[waitress](https://pypi.org/project/waitress) | 3.0.0 | +[watchdog](https://pypi.org/project/watchdog) | 6.0.0 | +[wcwidth](https://pypi.org/project/wcwidth) | 0.2.13 | +[webcolors](https://pypi.org/project/webcolors) | 24.11.1 | +[webencodings](https://pypi.org/project/webencodings) | 0.5.1 | +[websocket-client](https://pypi.org/project/websocket-client) | 1.8.0 | +[werkzeug](https://pypi.org/project/werkzeug) | 3.1.3 | +[whatthepatch](https://pypi.org/project/whatthepatch) | 1.0.7 | +[wheel](https://pypi.org/project/wheel) | 0.45.1 | +[widgetsnbextension](https://pypi.org/project/widgetsnbextension) | 4.0.14 | +[winpython](https://pypi.org/project/winpython) | 15.3.20250425 | +[wordcloud](https://pypi.org/project/wordcloud) | 1.9.4 | +[wrapt](https://pypi.org/project/wrapt) | 1.16.0 | +[wsproto](https://pypi.org/project/wsproto) | 1.2.0 | +[xarray](https://pypi.org/project/xarray) | 2025.3.0 | +[xlsxwriter](https://pypi.org/project/xlsxwriter) | 3.1.9 | +[xyzservices](https://pypi.org/project/xyzservices) | 2023.10.1 | +[yapf](https://pypi.org/project/yapf) | 0.40.1 | +[yarl](https://pypi.org/project/yarl) | 1.18.3 | +[yt-dlp](https://pypi.org/project/yt-dlp) | 2025.2.19 | +[zict](https://pypi.org/project/zict) | 3.0.0 | +[zipp](https://pypi.org/project/zipp) | 3.21.0 | +[zstandard](https://pypi.org/project/zstandard) | 0.23.0 | + +
    diff --git a/changelogs/WinPythonslim-64bit-3.13.3.0_History.md b/changelogs/WinPythonslim-64bit-3.13.3.0_History.md new file mode 100644 index 00000000..e4117e9d --- /dev/null +++ b/changelogs/WinPythonslim-64bit-3.13.3.0_History.md @@ -0,0 +1,148 @@ +## History of changes for WinPython-64bit 3.13.3.0slim + +The following changes were made to WinPython-64bit distribution since version 3.13.2.0slim. + +
    + +### Tools + +New packages: + + * [Pandoc](https://pandoc.org) 3.1.9 (an universal document converter) + +### Python packages + +New packages: + + * [asyncssh](https://pypi.org/project/asyncssh) 2.20.0 () + * [deprecated](https://pypi.org/project/deprecated) 1.2.14 () + * [flexcache](https://pypi.org/project/flexcache) 0.3 () + * [flexparser](https://pypi.org/project/flexparser) 0.4 () + * [id](https://pypi.org/project/id) 1.5.0 () + * [pygithub](https://pypi.org/project/pygithub) 2.6.1 () + * [pyuca](https://pypi.org/project/pyuca) 1.2 () + * [shellingham](https://pypi.org/project/shellingham) 1.5.4 () + * [skrub](https://pypi.org/project/skrub) 0.5.1 () + * [superqt](https://pypi.org/project/superqt) 0.7.1 () + * [sv-ttk](https://pypi.org/project/sv-ttk) 2.6.0 () + * [typer](https://pypi.org/project/typer) 0.15.2 () + * [wrapt](https://pypi.org/project/wrapt) 1.16.0 () + +Upgraded packages: + + * [alembic](https://pypi.org/project/alembic) 1.13.1 → 1.15.1 () + * [anthropic](https://pypi.org/project/anthropic) 0.42.0 → 0.49.0 () + * [anyio](https://pypi.org/project/anyio) 4.7.0 → 4.8.0 () + * [array-api-compat](https://pypi.org/project/array-api-compat) 1.10.0 → 1.11.1 () + * [azure-core](https://pypi.org/project/azure-core) 1.30.2 → 1.32.0 () + * [azure-cosmos](https://pypi.org/project/azure-cosmos) 4.7.0 → 4.9.0 () + * [azure-identity](https://pypi.org/project/azure-identity) 1.16.1 → 1.21.0 () + * [black](https://pypi.org/project/black) 24.10.0 → 25.1.0 () + * [bokeh](https://pypi.org/project/bokeh) 3.6.3 → 3.7.2 () + * [cachetools](https://pypi.org/project/cachetools) 5.4.0 → 5.5.2 () + * [certifi](https://pypi.org/project/certifi) 2024.6.2 → 2025.1.31 () + * [click](https://pypi.org/project/click) 8.1.7 → 8.1.8 () + * [cloudpickle](https://pypi.org/project/cloudpickle) 3.0.0 → 3.1.1 () + * [cvxpy](https://pypi.org/project/cvxpy) 1.6.0 → 1.6.4 () + * [cython](https://pypi.org/project/cython) 3.0.11 → 3.0.12 () + * [dask](https://pypi.org/project/dask) 2024.12.1 → 2025.3.0 () + * [datasette](https://pypi.org/project/datasette) 0.64.8 → 0.65.1 () + * [datashader](https://pypi.org/project/datashader) 0.16.3 → 0.17.0 () + * [diff-match-patch](https://pypi.org/project/diff-match-patch) 20230430 → 20241021 () + * [distributed](https://pypi.org/project/distributed) 2024.12.1 → 2025.3.0 () + * [docstring-to-markdown](https://pypi.org/project/docstring-to-markdown) 0.13 → 0.15 () + * [duckdb](https://pypi.org/project/duckdb) 1.2.0 → 1.2.2 () + * [executing](https://pypi.org/project/executing) 2.0.1 → 2.2.0 () + * [faker](https://pypi.org/project/faker) 33.3.1 → 36.1.1 () + * [fastapi](https://pypi.org/project/fastapi) 0.115.6 → 0.115.8 () + * [filelock](https://pypi.org/project/filelock) 3.14.0 → 3.17.0 () + * [folium](https://pypi.org/project/folium) 0.18.0 → 0.19.5 () + * [holoviews](https://pypi.org/project/holoviews) 1.20.0 → 1.20.2 () + * [hpack](https://pypi.org/project/hpack) 4.0.0 → 4.1.0 () + * [huggingface-hub](https://pypi.org/project/huggingface-hub) 0.28.1 → 0.29.3 () + * [hypercorn](https://pypi.org/project/hypercorn) 0.16.0 → 0.17.3 () + * [hyperframe](https://pypi.org/project/hyperframe) 6.0.1 → 6.1.0 () + * [hypothesis](https://pypi.org/project/hypothesis) 6.122.3 → 6.130.4 () + * [idna](https://pypi.org/project/idna) 3.7 → 3.10 () + * [imageio](https://pypi.org/project/imageio) 2.33.1 → 2.37.0 () + * [importlib-metadata](https://pypi.org/project/importlib-metadata) 7.1.0 → 8.6.1 () + * [ipympl](https://pypi.org/project/ipympl) 0.9.6 → 0.9.7 () + * [ipython](https://pypi.org/project/ipython) 8.32.0 → 8.34.0 () + * [ipywidgets](https://pypi.org/project/ipywidgets) 8.1.5 → 8.1.6 () + * [jupyter-client](https://pypi.org/project/jupyter-client) 8.6.2 → 8.6.3 () + * [jupyter-events](https://pypi.org/project/jupyter-events) 0.10.0 → 0.12.0 () + * [jupyterlab](https://pypi.org/project/jupyterlab) 4.3.5 → 4.4.1 () + * [jupyterlab-widgets](https://pypi.org/project/jupyterlab-widgets) 3.0.13 → 3.0.14 () + * [keras](https://pypi.org/project/keras) 3.8.0 → 3.9.2 () + * [langchain](https://pypi.org/project/langchain) 0.3.18 → 0.3.23 () + * [langchain-core](https://pypi.org/project/langchain-core) 0.3.34 → 0.3.51 () + * [langchain-text-splitters](https://pypi.org/project/langchain-text-splitters) 0.3.6 → 0.3.8 () + * [langsmith](https://pypi.org/project/langsmith) 0.2.11 → 0.3.24 () + * [markdown](https://pypi.org/project/markdown) 3.5.1 → 3.7 () + * [matplotlib](https://pypi.org/project/matplotlib) 3.10.0 → 3.10.1 () + * [mypy](https://pypi.org/project/mypy) 1.14.0 → 1.15.0 () + * [mysql-connector-python](https://pypi.org/project/mysql-connector-python) 8.0.21 → 9.2.0 () + * [narwhals](https://pypi.org/project/narwhals) 1.21.1 → 1.30.0 () + * [notebook](https://pypi.org/project/notebook) 7.3.1 → 7.4.0 () + * [numba](https://pypi.org/project/numba) 0.61.0 → 0.61.2 () + * [numpy](https://pypi.org/project/numpy) 2.1.3 → 2.2.4 () + * [openai](https://pypi.org/project/openai) 1.61.1 → 1.72.0 () + * [opencv-python](https://pypi.org/project/opencv-python) 4.10.0.84 → 4.11.0.86 () + * [optree](https://pypi.org/project/optree) 0.13.1 → 0.14.0 () + * [panel](https://pypi.org/project/panel) 1.6.0 → 1.6.2 () + * [param](https://pypi.org/project/param) 2.1.1 → 2.2.0 () + * [pip](https://pypi.org/project/pip) 24.3.1 → 25.0.1 () + * [platformdirs](https://pypi.org/project/platformdirs) 4.2.2 → 4.3.6 () + * [plotly](https://pypi.org/project/plotly) 5.24.1 → 6.0.1 () + * [polars](https://pypi.org/project/polars) 1.22.0 → 1.27.1 () + * [prometheus-client](https://pypi.org/project/prometheus-client) 0.18.0 → 0.21.1 () + * [prompt-toolkit](https://pypi.org/project/prompt-toolkit) 3.0.48 → 3.0.50 () + * [pyarrow](https://pypi.org/project/pyarrow) 19.0.0 → 19.0.1 () + * [pyasn1](https://pypi.org/project/pyasn1) 0.4.8 → 0.6.1 () + * [pyasn1-modules](https://pypi.org/project/pyasn1-modules) 0.2.8 → 0.4.1 () + * [pyjwt](https://pypi.org/project/pyjwt) 2.8.0 → 2.10.1 () + * [pympler](https://pypi.org/project/pympler) 1.0.1 → 1.1 () + * [pyomo](https://pypi.org/project/pyomo) 6.8.2 → 6.9.1 () + * [pypandoc](https://pypi.org/project/pypandoc) 1.5 → 1.15 () + * [pytest](https://pypi.org/project/pytest) 8.2.2 → 8.3.4 () + * [Python](http://www.python.org/) 3.13.2 → 3.13.3 (Python programming language with standard library) + * [pytz](https://pypi.org/project/pytz) 2024.1 → 2024.2 () + * [pyzmq](https://pypi.org/project/pyzmq) 26.2.0 → 26.2.1 () + * [qtawesome](https://pypi.org/project/qtawesome) 1.3.1 → 1.4.0 () + * [qtconsole](https://pypi.org/project/qtconsole) 5.5.2 → 5.6.1 () + * [quart](https://pypi.org/project/quart) 0.19.4 → 0.20.0 () + * [rtree](https://pypi.org/project/rtree) 1.1.0 → 1.3.0 () + * [rx](https://pypi.org/project/rx) 3.1.1 → 3.2.0 () + * [scikit-image](https://pypi.org/project/scikit-image) 0.25.0 → 0.25.2 () + * [scipy](https://pypi.org/project/scipy) 1.15.1 → 1.15.2 () + * [send2trash](https://pypi.org/project/send2trash) 1.8.2 → 1.8.3 () + * [setuptools](https://pypi.org/project/setuptools) 75.6.0 → 75.8.2 () + * [simpy](https://pypi.org/project/simpy) 4.0.1 → 4.1.1 () + * [spyder](https://pypi.org/project/spyder) 5.5.6 → 6.0.5 () + * [spyder-kernels](https://pypi.org/project/spyder-kernels) 2.5.2 → 3.0.3 () + * [sqlalchemy](https://pypi.org/project/sqlalchemy) 2.0.35 → 2.0.38 () + * [starlette](https://pypi.org/project/starlette) 0.41.3 → 0.45.3 () + * [streamlit](https://pypi.org/project/streamlit) 1.41.1 → 1.44.0 () + * [tomli-w](https://pypi.org/project/tomli-w) 1.1.0 → 1.2.0 () + * [trio](https://pypi.org/project/trio) 0.28.0 → 0.29.0 () + * [twine](https://pypi.org/project/twine) 6.0.1 → 6.1.0 () + * [widgetsnbextension](https://pypi.org/project/widgetsnbextension) 4.0.13 → 4.0.14 () + * [winpython](https://pypi.org/project/winpython) 13.1.20250222 → 15.3.20250425 () + * [xarray](https://pypi.org/project/xarray) 2025.1.1 → 2025.3.0 () + * [yt-dlp](https://pypi.org/project/yt-dlp) 2023.7.6 → 2025.2.19 () + +Removed packages: + + * [bcrypt](https://pypi.org/project/bcrypt) 4.0.1 (Modern password hashing for your software and your servers) + * [dask_expr](https://pypi.org/project/dask_expr) 1.1.21 (High Level Expressions for Dask ) + * [mutagen](https://pypi.org/project/mutagen) 1.47.0 (read and write audio tags for many formats) + * [paramiko](https://pypi.org/project/paramiko) 2.8.0 (SSH2 protocol library) + * [pint](https://pypi.org/project/pint) 0.23 (Physical quantities module) + * [pkginfo](https://pypi.org/project/pkginfo) 1.11.2 (Query metadata from sdists / bdists / installed packages.) + * [pycryptodomex](https://pypi.org/project/pycryptodomex) 3.20.0 (Cryptographic library for Python) + * [streamz](https://pypi.org/project/streamz) 0.6.3 (Streams) + * [websockets](https://pypi.org/project/websockets) 14.2 (An implementation of the WebSocket Protocol (RFC 6455 & 7692)) + + +
    +* * * diff --git a/changelogs/md5_sha1.txt b/changelogs/md5_sha1.txt index a5e7b0a5..2ab82bcb 100644 --- a/changelogs/md5_sha1.txt +++ b/changelogs/md5_sha1.txt @@ -1,3 +1,21 @@ +### WinPython 2025-02 release (May 4th, 2025) + +MD5 | SHA-1 | SHA-256 | Binary | Size | blake2b-256 +---------------------------------|------------------------------------------|------------------------------------------------------------------|-----------------------------------|----------------------|----------------------------------------------------------------- +b5a3814f26dade2f6ee9acf983427a8e | b3826baea1606868628128bab5527e3600342fbf | 517eff0673658da3f2da64a28afbd7733fb91807f7d074d3a9e9e6c0eb1dd523 | Winpython64-3.12.10.0dot.7z | 23 076 535 Bytes | e3e4b8b944e79cf20dea5e7691c24485a5b68bb70d34df6edfb181fd499b0335 +6f354778174e04fdb4c4c28c7a543f31 | 5d1bd5bd76dcb0e61df1a268e4ce47f56acbfe6f | b6d196d72ce443ccfbdb5a640f5645a7ade742092fddde65d73755c4eba89a1d | Winpython64-3.12.10.0dot.exe | 23 291 575 Bytes | 785f61ee3821d772bdbff037f86a4229d707c97d97f2508e8cdd03f81c1a8436 +431e37ef366ebe9ae30fa7fb162bb314 | 32965a55a8bc119b96875c542d9a08c6f4ed9b75 | bcb2a87ef210076ff4507a4a644bfb82daa0c2361e7945e5cb7de161450460f6 | Winpython64-3.12.10.0dot.zip | 38 334 544 Bytes | ab0b83f09299291a36298754a445429964f610f507b18e484f6bdf572880acbe +6e7131129ff75dd4e8832f7be131dcc3 | 4d6c5b10d4b3044b9a70597fcd4fd34cd5e2b2a8 | 294c287c4a9918c730d26188e2dc34e97a92431c83515165f04c2ea8d33f0c1d | Winpython64-3.12.10.0slim.7z | 624 548 662 Bytes | f0b952a2fe29837783b69dcb4259369ee5c1d40a3220ad0b4dd82b1668322973 +3cefa92f927471aeef6c1fa3b7911166 | 1699db6b9c44b605c9f2031201bb58a46a260f0e | 3ea3368ca0e9182c03e8e0bc38b65c5398dd4f8aee7ccf5ab38d5a9226af6b9a | Winpython64-3.12.10.0slim.exe | 624 763 614 Bytes | 8584e33e01025ce04d0e429f2c08c7fe94576901aabf030341b21e0837ed5966 +95c7326579dbd4a16cb2f5b56a141673 | f28906c1e3e4ba073f0363a4e35326f9e8090ce1 | 13abddd4cc2702be56b672c868d0d1bc085e80748dc7d7e9315ab4080f157f3b | Winpython64-3.13.3.0dot.7z | 24 839 744 Bytes | 1cb42e1ea66116bc0e7804fb44bb519140d5a5acc9bb63c650ef38dc138ca0bb +bccca9b3e79dfbc13d14837e3ba85c9b | 41c805812b778ccaf3781701264b23e6c9908069 | a6b1882b8eff8a44782bfeec7e5228826ebd38c4234e10ba38a52a85860c41d0 | Winpython64-3.13.3.0dot.exe | 25 054 784 Bytes | eea4a48f72d3ca7e784e86883ef2b46cd48a75fd68321c1088e9ed8c11ad47bd +06a5eb8fa4f7447ad63b7e214b126fd7 | 80ab8340798a318c09ffe07a77a920d5d1eda2b7 | f7ef5a6cfe23b7f39f87c128594fc6c7f73f42f9516a0b828dac0da187af68ec | Winpython64-3.13.3.0dot.zip | 39 870 933 Bytes | a4f9a910f55c5efdbb843874384d5295ff3b3a45d27cab63f74d2f215f9d798c +40e207597ddecd78f60e8474d8dc3c81 | 5e4df5e04424a754b33e4a63f4ae31d0a65eb0a5 | 0ee4eaa17ed86fbcb9e861989e08c85dcf13ca1ef067c52f4fc8b68dd7836c46 | Winpython64-3.13.3.0slim.7z | 629 049 097 Bytes | f275d41a374ff5f3b75decbe65cd52a54c1ac8157edeb62f377dfa2278201ccb +312a8e7fa70b5b58e44f69c1066687a8 | 12e992d1e40fb04c0e7fe367a983dc27ef88b151 | 9abfd2a54ba314dfe573792a573ad31a43e63765f7b77c2002849086a1a47c5e | Winpython64-3.13.3.0slim.exe | 629 265 120 Bytes | 87fc9b086fae8a07b234fcced8b428cd0c3367a9ff068cd3c28b661813c94cab +588e3a1a7ddc461f528270a302a3b667 | a77e443c86c1d21c9a177193e69847efa6346373 | 060046dc83030a639d50396f403a28556ebbd87495bb14045b21118e6cff4c4b | requirement_hash.WinPython64-3.12.10..0slim.txt | 78 133 Bytes | 54d3902407c7c935d83681796585e24d80478f68d22d62ff500d4072ab0385b0 +fb5edb31a3f1e0e7f43eb810f5dd4032 | c6c043e8ec9c7af50eb2d297a91c1b87d3bc7074 | 225500ba0b3aea779b24f7b17bece53250b24380390685bac5ae6c5804f68367 | requirement_hash.WinPython64-3.13.3.0slim.txt | 78 125 Bytes | 1b3d8ff70b049c368ae848d69331faf2ceb19ddc6821ec3549e5511ecac7f393 + + ### WinPython 2025-01 release (March 1st, 2025) MD5 | SHA-1 | SHA-256 | Binary | Size | blake2b-256 From b68df0f388b9a885fee928fc823d20a3dcfcc846 Mon Sep 17 00:00:00 2001 From: stonebig Date: Wed, 7 May 2025 21:28:44 +0200 Subject: [PATCH 183/305] fix changelog loosing their description --- winpython/wppm.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/winpython/wppm.py b/winpython/wppm.py index 3989a3c5..34e3c9da 100644 --- a/winpython/wppm.py +++ b/winpython/wppm.py @@ -80,10 +80,10 @@ def get_installed_packages(self, update: bool = False) -> list[Package]: self.pip = piptree.PipData() else: self.pip = piptree.PipData(utils.get_python_executable(self.target)) - pip_list = self.pip.pip_list() + pip_list = self.pip.pip_list(full=True) # return a list of package objects - return [Package(f"{i[0].replace('-', '_').lower()}-{i[1]}-py3-none-any.whl") for i in pip_list] + return [Package(f"{i[0].replace('-', '_').lower()}-{i[1]}-py3-none-any.whl", suggested_summary=i[2]) for i in pip_list] def find_package(self, name: str) -> Package | None: """Find installed package by name.""" From 55d1ab116c1f6713fa15a4f4896a147abdfc7ebe Mon Sep 17 00:00:00 2001 From: stonebig Date: Wed, 7 May 2025 22:17:06 +0200 Subject: [PATCH 184/305] put back lables in changelogs --- changelogs/WinPythondot-64bit-3.12.10.0.md | 20 +- changelogs/WinPythondot-64bit-3.13.3.0.md | 20 +- changelogs/WinPythonslim-64bit-3.12.10.0.md | 984 ++++++++++---------- changelogs/WinPythonslim-64bit-3.13.3.0.md | 984 ++++++++++---------- 4 files changed, 1004 insertions(+), 1004 deletions(-) diff --git a/changelogs/WinPythondot-64bit-3.12.10.0.md b/changelogs/WinPythondot-64bit-3.12.10.0.md index 54058837..31153ea2 100644 --- a/changelogs/WinPythondot-64bit-3.12.10.0.md +++ b/changelogs/WinPythondot-64bit-3.12.10.0.md @@ -15,15 +15,15 @@ Name | Version | Description Name | Version | Description -----|---------|------------ [Python](http://www.python.org/) | 3.12.10 | Python programming language with standard library -[build](https://pypi.org/project/build) | 1.2.2.post1 | -[colorama](https://pypi.org/project/colorama) | 0.4.6 | -[packaging](https://pypi.org/project/packaging) | 24.2 | -[pip](https://pypi.org/project/pip) | 25.0.1 | -[pyproject-hooks](https://pypi.org/project/pyproject-hooks) | 1.1.0 | -[setuptools](https://pypi.org/project/setuptools) | 75.8.2 | -[sqlite-bro](https://pypi.org/project/sqlite-bro) | 0.13.1 | -[sv-ttk](https://pypi.org/project/sv-ttk) | 2.6.0 | -[wheel](https://pypi.org/project/wheel) | 0.45.1 | -[winpython](https://pypi.org/project/winpython) | 15.3.20250425 | +[build](https://pypi.org/project/build) | 1.2.2.post1 | A simple, correct Python build frontend +[colorama](https://pypi.org/project/colorama) | 0.4.6 | Cross-platform colored terminal text. +[packaging](https://pypi.org/project/packaging) | 24.2 | Core utilities for Python packages +[pip](https://pypi.org/project/pip) | 25.0.1 | The PyPA recommended tool for installing Python packages. +[pyproject-hooks](https://pypi.org/project/pyproject-hooks) | 1.1.0 | Wrappers to call pyproject.toml-based build backend hooks. +[setuptools](https://pypi.org/project/setuptools) | 75.8.2 | Easily download, build, install, upgrade, and uninstall Python packages +[sqlite-bro](https://pypi.org/project/sqlite-bro) | 0.13.1 | a graphic SQLite Client in 1 Python file +[sv-ttk](https://pypi.org/project/sv-ttk) | 2.6.0 | A gorgeous theme for Tkinter, based on Windows 11's UI +[wheel](https://pypi.org/project/wheel) | 0.45.1 | A built-package format for Python +[winpython](https://pypi.org/project/winpython) | 15.3.20250425 | WinPython distribution tools, including WPPM diff --git a/changelogs/WinPythondot-64bit-3.13.3.0.md b/changelogs/WinPythondot-64bit-3.13.3.0.md index 3e806313..210bbc6d 100644 --- a/changelogs/WinPythondot-64bit-3.13.3.0.md +++ b/changelogs/WinPythondot-64bit-3.13.3.0.md @@ -15,15 +15,15 @@ Name | Version | Description Name | Version | Description -----|---------|------------ [Python](http://www.python.org/) | 3.13.3 | Python programming language with standard library -[build](https://pypi.org/project/build) | 1.2.2.post1 | -[colorama](https://pypi.org/project/colorama) | 0.4.6 | -[packaging](https://pypi.org/project/packaging) | 24.2 | -[pip](https://pypi.org/project/pip) | 25.0.1 | -[pyproject-hooks](https://pypi.org/project/pyproject-hooks) | 1.1.0 | -[setuptools](https://pypi.org/project/setuptools) | 75.8.2 | -[sqlite-bro](https://pypi.org/project/sqlite-bro) | 0.13.1 | -[sv-ttk](https://pypi.org/project/sv-ttk) | 2.6.0 | -[wheel](https://pypi.org/project/wheel) | 0.45.1 | -[winpython](https://pypi.org/project/winpython) | 15.3.20250425 | +[build](https://pypi.org/project/build) | 1.2.2.post1 | A simple, correct Python build frontend +[colorama](https://pypi.org/project/colorama) | 0.4.6 | Cross-platform colored terminal text. +[packaging](https://pypi.org/project/packaging) | 24.2 | Core utilities for Python packages +[pip](https://pypi.org/project/pip) | 25.0.1 | The PyPA recommended tool for installing Python packages. +[pyproject-hooks](https://pypi.org/project/pyproject-hooks) | 1.1.0 | Wrappers to call pyproject.toml-based build backend hooks. +[setuptools](https://pypi.org/project/setuptools) | 75.8.2 | Easily download, build, install, upgrade, and uninstall Python packages +[sqlite-bro](https://pypi.org/project/sqlite-bro) | 0.13.1 | a graphic SQLite Client in 1 Python file +[sv-ttk](https://pypi.org/project/sv-ttk) | 2.6.0 | A gorgeous theme for Tkinter, based on Windows 11's UI +[wheel](https://pypi.org/project/wheel) | 0.45.1 | A built-package format for Python +[winpython](https://pypi.org/project/winpython) | 15.3.20250425 | WinPython distribution tools, including WPPM diff --git a/changelogs/WinPythonslim-64bit-3.12.10.0.md b/changelogs/WinPythonslim-64bit-3.12.10.0.md index 3e036135..a8084d3f 100644 --- a/changelogs/WinPythonslim-64bit-3.12.10.0.md +++ b/changelogs/WinPythonslim-64bit-3.12.10.0.md @@ -15,501 +15,501 @@ Name | Version | Description Name | Version | Description -----|---------|------------ [Python](http://www.python.org/) | 3.12.10 | Python programming language with standard library -[absl-py](https://pypi.org/project/absl-py) | 2.0.0 | -[adbc-driver-manager](https://pypi.org/project/adbc-driver-manager) | 1.3.0 | -[aiofiles](https://pypi.org/project/aiofiles) | 23.2.1 | -[aiohappyeyeballs](https://pypi.org/project/aiohappyeyeballs) | 2.4.4 | -[aiohttp](https://pypi.org/project/aiohttp) | 3.11.11 | -[aiosignal](https://pypi.org/project/aiosignal) | 1.3.1 | -[aiosqlite](https://pypi.org/project/aiosqlite) | 0.20.0 | -[alabaster](https://pypi.org/project/alabaster) | 0.7.16 | -[alembic](https://pypi.org/project/alembic) | 1.15.1 | -[altair](https://pypi.org/project/altair) | 5.5.0 | -[aniso8601](https://pypi.org/project/aniso8601) | 9.0.1 | -[annotated-types](https://pypi.org/project/annotated-types) | 0.6.0 | -[ansicolors](https://pypi.org/project/ansicolors) | 1.1.8 | -[anthropic](https://pypi.org/project/anthropic) | 0.49.0 | -[anyio](https://pypi.org/project/anyio) | 4.8.0 | -[anywidget](https://pypi.org/project/anywidget) | 0.9.12 | -[appdirs](https://pypi.org/project/appdirs) | 1.4.4 | -[argon2-cffi](https://pypi.org/project/argon2-cffi) | 23.1.0 | -[argon2-cffi-bindings](https://pypi.org/project/argon2-cffi-bindings) | 21.2.0 | -[array-api-compat](https://pypi.org/project/array-api-compat) | 1.11.1 | -[arrow](https://pypi.org/project/arrow) | 1.3.0 | -[asgi-csrf](https://pypi.org/project/asgi-csrf) | 0.9 | -[asgiref](https://pypi.org/project/asgiref) | 3.8.1 | -[asn1crypto](https://pypi.org/project/asn1crypto) | 1.5.1 | -[asteval](https://pypi.org/project/asteval) | 0.9.31 | -[astroid](https://pypi.org/project/astroid) | 3.1.0 | -[astropy](https://pypi.org/project/astropy) | 6.1.6 | -[astropy-iers-data](https://pypi.org/project/astropy-iers-data) | 0.2024.12.23.0.33.24 | -[asttokens](https://pypi.org/project/asttokens) | 2.4.1 | -[async-lru](https://pypi.org/project/async-lru) | 2.0.4 | -[asyncssh](https://pypi.org/project/asyncssh) | 2.20.0 | -[atomicwrites](https://pypi.org/project/atomicwrites) | 1.4.0 | -[attrs](https://pypi.org/project/attrs) | 23.2.0 | -[autopep8](https://pypi.org/project/autopep8) | 2.0.4 | -[azure-core](https://pypi.org/project/azure-core) | 1.32.0 | -[azure-cosmos](https://pypi.org/project/azure-cosmos) | 4.9.0 | -[azure-identity](https://pypi.org/project/azure-identity) | 1.21.0 | -[babel](https://pypi.org/project/babel) | 2.16.0 | -[baresql](https://pypi.org/project/baresql) | 1.0.0 | -[beautifulsoup4](https://pypi.org/project/beautifulsoup4) | 4.12.2 | -[binaryornot](https://pypi.org/project/binaryornot) | 0.4.4 | -[black](https://pypi.org/project/black) | 25.1.0 | -[bleach](https://pypi.org/project/bleach) | 6.1.0 | -[blinker](https://pypi.org/project/blinker) | 1.9.0 | -[bokeh](https://pypi.org/project/bokeh) | 3.7.2 | -[branca](https://pypi.org/project/branca) | 0.8.0 | -[brotli](https://pypi.org/project/brotli) | 1.1.0 | -[build](https://pypi.org/project/build) | 1.2.2.post1 | -[cachetools](https://pypi.org/project/cachetools) | 5.5.2 | -[certifi](https://pypi.org/project/certifi) | 2025.1.31 | -[cffi](https://pypi.org/project/cffi) | 1.17.1 | -[chardet](https://pypi.org/project/chardet) | 5.2.0 | -[charset-normalizer](https://pypi.org/project/charset-normalizer) | 3.4.0 | -[clarabel](https://pypi.org/project/clarabel) | 0.10.0 | -[click](https://pypi.org/project/click) | 8.1.8 | -[click-default-group](https://pypi.org/project/click-default-group) | 1.2.4 | -[cloudpickle](https://pypi.org/project/cloudpickle) | 3.1.1 | +[absl-py](https://pypi.org/project/absl-py) | 2.0.0 | Abseil Python Common Libraries, see https://github.com/abseil/abseil-py. +[adbc-driver-manager](https://pypi.org/project/adbc-driver-manager) | 1.3.0 | A generic entrypoint for ADBC drivers. +[aiofiles](https://pypi.org/project/aiofiles) | 23.2.1 | File support for asyncio. +[aiohappyeyeballs](https://pypi.org/project/aiohappyeyeballs) | 2.4.4 | Happy Eyeballs for asyncio +[aiohttp](https://pypi.org/project/aiohttp) | 3.11.11 | Async http client/server framework (asyncio) +[aiosignal](https://pypi.org/project/aiosignal) | 1.3.1 | aiosignal: a list of registered asynchronous callbacks +[aiosqlite](https://pypi.org/project/aiosqlite) | 0.20.0 | asyncio bridge to the standard sqlite3 module +[alabaster](https://pypi.org/project/alabaster) | 0.7.16 | A light, configurable Sphinx theme +[alembic](https://pypi.org/project/alembic) | 1.15.1 | A database migration tool for SQLAlchemy. +[altair](https://pypi.org/project/altair) | 5.5.0 | Vega-Altair: A declarative statistical visualization library for Python. +[aniso8601](https://pypi.org/project/aniso8601) | 9.0.1 | A library for parsing ISO 8601 strings. +[annotated-types](https://pypi.org/project/annotated-types) | 0.6.0 | Reusable constraint types to use with typing.Annotated +[ansicolors](https://pypi.org/project/ansicolors) | 1.1.8 | ANSI colors for Python +[anthropic](https://pypi.org/project/anthropic) | 0.49.0 | The official Python library for the anthropic API +[anyio](https://pypi.org/project/anyio) | 4.8.0 | High level compatibility layer for multiple asynchronous event loop implementations +[anywidget](https://pypi.org/project/anywidget) | 0.9.12 | custom jupyter widgets made easy +[appdirs](https://pypi.org/project/appdirs) | 1.4.4 | A small Python module for determining appropriate platform-specific dirs, e.g. a "user data dir". +[argon2-cffi](https://pypi.org/project/argon2-cffi) | 23.1.0 | Argon2 for Python +[argon2-cffi-bindings](https://pypi.org/project/argon2-cffi-bindings) | 21.2.0 | Low-level CFFI bindings for Argon2 +[array-api-compat](https://pypi.org/project/array-api-compat) | 1.11.1 | A wrapper around NumPy and other array libraries to make them compatible with the Array API standard +[arrow](https://pypi.org/project/arrow) | 1.3.0 | Better dates & times for Python +[asgi-csrf](https://pypi.org/project/asgi-csrf) | 0.9 | ASGI middleware for protecting against CSRF attacks +[asgiref](https://pypi.org/project/asgiref) | 3.8.1 | ASGI specs, helper code, and adapters +[asn1crypto](https://pypi.org/project/asn1crypto) | 1.5.1 | Fast ASN.1 parser and serializer with definitions for private keys, public keys, certificates, CRL, OCSP, CMS, PKCS#3, PKCS#7, PKCS#8, PKCS#12, +[asteval](https://pypi.org/project/asteval) | 0.9.31 | Safe, minimalistic evaluator of python expression using ast module +[astroid](https://pypi.org/project/astroid) | 3.1.0 | An abstract syntax tree for Python with inference support. +[astropy](https://pypi.org/project/astropy) | 6.1.6 | Astronomy and astrophysics core library +[astropy-iers-data](https://pypi.org/project/astropy-iers-data) | 0.2024.12.23.0.33.24 | IERS Earth Rotation and Leap Second tables for the astropy core package +[asttokens](https://pypi.org/project/asttokens) | 2.4.1 | Annotate AST trees with source code positions +[async-lru](https://pypi.org/project/async-lru) | 2.0.4 | Simple LRU cache for asyncio +[asyncssh](https://pypi.org/project/asyncssh) | 2.20.0 | AsyncSSH: Asynchronous SSHv2 client and server library +[atomicwrites](https://pypi.org/project/atomicwrites) | 1.4.0 | Atomic file writes. +[attrs](https://pypi.org/project/attrs) | 23.2.0 | Classes Without Boilerplate +[autopep8](https://pypi.org/project/autopep8) | 2.0.4 | A tool that automatically formats Python code to conform to the PEP 8 style guide +[azure-core](https://pypi.org/project/azure-core) | 1.32.0 | Microsoft Azure Core Library for Python +[azure-cosmos](https://pypi.org/project/azure-cosmos) | 4.9.0 | Microsoft Azure Cosmos Client Library for Python +[azure-identity](https://pypi.org/project/azure-identity) | 1.21.0 | Microsoft Azure Identity Library for Python +[babel](https://pypi.org/project/babel) | 2.16.0 | Internationalization utilities +[baresql](https://pypi.org/project/baresql) | 1.0.0 | playing SQL directly on Python datas +[beautifulsoup4](https://pypi.org/project/beautifulsoup4) | 4.12.2 | Screen-scraping library +[binaryornot](https://pypi.org/project/binaryornot) | 0.4.4 | Ultra-lightweight pure Python package to check if a file is binary or text. +[black](https://pypi.org/project/black) | 25.1.0 | The uncompromising code formatter. +[bleach](https://pypi.org/project/bleach) | 6.1.0 | An easy safelist-based HTML-sanitizing tool. +[blinker](https://pypi.org/project/blinker) | 1.9.0 | Fast, simple object-to-object and broadcast signaling +[bokeh](https://pypi.org/project/bokeh) | 3.7.2 | Interactive plots and applications in the browser from Python +[branca](https://pypi.org/project/branca) | 0.8.0 | Generate complex HTML+JS pages with Python +[brotli](https://pypi.org/project/brotli) | 1.1.0 | Python bindings for the Brotli compression library +[build](https://pypi.org/project/build) | 1.2.2.post1 | A simple, correct Python build frontend +[cachetools](https://pypi.org/project/cachetools) | 5.5.2 | Extensible memoizing collections and decorators +[certifi](https://pypi.org/project/certifi) | 2025.1.31 | Python package for providing Mozilla's CA Bundle. +[cffi](https://pypi.org/project/cffi) | 1.17.1 | Foreign Function Interface for Python calling C code. +[chardet](https://pypi.org/project/chardet) | 5.2.0 | Universal encoding detector for Python 3 +[charset-normalizer](https://pypi.org/project/charset-normalizer) | 3.4.0 | The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet. +[clarabel](https://pypi.org/project/clarabel) | 0.10.0 | Clarabel Conic Interior Point Solver for Rust / Python +[click](https://pypi.org/project/click) | 8.1.8 | Composable command line interface toolkit +[click-default-group](https://pypi.org/project/click-default-group) | 1.2.4 | click_default_group +[cloudpickle](https://pypi.org/project/cloudpickle) | 3.1.1 | Pickler class to extend the standard pickle.Pickler functionality [cohere](https://pypi.org/project/cohere) | 5.13.12 | -[colorama](https://pypi.org/project/colorama) | 0.4.6 | -[colorcet](https://pypi.org/project/colorcet) | 3.1.0 | -[colorlog](https://pypi.org/project/colorlog) | 6.8.2 | -[comm](https://pypi.org/project/comm) | 0.2.2 | -[contourpy](https://pypi.org/project/contourpy) | 1.3.1 | -[cookiecutter](https://pypi.org/project/cookiecutter) | 2.6.0 | -[cryptography](https://pypi.org/project/cryptography) | 44.0.0 | -[cvxopt](https://pypi.org/project/cvxopt) | 1.3.2 | -[cvxpy](https://pypi.org/project/cvxpy) | 1.6.4 | -[cycler](https://pypi.org/project/cycler) | 0.12.1 | -[cython](https://pypi.org/project/cython) | 3.0.12 | -[cytoolz](https://pypi.org/project/cytoolz) | 1.0.1 | -[dask](https://pypi.org/project/dask) | 2025.3.0 | -[datasette](https://pypi.org/project/datasette) | 0.65.1 | -[datasette-graphql](https://pypi.org/project/datasette-graphql) | 2.2 | -[datashader](https://pypi.org/project/datashader) | 0.17.0 | -[deap](https://pypi.org/project/deap) | 1.4.2 | -[debugpy](https://pypi.org/project/debugpy) | 1.8.0 | -[decorator](https://pypi.org/project/decorator) | 5.1.1 | -[defusedxml](https://pypi.org/project/defusedxml) | 0.7.1 | -[deprecated](https://pypi.org/project/deprecated) | 1.2.14 | -[diff-match-patch](https://pypi.org/project/diff-match-patch) | 20241021 | -[dill](https://pypi.org/project/dill) | 0.3.9 | -[distributed](https://pypi.org/project/distributed) | 2025.3.0 | -[distro](https://pypi.org/project/distro) | 1.8.0 | -[django](https://pypi.org/project/django) | 5.0.7 | -[dnspython](https://pypi.org/project/dnspython) | 2.6.1 | -[docstring-to-markdown](https://pypi.org/project/docstring-to-markdown) | 0.15 | -[docutils](https://pypi.org/project/docutils) | 0.21.2 | -[duckdb](https://pypi.org/project/duckdb) | 1.2.2 | -[entrypoints](https://pypi.org/project/entrypoints) | 0.4 | -[et-xmlfile](https://pypi.org/project/et-xmlfile) | 1.1.0 | -[eval-type-backport](https://pypi.org/project/eval-type-backport) | 0.2.2 | -[executing](https://pypi.org/project/executing) | 2.0.1 | -[faker](https://pypi.org/project/faker) | 36.1.1 | -[fast-histogram](https://pypi.org/project/fast-histogram) | 0.14 | -[fastapi](https://pypi.org/project/fastapi) | 0.115.8 | -[fastavro](https://pypi.org/project/fastavro) | 1.10.0 | -[fastjsonschema](https://pypi.org/project/fastjsonschema) | 2.18.0 | -[filelock](https://pypi.org/project/filelock) | 3.17.0 | -[flake8](https://pypi.org/project/flake8) | 7.1.1 | -[flask](https://pypi.org/project/flask) | 3.1.0 | -[flexcache](https://pypi.org/project/flexcache) | 0.3 | -[flexparser](https://pypi.org/project/flexparser) | 0.4 | -[flit](https://pypi.org/project/flit) | 3.10.1 | -[flit-core](https://pypi.org/project/flit-core) | 3.10.1 | -[folium](https://pypi.org/project/folium) | 0.19.5 | -[fonttools](https://pypi.org/project/fonttools) | 4.55.3 | -[fqdn](https://pypi.org/project/fqdn) | 1.5.1 | -[frozenlist](https://pypi.org/project/frozenlist) | 1.5.0 | -[fsspec](https://pypi.org/project/fsspec) | 2024.6.1 | -[fuzzywuzzy](https://pypi.org/project/fuzzywuzzy) | 0.18.0 | -[geographiclib](https://pypi.org/project/geographiclib) | 2.0 | -[geopandas](https://pypi.org/project/geopandas) | 1.0.1 | -[geopy](https://pypi.org/project/geopy) | 2.4.1 | -[gitdb](https://pypi.org/project/gitdb) | 4.0.10 | -[gitpython](https://pypi.org/project/gitpython) | 3.1.32 | -[google-auth](https://pypi.org/project/google-auth) | 2.37.0 | -[graphene](https://pypi.org/project/graphene) | 3.3 | -[graphql-core](https://pypi.org/project/graphql-core) | 3.2.3 | -[graphql-relay](https://pypi.org/project/graphql-relay) | 3.2.0 | -[greenlet](https://pypi.org/project/greenlet) | 3.1.1 | -[griffe](https://pypi.org/project/griffe) | 1.5.5 | -[groq](https://pypi.org/project/groq) | 0.13.1 | -[guidata](https://pypi.org/project/guidata) | 3.7.1 | -[h11](https://pypi.org/project/h11) | 0.14.0 | -[h2](https://pypi.org/project/h2) | 4.1.0 | -[h5py](https://pypi.org/project/h5py) | 3.12.1 | -[hatchling](https://pypi.org/project/hatchling) | 1.27.0 | -[holoviews](https://pypi.org/project/holoviews) | 1.20.2 | -[hpack](https://pypi.org/project/hpack) | 4.1.0 | -[html5lib](https://pypi.org/project/html5lib) | 1.1 | -[httpcore](https://pypi.org/project/httpcore) | 1.0.5 | -[httpie](https://pypi.org/project/httpie) | 3.2.4 | -[httpx](https://pypi.org/project/httpx) | 0.27.2 | -[httpx-sse](https://pypi.org/project/httpx-sse) | 0.4.0 | -[huggingface-hub](https://pypi.org/project/huggingface-hub) | 0.29.3 | -[hupper](https://pypi.org/project/hupper) | 1.12 | -[hvplot](https://pypi.org/project/hvplot) | 0.11.2 | -[hypercorn](https://pypi.org/project/hypercorn) | 0.17.3 | -[hyperframe](https://pypi.org/project/hyperframe) | 6.1.0 | -[hypothesis](https://pypi.org/project/hypothesis) | 6.130.4 | -[id](https://pypi.org/project/id) | 1.5.0 | -[idna](https://pypi.org/project/idna) | 3.10 | -[imageio](https://pypi.org/project/imageio) | 2.37.0 | -[imagesize](https://pypi.org/project/imagesize) | 1.4.1 | -[imbalanced-learn](https://pypi.org/project/imbalanced-learn) | 0.13.0 | -[importlib-metadata](https://pypi.org/project/importlib-metadata) | 8.6.1 | -[inflection](https://pypi.org/project/inflection) | 0.5.1 | -[iniconfig](https://pypi.org/project/iniconfig) | 2.0.0 | -[intervaltree](https://pypi.org/project/intervaltree) | 3.0.2 | -[ipycanvas](https://pypi.org/project/ipycanvas) | 0.13.3 | -[ipykernel](https://pypi.org/project/ipykernel) | 6.29.5 | -[ipyleaflet](https://pypi.org/project/ipyleaflet) | 0.19.2 | -[ipympl](https://pypi.org/project/ipympl) | 0.9.7 | -[ipython](https://pypi.org/project/ipython) | 8.34.0 | -[ipython-genutils](https://pypi.org/project/ipython-genutils) | 0.2.0 | -[ipython-sql](https://pypi.org/project/ipython-sql) | 0.5.0 | -[ipywidgets](https://pypi.org/project/ipywidgets) | 8.1.6 | -[isoduration](https://pypi.org/project/isoduration) | 20.11.0 | -[isort](https://pypi.org/project/isort) | 5.13.2 | -[itsdangerous](https://pypi.org/project/itsdangerous) | 2.2.0 | -[janus](https://pypi.org/project/janus) | 2.0.0 | -[jaraco-classes](https://pypi.org/project/jaraco-classes) | 3.4.0 | -[jaraco-context](https://pypi.org/project/jaraco-context) | 6.0.1 | -[jaraco-functools](https://pypi.org/project/jaraco-functools) | 4.1.0 | -[jedi](https://pypi.org/project/jedi) | 0.19.2 | -[jellyfish](https://pypi.org/project/jellyfish) | 1.1.3 | -[jinja2](https://pypi.org/project/jinja2) | 3.1.2 | -[jiter](https://pypi.org/project/jiter) | 0.8.2 | -[joblib](https://pypi.org/project/joblib) | 1.4.2 | -[json5](https://pypi.org/project/json5) | 0.9.14 | -[jsonpatch](https://pypi.org/project/jsonpatch) | 1.33 | -[jsonpath-python](https://pypi.org/project/jsonpath-python) | 1.0.6 | -[jsonpointer](https://pypi.org/project/jsonpointer) | 2.4 | -[jsonschema](https://pypi.org/project/jsonschema) | 4.19.2 | -[jsonschema-specifications](https://pypi.org/project/jsonschema-specifications) | 2023.12.1 | -[julia](https://pypi.org/project/julia) | 0.6.2 | -[jupyter](https://pypi.org/project/jupyter) | 1.1.1 | -[jupyter-bokeh](https://pypi.org/project/jupyter-bokeh) | 4.0.5 | -[jupyter-client](https://pypi.org/project/jupyter-client) | 8.6.3 | -[jupyter-console](https://pypi.org/project/jupyter-console) | 6.6.3 | -[jupyter-core](https://pypi.org/project/jupyter-core) | 5.7.2 | -[jupyter-events](https://pypi.org/project/jupyter-events) | 0.12.0 | -[jupyter-leaflet](https://pypi.org/project/jupyter-leaflet) | 0.19.2 | -[jupyter-lsp](https://pypi.org/project/jupyter-lsp) | 2.2.5 | -[jupyter-server](https://pypi.org/project/jupyter-server) | 2.14.2 | -[jupyter-server-terminals](https://pypi.org/project/jupyter-server-terminals) | 0.5.3 | -[jupyterlab](https://pypi.org/project/jupyterlab) | 4.4.1 | -[jupyterlab-pygments](https://pypi.org/project/jupyterlab-pygments) | 0.3.0 | -[jupyterlab-server](https://pypi.org/project/jupyterlab-server) | 2.27.3 | -[jupyterlab-widgets](https://pypi.org/project/jupyterlab-widgets) | 3.0.14 | -[keras](https://pypi.org/project/keras) | 3.9.2 | -[keyring](https://pypi.org/project/keyring) | 25.6.0 | -[kiwisolver](https://pypi.org/project/kiwisolver) | 1.4.8 | -[langchain](https://pypi.org/project/langchain) | 0.3.23 | -[langchain-core](https://pypi.org/project/langchain-core) | 0.3.51 | -[langchain-text-splitters](https://pypi.org/project/langchain-text-splitters) | 0.3.8 | -[langsmith](https://pypi.org/project/langsmith) | 0.3.24 | -[lazy-loader](https://pypi.org/project/lazy-loader) | 0.4 | -[linkify-it-py](https://pypi.org/project/linkify-it-py) | 2.0.2 | -[llvmlite](https://pypi.org/project/llvmlite) | 0.44.0 | -[lmfit](https://pypi.org/project/lmfit) | 1.3.1 | -[locket](https://pypi.org/project/locket) | 1.0.0 | -[logfire-api](https://pypi.org/project/logfire-api) | 3.5.3 | -[lxml](https://pypi.org/project/lxml) | 5.3.0 | -[mako](https://pypi.org/project/mako) | 1.3.5 | -[markdown](https://pypi.org/project/markdown) | 3.7 | -[markdown-it-py](https://pypi.org/project/markdown-it-py) | 2.2.0 | -[markupsafe](https://pypi.org/project/markupsafe) | 3.0.2 | -[matplotlib](https://pypi.org/project/matplotlib) | 3.10.1 | -[matplotlib-inline](https://pypi.org/project/matplotlib-inline) | 0.1.7 | -[maturin](https://pypi.org/project/maturin) | 1.8.1 | -[mccabe](https://pypi.org/project/mccabe) | 0.7.0 | -[mdit-py-plugins](https://pypi.org/project/mdit-py-plugins) | 0.3.5 | -[mdurl](https://pypi.org/project/mdurl) | 0.1.2 | -[mercantile](https://pypi.org/project/mercantile) | 1.2.1 | -[mergedeep](https://pypi.org/project/mergedeep) | 1.3.4 | -[missingno](https://pypi.org/project/missingno) | 0.5.1 | -[mistralai](https://pypi.org/project/mistralai) | 1.2.5 | -[mistune](https://pypi.org/project/mistune) | 2.0.5 | -[mizani](https://pypi.org/project/mizani) | 0.11.4 | +[colorama](https://pypi.org/project/colorama) | 0.4.6 | Cross-platform colored terminal text. +[colorcet](https://pypi.org/project/colorcet) | 3.1.0 | Collection of perceptually uniform colormaps +[colorlog](https://pypi.org/project/colorlog) | 6.8.2 | Add colours to the output of Python's logging module. +[comm](https://pypi.org/project/comm) | 0.2.2 | Jupyter Python Comm implementation, for usage in ipykernel, xeus-python etc. +[contourpy](https://pypi.org/project/contourpy) | 1.3.1 | Python library for calculating contours of 2D quadrilateral grids +[cookiecutter](https://pypi.org/project/cookiecutter) | 2.6.0 | A command-line utility that creates projects from project templates, e.g. +[cryptography](https://pypi.org/project/cryptography) | 44.0.0 | cryptography is a package which provides cryptographic recipes and primitives to Python developers. +[cvxopt](https://pypi.org/project/cvxopt) | 1.3.2 | Convex optimization package +[cvxpy](https://pypi.org/project/cvxpy) | 1.6.4 | A domain-specific language for modeling convex optimization problems in Python. +[cycler](https://pypi.org/project/cycler) | 0.12.1 | Composable style cycles +[cython](https://pypi.org/project/cython) | 3.0.12 | The Cython compiler for writing C extensions in the Python language. +[cytoolz](https://pypi.org/project/cytoolz) | 1.0.1 | Cython implementation of Toolz: High performance functional utilities +[dask](https://pypi.org/project/dask) | 2025.3.0 | Parallel PyData with Task Scheduling +[datasette](https://pypi.org/project/datasette) | 0.65.1 | An open source multi-tool for exploring and publishing data +[datasette-graphql](https://pypi.org/project/datasette-graphql) | 2.2 | Datasette plugin providing an automatic GraphQL API for your SQLite databases +[datashader](https://pypi.org/project/datashader) | 0.17.0 | Data visualization toolchain based on aggregating into a grid +[deap](https://pypi.org/project/deap) | 1.4.2 | Distributed Evolutionary Algorithms in Python +[debugpy](https://pypi.org/project/debugpy) | 1.8.0 | An implementation of the Debug Adapter Protocol for Python +[decorator](https://pypi.org/project/decorator) | 5.1.1 | Decorators for Humans +[defusedxml](https://pypi.org/project/defusedxml) | 0.7.1 | XML bomb protection for Python stdlib modules +[deprecated](https://pypi.org/project/deprecated) | 1.2.14 | Python @deprecated decorator to deprecate old python classes, functions or methods. +[diff-match-patch](https://pypi.org/project/diff-match-patch) | 20241021 | Repackaging of Google's Diff Match and Patch libraries. +[dill](https://pypi.org/project/dill) | 0.3.9 | serialize all of Python +[distributed](https://pypi.org/project/distributed) | 2025.3.0 | Distributed scheduler for Dask +[distro](https://pypi.org/project/distro) | 1.8.0 | Distro - an OS platform information API +[django](https://pypi.org/project/django) | 5.0.7 | A high-level Python web framework that encourages rapid development and clean, pragmatic design. +[dnspython](https://pypi.org/project/dnspython) | 2.6.1 | DNS toolkit +[docstring-to-markdown](https://pypi.org/project/docstring-to-markdown) | 0.15 | On the fly conversion of Python docstrings to markdown +[docutils](https://pypi.org/project/docutils) | 0.21.2 | Docutils -- Python Documentation Utilities +[duckdb](https://pypi.org/project/duckdb) | 1.2.2 | DuckDB in-process database +[entrypoints](https://pypi.org/project/entrypoints) | 0.4 | Discover and load entry points from installed packages. +[et-xmlfile](https://pypi.org/project/et-xmlfile) | 1.1.0 | An implementation of lxml.xmlfile for the standard library +[eval-type-backport](https://pypi.org/project/eval-type-backport) | 0.2.2 | Like `typing._eval_type`, but lets older Python versions use newer typing features. +[executing](https://pypi.org/project/executing) | 2.0.1 | Get the currently executing AST node of a frame, and other information +[faker](https://pypi.org/project/faker) | 36.1.1 | Faker is a Python package that generates fake data for you. +[fast-histogram](https://pypi.org/project/fast-histogram) | 0.14 | Fast simple 1D and 2D histograms +[fastapi](https://pypi.org/project/fastapi) | 0.115.8 | FastAPI framework, high performance, easy to learn, fast to code, ready for production +[fastavro](https://pypi.org/project/fastavro) | 1.10.0 | Fast read/write of AVRO files +[fastjsonschema](https://pypi.org/project/fastjsonschema) | 2.18.0 | Fastest Python implementation of JSON schema +[filelock](https://pypi.org/project/filelock) | 3.17.0 | A platform independent file lock. +[flake8](https://pypi.org/project/flake8) | 7.1.1 | the modular source code checker: pep8 pyflakes and co +[flask](https://pypi.org/project/flask) | 3.1.0 | A simple framework for building complex web applications. +[flexcache](https://pypi.org/project/flexcache) | 0.3 | Saves and loads to the cache a transformed versions of a source object. +[flexparser](https://pypi.org/project/flexparser) | 0.4 | Parsing made fun ... using typing. +[flit](https://pypi.org/project/flit) | 3.10.1 | A simple packaging tool for simple packages. +[flit-core](https://pypi.org/project/flit-core) | 3.10.1 | Distribution-building parts of Flit. See flit package for more information +[folium](https://pypi.org/project/folium) | 0.19.5 | Make beautiful maps with Leaflet.js & Python +[fonttools](https://pypi.org/project/fonttools) | 4.55.3 | Tools to manipulate font files +[fqdn](https://pypi.org/project/fqdn) | 1.5.1 | Validates fully-qualified domain names against RFC 1123, so that they are acceptable to modern bowsers +[frozenlist](https://pypi.org/project/frozenlist) | 1.5.0 | A list-like structure which implements collections.abc.MutableSequence +[fsspec](https://pypi.org/project/fsspec) | 2024.6.1 | File-system specification +[fuzzywuzzy](https://pypi.org/project/fuzzywuzzy) | 0.18.0 | Fuzzy string matching in python +[geographiclib](https://pypi.org/project/geographiclib) | 2.0 | The geodesic routines from GeographicLib +[geopandas](https://pypi.org/project/geopandas) | 1.0.1 | Geographic pandas extensions +[geopy](https://pypi.org/project/geopy) | 2.4.1 | Python Geocoding Toolbox +[gitdb](https://pypi.org/project/gitdb) | 4.0.10 | Git Object Database +[gitpython](https://pypi.org/project/gitpython) | 3.1.32 | GitPython is a Python library used to interact with Git repositories +[google-auth](https://pypi.org/project/google-auth) | 2.37.0 | Google Authentication Library +[graphene](https://pypi.org/project/graphene) | 3.3 | GraphQL Framework for Python +[graphql-core](https://pypi.org/project/graphql-core) | 3.2.3 | GraphQL implementation for Python, a port of GraphQL.js, the JavaScript reference implementation for GraphQL. +[graphql-relay](https://pypi.org/project/graphql-relay) | 3.2.0 | Relay library for graphql-core +[greenlet](https://pypi.org/project/greenlet) | 3.1.1 | Lightweight in-process concurrent programming +[griffe](https://pypi.org/project/griffe) | 1.5.5 | Signatures for entire Python programs. +[groq](https://pypi.org/project/groq) | 0.13.1 | The official Python library for the groq API +[guidata](https://pypi.org/project/guidata) | 3.7.1 | Automatic GUI generation for easy dataset editing and display +[h11](https://pypi.org/project/h11) | 0.14.0 | A pure-Python, bring-your-own-I/O implementation of HTTP/1.1 +[h2](https://pypi.org/project/h2) | 4.1.0 | HTTP/2 State-Machine based protocol implementation +[h5py](https://pypi.org/project/h5py) | 3.12.1 | Read and write HDF5 files from Python +[hatchling](https://pypi.org/project/hatchling) | 1.27.0 | Modern, extensible Python build backend +[holoviews](https://pypi.org/project/holoviews) | 1.20.2 | A high-level plotting API for the PyData ecosystem built on HoloViews. +[hpack](https://pypi.org/project/hpack) | 4.1.0 | Pure-Python HPACK header encoding +[html5lib](https://pypi.org/project/html5lib) | 1.1 | HTML parser based on the WHATWG HTML specification +[httpcore](https://pypi.org/project/httpcore) | 1.0.5 | A minimal low-level HTTP client. +[httpie](https://pypi.org/project/httpie) | 3.2.4 | HTTPie: modern, user-friendly command-line HTTP client for the API era. +[httpx](https://pypi.org/project/httpx) | 0.27.2 | The next generation HTTP client. +[httpx-sse](https://pypi.org/project/httpx-sse) | 0.4.0 | Consume Server-Sent Event (SSE) messages with HTTPX. +[huggingface-hub](https://pypi.org/project/huggingface-hub) | 0.29.3 | Client library to download and publish models, datasets and other repos on the huggingface.co hub +[hupper](https://pypi.org/project/hupper) | 1.12 | Integrated process monitor for developing and reloading daemons. +[hvplot](https://pypi.org/project/hvplot) | 0.11.2 | A high-level plotting API for the PyData ecosystem built on HoloViews. +[hypercorn](https://pypi.org/project/hypercorn) | 0.17.3 | A ASGI Server based on Hyper libraries and inspired by Gunicorn +[hyperframe](https://pypi.org/project/hyperframe) | 6.1.0 | Pure-Python HTTP/2 framing +[hypothesis](https://pypi.org/project/hypothesis) | 6.130.4 | A library for property-based testing +[id](https://pypi.org/project/id) | 1.5.0 | A tool for generating OIDC identities +[idna](https://pypi.org/project/idna) | 3.10 | Internationalized Domain Names in Applications (IDNA) +[imageio](https://pypi.org/project/imageio) | 2.37.0 | Library for reading and writing a wide range of image, video, scientific, and volumetric data formats. +[imagesize](https://pypi.org/project/imagesize) | 1.4.1 | Getting image size from png/jpeg/jpeg2000/gif file +[imbalanced-learn](https://pypi.org/project/imbalanced-learn) | 0.13.0 | Toolbox for imbalanced dataset in machine learning +[importlib-metadata](https://pypi.org/project/importlib-metadata) | 8.6.1 | Read metadata from Python packages +[inflection](https://pypi.org/project/inflection) | 0.5.1 | A port of Ruby on Rails inflector to Python +[iniconfig](https://pypi.org/project/iniconfig) | 2.0.0 | brain-dead simple config-ini parsing +[intervaltree](https://pypi.org/project/intervaltree) | 3.0.2 | Editable interval tree data structure for Python 2 and 3 +[ipycanvas](https://pypi.org/project/ipycanvas) | 0.13.3 | Interactive widgets library exposing the browser's Canvas API +[ipykernel](https://pypi.org/project/ipykernel) | 6.29.5 | IPython Kernel for Jupyter +[ipyleaflet](https://pypi.org/project/ipyleaflet) | 0.19.2 | A Jupyter widget for dynamic Leaflet maps +[ipympl](https://pypi.org/project/ipympl) | 0.9.7 | Matplotlib Jupyter Extension +[ipython](https://pypi.org/project/ipython) | 8.34.0 | IPython: Productive Interactive Computing +[ipython-genutils](https://pypi.org/project/ipython-genutils) | 0.2.0 | Vestigial utilities from IPython +[ipython-sql](https://pypi.org/project/ipython-sql) | 0.5.0 | RDBMS access via IPython +[ipywidgets](https://pypi.org/project/ipywidgets) | 8.1.6 | Jupyter interactive widgets +[isoduration](https://pypi.org/project/isoduration) | 20.11.0 | Operations with ISO 8601 durations +[isort](https://pypi.org/project/isort) | 5.13.2 | A Python utility / library to sort Python imports. +[itsdangerous](https://pypi.org/project/itsdangerous) | 2.2.0 | Safely pass data to untrusted environments and back. +[janus](https://pypi.org/project/janus) | 2.0.0 | Mixed sync-async queue to interoperate between asyncio tasks and classic threads +[jaraco-classes](https://pypi.org/project/jaraco-classes) | 3.4.0 | Utility functions for Python class constructs +[jaraco-context](https://pypi.org/project/jaraco-context) | 6.0.1 | Useful decorators and context managers +[jaraco-functools](https://pypi.org/project/jaraco-functools) | 4.1.0 | Functools like those found in stdlib +[jedi](https://pypi.org/project/jedi) | 0.19.2 | An autocompletion tool for Python that can be used for text editors. +[jellyfish](https://pypi.org/project/jellyfish) | 1.1.3 | Approximate and phonetic matching of strings. +[jinja2](https://pypi.org/project/jinja2) | 3.1.2 | A very fast and expressive template engine. +[jiter](https://pypi.org/project/jiter) | 0.8.2 | Fast iterable JSON parser. +[joblib](https://pypi.org/project/joblib) | 1.4.2 | Lightweight pipelining with Python functions +[json5](https://pypi.org/project/json5) | 0.9.14 | A Python implementation of the JSON5 data format. +[jsonpatch](https://pypi.org/project/jsonpatch) | 1.33 | Apply JSON-Patches (RFC 6902) +[jsonpath-python](https://pypi.org/project/jsonpath-python) | 1.0.6 | A more powerful JSONPath implementation in modern python +[jsonpointer](https://pypi.org/project/jsonpointer) | 2.4 | Identify specific nodes in a JSON document (RFC 6901) +[jsonschema](https://pypi.org/project/jsonschema) | 4.19.2 | An implementation of JSON Schema validation for Python +[jsonschema-specifications](https://pypi.org/project/jsonschema-specifications) | 2023.12.1 | The JSON Schema meta-schemas and vocabularies, exposed as a Registry +[julia](https://pypi.org/project/julia) | 0.6.2 | Julia/Python bridge with IPython support. +[jupyter](https://pypi.org/project/jupyter) | 1.1.1 | Jupyter metapackage. Install all the Jupyter components in one go. +[jupyter-bokeh](https://pypi.org/project/jupyter-bokeh) | 4.0.5 | A Jupyter extension for rendering Bokeh content. +[jupyter-client](https://pypi.org/project/jupyter-client) | 8.6.3 | Jupyter protocol implementation and client libraries +[jupyter-console](https://pypi.org/project/jupyter-console) | 6.6.3 | Jupyter terminal console +[jupyter-core](https://pypi.org/project/jupyter-core) | 5.7.2 | Jupyter core package. A base package on which Jupyter projects rely. +[jupyter-events](https://pypi.org/project/jupyter-events) | 0.12.0 | Jupyter Event System library +[jupyter-leaflet](https://pypi.org/project/jupyter-leaflet) | 0.19.2 | ipyleaflet extensions for JupyterLab and Jupyter Notebook +[jupyter-lsp](https://pypi.org/project/jupyter-lsp) | 2.2.5 | Multi-Language Server WebSocket proxy for Jupyter Notebook/Lab server +[jupyter-server](https://pypi.org/project/jupyter-server) | 2.14.2 | The backend—i.e. core services, APIs, and REST endpoints—to Jupyter web applications. +[jupyter-server-terminals](https://pypi.org/project/jupyter-server-terminals) | 0.5.3 | A Jupyter Server Extension Providing Terminals. +[jupyterlab](https://pypi.org/project/jupyterlab) | 4.4.1 | JupyterLab computational environment +[jupyterlab-pygments](https://pypi.org/project/jupyterlab-pygments) | 0.3.0 | Pygments theme using JupyterLab CSS variables +[jupyterlab-server](https://pypi.org/project/jupyterlab-server) | 2.27.3 | A set of server components for JupyterLab and JupyterLab like applications. +[jupyterlab-widgets](https://pypi.org/project/jupyterlab-widgets) | 3.0.14 | Jupyter interactive widgets for JupyterLab +[keras](https://pypi.org/project/keras) | 3.9.2 | Multi-backend Keras +[keyring](https://pypi.org/project/keyring) | 25.6.0 | Store and access your passwords safely. +[kiwisolver](https://pypi.org/project/kiwisolver) | 1.4.8 | A fast implementation of the Cassowary constraint solver +[langchain](https://pypi.org/project/langchain) | 0.3.23 | Building applications with LLMs through composability +[langchain-core](https://pypi.org/project/langchain-core) | 0.3.51 | Building applications with LLMs through composability +[langchain-text-splitters](https://pypi.org/project/langchain-text-splitters) | 0.3.8 | LangChain text splitting utilities +[langsmith](https://pypi.org/project/langsmith) | 0.3.24 | Client library to connect to the LangSmith LLM Tracing and Evaluation Platform. +[lazy-loader](https://pypi.org/project/lazy-loader) | 0.4 | Makes it easy to load subpackages and functions on demand. +[linkify-it-py](https://pypi.org/project/linkify-it-py) | 2.0.2 | Links recognition library with FULL unicode support. +[llvmlite](https://pypi.org/project/llvmlite) | 0.44.0 | lightweight wrapper around basic LLVM functionality +[lmfit](https://pypi.org/project/lmfit) | 1.3.1 | Least-Squares Minimization with Bounds and Constraints +[locket](https://pypi.org/project/locket) | 1.0.0 | File-based locks for Python on Linux and Windows +[logfire-api](https://pypi.org/project/logfire-api) | 3.5.3 | Shim for the Logfire SDK which does nothing unless Logfire is installed +[lxml](https://pypi.org/project/lxml) | 5.3.0 | Powerful and Pythonic XML processing library combining libxml2/libxslt with the ElementTree API. +[mako](https://pypi.org/project/mako) | 1.3.5 | A super-fast templating language that borrows the best ideas from the existing templating languages. +[markdown](https://pypi.org/project/markdown) | 3.7 | Python implementation of John Gruber's Markdown. +[markdown-it-py](https://pypi.org/project/markdown-it-py) | 2.2.0 | Python port of markdown-it. Markdown parsing, done right! +[markupsafe](https://pypi.org/project/markupsafe) | 3.0.2 | Safely add untrusted strings to HTML/XML markup. +[matplotlib](https://pypi.org/project/matplotlib) | 3.10.1 | Python plotting package +[matplotlib-inline](https://pypi.org/project/matplotlib-inline) | 0.1.7 | Inline Matplotlib backend for Jupyter +[maturin](https://pypi.org/project/maturin) | 1.8.1 | Build and publish crates with pyo3, cffi and uniffi bindings as well as rust binaries as python packages +[mccabe](https://pypi.org/project/mccabe) | 0.7.0 | McCabe checker, plugin for flake8 +[mdit-py-plugins](https://pypi.org/project/mdit-py-plugins) | 0.3.5 | Collection of plugins for markdown-it-py +[mdurl](https://pypi.org/project/mdurl) | 0.1.2 | Markdown URL utilities +[mercantile](https://pypi.org/project/mercantile) | 1.2.1 | Web mercator XYZ tile utilities +[mergedeep](https://pypi.org/project/mergedeep) | 1.3.4 | A deep merge function for 🐍. +[missingno](https://pypi.org/project/missingno) | 0.5.1 | Missing data visualization module for Python. +[mistralai](https://pypi.org/project/mistralai) | 1.2.5 | Python Client SDK for the Mistral AI API. +[mistune](https://pypi.org/project/mistune) | 2.0.5 | A sane Markdown parser with useful plugins and renderers +[mizani](https://pypi.org/project/mizani) | 0.11.4 | Scales for Python [ml-dtypes](https://pypi.org/project/ml-dtypes) | 0.5.0 | -[mlxtend](https://pypi.org/project/mlxtend) | 0.23.3 | -[more-itertools](https://pypi.org/project/more-itertools) | 10.2.0 | -[mpl-scatter-density](https://pypi.org/project/mpl-scatter-density) | 0.7 | -[mpld3](https://pypi.org/project/mpld3) | 0.5.8 | -[mpmath](https://pypi.org/project/mpmath) | 1.3.0 | -[msal](https://pypi.org/project/msal) | 1.30.0 | -[msal-extensions](https://pypi.org/project/msal-extensions) | 1.2.0 | -[msgpack](https://pypi.org/project/msgpack) | 1.1.0 | -[multidict](https://pypi.org/project/multidict) | 6.1.0 | -[multipledispatch](https://pypi.org/project/multipledispatch) | 1.0.0 | -[mypy](https://pypi.org/project/mypy) | 1.15.0 | -[mypy-extensions](https://pypi.org/project/mypy-extensions) | 1.0.0 | -[mysql-connector-python](https://pypi.org/project/mysql-connector-python) | 9.2.0 | -[namex](https://pypi.org/project/namex) | 0.0.8 | -[narwhals](https://pypi.org/project/narwhals) | 1.30.0 | -[nbclient](https://pypi.org/project/nbclient) | 0.10.0 | -[nbconvert](https://pypi.org/project/nbconvert) | 7.16.1 | -[nbformat](https://pypi.org/project/nbformat) | 5.10.4 | -[nest-asyncio](https://pypi.org/project/nest-asyncio) | 1.6.0 | -[networkx](https://pypi.org/project/networkx) | 3.4.2 | -[nh3](https://pypi.org/project/nh3) | 0.2.18 | -[nltk](https://pypi.org/project/nltk) | 3.9.1 | -[notebook](https://pypi.org/project/notebook) | 7.4.0 | -[notebook-shim](https://pypi.org/project/notebook-shim) | 0.2.4 | -[numba](https://pypi.org/project/numba) | 0.61.2 | -[numpy](https://pypi.org/project/numpy) | 2.2.4 | -[numpydoc](https://pypi.org/project/numpydoc) | 1.6.0 | -[openai](https://pypi.org/project/openai) | 1.72.0 | -[opencv-python](https://pypi.org/project/opencv-python) | 4.11.0.86 | -[openpyxl](https://pypi.org/project/openpyxl) | 3.1.2 | -[optree](https://pypi.org/project/optree) | 0.14.0 | -[optuna](https://pypi.org/project/optuna) | 3.6.1 | -[orjson](https://pypi.org/project/orjson) | 3.10.12 | -[osqp](https://pypi.org/project/osqp) | 0.6.7.post3 | -[outcome](https://pypi.org/project/outcome) | 1.3.0.post0 | -[overrides](https://pypi.org/project/overrides) | 7.7.0 | -[packaging](https://pypi.org/project/packaging) | 24.2 | -[pandas](https://pypi.org/project/pandas) | 2.2.3 | -[pandocfilters](https://pypi.org/project/pandocfilters) | 1.5.0 | -[panel](https://pypi.org/project/panel) | 1.6.2 | -[papermill](https://pypi.org/project/papermill) | 2.6.0 | -[param](https://pypi.org/project/param) | 2.2.0 | -[parso](https://pypi.org/project/parso) | 0.8.4 | -[partd](https://pypi.org/project/partd) | 1.4.0 | -[pathspec](https://pypi.org/project/pathspec) | 0.11.0 | -[patsy](https://pypi.org/project/patsy) | 0.5.6 | -[pep8](https://pypi.org/project/pep8) | 1.7.1 | -[pexpect](https://pypi.org/project/pexpect) | 4.8.0 | -[pg8000](https://pypi.org/project/pg8000) | 1.23.0 | -[pickleshare](https://pypi.org/project/pickleshare) | 0.7.5 | -[pillow](https://pypi.org/project/pillow) | 11.1.0 | -[pip](https://pypi.org/project/pip) | 25.0.1 | -[platformdirs](https://pypi.org/project/platformdirs) | 4.3.6 | -[plotly](https://pypi.org/project/plotly) | 6.0.1 | -[plotnine](https://pypi.org/project/plotnine) | 0.13.6 | -[plotpy](https://pypi.org/project/plotpy) | 2.7.2 | -[pluggy](https://pypi.org/project/pluggy) | 1.5.0 | -[ply](https://pypi.org/project/ply) | 3.11 | -[polars](https://pypi.org/project/polars) | 1.27.1 | -[portalocker](https://pypi.org/project/portalocker) | 2.7.0 | -[prettytable](https://pypi.org/project/prettytable) | 3.3.0 | -[prince](https://pypi.org/project/prince) | 0.15.0 | -[priority](https://pypi.org/project/priority) | 2.0.0 | -[prometheus-client](https://pypi.org/project/prometheus-client) | 0.21.1 | -[prompt-toolkit](https://pypi.org/project/prompt-toolkit) | 3.0.50 | -[propcache](https://pypi.org/project/propcache) | 0.2.1 | +[mlxtend](https://pypi.org/project/mlxtend) | 0.23.3 | Machine Learning Library Extensions +[more-itertools](https://pypi.org/project/more-itertools) | 10.2.0 | More routines for operating on iterables, beyond itertools +[mpl-scatter-density](https://pypi.org/project/mpl-scatter-density) | 0.7 | Matplotlib helpers to make density scatter plots +[mpld3](https://pypi.org/project/mpld3) | 0.5.8 | D3 Viewer for Matplotlib +[mpmath](https://pypi.org/project/mpmath) | 1.3.0 | Python library for arbitrary-precision floating-point arithmetic +[msal](https://pypi.org/project/msal) | 1.30.0 | The Microsoft Authentication Library (MSAL) for Python library enables your app to access the Microsoft Cloud by supporting authentication of us +[msal-extensions](https://pypi.org/project/msal-extensions) | 1.2.0 | Microsoft Authentication Library extensions (MSAL EX) provides a persistence API that can save your data on disk, encrypted on Windows, macOS an +[msgpack](https://pypi.org/project/msgpack) | 1.1.0 | MessagePack serializer +[multidict](https://pypi.org/project/multidict) | 6.1.0 | multidict implementation +[multipledispatch](https://pypi.org/project/multipledispatch) | 1.0.0 | Multiple dispatch +[mypy](https://pypi.org/project/mypy) | 1.15.0 | Optional static typing for Python +[mypy-extensions](https://pypi.org/project/mypy-extensions) | 1.0.0 | Type system extensions for programs checked with the mypy type checker. +[mysql-connector-python](https://pypi.org/project/mysql-connector-python) | 9.2.0 | A self-contained Python driver for communicating with MySQL servers, using an API that is compliant with the Python Database API Specification v +[namex](https://pypi.org/project/namex) | 0.0.8 | A simple utility to separate the implementation of your Python package and its public API surface. +[narwhals](https://pypi.org/project/narwhals) | 1.30.0 | Extremely lightweight compatibility layer between dataframe libraries +[nbclient](https://pypi.org/project/nbclient) | 0.10.0 | A client library for executing notebooks. Formerly nbconvert's ExecutePreprocessor. +[nbconvert](https://pypi.org/project/nbconvert) | 7.16.1 | Converting Jupyter Notebooks (.ipynb files) to other formats. Output formats include asciidoc, html, latex, markdown, pdf, py, rst, script. +[nbformat](https://pypi.org/project/nbformat) | 5.10.4 | The Jupyter Notebook format +[nest-asyncio](https://pypi.org/project/nest-asyncio) | 1.6.0 | Patch asyncio to allow nested event loops +[networkx](https://pypi.org/project/networkx) | 3.4.2 | Python package for creating and manipulating graphs and networks +[nh3](https://pypi.org/project/nh3) | 0.2.18 | Python bindings to the ammonia HTML sanitization library. +[nltk](https://pypi.org/project/nltk) | 3.9.1 | Natural Language Toolkit +[notebook](https://pypi.org/project/notebook) | 7.4.0 | Jupyter Notebook - A web-based notebook environment for interactive computing +[notebook-shim](https://pypi.org/project/notebook-shim) | 0.2.4 | A shim layer for notebook traits and config +[numba](https://pypi.org/project/numba) | 0.61.2 | compiling Python code using LLVM +[numpy](https://pypi.org/project/numpy) | 2.2.4 | Fundamental package for array computing in Python +[numpydoc](https://pypi.org/project/numpydoc) | 1.6.0 | Sphinx extension to support docstrings in Numpy format +[openai](https://pypi.org/project/openai) | 1.72.0 | The official Python library for the openai API +[opencv-python](https://pypi.org/project/opencv-python) | 4.11.0.86 | Wrapper package for OpenCV python bindings. +[openpyxl](https://pypi.org/project/openpyxl) | 3.1.2 | A Python library to read/write Excel 2010 xlsx/xlsm files +[optree](https://pypi.org/project/optree) | 0.14.0 | Optimized PyTree Utilities. +[optuna](https://pypi.org/project/optuna) | 3.6.1 | A hyperparameter optimization framework +[orjson](https://pypi.org/project/orjson) | 3.10.12 | Fast, correct Python JSON library supporting dataclasses, datetimes, and numpy +[osqp](https://pypi.org/project/osqp) | 0.6.7.post3 | OSQP: The Operator Splitting QP Solver +[outcome](https://pypi.org/project/outcome) | 1.3.0.post0 | Capture the outcome of Python function calls. +[overrides](https://pypi.org/project/overrides) | 7.7.0 | A decorator to automatically detect mismatch when overriding a method. +[packaging](https://pypi.org/project/packaging) | 24.2 | Core utilities for Python packages +[pandas](https://pypi.org/project/pandas) | 2.2.3 | Powerful data structures for data analysis, time series, and statistics +[pandocfilters](https://pypi.org/project/pandocfilters) | 1.5.0 | Utilities for writing pandoc filters in python +[panel](https://pypi.org/project/panel) | 1.6.2 | The powerful data exploration & web app framework for Python. +[papermill](https://pypi.org/project/papermill) | 2.6.0 | Parameterize and run Jupyter and nteract Notebooks +[param](https://pypi.org/project/param) | 2.2.0 | Make your Python code clearer and more reliable by declaring Parameters. +[parso](https://pypi.org/project/parso) | 0.8.4 | A Python Parser +[partd](https://pypi.org/project/partd) | 1.4.0 | Appendable key-value storage +[pathspec](https://pypi.org/project/pathspec) | 0.11.0 | Utility library for gitignore style pattern matching of file paths. +[patsy](https://pypi.org/project/patsy) | 0.5.6 | A Python package for describing statistical models and for building design matrices. +[pep8](https://pypi.org/project/pep8) | 1.7.1 | Python style guide checker +[pexpect](https://pypi.org/project/pexpect) | 4.8.0 | Pexpect allows easy control of interactive console applications. +[pg8000](https://pypi.org/project/pg8000) | 1.23.0 | PostgreSQL interface library +[pickleshare](https://pypi.org/project/pickleshare) | 0.7.5 | Tiny 'shelve'-like database with concurrency support +[pillow](https://pypi.org/project/pillow) | 11.1.0 | Python Imaging Library (Fork) +[pip](https://pypi.org/project/pip) | 25.0.1 | The PyPA recommended tool for installing Python packages. +[platformdirs](https://pypi.org/project/platformdirs) | 4.3.6 | A small Python package for determining appropriate platform-specific dirs, e.g. a `user data dir`. +[plotly](https://pypi.org/project/plotly) | 6.0.1 | An open-source interactive data visualization library for Python +[plotnine](https://pypi.org/project/plotnine) | 0.13.6 | A Grammar of Graphics for Python +[plotpy](https://pypi.org/project/plotpy) | 2.7.2 | Curve and image plotting tools for Python/Qt applications +[pluggy](https://pypi.org/project/pluggy) | 1.5.0 | plugin and hook calling mechanisms for python +[ply](https://pypi.org/project/ply) | 3.11 | Python Lex & Yacc +[polars](https://pypi.org/project/polars) | 1.27.1 | Blazingly fast DataFrame library +[portalocker](https://pypi.org/project/portalocker) | 2.7.0 | Wraps the portalocker recipe for easy usage +[prettytable](https://pypi.org/project/prettytable) | 3.3.0 | A simple Python library for easily displaying tabular data in a visually appealing ASCII table format +[prince](https://pypi.org/project/prince) | 0.15.0 | Factor analysis in Python: PCA, CA, MCA, MFA, FAMD, GPA +[priority](https://pypi.org/project/priority) | 2.0.0 | A pure-Python implementation of the HTTP/2 priority tree +[prometheus-client](https://pypi.org/project/prometheus-client) | 0.21.1 | Python client for the Prometheus monitoring system. +[prompt-toolkit](https://pypi.org/project/prompt-toolkit) | 3.0.50 | Library for building powerful interactive command lines in Python +[propcache](https://pypi.org/project/propcache) | 0.2.1 | Accelerated property cache [protobuf](https://pypi.org/project/protobuf) | 5.27.3 | -[psutil](https://pypi.org/project/psutil) | 5.9.8 | -[psygnal](https://pypi.org/project/psygnal) | 0.11.1 | -[ptpython](https://pypi.org/project/ptpython) | 3.0.29 | -[ptyprocess](https://pypi.org/project/ptyprocess) | 0.7.0 | -[pure-eval](https://pypi.org/project/pure-eval) | 0.2.2 | -[pyarrow](https://pypi.org/project/pyarrow) | 19.0.1 | -[pyasn1](https://pypi.org/project/pyasn1) | 0.6.1 | -[pyasn1-modules](https://pypi.org/project/pyasn1-modules) | 0.4.1 | -[pybind11](https://pypi.org/project/pybind11) | 2.13.6 | -[pycodestyle](https://pypi.org/project/pycodestyle) | 2.12.0 | -[pycparser](https://pypi.org/project/pycparser) | 2.22 | -[pyct](https://pypi.org/project/pyct) | 0.5.0 | -[pydantic](https://pypi.org/project/pydantic) | 2.10.6 | -[pydantic-ai](https://pypi.org/project/pydantic-ai) | 0.0.24 | -[pydantic-ai-slim](https://pypi.org/project/pydantic-ai-slim) | 0.0.24 | -[pydantic-core](https://pypi.org/project/pydantic-core) | 2.27.2 | -[pydantic-graph](https://pypi.org/project/pydantic-graph) | 0.0.24 | -[pydeck](https://pypi.org/project/pydeck) | 0.9.1 | -[pydocstyle](https://pypi.org/project/pydocstyle) | 6.3.0 | -[pydub](https://pypi.org/project/pydub) | 0.25.1 | -[pyerfa](https://pypi.org/project/pyerfa) | 2.0.1.4 | -[pyflakes](https://pypi.org/project/pyflakes) | 3.2.0 | -[pygithub](https://pypi.org/project/pygithub) | 2.6.1 | -[pygments](https://pypi.org/project/pygments) | 2.19.1 | -[pyjwt](https://pypi.org/project/pyjwt) | 2.10.1 | -[pylint](https://pypi.org/project/pylint) | 3.1.0 | -[pylint-venv](https://pypi.org/project/pylint-venv) | 3.0.3 | -[pyls-spyder](https://pypi.org/project/pyls-spyder) | 0.4.0 | -[pymongo](https://pypi.org/project/pymongo) | 4.10.1 | -[pympler](https://pypi.org/project/pympler) | 1.1 | -[pynacl](https://pypi.org/project/pynacl) | 1.5.0 | -[pynndescent](https://pypi.org/project/pynndescent) | 0.5.12 | -[pyodbc](https://pypi.org/project/pyodbc) | 5.2.0 | -[pyogrio](https://pypi.org/project/pyogrio) | 0.10.0 | -[pyomo](https://pypi.org/project/pyomo) | 6.9.1 | -[pypandoc](https://pypi.org/project/pypandoc) | 1.15 | -[pyparsing](https://pypi.org/project/pyparsing) | 3.2.1 | -[pypdf](https://pypi.org/project/pypdf) | 5.1.0 | -[pyproj](https://pypi.org/project/pyproj) | 3.7.0 | -[pyproject-hooks](https://pypi.org/project/pyproject-hooks) | 1.1.0 | -[pyqt5](https://pypi.org/project/pyqt5) | 5.15.10 | -[pyqt5-qt5](https://pypi.org/project/pyqt5-qt5) | 5.15.2 | -[pyqt5-sip](https://pypi.org/project/pyqt5-sip) | 12.16.1 | -[pyqtgraph](https://pypi.org/project/pyqtgraph) | 0.13.7 | -[pyqtwebengine](https://pypi.org/project/pyqtwebengine) | 5.15.6 | -[pyqtwebengine-qt5](https://pypi.org/project/pyqtwebengine-qt5) | 5.15.2 | -[pyserial](https://pypi.org/project/pyserial) | 3.5 | -[pysocks](https://pypi.org/project/pysocks) | 1.7.1 | -[pyspnego](https://pypi.org/project/pyspnego) | 0.11.2 | -[pytest](https://pypi.org/project/pytest) | 8.3.4 | -[python-barcode](https://pypi.org/project/python-barcode) | 0.15.1 | -[python-dateutil](https://pypi.org/project/python-dateutil) | 2.8.2 | -[python-dotenv](https://pypi.org/project/python-dotenv) | 1.0.1 | -[python-json-logger](https://pypi.org/project/python-json-logger) | 2.0.7 | -[python-lsp-black](https://pypi.org/project/python-lsp-black) | 2.0.0 | -[python-lsp-jsonrpc](https://pypi.org/project/python-lsp-jsonrpc) | 1.1.2 | -[python-lsp-server](https://pypi.org/project/python-lsp-server) | 1.12.0 | -[python-multipart](https://pypi.org/project/python-multipart) | 0.0.9 | -[python-slugify](https://pypi.org/project/python-slugify) | 8.0.4 | -[pythonqwt](https://pypi.org/project/pythonqwt) | 0.14.4 | -[pytoolconfig](https://pypi.org/project/pytoolconfig) | 1.3.1 | -[pytz](https://pypi.org/project/pytz) | 2024.2 | -[pyuca](https://pypi.org/project/pyuca) | 1.2 | -[pyusb](https://pypi.org/project/pyusb) | 1.3.1 | -[pyviz-comms](https://pypi.org/project/pyviz-comms) | 3.0.3 | -[pywavelets](https://pypi.org/project/pywavelets) | 1.8.0 | -[pywin32](https://pypi.org/project/pywin32) | 308 | -[pywin32-ctypes](https://pypi.org/project/pywin32-ctypes) | 0.2.2 | -[pywinpty](https://pypi.org/project/pywinpty) | 2.0.14 | -[pyyaml](https://pypi.org/project/pyyaml) | 6.0.2 | -[pyzmq](https://pypi.org/project/pyzmq) | 26.2.1 | -[qdarkstyle](https://pypi.org/project/qdarkstyle) | 3.2.3 | -[qdldl](https://pypi.org/project/qdldl) | 0.1.7.post5 | -[qrcode](https://pypi.org/project/qrcode) | 8.0 | -[qstylizer](https://pypi.org/project/qstylizer) | 0.2.2 | -[qtawesome](https://pypi.org/project/qtawesome) | 1.4.0 | -[qtconsole](https://pypi.org/project/qtconsole) | 5.6.1 | -[qtpy](https://pypi.org/project/qtpy) | 2.4.1 | -[quantecon](https://pypi.org/project/quantecon) | 0.7.2 | -[quart](https://pypi.org/project/quart) | 0.20.0 | -[rapidfuzz](https://pypi.org/project/rapidfuzz) | 3.9.6 | -[readme-renderer](https://pypi.org/project/readme-renderer) | 44.0 | -[redis](https://pypi.org/project/redis) | 5.0.8 | -[referencing](https://pypi.org/project/referencing) | 0.35.1 | -[regex](https://pypi.org/project/regex) | 2024.11.6 | -[reportlab](https://pypi.org/project/reportlab) | 4.2.5 | -[requests](https://pypi.org/project/requests) | 2.32.3 | -[requests-ntlm](https://pypi.org/project/requests-ntlm) | 1.3.0 | -[requests-toolbelt](https://pypi.org/project/requests-toolbelt) | 1.0.0 | -[rfc3339-validator](https://pypi.org/project/rfc3339-validator) | 0.1.4 | -[rfc3986](https://pypi.org/project/rfc3986) | 2.0.0 | -[rfc3986-validator](https://pypi.org/project/rfc3986-validator) | 0.1.1 | -[rich](https://pypi.org/project/rich) | 13.9.4 | -[rope](https://pypi.org/project/rope) | 1.12.0 | -[rpds-py](https://pypi.org/project/rpds-py) | 0.22.3 | -[rsa](https://pypi.org/project/rsa) | 4.7.2 | -[rtree](https://pypi.org/project/rtree) | 1.3.0 | -[rx](https://pypi.org/project/rx) | 3.2.0 | -[scikit-image](https://pypi.org/project/scikit-image) | 0.25.2 | -[scikit-learn](https://pypi.org/project/scikit-learn) | 1.6.1 | -[scipy](https://pypi.org/project/scipy) | 1.15.2 | -[scramp](https://pypi.org/project/scramp) | 1.4.5 | -[scs](https://pypi.org/project/scs) | 3.2.7.post2 | -[seaborn](https://pypi.org/project/seaborn) | 0.13.2 | -[send2trash](https://pypi.org/project/send2trash) | 1.8.3 | -[setuptools](https://pypi.org/project/setuptools) | 75.8.2 | -[shapely](https://pypi.org/project/shapely) | 2.0.6 | -[shellingham](https://pypi.org/project/shellingham) | 1.5.4 | -[simplejson](https://pypi.org/project/simplejson) | 3.19.3 | -[simpy](https://pypi.org/project/simpy) | 4.1.1 | -[six](https://pypi.org/project/six) | 1.16.0 | -[sklearn-compat](https://pypi.org/project/sklearn-compat) | 0.1.3 | -[skrub](https://pypi.org/project/skrub) | 0.5.1 | -[smmap](https://pypi.org/project/smmap) | 5.0.0 | -[sniffio](https://pypi.org/project/sniffio) | 1.3.0 | -[snowballstemmer](https://pypi.org/project/snowballstemmer) | 2.2.0 | -[sortedcontainers](https://pypi.org/project/sortedcontainers) | 2.4.0 | -[sounddevice](https://pypi.org/project/sounddevice) | 0.5.1 | -[soupsieve](https://pypi.org/project/soupsieve) | 2.6 | -[sphinx](https://pypi.org/project/sphinx) | 7.3.7 | -[sphinx-rtd-theme](https://pypi.org/project/sphinx-rtd-theme) | 3.0.2 | -[sphinxcontrib-applehelp](https://pypi.org/project/sphinxcontrib-applehelp) | 2.0.0 | -[sphinxcontrib-devhelp](https://pypi.org/project/sphinxcontrib-devhelp) | 2.0.0 | -[sphinxcontrib-htmlhelp](https://pypi.org/project/sphinxcontrib-htmlhelp) | 2.1.0 | -[sphinxcontrib-jquery](https://pypi.org/project/sphinxcontrib-jquery) | 4.1 | -[sphinxcontrib-jsmath](https://pypi.org/project/sphinxcontrib-jsmath) | 1.0.1 | -[sphinxcontrib-qthelp](https://pypi.org/project/sphinxcontrib-qthelp) | 2.0.0 | -[sphinxcontrib-serializinghtml](https://pypi.org/project/sphinxcontrib-serializinghtml) | 2.0.0 | -[spyder](https://pypi.org/project/spyder) | 6.0.5 | -[spyder-kernels](https://pypi.org/project/spyder-kernels) | 3.0.3 | -[sqlalchemy](https://pypi.org/project/sqlalchemy) | 2.0.38 | -[sqlite-bro](https://pypi.org/project/sqlite-bro) | 0.13.1 | -[sqlite-fts4](https://pypi.org/project/sqlite-fts4) | 1.0.3 | -[sqlite-utils](https://pypi.org/project/sqlite-utils) | 3.38 | -[sqlparse](https://pypi.org/project/sqlparse) | 0.5.3 | -[squarify](https://pypi.org/project/squarify) | 0.4.4 | -[sspilib](https://pypi.org/project/sspilib) | 0.2.0 | -[stack-data](https://pypi.org/project/stack-data) | 0.6.3 | -[starlette](https://pypi.org/project/starlette) | 0.45.3 | -[statsmodels](https://pypi.org/project/statsmodels) | 0.14.4 | -[streamlit](https://pypi.org/project/streamlit) | 1.44.0 | -[superqt](https://pypi.org/project/superqt) | 0.7.1 | -[sv-ttk](https://pypi.org/project/sv-ttk) | 2.6.0 | -[sympy](https://pypi.org/project/sympy) | 1.13.3 | -[tabulate](https://pypi.org/project/tabulate) | 0.9.0 | -[tblib](https://pypi.org/project/tblib) | 3.0.0 | -[tenacity](https://pypi.org/project/tenacity) | 9.0.0 | -[termcolor](https://pypi.org/project/termcolor) | 2.5.0 | -[terminado](https://pypi.org/project/terminado) | 0.18.1 | -[text-unidecode](https://pypi.org/project/text-unidecode) | 1.3 | -[textdistance](https://pypi.org/project/textdistance) | 4.6.3 | -[thefuzz](https://pypi.org/project/thefuzz) | 0.22.1 | -[threadpoolctl](https://pypi.org/project/threadpoolctl) | 3.5.0 | -[three-merge](https://pypi.org/project/three-merge) | 0.1.1 | -[tifffile](https://pypi.org/project/tifffile) | 2025.1.10 | -[tiktoken](https://pypi.org/project/tiktoken) | 0.8.0 | -[tinycss2](https://pypi.org/project/tinycss2) | 1.4.0 | +[psutil](https://pypi.org/project/psutil) | 5.9.8 | Cross-platform lib for process and system monitoring in Python. +[psygnal](https://pypi.org/project/psygnal) | 0.11.1 | Fast python callback/event system modeled after Qt Signals +[ptpython](https://pypi.org/project/ptpython) | 3.0.29 | Python REPL build on top of prompt_toolkit +[ptyprocess](https://pypi.org/project/ptyprocess) | 0.7.0 | Run a subprocess in a pseudo terminal +[pure-eval](https://pypi.org/project/pure-eval) | 0.2.2 | Safely evaluate AST nodes without side effects +[pyarrow](https://pypi.org/project/pyarrow) | 19.0.1 | Python library for Apache Arrow +[pyasn1](https://pypi.org/project/pyasn1) | 0.6.1 | Pure-Python implementation of ASN.1 types and DER/BER/CER codecs (X.208) +[pyasn1-modules](https://pypi.org/project/pyasn1-modules) | 0.4.1 | A collection of ASN.1-based protocols modules +[pybind11](https://pypi.org/project/pybind11) | 2.13.6 | Seamless operability between C++11 and Python +[pycodestyle](https://pypi.org/project/pycodestyle) | 2.12.0 | Python style guide checker +[pycparser](https://pypi.org/project/pycparser) | 2.22 | C parser in Python +[pyct](https://pypi.org/project/pyct) | 0.5.0 | Python package common tasks for users (e.g. copy examples, fetch data, ...) +[pydantic](https://pypi.org/project/pydantic) | 2.10.6 | Data validation using Python type hints +[pydantic-ai](https://pypi.org/project/pydantic-ai) | 0.0.24 | Agent Framework / shim to use Pydantic with LLMs +[pydantic-ai-slim](https://pypi.org/project/pydantic-ai-slim) | 0.0.24 | Agent Framework / shim to use Pydantic with LLMs, slim package +[pydantic-core](https://pypi.org/project/pydantic-core) | 2.27.2 | Core functionality for Pydantic validation and serialization +[pydantic-graph](https://pypi.org/project/pydantic-graph) | 0.0.24 | Graph and state machine library +[pydeck](https://pypi.org/project/pydeck) | 0.9.1 | Widget for deck.gl maps +[pydocstyle](https://pypi.org/project/pydocstyle) | 6.3.0 | Python docstring style checker +[pydub](https://pypi.org/project/pydub) | 0.25.1 | Manipulate audio with an simple and easy high level interface +[pyerfa](https://pypi.org/project/pyerfa) | 2.0.1.4 | Python bindings for ERFA +[pyflakes](https://pypi.org/project/pyflakes) | 3.2.0 | passive checker of Python programs +[pygithub](https://pypi.org/project/pygithub) | 2.6.1 | Use the full Github API v3 +[pygments](https://pypi.org/project/pygments) | 2.19.1 | Pygments is a syntax highlighting package written in Python. +[pyjwt](https://pypi.org/project/pyjwt) | 2.10.1 | JSON Web Token implementation in Python +[pylint](https://pypi.org/project/pylint) | 3.1.0 | python code static checker +[pylint-venv](https://pypi.org/project/pylint-venv) | 3.0.3 | pylint-venv provides a Pylint init-hook to use the same Pylint installation with different virtual environments. +[pyls-spyder](https://pypi.org/project/pyls-spyder) | 0.4.0 | Spyder extensions for the python-lsp-server +[pymongo](https://pypi.org/project/pymongo) | 4.10.1 | Python driver for MongoDB +[pympler](https://pypi.org/project/pympler) | 1.1 | A development tool to measure, monitor and analyze the memory behavior of Python objects. +[pynacl](https://pypi.org/project/pynacl) | 1.5.0 | Python binding to the Networking and Cryptography (NaCl) library +[pynndescent](https://pypi.org/project/pynndescent) | 0.5.12 | Nearest Neighbor Descent +[pyodbc](https://pypi.org/project/pyodbc) | 5.2.0 | DB API module for ODBC +[pyogrio](https://pypi.org/project/pyogrio) | 0.10.0 | Vectorized spatial vector file format I/O using GDAL/OGR +[pyomo](https://pypi.org/project/pyomo) | 6.9.1 | Pyomo: Python Optimization Modeling Objects +[pypandoc](https://pypi.org/project/pypandoc) | 1.15 | Thin wrapper for pandoc. +[pyparsing](https://pypi.org/project/pyparsing) | 3.2.1 | pyparsing module - Classes and methods to define and execute parsing grammars +[pypdf](https://pypi.org/project/pypdf) | 5.1.0 | A pure-python PDF library capable of splitting, merging, cropping, and transforming PDF files +[pyproj](https://pypi.org/project/pyproj) | 3.7.0 | Python interface to PROJ (cartographic projections and coordinate transformations library) +[pyproject-hooks](https://pypi.org/project/pyproject-hooks) | 1.1.0 | Wrappers to call pyproject.toml-based build backend hooks. +[pyqt5](https://pypi.org/project/pyqt5) | 5.15.10 | Python bindings for the Qt cross platform application toolkit +[pyqt5-qt5](https://pypi.org/project/pyqt5-qt5) | 5.15.2 | The subset of a Qt installation needed by PyQt5. +[pyqt5-sip](https://pypi.org/project/pyqt5-sip) | 12.16.1 | The sip module support for PyQt5 +[pyqtgraph](https://pypi.org/project/pyqtgraph) | 0.13.7 | Scientific Graphics and GUI Library for Python +[pyqtwebengine](https://pypi.org/project/pyqtwebengine) | 5.15.6 | Python bindings for the Qt WebEngine framework +[pyqtwebengine-qt5](https://pypi.org/project/pyqtwebengine-qt5) | 5.15.2 | The subset of a Qt installation needed by PyQtWebEngine. +[pyserial](https://pypi.org/project/pyserial) | 3.5 | Python Serial Port Extension +[pysocks](https://pypi.org/project/pysocks) | 1.7.1 | A Python SOCKS client module. See https://github.com/Anorov/PySocks for more information. +[pyspnego](https://pypi.org/project/pyspnego) | 0.11.2 | Windows Negotiate Authentication Client and Server +[pytest](https://pypi.org/project/pytest) | 8.3.4 | pytest: simple powerful testing with Python +[python-barcode](https://pypi.org/project/python-barcode) | 0.15.1 | Create standard barcodes with Python. No external modules needed. (optional Pillow support included). +[python-dateutil](https://pypi.org/project/python-dateutil) | 2.8.2 | Extensions to the standard Python datetime module +[python-dotenv](https://pypi.org/project/python-dotenv) | 1.0.1 | Read key-value pairs from a .env file and set them as environment variables +[python-json-logger](https://pypi.org/project/python-json-logger) | 2.0.7 | A python library adding a json log formatter +[python-lsp-black](https://pypi.org/project/python-lsp-black) | 2.0.0 | Black plugin for the Python LSP Server +[python-lsp-jsonrpc](https://pypi.org/project/python-lsp-jsonrpc) | 1.1.2 | JSON RPC 2.0 server library +[python-lsp-server](https://pypi.org/project/python-lsp-server) | 1.12.0 | Python Language Server for the Language Server Protocol +[python-multipart](https://pypi.org/project/python-multipart) | 0.0.9 | A streaming multipart parser for Python +[python-slugify](https://pypi.org/project/python-slugify) | 8.0.4 | A Python slugify application that also handles Unicode +[pythonqwt](https://pypi.org/project/pythonqwt) | 0.14.4 | Qt plotting widgets for Python +[pytoolconfig](https://pypi.org/project/pytoolconfig) | 1.3.1 | Python tool configuration +[pytz](https://pypi.org/project/pytz) | 2024.2 | World timezone definitions, modern and historical +[pyuca](https://pypi.org/project/pyuca) | 1.2 | a Python implementation of the Unicode Collation Algorithm +[pyusb](https://pypi.org/project/pyusb) | 1.3.1 | Easy USB access for Python +[pyviz-comms](https://pypi.org/project/pyviz-comms) | 3.0.3 | A JupyterLab extension for rendering HoloViz content. +[pywavelets](https://pypi.org/project/pywavelets) | 1.8.0 | PyWavelets, wavelet transform module +[pywin32](https://pypi.org/project/pywin32) | 308 | Python for Window Extensions +[pywin32-ctypes](https://pypi.org/project/pywin32-ctypes) | 0.2.2 | A (partial) reimplementation of pywin32 using ctypes/cffi +[pywinpty](https://pypi.org/project/pywinpty) | 2.0.14 | Pseudo terminal support for Windows from Python. +[pyyaml](https://pypi.org/project/pyyaml) | 6.0.2 | YAML parser and emitter for Python +[pyzmq](https://pypi.org/project/pyzmq) | 26.2.1 | Python bindings for 0MQ +[qdarkstyle](https://pypi.org/project/qdarkstyle) | 3.2.3 | The most complete dark/light style sheet for C++/Python and Qt applications +[qdldl](https://pypi.org/project/qdldl) | 0.1.7.post5 | QDLDL, a free LDL factorization routine. +[qrcode](https://pypi.org/project/qrcode) | 8.0 | QR Code image generator +[qstylizer](https://pypi.org/project/qstylizer) | 0.2.2 | Stylesheet Generator for PyQt{4-5}/PySide{1-2} +[qtawesome](https://pypi.org/project/qtawesome) | 1.4.0 | FontAwesome icons in PyQt and PySide applications +[qtconsole](https://pypi.org/project/qtconsole) | 5.6.1 | Jupyter Qt console +[qtpy](https://pypi.org/project/qtpy) | 2.4.1 | Provides an abstraction layer on top of the various Qt bindings (PyQt5/6 and PySide2/6). +[quantecon](https://pypi.org/project/quantecon) | 0.7.2 | Import the main names to top level. +[quart](https://pypi.org/project/quart) | 0.20.0 | A Python ASGI web framework with the same API as Flask +[rapidfuzz](https://pypi.org/project/rapidfuzz) | 3.9.6 | rapid fuzzy string matching +[readme-renderer](https://pypi.org/project/readme-renderer) | 44.0 | readme_renderer is a library for rendering readme descriptions for Warehouse +[redis](https://pypi.org/project/redis) | 5.0.8 | Python client for Redis database and key-value store +[referencing](https://pypi.org/project/referencing) | 0.35.1 | JSON Referencing + Python +[regex](https://pypi.org/project/regex) | 2024.11.6 | Alternative regular expression module, to replace re. +[reportlab](https://pypi.org/project/reportlab) | 4.2.5 | The Reportlab Toolkit +[requests](https://pypi.org/project/requests) | 2.32.3 | Python HTTP for Humans. +[requests-ntlm](https://pypi.org/project/requests-ntlm) | 1.3.0 | This package allows for HTTP NTLM authentication using the requests library. +[requests-toolbelt](https://pypi.org/project/requests-toolbelt) | 1.0.0 | A utility belt for advanced users of python-requests +[rfc3339-validator](https://pypi.org/project/rfc3339-validator) | 0.1.4 | A pure python RFC3339 validator +[rfc3986](https://pypi.org/project/rfc3986) | 2.0.0 | Validating URI References per RFC 3986 +[rfc3986-validator](https://pypi.org/project/rfc3986-validator) | 0.1.1 | Pure python rfc3986 validator +[rich](https://pypi.org/project/rich) | 13.9.4 | Render rich text, tables, progress bars, syntax highlighting, markdown and more to the terminal +[rope](https://pypi.org/project/rope) | 1.12.0 | a python refactoring library... +[rpds-py](https://pypi.org/project/rpds-py) | 0.22.3 | Python bindings to Rust's persistent data structures (rpds) +[rsa](https://pypi.org/project/rsa) | 4.7.2 | Pure-Python RSA implementation +[rtree](https://pypi.org/project/rtree) | 1.3.0 | R-Tree spatial index for Python GIS +[rx](https://pypi.org/project/rx) | 3.2.0 | Reactive Extensions (Rx) for Python +[scikit-image](https://pypi.org/project/scikit-image) | 0.25.2 | Image processing in Python +[scikit-learn](https://pypi.org/project/scikit-learn) | 1.6.1 | A set of python modules for machine learning and data mining +[scipy](https://pypi.org/project/scipy) | 1.15.2 | Fundamental algorithms for scientific computing in Python +[scramp](https://pypi.org/project/scramp) | 1.4.5 | An implementation of the SCRAM protocol. +[scs](https://pypi.org/project/scs) | 3.2.7.post2 | Splitting conic solver +[seaborn](https://pypi.org/project/seaborn) | 0.13.2 | Statistical data visualization +[send2trash](https://pypi.org/project/send2trash) | 1.8.3 | Send file to trash natively under Mac OS X, Windows and Linux +[setuptools](https://pypi.org/project/setuptools) | 75.8.2 | Easily download, build, install, upgrade, and uninstall Python packages +[shapely](https://pypi.org/project/shapely) | 2.0.6 | Manipulation and analysis of geometric objects +[shellingham](https://pypi.org/project/shellingham) | 1.5.4 | Tool to Detect Surrounding Shell +[simplejson](https://pypi.org/project/simplejson) | 3.19.3 | Simple, fast, extensible JSON encoder/decoder for Python +[simpy](https://pypi.org/project/simpy) | 4.1.1 | Event discrete, process based simulation for Python. +[six](https://pypi.org/project/six) | 1.16.0 | Python 2 and 3 compatibility utilities +[sklearn-compat](https://pypi.org/project/sklearn-compat) | 0.1.3 | Ease support for compatible scikit-learn estimators across versions +[skrub](https://pypi.org/project/skrub) | 0.5.1 | Prepping tables for machine learning +[smmap](https://pypi.org/project/smmap) | 5.0.0 | A pure Python implementation of a sliding window memory map manager +[sniffio](https://pypi.org/project/sniffio) | 1.3.0 | Sniff out which async library your code is running under +[snowballstemmer](https://pypi.org/project/snowballstemmer) | 2.2.0 | This package provides 29 stemmers for 28 languages generated from Snowball algorithms. +[sortedcontainers](https://pypi.org/project/sortedcontainers) | 2.4.0 | Sorted Containers -- Sorted List, Sorted Dict, Sorted Set +[sounddevice](https://pypi.org/project/sounddevice) | 0.5.1 | Play and Record Sound with Python +[soupsieve](https://pypi.org/project/soupsieve) | 2.6 | A modern CSS selector implementation for Beautiful Soup. +[sphinx](https://pypi.org/project/sphinx) | 7.3.7 | Python documentation generator +[sphinx-rtd-theme](https://pypi.org/project/sphinx-rtd-theme) | 3.0.2 | Read the Docs theme for Sphinx +[sphinxcontrib-applehelp](https://pypi.org/project/sphinxcontrib-applehelp) | 2.0.0 | sphinxcontrib-applehelp is a Sphinx extension which outputs Apple help books +[sphinxcontrib-devhelp](https://pypi.org/project/sphinxcontrib-devhelp) | 2.0.0 | sphinxcontrib-devhelp is a sphinx extension which outputs Devhelp documents +[sphinxcontrib-htmlhelp](https://pypi.org/project/sphinxcontrib-htmlhelp) | 2.1.0 | sphinxcontrib-htmlhelp is a sphinx extension which renders HTML help files +[sphinxcontrib-jquery](https://pypi.org/project/sphinxcontrib-jquery) | 4.1 | Extension to include jQuery on newer Sphinx releases +[sphinxcontrib-jsmath](https://pypi.org/project/sphinxcontrib-jsmath) | 1.0.1 | A sphinx extension which renders display math in HTML via JavaScript +[sphinxcontrib-qthelp](https://pypi.org/project/sphinxcontrib-qthelp) | 2.0.0 | sphinxcontrib-qthelp is a sphinx extension which outputs QtHelp documents +[sphinxcontrib-serializinghtml](https://pypi.org/project/sphinxcontrib-serializinghtml) | 2.0.0 | sphinxcontrib-serializinghtml is a sphinx extension which outputs "serialized" HTML files (json and pickle) +[spyder](https://pypi.org/project/spyder) | 6.0.5 | The Scientific Python Development Environment +[spyder-kernels](https://pypi.org/project/spyder-kernels) | 3.0.3 | Jupyter kernels for Spyder's console +[sqlalchemy](https://pypi.org/project/sqlalchemy) | 2.0.38 | Database Abstraction Library +[sqlite-bro](https://pypi.org/project/sqlite-bro) | 0.13.1 | a graphic SQLite Client in 1 Python file +[sqlite-fts4](https://pypi.org/project/sqlite-fts4) | 1.0.3 | Python functions for working with SQLite FTS4 search +[sqlite-utils](https://pypi.org/project/sqlite-utils) | 3.38 | CLI tool and Python library for manipulating SQLite databases +[sqlparse](https://pypi.org/project/sqlparse) | 0.5.3 | A non-validating SQL parser. +[squarify](https://pypi.org/project/squarify) | 0.4.4 | Pure Python implementation of the squarify treemap layout algorithm +[sspilib](https://pypi.org/project/sspilib) | 0.2.0 | SSPI API bindings for Python +[stack-data](https://pypi.org/project/stack-data) | 0.6.3 | Extract data from python stack frames and tracebacks for informative displays +[starlette](https://pypi.org/project/starlette) | 0.45.3 | The little ASGI library that shines. +[statsmodels](https://pypi.org/project/statsmodels) | 0.14.4 | Statistical computations and models for Python +[streamlit](https://pypi.org/project/streamlit) | 1.44.0 | A faster way to build and share data apps +[superqt](https://pypi.org/project/superqt) | 0.7.1 | Missing widgets and components for PyQt/PySide +[sv-ttk](https://pypi.org/project/sv-ttk) | 2.6.0 | A gorgeous theme for Tkinter, based on Windows 11's UI +[sympy](https://pypi.org/project/sympy) | 1.13.3 | Computer algebra system (CAS) in Python +[tabulate](https://pypi.org/project/tabulate) | 0.9.0 | Pretty-print tabular data +[tblib](https://pypi.org/project/tblib) | 3.0.0 | Traceback serialization library. +[tenacity](https://pypi.org/project/tenacity) | 9.0.0 | Retry code until it succeeds +[termcolor](https://pypi.org/project/termcolor) | 2.5.0 | ANSI color formatting for output in terminal +[terminado](https://pypi.org/project/terminado) | 0.18.1 | Tornado websocket backend for the Xterm.js Javascript terminal emulator library. +[text-unidecode](https://pypi.org/project/text-unidecode) | 1.3 | The most basic Text::Unidecode port +[textdistance](https://pypi.org/project/textdistance) | 4.6.3 | Compute distance between the two texts. +[thefuzz](https://pypi.org/project/thefuzz) | 0.22.1 | Fuzzy string matching in python +[threadpoolctl](https://pypi.org/project/threadpoolctl) | 3.5.0 | threadpoolctl +[three-merge](https://pypi.org/project/three-merge) | 0.1.1 | Simple library for merging two strings with respect to a base one +[tifffile](https://pypi.org/project/tifffile) | 2025.1.10 | Read and write TIFF files +[tiktoken](https://pypi.org/project/tiktoken) | 0.8.0 | tiktoken is a fast BPE tokeniser for use with OpenAI's models +[tinycss2](https://pypi.org/project/tinycss2) | 1.4.0 | A tiny CSS parser [tokenizers](https://pypi.org/project/tokenizers) | 0.21.0 | -[toml](https://pypi.org/project/toml) | 0.10.2 | -[tomli](https://pypi.org/project/tomli) | 2.2.1 | -[tomli-w](https://pypi.org/project/tomli-w) | 1.2.0 | -[tomlkit](https://pypi.org/project/tomlkit) | 0.13.2 | -[toolz](https://pypi.org/project/toolz) | 1.0.0 | -[tornado](https://pypi.org/project/tornado) | 6.4.2 | -[tqdm](https://pypi.org/project/tqdm) | 4.66.4 | -[traitlets](https://pypi.org/project/traitlets) | 5.14.1 | -[traittypes](https://pypi.org/project/traittypes) | 0.2.1 | -[trio](https://pypi.org/project/trio) | 0.29.0 | -[trove-classifiers](https://pypi.org/project/trove-classifiers) | 2024.10.21.16 | -[twine](https://pypi.org/project/twine) | 6.1.0 | -[typer](https://pypi.org/project/typer) | 0.15.2 | -[types-python-dateutil](https://pypi.org/project/types-python-dateutil) | 2.9.0.20240316 | -[types-requests](https://pypi.org/project/types-requests) | 2.32.0.20241016 | -[typing-extensions](https://pypi.org/project/typing-extensions) | 4.12.2 | -[typing-inspect](https://pypi.org/project/typing-inspect) | 0.9.0 | -[tzdata](https://pypi.org/project/tzdata) | 2024.1 | -[tzlocal](https://pypi.org/project/tzlocal) | 5.2 | -[uc-micro-py](https://pypi.org/project/uc-micro-py) | 1.0.1 | -[ujson](https://pypi.org/project/ujson) | 5.10.0 | -[umap-learn](https://pypi.org/project/umap-learn) | 0.5.6 | -[uncertainties](https://pypi.org/project/uncertainties) | 3.2.2 | -[uri-template](https://pypi.org/project/uri-template) | 1.3.0 | -[urllib3](https://pypi.org/project/urllib3) | 2.2.3 | -[uvicorn](https://pypi.org/project/uvicorn) | 0.34.0 | -[vega-datasets](https://pypi.org/project/vega-datasets) | 0.9.0 | -[waitress](https://pypi.org/project/waitress) | 3.0.0 | -[watchdog](https://pypi.org/project/watchdog) | 6.0.0 | -[wcwidth](https://pypi.org/project/wcwidth) | 0.2.13 | -[webcolors](https://pypi.org/project/webcolors) | 24.11.1 | -[webencodings](https://pypi.org/project/webencodings) | 0.5.1 | -[websocket-client](https://pypi.org/project/websocket-client) | 1.8.0 | -[werkzeug](https://pypi.org/project/werkzeug) | 3.1.3 | -[whatthepatch](https://pypi.org/project/whatthepatch) | 1.0.7 | -[wheel](https://pypi.org/project/wheel) | 0.45.1 | -[widgetsnbextension](https://pypi.org/project/widgetsnbextension) | 4.0.14 | -[winpython](https://pypi.org/project/winpython) | 15.3.20250425 | -[wordcloud](https://pypi.org/project/wordcloud) | 1.9.4 | -[wrapt](https://pypi.org/project/wrapt) | 1.16.0 | -[wsproto](https://pypi.org/project/wsproto) | 1.2.0 | -[xarray](https://pypi.org/project/xarray) | 2025.3.0 | -[xlsxwriter](https://pypi.org/project/xlsxwriter) | 3.1.9 | -[xyzservices](https://pypi.org/project/xyzservices) | 2023.10.1 | -[yapf](https://pypi.org/project/yapf) | 0.40.1 | -[yarl](https://pypi.org/project/yarl) | 1.18.3 | -[yt-dlp](https://pypi.org/project/yt-dlp) | 2025.2.19 | -[zict](https://pypi.org/project/zict) | 3.0.0 | -[zipp](https://pypi.org/project/zipp) | 3.21.0 | -[zstandard](https://pypi.org/project/zstandard) | 0.23.0 | +[toml](https://pypi.org/project/toml) | 0.10.2 | Python Library for Tom's Obvious, Minimal Language +[tomli](https://pypi.org/project/tomli) | 2.2.1 | A lil' TOML parser +[tomli-w](https://pypi.org/project/tomli-w) | 1.2.0 | A lil' TOML writer +[tomlkit](https://pypi.org/project/tomlkit) | 0.13.2 | Style preserving TOML library +[toolz](https://pypi.org/project/toolz) | 1.0.0 | List processing tools and functional utilities +[tornado](https://pypi.org/project/tornado) | 6.4.2 | Tornado is a Python web framework and asynchronous networking library, originally developed at FriendFeed. +[tqdm](https://pypi.org/project/tqdm) | 4.66.4 | Fast, Extensible Progress Meter +[traitlets](https://pypi.org/project/traitlets) | 5.14.1 | Traitlets Python configuration system +[traittypes](https://pypi.org/project/traittypes) | 0.2.1 | Scipy trait types +[trio](https://pypi.org/project/trio) | 0.29.0 | A friendly Python library for async concurrency and I/O +[trove-classifiers](https://pypi.org/project/trove-classifiers) | 2024.10.21.16 | Canonical source for classifiers on PyPI (pypi.org). +[twine](https://pypi.org/project/twine) | 6.1.0 | Collection of utilities for publishing packages on PyPI +[typer](https://pypi.org/project/typer) | 0.15.2 | Typer, build great CLIs. Easy to code. Based on Python type hints. +[types-python-dateutil](https://pypi.org/project/types-python-dateutil) | 2.9.0.20240316 | Typing stubs for python-dateutil +[types-requests](https://pypi.org/project/types-requests) | 2.32.0.20241016 | Typing stubs for requests +[typing-extensions](https://pypi.org/project/typing-extensions) | 4.12.2 | Backported and Experimental Type Hints for Python 3.8+ +[typing-inspect](https://pypi.org/project/typing-inspect) | 0.9.0 | Runtime inspection utilities for typing module. +[tzdata](https://pypi.org/project/tzdata) | 2024.1 | Provider of IANA time zone data +[tzlocal](https://pypi.org/project/tzlocal) | 5.2 | tzinfo object for the local timezone +[uc-micro-py](https://pypi.org/project/uc-micro-py) | 1.0.1 | Micro subset of unicode data files for linkify-it-py projects. +[ujson](https://pypi.org/project/ujson) | 5.10.0 | Ultra fast JSON encoder and decoder for Python +[umap-learn](https://pypi.org/project/umap-learn) | 0.5.6 | Uniform Manifold Approximation and Projection +[uncertainties](https://pypi.org/project/uncertainties) | 3.2.2 | calculations with values with uncertainties, error propagation +[uri-template](https://pypi.org/project/uri-template) | 1.3.0 | RFC 6570 URI Template Processor +[urllib3](https://pypi.org/project/urllib3) | 2.2.3 | HTTP library with thread-safe connection pooling, file post, and more. +[uvicorn](https://pypi.org/project/uvicorn) | 0.34.0 | The lightning-fast ASGI server. +[vega-datasets](https://pypi.org/project/vega-datasets) | 0.9.0 | A Python package for offline access to Vega datasets +[waitress](https://pypi.org/project/waitress) | 3.0.0 | Waitress WSGI server +[watchdog](https://pypi.org/project/watchdog) | 6.0.0 | Filesystem events monitoring +[wcwidth](https://pypi.org/project/wcwidth) | 0.2.13 | Measures the displayed width of unicode strings in a terminal +[webcolors](https://pypi.org/project/webcolors) | 24.11.1 | A library for working with the color formats defined by HTML and CSS. +[webencodings](https://pypi.org/project/webencodings) | 0.5.1 | Character encoding aliases for legacy web content +[websocket-client](https://pypi.org/project/websocket-client) | 1.8.0 | WebSocket client for Python with low level API options +[werkzeug](https://pypi.org/project/werkzeug) | 3.1.3 | The comprehensive WSGI web application library. +[whatthepatch](https://pypi.org/project/whatthepatch) | 1.0.7 | A patch parsing and application library. +[wheel](https://pypi.org/project/wheel) | 0.45.1 | A built-package format for Python +[widgetsnbextension](https://pypi.org/project/widgetsnbextension) | 4.0.14 | Jupyter interactive widgets for Jupyter Notebook +[winpython](https://pypi.org/project/winpython) | 15.3.20250425 | WinPython distribution tools, including WPPM +[wordcloud](https://pypi.org/project/wordcloud) | 1.9.4 | A little word cloud generator +[wrapt](https://pypi.org/project/wrapt) | 1.16.0 | Module for decorators, wrappers and monkey patching. +[wsproto](https://pypi.org/project/wsproto) | 1.2.0 | WebSockets state-machine based protocol implementation +[xarray](https://pypi.org/project/xarray) | 2025.3.0 | N-D labeled arrays and datasets in Python +[xlsxwriter](https://pypi.org/project/xlsxwriter) | 3.1.9 | A Python module for creating Excel XLSX files. +[xyzservices](https://pypi.org/project/xyzservices) | 2023.10.1 | Source of XYZ tiles providers +[yapf](https://pypi.org/project/yapf) | 0.40.1 | A formatter for Python code. +[yarl](https://pypi.org/project/yarl) | 1.18.3 | Yet another URL library +[yt-dlp](https://pypi.org/project/yt-dlp) | 2025.2.19 | A feature-rich command-line audio/video downloader +[zict](https://pypi.org/project/zict) | 3.0.0 | Mutable mapping tools +[zipp](https://pypi.org/project/zipp) | 3.21.0 | Backport of pathlib-compatible object wrapper for zip files +[zstandard](https://pypi.org/project/zstandard) | 0.23.0 | Zstandard bindings for Python diff --git a/changelogs/WinPythonslim-64bit-3.13.3.0.md b/changelogs/WinPythonslim-64bit-3.13.3.0.md index d0a2202d..3cc4c6b7 100644 --- a/changelogs/WinPythonslim-64bit-3.13.3.0.md +++ b/changelogs/WinPythonslim-64bit-3.13.3.0.md @@ -15,501 +15,501 @@ Name | Version | Description Name | Version | Description -----|---------|------------ [Python](http://www.python.org/) | 3.13.3 | Python programming language with standard library -[absl-py](https://pypi.org/project/absl-py) | 2.0.0 | -[adbc-driver-manager](https://pypi.org/project/adbc-driver-manager) | 1.3.0 | -[aiofiles](https://pypi.org/project/aiofiles) | 23.2.1 | -[aiohappyeyeballs](https://pypi.org/project/aiohappyeyeballs) | 2.4.4 | -[aiohttp](https://pypi.org/project/aiohttp) | 3.11.11 | -[aiosignal](https://pypi.org/project/aiosignal) | 1.3.1 | -[aiosqlite](https://pypi.org/project/aiosqlite) | 0.20.0 | -[alabaster](https://pypi.org/project/alabaster) | 0.7.16 | -[alembic](https://pypi.org/project/alembic) | 1.15.1 | -[altair](https://pypi.org/project/altair) | 5.5.0 | -[aniso8601](https://pypi.org/project/aniso8601) | 9.0.1 | -[annotated-types](https://pypi.org/project/annotated-types) | 0.6.0 | -[ansicolors](https://pypi.org/project/ansicolors) | 1.1.8 | -[anthropic](https://pypi.org/project/anthropic) | 0.49.0 | -[anyio](https://pypi.org/project/anyio) | 4.8.0 | -[anywidget](https://pypi.org/project/anywidget) | 0.9.12 | -[appdirs](https://pypi.org/project/appdirs) | 1.4.4 | -[argon2-cffi](https://pypi.org/project/argon2-cffi) | 23.1.0 | -[argon2-cffi-bindings](https://pypi.org/project/argon2-cffi-bindings) | 21.2.0 | -[array-api-compat](https://pypi.org/project/array-api-compat) | 1.11.1 | -[arrow](https://pypi.org/project/arrow) | 1.3.0 | -[asgi-csrf](https://pypi.org/project/asgi-csrf) | 0.9 | -[asgiref](https://pypi.org/project/asgiref) | 3.8.1 | -[asn1crypto](https://pypi.org/project/asn1crypto) | 1.5.1 | -[asteval](https://pypi.org/project/asteval) | 0.9.31 | -[astroid](https://pypi.org/project/astroid) | 3.1.0 | -[astropy](https://pypi.org/project/astropy) | 6.1.6 | -[astropy-iers-data](https://pypi.org/project/astropy-iers-data) | 0.2024.12.23.0.33.24 | -[asttokens](https://pypi.org/project/asttokens) | 2.4.1 | -[async-lru](https://pypi.org/project/async-lru) | 2.0.4 | -[asyncssh](https://pypi.org/project/asyncssh) | 2.20.0 | -[atomicwrites](https://pypi.org/project/atomicwrites) | 1.4.0 | -[attrs](https://pypi.org/project/attrs) | 23.2.0 | -[autopep8](https://pypi.org/project/autopep8) | 2.0.4 | -[azure-core](https://pypi.org/project/azure-core) | 1.32.0 | -[azure-cosmos](https://pypi.org/project/azure-cosmos) | 4.9.0 | -[azure-identity](https://pypi.org/project/azure-identity) | 1.21.0 | -[babel](https://pypi.org/project/babel) | 2.16.0 | -[baresql](https://pypi.org/project/baresql) | 1.0.0 | -[beautifulsoup4](https://pypi.org/project/beautifulsoup4) | 4.12.2 | -[binaryornot](https://pypi.org/project/binaryornot) | 0.4.4 | -[black](https://pypi.org/project/black) | 25.1.0 | -[bleach](https://pypi.org/project/bleach) | 6.1.0 | -[blinker](https://pypi.org/project/blinker) | 1.9.0 | -[bokeh](https://pypi.org/project/bokeh) | 3.7.2 | -[branca](https://pypi.org/project/branca) | 0.8.0 | -[brotli](https://pypi.org/project/brotli) | 1.1.0 | -[build](https://pypi.org/project/build) | 1.2.2.post1 | -[cachetools](https://pypi.org/project/cachetools) | 5.5.2 | -[certifi](https://pypi.org/project/certifi) | 2025.1.31 | -[cffi](https://pypi.org/project/cffi) | 1.17.1 | -[chardet](https://pypi.org/project/chardet) | 5.2.0 | -[charset-normalizer](https://pypi.org/project/charset-normalizer) | 3.4.0 | -[clarabel](https://pypi.org/project/clarabel) | 0.10.0 | -[click](https://pypi.org/project/click) | 8.1.8 | -[click-default-group](https://pypi.org/project/click-default-group) | 1.2.4 | -[cloudpickle](https://pypi.org/project/cloudpickle) | 3.1.1 | +[absl-py](https://pypi.org/project/absl-py) | 2.0.0 | Abseil Python Common Libraries, see https://github.com/abseil/abseil-py. +[adbc-driver-manager](https://pypi.org/project/adbc-driver-manager) | 1.3.0 | A generic entrypoint for ADBC drivers. +[aiofiles](https://pypi.org/project/aiofiles) | 23.2.1 | File support for asyncio. +[aiohappyeyeballs](https://pypi.org/project/aiohappyeyeballs) | 2.4.4 | Happy Eyeballs for asyncio +[aiohttp](https://pypi.org/project/aiohttp) | 3.11.11 | Async http client/server framework (asyncio) +[aiosignal](https://pypi.org/project/aiosignal) | 1.3.1 | aiosignal: a list of registered asynchronous callbacks +[aiosqlite](https://pypi.org/project/aiosqlite) | 0.20.0 | asyncio bridge to the standard sqlite3 module +[alabaster](https://pypi.org/project/alabaster) | 0.7.16 | A light, configurable Sphinx theme +[alembic](https://pypi.org/project/alembic) | 1.15.1 | A database migration tool for SQLAlchemy. +[altair](https://pypi.org/project/altair) | 5.5.0 | Vega-Altair: A declarative statistical visualization library for Python. +[aniso8601](https://pypi.org/project/aniso8601) | 9.0.1 | A library for parsing ISO 8601 strings. +[annotated-types](https://pypi.org/project/annotated-types) | 0.6.0 | Reusable constraint types to use with typing.Annotated +[ansicolors](https://pypi.org/project/ansicolors) | 1.1.8 | ANSI colors for Python +[anthropic](https://pypi.org/project/anthropic) | 0.49.0 | The official Python library for the anthropic API +[anyio](https://pypi.org/project/anyio) | 4.8.0 | High level compatibility layer for multiple asynchronous event loop implementations +[anywidget](https://pypi.org/project/anywidget) | 0.9.12 | custom jupyter widgets made easy +[appdirs](https://pypi.org/project/appdirs) | 1.4.4 | A small Python module for determining appropriate platform-specific dirs, e.g. a "user data dir". +[argon2-cffi](https://pypi.org/project/argon2-cffi) | 23.1.0 | Argon2 for Python +[argon2-cffi-bindings](https://pypi.org/project/argon2-cffi-bindings) | 21.2.0 | Low-level CFFI bindings for Argon2 +[array-api-compat](https://pypi.org/project/array-api-compat) | 1.11.1 | A wrapper around NumPy and other array libraries to make them compatible with the Array API standard +[arrow](https://pypi.org/project/arrow) | 1.3.0 | Better dates & times for Python +[asgi-csrf](https://pypi.org/project/asgi-csrf) | 0.9 | ASGI middleware for protecting against CSRF attacks +[asgiref](https://pypi.org/project/asgiref) | 3.8.1 | ASGI specs, helper code, and adapters +[asn1crypto](https://pypi.org/project/asn1crypto) | 1.5.1 | Fast ASN.1 parser and serializer with definitions for private keys, public keys, certificates, CRL, OCSP, CMS, PKCS#3, PKCS#7, PKCS#8, PKCS#12, +[asteval](https://pypi.org/project/asteval) | 0.9.31 | Safe, minimalistic evaluator of python expression using ast module +[astroid](https://pypi.org/project/astroid) | 3.1.0 | An abstract syntax tree for Python with inference support. +[astropy](https://pypi.org/project/astropy) | 6.1.6 | Astronomy and astrophysics core library +[astropy-iers-data](https://pypi.org/project/astropy-iers-data) | 0.2024.12.23.0.33.24 | IERS Earth Rotation and Leap Second tables for the astropy core package +[asttokens](https://pypi.org/project/asttokens) | 2.4.1 | Annotate AST trees with source code positions +[async-lru](https://pypi.org/project/async-lru) | 2.0.4 | Simple LRU cache for asyncio +[asyncssh](https://pypi.org/project/asyncssh) | 2.20.0 | AsyncSSH: Asynchronous SSHv2 client and server library +[atomicwrites](https://pypi.org/project/atomicwrites) | 1.4.0 | Atomic file writes. +[attrs](https://pypi.org/project/attrs) | 23.2.0 | Classes Without Boilerplate +[autopep8](https://pypi.org/project/autopep8) | 2.0.4 | A tool that automatically formats Python code to conform to the PEP 8 style guide +[azure-core](https://pypi.org/project/azure-core) | 1.32.0 | Microsoft Azure Core Library for Python +[azure-cosmos](https://pypi.org/project/azure-cosmos) | 4.9.0 | Microsoft Azure Cosmos Client Library for Python +[azure-identity](https://pypi.org/project/azure-identity) | 1.21.0 | Microsoft Azure Identity Library for Python +[babel](https://pypi.org/project/babel) | 2.16.0 | Internationalization utilities +[baresql](https://pypi.org/project/baresql) | 1.0.0 | playing SQL directly on Python datas +[beautifulsoup4](https://pypi.org/project/beautifulsoup4) | 4.12.2 | Screen-scraping library +[binaryornot](https://pypi.org/project/binaryornot) | 0.4.4 | Ultra-lightweight pure Python package to check if a file is binary or text. +[black](https://pypi.org/project/black) | 25.1.0 | The uncompromising code formatter. +[bleach](https://pypi.org/project/bleach) | 6.1.0 | An easy safelist-based HTML-sanitizing tool. +[blinker](https://pypi.org/project/blinker) | 1.9.0 | Fast, simple object-to-object and broadcast signaling +[bokeh](https://pypi.org/project/bokeh) | 3.7.2 | Interactive plots and applications in the browser from Python +[branca](https://pypi.org/project/branca) | 0.8.0 | Generate complex HTML+JS pages with Python +[brotli](https://pypi.org/project/brotli) | 1.1.0 | Python bindings for the Brotli compression library +[build](https://pypi.org/project/build) | 1.2.2.post1 | A simple, correct Python build frontend +[cachetools](https://pypi.org/project/cachetools) | 5.5.2 | Extensible memoizing collections and decorators +[certifi](https://pypi.org/project/certifi) | 2025.1.31 | Python package for providing Mozilla's CA Bundle. +[cffi](https://pypi.org/project/cffi) | 1.17.1 | Foreign Function Interface for Python calling C code. +[chardet](https://pypi.org/project/chardet) | 5.2.0 | Universal encoding detector for Python 3 +[charset-normalizer](https://pypi.org/project/charset-normalizer) | 3.4.0 | The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet. +[clarabel](https://pypi.org/project/clarabel) | 0.10.0 | Clarabel Conic Interior Point Solver for Rust / Python +[click](https://pypi.org/project/click) | 8.1.8 | Composable command line interface toolkit +[click-default-group](https://pypi.org/project/click-default-group) | 1.2.4 | click_default_group +[cloudpickle](https://pypi.org/project/cloudpickle) | 3.1.1 | Pickler class to extend the standard pickle.Pickler functionality [cohere](https://pypi.org/project/cohere) | 5.13.12 | -[colorama](https://pypi.org/project/colorama) | 0.4.6 | -[colorcet](https://pypi.org/project/colorcet) | 3.1.0 | -[colorlog](https://pypi.org/project/colorlog) | 6.8.2 | -[comm](https://pypi.org/project/comm) | 0.2.2 | -[contourpy](https://pypi.org/project/contourpy) | 1.3.1 | -[cookiecutter](https://pypi.org/project/cookiecutter) | 2.6.0 | -[cryptography](https://pypi.org/project/cryptography) | 44.0.0 | -[cvxopt](https://pypi.org/project/cvxopt) | 1.3.2 | -[cvxpy](https://pypi.org/project/cvxpy) | 1.6.4 | -[cycler](https://pypi.org/project/cycler) | 0.12.1 | -[cython](https://pypi.org/project/cython) | 3.0.12 | -[cytoolz](https://pypi.org/project/cytoolz) | 1.0.1 | -[dask](https://pypi.org/project/dask) | 2025.3.0 | -[datasette](https://pypi.org/project/datasette) | 0.65.1 | -[datasette-graphql](https://pypi.org/project/datasette-graphql) | 2.2 | -[datashader](https://pypi.org/project/datashader) | 0.17.0 | -[deap](https://pypi.org/project/deap) | 1.4.2 | -[debugpy](https://pypi.org/project/debugpy) | 1.8.0 | -[decorator](https://pypi.org/project/decorator) | 5.1.1 | -[defusedxml](https://pypi.org/project/defusedxml) | 0.7.1 | -[deprecated](https://pypi.org/project/deprecated) | 1.2.14 | -[diff-match-patch](https://pypi.org/project/diff-match-patch) | 20241021 | -[dill](https://pypi.org/project/dill) | 0.3.9 | -[distributed](https://pypi.org/project/distributed) | 2025.3.0 | -[distro](https://pypi.org/project/distro) | 1.8.0 | -[django](https://pypi.org/project/django) | 5.0.7 | -[dnspython](https://pypi.org/project/dnspython) | 2.6.1 | -[docstring-to-markdown](https://pypi.org/project/docstring-to-markdown) | 0.15 | -[docutils](https://pypi.org/project/docutils) | 0.21.2 | -[duckdb](https://pypi.org/project/duckdb) | 1.2.2 | -[entrypoints](https://pypi.org/project/entrypoints) | 0.4 | -[et-xmlfile](https://pypi.org/project/et-xmlfile) | 1.1.0 | -[eval-type-backport](https://pypi.org/project/eval-type-backport) | 0.2.2 | -[executing](https://pypi.org/project/executing) | 2.2.0 | -[faker](https://pypi.org/project/faker) | 36.1.1 | -[fast-histogram](https://pypi.org/project/fast-histogram) | 0.14 | -[fastapi](https://pypi.org/project/fastapi) | 0.115.8 | -[fastavro](https://pypi.org/project/fastavro) | 1.10.0 | -[fastjsonschema](https://pypi.org/project/fastjsonschema) | 2.18.0 | -[filelock](https://pypi.org/project/filelock) | 3.17.0 | -[flake8](https://pypi.org/project/flake8) | 7.1.1 | -[flask](https://pypi.org/project/flask) | 3.1.0 | -[flexcache](https://pypi.org/project/flexcache) | 0.3 | -[flexparser](https://pypi.org/project/flexparser) | 0.4 | -[flit](https://pypi.org/project/flit) | 3.10.1 | -[flit-core](https://pypi.org/project/flit-core) | 3.10.1 | -[folium](https://pypi.org/project/folium) | 0.19.5 | -[fonttools](https://pypi.org/project/fonttools) | 4.55.3 | -[fqdn](https://pypi.org/project/fqdn) | 1.5.1 | -[frozenlist](https://pypi.org/project/frozenlist) | 1.5.0 | -[fsspec](https://pypi.org/project/fsspec) | 2024.6.1 | -[fuzzywuzzy](https://pypi.org/project/fuzzywuzzy) | 0.18.0 | -[geographiclib](https://pypi.org/project/geographiclib) | 2.0 | -[geopandas](https://pypi.org/project/geopandas) | 1.0.1 | -[geopy](https://pypi.org/project/geopy) | 2.4.1 | -[gitdb](https://pypi.org/project/gitdb) | 4.0.10 | -[gitpython](https://pypi.org/project/gitpython) | 3.1.32 | -[google-auth](https://pypi.org/project/google-auth) | 2.37.0 | -[graphene](https://pypi.org/project/graphene) | 3.3 | -[graphql-core](https://pypi.org/project/graphql-core) | 3.2.3 | -[graphql-relay](https://pypi.org/project/graphql-relay) | 3.2.0 | -[greenlet](https://pypi.org/project/greenlet) | 3.1.1 | -[griffe](https://pypi.org/project/griffe) | 1.5.5 | -[groq](https://pypi.org/project/groq) | 0.13.1 | -[guidata](https://pypi.org/project/guidata) | 3.7.1 | -[h11](https://pypi.org/project/h11) | 0.14.0 | -[h2](https://pypi.org/project/h2) | 4.1.0 | -[h5py](https://pypi.org/project/h5py) | 3.12.1 | -[hatchling](https://pypi.org/project/hatchling) | 1.27.0 | -[holoviews](https://pypi.org/project/holoviews) | 1.20.2 | -[hpack](https://pypi.org/project/hpack) | 4.1.0 | -[html5lib](https://pypi.org/project/html5lib) | 1.1 | -[httpcore](https://pypi.org/project/httpcore) | 1.0.5 | -[httpie](https://pypi.org/project/httpie) | 3.2.4 | -[httpx](https://pypi.org/project/httpx) | 0.27.2 | -[httpx-sse](https://pypi.org/project/httpx-sse) | 0.4.0 | -[huggingface-hub](https://pypi.org/project/huggingface-hub) | 0.29.3 | -[hupper](https://pypi.org/project/hupper) | 1.12 | -[hvplot](https://pypi.org/project/hvplot) | 0.11.2 | -[hypercorn](https://pypi.org/project/hypercorn) | 0.17.3 | -[hyperframe](https://pypi.org/project/hyperframe) | 6.1.0 | -[hypothesis](https://pypi.org/project/hypothesis) | 6.130.4 | -[id](https://pypi.org/project/id) | 1.5.0 | -[idna](https://pypi.org/project/idna) | 3.10 | -[imageio](https://pypi.org/project/imageio) | 2.37.0 | -[imagesize](https://pypi.org/project/imagesize) | 1.4.1 | -[imbalanced-learn](https://pypi.org/project/imbalanced-learn) | 0.13.0 | -[importlib-metadata](https://pypi.org/project/importlib-metadata) | 8.6.1 | -[inflection](https://pypi.org/project/inflection) | 0.5.1 | -[iniconfig](https://pypi.org/project/iniconfig) | 2.0.0 | -[intervaltree](https://pypi.org/project/intervaltree) | 3.0.2 | -[ipycanvas](https://pypi.org/project/ipycanvas) | 0.13.3 | -[ipykernel](https://pypi.org/project/ipykernel) | 6.29.5 | -[ipyleaflet](https://pypi.org/project/ipyleaflet) | 0.19.2 | -[ipympl](https://pypi.org/project/ipympl) | 0.9.7 | -[ipython](https://pypi.org/project/ipython) | 8.34.0 | -[ipython-genutils](https://pypi.org/project/ipython-genutils) | 0.2.0 | -[ipython-sql](https://pypi.org/project/ipython-sql) | 0.5.0 | -[ipywidgets](https://pypi.org/project/ipywidgets) | 8.1.6 | -[isoduration](https://pypi.org/project/isoduration) | 20.11.0 | -[isort](https://pypi.org/project/isort) | 5.13.2 | -[itsdangerous](https://pypi.org/project/itsdangerous) | 2.2.0 | -[janus](https://pypi.org/project/janus) | 2.0.0 | -[jaraco-classes](https://pypi.org/project/jaraco-classes) | 3.4.0 | -[jaraco-context](https://pypi.org/project/jaraco-context) | 6.0.1 | -[jaraco-functools](https://pypi.org/project/jaraco-functools) | 4.1.0 | -[jedi](https://pypi.org/project/jedi) | 0.19.2 | -[jellyfish](https://pypi.org/project/jellyfish) | 1.1.3 | -[jinja2](https://pypi.org/project/jinja2) | 3.1.2 | -[jiter](https://pypi.org/project/jiter) | 0.8.2 | -[joblib](https://pypi.org/project/joblib) | 1.4.2 | -[json5](https://pypi.org/project/json5) | 0.9.14 | -[jsonpatch](https://pypi.org/project/jsonpatch) | 1.33 | -[jsonpath-python](https://pypi.org/project/jsonpath-python) | 1.0.6 | -[jsonpointer](https://pypi.org/project/jsonpointer) | 2.4 | -[jsonschema](https://pypi.org/project/jsonschema) | 4.19.2 | -[jsonschema-specifications](https://pypi.org/project/jsonschema-specifications) | 2023.12.1 | -[julia](https://pypi.org/project/julia) | 0.6.2 | -[jupyter](https://pypi.org/project/jupyter) | 1.1.1 | -[jupyter-bokeh](https://pypi.org/project/jupyter-bokeh) | 4.0.5 | -[jupyter-client](https://pypi.org/project/jupyter-client) | 8.6.3 | -[jupyter-console](https://pypi.org/project/jupyter-console) | 6.6.3 | -[jupyter-core](https://pypi.org/project/jupyter-core) | 5.7.2 | -[jupyter-events](https://pypi.org/project/jupyter-events) | 0.12.0 | -[jupyter-leaflet](https://pypi.org/project/jupyter-leaflet) | 0.19.2 | -[jupyter-lsp](https://pypi.org/project/jupyter-lsp) | 2.2.5 | -[jupyter-server](https://pypi.org/project/jupyter-server) | 2.14.2 | -[jupyter-server-terminals](https://pypi.org/project/jupyter-server-terminals) | 0.5.3 | -[jupyterlab](https://pypi.org/project/jupyterlab) | 4.4.1 | -[jupyterlab-pygments](https://pypi.org/project/jupyterlab-pygments) | 0.3.0 | -[jupyterlab-server](https://pypi.org/project/jupyterlab-server) | 2.27.3 | -[jupyterlab-widgets](https://pypi.org/project/jupyterlab-widgets) | 3.0.14 | -[keras](https://pypi.org/project/keras) | 3.9.2 | -[keyring](https://pypi.org/project/keyring) | 25.6.0 | -[kiwisolver](https://pypi.org/project/kiwisolver) | 1.4.8 | -[langchain](https://pypi.org/project/langchain) | 0.3.23 | -[langchain-core](https://pypi.org/project/langchain-core) | 0.3.51 | -[langchain-text-splitters](https://pypi.org/project/langchain-text-splitters) | 0.3.8 | -[langsmith](https://pypi.org/project/langsmith) | 0.3.24 | -[lazy-loader](https://pypi.org/project/lazy-loader) | 0.4 | -[linkify-it-py](https://pypi.org/project/linkify-it-py) | 2.0.2 | -[llvmlite](https://pypi.org/project/llvmlite) | 0.44.0 | -[lmfit](https://pypi.org/project/lmfit) | 1.3.1 | -[locket](https://pypi.org/project/locket) | 1.0.0 | -[logfire-api](https://pypi.org/project/logfire-api) | 3.5.3 | -[lxml](https://pypi.org/project/lxml) | 5.3.0 | -[mako](https://pypi.org/project/mako) | 1.3.5 | -[markdown](https://pypi.org/project/markdown) | 3.7 | -[markdown-it-py](https://pypi.org/project/markdown-it-py) | 2.2.0 | -[markupsafe](https://pypi.org/project/markupsafe) | 3.0.2 | -[matplotlib](https://pypi.org/project/matplotlib) | 3.10.1 | -[matplotlib-inline](https://pypi.org/project/matplotlib-inline) | 0.1.7 | -[maturin](https://pypi.org/project/maturin) | 1.8.1 | -[mccabe](https://pypi.org/project/mccabe) | 0.7.0 | -[mdit-py-plugins](https://pypi.org/project/mdit-py-plugins) | 0.3.5 | -[mdurl](https://pypi.org/project/mdurl) | 0.1.2 | -[mercantile](https://pypi.org/project/mercantile) | 1.2.1 | -[mergedeep](https://pypi.org/project/mergedeep) | 1.3.4 | -[missingno](https://pypi.org/project/missingno) | 0.5.1 | -[mistralai](https://pypi.org/project/mistralai) | 1.2.5 | -[mistune](https://pypi.org/project/mistune) | 2.0.5 | -[mizani](https://pypi.org/project/mizani) | 0.11.4 | +[colorama](https://pypi.org/project/colorama) | 0.4.6 | Cross-platform colored terminal text. +[colorcet](https://pypi.org/project/colorcet) | 3.1.0 | Collection of perceptually uniform colormaps +[colorlog](https://pypi.org/project/colorlog) | 6.8.2 | Add colours to the output of Python's logging module. +[comm](https://pypi.org/project/comm) | 0.2.2 | Jupyter Python Comm implementation, for usage in ipykernel, xeus-python etc. +[contourpy](https://pypi.org/project/contourpy) | 1.3.1 | Python library for calculating contours of 2D quadrilateral grids +[cookiecutter](https://pypi.org/project/cookiecutter) | 2.6.0 | A command-line utility that creates projects from project templates, e.g. +[cryptography](https://pypi.org/project/cryptography) | 44.0.0 | cryptography is a package which provides cryptographic recipes and primitives to Python developers. +[cvxopt](https://pypi.org/project/cvxopt) | 1.3.2 | Convex optimization package +[cvxpy](https://pypi.org/project/cvxpy) | 1.6.4 | A domain-specific language for modeling convex optimization problems in Python. +[cycler](https://pypi.org/project/cycler) | 0.12.1 | Composable style cycles +[cython](https://pypi.org/project/cython) | 3.0.12 | The Cython compiler for writing C extensions in the Python language. +[cytoolz](https://pypi.org/project/cytoolz) | 1.0.1 | Cython implementation of Toolz: High performance functional utilities +[dask](https://pypi.org/project/dask) | 2025.3.0 | Parallel PyData with Task Scheduling +[datasette](https://pypi.org/project/datasette) | 0.65.1 | An open source multi-tool for exploring and publishing data +[datasette-graphql](https://pypi.org/project/datasette-graphql) | 2.2 | Datasette plugin providing an automatic GraphQL API for your SQLite databases +[datashader](https://pypi.org/project/datashader) | 0.17.0 | Data visualization toolchain based on aggregating into a grid +[deap](https://pypi.org/project/deap) | 1.4.2 | Distributed Evolutionary Algorithms in Python +[debugpy](https://pypi.org/project/debugpy) | 1.8.0 | An implementation of the Debug Adapter Protocol for Python +[decorator](https://pypi.org/project/decorator) | 5.1.1 | Decorators for Humans +[defusedxml](https://pypi.org/project/defusedxml) | 0.7.1 | XML bomb protection for Python stdlib modules +[deprecated](https://pypi.org/project/deprecated) | 1.2.14 | Python @deprecated decorator to deprecate old python classes, functions or methods. +[diff-match-patch](https://pypi.org/project/diff-match-patch) | 20241021 | Repackaging of Google's Diff Match and Patch libraries. +[dill](https://pypi.org/project/dill) | 0.3.9 | serialize all of Python +[distributed](https://pypi.org/project/distributed) | 2025.3.0 | Distributed scheduler for Dask +[distro](https://pypi.org/project/distro) | 1.8.0 | Distro - an OS platform information API +[django](https://pypi.org/project/django) | 5.0.7 | A high-level Python web framework that encourages rapid development and clean, pragmatic design. +[dnspython](https://pypi.org/project/dnspython) | 2.6.1 | DNS toolkit +[docstring-to-markdown](https://pypi.org/project/docstring-to-markdown) | 0.15 | On the fly conversion of Python docstrings to markdown +[docutils](https://pypi.org/project/docutils) | 0.21.2 | Docutils -- Python Documentation Utilities +[duckdb](https://pypi.org/project/duckdb) | 1.2.2 | DuckDB in-process database +[entrypoints](https://pypi.org/project/entrypoints) | 0.4 | Discover and load entry points from installed packages. +[et-xmlfile](https://pypi.org/project/et-xmlfile) | 1.1.0 | An implementation of lxml.xmlfile for the standard library +[eval-type-backport](https://pypi.org/project/eval-type-backport) | 0.2.2 | Like `typing._eval_type`, but lets older Python versions use newer typing features. +[executing](https://pypi.org/project/executing) | 2.2.0 | Get the currently executing AST node of a frame, and other information +[faker](https://pypi.org/project/faker) | 36.1.1 | Faker is a Python package that generates fake data for you. +[fast-histogram](https://pypi.org/project/fast-histogram) | 0.14 | Fast simple 1D and 2D histograms +[fastapi](https://pypi.org/project/fastapi) | 0.115.8 | FastAPI framework, high performance, easy to learn, fast to code, ready for production +[fastavro](https://pypi.org/project/fastavro) | 1.10.0 | Fast read/write of AVRO files +[fastjsonschema](https://pypi.org/project/fastjsonschema) | 2.18.0 | Fastest Python implementation of JSON schema +[filelock](https://pypi.org/project/filelock) | 3.17.0 | A platform independent file lock. +[flake8](https://pypi.org/project/flake8) | 7.1.1 | the modular source code checker: pep8 pyflakes and co +[flask](https://pypi.org/project/flask) | 3.1.0 | A simple framework for building complex web applications. +[flexcache](https://pypi.org/project/flexcache) | 0.3 | Saves and loads to the cache a transformed versions of a source object. +[flexparser](https://pypi.org/project/flexparser) | 0.4 | Parsing made fun ... using typing. +[flit](https://pypi.org/project/flit) | 3.10.1 | A simple packaging tool for simple packages. +[flit-core](https://pypi.org/project/flit-core) | 3.10.1 | Distribution-building parts of Flit. See flit package for more information +[folium](https://pypi.org/project/folium) | 0.19.5 | Make beautiful maps with Leaflet.js & Python +[fonttools](https://pypi.org/project/fonttools) | 4.55.3 | Tools to manipulate font files +[fqdn](https://pypi.org/project/fqdn) | 1.5.1 | Validates fully-qualified domain names against RFC 1123, so that they are acceptable to modern bowsers +[frozenlist](https://pypi.org/project/frozenlist) | 1.5.0 | A list-like structure which implements collections.abc.MutableSequence +[fsspec](https://pypi.org/project/fsspec) | 2024.6.1 | File-system specification +[fuzzywuzzy](https://pypi.org/project/fuzzywuzzy) | 0.18.0 | Fuzzy string matching in python +[geographiclib](https://pypi.org/project/geographiclib) | 2.0 | The geodesic routines from GeographicLib +[geopandas](https://pypi.org/project/geopandas) | 1.0.1 | Geographic pandas extensions +[geopy](https://pypi.org/project/geopy) | 2.4.1 | Python Geocoding Toolbox +[gitdb](https://pypi.org/project/gitdb) | 4.0.10 | Git Object Database +[gitpython](https://pypi.org/project/gitpython) | 3.1.32 | GitPython is a Python library used to interact with Git repositories +[google-auth](https://pypi.org/project/google-auth) | 2.37.0 | Google Authentication Library +[graphene](https://pypi.org/project/graphene) | 3.3 | GraphQL Framework for Python +[graphql-core](https://pypi.org/project/graphql-core) | 3.2.3 | GraphQL implementation for Python, a port of GraphQL.js, the JavaScript reference implementation for GraphQL. +[graphql-relay](https://pypi.org/project/graphql-relay) | 3.2.0 | Relay library for graphql-core +[greenlet](https://pypi.org/project/greenlet) | 3.1.1 | Lightweight in-process concurrent programming +[griffe](https://pypi.org/project/griffe) | 1.5.5 | Signatures for entire Python programs. +[groq](https://pypi.org/project/groq) | 0.13.1 | The official Python library for the groq API +[guidata](https://pypi.org/project/guidata) | 3.7.1 | Automatic GUI generation for easy dataset editing and display +[h11](https://pypi.org/project/h11) | 0.14.0 | A pure-Python, bring-your-own-I/O implementation of HTTP/1.1 +[h2](https://pypi.org/project/h2) | 4.1.0 | HTTP/2 State-Machine based protocol implementation +[h5py](https://pypi.org/project/h5py) | 3.12.1 | Read and write HDF5 files from Python +[hatchling](https://pypi.org/project/hatchling) | 1.27.0 | Modern, extensible Python build backend +[holoviews](https://pypi.org/project/holoviews) | 1.20.2 | A high-level plotting API for the PyData ecosystem built on HoloViews. +[hpack](https://pypi.org/project/hpack) | 4.1.0 | Pure-Python HPACK header encoding +[html5lib](https://pypi.org/project/html5lib) | 1.1 | HTML parser based on the WHATWG HTML specification +[httpcore](https://pypi.org/project/httpcore) | 1.0.5 | A minimal low-level HTTP client. +[httpie](https://pypi.org/project/httpie) | 3.2.4 | HTTPie: modern, user-friendly command-line HTTP client for the API era. +[httpx](https://pypi.org/project/httpx) | 0.27.2 | The next generation HTTP client. +[httpx-sse](https://pypi.org/project/httpx-sse) | 0.4.0 | Consume Server-Sent Event (SSE) messages with HTTPX. +[huggingface-hub](https://pypi.org/project/huggingface-hub) | 0.29.3 | Client library to download and publish models, datasets and other repos on the huggingface.co hub +[hupper](https://pypi.org/project/hupper) | 1.12 | Integrated process monitor for developing and reloading daemons. +[hvplot](https://pypi.org/project/hvplot) | 0.11.2 | A high-level plotting API for the PyData ecosystem built on HoloViews. +[hypercorn](https://pypi.org/project/hypercorn) | 0.17.3 | A ASGI Server based on Hyper libraries and inspired by Gunicorn +[hyperframe](https://pypi.org/project/hyperframe) | 6.1.0 | Pure-Python HTTP/2 framing +[hypothesis](https://pypi.org/project/hypothesis) | 6.130.4 | A library for property-based testing +[id](https://pypi.org/project/id) | 1.5.0 | A tool for generating OIDC identities +[idna](https://pypi.org/project/idna) | 3.10 | Internationalized Domain Names in Applications (IDNA) +[imageio](https://pypi.org/project/imageio) | 2.37.0 | Library for reading and writing a wide range of image, video, scientific, and volumetric data formats. +[imagesize](https://pypi.org/project/imagesize) | 1.4.1 | Getting image size from png/jpeg/jpeg2000/gif file +[imbalanced-learn](https://pypi.org/project/imbalanced-learn) | 0.13.0 | Toolbox for imbalanced dataset in machine learning +[importlib-metadata](https://pypi.org/project/importlib-metadata) | 8.6.1 | Read metadata from Python packages +[inflection](https://pypi.org/project/inflection) | 0.5.1 | A port of Ruby on Rails inflector to Python +[iniconfig](https://pypi.org/project/iniconfig) | 2.0.0 | brain-dead simple config-ini parsing +[intervaltree](https://pypi.org/project/intervaltree) | 3.0.2 | Editable interval tree data structure for Python 2 and 3 +[ipycanvas](https://pypi.org/project/ipycanvas) | 0.13.3 | Interactive widgets library exposing the browser's Canvas API +[ipykernel](https://pypi.org/project/ipykernel) | 6.29.5 | IPython Kernel for Jupyter +[ipyleaflet](https://pypi.org/project/ipyleaflet) | 0.19.2 | A Jupyter widget for dynamic Leaflet maps +[ipympl](https://pypi.org/project/ipympl) | 0.9.7 | Matplotlib Jupyter Extension +[ipython](https://pypi.org/project/ipython) | 8.34.0 | IPython: Productive Interactive Computing +[ipython-genutils](https://pypi.org/project/ipython-genutils) | 0.2.0 | Vestigial utilities from IPython +[ipython-sql](https://pypi.org/project/ipython-sql) | 0.5.0 | RDBMS access via IPython +[ipywidgets](https://pypi.org/project/ipywidgets) | 8.1.6 | Jupyter interactive widgets +[isoduration](https://pypi.org/project/isoduration) | 20.11.0 | Operations with ISO 8601 durations +[isort](https://pypi.org/project/isort) | 5.13.2 | A Python utility / library to sort Python imports. +[itsdangerous](https://pypi.org/project/itsdangerous) | 2.2.0 | Safely pass data to untrusted environments and back. +[janus](https://pypi.org/project/janus) | 2.0.0 | Mixed sync-async queue to interoperate between asyncio tasks and classic threads +[jaraco-classes](https://pypi.org/project/jaraco-classes) | 3.4.0 | Utility functions for Python class constructs +[jaraco-context](https://pypi.org/project/jaraco-context) | 6.0.1 | Useful decorators and context managers +[jaraco-functools](https://pypi.org/project/jaraco-functools) | 4.1.0 | Functools like those found in stdlib +[jedi](https://pypi.org/project/jedi) | 0.19.2 | An autocompletion tool for Python that can be used for text editors. +[jellyfish](https://pypi.org/project/jellyfish) | 1.1.3 | Approximate and phonetic matching of strings. +[jinja2](https://pypi.org/project/jinja2) | 3.1.2 | A very fast and expressive template engine. +[jiter](https://pypi.org/project/jiter) | 0.8.2 | Fast iterable JSON parser. +[joblib](https://pypi.org/project/joblib) | 1.4.2 | Lightweight pipelining with Python functions +[json5](https://pypi.org/project/json5) | 0.9.14 | A Python implementation of the JSON5 data format. +[jsonpatch](https://pypi.org/project/jsonpatch) | 1.33 | Apply JSON-Patches (RFC 6902) +[jsonpath-python](https://pypi.org/project/jsonpath-python) | 1.0.6 | A more powerful JSONPath implementation in modern python +[jsonpointer](https://pypi.org/project/jsonpointer) | 2.4 | Identify specific nodes in a JSON document (RFC 6901) +[jsonschema](https://pypi.org/project/jsonschema) | 4.19.2 | An implementation of JSON Schema validation for Python +[jsonschema-specifications](https://pypi.org/project/jsonschema-specifications) | 2023.12.1 | The JSON Schema meta-schemas and vocabularies, exposed as a Registry +[julia](https://pypi.org/project/julia) | 0.6.2 | Julia/Python bridge with IPython support. +[jupyter](https://pypi.org/project/jupyter) | 1.1.1 | Jupyter metapackage. Install all the Jupyter components in one go. +[jupyter-bokeh](https://pypi.org/project/jupyter-bokeh) | 4.0.5 | A Jupyter extension for rendering Bokeh content. +[jupyter-client](https://pypi.org/project/jupyter-client) | 8.6.3 | Jupyter protocol implementation and client libraries +[jupyter-console](https://pypi.org/project/jupyter-console) | 6.6.3 | Jupyter terminal console +[jupyter-core](https://pypi.org/project/jupyter-core) | 5.7.2 | Jupyter core package. A base package on which Jupyter projects rely. +[jupyter-events](https://pypi.org/project/jupyter-events) | 0.12.0 | Jupyter Event System library +[jupyter-leaflet](https://pypi.org/project/jupyter-leaflet) | 0.19.2 | ipyleaflet extensions for JupyterLab and Jupyter Notebook +[jupyter-lsp](https://pypi.org/project/jupyter-lsp) | 2.2.5 | Multi-Language Server WebSocket proxy for Jupyter Notebook/Lab server +[jupyter-server](https://pypi.org/project/jupyter-server) | 2.14.2 | The backend—i.e. core services, APIs, and REST endpoints—to Jupyter web applications. +[jupyter-server-terminals](https://pypi.org/project/jupyter-server-terminals) | 0.5.3 | A Jupyter Server Extension Providing Terminals. +[jupyterlab](https://pypi.org/project/jupyterlab) | 4.4.1 | JupyterLab computational environment +[jupyterlab-pygments](https://pypi.org/project/jupyterlab-pygments) | 0.3.0 | Pygments theme using JupyterLab CSS variables +[jupyterlab-server](https://pypi.org/project/jupyterlab-server) | 2.27.3 | A set of server components for JupyterLab and JupyterLab like applications. +[jupyterlab-widgets](https://pypi.org/project/jupyterlab-widgets) | 3.0.14 | Jupyter interactive widgets for JupyterLab +[keras](https://pypi.org/project/keras) | 3.9.2 | Multi-backend Keras +[keyring](https://pypi.org/project/keyring) | 25.6.0 | Store and access your passwords safely. +[kiwisolver](https://pypi.org/project/kiwisolver) | 1.4.8 | A fast implementation of the Cassowary constraint solver +[langchain](https://pypi.org/project/langchain) | 0.3.23 | Building applications with LLMs through composability +[langchain-core](https://pypi.org/project/langchain-core) | 0.3.51 | Building applications with LLMs through composability +[langchain-text-splitters](https://pypi.org/project/langchain-text-splitters) | 0.3.8 | LangChain text splitting utilities +[langsmith](https://pypi.org/project/langsmith) | 0.3.24 | Client library to connect to the LangSmith LLM Tracing and Evaluation Platform. +[lazy-loader](https://pypi.org/project/lazy-loader) | 0.4 | Makes it easy to load subpackages and functions on demand. +[linkify-it-py](https://pypi.org/project/linkify-it-py) | 2.0.2 | Links recognition library with FULL unicode support. +[llvmlite](https://pypi.org/project/llvmlite) | 0.44.0 | lightweight wrapper around basic LLVM functionality +[lmfit](https://pypi.org/project/lmfit) | 1.3.1 | Least-Squares Minimization with Bounds and Constraints +[locket](https://pypi.org/project/locket) | 1.0.0 | File-based locks for Python on Linux and Windows +[logfire-api](https://pypi.org/project/logfire-api) | 3.5.3 | Shim for the Logfire SDK which does nothing unless Logfire is installed +[lxml](https://pypi.org/project/lxml) | 5.3.0 | Powerful and Pythonic XML processing library combining libxml2/libxslt with the ElementTree API. +[mako](https://pypi.org/project/mako) | 1.3.5 | A super-fast templating language that borrows the best ideas from the existing templating languages. +[markdown](https://pypi.org/project/markdown) | 3.7 | Python implementation of John Gruber's Markdown. +[markdown-it-py](https://pypi.org/project/markdown-it-py) | 2.2.0 | Python port of markdown-it. Markdown parsing, done right! +[markupsafe](https://pypi.org/project/markupsafe) | 3.0.2 | Safely add untrusted strings to HTML/XML markup. +[matplotlib](https://pypi.org/project/matplotlib) | 3.10.1 | Python plotting package +[matplotlib-inline](https://pypi.org/project/matplotlib-inline) | 0.1.7 | Inline Matplotlib backend for Jupyter +[maturin](https://pypi.org/project/maturin) | 1.8.1 | Build and publish crates with pyo3, cffi and uniffi bindings as well as rust binaries as python packages +[mccabe](https://pypi.org/project/mccabe) | 0.7.0 | McCabe checker, plugin for flake8 +[mdit-py-plugins](https://pypi.org/project/mdit-py-plugins) | 0.3.5 | Collection of plugins for markdown-it-py +[mdurl](https://pypi.org/project/mdurl) | 0.1.2 | Markdown URL utilities +[mercantile](https://pypi.org/project/mercantile) | 1.2.1 | Web mercator XYZ tile utilities +[mergedeep](https://pypi.org/project/mergedeep) | 1.3.4 | A deep merge function for 🐍. +[missingno](https://pypi.org/project/missingno) | 0.5.1 | Missing data visualization module for Python. +[mistralai](https://pypi.org/project/mistralai) | 1.2.5 | Python Client SDK for the Mistral AI API. +[mistune](https://pypi.org/project/mistune) | 2.0.5 | A sane Markdown parser with useful plugins and renderers +[mizani](https://pypi.org/project/mizani) | 0.11.4 | Scales for Python [ml-dtypes](https://pypi.org/project/ml-dtypes) | 0.5.0 | -[mlxtend](https://pypi.org/project/mlxtend) | 0.23.3 | -[more-itertools](https://pypi.org/project/more-itertools) | 10.2.0 | -[mpl-scatter-density](https://pypi.org/project/mpl-scatter-density) | 0.7 | -[mpld3](https://pypi.org/project/mpld3) | 0.5.8 | -[mpmath](https://pypi.org/project/mpmath) | 1.3.0 | -[msal](https://pypi.org/project/msal) | 1.30.0 | -[msal-extensions](https://pypi.org/project/msal-extensions) | 1.2.0 | -[msgpack](https://pypi.org/project/msgpack) | 1.1.0 | -[multidict](https://pypi.org/project/multidict) | 6.1.0 | -[multipledispatch](https://pypi.org/project/multipledispatch) | 1.0.0 | -[mypy](https://pypi.org/project/mypy) | 1.15.0 | -[mypy-extensions](https://pypi.org/project/mypy-extensions) | 1.0.0 | -[mysql-connector-python](https://pypi.org/project/mysql-connector-python) | 9.2.0 | -[namex](https://pypi.org/project/namex) | 0.0.8 | -[narwhals](https://pypi.org/project/narwhals) | 1.30.0 | -[nbclient](https://pypi.org/project/nbclient) | 0.10.0 | -[nbconvert](https://pypi.org/project/nbconvert) | 7.16.1 | -[nbformat](https://pypi.org/project/nbformat) | 5.10.4 | -[nest-asyncio](https://pypi.org/project/nest-asyncio) | 1.6.0 | -[networkx](https://pypi.org/project/networkx) | 3.4.2 | -[nh3](https://pypi.org/project/nh3) | 0.2.18 | -[nltk](https://pypi.org/project/nltk) | 3.9.1 | -[notebook](https://pypi.org/project/notebook) | 7.4.0 | -[notebook-shim](https://pypi.org/project/notebook-shim) | 0.2.4 | -[numba](https://pypi.org/project/numba) | 0.61.2 | -[numpy](https://pypi.org/project/numpy) | 2.2.4 | -[numpydoc](https://pypi.org/project/numpydoc) | 1.6.0 | -[openai](https://pypi.org/project/openai) | 1.72.0 | -[opencv-python](https://pypi.org/project/opencv-python) | 4.11.0.86 | -[openpyxl](https://pypi.org/project/openpyxl) | 3.1.2 | -[optree](https://pypi.org/project/optree) | 0.14.0 | -[optuna](https://pypi.org/project/optuna) | 3.6.1 | -[orjson](https://pypi.org/project/orjson) | 3.10.12 | -[osqp](https://pypi.org/project/osqp) | 0.6.7.post3 | -[outcome](https://pypi.org/project/outcome) | 1.3.0.post0 | -[overrides](https://pypi.org/project/overrides) | 7.7.0 | -[packaging](https://pypi.org/project/packaging) | 24.2 | -[pandas](https://pypi.org/project/pandas) | 2.2.3 | -[pandocfilters](https://pypi.org/project/pandocfilters) | 1.5.0 | -[panel](https://pypi.org/project/panel) | 1.6.2 | -[papermill](https://pypi.org/project/papermill) | 2.6.0 | -[param](https://pypi.org/project/param) | 2.2.0 | -[parso](https://pypi.org/project/parso) | 0.8.4 | -[partd](https://pypi.org/project/partd) | 1.4.0 | -[pathspec](https://pypi.org/project/pathspec) | 0.11.0 | -[patsy](https://pypi.org/project/patsy) | 0.5.6 | -[pep8](https://pypi.org/project/pep8) | 1.7.1 | -[pexpect](https://pypi.org/project/pexpect) | 4.8.0 | -[pg8000](https://pypi.org/project/pg8000) | 1.23.0 | -[pickleshare](https://pypi.org/project/pickleshare) | 0.7.5 | -[pillow](https://pypi.org/project/pillow) | 11.1.0 | -[pip](https://pypi.org/project/pip) | 25.0.1 | -[platformdirs](https://pypi.org/project/platformdirs) | 4.3.6 | -[plotly](https://pypi.org/project/plotly) | 6.0.1 | -[plotnine](https://pypi.org/project/plotnine) | 0.13.6 | -[plotpy](https://pypi.org/project/plotpy) | 2.7.2 | -[pluggy](https://pypi.org/project/pluggy) | 1.5.0 | -[ply](https://pypi.org/project/ply) | 3.11 | -[polars](https://pypi.org/project/polars) | 1.27.1 | -[portalocker](https://pypi.org/project/portalocker) | 2.7.0 | -[prettytable](https://pypi.org/project/prettytable) | 3.3.0 | -[prince](https://pypi.org/project/prince) | 0.15.0 | -[priority](https://pypi.org/project/priority) | 2.0.0 | -[prometheus-client](https://pypi.org/project/prometheus-client) | 0.21.1 | -[prompt-toolkit](https://pypi.org/project/prompt-toolkit) | 3.0.50 | -[propcache](https://pypi.org/project/propcache) | 0.2.1 | +[mlxtend](https://pypi.org/project/mlxtend) | 0.23.3 | Machine Learning Library Extensions +[more-itertools](https://pypi.org/project/more-itertools) | 10.2.0 | More routines for operating on iterables, beyond itertools +[mpl-scatter-density](https://pypi.org/project/mpl-scatter-density) | 0.7 | Matplotlib helpers to make density scatter plots +[mpld3](https://pypi.org/project/mpld3) | 0.5.8 | D3 Viewer for Matplotlib +[mpmath](https://pypi.org/project/mpmath) | 1.3.0 | Python library for arbitrary-precision floating-point arithmetic +[msal](https://pypi.org/project/msal) | 1.30.0 | The Microsoft Authentication Library (MSAL) for Python library enables your app to access the Microsoft Cloud by supporting authentication of us +[msal-extensions](https://pypi.org/project/msal-extensions) | 1.2.0 | Microsoft Authentication Library extensions (MSAL EX) provides a persistence API that can save your data on disk, encrypted on Windows, macOS an +[msgpack](https://pypi.org/project/msgpack) | 1.1.0 | MessagePack serializer +[multidict](https://pypi.org/project/multidict) | 6.1.0 | multidict implementation +[multipledispatch](https://pypi.org/project/multipledispatch) | 1.0.0 | Multiple dispatch +[mypy](https://pypi.org/project/mypy) | 1.15.0 | Optional static typing for Python +[mypy-extensions](https://pypi.org/project/mypy-extensions) | 1.0.0 | Type system extensions for programs checked with the mypy type checker. +[mysql-connector-python](https://pypi.org/project/mysql-connector-python) | 9.2.0 | A self-contained Python driver for communicating with MySQL servers, using an API that is compliant with the Python Database API Specification v +[namex](https://pypi.org/project/namex) | 0.0.8 | A simple utility to separate the implementation of your Python package and its public API surface. +[narwhals](https://pypi.org/project/narwhals) | 1.30.0 | Extremely lightweight compatibility layer between dataframe libraries +[nbclient](https://pypi.org/project/nbclient) | 0.10.0 | A client library for executing notebooks. Formerly nbconvert's ExecutePreprocessor. +[nbconvert](https://pypi.org/project/nbconvert) | 7.16.1 | Converting Jupyter Notebooks (.ipynb files) to other formats. Output formats include asciidoc, html, latex, markdown, pdf, py, rst, script. +[nbformat](https://pypi.org/project/nbformat) | 5.10.4 | The Jupyter Notebook format +[nest-asyncio](https://pypi.org/project/nest-asyncio) | 1.6.0 | Patch asyncio to allow nested event loops +[networkx](https://pypi.org/project/networkx) | 3.4.2 | Python package for creating and manipulating graphs and networks +[nh3](https://pypi.org/project/nh3) | 0.2.18 | Python bindings to the ammonia HTML sanitization library. +[nltk](https://pypi.org/project/nltk) | 3.9.1 | Natural Language Toolkit +[notebook](https://pypi.org/project/notebook) | 7.4.0 | Jupyter Notebook - A web-based notebook environment for interactive computing +[notebook-shim](https://pypi.org/project/notebook-shim) | 0.2.4 | A shim layer for notebook traits and config +[numba](https://pypi.org/project/numba) | 0.61.2 | compiling Python code using LLVM +[numpy](https://pypi.org/project/numpy) | 2.2.4 | Fundamental package for array computing in Python +[numpydoc](https://pypi.org/project/numpydoc) | 1.6.0 | Sphinx extension to support docstrings in Numpy format +[openai](https://pypi.org/project/openai) | 1.72.0 | The official Python library for the openai API +[opencv-python](https://pypi.org/project/opencv-python) | 4.11.0.86 | Wrapper package for OpenCV python bindings. +[openpyxl](https://pypi.org/project/openpyxl) | 3.1.2 | A Python library to read/write Excel 2010 xlsx/xlsm files +[optree](https://pypi.org/project/optree) | 0.14.0 | Optimized PyTree Utilities. +[optuna](https://pypi.org/project/optuna) | 3.6.1 | A hyperparameter optimization framework +[orjson](https://pypi.org/project/orjson) | 3.10.12 | Fast, correct Python JSON library supporting dataclasses, datetimes, and numpy +[osqp](https://pypi.org/project/osqp) | 0.6.7.post3 | OSQP: The Operator Splitting QP Solver +[outcome](https://pypi.org/project/outcome) | 1.3.0.post0 | Capture the outcome of Python function calls. +[overrides](https://pypi.org/project/overrides) | 7.7.0 | A decorator to automatically detect mismatch when overriding a method. +[packaging](https://pypi.org/project/packaging) | 24.2 | Core utilities for Python packages +[pandas](https://pypi.org/project/pandas) | 2.2.3 | Powerful data structures for data analysis, time series, and statistics +[pandocfilters](https://pypi.org/project/pandocfilters) | 1.5.0 | Utilities for writing pandoc filters in python +[panel](https://pypi.org/project/panel) | 1.6.2 | The powerful data exploration & web app framework for Python. +[papermill](https://pypi.org/project/papermill) | 2.6.0 | Parameterize and run Jupyter and nteract Notebooks +[param](https://pypi.org/project/param) | 2.2.0 | Make your Python code clearer and more reliable by declaring Parameters. +[parso](https://pypi.org/project/parso) | 0.8.4 | A Python Parser +[partd](https://pypi.org/project/partd) | 1.4.0 | Appendable key-value storage +[pathspec](https://pypi.org/project/pathspec) | 0.11.0 | Utility library for gitignore style pattern matching of file paths. +[patsy](https://pypi.org/project/patsy) | 0.5.6 | A Python package for describing statistical models and for building design matrices. +[pep8](https://pypi.org/project/pep8) | 1.7.1 | Python style guide checker +[pexpect](https://pypi.org/project/pexpect) | 4.8.0 | Pexpect allows easy control of interactive console applications. +[pg8000](https://pypi.org/project/pg8000) | 1.23.0 | PostgreSQL interface library +[pickleshare](https://pypi.org/project/pickleshare) | 0.7.5 | Tiny 'shelve'-like database with concurrency support +[pillow](https://pypi.org/project/pillow) | 11.1.0 | Python Imaging Library (Fork) +[pip](https://pypi.org/project/pip) | 25.0.1 | The PyPA recommended tool for installing Python packages. +[platformdirs](https://pypi.org/project/platformdirs) | 4.3.6 | A small Python package for determining appropriate platform-specific dirs, e.g. a `user data dir`. +[plotly](https://pypi.org/project/plotly) | 6.0.1 | An open-source interactive data visualization library for Python +[plotnine](https://pypi.org/project/plotnine) | 0.13.6 | A Grammar of Graphics for Python +[plotpy](https://pypi.org/project/plotpy) | 2.7.2 | Curve and image plotting tools for Python/Qt applications +[pluggy](https://pypi.org/project/pluggy) | 1.5.0 | plugin and hook calling mechanisms for python +[ply](https://pypi.org/project/ply) | 3.11 | Python Lex & Yacc +[polars](https://pypi.org/project/polars) | 1.27.1 | Blazingly fast DataFrame library +[portalocker](https://pypi.org/project/portalocker) | 2.7.0 | Wraps the portalocker recipe for easy usage +[prettytable](https://pypi.org/project/prettytable) | 3.3.0 | A simple Python library for easily displaying tabular data in a visually appealing ASCII table format +[prince](https://pypi.org/project/prince) | 0.15.0 | Factor analysis in Python: PCA, CA, MCA, MFA, FAMD, GPA +[priority](https://pypi.org/project/priority) | 2.0.0 | A pure-Python implementation of the HTTP/2 priority tree +[prometheus-client](https://pypi.org/project/prometheus-client) | 0.21.1 | Python client for the Prometheus monitoring system. +[prompt-toolkit](https://pypi.org/project/prompt-toolkit) | 3.0.50 | Library for building powerful interactive command lines in Python +[propcache](https://pypi.org/project/propcache) | 0.2.1 | Accelerated property cache [protobuf](https://pypi.org/project/protobuf) | 5.27.3 | -[psutil](https://pypi.org/project/psutil) | 5.9.8 | -[psygnal](https://pypi.org/project/psygnal) | 0.11.1 | -[ptpython](https://pypi.org/project/ptpython) | 3.0.29 | -[ptyprocess](https://pypi.org/project/ptyprocess) | 0.7.0 | -[pure-eval](https://pypi.org/project/pure-eval) | 0.2.2 | -[pyarrow](https://pypi.org/project/pyarrow) | 19.0.1 | -[pyasn1](https://pypi.org/project/pyasn1) | 0.6.1 | -[pyasn1-modules](https://pypi.org/project/pyasn1-modules) | 0.4.1 | -[pybind11](https://pypi.org/project/pybind11) | 2.13.6 | -[pycodestyle](https://pypi.org/project/pycodestyle) | 2.12.0 | -[pycparser](https://pypi.org/project/pycparser) | 2.22 | -[pyct](https://pypi.org/project/pyct) | 0.5.0 | -[pydantic](https://pypi.org/project/pydantic) | 2.10.6 | -[pydantic-ai](https://pypi.org/project/pydantic-ai) | 0.0.24 | -[pydantic-ai-slim](https://pypi.org/project/pydantic-ai-slim) | 0.0.24 | -[pydantic-core](https://pypi.org/project/pydantic-core) | 2.27.2 | -[pydantic-graph](https://pypi.org/project/pydantic-graph) | 0.0.24 | -[pydeck](https://pypi.org/project/pydeck) | 0.9.1 | -[pydocstyle](https://pypi.org/project/pydocstyle) | 6.3.0 | -[pydub](https://pypi.org/project/pydub) | 0.25.1 | -[pyerfa](https://pypi.org/project/pyerfa) | 2.0.1.4 | -[pyflakes](https://pypi.org/project/pyflakes) | 3.2.0 | -[pygithub](https://pypi.org/project/pygithub) | 2.6.1 | -[pygments](https://pypi.org/project/pygments) | 2.19.1 | -[pyjwt](https://pypi.org/project/pyjwt) | 2.10.1 | -[pylint](https://pypi.org/project/pylint) | 3.1.0 | -[pylint-venv](https://pypi.org/project/pylint-venv) | 3.0.3 | -[pyls-spyder](https://pypi.org/project/pyls-spyder) | 0.4.0 | -[pymongo](https://pypi.org/project/pymongo) | 4.10.1 | -[pympler](https://pypi.org/project/pympler) | 1.1 | -[pynacl](https://pypi.org/project/pynacl) | 1.5.0 | -[pynndescent](https://pypi.org/project/pynndescent) | 0.5.12 | -[pyodbc](https://pypi.org/project/pyodbc) | 5.2.0 | -[pyogrio](https://pypi.org/project/pyogrio) | 0.10.0 | -[pyomo](https://pypi.org/project/pyomo) | 6.9.1 | -[pypandoc](https://pypi.org/project/pypandoc) | 1.15 | -[pyparsing](https://pypi.org/project/pyparsing) | 3.2.1 | -[pypdf](https://pypi.org/project/pypdf) | 5.1.0 | -[pyproj](https://pypi.org/project/pyproj) | 3.7.0 | -[pyproject-hooks](https://pypi.org/project/pyproject-hooks) | 1.1.0 | -[pyqt5](https://pypi.org/project/pyqt5) | 5.15.10 | -[pyqt5-qt5](https://pypi.org/project/pyqt5-qt5) | 5.15.2 | -[pyqt5-sip](https://pypi.org/project/pyqt5-sip) | 12.16.1 | -[pyqtgraph](https://pypi.org/project/pyqtgraph) | 0.13.7 | -[pyqtwebengine](https://pypi.org/project/pyqtwebengine) | 5.15.6 | -[pyqtwebengine-qt5](https://pypi.org/project/pyqtwebengine-qt5) | 5.15.2 | -[pyserial](https://pypi.org/project/pyserial) | 3.5 | -[pysocks](https://pypi.org/project/pysocks) | 1.7.1 | -[pyspnego](https://pypi.org/project/pyspnego) | 0.11.2 | -[pytest](https://pypi.org/project/pytest) | 8.3.4 | -[python-barcode](https://pypi.org/project/python-barcode) | 0.15.1 | -[python-dateutil](https://pypi.org/project/python-dateutil) | 2.8.2 | -[python-dotenv](https://pypi.org/project/python-dotenv) | 1.0.1 | -[python-json-logger](https://pypi.org/project/python-json-logger) | 2.0.7 | -[python-lsp-black](https://pypi.org/project/python-lsp-black) | 2.0.0 | -[python-lsp-jsonrpc](https://pypi.org/project/python-lsp-jsonrpc) | 1.1.2 | -[python-lsp-server](https://pypi.org/project/python-lsp-server) | 1.12.0 | -[python-multipart](https://pypi.org/project/python-multipart) | 0.0.9 | -[python-slugify](https://pypi.org/project/python-slugify) | 8.0.4 | -[pythonqwt](https://pypi.org/project/pythonqwt) | 0.14.4 | -[pytoolconfig](https://pypi.org/project/pytoolconfig) | 1.3.1 | -[pytz](https://pypi.org/project/pytz) | 2024.2 | -[pyuca](https://pypi.org/project/pyuca) | 1.2 | -[pyusb](https://pypi.org/project/pyusb) | 1.3.1 | -[pyviz-comms](https://pypi.org/project/pyviz-comms) | 3.0.3 | -[pywavelets](https://pypi.org/project/pywavelets) | 1.8.0 | -[pywin32](https://pypi.org/project/pywin32) | 308 | -[pywin32-ctypes](https://pypi.org/project/pywin32-ctypes) | 0.2.2 | -[pywinpty](https://pypi.org/project/pywinpty) | 2.0.14 | -[pyyaml](https://pypi.org/project/pyyaml) | 6.0.2 | -[pyzmq](https://pypi.org/project/pyzmq) | 26.2.1 | -[qdarkstyle](https://pypi.org/project/qdarkstyle) | 3.2.3 | -[qdldl](https://pypi.org/project/qdldl) | 0.1.7.post5 | -[qrcode](https://pypi.org/project/qrcode) | 8.0 | -[qstylizer](https://pypi.org/project/qstylizer) | 0.2.2 | -[qtawesome](https://pypi.org/project/qtawesome) | 1.4.0 | -[qtconsole](https://pypi.org/project/qtconsole) | 5.6.1 | -[qtpy](https://pypi.org/project/qtpy) | 2.4.1 | -[quantecon](https://pypi.org/project/quantecon) | 0.7.2 | -[quart](https://pypi.org/project/quart) | 0.20.0 | -[rapidfuzz](https://pypi.org/project/rapidfuzz) | 3.9.6 | -[readme-renderer](https://pypi.org/project/readme-renderer) | 44.0 | -[redis](https://pypi.org/project/redis) | 5.0.8 | -[referencing](https://pypi.org/project/referencing) | 0.35.1 | -[regex](https://pypi.org/project/regex) | 2024.11.6 | -[reportlab](https://pypi.org/project/reportlab) | 4.2.5 | -[requests](https://pypi.org/project/requests) | 2.32.3 | -[requests-ntlm](https://pypi.org/project/requests-ntlm) | 1.3.0 | -[requests-toolbelt](https://pypi.org/project/requests-toolbelt) | 1.0.0 | -[rfc3339-validator](https://pypi.org/project/rfc3339-validator) | 0.1.4 | -[rfc3986](https://pypi.org/project/rfc3986) | 2.0.0 | -[rfc3986-validator](https://pypi.org/project/rfc3986-validator) | 0.1.1 | -[rich](https://pypi.org/project/rich) | 13.9.4 | -[rope](https://pypi.org/project/rope) | 1.12.0 | -[rpds-py](https://pypi.org/project/rpds-py) | 0.22.3 | -[rsa](https://pypi.org/project/rsa) | 4.7.2 | -[rtree](https://pypi.org/project/rtree) | 1.3.0 | -[rx](https://pypi.org/project/rx) | 3.2.0 | -[scikit-image](https://pypi.org/project/scikit-image) | 0.25.2 | -[scikit-learn](https://pypi.org/project/scikit-learn) | 1.6.1 | -[scipy](https://pypi.org/project/scipy) | 1.15.2 | -[scramp](https://pypi.org/project/scramp) | 1.4.5 | -[scs](https://pypi.org/project/scs) | 3.2.7.post2 | -[seaborn](https://pypi.org/project/seaborn) | 0.13.2 | -[send2trash](https://pypi.org/project/send2trash) | 1.8.3 | -[setuptools](https://pypi.org/project/setuptools) | 75.8.2 | -[shapely](https://pypi.org/project/shapely) | 2.0.6 | -[shellingham](https://pypi.org/project/shellingham) | 1.5.4 | -[simplejson](https://pypi.org/project/simplejson) | 3.19.3 | -[simpy](https://pypi.org/project/simpy) | 4.1.1 | -[six](https://pypi.org/project/six) | 1.16.0 | -[sklearn-compat](https://pypi.org/project/sklearn-compat) | 0.1.3 | -[skrub](https://pypi.org/project/skrub) | 0.5.1 | -[smmap](https://pypi.org/project/smmap) | 5.0.0 | -[sniffio](https://pypi.org/project/sniffio) | 1.3.0 | -[snowballstemmer](https://pypi.org/project/snowballstemmer) | 2.2.0 | -[sortedcontainers](https://pypi.org/project/sortedcontainers) | 2.4.0 | -[sounddevice](https://pypi.org/project/sounddevice) | 0.5.1 | -[soupsieve](https://pypi.org/project/soupsieve) | 2.6 | -[sphinx](https://pypi.org/project/sphinx) | 7.3.7 | -[sphinx-rtd-theme](https://pypi.org/project/sphinx-rtd-theme) | 3.0.2 | -[sphinxcontrib-applehelp](https://pypi.org/project/sphinxcontrib-applehelp) | 2.0.0 | -[sphinxcontrib-devhelp](https://pypi.org/project/sphinxcontrib-devhelp) | 2.0.0 | -[sphinxcontrib-htmlhelp](https://pypi.org/project/sphinxcontrib-htmlhelp) | 2.1.0 | -[sphinxcontrib-jquery](https://pypi.org/project/sphinxcontrib-jquery) | 4.1 | -[sphinxcontrib-jsmath](https://pypi.org/project/sphinxcontrib-jsmath) | 1.0.1 | -[sphinxcontrib-qthelp](https://pypi.org/project/sphinxcontrib-qthelp) | 2.0.0 | -[sphinxcontrib-serializinghtml](https://pypi.org/project/sphinxcontrib-serializinghtml) | 2.0.0 | -[spyder](https://pypi.org/project/spyder) | 6.0.5 | -[spyder-kernels](https://pypi.org/project/spyder-kernels) | 3.0.3 | -[sqlalchemy](https://pypi.org/project/sqlalchemy) | 2.0.38 | -[sqlite-bro](https://pypi.org/project/sqlite-bro) | 0.13.1 | -[sqlite-fts4](https://pypi.org/project/sqlite-fts4) | 1.0.3 | -[sqlite-utils](https://pypi.org/project/sqlite-utils) | 3.38 | -[sqlparse](https://pypi.org/project/sqlparse) | 0.5.3 | -[squarify](https://pypi.org/project/squarify) | 0.4.4 | -[sspilib](https://pypi.org/project/sspilib) | 0.2.0 | -[stack-data](https://pypi.org/project/stack-data) | 0.6.3 | -[starlette](https://pypi.org/project/starlette) | 0.45.3 | -[statsmodels](https://pypi.org/project/statsmodels) | 0.14.4 | -[streamlit](https://pypi.org/project/streamlit) | 1.44.0 | -[superqt](https://pypi.org/project/superqt) | 0.7.1 | -[sv-ttk](https://pypi.org/project/sv-ttk) | 2.6.0 | -[sympy](https://pypi.org/project/sympy) | 1.13.3 | -[tabulate](https://pypi.org/project/tabulate) | 0.9.0 | -[tblib](https://pypi.org/project/tblib) | 3.0.0 | -[tenacity](https://pypi.org/project/tenacity) | 9.0.0 | -[termcolor](https://pypi.org/project/termcolor) | 2.5.0 | -[terminado](https://pypi.org/project/terminado) | 0.18.1 | -[text-unidecode](https://pypi.org/project/text-unidecode) | 1.3 | -[textdistance](https://pypi.org/project/textdistance) | 4.6.3 | -[thefuzz](https://pypi.org/project/thefuzz) | 0.22.1 | -[threadpoolctl](https://pypi.org/project/threadpoolctl) | 3.5.0 | -[three-merge](https://pypi.org/project/three-merge) | 0.1.1 | -[tifffile](https://pypi.org/project/tifffile) | 2025.1.10 | -[tiktoken](https://pypi.org/project/tiktoken) | 0.8.0 | -[tinycss2](https://pypi.org/project/tinycss2) | 1.4.0 | +[psutil](https://pypi.org/project/psutil) | 5.9.8 | Cross-platform lib for process and system monitoring in Python. +[psygnal](https://pypi.org/project/psygnal) | 0.11.1 | Fast python callback/event system modeled after Qt Signals +[ptpython](https://pypi.org/project/ptpython) | 3.0.29 | Python REPL build on top of prompt_toolkit +[ptyprocess](https://pypi.org/project/ptyprocess) | 0.7.0 | Run a subprocess in a pseudo terminal +[pure-eval](https://pypi.org/project/pure-eval) | 0.2.2 | Safely evaluate AST nodes without side effects +[pyarrow](https://pypi.org/project/pyarrow) | 19.0.1 | Python library for Apache Arrow +[pyasn1](https://pypi.org/project/pyasn1) | 0.6.1 | Pure-Python implementation of ASN.1 types and DER/BER/CER codecs (X.208) +[pyasn1-modules](https://pypi.org/project/pyasn1-modules) | 0.4.1 | A collection of ASN.1-based protocols modules +[pybind11](https://pypi.org/project/pybind11) | 2.13.6 | Seamless operability between C++11 and Python +[pycodestyle](https://pypi.org/project/pycodestyle) | 2.12.0 | Python style guide checker +[pycparser](https://pypi.org/project/pycparser) | 2.22 | C parser in Python +[pyct](https://pypi.org/project/pyct) | 0.5.0 | Python package common tasks for users (e.g. copy examples, fetch data, ...) +[pydantic](https://pypi.org/project/pydantic) | 2.10.6 | Data validation using Python type hints +[pydantic-ai](https://pypi.org/project/pydantic-ai) | 0.0.24 | Agent Framework / shim to use Pydantic with LLMs +[pydantic-ai-slim](https://pypi.org/project/pydantic-ai-slim) | 0.0.24 | Agent Framework / shim to use Pydantic with LLMs, slim package +[pydantic-core](https://pypi.org/project/pydantic-core) | 2.27.2 | Core functionality for Pydantic validation and serialization +[pydantic-graph](https://pypi.org/project/pydantic-graph) | 0.0.24 | Graph and state machine library +[pydeck](https://pypi.org/project/pydeck) | 0.9.1 | Widget for deck.gl maps +[pydocstyle](https://pypi.org/project/pydocstyle) | 6.3.0 | Python docstring style checker +[pydub](https://pypi.org/project/pydub) | 0.25.1 | Manipulate audio with an simple and easy high level interface +[pyerfa](https://pypi.org/project/pyerfa) | 2.0.1.4 | Python bindings for ERFA +[pyflakes](https://pypi.org/project/pyflakes) | 3.2.0 | passive checker of Python programs +[pygithub](https://pypi.org/project/pygithub) | 2.6.1 | Use the full Github API v3 +[pygments](https://pypi.org/project/pygments) | 2.19.1 | Pygments is a syntax highlighting package written in Python. +[pyjwt](https://pypi.org/project/pyjwt) | 2.10.1 | JSON Web Token implementation in Python +[pylint](https://pypi.org/project/pylint) | 3.1.0 | python code static checker +[pylint-venv](https://pypi.org/project/pylint-venv) | 3.0.3 | pylint-venv provides a Pylint init-hook to use the same Pylint installation with different virtual environments. +[pyls-spyder](https://pypi.org/project/pyls-spyder) | 0.4.0 | Spyder extensions for the python-lsp-server +[pymongo](https://pypi.org/project/pymongo) | 4.10.1 | Python driver for MongoDB +[pympler](https://pypi.org/project/pympler) | 1.1 | A development tool to measure, monitor and analyze the memory behavior of Python objects. +[pynacl](https://pypi.org/project/pynacl) | 1.5.0 | Python binding to the Networking and Cryptography (NaCl) library +[pynndescent](https://pypi.org/project/pynndescent) | 0.5.12 | Nearest Neighbor Descent +[pyodbc](https://pypi.org/project/pyodbc) | 5.2.0 | DB API module for ODBC +[pyogrio](https://pypi.org/project/pyogrio) | 0.10.0 | Vectorized spatial vector file format I/O using GDAL/OGR +[pyomo](https://pypi.org/project/pyomo) | 6.9.1 | Pyomo: Python Optimization Modeling Objects +[pypandoc](https://pypi.org/project/pypandoc) | 1.15 | Thin wrapper for pandoc. +[pyparsing](https://pypi.org/project/pyparsing) | 3.2.1 | pyparsing module - Classes and methods to define and execute parsing grammars +[pypdf](https://pypi.org/project/pypdf) | 5.1.0 | A pure-python PDF library capable of splitting, merging, cropping, and transforming PDF files +[pyproj](https://pypi.org/project/pyproj) | 3.7.0 | Python interface to PROJ (cartographic projections and coordinate transformations library) +[pyproject-hooks](https://pypi.org/project/pyproject-hooks) | 1.1.0 | Wrappers to call pyproject.toml-based build backend hooks. +[pyqt5](https://pypi.org/project/pyqt5) | 5.15.10 | Python bindings for the Qt cross platform application toolkit +[pyqt5-qt5](https://pypi.org/project/pyqt5-qt5) | 5.15.2 | The subset of a Qt installation needed by PyQt5. +[pyqt5-sip](https://pypi.org/project/pyqt5-sip) | 12.16.1 | The sip module support for PyQt5 +[pyqtgraph](https://pypi.org/project/pyqtgraph) | 0.13.7 | Scientific Graphics and GUI Library for Python +[pyqtwebengine](https://pypi.org/project/pyqtwebengine) | 5.15.6 | Python bindings for the Qt WebEngine framework +[pyqtwebengine-qt5](https://pypi.org/project/pyqtwebengine-qt5) | 5.15.2 | The subset of a Qt installation needed by PyQtWebEngine. +[pyserial](https://pypi.org/project/pyserial) | 3.5 | Python Serial Port Extension +[pysocks](https://pypi.org/project/pysocks) | 1.7.1 | A Python SOCKS client module. See https://github.com/Anorov/PySocks for more information. +[pyspnego](https://pypi.org/project/pyspnego) | 0.11.2 | Windows Negotiate Authentication Client and Server +[pytest](https://pypi.org/project/pytest) | 8.3.4 | pytest: simple powerful testing with Python +[python-barcode](https://pypi.org/project/python-barcode) | 0.15.1 | Create standard barcodes with Python. No external modules needed. (optional Pillow support included). +[python-dateutil](https://pypi.org/project/python-dateutil) | 2.8.2 | Extensions to the standard Python datetime module +[python-dotenv](https://pypi.org/project/python-dotenv) | 1.0.1 | Read key-value pairs from a .env file and set them as environment variables +[python-json-logger](https://pypi.org/project/python-json-logger) | 2.0.7 | A python library adding a json log formatter +[python-lsp-black](https://pypi.org/project/python-lsp-black) | 2.0.0 | Black plugin for the Python LSP Server +[python-lsp-jsonrpc](https://pypi.org/project/python-lsp-jsonrpc) | 1.1.2 | JSON RPC 2.0 server library +[python-lsp-server](https://pypi.org/project/python-lsp-server) | 1.12.0 | Python Language Server for the Language Server Protocol +[python-multipart](https://pypi.org/project/python-multipart) | 0.0.9 | A streaming multipart parser for Python +[python-slugify](https://pypi.org/project/python-slugify) | 8.0.4 | A Python slugify application that also handles Unicode +[pythonqwt](https://pypi.org/project/pythonqwt) | 0.14.4 | Qt plotting widgets for Python +[pytoolconfig](https://pypi.org/project/pytoolconfig) | 1.3.1 | Python tool configuration +[pytz](https://pypi.org/project/pytz) | 2024.2 | World timezone definitions, modern and historical +[pyuca](https://pypi.org/project/pyuca) | 1.2 | a Python implementation of the Unicode Collation Algorithm +[pyusb](https://pypi.org/project/pyusb) | 1.3.1 | Easy USB access for Python +[pyviz-comms](https://pypi.org/project/pyviz-comms) | 3.0.3 | A JupyterLab extension for rendering HoloViz content. +[pywavelets](https://pypi.org/project/pywavelets) | 1.8.0 | PyWavelets, wavelet transform module +[pywin32](https://pypi.org/project/pywin32) | 308 | Python for Window Extensions +[pywin32-ctypes](https://pypi.org/project/pywin32-ctypes) | 0.2.2 | A (partial) reimplementation of pywin32 using ctypes/cffi +[pywinpty](https://pypi.org/project/pywinpty) | 2.0.14 | Pseudo terminal support for Windows from Python. +[pyyaml](https://pypi.org/project/pyyaml) | 6.0.2 | YAML parser and emitter for Python +[pyzmq](https://pypi.org/project/pyzmq) | 26.2.1 | Python bindings for 0MQ +[qdarkstyle](https://pypi.org/project/qdarkstyle) | 3.2.3 | The most complete dark/light style sheet for C++/Python and Qt applications +[qdldl](https://pypi.org/project/qdldl) | 0.1.7.post5 | QDLDL, a free LDL factorization routine. +[qrcode](https://pypi.org/project/qrcode) | 8.0 | QR Code image generator +[qstylizer](https://pypi.org/project/qstylizer) | 0.2.2 | Stylesheet Generator for PyQt{4-5}/PySide{1-2} +[qtawesome](https://pypi.org/project/qtawesome) | 1.4.0 | FontAwesome icons in PyQt and PySide applications +[qtconsole](https://pypi.org/project/qtconsole) | 5.6.1 | Jupyter Qt console +[qtpy](https://pypi.org/project/qtpy) | 2.4.1 | Provides an abstraction layer on top of the various Qt bindings (PyQt5/6 and PySide2/6). +[quantecon](https://pypi.org/project/quantecon) | 0.7.2 | Import the main names to top level. +[quart](https://pypi.org/project/quart) | 0.20.0 | A Python ASGI web framework with the same API as Flask +[rapidfuzz](https://pypi.org/project/rapidfuzz) | 3.9.6 | rapid fuzzy string matching +[readme-renderer](https://pypi.org/project/readme-renderer) | 44.0 | readme_renderer is a library for rendering readme descriptions for Warehouse +[redis](https://pypi.org/project/redis) | 5.0.8 | Python client for Redis database and key-value store +[referencing](https://pypi.org/project/referencing) | 0.35.1 | JSON Referencing + Python +[regex](https://pypi.org/project/regex) | 2024.11.6 | Alternative regular expression module, to replace re. +[reportlab](https://pypi.org/project/reportlab) | 4.2.5 | The Reportlab Toolkit +[requests](https://pypi.org/project/requests) | 2.32.3 | Python HTTP for Humans. +[requests-ntlm](https://pypi.org/project/requests-ntlm) | 1.3.0 | This package allows for HTTP NTLM authentication using the requests library. +[requests-toolbelt](https://pypi.org/project/requests-toolbelt) | 1.0.0 | A utility belt for advanced users of python-requests +[rfc3339-validator](https://pypi.org/project/rfc3339-validator) | 0.1.4 | A pure python RFC3339 validator +[rfc3986](https://pypi.org/project/rfc3986) | 2.0.0 | Validating URI References per RFC 3986 +[rfc3986-validator](https://pypi.org/project/rfc3986-validator) | 0.1.1 | Pure python rfc3986 validator +[rich](https://pypi.org/project/rich) | 13.9.4 | Render rich text, tables, progress bars, syntax highlighting, markdown and more to the terminal +[rope](https://pypi.org/project/rope) | 1.12.0 | a python refactoring library... +[rpds-py](https://pypi.org/project/rpds-py) | 0.22.3 | Python bindings to Rust's persistent data structures (rpds) +[rsa](https://pypi.org/project/rsa) | 4.7.2 | Pure-Python RSA implementation +[rtree](https://pypi.org/project/rtree) | 1.3.0 | R-Tree spatial index for Python GIS +[rx](https://pypi.org/project/rx) | 3.2.0 | Reactive Extensions (Rx) for Python +[scikit-image](https://pypi.org/project/scikit-image) | 0.25.2 | Image processing in Python +[scikit-learn](https://pypi.org/project/scikit-learn) | 1.6.1 | A set of python modules for machine learning and data mining +[scipy](https://pypi.org/project/scipy) | 1.15.2 | Fundamental algorithms for scientific computing in Python +[scramp](https://pypi.org/project/scramp) | 1.4.5 | An implementation of the SCRAM protocol. +[scs](https://pypi.org/project/scs) | 3.2.7.post2 | Splitting conic solver +[seaborn](https://pypi.org/project/seaborn) | 0.13.2 | Statistical data visualization +[send2trash](https://pypi.org/project/send2trash) | 1.8.3 | Send file to trash natively under Mac OS X, Windows and Linux +[setuptools](https://pypi.org/project/setuptools) | 75.8.2 | Easily download, build, install, upgrade, and uninstall Python packages +[shapely](https://pypi.org/project/shapely) | 2.0.6 | Manipulation and analysis of geometric objects +[shellingham](https://pypi.org/project/shellingham) | 1.5.4 | Tool to Detect Surrounding Shell +[simplejson](https://pypi.org/project/simplejson) | 3.19.3 | Simple, fast, extensible JSON encoder/decoder for Python +[simpy](https://pypi.org/project/simpy) | 4.1.1 | Event discrete, process based simulation for Python. +[six](https://pypi.org/project/six) | 1.16.0 | Python 2 and 3 compatibility utilities +[sklearn-compat](https://pypi.org/project/sklearn-compat) | 0.1.3 | Ease support for compatible scikit-learn estimators across versions +[skrub](https://pypi.org/project/skrub) | 0.5.1 | Prepping tables for machine learning +[smmap](https://pypi.org/project/smmap) | 5.0.0 | A pure Python implementation of a sliding window memory map manager +[sniffio](https://pypi.org/project/sniffio) | 1.3.0 | Sniff out which async library your code is running under +[snowballstemmer](https://pypi.org/project/snowballstemmer) | 2.2.0 | This package provides 29 stemmers for 28 languages generated from Snowball algorithms. +[sortedcontainers](https://pypi.org/project/sortedcontainers) | 2.4.0 | Sorted Containers -- Sorted List, Sorted Dict, Sorted Set +[sounddevice](https://pypi.org/project/sounddevice) | 0.5.1 | Play and Record Sound with Python +[soupsieve](https://pypi.org/project/soupsieve) | 2.6 | A modern CSS selector implementation for Beautiful Soup. +[sphinx](https://pypi.org/project/sphinx) | 7.3.7 | Python documentation generator +[sphinx-rtd-theme](https://pypi.org/project/sphinx-rtd-theme) | 3.0.2 | Read the Docs theme for Sphinx +[sphinxcontrib-applehelp](https://pypi.org/project/sphinxcontrib-applehelp) | 2.0.0 | sphinxcontrib-applehelp is a Sphinx extension which outputs Apple help books +[sphinxcontrib-devhelp](https://pypi.org/project/sphinxcontrib-devhelp) | 2.0.0 | sphinxcontrib-devhelp is a sphinx extension which outputs Devhelp documents +[sphinxcontrib-htmlhelp](https://pypi.org/project/sphinxcontrib-htmlhelp) | 2.1.0 | sphinxcontrib-htmlhelp is a sphinx extension which renders HTML help files +[sphinxcontrib-jquery](https://pypi.org/project/sphinxcontrib-jquery) | 4.1 | Extension to include jQuery on newer Sphinx releases +[sphinxcontrib-jsmath](https://pypi.org/project/sphinxcontrib-jsmath) | 1.0.1 | A sphinx extension which renders display math in HTML via JavaScript +[sphinxcontrib-qthelp](https://pypi.org/project/sphinxcontrib-qthelp) | 2.0.0 | sphinxcontrib-qthelp is a sphinx extension which outputs QtHelp documents +[sphinxcontrib-serializinghtml](https://pypi.org/project/sphinxcontrib-serializinghtml) | 2.0.0 | sphinxcontrib-serializinghtml is a sphinx extension which outputs "serialized" HTML files (json and pickle) +[spyder](https://pypi.org/project/spyder) | 6.0.5 | The Scientific Python Development Environment +[spyder-kernels](https://pypi.org/project/spyder-kernels) | 3.0.3 | Jupyter kernels for Spyder's console +[sqlalchemy](https://pypi.org/project/sqlalchemy) | 2.0.38 | Database Abstraction Library +[sqlite-bro](https://pypi.org/project/sqlite-bro) | 0.13.1 | a graphic SQLite Client in 1 Python file +[sqlite-fts4](https://pypi.org/project/sqlite-fts4) | 1.0.3 | Python functions for working with SQLite FTS4 search +[sqlite-utils](https://pypi.org/project/sqlite-utils) | 3.38 | CLI tool and Python library for manipulating SQLite databases +[sqlparse](https://pypi.org/project/sqlparse) | 0.5.3 | A non-validating SQL parser. +[squarify](https://pypi.org/project/squarify) | 0.4.4 | Pure Python implementation of the squarify treemap layout algorithm +[sspilib](https://pypi.org/project/sspilib) | 0.2.0 | SSPI API bindings for Python +[stack-data](https://pypi.org/project/stack-data) | 0.6.3 | Extract data from python stack frames and tracebacks for informative displays +[starlette](https://pypi.org/project/starlette) | 0.45.3 | The little ASGI library that shines. +[statsmodels](https://pypi.org/project/statsmodels) | 0.14.4 | Statistical computations and models for Python +[streamlit](https://pypi.org/project/streamlit) | 1.44.0 | A faster way to build and share data apps +[superqt](https://pypi.org/project/superqt) | 0.7.1 | Missing widgets and components for PyQt/PySide +[sv-ttk](https://pypi.org/project/sv-ttk) | 2.6.0 | A gorgeous theme for Tkinter, based on Windows 11's UI +[sympy](https://pypi.org/project/sympy) | 1.13.3 | Computer algebra system (CAS) in Python +[tabulate](https://pypi.org/project/tabulate) | 0.9.0 | Pretty-print tabular data +[tblib](https://pypi.org/project/tblib) | 3.0.0 | Traceback serialization library. +[tenacity](https://pypi.org/project/tenacity) | 9.0.0 | Retry code until it succeeds +[termcolor](https://pypi.org/project/termcolor) | 2.5.0 | ANSI color formatting for output in terminal +[terminado](https://pypi.org/project/terminado) | 0.18.1 | Tornado websocket backend for the Xterm.js Javascript terminal emulator library. +[text-unidecode](https://pypi.org/project/text-unidecode) | 1.3 | The most basic Text::Unidecode port +[textdistance](https://pypi.org/project/textdistance) | 4.6.3 | Compute distance between the two texts. +[thefuzz](https://pypi.org/project/thefuzz) | 0.22.1 | Fuzzy string matching in python +[threadpoolctl](https://pypi.org/project/threadpoolctl) | 3.5.0 | threadpoolctl +[three-merge](https://pypi.org/project/three-merge) | 0.1.1 | Simple library for merging two strings with respect to a base one +[tifffile](https://pypi.org/project/tifffile) | 2025.1.10 | Read and write TIFF files +[tiktoken](https://pypi.org/project/tiktoken) | 0.8.0 | tiktoken is a fast BPE tokeniser for use with OpenAI's models +[tinycss2](https://pypi.org/project/tinycss2) | 1.4.0 | A tiny CSS parser [tokenizers](https://pypi.org/project/tokenizers) | 0.21.0 | -[toml](https://pypi.org/project/toml) | 0.10.2 | -[tomli](https://pypi.org/project/tomli) | 2.2.1 | -[tomli-w](https://pypi.org/project/tomli-w) | 1.2.0 | -[tomlkit](https://pypi.org/project/tomlkit) | 0.13.2 | -[toolz](https://pypi.org/project/toolz) | 1.0.0 | -[tornado](https://pypi.org/project/tornado) | 6.4.2 | -[tqdm](https://pypi.org/project/tqdm) | 4.66.4 | -[traitlets](https://pypi.org/project/traitlets) | 5.14.1 | -[traittypes](https://pypi.org/project/traittypes) | 0.2.1 | -[trio](https://pypi.org/project/trio) | 0.29.0 | -[trove-classifiers](https://pypi.org/project/trove-classifiers) | 2024.10.21.16 | -[twine](https://pypi.org/project/twine) | 6.1.0 | -[typer](https://pypi.org/project/typer) | 0.15.2 | -[types-python-dateutil](https://pypi.org/project/types-python-dateutil) | 2.9.0.20240316 | -[types-requests](https://pypi.org/project/types-requests) | 2.32.0.20241016 | -[typing-extensions](https://pypi.org/project/typing-extensions) | 4.12.2 | -[typing-inspect](https://pypi.org/project/typing-inspect) | 0.9.0 | -[tzdata](https://pypi.org/project/tzdata) | 2024.1 | -[tzlocal](https://pypi.org/project/tzlocal) | 5.2 | -[uc-micro-py](https://pypi.org/project/uc-micro-py) | 1.0.1 | -[ujson](https://pypi.org/project/ujson) | 5.10.0 | -[umap-learn](https://pypi.org/project/umap-learn) | 0.5.6 | -[uncertainties](https://pypi.org/project/uncertainties) | 3.2.2 | -[uri-template](https://pypi.org/project/uri-template) | 1.3.0 | -[urllib3](https://pypi.org/project/urllib3) | 2.2.3 | -[uvicorn](https://pypi.org/project/uvicorn) | 0.34.0 | -[vega-datasets](https://pypi.org/project/vega-datasets) | 0.9.0 | -[waitress](https://pypi.org/project/waitress) | 3.0.0 | -[watchdog](https://pypi.org/project/watchdog) | 6.0.0 | -[wcwidth](https://pypi.org/project/wcwidth) | 0.2.13 | -[webcolors](https://pypi.org/project/webcolors) | 24.11.1 | -[webencodings](https://pypi.org/project/webencodings) | 0.5.1 | -[websocket-client](https://pypi.org/project/websocket-client) | 1.8.0 | -[werkzeug](https://pypi.org/project/werkzeug) | 3.1.3 | -[whatthepatch](https://pypi.org/project/whatthepatch) | 1.0.7 | -[wheel](https://pypi.org/project/wheel) | 0.45.1 | -[widgetsnbextension](https://pypi.org/project/widgetsnbextension) | 4.0.14 | -[winpython](https://pypi.org/project/winpython) | 15.3.20250425 | -[wordcloud](https://pypi.org/project/wordcloud) | 1.9.4 | -[wrapt](https://pypi.org/project/wrapt) | 1.16.0 | -[wsproto](https://pypi.org/project/wsproto) | 1.2.0 | -[xarray](https://pypi.org/project/xarray) | 2025.3.0 | -[xlsxwriter](https://pypi.org/project/xlsxwriter) | 3.1.9 | -[xyzservices](https://pypi.org/project/xyzservices) | 2023.10.1 | -[yapf](https://pypi.org/project/yapf) | 0.40.1 | -[yarl](https://pypi.org/project/yarl) | 1.18.3 | -[yt-dlp](https://pypi.org/project/yt-dlp) | 2025.2.19 | -[zict](https://pypi.org/project/zict) | 3.0.0 | -[zipp](https://pypi.org/project/zipp) | 3.21.0 | -[zstandard](https://pypi.org/project/zstandard) | 0.23.0 | +[toml](https://pypi.org/project/toml) | 0.10.2 | Python Library for Tom's Obvious, Minimal Language +[tomli](https://pypi.org/project/tomli) | 2.2.1 | A lil' TOML parser +[tomli-w](https://pypi.org/project/tomli-w) | 1.2.0 | A lil' TOML writer +[tomlkit](https://pypi.org/project/tomlkit) | 0.13.2 | Style preserving TOML library +[toolz](https://pypi.org/project/toolz) | 1.0.0 | List processing tools and functional utilities +[tornado](https://pypi.org/project/tornado) | 6.4.2 | Tornado is a Python web framework and asynchronous networking library, originally developed at FriendFeed. +[tqdm](https://pypi.org/project/tqdm) | 4.66.4 | Fast, Extensible Progress Meter +[traitlets](https://pypi.org/project/traitlets) | 5.14.1 | Traitlets Python configuration system +[traittypes](https://pypi.org/project/traittypes) | 0.2.1 | Scipy trait types +[trio](https://pypi.org/project/trio) | 0.29.0 | A friendly Python library for async concurrency and I/O +[trove-classifiers](https://pypi.org/project/trove-classifiers) | 2024.10.21.16 | Canonical source for classifiers on PyPI (pypi.org). +[twine](https://pypi.org/project/twine) | 6.1.0 | Collection of utilities for publishing packages on PyPI +[typer](https://pypi.org/project/typer) | 0.15.2 | Typer, build great CLIs. Easy to code. Based on Python type hints. +[types-python-dateutil](https://pypi.org/project/types-python-dateutil) | 2.9.0.20240316 | Typing stubs for python-dateutil +[types-requests](https://pypi.org/project/types-requests) | 2.32.0.20241016 | Typing stubs for requests +[typing-extensions](https://pypi.org/project/typing-extensions) | 4.12.2 | Backported and Experimental Type Hints for Python 3.8+ +[typing-inspect](https://pypi.org/project/typing-inspect) | 0.9.0 | Runtime inspection utilities for typing module. +[tzdata](https://pypi.org/project/tzdata) | 2024.1 | Provider of IANA time zone data +[tzlocal](https://pypi.org/project/tzlocal) | 5.2 | tzinfo object for the local timezone +[uc-micro-py](https://pypi.org/project/uc-micro-py) | 1.0.1 | Micro subset of unicode data files for linkify-it-py projects. +[ujson](https://pypi.org/project/ujson) | 5.10.0 | Ultra fast JSON encoder and decoder for Python +[umap-learn](https://pypi.org/project/umap-learn) | 0.5.6 | Uniform Manifold Approximation and Projection +[uncertainties](https://pypi.org/project/uncertainties) | 3.2.2 | calculations with values with uncertainties, error propagation +[uri-template](https://pypi.org/project/uri-template) | 1.3.0 | RFC 6570 URI Template Processor +[urllib3](https://pypi.org/project/urllib3) | 2.2.3 | HTTP library with thread-safe connection pooling, file post, and more. +[uvicorn](https://pypi.org/project/uvicorn) | 0.34.0 | The lightning-fast ASGI server. +[vega-datasets](https://pypi.org/project/vega-datasets) | 0.9.0 | A Python package for offline access to Vega datasets +[waitress](https://pypi.org/project/waitress) | 3.0.0 | Waitress WSGI server +[watchdog](https://pypi.org/project/watchdog) | 6.0.0 | Filesystem events monitoring +[wcwidth](https://pypi.org/project/wcwidth) | 0.2.13 | Measures the displayed width of unicode strings in a terminal +[webcolors](https://pypi.org/project/webcolors) | 24.11.1 | A library for working with the color formats defined by HTML and CSS. +[webencodings](https://pypi.org/project/webencodings) | 0.5.1 | Character encoding aliases for legacy web content +[websocket-client](https://pypi.org/project/websocket-client) | 1.8.0 | WebSocket client for Python with low level API options +[werkzeug](https://pypi.org/project/werkzeug) | 3.1.3 | The comprehensive WSGI web application library. +[whatthepatch](https://pypi.org/project/whatthepatch) | 1.0.7 | A patch parsing and application library. +[wheel](https://pypi.org/project/wheel) | 0.45.1 | A built-package format for Python +[widgetsnbextension](https://pypi.org/project/widgetsnbextension) | 4.0.14 | Jupyter interactive widgets for Jupyter Notebook +[winpython](https://pypi.org/project/winpython) | 15.3.20250425 | WinPython distribution tools, including WPPM +[wordcloud](https://pypi.org/project/wordcloud) | 1.9.4 | A little word cloud generator +[wrapt](https://pypi.org/project/wrapt) | 1.16.0 | Module for decorators, wrappers and monkey patching. +[wsproto](https://pypi.org/project/wsproto) | 1.2.0 | WebSockets state-machine based protocol implementation +[xarray](https://pypi.org/project/xarray) | 2025.3.0 | N-D labeled arrays and datasets in Python +[xlsxwriter](https://pypi.org/project/xlsxwriter) | 3.1.9 | A Python module for creating Excel XLSX files. +[xyzservices](https://pypi.org/project/xyzservices) | 2023.10.1 | Source of XYZ tiles providers +[yapf](https://pypi.org/project/yapf) | 0.40.1 | A formatter for Python code. +[yarl](https://pypi.org/project/yarl) | 1.18.3 | Yet another URL library +[yt-dlp](https://pypi.org/project/yt-dlp) | 2025.2.19 | A feature-rich command-line audio/video downloader +[zict](https://pypi.org/project/zict) | 3.0.0 | Mutable mapping tools +[zipp](https://pypi.org/project/zipp) | 3.21.0 | Backport of pathlib-compatible object wrapper for zip files +[zstandard](https://pypi.org/project/zstandard) | 0.23.0 | Zstandard bindings for Python From b33aa7bd2ccb41fe80c7ce2558fc9cfc26a6de94 Mon Sep 17 00:00:00 2001 From: stonebig Date: Wed, 7 May 2025 22:26:52 +0200 Subject: [PATCH 185/305] put back labels in diff --- .../WinPythondot-64bit-3.12.10.0_History.md | 8 +- .../WinPythondot-64bit-3.13.3.0_History.md | 8 +- .../WinPythonslim-64bit-3.12.10.0_History.md | 222 ++++++++--------- .../WinPythonslim-64bit-3.13.3.0_History.md | 224 +++++++++--------- 4 files changed, 231 insertions(+), 231 deletions(-) diff --git a/changelogs/WinPythondot-64bit-3.12.10.0_History.md b/changelogs/WinPythondot-64bit-3.12.10.0_History.md index b613a876..aef40183 100644 --- a/changelogs/WinPythondot-64bit-3.12.10.0_History.md +++ b/changelogs/WinPythondot-64bit-3.12.10.0_History.md @@ -8,14 +8,14 @@ The following changes were made to WinPython-64bit distribution since version 3. New packages: - * [sv-ttk](https://pypi.org/project/sv-ttk) 2.6.0 () + * [sv-ttk](https://pypi.org/project/sv-ttk) 2.6.0 (A gorgeous theme for Tkinter, based on Windows 11's UI) Upgraded packages: - * [pip](https://pypi.org/project/pip) 24.3.1 → 25.0.1 () + * [pip](https://pypi.org/project/pip) 24.3.1 → 25.0.1 (The PyPA recommended tool for installing Python packages.) * [Python](http://www.python.org/) 3.12.9 → 3.12.10 (Python programming language with standard library) - * [setuptools](https://pypi.org/project/setuptools) 75.6.0 → 75.8.2 () - * [winpython](https://pypi.org/project/winpython) 13.1.20250215 → 15.3.20250425 () + * [setuptools](https://pypi.org/project/setuptools) 75.6.0 → 75.8.2 (Easily download, build, install, upgrade, and uninstall Python packages) + * [winpython](https://pypi.org/project/winpython) 13.1.20250215 → 15.3.20250425 (WinPython distribution tools, including WPPM) diff --git a/changelogs/WinPythondot-64bit-3.13.3.0_History.md b/changelogs/WinPythondot-64bit-3.13.3.0_History.md index 3adc0bce..105c04ff 100644 --- a/changelogs/WinPythondot-64bit-3.13.3.0_History.md +++ b/changelogs/WinPythondot-64bit-3.13.3.0_History.md @@ -8,14 +8,14 @@ The following changes were made to WinPython-64bit distribution since version 3. New packages: - * [sv-ttk](https://pypi.org/project/sv-ttk) 2.6.0 () + * [sv-ttk](https://pypi.org/project/sv-ttk) 2.6.0 (A gorgeous theme for Tkinter, based on Windows 11's UI) Upgraded packages: - * [pip](https://pypi.org/project/pip) 24.3.1 → 25.0.1 () + * [pip](https://pypi.org/project/pip) 24.3.1 → 25.0.1 (The PyPA recommended tool for installing Python packages.) * [Python](http://www.python.org/) 3.13.2 → 3.13.3 (Python programming language with standard library) - * [setuptools](https://pypi.org/project/setuptools) 75.6.0 → 75.8.2 () - * [winpython](https://pypi.org/project/winpython) 13.1.20250222 → 15.3.20250425 () + * [setuptools](https://pypi.org/project/setuptools) 75.6.0 → 75.8.2 (Easily download, build, install, upgrade, and uninstall Python packages) + * [winpython](https://pypi.org/project/winpython) 13.1.20250222 → 15.3.20250425 (WinPython distribution tools, including WPPM) diff --git a/changelogs/WinPythonslim-64bit-3.12.10.0_History.md b/changelogs/WinPythonslim-64bit-3.12.10.0_History.md index bc4168ea..07147b6d 100644 --- a/changelogs/WinPythonslim-64bit-3.12.10.0_History.md +++ b/changelogs/WinPythonslim-64bit-3.12.10.0_History.md @@ -14,121 +14,121 @@ New packages: New packages: - * [asyncssh](https://pypi.org/project/asyncssh) 2.20.0 () - * [deprecated](https://pypi.org/project/deprecated) 1.2.14 () - * [flexcache](https://pypi.org/project/flexcache) 0.3 () - * [flexparser](https://pypi.org/project/flexparser) 0.4 () - * [id](https://pypi.org/project/id) 1.5.0 () - * [pygithub](https://pypi.org/project/pygithub) 2.6.1 () - * [pyuca](https://pypi.org/project/pyuca) 1.2 () - * [shellingham](https://pypi.org/project/shellingham) 1.5.4 () - * [skrub](https://pypi.org/project/skrub) 0.5.1 () - * [superqt](https://pypi.org/project/superqt) 0.7.1 () - * [sv-ttk](https://pypi.org/project/sv-ttk) 2.6.0 () - * [typer](https://pypi.org/project/typer) 0.15.2 () - * [wrapt](https://pypi.org/project/wrapt) 1.16.0 () + * [asyncssh](https://pypi.org/project/asyncssh) 2.20.0 (AsyncSSH: Asynchronous SSHv2 client and server library) + * [deprecated](https://pypi.org/project/deprecated) 1.2.14 (Python @deprecated decorator to deprecate old python classes, functions or methods.) + * [flexcache](https://pypi.org/project/flexcache) 0.3 (Saves and loads to the cache a transformed versions of a source object.) + * [flexparser](https://pypi.org/project/flexparser) 0.4 (Parsing made fun ... using typing.) + * [id](https://pypi.org/project/id) 1.5.0 (A tool for generating OIDC identities) + * [pygithub](https://pypi.org/project/pygithub) 2.6.1 (Use the full Github API v3) + * [pyuca](https://pypi.org/project/pyuca) 1.2 (a Python implementation of the Unicode Collation Algorithm) + * [shellingham](https://pypi.org/project/shellingham) 1.5.4 (Tool to Detect Surrounding Shell) + * [skrub](https://pypi.org/project/skrub) 0.5.1 (Prepping tables for machine learning) + * [superqt](https://pypi.org/project/superqt) 0.7.1 (Missing widgets and components for PyQt/PySide) + * [sv-ttk](https://pypi.org/project/sv-ttk) 2.6.0 (A gorgeous theme for Tkinter, based on Windows 11's UI) + * [typer](https://pypi.org/project/typer) 0.15.2 (Typer, build great CLIs. Easy to code. Based on Python type hints.) + * [wrapt](https://pypi.org/project/wrapt) 1.16.0 (Module for decorators, wrappers and monkey patching.) Upgraded packages: - * [alembic](https://pypi.org/project/alembic) 1.13.1 → 1.15.1 () - * [anthropic](https://pypi.org/project/anthropic) 0.42.0 → 0.49.0 () - * [anyio](https://pypi.org/project/anyio) 4.7.0 → 4.8.0 () - * [array-api-compat](https://pypi.org/project/array-api-compat) 1.10.0 → 1.11.1 () - * [azure-core](https://pypi.org/project/azure-core) 1.30.2 → 1.32.0 () - * [azure-cosmos](https://pypi.org/project/azure-cosmos) 4.7.0 → 4.9.0 () - * [azure-identity](https://pypi.org/project/azure-identity) 1.16.1 → 1.21.0 () - * [black](https://pypi.org/project/black) 24.10.0 → 25.1.0 () - * [bokeh](https://pypi.org/project/bokeh) 3.6.3 → 3.7.2 () - * [cachetools](https://pypi.org/project/cachetools) 5.4.0 → 5.5.2 () - * [certifi](https://pypi.org/project/certifi) 2024.6.2 → 2025.1.31 () - * [click](https://pypi.org/project/click) 8.1.7 → 8.1.8 () - * [cloudpickle](https://pypi.org/project/cloudpickle) 3.0.0 → 3.1.1 () - * [cvxpy](https://pypi.org/project/cvxpy) 1.6.0 → 1.6.4 () - * [cython](https://pypi.org/project/cython) 3.0.11 → 3.0.12 () - * [dask](https://pypi.org/project/dask) 2024.12.1 → 2025.3.0 () - * [datasette](https://pypi.org/project/datasette) 0.64.8 → 0.65.1 () - * [datashader](https://pypi.org/project/datashader) 0.16.3 → 0.17.0 () - * [diff-match-patch](https://pypi.org/project/diff-match-patch) 20230430 → 20241021 () - * [distributed](https://pypi.org/project/distributed) 2024.12.1 → 2025.3.0 () - * [docstring-to-markdown](https://pypi.org/project/docstring-to-markdown) 0.13 → 0.15 () - * [duckdb](https://pypi.org/project/duckdb) 1.2.0 → 1.2.2 () - * [faker](https://pypi.org/project/faker) 33.3.1 → 36.1.1 () - * [fastapi](https://pypi.org/project/fastapi) 0.115.6 → 0.115.8 () - * [filelock](https://pypi.org/project/filelock) 3.14.0 → 3.17.0 () - * [folium](https://pypi.org/project/folium) 0.18.0 → 0.19.5 () - * [holoviews](https://pypi.org/project/holoviews) 1.20.0 → 1.20.2 () - * [hpack](https://pypi.org/project/hpack) 4.0.0 → 4.1.0 () - * [huggingface-hub](https://pypi.org/project/huggingface-hub) 0.28.1 → 0.29.3 () - * [hypercorn](https://pypi.org/project/hypercorn) 0.16.0 → 0.17.3 () - * [hyperframe](https://pypi.org/project/hyperframe) 6.0.1 → 6.1.0 () - * [hypothesis](https://pypi.org/project/hypothesis) 6.122.3 → 6.130.4 () - * [idna](https://pypi.org/project/idna) 3.7 → 3.10 () - * [imageio](https://pypi.org/project/imageio) 2.33.1 → 2.37.0 () - * [importlib-metadata](https://pypi.org/project/importlib-metadata) 7.1.0 → 8.6.1 () - * [ipympl](https://pypi.org/project/ipympl) 0.9.6 → 0.9.7 () - * [ipython](https://pypi.org/project/ipython) 8.32.0 → 8.34.0 () - * [ipywidgets](https://pypi.org/project/ipywidgets) 8.1.5 → 8.1.6 () - * [jupyter-client](https://pypi.org/project/jupyter-client) 8.6.2 → 8.6.3 () - * [jupyter-events](https://pypi.org/project/jupyter-events) 0.10.0 → 0.12.0 () - * [jupyterlab](https://pypi.org/project/jupyterlab) 4.3.5 → 4.4.1 () - * [jupyterlab-widgets](https://pypi.org/project/jupyterlab-widgets) 3.0.13 → 3.0.14 () - * [keras](https://pypi.org/project/keras) 3.8.0 → 3.9.2 () - * [langchain](https://pypi.org/project/langchain) 0.3.18 → 0.3.23 () - * [langchain-core](https://pypi.org/project/langchain-core) 0.3.34 → 0.3.51 () - * [langchain-text-splitters](https://pypi.org/project/langchain-text-splitters) 0.3.6 → 0.3.8 () - * [langsmith](https://pypi.org/project/langsmith) 0.2.11 → 0.3.24 () - * [markdown](https://pypi.org/project/markdown) 3.5.1 → 3.7 () - * [matplotlib](https://pypi.org/project/matplotlib) 3.10.0 → 3.10.1 () - * [mypy](https://pypi.org/project/mypy) 1.14.0 → 1.15.0 () - * [mysql-connector-python](https://pypi.org/project/mysql-connector-python) 8.0.21 → 9.2.0 () - * [narwhals](https://pypi.org/project/narwhals) 1.21.1 → 1.30.0 () - * [notebook](https://pypi.org/project/notebook) 7.3.1 → 7.4.0 () - * [numba](https://pypi.org/project/numba) 0.61.0 → 0.61.2 () - * [numpy](https://pypi.org/project/numpy) 2.1.3 → 2.2.4 () - * [openai](https://pypi.org/project/openai) 1.61.1 → 1.72.0 () - * [opencv-python](https://pypi.org/project/opencv-python) 4.10.0.84 → 4.11.0.86 () - * [optree](https://pypi.org/project/optree) 0.13.1 → 0.14.0 () - * [panel](https://pypi.org/project/panel) 1.6.0 → 1.6.2 () - * [param](https://pypi.org/project/param) 2.1.1 → 2.2.0 () - * [pip](https://pypi.org/project/pip) 24.3.1 → 25.0.1 () - * [platformdirs](https://pypi.org/project/platformdirs) 4.2.2 → 4.3.6 () - * [plotly](https://pypi.org/project/plotly) 5.24.1 → 6.0.1 () - * [polars](https://pypi.org/project/polars) 1.22.0 → 1.27.1 () - * [prometheus-client](https://pypi.org/project/prometheus-client) 0.18.0 → 0.21.1 () - * [prompt-toolkit](https://pypi.org/project/prompt-toolkit) 3.0.48 → 3.0.50 () - * [pyarrow](https://pypi.org/project/pyarrow) 19.0.0 → 19.0.1 () - * [pyasn1](https://pypi.org/project/pyasn1) 0.4.8 → 0.6.1 () - * [pyasn1-modules](https://pypi.org/project/pyasn1-modules) 0.2.8 → 0.4.1 () - * [pyjwt](https://pypi.org/project/pyjwt) 2.8.0 → 2.10.1 () - * [pympler](https://pypi.org/project/pympler) 1.0.1 → 1.1 () - * [pyomo](https://pypi.org/project/pyomo) 6.8.2 → 6.9.1 () - * [pypandoc](https://pypi.org/project/pypandoc) 1.5 → 1.15 () - * [pytest](https://pypi.org/project/pytest) 8.2.2 → 8.3.4 () + * [alembic](https://pypi.org/project/alembic) 1.13.1 → 1.15.1 (A database migration tool for SQLAlchemy.) + * [anthropic](https://pypi.org/project/anthropic) 0.42.0 → 0.49.0 (The official Python library for the anthropic API) + * [anyio](https://pypi.org/project/anyio) 4.7.0 → 4.8.0 (High level compatibility layer for multiple asynchronous event loop implementations) + * [array-api-compat](https://pypi.org/project/array-api-compat) 1.10.0 → 1.11.1 (A wrapper around NumPy and other array libraries to make them compatible with the Array API standard) + * [azure-core](https://pypi.org/project/azure-core) 1.30.2 → 1.32.0 (Microsoft Azure Core Library for Python) + * [azure-cosmos](https://pypi.org/project/azure-cosmos) 4.7.0 → 4.9.0 (Microsoft Azure Cosmos Client Library for Python) + * [azure-identity](https://pypi.org/project/azure-identity) 1.16.1 → 1.21.0 (Microsoft Azure Identity Library for Python) + * [black](https://pypi.org/project/black) 24.10.0 → 25.1.0 (The uncompromising code formatter.) + * [bokeh](https://pypi.org/project/bokeh) 3.6.3 → 3.7.2 (Interactive plots and applications in the browser from Python) + * [cachetools](https://pypi.org/project/cachetools) 5.4.0 → 5.5.2 (Extensible memoizing collections and decorators) + * [certifi](https://pypi.org/project/certifi) 2024.6.2 → 2025.1.31 (Python package for providing Mozilla's CA Bundle.) + * [click](https://pypi.org/project/click) 8.1.7 → 8.1.8 (Composable command line interface toolkit) + * [cloudpickle](https://pypi.org/project/cloudpickle) 3.0.0 → 3.1.1 (Pickler class to extend the standard pickle.Pickler functionality) + * [cvxpy](https://pypi.org/project/cvxpy) 1.6.0 → 1.6.4 (A domain-specific language for modeling convex optimization problems in Python.) + * [cython](https://pypi.org/project/cython) 3.0.11 → 3.0.12 (The Cython compiler for writing C extensions in the Python language.) + * [dask](https://pypi.org/project/dask) 2024.12.1 → 2025.3.0 (Parallel PyData with Task Scheduling) + * [datasette](https://pypi.org/project/datasette) 0.64.8 → 0.65.1 (An open source multi-tool for exploring and publishing data) + * [datashader](https://pypi.org/project/datashader) 0.16.3 → 0.17.0 (Data visualization toolchain based on aggregating into a grid) + * [diff-match-patch](https://pypi.org/project/diff-match-patch) 20230430 → 20241021 (Repackaging of Google's Diff Match and Patch libraries.) + * [distributed](https://pypi.org/project/distributed) 2024.12.1 → 2025.3.0 (Distributed scheduler for Dask) + * [docstring-to-markdown](https://pypi.org/project/docstring-to-markdown) 0.13 → 0.15 (On the fly conversion of Python docstrings to markdown) + * [duckdb](https://pypi.org/project/duckdb) 1.2.0 → 1.2.2 (DuckDB in-process database) + * [faker](https://pypi.org/project/faker) 33.3.1 → 36.1.1 (Faker is a Python package that generates fake data for you.) + * [fastapi](https://pypi.org/project/fastapi) 0.115.6 → 0.115.8 (FastAPI framework, high performance, easy to learn, fast to code, ready for production) + * [filelock](https://pypi.org/project/filelock) 3.14.0 → 3.17.0 (A platform independent file lock.) + * [folium](https://pypi.org/project/folium) 0.18.0 → 0.19.5 (Make beautiful maps with Leaflet.js & Python) + * [holoviews](https://pypi.org/project/holoviews) 1.20.0 → 1.20.2 (A high-level plotting API for the PyData ecosystem built on HoloViews.) + * [hpack](https://pypi.org/project/hpack) 4.0.0 → 4.1.0 (Pure-Python HPACK header encoding) + * [huggingface-hub](https://pypi.org/project/huggingface-hub) 0.28.1 → 0.29.3 (Client library to download and publish models, datasets and other repos on the huggingface.co hub) + * [hypercorn](https://pypi.org/project/hypercorn) 0.16.0 → 0.17.3 (A ASGI Server based on Hyper libraries and inspired by Gunicorn) + * [hyperframe](https://pypi.org/project/hyperframe) 6.0.1 → 6.1.0 (Pure-Python HTTP/2 framing) + * [hypothesis](https://pypi.org/project/hypothesis) 6.122.3 → 6.130.4 (A library for property-based testing) + * [idna](https://pypi.org/project/idna) 3.7 → 3.10 (Internationalized Domain Names in Applications (IDNA)) + * [imageio](https://pypi.org/project/imageio) 2.33.1 → 2.37.0 (Library for reading and writing a wide range of image, video, scientific, and volumetric data formats.) + * [importlib-metadata](https://pypi.org/project/importlib-metadata) 7.1.0 → 8.6.1 (Read metadata from Python packages) + * [ipympl](https://pypi.org/project/ipympl) 0.9.6 → 0.9.7 (Matplotlib Jupyter Extension) + * [ipython](https://pypi.org/project/ipython) 8.32.0 → 8.34.0 (IPython: Productive Interactive Computing) + * [ipywidgets](https://pypi.org/project/ipywidgets) 8.1.5 → 8.1.6 (Jupyter interactive widgets) + * [jupyter-client](https://pypi.org/project/jupyter-client) 8.6.2 → 8.6.3 (Jupyter protocol implementation and client libraries) + * [jupyter-events](https://pypi.org/project/jupyter-events) 0.10.0 → 0.12.0 (Jupyter Event System library) + * [jupyterlab](https://pypi.org/project/jupyterlab) 4.3.5 → 4.4.1 (JupyterLab computational environment) + * [jupyterlab-widgets](https://pypi.org/project/jupyterlab-widgets) 3.0.13 → 3.0.14 (Jupyter interactive widgets for JupyterLab) + * [keras](https://pypi.org/project/keras) 3.8.0 → 3.9.2 (Multi-backend Keras) + * [langchain](https://pypi.org/project/langchain) 0.3.18 → 0.3.23 (Building applications with LLMs through composability) + * [langchain-core](https://pypi.org/project/langchain-core) 0.3.34 → 0.3.51 (Building applications with LLMs through composability) + * [langchain-text-splitters](https://pypi.org/project/langchain-text-splitters) 0.3.6 → 0.3.8 (LangChain text splitting utilities) + * [langsmith](https://pypi.org/project/langsmith) 0.2.11 → 0.3.24 (Client library to connect to the LangSmith LLM Tracing and Evaluation Platform.) + * [markdown](https://pypi.org/project/markdown) 3.5.1 → 3.7 (Python implementation of John Gruber's Markdown.) + * [matplotlib](https://pypi.org/project/matplotlib) 3.10.0 → 3.10.1 (Python plotting package) + * [mypy](https://pypi.org/project/mypy) 1.14.0 → 1.15.0 (Optional static typing for Python) + * [mysql-connector-python](https://pypi.org/project/mysql-connector-python) 8.0.21 → 9.2.0 (A self-contained Python driver for communicating with MySQL servers, using an API that is compliant with the Python Database API Specification v) + * [narwhals](https://pypi.org/project/narwhals) 1.21.1 → 1.30.0 (Extremely lightweight compatibility layer between dataframe libraries) + * [notebook](https://pypi.org/project/notebook) 7.3.1 → 7.4.0 (Jupyter Notebook - A web-based notebook environment for interactive computing) + * [numba](https://pypi.org/project/numba) 0.61.0 → 0.61.2 (compiling Python code using LLVM) + * [numpy](https://pypi.org/project/numpy) 2.1.3 → 2.2.4 (Fundamental package for array computing in Python) + * [openai](https://pypi.org/project/openai) 1.61.1 → 1.72.0 (The official Python library for the openai API) + * [opencv-python](https://pypi.org/project/opencv-python) 4.10.0.84 → 4.11.0.86 (Wrapper package for OpenCV python bindings.) + * [optree](https://pypi.org/project/optree) 0.13.1 → 0.14.0 (Optimized PyTree Utilities.) + * [panel](https://pypi.org/project/panel) 1.6.0 → 1.6.2 (The powerful data exploration & web app framework for Python.) + * [param](https://pypi.org/project/param) 2.1.1 → 2.2.0 (Make your Python code clearer and more reliable by declaring Parameters.) + * [pip](https://pypi.org/project/pip) 24.3.1 → 25.0.1 (The PyPA recommended tool for installing Python packages.) + * [platformdirs](https://pypi.org/project/platformdirs) 4.2.2 → 4.3.6 (A small Python package for determining appropriate platform-specific dirs, e.g. a `user data dir`.) + * [plotly](https://pypi.org/project/plotly) 5.24.1 → 6.0.1 (An open-source interactive data visualization library for Python) + * [polars](https://pypi.org/project/polars) 1.22.0 → 1.27.1 (Blazingly fast DataFrame library) + * [prometheus-client](https://pypi.org/project/prometheus-client) 0.18.0 → 0.21.1 (Python client for the Prometheus monitoring system.) + * [prompt-toolkit](https://pypi.org/project/prompt-toolkit) 3.0.48 → 3.0.50 (Library for building powerful interactive command lines in Python) + * [pyarrow](https://pypi.org/project/pyarrow) 19.0.0 → 19.0.1 (Python library for Apache Arrow) + * [pyasn1](https://pypi.org/project/pyasn1) 0.4.8 → 0.6.1 (Pure-Python implementation of ASN.1 types and DER/BER/CER codecs (X.208)) + * [pyasn1-modules](https://pypi.org/project/pyasn1-modules) 0.2.8 → 0.4.1 (A collection of ASN.1-based protocols modules) + * [pyjwt](https://pypi.org/project/pyjwt) 2.8.0 → 2.10.1 (JSON Web Token implementation in Python) + * [pympler](https://pypi.org/project/pympler) 1.0.1 → 1.1 (A development tool to measure, monitor and analyze the memory behavior of Python objects.) + * [pyomo](https://pypi.org/project/pyomo) 6.8.2 → 6.9.1 (Pyomo: Python Optimization Modeling Objects) + * [pypandoc](https://pypi.org/project/pypandoc) 1.5 → 1.15 (Thin wrapper for pandoc.) + * [pytest](https://pypi.org/project/pytest) 8.2.2 → 8.3.4 (pytest: simple powerful testing with Python) * [Python](http://www.python.org/) 3.12.9 → 3.12.10 (Python programming language with standard library) - * [pytz](https://pypi.org/project/pytz) 2024.1 → 2024.2 () - * [pyzmq](https://pypi.org/project/pyzmq) 26.2.0 → 26.2.1 () - * [qtawesome](https://pypi.org/project/qtawesome) 1.3.1 → 1.4.0 () - * [qtconsole](https://pypi.org/project/qtconsole) 5.5.2 → 5.6.1 () - * [quart](https://pypi.org/project/quart) 0.19.4 → 0.20.0 () - * [rtree](https://pypi.org/project/rtree) 1.1.0 → 1.3.0 () - * [rx](https://pypi.org/project/rx) 3.1.1 → 3.2.0 () - * [scikit-image](https://pypi.org/project/scikit-image) 0.25.0 → 0.25.2 () - * [scipy](https://pypi.org/project/scipy) 1.15.1 → 1.15.2 () - * [send2trash](https://pypi.org/project/send2trash) 1.8.2 → 1.8.3 () - * [setuptools](https://pypi.org/project/setuptools) 75.6.0 → 75.8.2 () - * [simpy](https://pypi.org/project/simpy) 4.0.1 → 4.1.1 () - * [spyder](https://pypi.org/project/spyder) 5.5.6 → 6.0.5 () - * [spyder-kernels](https://pypi.org/project/spyder-kernels) 2.5.2 → 3.0.3 () - * [sqlalchemy](https://pypi.org/project/sqlalchemy) 2.0.35 → 2.0.38 () - * [starlette](https://pypi.org/project/starlette) 0.41.3 → 0.45.3 () - * [streamlit](https://pypi.org/project/streamlit) 1.41.1 → 1.44.0 () - * [tomli-w](https://pypi.org/project/tomli-w) 1.1.0 → 1.2.0 () - * [trio](https://pypi.org/project/trio) 0.28.0 → 0.29.0 () - * [twine](https://pypi.org/project/twine) 6.0.1 → 6.1.0 () - * [widgetsnbextension](https://pypi.org/project/widgetsnbextension) 4.0.13 → 4.0.14 () - * [winpython](https://pypi.org/project/winpython) 13.1.20250222 → 15.3.20250425 () - * [xarray](https://pypi.org/project/xarray) 2025.1.1 → 2025.3.0 () - * [yt-dlp](https://pypi.org/project/yt-dlp) 2023.7.6 → 2025.2.19 () + * [pytz](https://pypi.org/project/pytz) 2024.1 → 2024.2 (World timezone definitions, modern and historical) + * [pyzmq](https://pypi.org/project/pyzmq) 26.2.0 → 26.2.1 (Python bindings for 0MQ) + * [qtawesome](https://pypi.org/project/qtawesome) 1.3.1 → 1.4.0 (FontAwesome icons in PyQt and PySide applications) + * [qtconsole](https://pypi.org/project/qtconsole) 5.5.2 → 5.6.1 (Jupyter Qt console) + * [quart](https://pypi.org/project/quart) 0.19.4 → 0.20.0 (A Python ASGI web framework with the same API as Flask) + * [rtree](https://pypi.org/project/rtree) 1.1.0 → 1.3.0 (R-Tree spatial index for Python GIS) + * [rx](https://pypi.org/project/rx) 3.1.1 → 3.2.0 (Reactive Extensions (Rx) for Python) + * [scikit-image](https://pypi.org/project/scikit-image) 0.25.0 → 0.25.2 (Image processing in Python) + * [scipy](https://pypi.org/project/scipy) 1.15.1 → 1.15.2 (Fundamental algorithms for scientific computing in Python) + * [send2trash](https://pypi.org/project/send2trash) 1.8.2 → 1.8.3 (Send file to trash natively under Mac OS X, Windows and Linux) + * [setuptools](https://pypi.org/project/setuptools) 75.6.0 → 75.8.2 (Easily download, build, install, upgrade, and uninstall Python packages) + * [simpy](https://pypi.org/project/simpy) 4.0.1 → 4.1.1 (Event discrete, process based simulation for Python.) + * [spyder](https://pypi.org/project/spyder) 5.5.6 → 6.0.5 (The Scientific Python Development Environment) + * [spyder-kernels](https://pypi.org/project/spyder-kernels) 2.5.2 → 3.0.3 (Jupyter kernels for Spyder's console) + * [sqlalchemy](https://pypi.org/project/sqlalchemy) 2.0.35 → 2.0.38 (Database Abstraction Library) + * [starlette](https://pypi.org/project/starlette) 0.41.3 → 0.45.3 (The little ASGI library that shines.) + * [streamlit](https://pypi.org/project/streamlit) 1.41.1 → 1.44.0 (A faster way to build and share data apps) + * [tomli-w](https://pypi.org/project/tomli-w) 1.1.0 → 1.2.0 (A lil' TOML writer) + * [trio](https://pypi.org/project/trio) 0.28.0 → 0.29.0 (A friendly Python library for async concurrency and I/O) + * [twine](https://pypi.org/project/twine) 6.0.1 → 6.1.0 (Collection of utilities for publishing packages on PyPI) + * [widgetsnbextension](https://pypi.org/project/widgetsnbextension) 4.0.13 → 4.0.14 (Jupyter interactive widgets for Jupyter Notebook) + * [winpython](https://pypi.org/project/winpython) 13.1.20250222 → 15.3.20250425 (WinPython distribution tools, including WPPM) + * [xarray](https://pypi.org/project/xarray) 2025.1.1 → 2025.3.0 (N-D labeled arrays and datasets in Python) + * [yt-dlp](https://pypi.org/project/yt-dlp) 2023.7.6 → 2025.2.19 (A feature-rich command-line audio/video downloader) Removed packages: diff --git a/changelogs/WinPythonslim-64bit-3.13.3.0_History.md b/changelogs/WinPythonslim-64bit-3.13.3.0_History.md index e4117e9d..9767b1e5 100644 --- a/changelogs/WinPythonslim-64bit-3.13.3.0_History.md +++ b/changelogs/WinPythonslim-64bit-3.13.3.0_History.md @@ -14,122 +14,122 @@ New packages: New packages: - * [asyncssh](https://pypi.org/project/asyncssh) 2.20.0 () - * [deprecated](https://pypi.org/project/deprecated) 1.2.14 () - * [flexcache](https://pypi.org/project/flexcache) 0.3 () - * [flexparser](https://pypi.org/project/flexparser) 0.4 () - * [id](https://pypi.org/project/id) 1.5.0 () - * [pygithub](https://pypi.org/project/pygithub) 2.6.1 () - * [pyuca](https://pypi.org/project/pyuca) 1.2 () - * [shellingham](https://pypi.org/project/shellingham) 1.5.4 () - * [skrub](https://pypi.org/project/skrub) 0.5.1 () - * [superqt](https://pypi.org/project/superqt) 0.7.1 () - * [sv-ttk](https://pypi.org/project/sv-ttk) 2.6.0 () - * [typer](https://pypi.org/project/typer) 0.15.2 () - * [wrapt](https://pypi.org/project/wrapt) 1.16.0 () + * [asyncssh](https://pypi.org/project/asyncssh) 2.20.0 (AsyncSSH: Asynchronous SSHv2 client and server library) + * [deprecated](https://pypi.org/project/deprecated) 1.2.14 (Python @deprecated decorator to deprecate old python classes, functions or methods.) + * [flexcache](https://pypi.org/project/flexcache) 0.3 (Saves and loads to the cache a transformed versions of a source object.) + * [flexparser](https://pypi.org/project/flexparser) 0.4 (Parsing made fun ... using typing.) + * [id](https://pypi.org/project/id) 1.5.0 (A tool for generating OIDC identities) + * [pygithub](https://pypi.org/project/pygithub) 2.6.1 (Use the full Github API v3) + * [pyuca](https://pypi.org/project/pyuca) 1.2 (a Python implementation of the Unicode Collation Algorithm) + * [shellingham](https://pypi.org/project/shellingham) 1.5.4 (Tool to Detect Surrounding Shell) + * [skrub](https://pypi.org/project/skrub) 0.5.1 (Prepping tables for machine learning) + * [superqt](https://pypi.org/project/superqt) 0.7.1 (Missing widgets and components for PyQt/PySide) + * [sv-ttk](https://pypi.org/project/sv-ttk) 2.6.0 (A gorgeous theme for Tkinter, based on Windows 11's UI) + * [typer](https://pypi.org/project/typer) 0.15.2 (Typer, build great CLIs. Easy to code. Based on Python type hints.) + * [wrapt](https://pypi.org/project/wrapt) 1.16.0 (Module for decorators, wrappers and monkey patching.) Upgraded packages: - * [alembic](https://pypi.org/project/alembic) 1.13.1 → 1.15.1 () - * [anthropic](https://pypi.org/project/anthropic) 0.42.0 → 0.49.0 () - * [anyio](https://pypi.org/project/anyio) 4.7.0 → 4.8.0 () - * [array-api-compat](https://pypi.org/project/array-api-compat) 1.10.0 → 1.11.1 () - * [azure-core](https://pypi.org/project/azure-core) 1.30.2 → 1.32.0 () - * [azure-cosmos](https://pypi.org/project/azure-cosmos) 4.7.0 → 4.9.0 () - * [azure-identity](https://pypi.org/project/azure-identity) 1.16.1 → 1.21.0 () - * [black](https://pypi.org/project/black) 24.10.0 → 25.1.0 () - * [bokeh](https://pypi.org/project/bokeh) 3.6.3 → 3.7.2 () - * [cachetools](https://pypi.org/project/cachetools) 5.4.0 → 5.5.2 () - * [certifi](https://pypi.org/project/certifi) 2024.6.2 → 2025.1.31 () - * [click](https://pypi.org/project/click) 8.1.7 → 8.1.8 () - * [cloudpickle](https://pypi.org/project/cloudpickle) 3.0.0 → 3.1.1 () - * [cvxpy](https://pypi.org/project/cvxpy) 1.6.0 → 1.6.4 () - * [cython](https://pypi.org/project/cython) 3.0.11 → 3.0.12 () - * [dask](https://pypi.org/project/dask) 2024.12.1 → 2025.3.0 () - * [datasette](https://pypi.org/project/datasette) 0.64.8 → 0.65.1 () - * [datashader](https://pypi.org/project/datashader) 0.16.3 → 0.17.0 () - * [diff-match-patch](https://pypi.org/project/diff-match-patch) 20230430 → 20241021 () - * [distributed](https://pypi.org/project/distributed) 2024.12.1 → 2025.3.0 () - * [docstring-to-markdown](https://pypi.org/project/docstring-to-markdown) 0.13 → 0.15 () - * [duckdb](https://pypi.org/project/duckdb) 1.2.0 → 1.2.2 () - * [executing](https://pypi.org/project/executing) 2.0.1 → 2.2.0 () - * [faker](https://pypi.org/project/faker) 33.3.1 → 36.1.1 () - * [fastapi](https://pypi.org/project/fastapi) 0.115.6 → 0.115.8 () - * [filelock](https://pypi.org/project/filelock) 3.14.0 → 3.17.0 () - * [folium](https://pypi.org/project/folium) 0.18.0 → 0.19.5 () - * [holoviews](https://pypi.org/project/holoviews) 1.20.0 → 1.20.2 () - * [hpack](https://pypi.org/project/hpack) 4.0.0 → 4.1.0 () - * [huggingface-hub](https://pypi.org/project/huggingface-hub) 0.28.1 → 0.29.3 () - * [hypercorn](https://pypi.org/project/hypercorn) 0.16.0 → 0.17.3 () - * [hyperframe](https://pypi.org/project/hyperframe) 6.0.1 → 6.1.0 () - * [hypothesis](https://pypi.org/project/hypothesis) 6.122.3 → 6.130.4 () - * [idna](https://pypi.org/project/idna) 3.7 → 3.10 () - * [imageio](https://pypi.org/project/imageio) 2.33.1 → 2.37.0 () - * [importlib-metadata](https://pypi.org/project/importlib-metadata) 7.1.0 → 8.6.1 () - * [ipympl](https://pypi.org/project/ipympl) 0.9.6 → 0.9.7 () - * [ipython](https://pypi.org/project/ipython) 8.32.0 → 8.34.0 () - * [ipywidgets](https://pypi.org/project/ipywidgets) 8.1.5 → 8.1.6 () - * [jupyter-client](https://pypi.org/project/jupyter-client) 8.6.2 → 8.6.3 () - * [jupyter-events](https://pypi.org/project/jupyter-events) 0.10.0 → 0.12.0 () - * [jupyterlab](https://pypi.org/project/jupyterlab) 4.3.5 → 4.4.1 () - * [jupyterlab-widgets](https://pypi.org/project/jupyterlab-widgets) 3.0.13 → 3.0.14 () - * [keras](https://pypi.org/project/keras) 3.8.0 → 3.9.2 () - * [langchain](https://pypi.org/project/langchain) 0.3.18 → 0.3.23 () - * [langchain-core](https://pypi.org/project/langchain-core) 0.3.34 → 0.3.51 () - * [langchain-text-splitters](https://pypi.org/project/langchain-text-splitters) 0.3.6 → 0.3.8 () - * [langsmith](https://pypi.org/project/langsmith) 0.2.11 → 0.3.24 () - * [markdown](https://pypi.org/project/markdown) 3.5.1 → 3.7 () - * [matplotlib](https://pypi.org/project/matplotlib) 3.10.0 → 3.10.1 () - * [mypy](https://pypi.org/project/mypy) 1.14.0 → 1.15.0 () - * [mysql-connector-python](https://pypi.org/project/mysql-connector-python) 8.0.21 → 9.2.0 () - * [narwhals](https://pypi.org/project/narwhals) 1.21.1 → 1.30.0 () - * [notebook](https://pypi.org/project/notebook) 7.3.1 → 7.4.0 () - * [numba](https://pypi.org/project/numba) 0.61.0 → 0.61.2 () - * [numpy](https://pypi.org/project/numpy) 2.1.3 → 2.2.4 () - * [openai](https://pypi.org/project/openai) 1.61.1 → 1.72.0 () - * [opencv-python](https://pypi.org/project/opencv-python) 4.10.0.84 → 4.11.0.86 () - * [optree](https://pypi.org/project/optree) 0.13.1 → 0.14.0 () - * [panel](https://pypi.org/project/panel) 1.6.0 → 1.6.2 () - * [param](https://pypi.org/project/param) 2.1.1 → 2.2.0 () - * [pip](https://pypi.org/project/pip) 24.3.1 → 25.0.1 () - * [platformdirs](https://pypi.org/project/platformdirs) 4.2.2 → 4.3.6 () - * [plotly](https://pypi.org/project/plotly) 5.24.1 → 6.0.1 () - * [polars](https://pypi.org/project/polars) 1.22.0 → 1.27.1 () - * [prometheus-client](https://pypi.org/project/prometheus-client) 0.18.0 → 0.21.1 () - * [prompt-toolkit](https://pypi.org/project/prompt-toolkit) 3.0.48 → 3.0.50 () - * [pyarrow](https://pypi.org/project/pyarrow) 19.0.0 → 19.0.1 () - * [pyasn1](https://pypi.org/project/pyasn1) 0.4.8 → 0.6.1 () - * [pyasn1-modules](https://pypi.org/project/pyasn1-modules) 0.2.8 → 0.4.1 () - * [pyjwt](https://pypi.org/project/pyjwt) 2.8.0 → 2.10.1 () - * [pympler](https://pypi.org/project/pympler) 1.0.1 → 1.1 () - * [pyomo](https://pypi.org/project/pyomo) 6.8.2 → 6.9.1 () - * [pypandoc](https://pypi.org/project/pypandoc) 1.5 → 1.15 () - * [pytest](https://pypi.org/project/pytest) 8.2.2 → 8.3.4 () + * [alembic](https://pypi.org/project/alembic) 1.13.1 → 1.15.1 (A database migration tool for SQLAlchemy.) + * [anthropic](https://pypi.org/project/anthropic) 0.42.0 → 0.49.0 (The official Python library for the anthropic API) + * [anyio](https://pypi.org/project/anyio) 4.7.0 → 4.8.0 (High level compatibility layer for multiple asynchronous event loop implementations) + * [array-api-compat](https://pypi.org/project/array-api-compat) 1.10.0 → 1.11.1 (A wrapper around NumPy and other array libraries to make them compatible with the Array API standard) + * [azure-core](https://pypi.org/project/azure-core) 1.30.2 → 1.32.0 (Microsoft Azure Core Library for Python) + * [azure-cosmos](https://pypi.org/project/azure-cosmos) 4.7.0 → 4.9.0 (Microsoft Azure Cosmos Client Library for Python) + * [azure-identity](https://pypi.org/project/azure-identity) 1.16.1 → 1.21.0 (Microsoft Azure Identity Library for Python) + * [black](https://pypi.org/project/black) 24.10.0 → 25.1.0 (The uncompromising code formatter.) + * [bokeh](https://pypi.org/project/bokeh) 3.6.3 → 3.7.2 (Interactive plots and applications in the browser from Python) + * [cachetools](https://pypi.org/project/cachetools) 5.4.0 → 5.5.2 (Extensible memoizing collections and decorators) + * [certifi](https://pypi.org/project/certifi) 2024.6.2 → 2025.1.31 (Python package for providing Mozilla's CA Bundle.) + * [click](https://pypi.org/project/click) 8.1.7 → 8.1.8 (Composable command line interface toolkit) + * [cloudpickle](https://pypi.org/project/cloudpickle) 3.0.0 → 3.1.1 (Pickler class to extend the standard pickle.Pickler functionality) + * [cvxpy](https://pypi.org/project/cvxpy) 1.6.0 → 1.6.4 (A domain-specific language for modeling convex optimization problems in Python.) + * [cython](https://pypi.org/project/cython) 3.0.11 → 3.0.12 (The Cython compiler for writing C extensions in the Python language.) + * [dask](https://pypi.org/project/dask) 2024.12.1 → 2025.3.0 (Parallel PyData with Task Scheduling) + * [datasette](https://pypi.org/project/datasette) 0.64.8 → 0.65.1 (An open source multi-tool for exploring and publishing data) + * [datashader](https://pypi.org/project/datashader) 0.16.3 → 0.17.0 (Data visualization toolchain based on aggregating into a grid) + * [diff-match-patch](https://pypi.org/project/diff-match-patch) 20230430 → 20241021 (Repackaging of Google's Diff Match and Patch libraries.) + * [distributed](https://pypi.org/project/distributed) 2024.12.1 → 2025.3.0 (Distributed scheduler for Dask) + * [docstring-to-markdown](https://pypi.org/project/docstring-to-markdown) 0.13 → 0.15 (On the fly conversion of Python docstrings to markdown) + * [duckdb](https://pypi.org/project/duckdb) 1.2.0 → 1.2.2 (DuckDB in-process database) + * [executing](https://pypi.org/project/executing) 2.0.1 → 2.2.0 (Get the currently executing AST node of a frame, and other information) + * [faker](https://pypi.org/project/faker) 33.3.1 → 36.1.1 (Faker is a Python package that generates fake data for you.) + * [fastapi](https://pypi.org/project/fastapi) 0.115.6 → 0.115.8 (FastAPI framework, high performance, easy to learn, fast to code, ready for production) + * [filelock](https://pypi.org/project/filelock) 3.14.0 → 3.17.0 (A platform independent file lock.) + * [folium](https://pypi.org/project/folium) 0.18.0 → 0.19.5 (Make beautiful maps with Leaflet.js & Python) + * [holoviews](https://pypi.org/project/holoviews) 1.20.0 → 1.20.2 (A high-level plotting API for the PyData ecosystem built on HoloViews.) + * [hpack](https://pypi.org/project/hpack) 4.0.0 → 4.1.0 (Pure-Python HPACK header encoding) + * [huggingface-hub](https://pypi.org/project/huggingface-hub) 0.28.1 → 0.29.3 (Client library to download and publish models, datasets and other repos on the huggingface.co hub) + * [hypercorn](https://pypi.org/project/hypercorn) 0.16.0 → 0.17.3 (A ASGI Server based on Hyper libraries and inspired by Gunicorn) + * [hyperframe](https://pypi.org/project/hyperframe) 6.0.1 → 6.1.0 (Pure-Python HTTP/2 framing) + * [hypothesis](https://pypi.org/project/hypothesis) 6.122.3 → 6.130.4 (A library for property-based testing) + * [idna](https://pypi.org/project/idna) 3.7 → 3.10 (Internationalized Domain Names in Applications (IDNA)) + * [imageio](https://pypi.org/project/imageio) 2.33.1 → 2.37.0 (Library for reading and writing a wide range of image, video, scientific, and volumetric data formats.) + * [importlib-metadata](https://pypi.org/project/importlib-metadata) 7.1.0 → 8.6.1 (Read metadata from Python packages) + * [ipympl](https://pypi.org/project/ipympl) 0.9.6 → 0.9.7 (Matplotlib Jupyter Extension) + * [ipython](https://pypi.org/project/ipython) 8.32.0 → 8.34.0 (IPython: Productive Interactive Computing) + * [ipywidgets](https://pypi.org/project/ipywidgets) 8.1.5 → 8.1.6 (Jupyter interactive widgets) + * [jupyter-client](https://pypi.org/project/jupyter-client) 8.6.2 → 8.6.3 (Jupyter protocol implementation and client libraries) + * [jupyter-events](https://pypi.org/project/jupyter-events) 0.10.0 → 0.12.0 (Jupyter Event System library) + * [jupyterlab](https://pypi.org/project/jupyterlab) 4.3.5 → 4.4.1 (JupyterLab computational environment) + * [jupyterlab-widgets](https://pypi.org/project/jupyterlab-widgets) 3.0.13 → 3.0.14 (Jupyter interactive widgets for JupyterLab) + * [keras](https://pypi.org/project/keras) 3.8.0 → 3.9.2 (Multi-backend Keras) + * [langchain](https://pypi.org/project/langchain) 0.3.18 → 0.3.23 (Building applications with LLMs through composability) + * [langchain-core](https://pypi.org/project/langchain-core) 0.3.34 → 0.3.51 (Building applications with LLMs through composability) + * [langchain-text-splitters](https://pypi.org/project/langchain-text-splitters) 0.3.6 → 0.3.8 (LangChain text splitting utilities) + * [langsmith](https://pypi.org/project/langsmith) 0.2.11 → 0.3.24 (Client library to connect to the LangSmith LLM Tracing and Evaluation Platform.) + * [markdown](https://pypi.org/project/markdown) 3.5.1 → 3.7 (Python implementation of John Gruber's Markdown.) + * [matplotlib](https://pypi.org/project/matplotlib) 3.10.0 → 3.10.1 (Python plotting package) + * [mypy](https://pypi.org/project/mypy) 1.14.0 → 1.15.0 (Optional static typing for Python) + * [mysql-connector-python](https://pypi.org/project/mysql-connector-python) 8.0.21 → 9.2.0 (A self-contained Python driver for communicating with MySQL servers, using an API that is compliant with the Python Database API Specification v) + * [narwhals](https://pypi.org/project/narwhals) 1.21.1 → 1.30.0 (Extremely lightweight compatibility layer between dataframe libraries) + * [notebook](https://pypi.org/project/notebook) 7.3.1 → 7.4.0 (Jupyter Notebook - A web-based notebook environment for interactive computing) + * [numba](https://pypi.org/project/numba) 0.61.0 → 0.61.2 (compiling Python code using LLVM) + * [numpy](https://pypi.org/project/numpy) 2.1.3 → 2.2.4 (Fundamental package for array computing in Python) + * [openai](https://pypi.org/project/openai) 1.61.1 → 1.72.0 (The official Python library for the openai API) + * [opencv-python](https://pypi.org/project/opencv-python) 4.10.0.84 → 4.11.0.86 (Wrapper package for OpenCV python bindings.) + * [optree](https://pypi.org/project/optree) 0.13.1 → 0.14.0 (Optimized PyTree Utilities.) + * [panel](https://pypi.org/project/panel) 1.6.0 → 1.6.2 (The powerful data exploration & web app framework for Python.) + * [param](https://pypi.org/project/param) 2.1.1 → 2.2.0 (Make your Python code clearer and more reliable by declaring Parameters.) + * [pip](https://pypi.org/project/pip) 24.3.1 → 25.0.1 (The PyPA recommended tool for installing Python packages.) + * [platformdirs](https://pypi.org/project/platformdirs) 4.2.2 → 4.3.6 (A small Python package for determining appropriate platform-specific dirs, e.g. a `user data dir`.) + * [plotly](https://pypi.org/project/plotly) 5.24.1 → 6.0.1 (An open-source interactive data visualization library for Python) + * [polars](https://pypi.org/project/polars) 1.22.0 → 1.27.1 (Blazingly fast DataFrame library) + * [prometheus-client](https://pypi.org/project/prometheus-client) 0.18.0 → 0.21.1 (Python client for the Prometheus monitoring system.) + * [prompt-toolkit](https://pypi.org/project/prompt-toolkit) 3.0.48 → 3.0.50 (Library for building powerful interactive command lines in Python) + * [pyarrow](https://pypi.org/project/pyarrow) 19.0.0 → 19.0.1 (Python library for Apache Arrow) + * [pyasn1](https://pypi.org/project/pyasn1) 0.4.8 → 0.6.1 (Pure-Python implementation of ASN.1 types and DER/BER/CER codecs (X.208)) + * [pyasn1-modules](https://pypi.org/project/pyasn1-modules) 0.2.8 → 0.4.1 (A collection of ASN.1-based protocols modules) + * [pyjwt](https://pypi.org/project/pyjwt) 2.8.0 → 2.10.1 (JSON Web Token implementation in Python) + * [pympler](https://pypi.org/project/pympler) 1.0.1 → 1.1 (A development tool to measure, monitor and analyze the memory behavior of Python objects.) + * [pyomo](https://pypi.org/project/pyomo) 6.8.2 → 6.9.1 (Pyomo: Python Optimization Modeling Objects) + * [pypandoc](https://pypi.org/project/pypandoc) 1.5 → 1.15 (Thin wrapper for pandoc.) + * [pytest](https://pypi.org/project/pytest) 8.2.2 → 8.3.4 (pytest: simple powerful testing with Python) * [Python](http://www.python.org/) 3.13.2 → 3.13.3 (Python programming language with standard library) - * [pytz](https://pypi.org/project/pytz) 2024.1 → 2024.2 () - * [pyzmq](https://pypi.org/project/pyzmq) 26.2.0 → 26.2.1 () - * [qtawesome](https://pypi.org/project/qtawesome) 1.3.1 → 1.4.0 () - * [qtconsole](https://pypi.org/project/qtconsole) 5.5.2 → 5.6.1 () - * [quart](https://pypi.org/project/quart) 0.19.4 → 0.20.0 () - * [rtree](https://pypi.org/project/rtree) 1.1.0 → 1.3.0 () - * [rx](https://pypi.org/project/rx) 3.1.1 → 3.2.0 () - * [scikit-image](https://pypi.org/project/scikit-image) 0.25.0 → 0.25.2 () - * [scipy](https://pypi.org/project/scipy) 1.15.1 → 1.15.2 () - * [send2trash](https://pypi.org/project/send2trash) 1.8.2 → 1.8.3 () - * [setuptools](https://pypi.org/project/setuptools) 75.6.0 → 75.8.2 () - * [simpy](https://pypi.org/project/simpy) 4.0.1 → 4.1.1 () - * [spyder](https://pypi.org/project/spyder) 5.5.6 → 6.0.5 () - * [spyder-kernels](https://pypi.org/project/spyder-kernels) 2.5.2 → 3.0.3 () - * [sqlalchemy](https://pypi.org/project/sqlalchemy) 2.0.35 → 2.0.38 () - * [starlette](https://pypi.org/project/starlette) 0.41.3 → 0.45.3 () - * [streamlit](https://pypi.org/project/streamlit) 1.41.1 → 1.44.0 () - * [tomli-w](https://pypi.org/project/tomli-w) 1.1.0 → 1.2.0 () - * [trio](https://pypi.org/project/trio) 0.28.0 → 0.29.0 () - * [twine](https://pypi.org/project/twine) 6.0.1 → 6.1.0 () - * [widgetsnbextension](https://pypi.org/project/widgetsnbextension) 4.0.13 → 4.0.14 () - * [winpython](https://pypi.org/project/winpython) 13.1.20250222 → 15.3.20250425 () - * [xarray](https://pypi.org/project/xarray) 2025.1.1 → 2025.3.0 () - * [yt-dlp](https://pypi.org/project/yt-dlp) 2023.7.6 → 2025.2.19 () + * [pytz](https://pypi.org/project/pytz) 2024.1 → 2024.2 (World timezone definitions, modern and historical) + * [pyzmq](https://pypi.org/project/pyzmq) 26.2.0 → 26.2.1 (Python bindings for 0MQ) + * [qtawesome](https://pypi.org/project/qtawesome) 1.3.1 → 1.4.0 (FontAwesome icons in PyQt and PySide applications) + * [qtconsole](https://pypi.org/project/qtconsole) 5.5.2 → 5.6.1 (Jupyter Qt console) + * [quart](https://pypi.org/project/quart) 0.19.4 → 0.20.0 (A Python ASGI web framework with the same API as Flask) + * [rtree](https://pypi.org/project/rtree) 1.1.0 → 1.3.0 (R-Tree spatial index for Python GIS) + * [rx](https://pypi.org/project/rx) 3.1.1 → 3.2.0 (Reactive Extensions (Rx) for Python) + * [scikit-image](https://pypi.org/project/scikit-image) 0.25.0 → 0.25.2 (Image processing in Python) + * [scipy](https://pypi.org/project/scipy) 1.15.1 → 1.15.2 (Fundamental algorithms for scientific computing in Python) + * [send2trash](https://pypi.org/project/send2trash) 1.8.2 → 1.8.3 (Send file to trash natively under Mac OS X, Windows and Linux) + * [setuptools](https://pypi.org/project/setuptools) 75.6.0 → 75.8.2 (Easily download, build, install, upgrade, and uninstall Python packages) + * [simpy](https://pypi.org/project/simpy) 4.0.1 → 4.1.1 (Event discrete, process based simulation for Python.) + * [spyder](https://pypi.org/project/spyder) 5.5.6 → 6.0.5 (The Scientific Python Development Environment) + * [spyder-kernels](https://pypi.org/project/spyder-kernels) 2.5.2 → 3.0.3 (Jupyter kernels for Spyder's console) + * [sqlalchemy](https://pypi.org/project/sqlalchemy) 2.0.35 → 2.0.38 (Database Abstraction Library) + * [starlette](https://pypi.org/project/starlette) 0.41.3 → 0.45.3 (The little ASGI library that shines.) + * [streamlit](https://pypi.org/project/streamlit) 1.41.1 → 1.44.0 (A faster way to build and share data apps) + * [tomli-w](https://pypi.org/project/tomli-w) 1.1.0 → 1.2.0 (A lil' TOML writer) + * [trio](https://pypi.org/project/trio) 0.28.0 → 0.29.0 (A friendly Python library for async concurrency and I/O) + * [twine](https://pypi.org/project/twine) 6.0.1 → 6.1.0 (Collection of utilities for publishing packages on PyPI) + * [widgetsnbextension](https://pypi.org/project/widgetsnbextension) 4.0.13 → 4.0.14 (Jupyter interactive widgets for Jupyter Notebook) + * [winpython](https://pypi.org/project/winpython) 13.1.20250222 → 15.3.20250425 (WinPython distribution tools, including WPPM) + * [xarray](https://pypi.org/project/xarray) 2025.1.1 → 2025.3.0 (N-D labeled arrays and datasets in Python) + * [yt-dlp](https://pypi.org/project/yt-dlp) 2023.7.6 → 2025.2.19 (A feature-rich command-line audio/video downloader) Removed packages: From 48fcd2eed4063f92e6f25ec659d3ba250d4b9f22 Mon Sep 17 00:00:00 2001 From: stonebig Date: Wed, 7 May 2025 22:36:29 +0200 Subject: [PATCH 186/305] move tools and packages markdown off make.py --- make.py | 39 ++------------------------------------- winpython/__init__.py | 2 +- winpython/utils.py | 20 ++++++++++++++++++++ winpython/wppm.py | 12 ++++++++---- 4 files changed, 31 insertions(+), 42 deletions(-) diff --git a/make.py b/make.py index ed896854..773660d8 100644 --- a/make.py +++ b/make.py @@ -102,9 +102,6 @@ def _get_python_zip_file(self) -> Path: @property def package_index_markdown(self) -> str: """Generates a Markdown formatted package index page.""" - installed_tools_markdown = self._get_installed_tools_markdown() - installed_packages_markdown = self._get_installed_packages_markdown() - return f"""## WinPython {self.winpyver2 + self.flavor} The following packages are included in WinPython-{self.architecture_bits}bit v{self.winpyver2 + self.flavor} {self.release_level}. @@ -115,49 +112,17 @@ def package_index_markdown(self) -> str: Name | Version | Description -----|---------|------------ -{installed_tools_markdown} +{utils.get_installed_tools_markdown(utils.get_python_executable(self.python_executable_directory))} ### Python packages Name | Version | Description -----|---------|------------ -[Python](http://www.python.org/) | {self.python_full_version} | Python programming language with standard library -{installed_packages_markdown} +{self.distribution.get_installed_packages_markdown()} """ - def _get_installed_tools_markdown(self) -> str: - """Generates Markdown for installed tools section in package index.""" - tool_lines = [] - - if (nodejs_path := self.winpython_directory / NODEJS_RELATIVE_PATH).exists(): - version = utils.exec_shell_cmd("node -v", nodejs_path).splitlines()[0] - tool_lines.append(f"[Nodejs](https://nodejs.org) | {version} | xa JavaScript runtime built on Chrome's V8 JavaScript engine") - version = utils.exec_shell_cmd("npm -v", nodejs_path).splitlines()[0] - tool_lines.append(f"[npmjs](https://www.npmjs.com) | {version} | a package manager for JavaScript") - - if (pandoc_exe := self.winpython_directory / "t" / "pandoc.exe").exists(): - version = utils.exec_shell_cmd("pandoc -v", pandoc_exe.parent).splitlines()[0].split(" ")[-1] - tool_lines.append(f"[Pandoc](https://pandoc.org) | {version} | an universal document converter") - - if vscode_exe := (self.winpython_directory / "t" / "VSCode" / "Code.exe").exists(): - version = utils.getFileProperties(str(vscode_exe))["FileVersion"] - tool_lines.append(f"[VSCode](https://code.visualstudio.com) | {version} | a source-code editor developed by Microsoft") - - return "\n".join(tool_lines) - - def _get_installed_packages_markdown(self) -> str: - """Generates Markdown for installed packages section in package index.""" - if not self.distribution: - return "" # Distribution not initialized yet. - self.installed_packages = self.distribution.get_installed_packages(update=True) - package_lines = [ - f"[{pkg.name}]({pkg.url}) | {pkg.version} | {pkg.description}" - for pkg in sorted(self.installed_packages, key=lambda p: p.name.lower()) - ] - return "\n".join(package_lines) - @property def winpython_version_name(self) -> str: """Returns the full WinPython version string.""" diff --git a/winpython/__init__.py b/winpython/__init__.py index 32bccb82..b865bf4c 100644 --- a/winpython/__init__.py +++ b/winpython/__init__.py @@ -28,6 +28,6 @@ OTHER DEALINGS IN THE SOFTWARE. """ -__version__ = '15.3.20250425' +__version__ = '15.4.20250507' __license__ = __doc__ __project_url__ = 'http://winpython.github.io/' diff --git a/winpython/utils.py b/winpython/utils.py index 98a2b1f0..40961ec1 100644 --- a/winpython/utils.py +++ b/winpython/utils.py @@ -43,6 +43,26 @@ def get_site_packages_path(path=None): pypy_site_packages = base_dir / 'site-packages' # For PyPy return str(pypy_site_packages if pypy_site_packages.is_dir() else site_packages) +def get_installed_tools_markdown(path=None)-> str: + """Generates Markdown for installed tools section in package index.""" + tool_lines = [] + python_exe = Path(get_python_executable(path)) + version = exec_shell_cmd(f'powershell (Get-Item {python_exe}).VersionInfo.FileVersion', python_exe.parent).splitlines()[0] + tool_lines.append(f"[Python](http://www.python.org/) | {version} | Python programming language with standard library") + if (node_exe := python_exe.parent.parent / "n" / "node.exe").exists(): + version = exec_shell_cmd(f'powershell (Get-Item {node_exe}).VersionInfo.FileVersion', node_exe.parent).splitlines()[0] + tool_lines.append(f"[Nodejs](https://nodejs.org) | {version} | a JavaScript runtime built on Chrome's V8 JavaScript engine") + + if (pandoc_exe := python_exe.parent.parent / "t" / "pandoc.exe").exists(): + version = exec_shell_cmd("pandoc -v", pandoc_exe.parent).splitlines()[0].split(" ")[-1] + tool_lines.append(f"[Pandoc](https://pandoc.org) | {version} | an universal document converter") + + if (vscode_exe := python_exe.parent.parent / "t" / "VSCode" / "Code.exe").exists(): + version = exec_shell_cmd(f'powershell (Get-Item {vscode_exe}).VersionInfo.FileVersion', vscode_exe.parent).splitlines()[0] + tool_lines.append(f"[VSCode](https://code.visualstudio.com) | {version} | a source-code editor developed by Microsoft") + return "\n".join(tool_lines) + + def onerror(function, path, excinfo): """Error handler for `shutil.rmtree`.""" if not os.access(path, os.W_OK): diff --git a/winpython/wppm.py b/winpython/wppm.py index 34e3c9da..e24ca6c2 100644 --- a/winpython/wppm.py +++ b/winpython/wppm.py @@ -74,17 +74,21 @@ def create_file(self, package, name, dstdir, contents): def get_installed_packages(self, update: bool = False) -> list[Package]: """Return installed packages.""" - - # Include package installed via pip (not via WPPM) if str(Path(sys.executable).parent) == self.target: self.pip = piptree.PipData() else: self.pip = piptree.PipData(utils.get_python_executable(self.target)) pip_list = self.pip.pip_list(full=True) - - # return a list of package objects return [Package(f"{i[0].replace('-', '_').lower()}-{i[1]}-py3-none-any.whl", suggested_summary=i[2]) for i in pip_list] + def get_installed_packages_markdown(self) -> str: + """Generates Markdown for installed packages section in package index.""" + package_lines = [ + f"[{pkg.name}]({pkg.url}) | {pkg.version} | {pkg.description}" + for pkg in sorted(self.get_installed_packages(), key=lambda p: p.name.lower()) + ] + return "\n".join(package_lines) + def find_package(self, name: str) -> Package | None: """Find installed package by name.""" for pack in self.get_installed_packages(): From 6f7ef36e6ea763b46ac792ec89df7e8a47a8a97f Mon Sep 17 00:00:00 2001 From: stonebig Date: Thu, 8 May 2025 08:37:52 +0200 Subject: [PATCH 187/305] preparing launcher improvement attempt --- portable/build_my_launchers.bat | 9 +- .../IDLE (Python GUI).exe | Bin 0 -> 119296 bytes .../launchers_final_original/Jupyter Lab.exe | Bin 0 -> 150528 bytes .../Jupyter Notebook.exe | Bin 0 -> 150528 bytes .../launchers_final_original/Spyder reset.exe | Bin 0 -> 134144 bytes portable/launchers_final_original/Spyder.exe | Bin 0 -> 201728 bytes portable/launchers_final_original/VS Code.exe | Bin 0 -> 190464 bytes .../WinPython Command Prompt.exe | Bin 0 -> 148480 bytes .../WinPython Control Panel.exe | Bin 0 -> 150528 bytes .../WinPython Interpreter.exe | Bin 0 -> 135680 bytes .../WinPython Powershell Prompt.exe | Bin 0 -> 134144 bytes portable/launchers_src_original/LICENSE | 63 +++++++++++ .../build_one_launcher.bat | 107 ++++++++++++++++++ .../launcher_template_CONSOLE.cpp | 75 ++++++++++++ .../launcher_template_WINDOWS.cpp | 75 ++++++++++++ 15 files changed, 327 insertions(+), 2 deletions(-) create mode 100644 portable/launchers_final_original/IDLE (Python GUI).exe create mode 100644 portable/launchers_final_original/Jupyter Lab.exe create mode 100644 portable/launchers_final_original/Jupyter Notebook.exe create mode 100644 portable/launchers_final_original/Spyder reset.exe create mode 100644 portable/launchers_final_original/Spyder.exe create mode 100644 portable/launchers_final_original/VS Code.exe create mode 100644 portable/launchers_final_original/WinPython Command Prompt.exe create mode 100644 portable/launchers_final_original/WinPython Control Panel.exe create mode 100644 portable/launchers_final_original/WinPython Interpreter.exe create mode 100644 portable/launchers_final_original/WinPython Powershell Prompt.exe create mode 100644 portable/launchers_src_original/LICENSE create mode 100644 portable/launchers_src_original/build_one_launcher.bat create mode 100644 portable/launchers_src_original/launcher_template_CONSOLE.cpp create mode 100644 portable/launchers_src_original/launcher_template_WINDOWS.cpp diff --git a/portable/build_my_launchers.bat b/portable/build_my_launchers.bat index 04c4671e..35fa6e65 100644 --- a/portable/build_my_launchers.bat +++ b/portable/build_my_launchers.bat @@ -7,12 +7,17 @@ set VCVARS_PATH="C:\Program Files (x86)\Microsoft Visual Studio\2022\BuildTools\ rem pick the right ones and rename them in launchers_final set do_launcher=%~dp0launchers_src\build_one_launcher.bat +set do_launcher_original=%~dp0launchers_src_original\build_one_launcher.bat ::WINDOWS launchers -call %do_launcher% "powershell.ico" "cmd_ps.bat" "WinPython Powershell Prompt" WINDOWS +call %do_launcher% "python.ico" "winidle.bat" "IDLE (Python GUI)" WINDOWS +echo displace this pause if you want to re-build more pause -call %do_launcher% "python.ico" "winidle.bat" "IDLE (Python GUI)" WINDOWS +exit + + +call %do_launcher% "powershell.ico" "cmd_ps.bat" "WinPython Powershell Prompt" WINDOWS call %do_launcher% "spyder.ico" "winspyder.bat" "Spyder" WINDOWS call %do_launcher% "spyder_reset.ico" "spyder_reset.bat" "Spyder reset" WINDOWS call %do_launcher% "code.ico" "winvscode.bat" "VS Code" WINDOWS diff --git a/portable/launchers_final_original/IDLE (Python GUI).exe b/portable/launchers_final_original/IDLE (Python GUI).exe new file mode 100644 index 0000000000000000000000000000000000000000..c1e0c9dc452c9d6f29f91bfd398b6e1403291494 GIT binary patch literal 119296 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
    a+K$4q#O?#%;kWiMh!b z_nHJ4>T&BNz^}}WdrAzJiKj~Isoqx2h`UzX;m11<7iGu?cj>9JN_xao{T@5GHOJ*t}iCHc(xZ;7YP-JU9D?F^p+OW{fs?!vEEYZ!2jF1ucbNO-?RF?0rT=RdFk_6dd2m~ zQ0(s%bLpWW+f1^LvZCgP42Yaf1L_19m$4P{E=jmpQy%lTte-vst5aj}it@IBSl5Y)csEBn%B{FoR(HExp`x7bB`p!`l( zVkSS=qR(ed_?t3!GsQQULm7P8p4kB3Hs2ayvjw_h{W}wrhZI8<(u4E~Lt4x{hSk}b zm^tK|oUGB8`RL(G*%0FhVQ_b;B1oY51O7lBPEarg00RkkgBp8uN>>jSrFmQ~B~!Oq zNU_$9FW6Jt=;C+i_faJ1&WBm){@t$&1*UwV@@h&u`FZ1LyEd~!9gIpk=aR`>!bphi z&-p`%eJv-kP4v8I+vuR?c%Ir&F*H*SPA!IQK#L1B8nhuZVGR zMUN3~IF=UHem?o(M4aEq+O>hV5AmvfV?pY{Hh1jM^k}kWdWtP0dirHX?kal}XW<$N}GLp<2zClZ#~Dq|qoVb2$nKNr4Tg?m(_GSQTyPOblwNcQNF zoOtmxRsx1|@}9;s2?Q%ojSpf{cpA%y%}$<@5=9A~4wh}S{&hhcUMdZXip1eAJ{s=s zZ}>ULK^?JCZ!rI=I?}-y07dIy1F3pOs)(N|a%O>NMd9qEV-*S1#g!kHYi!OTUT=}> zm2I9CTtIMnX{9*=V8ZAsABC_UafR3r?>;jW`24O@^+*xk-c9^)bNgyBi^2aW3NPEU z=}>xg7+~g`N1Ms*9)Zqz-wRgWW{*_@CY{jNg;XOf0NJt}^n$L46OI7UwIcK7J+dA= zO`;n%-w+GldUnlIsV+56ra|)bU8p>)fv-D~3zoZ|)~Dnq^xS%LJ}D|RxW_8|)vbFK znw;%vu;Vg)a(zdib9_BzMjiNenFp;h%Xc4MM&v_T(q8j;+M3v{JoaDXriwzam^FZ{v;(7grvNI=W@y z<4Mxz_j*PD&>ksY7uk=>cpAp6gD%e!;go6u-z=Cl**NEnhz>)2C=%Ge(B~ON7eoZ( z$W+F=D=bq-^Gw+jaqvB}-~(# zHj3j_HRW5D(_TOn4GJyIAJnJCa!w4fLKS{*g7o|D({sJu9~&Lzuu=II�jE_dCk} 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 literal 0 HcmV?d00001 diff --git a/portable/launchers_final_original/Jupyter Lab.exe b/portable/launchers_final_original/Jupyter Lab.exe new file mode 100644 index 0000000000000000000000000000000000000000..98bb8bde1e2eb892eff87091b02f875179517de6 GIT binary patch literal 150528 zcmeF4dwf*I+4y&}S+YRFS(IQ9kX55bQ*1P%i2>P#4V;Bt4GM}EBsPll^%h|lQWZ?x zL|G2oV%666)oL$RTl@C4twkJahiH7y4=!+;-!F>u&MYTzBiOw?%#5y1};~cB}8(xB7yYT;{vww(D;=J1=ig zVFvU;l{gEIUECYR^QXHl1xD&|6GphhMr29y5!nGdLB|PlOst- z;}cHDcu90R9c9aSZg)DK?_Z!k%TY(8RhH8+O3HoBKkssl}_}9wiHy4#DJM{kiv#AF?^yF6Qu!Ci@x6 z-S29F%L-{F`#qJ{IriR%k%7r7$V zMB|F)i<5=l3>ZTPtjnR{&F$Tx~ZXE$lIq zxel}8kdWnqS!ObDhFQ^K-1|RNF|BsBY9P<1W~1>3l98-E!;Jr9pP87_ojParAjzuO zZ5oqy_k)<6?lddf7vE;OHpQMatph2Kx?O-+ouS0}p~SWH>Mzrhqi&(HBa)cs4O^|I zwN)MJa5%!r?1`rJDm^My9lVlEB=+wShTv=d`M| z5r<=odI~b!qRxfQZrLJ8Dwt*C+h_i%2cIEpH^?`wkHZx&8TWlo2f`rIG~=J=EG{$? zS9(p?8`7P&K!Ko9-9R5IOS|R;6X%t7*cfRw6L%H*&3JnbAIyrE7ESCw^gc|^?8W4F zfh3r`nY98Yqj#FgIkx&l*QL1HO7X5%XEbkZfu8Ga z>UsF1V7|n(+5}5;j~W1wOfwlS^rFH7{ zrX4jnMoNE*n0GfLQ;)lk@!gss6VikzGMjdqM&^%Ov(o@`AuQ{ z7Ywgqe?79!wA`Qmm{FE)FcVF+EYr%;cLS@lAw@I!P&JRzP3io>EJ|k57+Se6oVcNr z|J`P?Nxp{KnuTf2GsXmYNjJ}%QeNnXS=x13Ec?^|8e3^5=j=1%OS*GRV=5_YNvGMA zHX65px4?@Kl%vvWgYhOK)#~*9(ste$8C5cW6c1xeBjtEL=bRU)Xj?ehSk=5S=&lyB z$TBNlj{U<-UXnKLuE6DBeJwDp$pPazhpv!Qf0w)35xX*6(Hgxb6jxcPcaL4e7~^-$ zV=#7mYxJ}x-4A|AFOBEC^UA%^d^6shWyU+4G1ygWbclxbTDZ71w4*zflR<}#E5C8Y zrcaE!BUPb_?yxbb%}mbf#Q~{g#IN4}jES&jK_d{;`Ms26MLzbg9`+h~|)cZ`B;jQ$`%oyHCl`%BZ8BV%WUkL7W8xA%6kj8(+0sawG#?*)-oj(GV zC*I8r+z#%a@*0ib=1G^1D6}6Xx2ZXn%QV~%3Od4+v4`f%46P)vdJGdofqfL9zE7RN zklKQUwew}dgl2+;b#!kT{~zZ6Q~Y1e|MqnNb0p^c2F`fHGo`xRY%>uooKMGnbhS*n zN-7yF)cK~QYNdoOAnXQL;W2s zFLmZxAzRZ57tT)SkD^8DoGGMdL*(4H1l5vkG+M7xkkJa{mo&BpJBcN)H6iMu3{ts_KCT*S3U)eWoP4BEm`KRF8p(HOLBy)@ zMXWoELe@J-wKbR-E7c$L-~Zt+{Omd}GvN*jdD_CHgAogV*TSTSzh>m!qkMycw5&tq zW#rwB%qlQSG>krZr|ZJl_iPLn76DHL<~2P4f`z_bD6n@Cn?4&%htNik*epS89@Pg~ zCtvNuJBIGVgZ(QbbG7`icGwc*CZVrn{%mX#J7XR#_LIpe!?ZT5eDH$yalE8&AuX!N zd$veG|4By&sP{y5QrEGFw{(0iXq?69>XdVIk0dm=Se*#~!rT|3O0_VB4YLN%?^tYKc$n(Vbq4-ZdQ(CIRw zgN;=@xXSXxQ2o5jFBP(|SeaiaKJ; z=$i`x7)7l^Z9*GFS-SQ}`DQBvef-+2$UE~vrz7SyTUxyH4z{GzF=wmUvdP`+tD4Wms4*yc$ndACNasj;x2nF>;m{=# z1*+bS9ormTs1~C+LVLgAp+=&ws=fT7;^wKEnO>^j)o36v)v(sQwNmH?X=1mecFCV# z@`pNeXOMn@G?3luM`(#^g?yfl<_=>XU=zw3vK;Co{$^-H{hTz4hLD5k5Na{y)um)w z?ULDXCvc^#tsg`Sz1jk@2YV;$xe?3ae1`5nx68jQiavA}nag)udCPz9bi@xijYcti znl{CzwYe9PrHL<@|KO*3=(BjJ*>six4qA=!;^^4J9~MKYU0{?H*frhZXmgLFHgn@h zdHk!Kx~=7#)ogI7a_FvU?Kb0Oj_66EssCDcEP5PlK9H=+D&1sSu5|uW|D^0YTCuas z4wJG=?XnQ`VD;OJDUnBOsOaj-OXOLgLOjE0fz~d|qyF3leePCY(jthSbmCEl=0RMewLIVf`mWrQhSBSflAmJKCyTkZLnOP^NS$(bZs-`7!k zCC{Pq)bnyY1Jx6<0NT^*8Yw6G=T6ZJlKJbJdYH$Vxy)F{L3*v%w=6gaSY*ZzKb8?~ zPUqiCBAvfdzqYR(nC%b(@Lg@DPivICL>OH#zQ1e@3ygAgiIle&PlbAg zsWh!1D=*=G=}~E2((z^%ynB|sTkhY=BjFxHaVhC1eJWXP?nD3WbV##p?oUVwO|-ec z%%oOB?+){(W?34al4rJMJ7wPc@~ymERtn&7wy!4>HlFuzPbL+w>0&0+pbG45C~MXF z@frcFK(L?`de02AC^O9aJM}OJ>c@>lHkXc0U|0W}0oJE;&-l9k5-YAcR z`vQu$xkvNY9@`0|?6IAkN%eGB#x{aHYbF*(VwjWHUkjy2GCkJ3S=O9SmYbjXOXsio zNcyo3t%KS#u?ekh(04ljSCY^CoNLCfFD&C5ii!!~sxV8KG2*U3pA3u7AzWC*S`e`5 z{5v$bYfz%%8~ob5@n3d%Uu)C#=RZhmrD@ucCaYo8>HP9cd*yxY&6oD7``X(m?V*76 zZ*LIQ(rxi{)?L5TEnce)Pfgo@usPhxH<(uTX(bxnrYGe_J&z76ZSFLU-{l1#gIRxg zuFa^Pai$Jt_!o>NXQO*8U!B_SQQMA}l^M%Ew>dRToekIJWnk$h^(OhL_n*NI(1OqA z+4U3t`4c9{+7r7GR<-!Q)R}fqikjYt6*4D#`KltYaX6@#_kYOy1pOX8n-)q%X>!6= za3`cuoZSCI0SI9g4|$a*uP^f0=uYt0sXKuDU&C^CsCin}fCCJ{merA~(89{y_x}xH zRA<)YZ6LwQZjguT<%V+c#m45Y9!#Zq<$;3O%y98~$eQGFwS+607qGC`7p30BfNI)lV<~<|p<{{QYY=!Hz%xsu zxuDg?(egd&cz9XqPDpHU;~TLY^S=C5vaW?=WXjY}c$yr?@;%Y)#+|WT^)e`eIp2h{ zvS+}3yeK~5UJ4^W_r!A4FJN$@-s}RqwPdTDOYF8xBe+XcGu?`<$EbCpCmq~9viacd zbh|x~Ld*rTOlv<#M5S}jTtUy)o%^#l$Ns38X{l(9Ma}pPqDn@*>HMu?FIttTBbA-$ z{MEc!&E`3h{)L@RMhfir74lwLK($V@WuMP1C0$zCX_mH_Yv=|4fOIM^rF~7&)KpuUXO~yj^ozOPgD_Xr%_#WVOTZaPVZKJ7wU+_L2vXX}>rBv4y_ zMSg4VQ)KgdG;78^h3X%60^?GMxwN_5{S=KF4>n8rZ{r@8=auq|pLRQ7co+Gt4SN6Q z0BP9Y3;|kuGOX_hDb4z_tnTKsBxB0YXY05Ih8 zHTLTD#J*|PnBz@XduF}*`qpcHd`%-=8nP%izDD?}!+5A?vDy4SnTPTvwD2Kr%Z$!t z`>d=H_^TQ!Y8KwIFE%QEXF+ysxOJH?dC$JjZvIESJ8Mxs4kiDOaA0YDSnG4Rtkkt$ zz$MV{=X#Xb6r|O>$WgG9qYvH!1tuqS@<<(rsw4v%fZUhqjJJBsiZ>T@*oro*ajs2E zcE6INH`{eL994Jxzo_dK=XU`P^~>#b>lI_%_*u|u30gY?4F|q`>kXkmL+7p08*UC- zn}b$o=_b8wjGt8w-p4+9hs2-5zh@L#5Rvst1pE>kJI^ONWYm6>yi)qvNdCS6KLCZb$ zM@~l|-tG)0+~Y~6a>y$sf#V=xeOzhnskC+k;)iqYx*?DZ7jO5pxkDs{KP22!Nd>xE ze9<}ac3+#jgjW^_AI>JVhRwb0bbC1I;HjJF&zE%2BX1R(V(01x)?c_jb~0rS+zWE@ z4)WJexi=D{J4jOcbsni43hW?Zto_Fc3v*3lZ6{`=`$cjBVEFij(|SSq1J=s{ROE0t&4WA4Q}dcM?7XEsn2<$-&G=g{nu)wyZGdm*FT^CM z^wG|~;};I(G43+H(1~jb%UD#}!i;b52Cik(VvFXx`+r8~9)j-*e-*lhxbG?~uVH`zfT5W z{8Y!r$z*24s=d!5{nm;mI_2y1_C=rjff48j(a~L5-YD#2AYM#h(68ADSwGzJn)jff zX5pefv+0fKDWV?wv~BU@ztfE5cey+D6=PC-A;oh?q}X-YST!jAmNCtEq4AuO;ZDb-z-hS`7u#!k}Qg*Nm{XAC9*R1GO!NfFgW%;0}8LBzXbiMjDt(e8zgVv>A1a`e& z$qW@+S=O{{GkK|}q7C@zmdc8k7o<|d64SjYLz|SZoS7OxKN6F?wBppg_t?FE@TlIe z4_H-S?0P?O8H?Z=HUf%qwA@_CZeO#^1hdQB33V;cDnv`Mbut`AP{lxPXGHVx8c{cw zg}|@^@lB|&B-FZ7h4QrCt%+zyDB+Zf(IElLq(T;Tpz(nrd!Oj*{6^JgLKE3%#+kKD zNQbQM$9TX_L{2Ud3{p>IoT4 zvZfXwUSPT-%@*Y&arbdeo2=KZ14eL<0M!7QY)^W9X1a%FrhBM8-OY@b=?*8RdJik|n)fQhyR06_WL1;J zdaYk+zt$Q<6Y|AOG)N8&eKAVjD!&H{zJ%vvW=-YXaH8^m!&c>OygzBIs=S+LTgWnT zANzeF*ECPWHOWJ{8_9n!WKHr5AHk)|JR(C5BaR@4 z2;~BaK!18TRzWGYOHr^tLHx^tJrohY!^6J2Zlus?9Ldzf5Ip~;U%k!!KkHX0S(V)j zRrf71Lk3>h$GDCd4vb54$BR%QM!$Wte3`C!m)q|E${C%g<)Pb%Jqq1co zlEO?3RS%%0m=&{UFC46vNzyWBr^G>+nC?-FB_lC=cAsn4_IqY@@I&fyUAb;{Y@C{| zD_6}HG0BeGRcOhdMUl+AL>vxJeW1?j1tuaId5b>&Uz4=%Ewb(ax6&vZtWs8M1LcGO|_+^y+x^U)gdw6tCXLqcdLp zE)8_VtCb^Oy`P*bJsbVI0bS)$cl5Mj%_&p2WB{w{C1G7srnybnx`belsUG%Cd=8kt z%dD;83uko8V9jWfMqb zysbmsEIJeh!WDs;y&*S#w33K*h@Ej{aoBoatt=$=#JbTFu`UQ%bIT&d|LmHQJuhJ0 zZ5mCuD;W~%g_&Sqpkphq);3}=tdFeV=In4qr*Y3}$qR1w$V>cbUgCFc_BxEl$L(aU zGdhybxgqP-kZXfxd+F`O&@B5N-72}4Pf9(sK^xLTY-LBh zWlxih!RZWW6UKBk1JlZF4Y{_chY^cGYlwU$A0&mWSFB;JA#18X(K85wdRcg^KrgJVrXmE{SW?q~6gc$dfl2?!vo4 zlrK6_WMXslJnLma3}`Vc)PgZmhQz|*QrcV2|JYzj=90{f=A_pLDz-1!QgM7tq9W4G zg4Jf~$H%uiqFyVzmAbJp0zY;}>V)J}Cu0pHrkX(k@jGY4wIPt+&W^9;3RH9(_sn7l z8Y@B%e(0eDdMJY)NWWtT2L-MXx{$T;ms5KEddI0>XX%$5H4uEH_Gi3$Qm%1RY>?W; zXZ0Z!G9N@&sdzamo8yFF1O~#1mU}MD^~MG<2x=U_Gc&RogO9eFHbrk-HWLygz@wpD z&+}#R?_hAVi{=|E;sSenG4vQH5sm!*?pjm!m6jS_Cs_u*(NKO*JB}=@tIn}kr ztjRK6EpZm?UBkmQXn!@AdO}w2z;I3Wpops_bNzNP1@*v?~(^yUc`h9c)3vd@Wc*R3wSKx2YRx(+T{?M!j&N@~2_L=Ruc z>^=G76ZY0&=EriNe9;`z`4ibQvhp^O%eKuBNWzT2oR;9O_0bz;lH7!@rRG?9Pf|ji z&v)`JURzJyK;l*bJbsg70=tjJ7qI?4qI6rRG}Zo*n5q?f+@2* z{vA=~b{dVppCX?IP+3O4{Y<7eTV3mD=1QaXKrj@`JLHDGNj+K?;2=L z&NW?t>g<}FT^~I+&^5pt{f23|T{u022I1gELLZE#v4l!yQ&22%@s?IKlsh=r-3gyoj z`Ew$FR;pq0S9sA;G?0lkI3$6(Zv@I`XD?xR2U0l!tCqPsSG9kcPRErqIv!V0>_+@9 z4D8|}^(Y&vVXL!zZUJlTdiHzGnz?j;cK}DBC><2?BfpoJT|JTEHegs-HM-M*5&;*pz5&oo5E(@0S5GTIB9y(?UB9dGXI; zW3gA6Oa7*?PPl2qe(}$;LVmh{6{0Q9+OYMNS{9!o|j7DXmG900a+ z-e^JrbcloAXj)6kn%t{15QeAGb7zUeX!;3B<)I&Dyv~Q-xxmGHw`MuBed;5fm|i9W zb%w3^MQY$b)9H-+|0M1HFX#t(F>XwO+W1|8@_VTquOk#l~v@@Yw@!?@QkpPIx)O@v;jnB;(ZDh!E1LB62XrV2g;^WMl)Y@oKxGZyal%rllY z)2_Qw!#qlp`i^86oxGJ5L(Gb;BHduZVQm zx|m(sS<5ng_la@x&LDwA%-_2b`*%HnZWb1NhzTGXvWz~M5@L9Om)QqMDdHk`t6L5T zMNh|WYev1A0lQc)YIv=h+4F(Spf%o$uvmJbx`^DcHJP3EeG(~9Yu0$euD2L7=E|Sd zc{uKIgPvo?`IH?}${+iulybA<$oXgYI9j;`+jyji&2ZA*q?mn`9A!HrZaU zW34Zf07q-{a_E9&6^@d}rCV%(39d=`F(#Ht76w~oyN-L5H@qR>T|LHn30q6*BiL|g z9z`#v(;2UUi7!(-x0bIs(zg}Cw}lGd<23kp<$8P>Ut5kS%K5IJ^%(3->1uk5sS8hhoD>GIrob=*t3y#?g{d~ULeP3bcy`eG(^FC^ zUgvd0uacd~3$c4qXw}asWR}nNMuQC(Y2AN(!$sN_I8T$RHqQZxsTKrT*f3kA9Xnjs zMq54OWX&|OaYl!PbRrI63%Mw#@g>Z_y}5kR@wKczim+rMH^Q_jxl)aNUoZ8QUs>w) z6@>W4p8*M0<+5-x@8Rc(4rj%;(|)y#Q9L0R;#^CC_Onyt_D z>={|~AF|?D9L==;Nlfd*zI(7^r@D1_%GfUeLdsQy*4e!jG076X#c#G@uq ztwDi=S;%s&PPc>-eh+K2x+3zFanF3MLZGFxa8|trjv6)y9Url9RKqtR`(xT57<#_a zH+1Od`|N3#Uzu$*ip)1_ZqHV4?-vHu9(HXt8s8ujMba>97H6wXd_X}RAPVYc>yxr8 zQN%^QcIDJZ2X$3Cytcke`Jw7jDT@YFGd0_Eb&BTxNhS|%zLLClv*P3E^zymHld9Td z6qdX&CGoy{!#FsSQ@r8gX57A$j8(%N#V->AlWxW={{Y=88;iXBnXJZ2N7UVw<6(P6 zv~-fr=m?V8lFVkGqj3PCF*#B9I#4Acg6`Fl$S8wf6TSKse^}-?l%S7bUG^10pT}r) z0t)nb)X(9PVXHap+GsS2RbZp~k&V8TM&D*>Ke;%&YXB&utDsOgPSXcq ziJcDoJX5=6oGK{bC=QVnbA+i*jm;-P(*lMErq0zD2<$$65pl z)}D|>7;?LfRW;5FYrXj+!NBu{%@io@3ama8wj5YLIHc+En zyuAM!7j@-VQr*_*jV1}`0jkev{2jfcwO9>XBtDdN*$T?S5C~fBa$;iz5zf*o4(ggK zn4Evv)PgT|eHg6RY9!}U34I%I1P-cn4qD+^WXVv2L2G(h0PlmbqMWS%0IF<<1}oZ) z)-HmiiMSO7yibW=_ovl&_spzp=`;bHaF48*O9AYJ-j8VMM2} zEhW8C2}=MAeF zf?nGCyaTmyYx;0&0(~L+h<0nT5pdmE@JH?6_XA=Xd-gwS&fe5vTX=@|-*oJ&8%oFQf2LSJA$ZJU>|kYt;0%Od2xJBlp+Xs| zY)|*@$=Jt6PHRK``O3MIk96RsyZL3AN|;y%Lp^6&R_lCyK=M(Y1c`D$5_#EUC<||T zSg>Xt%2+PG;K{!z+(%aUQ!wNXLdIkSi^8Z2pKg|C})c>M!;cC{_d71jD z{pQnDWm=1?%*3;WN&}zkXA`_cKFkkWcSCAZO?jy$F<%mO*3`O$P2$$nGE%Z0paV5@ zFg(%}z-%;Y}s4TnYYu!*BK!q_UC-i@7`*(o|JzLXt= zLTgH|H(>DzriHJ`sa5OfAiMdyXKA% z6vW&dHcJSqR&Jz}xWkA~V&{7D@6u`5fXx?(FCs$KW(I6cc!JAeyHy0cgy0iw-gdP( zqi6K3wqtJJq9l&eYG+qVR&)rl8w9vy)KDJ)vi}nRg<8YR3MVhk23*naN&?HV2dg}% zv;e^q^^f<)yrG&wA+3x0J)wkI(i%KvQ=tA3LRGYsP)$~d$^r)E6ervy%ybs3-_!9B zpQ&GhW!n>_bHq4wl#bsF5JR);eb;(vRzUQ?k6j}biG(3EOo#YH8#73y!5gpv-_e)VNiR@b1yNW)9tk8O;-Wv*7 z-4Uxr-H5lr+Kr3CqoPz!)YU;(+D}OZ;ywHLlC3q#Iwb~YHMZ-!*Jf;2dsSD8BDGt4 z+ut%1D+=rBge>mrAb(7i^_Gw{+(w_^+N>^y;8A6hi%hW?>jLqM9C-3N|K8)ti)S%h z>mu8ewIE$K9*5Z~w#KV>aJ!-)sA*oXFwp*HU-zswVzXx1RZ zT*Gbp5c&7pbXtPBY;l0vaD(ssK((jJm!Ym@GkPy)nl= ziFqrjv|fT=C0FSB>TgKUm3?(=H9%AVv=5NhSh$j>FtoC;?3Rkc6|T6eaJF&p*(7B{ z9)&@|tNsd>#6Qa`J5PppA(Ho5?a4KY=o{fejfIa3OuNcv^)wYY#TPE_wyP!e2;iA) z9ETZ%6b{HO4rpX*fOu28nY19=`F@Fk#gHckDdV%_Wh*axP;!@UYT6VuD%)kQ{W{{R z9ze;dS%JiWWPoT}=c3`EnoXu_NMN;4viQb+;X#cUCpu2GX?X#(Hy2`#4FXzc*vj^% zJo5sQbgj?STq8A=1WL=`=c~W$#ZxvCECog7$Ab(Vg{@x{O4C8%#~nYyU{#O6ku#f| z_mk9{oGUc*7d!UDHe3`%&lYx435F{4-OrwFRloNMOYODCV3znd`dr%jgcXjO4!toW zyYZFhvj13quJK(77*J#ABM$hGRap|Qsm=|>H)MxhZ!1q7xe;<;B47@sfiH%m%S3j8N*g3Q2trRLjvio z(hA`2{!_{oc+Q#LSV0WfirZ!AP)Su_IS1Nq7Nm0{M~|JPMM$gKFvj*-^^Vso<1Nq} zqx1u@I?r5MMReVH(vO-;Fb6lr?{a24q9fJGeOYGBHO_41l?+#_=02Rt#eKH+1~y@D z*(d#so}7M(^*XHLn|J-5O-{{m=oEA;@ok#-unGDedzuKcJAN&i#EvjwzW*))3lBmf zEB=!H8+Aysfkb==oTj~>^5C@~b!qo}z) zgw2uOhrA_Fl6_Ssx{_O8*w+tRe+?zBE{G(i`(Os%BlmNBB7gnoeo%RCS12*rQ_2-G zZ&jiwNt9hJ13g?`zI1Y>RpSj*e8K5WtJD8SXQ1NC*nqIr9pL<9;|Ec9C8rNhlvT|% zZdR{C=Mo#Tgm`6^Q);7Jw1QtR8)+LY^cY^3F%+Nobhv};9c4@n%Y(9EeRB{hmM@C-%)%lylAcSSi_)!T`Bcy1cT-~n)*i!~V;3*4@+=zF zulW8ir8qIf>CI;O#T3V%;)=Ix!uAX8nDm{)m7)V3`LFN%ubuz(?;^C2BQpyNf-FOC zsI5f=bBCMdtg9XkT;36f<8Vqr;}>qBheRKodV|?}qAj8I`3lp!V1QX+dKTrZ$phFc zXZD;UC%`+If5W%sltDATn*Zki%WEGuU?00-*DRKyY4@#sPPcMGWx*~T9WV$8Iyyka zdM1v<8f{W4HJU(+6Qua&46t_MBv75wd1sQ#`L;K8%s{U`(BC)G7kA~880ZP8%(H{*i<8rI^IT4GvZ8HJVx| zlDa8kJ%6yfP=YAffI{y_2&D7hdJZrs5Ad(0>HM2`i+5iU8yiec&Y={@@ofPae;B2a zF&r%E+MIvvt2c!^hUo7l(%<_Ub=zkArR-3}exvDTR!8K%XLY~9urNX4fU|{Qs*fOc z7IiC72KI*n{s*$i()q=-hObu!A zbdd(s56)JNm&nNyF*W8;OReQwrmior+}sn8TI8n6skMvEmdClBq&GhcsXB5&-06!^!X~F#i6382xcu<-^ z6LF}ErK@bfYuJN>*2Z-HHo7O^Z|nunoN^RdN8i{h-TwRa>;2z-m-r;xStOdC@B}|X z0=r%9WK%7@U470&;zf|l$gkr9s|CyIkCGcF0_yAQf8VaZuBW8klOxL?1$FL`Wu?ZE zRoyxAj00=Z8yPrYR->(Qg5>HI%Zv2>HwozAZj5J2a!U=>N2leZ}y z%asc^auB+YY!t-W=NwTapZF6>O7f9H!4{ssUay}%FvLNl8?KkLnKsS$`l6Y;669To zYr({+-=RK&$H|B%5G}u&btP%8k3!CKzD$IYPy0~i5{z{I&Ob>1^|b;w_xZgMe_<bDt1Tsu5{>M~Gc(-w>A z`a+*5|C;Y|p85jOB;#_lUTE*D-%rrrkE$eV!lu>C!PC)ruo+y=8t{cI3}}OO?Frlr z5J;L%bt`K+oQ7agBUZHZCxpyYJCCu6j3LOEIJiPvQl=_MOsTyKRJZe5;JpWD~?8A1H*iN!C6c5RB3VqxSx0{~m^`)aJ^%*mQ ztvKzrx9mdkGq?)P$uvW%JEL3&d145k1*Sm##8YAhioJi;DSqR@mpCPux*(L!5#=do zdCoGInQk>+xPWYHtEw&43+K3_zVneQNur~G5_`s9f7lltz~6zfUkH$a8z-k7DZp&w zvXN4GdNJM?%^p8cHZ|Lp=cGQC>_3qmVfQd6lsHK`7fNRr>X3GJJKdB^H!nBp z4_y=eXZ@j5VkM31V+GRcpt4JxocN>L150<3!5}v7P$@5G^=W;;M%OirfDXe$_e=B9 zDHMu%Xn(@^fzfi1F;K)9LXJ-k=ddgXcPaM9{s!b?#3~gm>4VzCm_05aG`^pVcx!Jw!Gzv82<}} zw3r9ChbmeYjS9IoX{@NLP84w=(H8BbU>g0nO@?QP^(Wpl`=)|Yw&*^VFwe`NgC5&d zeL{d>a_(>rX(tFKv_9_`$5-|0SU@I6Ps7uexoywd1$$a_nzS_T0k-SR#ORyl!Jys# zvWsFaw!9InrkPmc4|8{%2w0z(6^SJ#gMxfQFjgXg@VRR`v}WP9-ljg$c9_<{IVVnM z))Dx{!01pXZyo;yW-m@=Bc`~n0r13g^*~n#xw?-t(M}GgSNfT8&hgUWg!>KtmTpRY zn-GmM+DA9qtR6cR{jL)}O?-T$Og#u}(S-S`mXYS7%!&FcHFP|dWBG-0_Yvk~y2UIn zi~Tc^cb|r-p(XO~;YH2p2clA^IR;1k33i~~0PeG2Z7&89F%z6r)cg0QTJR0>1E0pR>>J+Cfx7L5q!Hh@L&@56zHz29Xx5SPqjT-PV`+J`*CTP zwH1{muzYx`u>P|N97u4Qa&rXC2XZ5{AW(K5XM?#Rk>G>CaxXV(>}Kq1F_Ijr^MsyG zMsF5R!14jCqq!!L-DdhFDxS@u;`B@7Cq&0-%9NPTKj|vnA{S57!KfH7?doo<&(cjS zMKhF`7>c)fR32jpyFN`lE#nUAiC2fH3&*fNVXPl$INEF?oK%b^Z9es&xK*FFleizT z%+v`4vk31cMxsI^LnGdlGZ1@F>E+IkcJ*TcnYYlPa};B@5h8ps zgQ>0Rf#JQ#z2s;Rr8~nGNBvP6u>)96>RJF$`*c}Qn^i7^0@O_c0c6?(GMW~$VmhuB z9z~ho@Ui1!UTmGJNY2exz$hU&^GV{T9-h_J0f$(Cvr%+W)Z>O}L+yhdsWIg%tZ5T}u3mpP9wP zzj147TaNXq+47MKJ;pSqe#wkSPwcy%Vh@_TzMdkz(X2Sg#h!Zg9i=VwCq3>B-XrIL zMrL3PO6NZW42DDit-j_W^-hn{aRlv!#h%dg8`5gJHApodr&Y&o>Ubz{C0B>JNc3C( zz5B%V6WXtY#~Mv?FiUgW``k~G!%DC`5@!!KAFGrjAfmQd`47mqitSwUSGwNZ)t*te z)A=c!D@@o1KBsVzJ7amgZRJhfo};_siWAa!Jf`w>f|q38g*=q_zR9}Q&bmah?$t9q z*(1e=Y;>Om2-f6e??xVsnhnGt&UM*9ENyN$B&US*y)vTr1|j?c?aH*pSQR&6fW2uF zZur0xw94F1=)DM~6sLB-i%<&tE;0N zvb>P2!o{*#>8ce51eG?6)sYS zw}Y4s@z>^ep@It%&ZiJK7$a5{+d(=%o$tt?#v^b}{iU=ZpW%%7EZ&e7HQvRZd5F^` zt!u?hD&53w23Axp-Lr3D_mq1UQGg&BVN5E>f_0)Y6i`&EH z?kRwa9fvX;D&1}-@-N_3uR(PkG$U|IcXphjfeLR(HaNJU_gCqO+&^_3_lY-ivT@LT zd3&G`xJ$m8Ih3mu956A5>LB8OwWKsSS_&YkFO3e#>?N)r zFKxSIC8u7q47GszLJa;RJi?h3c#HG_|Gad2bvEOOB&T~L$;lolyeyQwtbnIKl;lkC z)xsQYzSZMLQ@bFFpjH1Ara6{D{o7exuaDd$9)a`GM9bv@Az%FStZ2SE#oLRq=h&G+ zQl&-*xC|wg9nd$!Xb`EKc;1Q-7)u7^LMQFY#m3pnnST3R9IJg%zIu)EWUzlz2A1c( zyr(FILTdB(r2A2+MDzpgLbg0RE+8rMBY5sbv9Fhpb)yDg0&ml{KHi+c>cSz^?61mv zZQbX4>b9}Wblt<`e6=qA7_O1X?3ra^7-4^#;R&p`!cj7FS~(z}Bb zoe)ay-cWMXVQ%I}riY5T+@>XmTW4JKiMC&nW$neG0ug^=K24?dR0^#210j_BjwfKX zb4yKJ)+gtD=@z4F)(dneTS~(JDXzy`+_Ib^ISkk=#Vh176X#Hw61Pi<9uR!rW|kt^ zK=K`c%fGDWYp}SP>Vf6$f;DhwdBgy?(%ZXLVv7FOt2Jc;B{RBKuWzcyjMa+U$M$U5 zeu!-vC+>GHVt8^ayW1?S&?4+=4}A)i?v{3wQ&~LSUmEv`^rIMYzmy4c+RjQ5ZLP1C znuR!KA0hfth=7$uDMBxu|K;O?aQD3cH!ZF&v4x{IYz-nB!h`uuS?GYWk&12DoE0xc zpV8;TAt;3spZb{@=O7PC<~B7Bq6F53HZ1TEmZ&wh)JRCATqeaWR2g>B&yAMB3hRe0 zu4LX6yq_I6Fcf=lZ#rI<{jiJ4M378Yu#f^Rm*67`9^!+CRKY{MJZG!t(0N#<+Fyp) z&xRM^kO+9qawi(-sNB+9$tmqoN$SrRBO-#OsayUT<=v8m%qj#u@_ zP%G~?tY7fZX|y=Sy@lA!yM`>7{#e0A#byrREr!=(Oa{sC0VVySXh@Ww+49-St0Zm4 zPaDU>p@MeaxAE$ccc#uOvGeBGc@Z8CHA?d0r`t})~0ZA%jD(Rp1?9^DBXhX$Hl(y zJF%RIN8dxuXQZaMK~o!aztwd5B5e;^qXqX0Uc21?Q^Boa(X%p6*oXgHYb`mM>w;{b zz}kF=!;cd-OLY*Wqjz^yoa3B~tK%jb>5(bI*7cphzKwwbM#^T*?Q&>6>Snt)<&95p zUINNud4|{B8PK<44oF?B?nmaD2{x+nVJ}-rcg+NHeAzOc;yeeo;qWPfI1XoA;Z+ye zX{$j*?o(M@($}7q&@UUO7O_M?P z7}lY5d-PH;d9i7KjJ*?DSD*P8TAMy>|4U{MIxUUNn9$9i#m&MGD**5u?B5fLE6*YW z$&e+Up;KEzO|8*wtYC9wGbX)WZ!)t5WXbOm(2wKiRb<76P*=j|xFbqAV}Iw9@!X)| z7JGl-7_vG%K+9^d2G?p3Ty>@$NbF_g+c-db=!tbdM*Up7KGz{(U8-LqHpOt6c2w=J z*A=!v%IFGOYRSyV{?|ZtZ3a%(e+;M5hGUN-q34_xa8f@`a2zb_ta4!i?Obaf6$6K! zKCYLN%(XpEe}*kqnTg15*x~LBYxJ#!;?U0Fi_~x=DupFxzGFRLNhB(}wbqxY6a#|B z+`@L?nu!_06)*X%AXMOac>8G?-*`)`6za3{HKit}P10}4Sw-^_%fyh7SCVXb!$Bei z`fL30$EoH}r=w@Xw+Xn`CJe1c3e^2%G8&8(Sx;c$#Gc=AQRp7P+pHD|UbR}-GhPt` ziZSzFK;=LFKUkJWj8wk#jBsC~@?A}>>tQmitJC#7QP~RBsu6uJvz5>X4mtT!tJQ(PPJd5lROC%ShDA?cLcbv*3hEgww;jaX zYQZX$H?}Rs&41gJ0Y)f3Ul^x#P%OzA^v*o^rZAaPH%8%^nhW-_K=mck zx5xI)+kz`uhA>j?EENd5wLFp`M3AuEJbExOv!yvDs-SCr2GoRW0@ zpKLsUb{qE(umw)>{ea5g{?!L1DG2YGfPTV9>nF*)u?$)L8K-i>eKA0VTI81HeB~9B z5_urkQj3E<)zPDU*gAuicaoI1@A#m8JTH&;9xbfL2chGI{yy~>@j@%?O%vjUy2Pv` zUTBDp7n1f0X|E?@$gF80HmIJ}@)N+2Y?n9`M#h@U*t(;i1%i$xx|1UPV~IX_Kw^m= z;`5QQM7=Pl^}&3Rvb`|1XYbIy#p7Xj+8W1B+YMF*;ZlI`P7`W5>usGLfo4~X`aqmx z>CSY1Ct!qZ|D4KG?Tn*M|7ad+yXKB|ynEgQzsAtAb_Cfls2CJ2PB(MLCEh)D!GUDp zgLwDQ#RFF7QMI+9CCDsj7e@Thkbp6zxiw$~Te6SjH*D+H2q%)s0!`mL7i46!e_NO+ zQ`6)_a`a;Iq*Fv;&i1iR7XubAgr*H!Oxb$a$bN99_QIj-ncrRbT-5bUJE!)1_v!EU zT!h&Q!Px}U8-f5&PTFT4{Df`f1(QR@|JuKm!NSVm@&!(>(WfH8B|I_c==-dH1zeBH&MyHlX7if9JmZ>NWc|QR_I=_~R^z;NZSqRzMoz8#Zeim7~ zx)W(89+->|17GVxZRapW6)zh(DP>m` ziM*QTRWVvwHn+%3%%uu9aU|yYI)=bk%SOazndMg%#HRF>l?xInt3#aB3PE{dDx7h% z+#0^~;LiBlxyFMnYz#lxylg5EFDZ~6SnG9tkrtW_KeAPj`iblt;4Z=?v`r}MWUNf_}Cno!~+w+d2AxF@Y3T=DUu$z^kO-!Jj1HGHB!)04U9 zt1o4SkM2&$2yQ*HKX#;=bVm0htovcv5gEE42{d!Frd@&sqA~$#4qIK~6JuVODum}3 zUQ{LFnX(;HqAz;-b|8bTnyL zmlT*49g8OQ&B3_LIILIH9TLlQ^c1jWUO9RSzNIPKo&w#i3@wzD?vx-S-K8L1x>9#Z z&&9WooQv7^TrdrKr|ho6`OJmio(o393c$GU9}=uB{OVE`6pMUkY`FS6owav^@BFKn zfE|y6e0`4RLi9Pg$`eIaejKeidO36qnmJbl>d}i%94XL+O_$ zmyIuC)3bOxX^yy7MOZ7W%)z*WB_=hliK22gitTnbm3L1|WS)+UvYxE+?I%nARrF8XaR4x!L zK@ual_s70ONRam0g*MW5GlEF*;c5JgClepGUWr&6)SAr4bsD3Wc!J3~PuN;aEYnt_ z=~2lnzaUl|u>O)Xvz18`r7)%(wMsW;2u)04uiFQ+0`pV7sawLu7xV^Q+%43^^@NN0 z{T^d_@*C%y)~g)2Rqe&Vg+fnZYHrq$HmmD-zFlCznj8^!-t9^8O9gbRXPcS=x9;iDKYjg|WAZnJ!qbR+ED@d6a({Lvf?jUvX!4;4 zM&zcKkIi*X4+Hm6fFIj9WqH;&zBzvE;z8Vg(#&P@tqZ*3bKay^B9pW+wl}yuD^TBk zVT=nSr{F-?9?g$f_CAc1{D=lSE(dy`UVW3x%IdqvF3t^QfIZ_};PNkTGmBqi6+UjJ zSrkj2>cU1{@{GhMmXKH-8TkQ^=J2WS!voq;W3SYnIQBFGFLrz>XSnNfiPb6NE+-ML z!NQXG<6_i)$z2_(3zc!Y7VIOBQNUiPso}@?#C1NfpT}hYC$Z_zLVE@Vv%RUAP|6~G zD%vzExm0eG=x{+|#bk|(Hhe<=v40{wyt@OX5!`ZIAyRx^q0j_+2XJa-h*grRV}SMi zU&jBHjPhX>`#>7S$J#f#`S$3lju_oJr}d5Qr~>^*cho06x|z~}$QNprzM*4DeG{(r zZ8EC*^0Q+@mj|4JY#xur(yQ9-{~m!|z?OCFATWc~eIZU;+p zwTPH;7bci*Jv+j#@*re=WP@l=PEK$^|7R?V16)Z}{F)Fr(a}#(+upEH_hPoBhSV>4 z*kJ>nCV&O#t9VuFm$W;?(Bg8FbIF%|nWT`e9C-Tj`%>_c!ev6+4I6~S`wl#b(cN(c z>!!!{?sql-+Xj{42vu!_s9&ySS25RDp`l%chIW;&Lqf!6Gj56>iuQ`Q} z36HH@6j*!oHI6v;MGJtekEsQS1|&+rdn|mj2I>+mY|4FF37F0mH)<7s(85g7!dQ)q z28jl+k~UISk1}-(NiJYTkgwEW5#-Td^;4*h6yiFxB!d$M$~FJ`2UTjthtsfMe%Kr~ zvFo%RHc<~L6CjPlBCy&`TF$!E@_QtxDfE6=I)B-{y7x)04B#ru$H9pNom5kha09tv zl>z&O{)5Ez$|izjRB@%ue21#nC#Qp`BCG9%?az(n^IKzF`!!V-gD*q+sd7~gwrTLh zGT4Bs#J_W_i%4lW>58mU9zeej6<3|vX|}=GH5IBxeM)nUMu|!|G()Pp5Ile(b6r4 zbZe$`D+Qu5-KyUy3za)41!qHT7im_U%@TrG?A)Z=!ATmnk;JJrP)%h>y7$PQOtpKo ziPRRBgN8&(Fo_Kz^Sp;IMi8v{&%OI^v%njvd$Let|S^*ntl> z!hQ1NpMMz}*5-b)H~TwevjcZR{PQnjsDRLDn>&&DYR%5=B{qmW{!=Y|v@ghS|0V+@ z?m3d*_{`*$P|3%Cl6ix>1+ABmY{gMrIMC?QTz<0wIp7+Vq{GN@% zS}}_cFV7yMBTCKq2hP|5Gx^;Sz*#F}Se{+J%qd}ovW0TM#sk_@nP^Xbv?n?HOn+GG z@_RKVDnY$y6I>gEN1C<%-pMqeRf1aWI^AQ1vKtP`dNdl@z;eh6;$TBvTo$0wD7UCc zmswFSNb}2_>1JB5*tpZJHlwVG-f#E}*6r=soDNj@Zf=*n_N2iJ!S z3cSn1?%PuNU0K{2An(5AE8MqHogW+9v}{E|0ZADd=7Jgj&>3q>O)lN3k(8X~BoO8? z0^xn}?h%Uz)rSWcc$1TSspA5@@94h!E!sF~S3d+W-ju&0&=IL6asiWOVSx&Nw!VsZ zH59m}h%u{SS|Je+tI>!T6SP&9ti^9jVlyW?WHmCRyZ-O^N66JKtc^>aHFp!rU3DZR zb{kQ$1305j=E{s+YAAiOx<%nSP2Eq|Y|bJ-L&JFF9!Aj&?4T*X{KUKjWfPBx%_$wv z?8^1qoWYaSn~hWKo-r%}eVg+Z0qz1%_CPD~>6i(7PmdbbGFj_Qc|SXyn50H%4tkT_ z>j)nI$}-a215nwSoa{z3QnF`((aKi0`YlV2E*XsxZIe?JR+z|p8adl>Az8M(vDav3 zlYpgs$a0s{P?O#yB$zI~MqK||ANr9@KP7--D$e_Kmq`hR`Wj@Jt2PHF+Hg;u-ATV%o7yV{cA94&t|WrU*%Td)qO4?uqD z8&(Z~@AN6_^tvYelMIqY7LYDg>10>|>fc#ey) z=PtDw;3zV*x>C^{J6qVcnfQsYp~STX^AgvN5@v2Z*Q$BBaBvKYB^cEmZ&OW}BNWZ~ z%M7dyOri*>iwiOW{lr`0Syr~=aPsd>9 zt$g(DczcbePiYB?>o|DyxF+2qYUIWU=h`@wIumjTydcaZoE+s3wY-xZaczc01-@|tdokUi0l_&z4kaF~Xn$Sm3^&z;9MVj|C92y5DF7_oG{#=2k z)ID%>T6Ir94E0PTbcsKabIT(>#8e{xmeQ7$=?5O_DuFf>uyr7h3 zQ>SN|;!M?SUL9lK436jLJsh+~oo!?lLec+xWkYBT67DD^VuW z(PS@1M5Vt{WEr~AT)O+@9dHH)mD!Gwg?;jeCzkq(Z(qLY&yd*j*bLxSY z^QOeQ%;b4fxDz6a*YjiV%C#_MX7MNT#2>aX%iM989-!?6$-z0SZyLpmvt1}je8bV{ zCXU|wxeO+=PkXk8K@AOq%5rbDgw)#F(GRIeEp+FDAr79nbX?yy<$!J4FZOOFHuaA0 zNT3?F(0otLEWfKA+#fzPYeAcAU6QpU?$55fsII3_QRen2?GO%S4rr zTS7X@A=Pm=+Yq8JgscG(>+g|be${EO(BFBuAoU$8+tgp#^2eZMLAwI=%XxgCr803gK~yIFd}WgUBoOdR(u@i%e}2>01=v$p^O zV%Yi=m;2TF;)Dj9B~r z-*^4re_j7Sxptm?uk(8LIzH=JYk9{QxI+b#HEspt=7l2wdQ;SXjHV?2n7OOw>iS~y zNO8_FwHguH**F#_V`-r|MhtP*AK_v2ZhY;ltuv7a6bTIZcKh7e;)5P5&YH7NaSj)0 z?n1+$_9p!mIS8tFwsqc!uc^e@{+Ye6J5og&Ldby0JU}e(3Iy@dT|&? zxni!@iIZFJ#$_lxzsZ}fMlN|c=k!@tTs0kr8o2N(yfy$ky98vKv(2 z_q@#;90Tyxpa+YQGMPGrcL0wZpa+3>(_W&S~tE~)0Mj>B|97`DLW^n zrnpvJqGqDlc3gi1dG^&l*AX7ug)f5-g_$Gg#%h+VCdkMmSvNWIVf7%q z`AL-^EN0>37QD>MY%qHJTLY7V2ntU5KW7>5%Ue+dBdeZK#b(yF(V^z+dRv1IV5n^#Fq6*0c$7gqapT_=Jl_KqtZ2;G z1HSm+`PN!=11Jwz;=x|O=EbSOfo7655?UB7uBM~|ctNueY~6y{qr=KXh>(}B_Ezl0 z85LWzSx>iOYp}PqyBD-5aHdHjX8B5+;&1in8MV7#{5yBQQtsH_$J7m{x8m)UyBF6N z489qOX!t(rGOla67GXh$oZCEGPa)2+Er|2zQBQY%9K?TtySuYPzH6-4w{k=h=f4oG z)u5bxzP<(f{O4?em^2hj-2yReD44Vbf?@1031uYW!!QhQpctO9-D8kdiEQq2kk8gt zcnvu1opvY&{8p%-E(%HXnkMElf#awA8CE~-*190I&?7&BfJ$n4rR@S zL1q-Rb=8g zro`u2^1KP}VY*YCkB0AN%(V)}wV|&vt{c}1f}LsQZu4_*pdiE#P;knp&Ve3_vy8D( z%j}DL!0uoQeIvZ)4rIR>b5o2{ysgK3;X9)J!31q!3k7sdp1s+td#&>9&BtP&7t5>c z)B<0``F}_81(Oc(1vVJ)4o7{xBg7c`F2~d7m*;IC<=Cs@Wyr(^s)!?eKNn5wSj_)D z2eL7NgElG-X@iXAKz?H<7T6s-JqPlan=hkp8U!J#F9lmsPE&wF8M$C2HScj~gO}S? z`l9~{Wjqa28D~2o%z{|&018RGzc(Xr1ux-YTqF6O92~BUyt|MN)I_v4NpnzI*zxy8 z!RWQil}Y2!POjSqP9+#CbCoOACWR$-D3M+%k-FX0^>yHWl=1y&zki1|8TC8WdLQ4< zdI=%^B~Cjjgp<{xktXAAwzkx<8h4Q5RWr4K&0LDQbHp3SDnK)a53~HF19P!@G;&CZ z)=!7bkQ=)x;Inl(p-_n>i8N=1+UfawC0Uu`gvlUn@?&k14U<%DvRs=$){qvjO=`7C zK1{j?s&H=6CN7wKu1%(B6SS^rA8L~^+N2sLhqcLt+N2I9mNv=ICW~S6o;FEPCT1fF z01WqP!_UDYuW2f2M?uzntI4GpA#qxpGd~Y*$uApD~RJyuIf5h)eNq|Iv4w=Ii=ik^HAbj%; zYdM1UHc!dNE9ZsH{v`8F;5w^XS(xo`iRHkXHOfQTXr6x3nnGxrEfP##9!m0j(?@{06>f z>i3O&Pu1^S1hE|IJzTxO-&;{VKE*wJuQL{0ybHmg`s|nt;=RqP!f=+2CjjaOTW8nw z@TEV2Ps@4FY@WC2mU3^CzZ#3Tb*SV2m4d1@dWRP(+8*1o6E5=!f`wh+Q<}2sC3b{5mi{d{zr}uGBuT_Hu4Xvcrd$c}VoD;eP zOe-g%Ty=TR+3g+H=9}upU;-6)(IwDGFuVn=ShL>@pZpoPg}lr9bSiR_gOrd3=s#X320A2RvpM#kiL$H{j(s_SF%Ex! z>ss|)Oom|Hc|w(TotLnSkx?$@o>VRvs5LOkJXyU5>}*eBWaAN8GWoE)ldXXD;hV}Y z7~pum5eD9zSFCnzrq(e4TQy`b)?f8I^KSi~&YS;&;hW=cnvr*5`6cON=riKv!!B-b zSDG>dn5Q)BPUW?qRZkjN2HrxNd>wd;o`^1ztTJT-U8cY;r&{285@k;suyDVK+B>WB zVz|`pF$AqiW0xZ#5M-xsMp7Kufwg=lUP3L~I9pwYy=RCbPq*96Nd_IG9fkWdP2~{1 zXqxq*;_{2u>u)f1k@g-(QYQTajG_B}T8geiZ?i*3I?$G=e)6Y?o;rVBo;aL287ZBK zFu>d^Ts&=TmronpUrOWX68gh5DWNEjs)W)>iY}rUlj$NVW>Q8m7*b`_x*S|kjhJfk zRd-^&OTkI=W;Q^2EyGND6H%;eqwr`5D!+fEKB4Xrtl6%`R?Lm~t9q$ji#6v-=|E6 zP{Nc0AE%gWPOW{B>kS!)6A?I8kFbrk2&bKn-irb3YHTvanK^G6E53(P#AJgdTRYi- zl@x3@R=iD~sq-L@cD(@aD*pus^c9qyzlCjy`P9+%YTE-uBld}quT(0=q5bh+7s{9c z#1kRMH4qN{GrpnR4p44ee3xR+ z=}uTb<3jfI4%VE#tFfWEUGK-Aa{q&hrNLZ;^D8(EZpO=lcmZd((39FFtoG8Lm~#Jf z%CY{8rJR44aTZq2(i0YsW4xuuy{N2MAZi37ww#NAFyW}fJJ>ZJ#NzFu%-bMzI^JEa zsKvVaLXx`@iQhaNhkb?XGwLaVdK3aEb&TahctJS70?8AF{f)#u#dHqPd>I~bJNiNwv)ftG`8p?~XE3Hb(INw^*+JonCAleG@7=9}tt zL+GG#Yb>UrYxFt+$02xM1t)mTrgBxzx7S0Ksi~jpkcFr$Zk7A5twjor6Pag=4 zi{BWu!9aWS@FtKX_+e{WPL5ZT<8{bf>8!|^bI3?bGt!MkA@ccgyn{c@i;#R{&UU~XkF*CQBYAB@J9Bkl9OibyCwLMZlkSK+uB zPLd8MSBG-}!|C(QaDEyU&Q&U$==O(aeEtiwU<}KeGfpl4t$-CcksGj_#~97 zC1YZ{`D`@B%}K52u(!Z4GU?0^++l=#Y;WM;`A58uQN)w1_lxUtio3E$Vb9Bfv*3fe zzIFtF2nN~lpPlptiZrqkG?vr_JjG=gkbyS=r zfG^?y2eygDgK;{&k$Gs;*Z?e3QDeY30pmd|U@@Sbv-lAZP{9E?4=F5@px+)kc~HnZ zxmyiX1`qifB~;G8e2w4swHKiqb_x2=o`V#8L;K7WHh158X37Kh=!xTuv^yALQ(CgV=3&6_%l+4g?W8jaiFu0K8ZTe*~?gQFRhNp`Fxlbq7!sj zt9P*n=R%u5lLAF*!@?Y29lJF2Whxk;q1>c7D70=p$ZOAneQ=F1JG>U~xRn>j)BgZ# z40t6PdoTYH=zjVlJ11I|~8i)1g ze>7Z)D+eG^j&x~xMS;p>I7s$SwbFK=k#+HO3f?p2w7$mr%q~|t8b;;dQpDH~Vrg${ zM`BSzAsNwILB$9zo@R4uHrN{|Pe$@v(t{X?CcSUetrW=yfq*$E_gLkYp?1yV>*( zG+SG(v<-2-Yt7cI1ngl+I@;RePcfc3*tb406d$}2RWH2}^F!=}hqq+YJ#eoD=R-8K zKEelq))j}s6OwW8W^d5UKr%|2Vf`NUM^|rYgjCz2(#CTlQ4z{<(J>BHLF%UCh+(8| z@b!aGOe&JbgA_MkrdEgYd8YabRcw{$m?NDtnf#$q$5qKLm}@$zPN&*%W(w3ZKXI10LbDP4gn1Jlte1pAv42I3kCeAc9{K*hkX z?Rix6;3GWdMu+If1QTPl&Qvsk>Ruf*4?|TLeGvv`?=Pxv4|!QH$je~KgZtFw1@yLU z&y#VTdy&O&S-U`oX(qWL_Z+?ddA7jt-&<*B29uyBP`t}q(WX{Jo086jBWoMJ1lCTQ zk_Hjwq8xe03{Jtjf0TAM?kmVyIhXvo?ebF?SP9x?2i|e;CAi@C;<%pX%MFYVFmdXF z6r`y6+Pv@r<2gt9#gjI|Jw_r=a^8)}Q0s|a#Z8x?X6)cnRdZ?!1o`dI@oB?Xkw$5Z}4Gcdr0JT+pI-a?Ovy?-_g4+A~(tmb0}#L1tcrGp zii8Zr^rl*`yu*3Av66Ccs~6VGA@|Yh2A$(r44QIR_UGc=X=hwK_ilG5Z*8~hThetD z4`TE<277Mw*)S`UCj1NBN!EAuM(sro`#DLGbBrHD``JTTT9hBO!jw^AP4i}~q)PYx z#cz>pREY%K4u|rh79lY%(()6ihL@r_LDAcD1cZu|E3(pI0zrz}#D^P#cH_zx2uL!l zq)4E@K%kxZsL|8{`M6}|hrWZ}z=?R{-YoVLO%G*x8EVtxSuRDN%F0*txvV_U;-=@a zvPqlo4B>#{Q^g6#S?MwDt%{s~!@Dwe73J(GItEdA85ZeICL5eSKtA*J!pbSlmt9>=BHvH2hY;Z}dW40?>BS17N|vz-5(X6VnmyR$``jKUK<7+;|Ghz6 zo`>!1?;+mF&6nk%MGj>gp2q0!xd5OLAUWi}WIh)c)>OiT$He%zdtyQYg<$wC7wq zx5s?v<9=~?Hio#E-*55%F0{C+)_Mz$EF4^v@E*qg4H?J>DzgeSO9%Q<@H|+8gNq=9 z30w9SOU3^$igHe2Icg#L3^>rA;$y5ztZZ5KK99A-CFg79#!cv;4IVWTSZrqlt9FIXo~epK0~w1@SKJClZ@EMZSuDWD$6+w%-9S1n{! zz*+3?l%Oh(WPQZHS8=JF|L;&ML8nZ$l0LuYCAz2rm@z^e$Bsd*>-yd(X0nc*HVD~{)Pp|`^{ zB;-%`qMDTVeiK(sJ1YbQ-qKDi?1T`T_1fQ%Li7lZ&KWSF3>|~Bq}g9E-)L$u zB*O`M<_lQFcjCl`hDAF)iB2f4w9w%0uGR6uA;u=`DEuVB*whl}=xuB&9_Tb4!vR>W ztMKMt9fxft?*@mUV7ETQJ_Rqk0|&7K+Ddrs{T0&^o&F)HWreGg3n2)2o9#3dLCNwb zZU)N(+slymmSCs#z^zL63C&{o7d3b09a+tnKXx_G3x6MD=MzOaC(t4z#l}thaphy^ zh*670xbA+78q5{<6>mrGFd*sRC3A7Xa+3Jq43dQ44J3)dDI`fj4@s}!IFjDMD@c-q zqe%J$vq@5dLrMAu&n8I?oI`!QQ>aK<29qUu%`|Rtr1x(cp&hTsv;e z@b@Zgo^d!hun=1DTeqacT~Q7s->q)rM>s&FHD{|E_aEK=3e3$l_pMTCe>rpzAs>%p z@Nu0_sh}H<#}meP{$5}LVM6Cm1>!b6WUTXkfhuW9!Mk93ycex{1#9`G) zZrWXlQ#x0EjP&5^+=PqzYPW(x+cbmxm!rEVGTT^PFrC0=sac(~P54AAVUCCP%kuJ zwxMmkw-s#+p0#*>hUZ~CzsK`9p18 z;@OR-9nV{M-ox_|9*p@r$q!YZIn{D0@tr6(UkWt~87J-fIp!WM!E%mM4^bp{nB6tz zj!tX)pV_ceZJ>E-D6k~i0d>z1D$$8WDd@$HdXmpdRLX%~)GYJ0z`-~i-UkP#Rnmtz zfEwAD2F}{{O??AQU~h3j-vG1OrKM;pulNKhSNaCY-ilkwabhS=mVi2e1!>yK{r5l{ z1jQIQPiyK(1V$*^zJ-KhU}sl{0aOs$#^J#a{^H(o;b z`P_vx6#6i@I~5Foz!}^{CteA&Y+5+2%U;$Q^OyHf=lB)A9@RXK`k>}?H3x2n3BNL$-qd6G-NmTfMu*M;r;Cl4HQGG8eY#rp* zIR05}n1Of&QXXsc&F42m+TazQxVZJJ*_v4bWWtfP#08*jC%=E zM2E5Bt_(IfyE_wrn2(nnNg&2bnVu+C)zIxXWY4&9+O(JvfHFrm5Z6nIspcmDeyO z3-OF{o48hd>6M;UORoVvgy#!9$MDd+H_Q!d1Z3AJPOm&mam1LiRR17P{?Y?f@hRLT ziNhLu@CxfAsBI%RXMMvO*+x==1HWN`6GpJH^Gxpc>i&xs1F&c1iciTd>&ZuT#EkO{ zHyQRf#hXtC89*_IfgX%N6oqr6Q@u{@j*L_kW`;Z+=LXZ}mx>P`gD-a917*G3y~Tt1y?q4X7Ns z^AagH4sk8P4mZ#@avk*=S`?c3FKnM=u)T+0&2*C#XLtfFbFxPr@ zBjZSAxlw7#V@jYr^YVI?!vhqVeU8YHTg=_kzJQ>Tvtx4?RorJFR(6$paWwMj*8(7H z&u&-3_5^PQN&|$1tyE7hhCWj_#!XQ1ZypG~+KTE~R?=RUE2ugrBJk1sQ3TGj(vV1W zGNFtO0>!RjQ55kvd&zq2V%XP1f6JXdG+_&7{vdKse_tJkwioxP+&iU{6U2 z&d@6S0(yHd=OM6;YYNTIk_4-`sqjFt`Eha6{6819{tL{!tYxyf;$X+lILBnu)0GWB zPlqyI1hd!}AjM6Ef3Vj7o=ikvgo&1?>6V|l&HYWc{1T!S^ZHb``65{6YMTBSgiA)? zeRL0qz6d9HksnQkhgKWz=h+Nl(ZSJMoB@t@xWq?`mlh3eMPSo=d@jiu+hlj8tfM!3>d%K6L&REohW$o z?oSF=es)g=txE7M6R?o|mh}`iUm?r%*_?F$s89%+R~?L6`<}RJ=9gE~FBePDZr}1e z^1BO*D9^j84mEw3I}l1#pBP6RhFYLl>Or4)6KV`5SRrG@TgZ%?KF#@m#_dPmgkznY z(?O0*^`)G*CL4c$DxZ16E-4-lTCml4;6tzy%dd#+6-Lsu^eu#qC|`kKp?UgSR9KHWY&shp%otcyd)CZnqo1 z3dRVo_o~9=;1KJFuVH$)2`5!ojTz`&nu{+|RPdD%_-|GE-qPo^=#qS>6GaVY8=T*` z^Z`ew2?rRLD=V^dx3#0m^* zDVG&-I-arORTXW?)2vU$%rAU6kys;?@!>f2z3A$9aOL5q81q2REeG5Q2T)+KucX+x z_e+F|e%_PfFGA<@w7YpinhL54@puZGC&U%&0Hviuj8$U3;SPLsO%axHu5CW|GeqMk zNqE=2Ix*iJYDKAhOI00poF9UF`|2W9T<(4kr8nUnB+!$8%L9}T1&dZ=Z87QDk&&_- z+6H@-22?CvDjJKs#wF%Ye;~LA=Zk^^O@%+BXMWURGT#^+HH&elf{a9v>tlzF^unJV z#=YiExLe*VIaA61ylgri%5w3mE#J--%N{UuTVg09JrX_w4L%y~b2GX2y18^9v;#gJ z4$qi-nMv{gz?+ujyI@mX@hT>ZxZuNWcIx&wt>rLcK<7}D0P%5`*Gz1kf^MSN^tETB zn`-LaG%2~bU`InOmC0R{zGkiNg^w^c#os41DS2lCb~SF(C)6~r$hrn`Kyjx2Ej`;( z?Rm~V78lGgP{na3lhS3py@2CM-vBTqFK$v|!M1wLhrX)+WiUCEF={Lr*qeJM%{5s} zG})3eNsnZhJq#@|j=5cpVYoUg?LEgGQ9R&b!I}rB-uW&bJcqLS-8?V?_p-R!e7MAT z8sbmv^$v8W_|pTElH=8#=v7U;k1HN4TO?jE{~l zl|pe(?^UN|%__2HAlUW|)_hU;?^qKVlaV*-V$aQWNRZVw%;wK~P;iwpQVttcMsRS< z)clvHCf%g5Pd;wJyb$CA!X}_F&by^Z0Sn9IjwBlro%H` zJFsoVi=iTA^B%Kp3%f=rN&Vn?GD-#HE(D&M;T+? zZ%#N|>q;F}&?r=kU-03^w}67ii`KdD3cc)etTVJ5D<|Tubcpq542-Zq(FP)twp(-*op-|xWK9@;jrv?=v&8(g zsP$_MxW;0@mD)Mp_`C1;nC6M0v2ly~;6#yQ?a)a0Ggxpu-^nwj-T11_4NNu@t?~IYyYr3aufPFoC&u3PUZ62QSBukw;PkO5r(^UD zN-+J2GEK$kWqQ|Sv-mjl?%q*_$XG#Xf;#7CIbTk_jC*V2jQcM}#Md@wU5V7R7qiRz zml5E`3)BBPCRn|Ur`xKaF=8D|!64@8lCCN!WnF<5rOE%gsxjxN2F2P6Yu&WKeo$y9 ztg*`|PzZ8p;NW1S+Zjw9;tLpwGJp=d^6f=W=>uL6TD7gk7?P+$$ahUx?aRwtS zNRm<7yhAY>!C(d>J=|7-c}3mj{3z%=GA8O2o44#^N7#;zkO%wXX|%DKEw z`W)*gzq2ce^?miq!A|E^j2X<54y!keI{ylQynPXr&&(agE?-jPHD}}QgXzlCx$tC- zz$@xq=Sq4m{4ht~cZ)uEGno@}^sR0`InT>et+%=Z+FJG-OthXw@p547lT|SIc61=v z=TmVKUG8mo_nN8P=i-kKPJ?2VR>V3BbGj+o?zr^?W>i$KN(?FXBwcEIQpz6Fz$3UG zY`e}wiV<=eaUiQ3r{V|i*9n=7grE}zhuJ#^w&Uh>%zw1L0Ahw}r;hwWm5g4fGlQ|8 zGue6%YxZ5sD+WFfjRbb{P~B`wXqtewnTkA|7jr*!nspxB$z*Ok8m5a2($=DSHe7&x z&`{xB@d?uz*^isL8y&+|W0R*XKhWU{4zLa&d9wG}cdv?xlWLtl7aBq~_D<`Lb=Y(` zA#NN8JBzSljOJdSbTebPqYqA?OaYK)G+G}0~HBNi`$YFi*iLnA1M{co( ziYDbZc=zOw@+XVPXs`$RBt&S&96@9Cr1+!zO3rC1I<~JU(2{^7Rdu(9L476@h{Xhc zeLrXPw;@lZ%TaZ3qRtp^;On@Bla{waZ7_t5B>T`-w4xs=ZM9Oop_i)MeOoZF*c?L1 zs~XnE0mfzrMtD_y(U3qKazYI`a8jVLauzx;s5cZfUCki|#9rqVnO|3VnsS1jFtaA2 z-IKF2A`N^^?2Zg*Rs7E~X}*Px%2%+9X7+y0>;?EWaH(@>n>V4G=MemfcO9VL>WBFm z(5JsI&617vw09b~{xj(}9@L!=6 zSFG!Q%}fu1iS_X^+@AmzEkjv=o-~%w4;C%&rop0pH0rzq?~vZAcNEL;oaecF?#s8sUD3ZPqGW?yyt}b2o?%mD5@bIjt)0#bzV>1!EJ3)|j9V z+&FIOF>W=ZU*E0@0_kKp!!3=5`Es2Yx-1MGZ`0mFaLBEGQnM}aF+Bb zmU#6_Qnt6^SLu&m^1Dnt?G>QXY+mC|KhX%d?b%`VF`xHKc?Ylz>gFF8Tqo{SL zVk}8Hm693Pp`L{}To%h-fIAE=qZiB2L|%`zpBL2H&kMd%d*3b=%k=tBc(JS?6Y+Af zjK{{{YUmX+5ZbQZvT1kuFUfhOC?8%a+r^bKt`!(7a56}A3b{cdvQl;yQpg62TR_o) zW#faWfwmJLdPg`PM<6#Y)~jL%z%uF)B|w}t8L8hZOMN%mOMREvOMS7sju)OOnb50O zzI$ZlO0D+&?H8)_utf;xA+qs!Dg^^r>EmhcYEY>)IKbf2<{YK1is-n~?ihhrmf~6XLqnb&++emtbS=4EE6txRM%| zWOE5?Z9Wp-T$vx4g?~@&N0xcFvryW3mk{Nevd)BVj$#=suW(&zJy@*QrSjBL z%nG$Nj1IUMwHCHYgmaZ%jM57%n7-Kk9_o4>>-u6ePUU(J2u303z{7hxD&EG?%@By- z48)<&BKZ_C^|x-oC(xZS#oNKDSo71eBrXR*3OwjyRyIH6LXVF`ztd(tiB<3*MA4Kt zu|01?O8{ZW58g*nf;1Ts-~(Ci%Zti#&8xAC+mD=(OY=9!g|;|0ZQk+nlpl}e2(kv3_|&%RU5Qi9iG zjDty#9`Iac{egQ`!S8PCv!m+G>U6K_(#$Ac|DFo@5Qm2I5 z7A-+l;h3qt{M9&Z(LgT)g{Z|)yg%wo@HF)Ua2r3_iur#hjt+6SSGQ($jK#4+?v3%m z^N6~}b`T{5(}}vrb{Q)>QDog46VX|>Y(eMm$Z0d*cU}wHxQFcxUR1bxLZaI| z!@c@@y>Jxnsj>0K{hQ#-b=AAZy?>(LtM(azNAO~73KkW7?tzx0G2vyX@~Pw@mX@)N z`Z5e0Rdn#0){b80-oEYJ`I@t<2%>|xiVI$9IG548N4#C-#w6a@w2icvyXlP11mwE; zUI!RHE`-!Ayc#+Sj{c5@E9e2T1!p5-2F-Gy08-ZAz(BNM+KSBjfn-X2)1YJTlwj1z ztIBo+2jJD}{WE^_5%8y0iZFu9qikUAWh`hjRn2sUymCaxy6d50xE4|m1G(%L|Z z_8u%sXhqBm+Tde2&)qlfWe0#M*hnZ7Weihc1=G#}g?jgcKUYz_aM*3kNQHh`Hnfeh zTVe4%gpNtv;0m|{P0LYq#yf|N886_0wpDh=VWVvDXk}iOc2cEv2F#S3Hrn;pc69#_ z;1>~2Zi9B0mZRzC$X_QSPfx@_Y8gk-Qo_-|t@t;5jCS!cd~V0{1|Gy(3znlMmTiMF zag;tWJY-}m4>ObU6fJ8<5|NBs5q9#EKfAxU2%z}HTN;4Wgj8=NMQQqHNXf9AAkQ~?SJMr*muATN@>}9Bz$CS#>;r# zgB>%~iU;7F;CI-PY`6rODhpPiWBnG@CFpgPUHq*i&FDd=a-oCR;~4) zhg76ZgfowsvVA?oP6yi-k1w1nIh3%~kDBUnvNuNh% zwC*^WKDdc)Pp0Qy54!#RFCQITEibtt#0rLWDAV!E*$jZaTiUk2e{jnl1dvvvlAoUY z2!KIp6J{k0jN?ATxS(T@Ey zKL(QrSE&$YZi86|+@^5v`zP_^7sX;t($w%eV7Bf z`c~QHldd;t*E{HXWKY*?Q7o6h+IJyd%K5_bc|TrMQ-?DDWBNLpgi@VIefX%DY}tgF z^wu6Oieun&ipM=;AmC}9kN}zu8RhrjAG1Rb$7#=?MB$LwvSBFaO-a9jFAkQBpKQZ| zhZa$2Jp(gsrLsHz^&;#zZaSatIQN9mGwMz`4lZ2YK>0ol!n;e%HuJCt%d1$e;d*}B z1cVUExEy}XeHf~JKa>%NXan87{Ig&?JSzN)RQMbrBe{=*`)cs-Rx_fQls_y^o#-H- z9N&gq?0=D;0!sI9gfeywWo+uu2IL66TPX*4<;)ugpK5FtyDt&C2oGU(el0f>#^@rH zLZlCVJxIe~0>bi-f1o2g1u6orAJ^*9U$hQ_9x7HGhic9` zE8;sx?JlPpwf`}caTIU3s^k^xjwfjM7KZ8{ys4Ru?;15!--+}2c&=_L2A?lAt5j3Q z7CqYCvnNoLsU(ByQg__xjzjs+#gl!%dmzg!PuD3$v$rCv(Sc~+#_O6abb*d%S}<&H z@?x%_kG6nV*M)w*zt_UQvVFx(u68S{H!`F|e-}W`f`Z%|DR~~17@>HS9J4empNpE; zQ19<>;DaIN@uRKDzJZWgFEJEztm_b9;Dckqo752$t`)~IyEC5oxKBfhb(yj{864|6 zx+@N+hQK(b!O+svOl5Z}=!9K7jxT~;--a^)(y{M19htF?B2j@4zE(y9X`kAVw#7-C ze<+(T)MN*Taqm~$gKh!p1*Z$t_fry>8@=P z&j&g_fW80EfwqLE!sk6^;ViB;deziYtusRUQA-H`m|sp)rzTC3tJ8VZ4Vu)XYq4Hih_e_e+WT!&BE<6P4z-vztPQ+K zglHv9&2F_GXJKJPqKOv`tx%8qw*C7flT)#Yr%naEfp zl?C(qVq|2o^(?q+WbZVxwa!{KClWn=QRA_|r^&_>=VqCSSxA5KHnxw(6S#wGoACrB z16x|qXblaURT&p2eex4Div#&);ca2cVXu+fhJPbkWxnE7(iO6Fu`WG$tJ7>k;Ut^9 zm=mkM3r&N*3)KrfhUxnD5qu0BZ2#rxSD#OFI9i&nPsGAbdQ)k#CaLbDE$KK98D`Hv z0Q-P9F%CxYV)SEe6c3{~G5Vo4N`z6O7-8f@kI67f79&guXq1j(hbIBEnBLg`f2@79 zJ2}viehIdIhAsNEb|i>Jau17?){c0wNbF(JH=#w$<6(}_8CI*6Du!_|v<{&%LAZ|z zzlthQl$w5YYhoBAAKjWvP?#R@rY0WUnjQx6N4Gk|AkIwK;wVQ*!&-5h$2f-*BbW<7 zU7(PfxB5{>5kzuA@Iv+CJf(4b5E`nma6%44`#A2}C;k`7@{dCXwq|^swA?uahbYmg zj|vFN+4%vlGcK^y<-p20%%6e2YG`OFJ|b>D(ccVO{|w4oj)Of4(}$LplbHRQyrn@e zIpN;?0sNS5r+ZjSpe?@1tvq8Hhwe}?qP$N}H^-NYv+*h%uQ|xuR9b3%ijqYcM@hQ* z3RZLDLKy?jCPRVU$s5Qm&FT3v?v-@>qX| z@LxaH;cV~nzT`19HQ^==|8n|48ieiAJLw#rmHA4KLvMN_LE9d)6_$~Rv;ws-mNWsRZGu(n|*`@VvDpVv4p zcPnD>4L{oI@;R+9Poj+;x-%)0hLlqT4nA-F1BMjR1(S(hCc;>cD~K>v*_jnNBg%Rh z_DEdcZ5SFdWu3o*f!2S=QUFyYB|G8Pskp*D7K6;nDGfPv83tp{HF}=wNFBBK-t?viLEI7z6EO@d0eSHLSI6O7R42#{G$BpdG0nRJd zWyljGiRbgY9JS@w!XhJt;yAU+bY-<#LyolvI^w=Lw%J^AGv)$g;&78?#r0#M6SDlO z(n1WrjL|Jy`o`00awfX+ZA?bY_#C?HPIbhEv&6g}WdQ1y7+$|!yGB$>1j_42(u#U zrAPapUfeV=i<)@JB~%fdmX%qY(_UhXf333EJa;(9G9@_Je^8Zs`TLHplICAJy0E~w zGl8alXr;g}VuyTodpgRcu?a%OR*%_Ugq=L@*7s3N3{PL2$-Wzc+{OaPChFSQ zxdHef%&6Oof3+_VB^x(Fob=Y-VeNh#p4pO4b8(ogT#G$cv^tFEUM)(%F1rE6hUbMM zQ}sS}79;r!b=YRnG|GPXYOFm(+wnbOuWcgurW?7u#hoN=M;^JAdlN9-&v-KtOQwNt z!?-^c9e1?6Xp*_+-a2S!mL$C34jtUKw%Cj}CntN1rzfXEgnC22;wGx_VRhA;>RDCV z4_f2#u!Dn5lT%<<1xwE=Z^||(*F*7X+gdXPe#a-$zE>0dxe{UDi~j6zqk^P2I2})= zDbFfbd?fx&lT)=j_)fKBl?WBwG#SSxIaYa-C1~w>o5U|sE4XQVq6$3`%t-Mfk=&V{ z3@fG=TyZWs6MH99j*K^Ir^R>S{^mY-T{bPQYumNWskk)ag<@mk?xKR-#=X~IKoc0( z@fU|9!MOK*)Fv#fvI|={h%b&z$D*{ONx#|daKsxc8!(F9ajG_c`)}^4t%>iT1F+t> zZyU;MvAMe_aBv8=#XE~~b{FOBElFq%JNPXeNN~pe+{mRQ1Y!BWsoE3-dxI1IZg%0{ zobnxCFYANndMEzPaN*zVa+t4fL^z;7TCeFZS~UG_2kF<#ni@6z;d)Jf-lFMmIzYWx zrbo=)*P;J}Ux$QWhlF2;gkOjL@AK>R)ADQSp>OhwW=_qKFu!OP%P*Ss z;1{+NMe&O$!Y`s|ei=`6E0$@2lwICf5+Nd8h=SeLstWcm&@rOE#IwHC#CO3#BT9^M z9|o;buniRK^yq?32Mg~|@-S7?jM^L0@p7{h|K{Xj`2hQ(mtBw6blD6i{>{#V`D7RV z-B3zr<#bjDiy{}@mC{`~-PNI-GHjGn5|mR-REioNL>Wa=4nnb$Wi*jxv^&gmCLd*r zRUJIiXst#hEMXdv0BzKWgyl^m5}#H7N9J2#E zssn<9?rm$UjG7kJXQbl0#_>yg&`|`&z4#~9DZGp3vbZ2=C(yz{c-es$b_#1C7eS|h zJchP^ur#wJ4j=p5x`2h1@VEvZjr(6lrhC>$wA^uc+-SU(xzTtnbC=`aa(;5s^+H>O zc7RG_-m?{N*mRl}yj*crTJU8n>~{+8n$|OS8EgU$p%+1Em&Bo51$A4_t z+-%s~Y}nj(!xqz`Z9PqkwjrEnRTx!MhL5mTqxG7w)#8`YL^W5QKB|F2=~WGsuBZ0@ z$oKL#ujV)C%<89)4guy^pmQLw3&$=~UEmY1iK+8mGuc{rGbQ7C&Ins&GkW*({3J*( z)J9^=C0$de>y-f5HkDw`S>m;RdI{$U&5ei&6Y4sz`L}g^HD@JTchRb;tQ?bV%*HY2 zo{?|erp>CYTk&ExZ-(0@?_x}*y||_~9}N^22h^&7*Ic=tAyEj1SxK?E5`q*2{1eJ^ zc`b7~bl$Bq8D5~g&atb|h0K9?NX$YH^5U9xi_*npX0w^4rjmR-d5uehsA#Z$PDlkG0@IsA2+ z6k{QKfCzErK7@e$TOgKM6!p2LhBF90S`Uq&e8B18=JsFF@$v$dvoV3YkgL(l@6tIM zfESgUK6p_%$)wte)q1hgZR-2qC>SqV*8r`xo*boen8zGik7xi+db6#c0hrD0h=rdq zI&WaZCsrH1!#K~*l`@?JPl3gGj(d`=oA4U)auFr$1U&pi={P!X>2&x}b|dUSLBa=P zA?^Iw*V85rW%%JaQA`Q*&@3#oJw4gOlRD8^hqkV#1tjp4h9H_{JuMQ$7F9hg8kg4L z4helWW-)A{YLZ>gO7J=Q=s-_w?3wnJtTJ{Q(|QDq@)XW;ZzyI)m|>yRqqh5aexkm_Q@OXt22r0Ou1Cutu8@cS(eKX3 zSW_L2^?%azstuanAhcTOLZNGfJ}mSpp>0Cn7kX6afJb$Bc|tux%Y^!b{y^v>LZ1=( zy3kLAo)Vh=M;-2uB;A(^o+z|TXqC`~Lhlp$Q=v}?-6`}vp}mAJ1B5z-UMw_U=tQAq zLccHcKA{f^{iD$5guX2F9ibl!JuI}><2rwXgk}r9ROr=0CkrhXx=`p^p??&*UFhpV z-xvB%p}mBUgM?-ay-etMp*ISx5qghMyU;o1yW6-X%b~gio3@THvf)Tv1u)n^(I)f+_pK>D@2>mT>0Gp6i@lUq5?^b3x@IXHDgT+kDjw zs=-%3Z^3O&Uu~_krgp(?j+u^8Du$Uj%(=o*@0jO68_0v5X+345ob z5dZ5PwRrfOrp%p=3uF9W2$ypaT0MMKAVj)fqReVx(tx)GF!O;{Iu^rS1KuwNDs|Mr zWHxZ6vRi;RzY4_(S9DLe{J#MIeG+>Ee9Tuqst{@oV%BM8I1yJhF?qQd>7NL*c`DAi z%4IG7Gj7IYhrURq{&p4TZ7@GwzL>+)ae;9}|0+wqxz|GQd3h~F3*EzcUmOiW9bqU45py%%tPCPsn`WGJ3lV=S$t1q5Jp^l5NBRnpeVe*dkCH3Pt zPG0{XCD!Fqzt^6g59DKPon->^&eQIbCABWWHvhdb_GNcp9fKPM+x%G(W4|iKeoc)1+8Fx>W9-+(;D=)H`WXL@#NZ7v`0*ILF$O;s zgEzbr-5>}kyEhE|2)C{Bs`a3J3r-uZT>Y19xm=T z2+k7R9%J7vI7jTWhxO!_SFls;>ja-Kc%9&E!EJ)6u+Lw&V53Zj!QvSIvE{!* z;?I!$&YCr6c0=V{n|+R1vnu9RR@8vj&2FfeT_etb8+>ztZG%~}eAV;lKn!Nhs+!&4 zi^dBpD}1%}wh6+mvB9iam9yu}(;*|=Mf0kBvn~mzN8?Ll@aQnE^VMH*8PZc<$+2^V z&ko1GV0O*C+ZI&LRR*>#GsYpecy~DGR@PMdDjnlsaP`#=$JntB$56bFgTYWd-@8S- ztgWl8pN;er<-#4yQw|DgZZ00a<6#}my?TTiv9r7*D92cY0q2gZK}UjSU*vGy19~f- zyYXBAPj};G1nhJ0g#;b|-axB%~W^U`+7s4-p3E zN4alFU1e>R?aWcmA!LoS!H02Vh4VK5?E1ONu3S$zBJLLQ`-3Ym_w$2^O}YMjnq8cs z#JDJ*TUj;RU*mID)Gn~SIxA{w8~pVut>r8mv+KXzzl0y{eV$MAoJokp9}Yd*I&80# z|81c#oO$&=KR7XWUPE2Y?25|yl?!~%`LpZnd{$OFzauG{?-6$qPB;J?mtQ#^ZgAzenbtMHz7i9lNVRv^?V0oZ^PLDjf-7og&0aKno;0Ij z^ReUDilObChIYm2scfjIpH~-Y9vsf`Y&Is;%x-9ivUSe(IdxYOZSSVsL-;CQyz@}i z>np04M0r*&oD*v2*Rh3mUN`6a=s}#toC=4VB}e(}1+@#7%&+w~IPv`|8|qM{=`nq{ z?$=9&t`#~P^Y?jZvFAgIkSnwLTt|hHAXLJn3bu39?4I^Dj!W=gKPvl}=l^^E4Ui6K zX^idrQiPDFJ>&oFD(nULU*j0|3@*H3c}I$PvOqbX#Ce0oGR(C$HVqGmfzq0>Xne- z%*FTM&}BkxeIe?1X?<-)Wdp=)&((`uLBdIF=!y4i6#S&7)glkI>6*K>d6&?Ch`Vl~ z60E}`;f@q{)j~J^M*II%s8i&ccKFkNB=Oq;3AOEQ<25nqE*5ON`={iyU8rr&@-hey z%M2g#k(6a16A#LVBMlGd3*>EYJmfjQ2`SA;DUYBX%aU!!aOszn^B0Djj)!I(e-Ds{ z<{XpJ9LM7*cW%KG1eb!+&kbTeRp?Ei41We5#?5ccaOUH2;;F-PE}nWkOlu<^rggc{ zdqHU)z{7A>;Gut%Q_8{|4-5VcDAV}}9>((rJaqRo9;WMMJhXoc5AA1wfgD3}9}4-? zc9Cwc_6fCwb_@MJT8Lc7WXNCj?@mZoa~%^L*9yKJEm*E&ipoEYwEZ*(^B?_dAF1Pc zUFbfc{}9?C^h2SR&`*W_Q>Y_Xhm$NcQ)rgZJfUNSx`cX!dW9AXEfqRVXqnKNLd%8D z6}hB6OqB7NKoI_X+(_s3o*ZsN-Ut|4gBA!sKkhc|!Ar zx`cX#mI^HsS}wFsXrs`zLN^F)5!x=)651uSTc~4{d>^6dLNkRrg=P!Q6Php7CDbdl zOlY0ZMxn_<*9u)PbfeG~q5FhdLLGTJeFKG_D>PfEOK7#wMxj&v3mhd_b(w~K?k3Fb zrd9hL6YJ+Wrq1>`U^jR65~w@ZYRXRncMUXz+Xebfe<=8?R~CTqul&&l;rQzXO`g5L zF|l%vqhxly!(CSoy2LRV@lW>GINbi*98)Xn9M@sOd2Q`Nho`ba1q?r!TP>l#di4TR z_^+r2MHutg{vZt1Nh2Jj7Uurj{0%bTLYThF`Ex4S9`T3pYl#p?v@zogV|R(eQHqDZ zl9Ew#=Z;#U!X=)I-$-W(eonqD!H>oculK6?^RHqLr+-t`DiZvo9a#XQX~0b6P53`o z;cA$0J%(#g;FDVMAm!@QTp%5;_8-AIoQALq9UjL&5i&i}lPjfd?$zQ2ZzL(%{6nHup|CdDNhbH_RiQbZK_{SACZ9FLc|o_Y4Uzy1CB zme#G?w(r=vt8MoSFYbBiU!G+lujmR09d-15eOD-LK+2vPUnLp;L0>}Waam}6sfpFDr)$_i8 zd(Hd>wRLyYH~9Pu7cE|L=l5pba_g+}Z@0he?xpuE`#+uk|I_jRFZ16$euAfP;v{d; zVGf4lwvEBNn+1SIAn=ZFx*mipK- zqwn%hc@s5iY=4v%T^hxp@A6-RaY_Z!P=j#pRB4%~MsU&LUGl#rJdQOQ5H?fG97o5H z7mne((#z2pQ_S%n$2ir%)F+w?WQR!J**y5J@E8V1qzf>Li}r7)=)3(dLCo||%_KVn zeg)07@A9wpg6fe9+b>gZ#~v%!)2^fCjf)i*bQxj@I_5|Sr;nfU+0v_Aq}_*cD7B*M z5x0(GE^@QzG-*10c=TI=Fvv+CMs&FdjeODL&MMeYrpYqS*+I`Q70D|L0rjTHi=Oh; zo++e$7E5d`zS$i7UwoQ$+6C%A2`@UwOf$LJvlc|Y2}{~SxS$j_TK>uu+A=^pZqn29 zi>7tRV=eqplA8<8kw>R%1$0TazmFYf&wOdQ7vpo+S5BN)Q|Ydo*WkW(YLSwwrNf+J z@Y(g1Q38cy*44qb4KY!i=rH58h>8q~gv{1!Qx_+{5PbuT#Z-ZdQ&)-JD5PPZLX2Fyn z^4BKV);nky%zW^-PcUVN{B;PXY>q!mFlBfAbqS`djlXWel(nhf6rEnm==e((+)qPC zx?o$cB2zGV%AZp(WqbT(3m%}MBTw)dg7XCr6zmdgue*B%Q^v?&sbI=j`70BAmWGaU z!M5H-wP0KCpiVGloBS;n4EeqKH3~jY@G8N!-pN|QPO)Dnc&Om@g3lMc_6p6oIJVCHau&RJC^9r6Q_N9U+ z2`&>{B)DAgWWm*frwFbSY|D!m3%*Y58wHmNUM2WO!D|KE^5k`bahihqtru)dHZ}-e zCiWWz$4LXQS#Z4IHo*yk_X$oEY|Fuu1Y2U?%eEKXTX1rT{+`K#GX?h%Y|9h-3eFb$ zRKfXz(*%13_Y+(u*brPTn3s9;w^(q0!M1#VfM8p`e}>>y;(nmub%HYlZxB34@Mgi8 zg4+b2C3v6Uvjtm%&k@`$_*}us*J^$Z7Mv;gJi*z5hX~FW>=f)3JXCO*;PVAn3mztT zvEVGhs{{`hyiV{1f;R}hQ1E8K7YS|?JVNk3!8w90!6OBC3(ggsex1($D8Wv_mkQ1k ze3@XE;L8P<3cf;cx!@}W*9qoj@ccCj9wT_I;Hw0$7hE8Cqu{Frw+QBu3;eYUb_wnf z>=xW5c!FR@sm`xQaHilw!P$Z*3eFciNw8ONk>E1HlLc1`o+5a$;9|k61Yaw7o#5*P zZxCE6c(dRe1h)ykQSd&&Hwm@`-z>OWaHZhn>vjHb7n~`$MsT*^<%07C$H@T1D>zZG zy>8cAaGBWm5nL@eMet(5se)GtP8YmR@EL+P2p%YSv*1C3+XSC2c%R_Gg1ZEd6zsS` z=f6O3rr@guXA7PnIA8GXf=dO*$$+X{aH8Nk!Mz1H3hpC#t>6^F>jkF@-YEEN!7YLd z1n(1kyI@N&FR$gVTX3S_aEjm#+rQv0 z+kcjJ@0c$66`U?OMX*zFf#5vBaoO6x%l0q0)b=m9+;%@wyRWm|3vRUC3tnrx&(rSL z+wKK#wA~ACvE5&$-M8EB1$Wr)1$Wu*^R;`&jXM7+g3|@Zjn(!}+g@;ITn8nBHwIq+##5&hz|Iw7OLG**23RBfb@tz zzl7_P`0FH`+aw-JTlk}-h`-zAJIoLBL)*_6^V=kUmS?Ua;O0+wrsh^1Hib8+XZsLs&mF?inC%6>iydBt%I74MDE(tQ68#-@dlCsjw<|1hGn5D2zA!{x z!tOwR$eHo-WwcZ~@?Gbv?{saL&$>M-a$GO*>-J@nL>P zmz!vRHs1=-*7B$MQW!3Oy5IJO>yze_JDhIKCwI8r(tL{4N6n`R;riF0%8AZrbUJkU zBl)z`RVp0T=_(G_8=bDH;dJVB6-T9mPxy6tq??W1mQ$48}eKE@D{nycgY zgv*bPza-oa*zrf&L&hH|Z#w=7;r33)A4xCQ;#hj!_#fTAHK6BbI_xj2(@_#mr{;fA zxE$(uO2hU#o)Y=GY`0m?P9G0ztX)ENJk!GEN5>PXPdXk?IRDY%_WZ8%RZGw_{nw!; z>7NdFaug;XZVcy#`KO6pGIY9TgzdHe3E_6c=Cj?e(m%gMPyco+qQ{x!hu!|#{IlCz z9pB_|K6QN4!sST2cZa{Lc3&Ko9>#uiSZ`Omw`-eS-=;*_(|u`FJH*^iK$*}#9lkp% z|FoYTt{2*Ve2o9n82jtP2^8`OB*d=(q;8MX42rd`=ir_lI zZwPJ_{Hox!f*%#UUho#d8wGC{+#>iNg4+e#>jWKw_lSL$;O7N9sx&{^1l#K%7yV!D zT?s%`)z`nnCYw4cD!8J#;F67siVN@I8g7Y-O6gxm1qDSM5e>~0&5Tl$OpVHP*aws) z%ObOy%8bei%L>hEQZp*6VNpj#`F`iU`(Q*!aLK;%>EUzr5i0hN8iSe~woA7vlV zj?2gMbmjTR!1*V5y0TAb&-q-QuFTWQzM-fE>~kp3i|#yqJx^EmDeH0Gi>E95G|IlEBTx6?=}DaT=lrLf590i8&WCdTBhE*2 zelzD|Ilqtd@tpsF^9Ihp%K2Q*f6e(k&gXN!fb+`pav|r9Jl(?iFFCL5!#Z)^F;w>7 zVa~gA{yWZlasC_5`*8ka&iiwIFXw|e|1Rf4Ie&!n(VS1_d@ScPIUmpYA2@H|{Ii_T z<-CdWd7OWf^97v$jPr$@|B>?+&VS2!$1u76-*eub^G7-F#rcDrSN2Ko;k*w|58=GB zuc_>d`t$T~p04bhcH(>xPY>n1vM=t;`B0udhVyDZ-}c~qG*4g5dB*oqT{s`h)3HM-?fmZ$MW-=f z^W^qWK4-Y|{P*#6cb*=_`B0wUo%3EiJ)84BoL8O?)LgzkPxt5P<2bMETYGUnh^Nov zyq@Q8%lS~AK9lqAJiP(uqj@@ChO0QI(2%Fc^7O5okLUb&&U&8V#`yxy2XelU^UrbKkLPc~c?(b9$oT+nZ(q(khRfxxCHJG%hTmm1?=OFk?S*v zr^oa3$2o7{d>ZF-Ilq+id7R(Qc^xm$gYyMEeJba3czS!z7xMIA&RaPDHs>7|$o9R@ zd3Vm|aNdjaxt#am{3o3E=lqA9kLKmK;Cv8IpT>D*UH>HKLwWjpoR8uBTbz&Qe5#V4 z^Uo{tyu6m2&*SMYaK3=^|Kq&R7`eW^IbX=rmvde@r{c$X3r~NF^ID$Yhx3jRvc4G3 zhw}9PoOkExt2rOb?QO+*FP=V~^FEx9;CvjHZ_Rmso<2k2d3k*}AH>sFDEa%!_IYwX zl&8<)d_33RhV#)pUCVhtuHT#Uu{?bT=k=U_g!2VlUuVwe^7Jsy=W%|aBF}kS&KGk2 z1m`WBkK?@KLb*N(oOkE^9?pAlK7;cWe7FKz! z`Cz{5p?uyB;k#1`AI5ig6n-AxRZ;l)eD_4*!?D_Ltv?(qan?Mod06ucu?k_$FRGGG ztEJZIwAyLSE34f~`OB>8ORJvps^Dy^^*}jB{!71CsA!;lse56)qF>&JQFiNS--^~B z==`*N$?H<|dx&(Jxl)h3Uqh<{@+I%r%&zb=*>bOR9#~G7_iuu++O6vTF5e>Jb%2bJ~U1$@^@-Vd5vvHBpd+t6=o%9qT~s<2n)mEB5ZU1)YiJIm>G zzS%l|ScQFZ`n-yEmidS(`gIlkQchQP;gs^|RI#=G%6=}(FR$o_^12N5enp`y0zW`^!t@TAzw4a==>^>^` zbyohQ`pDn)tSp~?tJ7K^t&UssORA(VwbDoH?IBh??SGIJ@+I#_(eI}!Jnic!yUw)l zO#5}pZmYZxP5xH;r@YQu*?$yXnTKSa{wn%u9X7n8Kg#I~a4KKEdAIg}-E8 zIqkr3zms=_lo>5>Z?P!lDdUH} z-9u*@

    ?I&9I?qA1uk1hac>ww=U-JHOWqZo||MYEm`I65I=qm2ta_^D{{B)}Az$)7e5F0|z5&fA@(feS%OgnPmHaXvT49gO(>HkJOXe3>%nvdjRdN56 z_x&r&=h--z%d7CKuI4RO(j6<3%asRX9;2#AkpuFNGdH|C)?9_JRL2_p)T!wspL{D? zXNb1q`)pn0)i2#3SfvLv8TMs`d`Dr{_u`+n*6AebXC;rIxk6r!H&yagDZ_7udF)Ia9@454Z7-pzyo<7R9jWE1OcBg}t4^EpCu@`UFJJujSnfl&AUbK42^4n8{w zb3XWbr^KuF=?Oi5d?JC+Xfr8M!ny5|2;&<4E@6x+H<@^o&zclM^&6v83H=^(OCvPK zAD1xyVv<4PGv=ie=BH~i2w{hW?1g>1h>zR2ayOy+tHGIs`bBnGgu38^66Rz*kxjhO ztAo`3=1yxRjQirGgqrR{U#4_F??ef;zp*{Ut0&Bm&=mTXgaMkCuTZ?n5G|qR%daHV zXZL!Q;`4<~5_+!wO+wAX_e=dl+b&5$znCjBZh7!Ek~jbFRS9#xYw$Yp%q>hpt?GRV zHL0y~rFh$=5^CH(m(cHY=Qk)mZb6KM`m6#8;h%jJub&Ysp)UUi33JN&zDe=s~+kWh24NkaX59!5$3xS6 zdFv%q|NM%Cni0okKGyC%k~i({E@A$wffAZ`u8=S$B3Z&5&qET%y;dS2+VOqL=lS#y z8S}#=j5!x4p;nbEp~?KcgqjcR4@mV`*D$E+i8V_ra{|f z^xH3COt0e-<~J&ngyvpHCDgC6NEl#p z$(PDs+EPM|T{j8UPY#gK&wiAIrsxMHG@lHWP&Xo4!WjJ%5~_>0NvIi^Dxvw2y%Gkz zdO$+$sW0Vp*OL+&yA?~Q9;!M_<@-%g%lKeh2{l1IBxK`!CCv97BcZ;-R0(yq^CS#7 z7A>J)`V$grb=xG=-s5@`THLv)II!%gj&bT66&9E`GV{TXwpJL z-9|47)vTX{n)$;e%>Qhngsj^vnO~)o(C^cg5^9@ll+bg+ixTReOqbB~#_KYk_&~xO zyCV_?v^^oAv6opwPw|R`x?!%;^HD>p3h*nbZzq7(|*769^WJN zd-M)#__FVmFIE=T-};$v*n(LDhn0NkJ4NW5^6NvTzAo?lI4E@J0pCU`2eqF*dBJyQ zkG7r*XI=LF^sQsL>&N}#+f*~;&w^McWG?HL+QiOLIPm2k#^%r23pOKk<+jLI9`M9AEqu;bX!W2}c_P@?QZ_>3Eetu)o!#jRxD`*{@)86Uq zD9Cm+6Q)j|r#{!uK^Q%2MNyM^jfDZTVm{j=I0@fxY5L1yjhoO@ze%m0-&z=4yw7F( z6U~Hf`%|Z@9Ls&f=N|mj_q8rU_gx3}cem*#3=8@0(fsBYe0TJ-ouc(?Drj3S-?IL& ztFSVCMdy&r=0f_6oga*iZ6vJ8chDYa)LgJQ_8ip1={{k=kKImw;MQDtVcg=&X>WEC z9$RbLyQ%cD?^c(wAHI0sJwg-LW&VYWFZf0T9dz7(sErUmYQlwInzj>id-ipyQP#QeU#wP8kE;ndMC7sih2AZ&4MU*H+vSa3RN_pHB5SK&%X>aNLS+X}PC z_w|T#Z71~Y{NR=7h8EwCTjh0(ouC%xMJ;%A;#QNd>>qbw(6htO7;+qh^l#6$v^=C1 zntnB@)5R0bg?CP6y>sTl`a+TzdhEXSt%ZL523-Cww}W8UIBVw0HBE$_4SyN=$cFAh z>j$4}YW}s0(D#v^5vds-!X$@Cr^%5$guva)%X+u!Buq%0`FXcFT?9?%1C8>Ax(j_j zdC29>U{4`g)p@O}x3lo|vQ2v@J>5ch;ic)@+ui$%@4U;a>Ytu13U0H?LHU?iw?1>Oi5@(x;ElYj5`by~Ti@-;5e0G~c**MPYDL!F|qC zMQ1kk7UnE{`0S3&zCx~kqj{izf1y)Q#vcv78z}7SXY=592l@*ie*By1my#C3?)shA zO#G~muB1gzgYSLGDp<&{*C))N9Qr_r4GIDEo;Y5(Ie5<{W;BC9}*G@(E2~Lxr ze(>zX{(}F3$(Duh_7zHJ7B_7FNe3ZuqVHFpKlTwO7e6_3)r0{;!|g}P%O?8>$G-7e z)5BFGn0^?xCBI3LZ|Z};HkhsMC^Y(}SHtKYorKRV>J~?Z-+dqdbo9zmA@>OFGGj(Y zPqi0^1u&a>Wu9^8@PFG>h)bFC!x6ue&0^dBd&=bFue`s9f`d7`qT~5q&Y5SNcWbdzc z;JFqS-;CEkX%+4z2+umVAL%mNOPJO@@!h5_<-Q}FTKzmcu#fQg0tbuc^gyA1_)+r@ z&vz77=WKfU@k4!uJVP6{;C^qR?U&7V#ESidC%P`Hub$FdIH#JKwe0Xf;l#Q3C##cO zg-edxXX(7~gH?0Ci1FDsKuCSG%O}12b{A}Z{quRBwe5t{j-D@lbZDRu@a0>>?3s`7 z<2-Gr_nzq{{Lt;SPCqQ~Dtr{NCU4wQcflOm@F(AKZH1Ftmo52Nd*1i{@iAYnoKxnz z@P~OG=X&=O=07Hss9(QNXrd0@7ZKZEXt5zXKXl?H-$h+EwhY_Q2X-uIAF}0&?{iFa zSQ*q?aNpV3=4bc5d>r)^Mrj?_rq&aMc7a38$jZho+fu)cGT8Dqb#FC6IO(6uO~$k%&N_gM3g5yJHQ&!xTiM_1vLcGP35 zMt2f=EE{@aNc}E?YFraX&(33nsh@w{tVi@H!GF%NWzzzN3GF@|`|FYPF~a_@R?PB! zw2ROrWB-L|FMA5#E&Y79=hU8pf9H&n(~or#w)|3F8azf68a`CGV&B^%gxu5zE{AO& zDC|m}@mR{dZo=W;8!mhQ&``lN&hNk&V;AA2f+fpGFZL4}H!~fu8`e_T;{VxuAs_e& zpY}OA*zLpK!UF^6PuiRu={xlJU|Xk)o zLQXNK`NR4AFjml>=(jF0!e1~ax)x=Jj1Z#E_-9{kbf56y;pBBK-yS1`EHzx2n$uBe zJ*tKCd!G#!cE0H6Jmb^Bf-ay_-sHZ+1#Nq;J_RfL317V7r`g}UgHZhEvPb@W+E4gp z%JKdSKO8GeDRoVI)^3d8nws+2*N=@7_D%VqzV2&{;QUr$eyJ}h0a2^w83FJEoHtv9gA$zMz#~aU9x(`=*$NM=bvX^(S$u9-1o=P zw;g^QENpI7w5D6=y~2v*Z)1z<4G_*nzI(6t1wWyt^%+l7Tl^~*&GpJutBmDhzr)70p%j$A*@3;Eh>e=Puq9LPpgbV}ke9y3R9m_?>wkyo<)+-lno*r)b@Ruv1 z@r>$~dWWuvzp3^ukIA|s&VAjytLHOU#8Uy!rL>5;B1ZkB`e?wEE8^l7$Co`b;ELEr zx_~AX{$CNFT4y==^-q_@k6Y`Ht3JLge!KdOrP{2^;!~^I+*7>yvgqACH}JKGFN=F3 zm&ELzc3EtFWHA0;7F$d$OX}YFvKVEI*tFO6vUu>FVbdat%S4wKZJ(T6P$vHTiE7(| zx68z5ew=RqN^+Sv~A*+HAcfuJ3)! zH~i5{qWvFlpF9zANgUU*@YU51ToONXC>Z76?~-^lCfu*D=Or<@{n4JIoi2%9*$MmC z6<-vm$8A|v`0YiprS5|kx(_ajmw$WWzSh|n#kXhA)BYKMQGD=6&G^%6E{Y3UcwGGp;zjrEo8G-(5ygH*%O{++h+n#E zHmbg~hy%*;AoY$#%qW@P@QvLTar=|1bH?W_;;5Wm=AYJC#5Xn@_jiu6i0M@mb7J%GcbkR3drtIik>ot`<#S?O`PV3(ksD)X#Q{{phUt%*Fc;?%#J-G(M!7Z@>Gjm~rTyqM0w96@L#}t@+~Vv!d2M zNHsa;tTVqaWKh1RtQn|FhzYW4@cUsiaiwZ+~B!>8Db0O!wn&4=pGaBeFX_ zk^6C}_~WM3?}WEX#i{R1(0`p>DvnYu&0LjOD$dQ{bF%-|QZdF~)!sg~RD8rO>;4~? zmx^<=4|;#Lpj3R}^Rpj*qAe9aUi#sQqZ3QTOGjsgSVokJWB=Ht={%rRe4_1F9p~Iz zDvp0}dZ)dfrJ|d3A%94N!)xk6zDbU#x>O?8%T5`x>5mf8CjHd@?k7sbgG(}=Ir>$J z`17tulDB?TB2MaZ&r$7LC8FEFmzxZHxkPNAx7?>gN{Kjom3#MA&zFc#JI?vC{YIqw ztZw47xwRCcF|0(iblo}Qv;UQd??!jK)M`SBIHHMZ_p%Ws;-39e zrk)y5B3^7g@Aql2Z@&aR>|P?q9oDEk>X(RGn*&|*R3&2QeF<-^ zJy$G_K71wNf!~V7=VC@1JDQ3`J$}&K`72=e)nhMxR4g{?_t4W9-YypXx~VelUM&{w z-!0kPD!o|T(fCxC!8?k@6uaE1k$xz=foC^V?Rsqx%ga+;+Wi3gG$d7iBY-Y zz&}qEiEoYSG52gik=S~5Vy46AMdE{|R%Pu!C=$E;KEiL*n?>TueZ_NEyj&!1d!)t8 zH`0p49gR#LsvSk*_QVY_6SowJ-*$_8Ea#~rv9bH=M((SN#I;|y^myvwB5~Q`Ax}C) z6p5-{WdR$5i^Te!m&|B0wMhKvtIJ7mj4u)ge(Ky{hJTUR;ePLp4a6d`QC=VXFA{ef ze}8g)_ad>k=6^p2-BToX@=x>7v_QIa6^Suw)!Ucqfj3`Ko3EI~#E!3A{Qaz1jN5*C z{@F8Tv5|JoB!^RGaodPZ2G4KJ;(#4}CJ+0(`|j&0^k59nYM8 z-7M}s(a_7W}Wd zU3NZV77w1k-?`Ibvv{fTvh924nZ>g7qA$kIGK=e$MC$)|&@9?{e{=r1@n-RZ;AV$L zjx>vEyTSMmx%=0=e$dA(wwT^_?=u>+_)C|E%YwbkqNAP7YCli2*l+pxz8%~lFI{Fa z20tWf=V+#N3|tCgAA8~4o*Fq)`YZ2Wh(kHP?^o^qj8%pk4d%$_wyI{=HkRXc9IK|Y z+hxx+1<4UB;;OeZl-n20F@|F-$2g9p<<0TS<`UKid1K=y>KPS_S|wNHflG)hV=NZ< z4rlIXMv|dI*={+e4qgo0BUvx@4^77KqZ$M`w4Uy^cE-`v=ua>oG}s9 z6Lb%#DM$tS9eIv|J^&@cu`hx)f>wbRfo6jyf$j(O2hr8oM#UO{T7sNF!$97k<{*2} zJkS)77Bmv%2hxC=fK;FtZB=XwXd`GHXccG)Xg+8rXbNbmor(p5#)3wGL{J}4H&8oJ zbI?$G6&nQV1L^_l4DtkdfEt5bKsRz(=hEy`F|Un?A*$h`6hEu<0IM)%Asxy^V~WCl zAW1JV{Hm0~{s8jmp$G4RR+6tl+W*V7N-v=B(<)ZAd?h34qz8aX9`$~Ri27a&}n4@j4y#kyXk z-}lMSSTbXM06QaM&-SeNMari$f2FW${;C2@6-Qu3_Q z3#`Hwm^pg z;X#-u>0EX5wv0UsGJwiKA?+A@1mtoLeut$aW7|RBdogwfG`0(4@t|KoZ{bT8Sz{UN z5X4wNP=g2YJ|NJ`po5_Epmq;2_Acg%Uue#7P_YL23wd*X z#Zow47Z=rGfpiQd2l9SMRN^{lG|Y@RowHS3ubz@Vot+XF4LfN51&`O1M9u6V9R7+>PSF(=m`9Lnj1w2pT$=Y|vMUqe#Qmaqt%Gyee*_lsC6Z97P(d#0^DU z9^yQKa=9ZZiWOchCzWBoDlR}O!-65hpw+Ff_9gw{&56)B^gB z1>NhXRmv`3zC3sqJq+Y;;dVzx&F(OAuw+lcRdEkV_L!{W0%f_vtKwuiGvaa^p!{gr zZbOoa9akxQ2h<4fqDsMd2J(KWWVclQE%>8yuwf3pY&0roJLc@|z?^$I=u~*Vuv;T5m%>9B^XTKk zI+Si@9S&?^9ipCP9lSTQ4yriTGyud~vI2~EnJsE)x- ztf99fYdFD07mVHpSFkRv(Y9^y&RWcigtI_VRy=Q`0F@)g4BA44dDCeYP-?UK%sCQm zh97QqjI`6)YHc)5)PC*ZF6gInXCwSO=mqE}lxz(E;>TL+ldmQ?V3ot3HTB-dnyPY{ z1En=}WKB_rrrz~f)5Z-WA$Bp1)HGJFacH(6iZWJQvWjK?~#~B);ndc+Vx*lYwv!NJ&?CC0+JaefSDKLmz6@tI}6; zJD@Gl|J~pNw_a*pBbsL-Z7SN~p;3&j2VJ4(2F2z`n*f!&Gjk6H1v)Wzj1%`>Zsx`& z_+J`Vu4r@k2<3T9Xlia^YLu^xp{@h)-5or0khT|rt3iYc??nB%N?%p_#Fvm8IY^eB zLD{Exp}X%VOCEkFKbvswb;&b}>2S*E8Dd?6kHTn*i#YIuxX8;mle< zzQvwqW;avge6_KGuD;eaz@szlRdud5pO;*HCi@e<40O51pOSxQOwYoY=;6d#2OnUq zz29f8Rc|w8WReXg+@ECMJHz)*@IBgK0{1=Uc%{C_W}v@-nqWSWbW=aUyxL>}dWy+W zNAsqtwJU2K<$|)DS!?KO4PC8!d6=7GuRvmo4wK3ct5MI?C&BN`x&H^U7d^v z4o2StQe>n#81^aljKDGL2SDU;1y#;AbidW8oNSoWX7qhRjDhO(Ke-h5Cy=7QIvJ;j zv33IbE1B^~Uws{!k5JAxR%OZeG>kj+1rPKE5A+3$Ka(6^AMqHMXn$#3Mk2ly#tFtj zt3C1cQ}`;4l*b3{AkCAQ zlNw3$HSWo{*U@~fwApvh;2rdv@!RA|AM(Jx9Cmv|%Ja8mPjD&hDSdiV0`9R=pSPM@ zuaz+?b$I6`ylZv`-oMK0AkD*8bHRHFSOWto>8e(kf1;Y>KG+QH)KqRqRb%OXtZHDx z8uW73sN5YeZt7v&0DHM1ieIsDzEcY{67W=E4lzMWCIccZCTBdcdj z#lD^y826wI#mCaK89pn!(Y?F@+Os~|5be4d^H?KC*2udNYZO@@NA#SG^>hwe(u3w_ z%U;E2+`Wvw&-J7u{H_&WU3(ncgLx37j2D%w4RejOuXg;MfUeQ6;gL}BV`B%_812<~ zk2C{IcF@?4fsEJd_?*t=Jlfi``l_dxgUK%6#whn!HEzJ|yquX=>Ep~ZY8~!(PcU_0 zEOYdJl6mgOXM0e9o}PQzRlLf@p1B0uG8gn27xWnqd{(ndly&++R(>9ImY)ZuKHUg? zTFn}M;i5wuO}eU$CSKb{L8L?SJD#8L4CIDq7J7zKwZ+(sYQfqDdti*ZV~n~nX_iN$ zO3$RTs_*Z=e~R}qe1`W0<9U^?M$&!N757vZ*0NV~b5m23{6@xx72~b&8`Pu3RXuIf*sM0mV@{UQLPqYdj?8(2Lxqi#zr`2^jkUHh&=q#Nu;#s*m>ZcI z=GQmkerNq0ya)d8>@vw?qMNGGHBSL@dC{<0dafU$`10zxDDEdbzk}xRay{BQGBuuY z)sdC=Y?{|J&_kEX*_Jtn+DQGQy1u{c560dADQ%;2v|)~$?KB>pa4!r+yQ|tTClie@ zdyO61nRMrqUb=TT#%AuxhfjFui#AAa>Bw3}!T0#=&=T`$%U*5)SAFiW znqM!ThrETcm8cV;Q#JF$r-)~G_NBEVLaCg_a+%87va+7$j_80Ua+>vDJ&!YEO`z(9 z+X_=BV{HgTYX;R_w02CFbvY((gCeg+fYx>CvX;|Vk)w3Qo*0x_^@0m)w1w7i>9W@E zhIXlXDf&&-=%@O!6cvmAi~7pJC3Q; zpf*(M>w$0p*1c#=M!7ma$15DwR3}`Ux!t`uKZ0Wr$2lCAa$Lu88^d9dJ3B~arlJZy?O+P4l9}O?A|4Kl2*#?I{iKLc$&}#X(X;VNZHU9< zD0;2-DymnF$)02puQj)m?XXu~eWsYs*aq8?i+TFO$PuU&Yz>GESqx{f33lU`ghVb2 z2#K7tFml1nh}o#c5>z9SwYygP$Y9pdDmE|_E(%5@E1}ql%NFBx;DKQaLIy7;pHqk} zv>h1{78N!#JZyQ$#4%xuqx_MDJr0Y8h0IzqcWy|eV#zT{N7PI>M>jHJ&cZ2dHO0st zm)i>d9zA@*1H;EC?fyOaGhlY$LMo3m!|qVK2{XeMhgA5Iu@fXEyBlw#n@3v5%v>Bb zJTh`2d_0(ZY{h%4hDXd^7#tF?Fii4;4|w=vXe6qE_s>m4??4M-QPg%!$jqf7*TlQ2 zhJ}QOL|v0G-^vqJG7XLho~R3pkUY;uCW4-OAsIGa|=5Qe#vXNKb)@~;pFV`c7T z;zmS{=J1+Y=m=6Kg(P0Xz zC-rMKS2a93OnHwUKHpVo11bLxD#YS7f9NpK8xb;?nX1H0VdHJlAUe4slcca@EL*7> zfqpNIK(^Mh;3aaA8F{8%#QeM=TACTo|zc zLqdM>Ak7o6NPev@sRQ*HtAxojBg1CSB5S8o%EYJ&&jyipX*4X;g|HuqlM4t0k1}># z{kBBJ}@=Ngp^$)rfp5}-p@d}6MvSwG0mmcEa$sx)|Xuri#!G3;{ zaCLICW(Log85ucq*^G#ghi8O`M9hr}RkGA5Panz@A!x2n4rkiKX3q$rkCqjZ)yhdF zUM*Oi9NAg5PSwdp;p4=NFnspmb*}W%|D%w)@+=XZDf%DI2Sww25MdZ-3&Mm8K{*Ip zp9P}xMauah!X;SyJp~!USdax_!Yv@jZ8!%Gd;#Q%Fs&0G2hlk;T3c>~HERmfdiEL~ zHUe$1FJVEv8mIx;K_}reAd=SuUk0fWZvyJDZtIRPt=}F3kqluI+ABc0w0;}_lF9-u z29Zu|_plruPiy~QfkS)shP;GNgGeS0m;)kva)D<+WGCS}Z5d03yb*W=MDm1-JaHZt@ln7Z zLAwz?1)S6lpK1{f0zLyG`7OZDcsL(8wY{u=8n6^}0P=+H_sH>tgL!xua3v4N0G|Vq z&UoOk4zLw@V}LJ$DBcKk?1Z*Myc#$YMDbC;&nX`D$_Ki3mcxYpJWSZQEAl_5VxGWE zPgCk4P&_}uD;_!!_}P(H#(fG+pqJQ>1nz!4xSHyrpCZh(5k7XZ)Shc!Bc z_xEJ%9EfyUfTMfK_KX2e2T@)vFp`I(fEz$0PngWZgtL1ywjVlakM@y1jFln00+KhDv`2mbo*zAur zl21Sse+XCxqJBbX8;CIj89QJR$O}44DQ*&UA?!UFbHx;tO)|h&LE#9Sfi6LK=0{to zfsJ_B6WET2rvVc|RBkfxTOK|R?Di1mL)4`^a1n@PqJaB&ct6l)svK_zoCG49gMe>< zs4dtu_z6U9K{$_xb--;rtOx$g!-c@1)6rK^?ik=jkP+cBV2c@OFN9kGNAvI);Ikmo zza97qNb(_&X)#|w-VylJOxahhW}%L=F}_~JnPFi6U|D_;@VyYs1&}`g)Xb6VLfCgM zc*y$z>Dx^m5MBWs8;Ws@Z~$-~h-?T4uH)fY;QKs$09eMugrmY_`9NSUh}x0xEQow) z0cz&q95eJ27J-5hrXOkC4+=t<&>>v5-w`;QhvR`qKxB^z*m{8+_5=>+;UM5aP!9AQ z0op|1{5!&SKsu36K8yw?fk=-LcnQR|qb-2_aQ>+S!al%49SC^|uPl6rRKsX;*0wSHIK)c0qm~b$N${hpTz{7+;gGjy%*fUBFdjkVO{;+}Y6%gfp73jP~ zmT?1SgQy=Gfxb&|h7K! zC>&wJWy>%Q5ncg238J<;1J50{-wg^df8m{t=6L0AUNz=_%9=VOL<+_2>==cL$!{fVS9yJ^&2ahHjsstK2J(5P_<1ScTvE0&!Jw> z(*f8qUapH5(Eml)jCjI(w=))pun#Z_L_Q((cuBUc6)+r>3>iYV9k2u8U|^e_(24oe z6Sx&5*#=C|V=U~%oC(ZHknaVAzky81dj{A&QEnr`zDcMrln;Y_l2IDP7hR0JMNeo^VbE+79xez)wNcC-Z@+yXE=Z z06YgGKUjdhGI?2qS$KX$Ucw*{$q??~VLk9P4;KRaXUqBr0bc@9UG%^eIkFzYLm;w& z@G>X{`q|4E?;z4Y40seo{p2{%0;0Ou?ZH?BkxoJ*i1ZNJzk>M$dK`g$K{R&-0pHt; zK8g4P!0E5Sr+PfY0R3LaeG_5Amq2BZ(F0rL%KBRY=Yq%{9dOeda+}5he*;mx-99{@ zzbV&i1Mn>n#T$V|JX{KFv0t{|`g|9i^V<0i<{#KV_!ejb!bae;M!8;FfW6+ub1c~j zbo>ByL0An;2JJ_f@Qpmw9pU}J2_NBmMhFK2=Yz;^Yk_M&M*mDe7})X<`ZU6!z~-OI z^Rqi}Jc#52fuDh-egd5K8J_tePxw1XgRmKR{7cw@FyZ${P%gqI;DxW`a2YWC8{7*J zPdKFjx)2Tm4*VANMR*YKcaUo$bOJTUWgil50+Bs&z;8h`ha3ks{SI8N%URF1OmSU`6FxsE<45h67U_+3d9?MLw}O%J`9)&T8nrC z@X?>quMmy_cKaQ5M7TR}C5UW`0d5D8&4dsAAqx4A%X3+7+Q5KaV9d>}9cMDj*p{R{9FWaxVd?}F$vAg#0Z zxQOR8#2bO{fjlu!nt-Q4Ui8d)32~qRnm>UXRTzs1=KzhMP=pEn?d5p-P7Hl-WefBZ z()Tt_Axuc$y)Z+bkiJLYgE@hazOxXGd4rI?uRwVTkAX;rkiIW*0AWHp2Tx%_Itxnj zgmfOA!i02=oWg{39+<*}bZ(Zygmi|L!i01VmBNH{W|YE&bS{*_gmm_f!i03@k-~&@ zwvfVvbl#7`gmg}h!h{(-Oy}bAc^Ez9?sZE&V8d*o&lA&Q17HvkV0GCu+_mtV^wJS@ z77HYKJ$50on%I&xyhm_m>tRy*=n4sJsTEwD#30p?J_~ z&_xi*Z2_&|L}7}fG?KYW2Y9mC2#N){SErxiD2>aIY=s!Y1Bfajt`n##58m-QS*}UG zkv!KZxkV8-VvBVigm2b=H`RXR2H0@J{YP;l*FpWP&i&U)2iYX3hu4_x{xCC~~^Qq#8wjn^7cB?fW~W%;1}Gaz3ET3ba#Vv*hka>tSGS6zB-;wUfaK$+LHIpXIa z{hIjN=(Uz19i+=Tj>0JOFWaW7{9p06QrBOVb2qK_9=MflQk^cu&7m<+dyA@<#Q3B+ zvAX_A@yF43{i@G-{n(C6F}~#aqFOsKchFo+b1#i`nrp7B6nSXukgPO6z`knd2T}x` z4yd0IGRmAx^99XeSIuvTqq#1W(m)mS8^V;g#`%qxp+;WJgB5e4GB;iiX-==z9Kh#k z_^O2N9el1Yscz1vI16kc*}t^AI!7ZP%~h56M}Gf89JSFG(0xPq#~R9VhE7jTx8(j_ zT{(4)qoXepv2s?%L}p=anR#VHcC!3K_GkHdIZctN21$lwDG%i(9ne^jkDkLkL4KhB z56@vR^Z&(#e&hxk1=4}maH259x!sORK(8HW8i>X}jggwhJf)Eg$y%*8+_+WHGXzus zs;SJH;wg{SibdUQKwcXV%>#c`-U^=u?vwYCAW zWV3ad#o%{?!a;*T?w|^N6y|Z1MlvKzd8~ERc>l8Y4f0TXEA=^q@I#;*T94p)Ne9_M zI{&giAf5X8*PudB5XjoJ8w!&Su8VY%?i$Ah(x!pv^LmYIJ~w0pGLcTMdssIQ#tLv@@{=a+RpD_Ml!yTJ{sQpm>ot}U1 z=>3QL;EvsYl`({NxMR;B+y{5``OC@%@`Lg$Wc@5v+c4!N9Tm@NijQlH$V>f!o~3JB zrXojq{_=UN4mQxZps`7xE&j?MltwZnTjO(9ZOg4r4toFg&tKKq@o$Nv@8C$+l~v{C zrh4V&F{<(_IPzYGpZ2%3#lQ0Mwk74|pPw%;|MSoCa=>3-Btx>4hw_pR(nUH+w^Rm| z#V=Z?(15g{yXzEi!rkltg$HQ87IRU1&>*ZoV_jET+eKK4`^SC0fxUE3rG52S*qDbk z{c{K__lhc5Olf%}3%LQH8@_+tY-7R(M^HGZpkhsWsj@Z=v<_FSSzD#cYs+*m3`afc zypD0B_QO^i*hcrkQ}Dg)U&0!~R1e5X={1E(7xa?O+u9yj({BblUz6;qv5(Z$cdj3g z`ayT`ZCPu8&Anjz38}AG_l??w(KZ!*>^fm8gUY(m{!v{%lr2D~8NR8ppWICUsit31 zSweNT)HP1>yJY)cwm&@|o&xO$ZAX1+4=4&0!HL53yu6*ukSyh?GCy6#qYgLM4pM(# z%KMCUyUTsX1pRbgECA#V`)chP_?AA?(z+kz-GaO(&^3Kb?n^f|9#96&>olGuy$His z*qd8Yl8Epi&@G!QNEg?ch`wY&*m}OA`J&EcAxFVPQrWT%xYyMF9tXeUo+#PA8TszmGYgfC zI&9|iQ+RD02)n5-(lfzQU~RJ8RvFk%=K#nSde*q^IKVR)J&V<9Pv*87UPU?Cg!%Bg zXICLd_p0mGvx@rL&XP@J+w}@U|GA#X9ZQG(cdYEY1>g0+T@T##z+Dggvps-krhlw~ zwYh)MJsR}Sdw#%L7oN?o|NQVzetv^(*Xtbk>?1utqYak+6P|@&4}DgapP%t;e?9vt z9rEFL=BCeHn-RW)pI>nPmp;G17P6@}woCTo^CNsuYaG(&M~vye{qrNr*5I?tA(Txv zkS%puBSoHTKff<6x&5EtQ3lH1279q)Ag>3JEw%N%B8R*-XoJ^~m+CJO_{#N@Te$Wu zmnE&qB%&;6C?`iu!}Td{sc}AO7 z4jt0^m8477Df@|s5s&rOn>#y(vU-7NEl*jCsSe9v&neV*KjgN9)}rhvU<48TM`3yW zaET=Ix2zv3{zUl#>@fo?`qJ$T^RljcuTt!*4Z?ra4kw@+dn@w#UTwluPvn!=18WhM z%DBmO+nVYFTQDAIP4qAOQg!{Sws9D%H`m{5vR#RX?R0;hhPo*0i?^arVeHU)>y6Db zifwg4)S+Vkj`~qeeFs6=ArvThGnEl;sSu}iU2v0JG}MZJ`ID)mw$la2k_it2cqvc5#5%v$Nz-NqHgp&Jq)xGv>WsV=nqiU&n^^4 zX(U6kl;@5;Ki`b+U^hLhP6p+GN({ldUv1^63@Ym%(H~$(FA$B}+S-4srZ~9vdM9*c4$;Y>- z?&qNASI}ur6sEWvt-F$sd~jR(0rb*%uS=gVhWy*0r$MtoexUZC8h_J;(zp!CQXa}n zI!KpN$Lk^4c++FNssiYwdFFa$e+-!wpuV76_DoB{RlSZ6LBy z@d4R>!=D$Bmp*ThF1j~OSIYUPBiYJrCfiruh`q>1V~aj>QJ?a;5gm6j582FZr#jSm z9zdSSpfe!Novg>rlufqtI!vys9^|8Sm_c>T_fM0jI#6BeVi)9T9;vg>>QctvDNA*s zI@PvJ$kuth)K>SMlKVH-=}!6bZn<|oaMuHOJ#g0pcRg^|19v@e*8_Jw@Ne?Kzwxs| zUFrnc|Mcfy>dWxKe|G(Y*Z;r1{`H?;|Kxq(KfC_T>;IqL|KL9O&+dQm`qMn{pWXlD zKIjD>(4MlguV#(32mPfigg~bbkM%)X-*WTxT<;k|&x_1Np|Jn0z)CcGyAA{;L7V6rLb(JSuZfm>C zHLv`O^2iS~C)RXdsB0Z=M4rkf8!8R^n?op@?v2$wAKXZN>XL`byd`J6Zq{Y6gT_N7 z$oi~MUFuR7St^6d`dj;ZZF~fq=<@=7W}-7Eb*WQrWJxFKzTxvswW-6ckb#ZVA0~rx zK=d7!+SIQ)8OlpKNY_8Ey=&tu*iHA#VIXQdT2rENTirOJI7%ZKlBGPi^*ncN?7v+y zsGA+gmD4}wEamO0?_IrjJ#g0p|2z-SuL#ugqPNZ9xIlH^7SJy`keDQBCTvLJtFBN66T)Vo5i(`?DTvj`Lw}wi{IR?o$q>MAIS`hW%deoh zvg!)4<>jj`%lM8AckZuZhhmpvr($zRLtF7=3<=~vtgc|GG~B{Ez@W?*O4(h=I1AK zUPBnP+`axq9#E^8j|%U3N(@cZB}OO4B*rD`6LS-diFt|ni3N$KL`xz|a!m3`@=Nkh z3Qf`_MJL51#U{li<);*+m{JN;%qf->mg<6xj?^vev$)Mn~3V>071^_e-D#?1UoQ>HnSWvR0~vzVs} z@AqcRlFU*ZQ{=jaqPEefZ!BsYpJqUvb5ZL&)VlyRx1>25+);Bc)ZNEmK#g)yCv}E9 zYU73a_@GAqs8bMX6^eRAqh_(FTRduKK>c!2!#vcn0JSVcJuRrIBkJmo+IpeBKB%!j z>Kr81IvVwkMa|<;cLQpli~8rm0|oFwA-rIL9~|Kcclg2!-td7x{Na%x_#_lwiH2Wd z;hA{&#sKf+!asR*x?H1T$pC$-AvGs8H`SP$mztkikZP)Ed&e|&nmc-c7y5utS|~Kd zLW=6Ph|>7N;t8JZcL8JiiOX~@jY%*!muEX=fII%c_Nd1d)z z`DX=Xg=R%(#b(848M1P-^0ErD3bQO(j@j(ueA!^|AVRy+NO=&(jy^3-uPgV}g5vSAtK1e?m|~ zXhL*CY(jj3At5&*FQFizFu{`GnCPD9mFSb`pBRME5uF&D7@ugs*vP}UD8#sMOma{1 z!pQJX3c|>U#;Ax-G9=|D7r@(=R7d#P3qJNw3rY(`&x@6MT`qcDL0Td2Z(itY{)Qk!s3F=AYlt@(47r9p zLxG{tU@5k}|Ug($p=#!!7kFn^B zEI>tFfEm&1CX9B5*8ca8c1@OFRzQ|EOP3Xs6_=&Y%E>Zj7BodaYikkI~2J_4*vWQJ=3j z>CJkUpib~i&?NXJ1SDt^bO|vDaS8f_oCIS+eu62%oWK&*iJpm?M8Cv*ucB6t3g5Wg2WR=db~y01*(FH zn<&f6w%F>a?XlHftoHPBY-^E=)r24kf?TTw?LoY>PF&Q8H3Tp0@B7TVxq#UA^ZWe% z{PFpaciwqto|$>(nddgo%to(W<#0J1j$Hm{G7iTYp7JlC|Niqo-FzN0X5A3Svjbl_ zb&WIf%BeHwe{-R)Zo!?mEV%J@U+s-|+;L~j_a8U=7R2xHee(`q=<+Llx8Hfw&F2;r z4Dx3|A2RNIbxTiPr{gro z;G7}Fj?c)caq8@QPvPO!$$-w0bdJL@Kxg$m9jnL`B=XPYsA=e_l&wpy4W#EG<+3@F zbTmHcbc~lor_)isoaYXwT?|RG+JXh9iyb&*ZlLXa60UcW(#_zR_eq zL%DpOkMZpHFW_)ApIc`a)MI3aS;4DW zGt)LNSTSr#yvtmBL^3m(`%J4PT=J4x*=F2-I+GDj+*g!mCa?F`n8}!bek6I5ziyE$ zYE3k*ZoVw#KQCwu9k4!+X2Z#=y!%fkUZ`Y+rn*>DnBB%CruqJ?bt2Vs(a-7lo5I(5t^pOO3jn%8qDqo;PB( zn$|XTxWnOyq;e;k)~ocWOm*;XT8y=|Dt~aDRZNVZzqq>##A>Y9{aX2h2o!9v{rgmljRzKlDCK&g{kH zw}B*>yp6R2CS&)QsU=|XJ+L^nJAL6=jYUg=^?s0yNgZY?su4Lu5czc2Iszh#1%}ma zCU5Y9MS5!{FO?1_?4DXeM1I%>wqiR)KI# z{pfM)pJdlxa-8~ry-Tv&f|?nd$)Ja<%XCR6t3WrB?dx&c`#(hLSNr?aa6wkTUiJa# z_-`hq?{zDU{Qwwd(rG4IJRM(Bv)@;no;x%ST zZ&%O59|iNJrqw1`ntRLufMlAfh~KAjSczt;@K@hq^g830(smC%XE3dM&BSMUi_SN# zfo5vhEaA0g!)JQ67DcRJx0%>*R=A`cawFM2X7QLXv^Jjh%bLx$$(oMM!-0BaooTs0{UM_)+h``6>R6^#W$y;pX8~AWt%gFgISc!q%pK=e1mXnrDm&@seqtH>JWKfLYpgSuFe202*6mrsnK76HB}EOk*l3YiXz1 zlrb8&g16v{5R{|JYJ>5nqBZKw1JZWE7#UTna1;+?Oe5uZKIfbltZZ92*;w7YDdesZ zvdA$jUylFXOkJKa?XJM(V0|qxt;s>-Ift&0SAVa&#u2|JQrQ~2KAccF>35G`!x$5A z%wsTidu#QyrrZyINiU7(yz?r&u|hM^oMR?BoN?GyYix*y_FAN*HN3MsotH(2jjMoh z_2y5E`=Zt1%I=6Usm)By>cs)6R5YO8|BQ*SW=KP+&g=sP9uJ zF{HMTziz%vn9xkfzl82B=l`Spf13Ym_}{)BV2T$V)^5%D%)ID)-1$&mEG%8f@_6qfsIe0UV8X#dZ@pn z<)zPFCuD0{5&!H=;V5cklLNEKnoQx5L(Dqj*_u`UmFe;Q%juC7q^2`R^Nc&)SJE_; zP*o~}^`+0IH}!O?w})5qB3)b0tZ2MQrBei>)~q7k_@(`5gWP{X8z}~^w$THD^BTk; zjeDhWfoN0P1^poI?*|bA{|dD&E>rbDgKJwU;SpxpR`ngm7D+wk7bX(6u0!(OQxvso zeNpS4;;{7&Qf)0}#wzs({r5Ngg`eH%WhUG+g*KMv|(CXR3Ugl`#4e3x04oC zI;k63#9KQ)m$WSxqE@inv|bKdJ5>R*y+&3O^@>FT1g@;I5K*rO z6Yq3Ktj)nLM{dO089Om(1w7H(>fA$nBCefgZF}VOo#EQnY1S~WX-)Q8riX{8E97(; zvBAb_o{9aP5m$SpjAk}p*YP8o*lJn`irGk&`Ccz*g70ZP0m%ffeNcC*FUdokM3vH$mZaoJt0?fsA+O;Y-q&V9u+n6HPd=U<%>FE z%jnzu0F0s5p*EonqAcBTw0yIbfj)k1Ru-K7u+tIunk_Bfd52munYgpnY}xGXI0CWu z;y&db2@4Pro^*C?aK;8{1ws87eY8(8vFTu~pjFLhV$>LvJY@LO)ui(zy+_qt;c(~@ z$s$$n#*S@{EmVuq9HG5m^H3wvSJgiLP;tvt%}lS*?`kv6v&IUR|^PNPu_ zpQg?6X>IO>WNG3{6+Zl_9{MaEYBrr^fP>bcyf`}c@`uGxW)~PG1$Iw&INIFfsLk9s z(w@L-r*3P-7Bw4Osyw=DT6@eyxg&OpXzKr?I~F?uHXlq?=ag+WEmx-S>3>l69j(~e zWrs=GWp-Hzda(NKWt1qOHB@wU&E@heQemDEv_NaOsuBa1S~S+`yb1Q zwqyz)Adx9trC;0E4a{{20r;*nGiNkPUNV9%m^e_rmIX$+CFC(bd0NML1&LI!4^M@9 zg{d^H5Gya~e(6Wjx}+1$EO_@UdAHoZl}FM&hT>8(K>BpD+T4f#+v$*I+uWa!5}Igp zf0<3Kf!-bFt-v6JBgmD&U$9cORnR}Bw zlJ1Ks-sT?7UwdpPk+R2jYBtr=T^ZX5@~oLy7|CHyUe^hwN3%WFyjj+qPnKJN`O6fp z{Yd(;9<77gGqDM+?a+6o@RyR${9IrrZt|D&4MoKSaCL+w%ouT3pif4`=MeE1vlaww zrtoeJ?s}A{#KwR&Zvt0d)z{i|{rL~lT3Lp6q{$i>b*8W)+g?Rqd-J8en!ffnNqZ<@ z{o5NvwM<(glXLIybc;7=!&B4tA8ZbH>dmH=dq$~7x9Lf{QO{$;%9=Y(<97w2$6?kV zUSKn-XPoInS^foM$=l=}%U7qid(`$5Wo5>5FKA8=Q|H2Uc^O!?S-nYq`u%6H1GM0? zd3ODTfBcvUvi8PrfmJR3Pj$B4lj5c~;(q32A751zHVy~%^8R;upP=7k=h8x%C{06Q zE4ULfC{FI*Pyj+$%|l-0$?J*aPj2IILI!_dNtOxI51x!?dCFZGdB z{>#vmKU}#pR%A`fk5slS7-UWIxLP8W%?nuA8;a9!Vn8+Rvayu7+wWK^_!gO;xQEzsG-8!;W-sN^%rV-jLs+n%Z)??Iq(UT7C8QFYj zPo~|TNFnB;S*CRWB%;!}XRf4Y>o54}n`3`a!n9Pj#$#sUW>F=h-b~>(u@|i>)RC&r zOyL^dtY-6kN&nnVr=msn`$~DQDxzAa*|OhfmXR*2>NLw*%(e7_e?U5&m$JU5=yD6Q zy%X27?X)?xgV!AC5#Fvjt!2%vTeVVyYO=-=a5#7}?B5CV$eeKrEpFZVjI(v?1`?>P zza+o4_bIaZJ(@KW9>4m#oxr#hVlHd0a6e6>#>350{+qam<#~-f6KC877~VyGYlA-U zIY1f?G(&*a-Yo0;ue4@;xz?6f&R&b+=ujJJK^xhf!8JROYHIyo88Fz$6rN9E)B2H; zb((r)43ufOU-ecXZ0rIdUS{-7~T!Y2ai@9zt+rgr%V2dOrb zP11~XL}v!qJSwef8Pl{}`stT$WouyX)nHCm7ov^uoGGj~Q}{kGtv#?k*fsz~3ZJMbmuH8#Gw@U0S+v!4{Lo6mzBD~ z3%Dfu{alX{n}W2O7d-}cYV@Jop}^FHP9EtKP?cmr1CaYNorzYDS^4II4qMS?HO{qZ z$?jKb^cK7B#$)P^|0i|5;`}bcp?;OUZoOiR8$S(MEg@@Hu;Ji0@3=V}Z0NircJpl^ zYfH%LEZeM?jq%f}!8=&F!G@2g-h4+qIp-f$gLfvQ-PYmctS{o%nTdiwEr+q3(K#_= zm~HMSd2!S`921%cI32O#2{i+99I;a;)XC#y_cMpT$RxUbc#Y9zZ82>cKWkYyEM&Q- z{=n%7Cfc2$q0?sncgVhxPckupD%!M;u%YS_iKYa~?JdGCofCU*D#2wQvQL8oKA zXf9@A|B*KL2401_+uYBSLLP{e`6WqX-Fw3pj-=2>ZSEiSefl=Zpf<6ds(h!lUeapl#b>#%r{3@PC)z!2?l4K=4@vh_Qo*hk zUu;gI-Ph(W<&_1(hjU4-Wpi%_-5yRlboyrc^Ccbh$Xn&+_yxLw4VP?)pGuj74}hG4 zL;MX;?v3Q=4w969oku#40y{|<>;8Vy!hF+M*NGYFevzCY7(Q{~v|dnwp!ISPdC}70 zJtO1DbtK-(OSg)CS=iIGx64oX0qT88{pf83o!|* ze6+Lw#DxQSjJuLAbmDq{Ig3hLn2C+v;0{3 zmIuq>AlntOh-o=xS%u8R_6$2k_2bJO@k4kPo$4p!1m%0=>!^r@2)`O-wq5NDOLl8; z(-e<0oE%X0hS>e5h7gy71XeO<(8nA}wvpH>=;!0px59<7S}x+hhPH zPIqjYOlDTB+WRchZ>?yeQ@&1bU-Y@ZHv;`2Ho7av8-sle#ES_G`ZXIN8-QD0{~i?7 zEL_xQHoXx$P1Hl5wk>}6H=2?BE|(|nW>j(ai^7}qW~3meI0C~(nU48O*9t=u)L}!w zm_w;am}xf(0LE1(_+CO!tIQhrhE-fDLUr(hhBeBsSLBy65ry6QLC&BB>e9(DIXm;*uEW`g0}|W^+d) zCfL=Q8}kQ^)q@gm8Pkjx8qW_5cRD7mSb2Um&q&FRpf%}>-6}aLmy({?prDl#PHf0c zPV(^X?f0G!D~YBi<%Y`9&*L?G&52zbN>1}uRSb%m;o1{S*Q;OCidnKFWL@z^aQFLF z%utDyV@=C7Q&)H@+kl^Gsj7T=K{`DwIo+E!v`P8O+35lFBRR=SD^A^ekKOx+kLmq} zpjG|F?)Q^dvIwqcBcKFF%WZyk`cU>Hlx0hQ0q?@%F}wcCZe6;q*E%!h6F8>3OUq)#s`M&eWI`P8`YReO=O=LXV)1YYbUN*{-Ul%|;`770Yp|Cz2{0y9*`A znp%W-f$5GkTa=H)eJ3<+wqCam8lk-cR0CwPJ(&&J=^mP$?xFT{H#1(QJCdC0Nlq=2 zlK)1zQU7K+U(jN|xH;E`?hjV(G@8O_WtmM3P+VP5d4NU4%HOVL!O#sahHE4xo6FWq zwwrY!uC{xMu|(ny8BDeI?S`#enbUW&d;*>DHvd~Fg!{n`-1fu0bsx{Ruw~*t z4*0^ZX`ZNSl817)kpEuTniLQ|f=_u;aU>c2K8wsuMxP7A3zD;53|l7v?Jp7Zz*3uW zwN-5wPM0a{+E2??)DUO&+iB5{HLa^qF{f5_@@PXC?avUhkbY5h~H=&$<)ITJpZC!z0Li9)~|4?I=2_9 z?ptz(4BX$xxQ-eQj7xLJuwAU^-zzripB9V2LwBnzM4y$@gO+gOeW%gXfvygtvSlHX z!b}cT-$P3=D`(GMI9M&0q-D-di-RyZ-J=#uMsoJ-KG&}8_sr_xht*ZO@{-x{aca7* zTs>RFBs*@`q9uP8Lo)9caX38vfjXxbn22cPE&BL>PSU!!*m8q){Xk6*UzEH)Rl|-$>?2IFeBi8$Bm7mxX>lRPcx;SjjEsvJ`qiag;yr6ZT zX*A)kWJstNW|Dn@j%~bJ+lj%jKC(hvawCT^lvq%j_VAX8CvczHC{;rP>fHHWL%xc$*xY&Z&Z3q|_rDwIMykR(8Z& zww`PZPG?Y?Fs7>+m{xvk*tJzXidYO;L*y&@ASrCUVhw8zTT=sJ*PpYTY$}=(=*|>g zfu*Y+p-QH$veLN!93(-<3p8HV-0?h*uyv;|Tymh}and1nNnD#J^^P`4p1jF$7v2Y= ze6fil6PsffS}zM?K#N(a7L1WHBo+>r(%uUG#|KL?pJaY4FS8+7xnsfB$`j)f6_IHc ztTt0WF}~Fi^IEyB)Qyi3`0=ySC#9x38EY^()eH%U-#MeMjls+gc6=>Yu(I2@e-=Z~ zSP^;%Ko6zRLpk(7`W-tsD0sclg{+OgoYw2tJ3;+Vj(*8g1Hni7K-Q}#f*`_iX$IlQ!J1&d9~ zBTzBT(Ue3b^@-0SvC-5zROan|>)f`!s%NJMniVIaO^~)Fkm+vc$`p(_LH5 z+8oo>l3>B!J3La0_E&p_Cv4>pjMU~1in?0DF8oY-EoJ#u1+1cB;uVu8?~k3(Ffn>L z&p{0nWoWU}(kH40I-FQi>R9Gci%4cnRD4)guM^=$GG*`1w6620nfhgRu^KZ$SeZRH z6D2dz?4ysuxAc6K*m#cEQ6}-Kex`#8deDzmgB?@-(PT4G;BUVlaRp`fY_FfaOV9M-C zd`pzMT}I=tDHo{?qu-1hO%$VP-R&vsinwG~fpu%F9(a5sr@hL$2J<6bg`m3)Rm&T) zy#J(h&yEuG{oNa@8MQuU%g<}FTOYe1*fqc#`-W+`T{u022I1hvLLZE#v6M@%6Z^ep?OeLQCy1j^lnxd+I}_Vf!O0A{w71&4{?*3zRqLy; zV}$HH_Hl=P9vf9%o*jd|ZpF_r>#F`5P))@8wZB<+fC0T7Nts?Wxu{rre+gS#)z3Pm z*DL)yC_?W|>sf!hlm^{HME|mOm}p;nVJs%4phO4CpH-pm{8R>bnKx=}i&%~RXZV0{ zS+UaJEh+2O<+$O2F9Ct3C{+QFT+T~r1m()sP1JKA3)IK_Pe_%-#+qK)O~5Mi5}3ut zVy`ln`n7+FaMOkZ;-6)O{A2+uL|dG75$lhgz#zmoVm+w|UzGNl{v~0F5ZOsE;S*u& zV|2|L=0Pa~5=<;J;rg+Y)H=dm5=)jGF`6DkXSJ4@iH~y9W7N;G*|A~jQIgh@C2AGV zwt(j8iA=^=c{Sx(H2CUL?qM4;nb_Ik+N)UgS9$tu4`6{9Y<2mJkXtUj2e}#9C6Wendjzjjb(a zqNd!T&S#H=jnTp|zJtQyk~SJ8@Va9leoRs}XD!e6-6zJ$JA(ugF@Nt$?B7iQx=mQ{VJ3iR$a4B%N{Hb>US=O8rHG5%qi#Pa z6g?fgtr_)d2JB*ksNr>LX3qyQL)LgN!eZGa>QZte)?{|t_e-QeomuONxZYySm@9u) z7vi|b4SK$r;8SievzsNW;ZT@x`V7bt* z<$gl8&@=-qZm3}W)nl+TrEBOdrY=132~rrqngSyXYzc}AD@?V)6++gN!m~rxpPrUd zi6ve~>{{8Gyac-!g;xEPLT1HmZ!FYssn-3+H(aW1feSUMYV#bBm}()Ag$=V!+OflB zZM4-hPS#8l8)tM#NGIwLwvdl99be1pqX;u(-&RV|OC3Lbr)=x|niJMGuVIAzHPdY61X@!ZCDa7OAiACg7?IxpgspxOFt z&z_M*{~;@m#nDXr&zQ-oHR@xTx@?9u$Ikmd@)Buh%#c!QyOiKH{&8aI4z>%`Rd6V? zcGeD-e(Yo{ydf&2bE4$52H>H2o~snoLVL8St<+Ybv8p8~4xGDg;_83upCf;HY7v(D6|VM>U)W*&o*i!O-)S zy`e)t-)B#|;+kBeQDnYZdsnV{`+zX0_K0hn(f9_LD3XR*yEs>E<^u}q08vo4Sf7+% zgCZ{SwJWbaHmIx0;kET$$`4gPlCo$(wNrCVSEp$1pJemU=BvnSH!DAmO|O_sJgKTX zPGQN5P!jLEH-dvBHN_h#X~yk4$yhziQSve&Fqvk|@(<9haU$Sc^jEx|fE6H5;IT{BL8j}}uuLo5UBIsTtiL5gCHPNeI@rPxPLkao_)@5H2^m&X% zC!j!|NBs;g8L^rpu1!XxSOqrv?)0b?;?qv$7u)DdYxHfA_EU>B(5S8&bQu;t*|Gx=Ll7l@bGx>)S=P=zb*MIkfd zhS_jWjkt$mLqZjUV*|VLd`8njW(K=%p3!(Rsfxu+)|+~=u4WTz!qd;uhHF;8HC~Zj z;}!kaxTq_?lM>HX}8cO6c2wBXCe<^3V#;AxnlD3R%<3gLof|l@(@8H7}_blB(s?ac~$g8h^|8tm=C^n076= zrQsgmX&`#h4aA_AR@8Z7v(%puQKGL!Fmq~WpnUC$1&r0UofE;U+Gra?RvT;#4>qSmzvbtp*#1A=GjrJEei(#R4Aq1ibicpp^RY)QCE3U z7WC5A=N+hxThoVI6X*-kN3>g$jer}^fj?^hegF{5DF+B-Z==7Sv@}QWRUg=ejqo|~Fl4wZ1=kt17XO~P`r^zCk zG8$WCOufzh?%98wgy3B z*`Ds*ld+GDoY98*^ObWaAL+nN_l}okDq&(-4E3C8Y1jGsfaGs<5+uq2N#tdZp)9=V zQNfyZIBU81LZ|-Rzn`qgsW+i8@Fx&jjumif%}V~S;{U_^f0X}^ssBae!qu#;^K$hQ z`^~4R%Cr_&o5^SWN&}x8U=zGlKFp6;_d#k?O?jy!F<%l(tf@tq=Q zf@{Qx(N-#UfO;9LNF1`%#EIOUvy_7`*Ke$2d(CJpqM%4eR+ZSaYMU;L_9~`pY5HCQ zK76`?Cp&No)C3&rF%nt7N77s(-Vwn-;(6T{HgH7M-=>ZbVJWA(0+Cc0Gc{Ob&B(O| zrVApe%XpnqWL=eO4apR~xIq-|n`u`+iDm2{ z_^m0u-hjm?nHIh#r&g_FgY4$-qj`0ZtO)LQ)ge4BxujU_Cz0h>^j+=bHM{(Uv>G-F zp&;hwuvtP-wQ?h+#2rR_5-5|gvtA_djko)fd@M{e-Cz84%7jVVDD-Eu|9<279 z)&c}iEHK_1_l9c+g|#jk@Pw0QX=~`T&B6M^2vyNi!nHYJDhn8tQ=D*8 z8#=mdd6s`fEMi^u1QR}oj(`eQ42<6xlwGFa8c`wQqi~x0f+fwe)#NpaW(ZdVi{k^@ zTtd`Rx=fdje5g(y`M|5yoARtAxB(iI1?<)EbvO?>XdT%Ib zbw{lhbqn4GYY#38kBU(_xnv1+rTvstAl|c&FWFj?tW#oe)?mB7dqdWCwO4hOC{la0 zxBV?Mxzb-xCuDKgg!p5soVSFe;WqjN*A{gd1dl44T4ajFxFndk)PX0j^KU(#yhIMe zwJx8vUzy3PUT8$Zn}9T#?Fq{j-e+&Lt@u z@+b@vUiDY7B>q`m*?BU&3z59fYEQ0FOy39>YV7xe;<;B47@sf`l-m%9qZ8N*g3QT|!SLxP!Y z(hA`2`%~H#e9oEKR7nij%DZIfP)T)g1qa%06Qpw^M~|JPMM$gKIL7u_^^Vso<1Nx0 zqwE8*I?rBKO?2Ib(vRB9F$Xs#?seumVk6b5eOYGh_0C-7l?+#_=02Rt#eKH!W;S7O z-!J`)otk-x^*XHbynBDoCa2~&bP76__%_XZ*aUr#Jxv7J-Txz+#Lfs|zW*u$3lBmv zC-Ii6ML~MRJtn6O>!H8IVON}>;T-nl#kHHHz_cPb+|e1Pb;8$3j~>^5I5`y1qo}zd zjLnhRkGv&Nl6_Ssx{6z0*w>F(e+?(ED~cwk`(Os%qxW-sB7XxHd{A{kS2#J@Q^plC zZ&jfvNt9h313gkvv21dcRqG8_e!=NYt26LNXRz|i_<)Gj9pwCD;|DQ!6{inRmQ~F( zZc(p7=Mo#Tlz3&9Q+ktJw1QtR7ik;wdknA37>dt(I^03_jlwvhNmrV1RB^%i7 zUpf|NUXC2`_k}C3@GP1x%NIp^roUK?r03G-;!LYqG1as9-SpU?wb$_G*~KfWJ&Q*5 zD}LZhDNYP=W{X*I8O8CZxDxG}umeInCVl5{rRYFM|LZ&dYv+Icy9h1h$V`7xh-K&v zx3!31?r^i5b=6~m%RAz598M`{{F1Hokm!TcZ#H{Rv?aAZUuk+53@|HA&!W7w1ps^H z?4EPv1bC+kZ~ms7GHAwE^WXe`dEFBR>|+n?n#D3SnO07yEZD810|o&>M+b;l z&&H8hqfJVsM-ymqk`&*P1=dcS1gcY};B0a^-}a`C8R*pq`uj%u;;wuW13e-03wTgs zn~-Q&hhK%Q#!USNr(;#P5?7O0=(4Zf^c0CGcMoYdy%mSSKXz!o6qA^^!Qsk%MpFw# z(ziyf=MQ<#kRS>+pwRmf0-3_Mo&yZZ1N>`QrtntY65UtF$A(gq^C$&!O1FZHKaA4I z7!HFbt}z+0G)-^n@n_ z5E9t!Y8RVonH}nL9uhBtTt>$w@s<{@UmC)Pp~V_{oWSvxf*5ks&&9o#-~Ed|+FI z=GZ046z=^!1Z4eDZ~G$_0(c1Zslv_V3msk5bE+_VzB$lyqEI3%XthS>2e$)2N$B&0 z|0PweCXe(z*19m^E{k&0!Tt?o==t$+YJhXt!i!koNK znRvcjxRHm@eQc8;);{NmBKhQ>P*PHl`2|~e{(8NB`oItejc&e4&Su&)-|LHJ?n;q& zVXg%er+$a}2p%URo;tG^r$;P; z86cQ4o$3zOdZti4BO`3r*|M16mj6c8p z@ydNypEQ)GxJS~u#~Zu5q5Rtu5T!(d~+3 zeGTQ$=I|WaQ2s}r)?ea*b-;3@FIop2NBX>VP4XySw?ZDLu4|OX$?F>AapJlMkl~Cua&rGV{rMylL)|;fRar(U}9tG?TY_I!{WPt@IhQemFPmkBqsWnogu)4u<6xeivjVpiq}({l;RDk}Kd$LlH0~k> zm^~nI>t@baCgg?w?sn_)oci3cHoyoHZ%-_FIlOywv?j5_$)95>L;ESH&E;Yt4|9U55L4I!Su!9Or9uD zc`NdkyUa|h@xsMqTiaA!nO-<29P^!zTuBle1(f(Rf%+r9*Z}?xjQ?DK4BRw1<46N$ zJD0Vr$dh=AKhulxzF6+~fwHODwjwY6v1I>=>?pg3dEw+K(z$RZ*RMm`+3j>wF4Mfi zs6Tvt>>u@qPm7l}Zip92tAolfcXHy7ZVxQmMFxY|v{R+MoYklG0h?UcGXgpc4?Q5w z$EHvy?xFn&;|InnK*m@-Rz1=cdBzLavlsLYGt<@|6Eg5jTgNwEO?-n$#eU}9phES!MoV!?$Ebw+qQ&un?i6*c}B z3TZJ9?Fd)4EE*MdZPr*(*PblmLZU6&Nx?Mwahoj95bIC8XZB46Wo*%XEMcBkLI*vz zsrrNf!PMO09MVn_OlW=HF^;e5)v41j6U8>Cl>m+j_hDMB8Cn1LvGL zomo%d7Xzb1oxFAYCz!n~m5Z3-x(2`#&(#B69pdUf&O|#om|hiN#yQ7Jhm-C%_*=F) z{Y^qN%4r|nXp4IMbo9GU_%!kH(Q@@LutgK*t6EN)i!vwbtJKi(SdJB!$lXVnlbIH? zqCEbOWWj?PriPX*yq^~}qaTPWo#q%E@h8}UdIPx6ezm^Un`*%~!1ILj zr5k$mZVu_DIn}d8U8t8SXILd?h?#W1Ge_|4-pGSV*juE#u6FXIxjxnQSUJ&mb?nDw zUDh^Kmf(uvX@C7^6F89IH09<9m=EMeXhE?2Le2(rLn6Tk!4+O^)Y!w=*I^_%ROd-O zos8Wko`4ktSVwbBBD>AZOH@3UL&cew#!rZi)08POpMTO-xB5py6nlY-~+YA3#NKDTU=X^DGu+RO>N}=J9iBx>ktr z#Vn?_sqYQ%MegOtf+*V+u{i3F(uf_va#A+{fZAuug4&|;Arzo)76>5I9+1(rkQLK$ zgYYQI{F;v)m+@ljRK;>`wzA;6*FlDEwOiJnSPHg&WPiKE{`TCl-`rJv5R9E^R=9(t z;}VB5LY>UArcVRaW@_-62pjjwQd9%hHUf7{kfH9CK5<{Dq*vE$z3E&bI$Un1F6S+}HjOrD)RqD|y)C>sUy!uhFH%zxbJ1 zLi`)Irnco-pPDTnxzJ-wW9pa8cnZl4x$EmGGMmiGLtN~sSKl$(LVwcZ-r&7* z4rpW+#-L2$Bfwxt1kmbhF4FJxC>=-9UPSB(O}}BSrdxwl^9fpY+^$Z90#|W$n2SWe z_20WsTtA`x8hEVHBnPuJw|&t46gjK}%Oi32VDs@RIRYYTi&gkN`Bu4uYyQeMn7iAv z>UO3ujdO(w+sNlME^=qQfVXYDsk`!YS6m4~8c)PjzESX!D!7D)65lsjH`rO1OV$H= zh9`TZ_>fKRa{$4bob27igHf}A7{a+O8;E7i4Tt5FkiJ(&^xhDJU!+}`wiv7CCJeAQ zO~MVo_av<{_Y-7I zgwrLh>%>ed+sthUnT|#VR<=vOI6D^eLLZ+V&K@y?2ojCUck-b_1?Yw#P>QrwH8Cxa&+F6!uYbu4Gm2L4Bwwiw(){ zC2klmZM$S8r(d%SwSf9U41uFO!r2vgyYvD7ymWg_F5`%%rhB8Q$sQ=YJe<0+h-V<2 z;!N;$!W?bB)#FD~yCI5@RsS@mIhH~F+c{mYkK8OCfs4>YE93$pU*hweSfM)2+l#U1 z*qK36rAG(33?-c#)HlOu5b3-`!OAcgO9kaZC+*6`#@WW1e*0V;t9?TqBX)Gt0&>!v4xWh)A4s5$e0qI3Ex=EFKAneKs9y z@Ss^%7A?b1ah(_Ug*YwBUdJvscW=Y~id1f~z0GFHzBO|HjoI=!Qeuy3eU6~$7N+4M z73wxCKVNW4C{=|(CQxLX`c_a@7UyHs7|@B85XWJ358Lh@p=GX*?*>k7C6AQYOM_J1b4J zwZ2+v7UGzFgxE)60#=e`2)#_W!XhPH(C}e ztRJ?xQUz1+es3CTVz%C{eK{8pvLW;Cpf{!S8hz}l84G;11oUNWi=V6&@ ze;Hyw7hZrvBIq?MoN#E%{ofOWzY!}=mx!H{yW+&t$F#B$1&R*PQ~(i3hKR!`bX&!m zs={AhrLy8s-{S2{Ruv;X)gZgUz#QSVqeVV&?sT^BV(qhl@iCw{4nlqBF6jnI*TC+2 zxV11x)y8>-Y(|exGy0?PGA&zFiH`i;q81X6DDOr<7SR@ENua!Z=YUi1E))91=8kJP zUezN*t%5tTe!)Yh(c%>M7GksDda_{pV+9+PTR4EX7+#Ap86v+2l=O?DVNrf&%V(>g zinN(HV;m2M3fXzz#H&Z%**dS(&YNTBMR_>XD9KBlVaiMIn9-k}B|BAc?H}Yg)TPX| zwAZ*fHk{-BTS1^`>$5_=RS@&%*)@u(A)L75N~vYbMD>(gI>@a>=mqSA_&NENcBmVn zp;b0M+4qBGDm>e$vR;l{co+cBaIq4k)X?cTIE zF~NB`D2o>uUUz3u--c{{stHByvt3hzpnQVf0PUeC*8Mp3^X>XvhlF*heu3B&!)4kr zwZC3h*a|75D`=@DGb8(71Jw;#I640|oJJdtJ&vTFb5_79{W!r1u&i?`gax#7t$9og z9D4eMUP?08_BaDswpeW@qkCY7d$O$2w+@O!JBKe)!;!2KmYDsH^?)Ujtm@WUU$ROJ z2pV$>+ktB)X9!oE`&&V%!1M6-lXAZCmRu#&XXk55O--Am-%_)R=OvemAtA3M+46>i zM2qy-#1l_Y&7saj&xUUkaIH-kT8$Q|hsb0!7%Q@#z{1HrzvH6NJ%G1GEfTzHwXkQr zA_f#==D&a{eC9V;mPd_LzVwW6f3oUbO|2VXGOVjJ^*mA83fHL-eJ`_>&<74V`BI}Y z8rk|~zB<_VVyeIOy;Q3`eJ@MYmfn|Sy$pGM-+MDSP`~0G6!@|z0M(%2HE~7q;~!*p zW7@r|Gb_ks&UDDlA2|Ju5YM6oF|?Bj?Snon1Bq6oy3HGLqrtRGgxjr zh`ZIwu@p-_Zr6K5F2viS4&e3s%DU;}XPLtH{tI=s;Gv7qxAw>$=NR<}ZXWsh9+q%E zicKcIu#7;jbe&ajE2ZSx3AK(Qe130TJ40S8l&C7AneidNQMwwn!epC_%+{k_dn+|-JjpD`}Z;s?sJzCwtG~% zzngOOXAj@fl{kde23=9QUqeYs{7yHtMY_L5Rilki{Ff9LcRjHb*^M=Im2}g#G5X{F z)<>k#LO}K4euRd1Jluc8L15kaOLZTP!u^Y|C#&EUDba`f;gq8{Bc<~i_ikNLI{!0D z()oX|@c`Ow+<%WPaEc!QR2KKIJ}gN=c+Uj%6Fyo$NfnG`$m-8Hm6Ptv04mfXw=5Sb zub7m`1G$!39PH_i9__={8LWa+q`ZB{2lW#L1-$oYVLd(w9WV5^smF;IT4`^Z5HHjv zW+m}LLv*~5wCAV2o`@l{wuRWBdREJi0YkD~;!qeFYc6Z+j(!#hI+o}jiu8{q`s8~O zOY{hzkB%kkg*mMc=8Kf=g{eJzhxacY54+RWICk0|urdgj0)%&lP|G=Q>+}dTyAsp~ z;vCC%WePh1BV_yMbb)GT9BukX^HAG0ceLZ(3x4)L7+TiO5E}-SgJLC_X3n@Iy2ma! zm^NE{v#G^RAS2CYy_?$P{)ZQWYoL^4^R={pyIj9m6_ z{mF7QO+KVXFD6eqMHJ?2AM126VDUm|+OWlxt%r^52WM(89J-$U-G$FZUC*|2de3*C z{%+4jgsl*qO)$M72=LUT{pO)h*hXG3Ic)r|{aYC!?UiPg0YGkgYwL!WSN5 zk+rLPkY?h6$@(zxwJy|l4pUV5vhjV{j3t(wW73#7^D$)l{U!+aI0nUX`%KO`V;`MX zer>VHt7%>pr(uyLLA1|6*K3Dhsa<5v;C;Brz zm4A`?QfBzr?u3odwxj!FN2*C@bUz}xAC?`Fq5F|UGdFA7C0HOP6OiGs)#W}h=7p(3 zcmd%>)e@d5+aaa;qQ|epd!XzMuF5&FDPuvg$alqutH04%dpG!= zzlsUi@dU`%=XfqbpOdRRQDo)E(VAmdp*U5~Ypbe0XCf+IVENK3lqGf_7hi%cuc%k{ zu3QQb>3meJ{e&s2JQ3_d(A@9K{)gpC|2|^ftk@Xd-_Z>+C86&JxLI+~DlAKPX?3`y zEkZC6KL*)y#1&@mC1q;=SG4jA{9oHm;zWf>oe>f9V3Xd?9G@fGnRqETcp|QL+1RXX ziNDDWoz=Fj3BQ)(pfNaARx?>NEj6q&Y8^6@vvBHhE_2pw;4@Bfxot=H-4V5jg#Iv` zd1-R__+mCaOLmavh--C}wZh6Aj5}CjQWKges%E3u?qE}S&$MLj`C->f64ii`4Ag(b zpG8kcu5&p$0x}P*^Glnw9WHqjv@o``%O2aCqPYwUTSL^_@|!D}wrFY*9<0yf2W0bn zn{3&$G5VPQ328EM^ffqobCd(3+5H^V{kk@#d-R?@e_LPdEoP3~*LAq83$K~J2;wca zb_3-Xo*h4=EgbnlP1pOFoLsxN$d{Uw-TQzM%onPw(~DpK#-?1O7fmg3MqFP?SAT`d z1)?QLVg&d8*p~N3t-qwqTxHTk8H_1Ut=5ehLKBnN>-NE{!2DEi`u0f4#l1ln_X#y| zJ>g=0zsH!K`o=}3^(qH$ReK3=q0rNqn%gv_E$SwoFW8X@YBp(WQ%4SqkKT6DpoX8y zS3JE`x>#3|CPze^_j%I%QUTrS*`}tz9eaE9PhbD#nEJI}cp8z9rJ}Q1?$6Ff(910y zO+NI%sND4OvAN#qVc_}9>nb@&0Hqmy1*+w=goR0GD(}_`$8*n zg7w{(#JMnX3J!!FvBIcj@54yRk7%&tDxe4J)p=Z2R^L5#aeg=p>>1|*S71e(S@IgI z@Ch@+qFDNL7dGnBXCywcl*F3o$PailM^1kq9?*^&dyV$Qv8NGyvExfQ!@VS*Se

    ?&?TiqKq@OU>|v$0`@{p4?oT)uJeKYJRt)(g-w4J+A}bi9Zk)I zQWon|(WX(wrE;4^hYJxaCTm=@;gkB0{S)Eg-5n^6;FjYG(UJ@OLKEm6z^RiVR!eFL z1FYx&a{jMkl#iPMoEsmyBIv|@+ffB zJ6MXVMZ}D|B*}d1*%5YC03qum8$^3@a)Jx`KVw-OK=sBpSdf+DKbH%G7ZrxquZxzDk2dkjH-6PoX+mi0jajEKV3G*Zk`rRH+jmPQwBD zVRP8TZjLqBY@!}gCO{g8MR1Lqw48ORkW`BsTfV>l@i1pX+0k8zg||v#FD!Ho?Z3p7!bw(eHSTDU4|j?#GslieuVSMtRlSUh z$Mt37a_6{QHZGTr2YvRX<8s+}Ai#UTzI0qJ8xPd*Uc=8NktN5NI=Q|lEI+}zdWB=T zGkq57+ROvW>?&sdF?4IgLyJb}|7>6`_bT8c_WYAW@bC=ltyg~XI`TwSCcz#!> zM@zRH(yf`&tu%dGKL0X4tj+yYZ}zvyW(V%1#OGhcQ30XRHg_`n)ta5(OKcE%;wM`AXkSpk z{!Io*+;cR)@tLV>ppuXOB=ZJ$3t2BA*-B!#aG=p;`TUl7?pj=z`1c+V{$@PaJnxfV z@q0E3YsD-%vLbhkjwm$~A2{O&&D6I?0B4k`t9%vXRb&TTj>>(OXr1Ir;Rh=UDF60!h| zM!7{ry3C4tL7HFg%rw(_<)#Ina-$nM{7nB!cr+-EUJ-ux#E~AP$$KYsnt}+Adas15EX5wPU;cqLsyP7 zHn=`gRODR|ao?FP?8@QJ0D1SVSn0l#>ipQ)=H)Akib%@HFc-|kht7CgdUDw=jil5x zCxI}J6A151bdOj(s6H~d$eWtvOP>(zeMk4*FTYy0ym7DqLNx-buPqRPrzZw>l~0hH zzLJHRv)PsWHiBkXwhpfOm7JTAdpEP&t$`IBZqdd`yZSzW@uvJ0fsRNml?#|O3ky~T za`jcjYoNfj#f(`E(+Y`rSdB)!n4qnybRB+M5?eUYA*+!g-TVKJe}rA_!rHjxS#vj` z+|@@zVz&_`JBTytRIbd}t%lMkt6LPVGt@(L&E_ofGc=4x?qL+ozz&)U$WP2mP&V<1 z*qqYw?52n72q!LWDm3opN^Td_w=Y?Etj?4RPfU?iAidN z=Abv(y^iAXuPP_aJpfgmsmX3MBPDwl7_Dq|tKYKZ=#tSG)iyarVTH+pUm<5ZE+Na7 zH})FMZW6GR4_odE8fwy;gap$i){5(2>q9?~2}s|hkDRD(xGbVWVk@u#;rL3^Hi%9BD6AaHUT&-66?L7L4Vgis8xVf#;JZu=V%O zwMgfTx`@A<+-H$#|Hxq0uXq-_x0rTp6FCJ$g6-+8qOic%j=5nr07okvO&Q^6!WOK9 z>I0Bp_J-9hqawD&KtK5ocor6RPI6ffTsuBk819+n*Za?meWUyueZNT%);hFu z$Kqin8&Y>WQ^ShuBNrFty1q0^UXA}lHf3=wvOhQF~WQ(A)JIu0E>u1U9x8o4RTxi$`^&V(F-F9!if})W8ypS%lXut5? z@{{AJNiDc%zKoQ78viXgq=O9~>9L-j_$W6vGVxJCtbhaP40H4gY!b*YNB>3=40H5j zl3-SVUaNF zxerM8WBLLNC^m4kY0~2}$;KT7(61$qjNnH$Ls2T!O>atd7NoIyccAg!oDuPp@pRBj z#2d`RcrJIw>6_$)23nkb58rWg5?RUBq6lO|%F+92LLWiZhu}IEY2MRtcpQ|t*q3Vf zb0wNm_rS&Z!F5kT(?R2B8y2_|htG+hSGFr%(s20E*B~2T!{J}F!f^+wmY@{FN(h_*TR&WC7;L>f7qrRbLSCyfVLAN2j{T9X%sKc4xuFR z4acUNIC>xAGMMZ>?YSBTH8cz=%e~bSQfq5R-=`wA(47y3Ie6mIaedpB1GZ_u*t?b3 z)H}Z=o&L)C2i)v^u3bH6c8GMpE3Y}<$)S(eCESs%jbUo=-+QF6jJ;z$+~xdkU!-ze4UfQz`TPdJ4tRv6ohCDo#_b=+6;v?qhp}wBw5rPT^G4iQ}Ft zV!Gsq^+xV8Pv03>eiya2s3&c77N{6ttWVn<=SX9G_=5NJNotNj$E$Dajn;?Or}AH7 z5~N+*6ffAHE`b#BhjD*VG${Al0-b`sZ&&_N-?3L|3u9`!LoKKy4jAH061f zUK|Eeu9)j};^fx5aTyBFZ}O(AkxL%VIenHDS51eZ1}?k`uML1z&S$)E&^oo(I*6mR z>;~2M9dGNSj??hfpa+YQWMdvKmh42r^!Xuo({<;tB?k{yne zlpRx2Q(VoLsF^6X9oHX5p1si9g}i#Zf0N$%b(qI?;mhDdVdluWv6>~T2{Q6X)=iCk zSUm`DeNrU|i&^-%1uye58;sum+Q6hBf`XI&&soOSMS>1%u0(>;WrP9dnO|Z@g45xs zztGx^b)sjXf=KPi@^%!#$f{>lv6-`VY^e3R{?^d_7;2mQ&7?Ci9%ax@-1v6|&-XwD zD;hU`zb`&`p0yU;0LlZFc(B*6wJ|j~#7wd-f)+-bt0ieaUeGKA+c#tO=&&*oBIM<( zy%l?KM#YwF*3&K68tiTF?FTIioN1DXS-#Sy_-j3SM(yrr|IXbnlsoqKF?GY~t$2IY zuEzR;VK*ZY4c|pw#&s>%A}r{TbDL-TNyIt64RIbh;_1zggZM9ScW-vcca8P>7LG{b z{1>3L8k)1$H?Ux@|Ln~WlZJw+n<0h`1(P;IFpT{rp^QX)7>3~u6vH#NdknQIkK7UF6ykPbYGKVWg)sJ9v(@^*t4>wGUKMQujQo9(Md;A_Gw)_DNiY zkTyG9YKGxyZ%G;rOzmlu%Tta=AgM)`uxi;H%6PL*4NEZA@MX<2R{o3@7zI_U{&5Xa zMJA48N_?Ir&ztZbraQ&?X!vf%T&rM02l^`Gx(V$d*qK)DHb3_U3PSt<1t)##9O&^l z%NQHA%z>ed$L?SXeWShRc4WU5b5o2{yzR&O;X9)J!31qc8wGSNo;}&C`!##^E|m*c7P%k#F6aO_p_GGt;yRKyX!pM$1# zJm&wN{n?nnK^ql^v_ZzQKfkFP3+#>^p8feN%$LzO4TTWZmx8S*rzk+7j9f61n)f)g z!OQI`1JVD4GMxTTl<|FNzkh=^8TC8W zdLQ4i8N=1+UfaQC0Uu~gvn5C@0#B$)x8s(vEw9Y(XO(Qf-7ohb36aw(> z<$FNCt4#_^_}*%k!yJL1sRLN25#m+*9`U>S4C=a7_pf5Dy@(iQuA~enQfL4|c z{!zYX>h}$NPu1^S1hE|IJzTxO-&;{VKE*wJuQL{0ybHmg`s|nt;=RMF!f=+2CjjaO zTW8nI@TEV2Ps@4FY@WB}mU3^4zZ#3Tb*SV2m4d1@cDolU+8*-El{f6c?^Odt-gCm*^Gr9x4QG)o3PS>-ZNutIzHXF(jM-(P3L|O1c&aU(QkJ`lOb4l9#^GZ=Oygoq9_;hPbe1*)EW|Ho~+&jcDAQ5vWbW+nS5B$%~rtr z@J;0x3~)T(1Oso*D^{mAQ|lOj?HV!|>o5A9dAEK`=dFLn@Xhg8&B(j3{F3xB^civT zVGp;rD@~cxn5Q)BPUUrwRZkjN4&FkVd>wd;o`^1ztTJT-U8cZJr&{285@k;suyDVK z+B>KFVz|`pF$Aqi#Ve2y2(r^RAt?^*z*;dIFQK-roUJa$-ZMmzr`zq;q~Uaob`<;bvd}8 z8Zp)6tM0^lmx7blO>BVlT85eQCZbr?LE+JGRDSbiux7g!TQN7_lXIG!4IgMR zwBHN<`pTJ;FBDBAj+Qb`J)ytFg%xXXd{~ER>=2J&DsBI4rjo2qbzEY_ehxW&R zT_|G~5Kn}h*jly$jy&LBYsNVcELy(=@6e!KsEv+c;7a*Qi#9!7P0(S0dmVImY^#yM z3uh?)aeTfLr$wri1)+Yn)dp<$27raw*H4f5z%#?ANnVTs0%m-K2WVAD;9{>f)Sg~K|q*rG~pfWS_WeAc2VYS zC^{YQ&UVydU40?RU4_JN8im8Y!u1*T6hUo<07@NW`8Zw>&L2UnO&CQp9Gsr9jfb*% z=^39K#Y3NC5>v)d=S%fDcesrc`%M{?*^R{2>Okv2Hq*a#tAu<5uOwU#6P|l#uE|=5 zSMyDEx*>E>xiuEk&^3CUfa4InH^T{DvuWOhcRF%ns)chx=cE6=l%4ZS*6%UKF*^_{ z!lw^}#>H<8+F+o)d3X~@68x|=EhopT$?-a5u5?c1%sFJFvlZ#aq7eD~9Nxj7Uo1f` z)~O2G_n6Nt2FSJ&{A!!$aOm%)KG*jdOrj2EnGR+VgSj5TAp2l6wj61n?^Q%X`2j+) zzq<f!!tfp5del|tr-Imgj&f#CcnVc*m_3w zppi2^ry?vK!g+kIX4%);8hf88)@cy%vj{_-@%ab5sBNPeZHo~FWL5b72peS+I(95x z>Wt4IlE>f!;oy}J0t`_H{l>OuF=cJ0iiBlt65m=gJRqBgFs?)F#SqQ^*0MH%sg<%u z$^L&*)_x^9`&wCxd=uP@iT#Ks8OCEreu6i(trz(U;N3c3_sGmniuqP3VT_NMJq^f~xO&LVF5ct>sec-03r zsK~~a2E+PbH|0L5;2#81ZqCNq^9OqDMDP-tW~4E92KyEQc* z%RSH)3SGziLv$IQ&!FtMSebO$K^qs!7|jf~hR$ zC1sm0_-62PKz2j6hces<2>PI0j=+@TJ^x4ehvPd7_G3RzU~4b#>g>gB>Eb?_$Ho|n zcUVWoNdov1{=Z|JSUeb~(;JzGMvV=?G8HujjFT`P!~zxr+A)V80Ra{4m-CRqG70+a zqmu`Pyc4_BKxNqQuTVne{L9z)ZC`s4x?z`~|Li+R!8f$eOks2Pjc2AjV2_?S&Pcn1 zA-1H|Yto>J4@Al6kS?daRE7cp)w9B}pLs^q;5LYjxR?YDE+j_25rJcgzT&{Ke!epT z$C7;$1IGsXCIpTdzT{SS5HhPJ%L3i;#>zh-RaltUw-pDv2k4Wi1Ks_MmG{!>Se(y? zX(2j6hqZbqdvGqa`7I@E21{g#io{eeAtISe|%F-6Qhc0R< zOlA;IS{?>bj9hrrgTG;n$*tEWSoMfc$Gm%^8d~cyZ=X7V^>i=l!9eu77_j435Nb%W z74Y3`dWV?p?N-{OalUKK_N)Z#VM#jD-sVp+o;fhEJ~0#@yb@I}y$SO}?1YE6WYaxl zj|Jz$HMBm$2Z7cVhr*MRaqwn;(9A$GN}6H)7WGG0Z)t>7+oICOb0Sd@%5l*#4pl+w zX5xrpq;A;tLs3jBk|u%_w_c`Jhw^!*`bt%7mFSowoimvH5mCv{h)(_>mHcE*)p1VJ zvpBXNEfID{nEk0s=u|^1ep@fcO{LtVgmES;^!J8E9<>NDB=n#GRbrr4J?63=#wQK_ z9-Cv1pHMLPK2fI2Z27x$uwzi9FDW_Hi$0N=D$40kvRdVMK9foVh1(JBN7o0Ep%8VP*X zq@F;AwsrTDaou~6#cx=M4sfl8)HVq6JE7y# zfv?7MFK}m3zn%S%SqNXb9}9{$Tv7APKU)9QR01>=O`Jz_0R|m5U|TUZH&rI z>Okx2^H{x-hHH!+sqJ~_mv3TuWE3Yd{g@i3Ibdy_!O|KSb@(*YR`uz4<`&LU4vmU~ zd;9&X8&55>DjoY7?!QpmC%J3SSecJtaMp*hatvNv`J?@VQ7DX+6!=uNT-Z$^5VW=Q zy62v736#_U`|Njj<7jsLaU9w>n0sC8!&eo|VTeO2$o&arcaI7kqj5XtO94 zJ62Zh!$jyAF8N{nqgr@&&(;|fkfVjoM|s12tT>^lpr`(7SAK1rFCW1K1Lk(ON`wwT z{9>~z+7&7iG7!_7YQ6Ff=jp~O%Dt_ASTBd%N2?ojPhc@<$z3&=i+87-aq--{UERF3 z-L7v**HJu((c?JmxzT6CtV){nFK{PW-_;wn7dhQ5^y^l%8Ocr#JEVyPoNrJisl4GZ}(vkDpIb@N{0yqDQXiRZV1|i zD_bBS$*__lf&L7EcITr;Qw!wdl2sr24tN8{*iW=Pl;vfpEstlp6n!cyU(x5X z@<5AQp3BN6ZM`#u1By=;Cmds?$F#R9a{dkP%Gga>(gmmir#GiSzb{USd_Tb+LWIBM5f&b&7b}P=Sw=G?3@GF^yRpglx!q2H z?%DkQdxE$;58K(_L%dU4FUvuT9LhK}gVEn}AvP+aUKAI6?mHLh!yQ1VNS)rC*Kko! zbG*A5XH>VTjUFGVt*S4nq;J%IN9zQa6nx+exy88N9Etjd z1mS2@4&seMIPU4LB%2HViG|~w&%FhoFV0kfYi6~mz;)i`v!DkY=wqGFj-1>&L zA_qHhw_^mTzU|#P#RZ==WE8jHo1&bmZ%SPqmO|vx2!tTfDK>-MK2R8dCoQw_`CIho zx1AyoBk;O%`c*g2sOA;CEaSYeQI&a9>Hx+UtP?0ds_awR!+OS@Nh45}u&1pQP!Hto zd4`s&7P2bfEcSOwP!%s?eZ;?4ajBgDZ%`{ir%bhy0l(xWx~Kw}F+v>2jzO*K`ra-< zyZbu5CV83%2cep_PrtQ!b1(OXMA;f0A_E)43J%Xcq7ECBZ$KWh! z?ib8Ani>qraDtxs0v7R|II*E&$qrAV6N)QsG`PEGb$oERu@O58KS?k)wgtNS8yky< zIE}|}09Jc5-rTF>u&w0X;BXY|_Gj3q;AL0f0CqrI39r4saz>)lKOD8JaCLGa1Oace zorWSPS^mV$V0mC$8S>s1?6w}bRp~yVSq%T8=FYq$tM&57uI72+?_=zIyeQ{5T4bcy zxM?4*d<-2nYOx5{J7`IRx$?f^ZO9!4Bwf5@E-qM35+9sJk`TOsBr!ORBq``2=@*

    ({Zm;CDV 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 literal 0 HcmV?d00001 diff --git a/portable/launchers_final_original/Spyder.exe b/portable/launchers_final_original/Spyder.exe new file mode 100644 index 0000000000000000000000000000000000000000..43874aa73321e432f55941c8898c345d0c23ea50 GIT binary patch literal 201728 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 literal 0 HcmV?d00001 diff --git a/portable/launchers_final_original/WinPython Command Prompt.exe b/portable/launchers_final_original/WinPython Command Prompt.exe new file mode 100644 index 0000000000000000000000000000000000000000..e4e824c5310020148f960c4e867df83185c00bae GIT binary patch literal 148480 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

    lk*B!y!%cot|Xw* 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 z

    C<8ye(E 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 literal 0 HcmV?d00001 diff --git a/portable/launchers_final_original/WinPython Interpreter.exe b/portable/launchers_final_original/WinPython Interpreter.exe new file mode 100644 index 0000000000000000000000000000000000000000..dfa43135546a85d8df192d519033d667cdbcbb7e GIT binary patch literal 135680 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 literal 0 HcmV?d00001 diff --git a/portable/launchers_final_original/WinPython Powershell Prompt.exe b/portable/launchers_final_original/WinPython Powershell Prompt.exe new file mode 100644 index 0000000000000000000000000000000000000000..d4512f326d5e8f652ed91f95879bb6e7fda4bb18 GIT binary patch literal 134144 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�^^|M$L& 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 literal 0 HcmV?d00001 diff --git a/portable/launchers_src_original/LICENSE b/portable/launchers_src_original/LICENSE new file mode 100644 index 00000000..b3fb976c --- /dev/null +++ b/portable/launchers_src_original/LICENSE @@ -0,0 +1,63 @@ +DataLab-WinPython license terms +=============================== + +DataLab-WinPython is a Python distribution for Windows: +- Based on WinPython, a portable distribution of Python for Windows (see section I. below). +- Including DataLab, an open-source platform for signal and image processing (see section II. below). + +I. - WinPython License Agreement (MIT License) +---------------------------------------------- + +Copyright (c) 2012 Pierre Raybaut, 2016+ WinPython team + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. + +II. - DataLab License Agreement (BSD 3-Clause License) +------------------------------------------------------ + +Copyright (c) 2023, DataLab Platform Developers. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/portable/launchers_src_original/build_one_launcher.bat b/portable/launchers_src_original/build_one_launcher.bat new file mode 100644 index 00000000..233f68de --- /dev/null +++ b/portable/launchers_src_original/build_one_launcher.bat @@ -0,0 +1,107 @@ +@echo on +set icon_name=%1 +set LAUNCH_TARGET=%2 +set launcher_name=%3 +set subsystem=%4 + +set icon_name=%icon_name:"=% +set LAUNCH_TARGET=%LAUNCH_TARGET:"=% +set launcher_name=%launcher_name:"=% +set subsystem=%subsystem:"=% + +set ROOT_PATH=%~dp0..\ +set SCRIPT_PATH=%~dp0 +set TEMPO_PATH=%ROOT_PATH%launchers_temp +set OUTPUT_DIR=%ROOT_PATH%launchers_final + +set "ICON_FILE=%ROOT_PATH%icons\%icon_name%" +set LAUNCHER_EXE=%OUTPUT_DIR%\%launcher_name%.exe + + +:: Paths to template WINDOWS or CONSOLE +set SOURCE_FILE=%SCRIPT_PATH%launcher_template_%subsystem%.cpp +echo SOURCE_FILE=%SOURCE_FILE% + +set "RESOURCE_FILE=%TEMPO_PATH%\%icon_name%.rc" +set "RESOURCE_OBJ=%TEMPO_PATH%\%icon_name%.res" + + +:: create pDirectory if needed +if not exist "%OUTPUT_DIR%" mkdir "%OUTPUT_DIR%" +if not exist "%TEMPO_PATH%" mkdir "%TEMPO_PATH%" + +cd/d %TEMPO_PATH% + +:: Check if MSVC environment is already initialized +if not defined VSINSTALLDIR ( + echo Initializing MSVC environment... + call %VCVARS_PATH% + if errorlevel 1 ( + echo [ERROR] Failed to initialize MSVC environment. + exit /b 1 + ) +) + +@echo on + +:: Walk through .bat files in the current directory + echo Processing %icon_name%.. + :: Stonebig: Remove previous .exe file + echo launcher_exe_action del /q "%LAUNCHER_EXE%" + if exist "%LAUNCHER_EXE%" ( + move "%LAUNCHER_EXE%" "%LAUNCHER_EXE%.old.exe" + del /q "%LAUNCHER_EXE%.old.exe" + ) + :: Stonebig: Remove intermediate .res and.rc file + if exist "%RESOURCE_OBJ%" ( + move "%RESOURCE_OBJ%" "%RESOURCE_OBJ%.old.exe" + del /q "%RESOURCE_OBJ%.old.exe" + ) + if exist "%RESOURCE_FILE%" ( + move "%RESOURCE_FILE%" "%RESOURCE_FILE%.old.exe" + del /q "%RESOURCE_FILE%.old.exe" + ) + :: Remove intermediate .obj file + del /q "launcher_template_%subsystem%.obj" + + :: Check if the icon exists + if exist "%ICON_FILE%" ( + echo Icon found: "%ICON_FILE%" + ) else ( + echo No icon found for "%ICON_FILE%" stoping + pause + exit + ) + + + :: Create resource file + echo Creating resource file... + > "%RESOURCE_FILE%" echo IDI_ICON1 ICON "%ICON_FILE%" + :: Compile resource + echo Compiling resource... + rc /fo "%RESOURCE_OBJ%" "%RESOURCE_FILE%" + + :: Compile the launcher executable + echo Compiling launcher executable... + cl /EHsc /O2 /DUNICODE /W4 "%SOURCE_FILE%" "%RESOURCE_OBJ%" ^ + /Fe"%LAUNCHER_EXE%%" ^ + /DLAUNCH_TARGET=\"%LAUNCH_TARGET%\" ^ + User32.lib ^ + /link /SUBSYSTEM:%subsystem% + + + if errorlevel 1 ( + echo [ERROR] Failed to build launcher for %LAUNCH_TARGET% + exit /b 1 + ) + + if exist "%LAUNCHER_EXE%" ( + echo [SUCCESS] Launcher created: "%LAUNCHER_EXE%"" + ) else ( + echo [ERROR] Failed to build launcher "%LAUNCHER_EXE%" from "%icon_name%" to call "%LAUNCH_TARGET%" + exit /b 1 + ) + +echo All launchers processed. +rem exit /b 0 + diff --git a/portable/launchers_src_original/launcher_template_CONSOLE.cpp b/portable/launchers_src_original/launcher_template_CONSOLE.cpp new file mode 100644 index 00000000..93614b9e --- /dev/null +++ b/portable/launchers_src_original/launcher_template_CONSOLE.cpp @@ -0,0 +1,75 @@ +/* +DataLab-WinPython launcher script +--------------------------------- + +Licensed under the terms of the BSD 3-Clause +(see ./LICENSE for details) + +*/ + +#include +#include + +int main() { + // Get the path to the current executable + wchar_t exePath[MAX_PATH]; + GetModuleFileNameW(NULL, exePath, MAX_PATH); + + // Determine the directory of the executable + std::wstring exeDir = exePath; + exeDir = exeDir.substr(0, exeDir.find_last_of(L"\\/")); + + // Define the path to the "scripts" directory + std::wstring scriptsDir = exeDir + L"\\scripts"; + + // Check if the "scripts" directory exists + DWORD attributes = GetFileAttributesW(scriptsDir.c_str()); + if (attributes == INVALID_FILE_ATTRIBUTES || !(attributes & FILE_ATTRIBUTE_DIRECTORY)) { + MessageBoxW(NULL, L"The 'scripts' directory does not exist. Please ensure it is in the same folder as the launcher.", + L"Launcher Error", MB_ICONERROR); + return 1; + } + + // Set the working directory to the "scripts" folder + if (!SetCurrentDirectoryW(scriptsDir.c_str())) { + MessageBoxW(NULL, L"Failed to set the working directory to 'scripts'.", + L"Launcher Error", MB_ICONERROR); + return 1; + } + + // Define the command to run + std::wstring target = L"cmd.exe /c \"" LAUNCH_TARGET L"\""; + + // Configure the process startup info + STARTUPINFO si = { sizeof(si) }; + si.dwFlags = STARTF_USESHOWWINDOW; // Prevent the window from appearing + si.wShowWindow = SW_HIDE; // Hide the command window + + PROCESS_INFORMATION pi = {}; + + // Start the process without CREATE_NO_WINDOW flag to show the command window + if (!CreateProcessW( + NULL, // Application name (NULL because we pass the command in the command line) + &target[0], // Command line + NULL, // Process security attributes + NULL, // Thread security attributes + FALSE, // Inherit handles + 0, // No special flags + NULL, // Environment block (NULL to inherit parent) + NULL, // Current directory (NULL to use the parent process's current directory) + &si, // Startup info + &pi // Process information + )) { + MessageBoxW(NULL, L"Failed to launch the script.", L"Launcher Error", MB_ICONERROR); + return 1; + } + + // Wait for the script to finish + WaitForSingleObject(pi.hProcess, INFINITE); + + // Cleanup + CloseHandle(pi.hProcess); + CloseHandle(pi.hThread); + + return 0; +} diff --git a/portable/launchers_src_original/launcher_template_WINDOWS.cpp b/portable/launchers_src_original/launcher_template_WINDOWS.cpp new file mode 100644 index 00000000..9c878be6 --- /dev/null +++ b/portable/launchers_src_original/launcher_template_WINDOWS.cpp @@ -0,0 +1,75 @@ +/* +DataLab-WinPython launcher script +--------------------------------- + +Licensed under the terms of the BSD 3-Clause +(see ./LICENSE for details) + +*/ + +#include +#include + +int WINAPI WinMain(HINSTANCE /*hInstance*/, HINSTANCE /*hPrevInstance*/, LPSTR /*lpCmdLine*/, int /*nShowCmd*/) { + // Get the path to the current executable + wchar_t exePath[MAX_PATH]; + GetModuleFileNameW(NULL, exePath, MAX_PATH); + + // Determine the directory of the executable + std::wstring exeDir = exePath; + exeDir = exeDir.substr(0, exeDir.find_last_of(L"\\/")); + + // Define the path to the "scripts" directory + std::wstring scriptsDir = exeDir + L"\\scripts"; + + // Check if the "scripts" directory exists + DWORD attributes = GetFileAttributesW(scriptsDir.c_str()); + if (attributes == INVALID_FILE_ATTRIBUTES || !(attributes & FILE_ATTRIBUTE_DIRECTORY)) { + MessageBoxW(NULL, L"The 'scripts' directory does not exist. Please ensure it is in the same folder as the launcher.", + L"Launcher Error", MB_ICONERROR); + return 1; + } + + // Set the working directory to the "scripts" folder + if (!SetCurrentDirectoryW(scriptsDir.c_str())) { + MessageBoxW(NULL, L"Failed to set the working directory to 'scripts'.", + L"Launcher Error", MB_ICONERROR); + return 1; + } + + // Define the command to run + std::wstring target = L"cmd.exe /c \"" LAUNCH_TARGET L"\""; + + // Configure the process startup info + STARTUPINFO si = { sizeof(si) }; + si.dwFlags = STARTF_USESHOWWINDOW; // Prevent the window from appearing + si.wShowWindow = SW_HIDE; // Hide the command window + + PROCESS_INFORMATION pi = {}; + + // Start the process with CREATE_NO_WINDOW flag + if (!CreateProcessW( + NULL, // Application name (NULL because we pass the command in the command line) + &target[0], // Command line + NULL, // Process security attributes + NULL, // Thread security attributes + FALSE, // Inherit handles + CREATE_NO_WINDOW, // Flags to prevent creating a window + NULL, // Environment block (NULL to inherit parent) + NULL, // Current directory (NULL to use the parent process's current directory) + &si, // Startup info + &pi // Process information + )) { + MessageBoxW(NULL, L"Failed to launch the script.", L"Launcher Error", MB_ICONERROR); + return 1; + } + + // Wait for the script to finish + WaitForSingleObject(pi.hProcess, INFINITE); + + // Cleanup + CloseHandle(pi.hProcess); + CloseHandle(pi.hThread); + + return 0; +} From eeb4714210015fb07767d115568212c6f83cf895 Mon Sep 17 00:00:00 2001 From: stonebig Date: Thu, 8 May 2025 09:24:51 +0200 Subject: [PATCH 188/305] one at a time --- .../launchers_final/IDLE (Python GUI).exe | Bin 119296 -> 122368 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/portable/launchers_final/IDLE (Python GUI).exe b/portable/launchers_final/IDLE (Python GUI).exe index c1e0c9dc452c9d6f29f91bfd398b6e1403291494..2d13cae77b53fe7fb0abac44de243a8189362e1c 100644 GIT binary patch delta 35277 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 delta 32828 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 Date: Thu, 8 May 2025 19:46:20 +0200 Subject: [PATCH 189/305] pushing on a proposed directory future launchers --- portable/build_my_launchers.bat | 22 +++++------ .../IDLE (Python GUI).exe | Bin 0 -> 122368 bytes .../launchers_final_proposed/Jupyter Lab.exe | Bin 0 -> 150528 bytes .../Jupyter Notebook.exe | Bin 0 -> 150528 bytes .../launchers_final_proposed/Spyder reset.exe | Bin 0 -> 137216 bytes portable/launchers_final_proposed/Spyder.exe | Bin 0 -> 204800 bytes portable/launchers_final_proposed/VS Code.exe | Bin 0 -> 193536 bytes .../WinPython Command Prompt.exe | Bin 0 -> 148480 bytes .../WinPython Control Panel.exe | Bin 0 -> 150528 bytes .../WinPython Interpreter.exe | Bin 0 -> 135680 bytes .../WinPython Powershell Prompt.exe | Bin 0 -> 137216 bytes portable/launchers_final_proposed/license.txt | 37 ++++++++++++++++++ 12 files changed, 48 insertions(+), 11 deletions(-) create mode 100644 portable/launchers_final_proposed/IDLE (Python GUI).exe create mode 100644 portable/launchers_final_proposed/Jupyter Lab.exe create mode 100644 portable/launchers_final_proposed/Jupyter Notebook.exe create mode 100644 portable/launchers_final_proposed/Spyder reset.exe create mode 100644 portable/launchers_final_proposed/Spyder.exe create mode 100644 portable/launchers_final_proposed/VS Code.exe create mode 100644 portable/launchers_final_proposed/WinPython Command Prompt.exe create mode 100644 portable/launchers_final_proposed/WinPython Control Panel.exe create mode 100644 portable/launchers_final_proposed/WinPython Interpreter.exe create mode 100644 portable/launchers_final_proposed/WinPython Powershell Prompt.exe create mode 100644 portable/launchers_final_proposed/license.txt diff --git a/portable/build_my_launchers.bat b/portable/build_my_launchers.bat index 35fa6e65..579a96e6 100644 --- a/portable/build_my_launchers.bat +++ b/portable/build_my_launchers.bat @@ -10,23 +10,23 @@ set do_launcher=%~dp0launchers_src\build_one_launcher.bat set do_launcher_original=%~dp0launchers_src_original\build_one_launcher.bat ::WINDOWS launchers -call %do_launcher% "python.ico" "winidle.bat" "IDLE (Python GUI)" WINDOWS +rem call %do_launcher% "python.ico" "winidle.bat" "IDLE (Python GUI)" WINDOWS proposed echo displace this pause if you want to re-build more pause -exit +rem exit -call %do_launcher% "powershell.ico" "cmd_ps.bat" "WinPython Powershell Prompt" WINDOWS -call %do_launcher% "spyder.ico" "winspyder.bat" "Spyder" WINDOWS -call %do_launcher% "spyder_reset.ico" "spyder_reset.bat" "Spyder reset" WINDOWS -call %do_launcher% "code.ico" "winvscode.bat" "VS Code" WINDOWS +call %do_launcher% "powershell.ico" "cmd_ps.bat" "WinPython Powershell Prompt" WINDOWS proposed +call %do_launcher% "spyder.ico" "winspyder.bat" "Spyder" WINDOWS proposed +call %do_launcher% "spyder_reset.ico" "spyder_reset.bat" "Spyder reset" WINDOWS proposed +call %do_launcher% "code.ico" "winvscode.bat" "VS Code" WINDOWS proposed :: CONSOLE launchers -call %do_launcher% "cmd.ico" "cmd.bat" "WinPython Command Prompt" CONSOLE -call %do_launcher% "python.ico" "winpython.bat" "WinPython Interpreter" CONSOLE -call %do_launcher% "jupyter.ico" "winipython_notebook.bat" "Jupyter Notebook" CONSOLE -call %do_launcher% "jupyter.ico" "winjupyter_lab.bat" "Jupyter Lab" CONSOLE -call %do_launcher% "winpython.ico" "wpcp.bat" "WinPython Control Panel" CONSOLE +call %do_launcher% "cmd.ico" "cmd.bat" "WinPython Command Prompt" CONSOLE proposed +call %do_launcher% "python.ico" "winpython.bat" "WinPython Interpreter" CONSOLE proposed +call %do_launcher% "jupyter.ico" "winipython_notebook.bat" "Jupyter Notebook" CONSOLE proposed +call %do_launcher% "jupyter.ico" "winjupyter_lab.bat" "Jupyter Lab" CONSOLE proposed +call %do_launcher% "winpython.ico" "wpcp.bat" "WinPython Control Panel" CONSOLE proposed pause diff --git a/portable/launchers_final_proposed/IDLE (Python GUI).exe b/portable/launchers_final_proposed/IDLE (Python GUI).exe new file mode 100644 index 0000000000000000000000000000000000000000..2d13cae77b53fe7fb0abac44de243a8189362e1c GIT binary patch literal 122368 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 literal 0 HcmV?d00001 diff --git a/portable/launchers_final_proposed/Jupyter Lab.exe b/portable/launchers_final_proposed/Jupyter Lab.exe new file mode 100644 index 0000000000000000000000000000000000000000..e89d37c10610e34a6acc513fee492a016e37a139 GIT binary patch literal 150528 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�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 literal 0 HcmV?d00001 diff --git a/portable/launchers_final_proposed/Jupyter Notebook.exe b/portable/launchers_final_proposed/Jupyter Notebook.exe new file mode 100644 index 0000000000000000000000000000000000000000..830311b71157ada546653c5fb25bdeb46e34a1ea GIT binary patch literal 150528 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 a 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 literal 0 HcmV?d00001 diff --git a/portable/launchers_final_proposed/Spyder.exe b/portable/launchers_final_proposed/Spyder.exe new file mode 100644 index 0000000000000000000000000000000000000000..f3729201f61f2d3d042e5c34984f6d5c94c8cdc8 GIT binary patch literal 204800 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

    bj{CUl}#OwK@*7{t)?Jh19HlS4u@p^ zSKzA=CxT?m;=-PV4y)!v8Ndoekw$xAhYI38Zq(qKk7<(c&rJPPxpm12s=?#SU<3BL z$bQUDd%K=u2-#2UQ!2Pva9Lz^!I%JA%?y%W$qagPt(a{dDUxmz!CS~pNB)TMUT^$R zfBPY4xAx%CeGmu$QsIii7JJW%yT8?XxSg`5LxEhu<~Y9;wUp`-K%jjYp7H6 z>RxSVge%NK+(s1k^Ipn3cZ-EWyoY$_y0^$I-m7`9=2`%<7LnDd=dO>)9hhrYIU1a) zlMyEyC8p2{F67VsxT7;Z)eB#hRYhkU((I8~x<*N-4bStO@f19-6Fj5;-=K!&cTH-n zpyd#>p16rWDF~H8>#5x`&Ql>6{|&WGq&W$kB?P0`xu&bs2U_Kv&K7g*G`gg)XYa{W zyB{+a#xLyT{YWpSW6k2+I;H#Rs!G=k8GD&_G7GIj3%B)zt=M86iLVdGhqbz1BF!6m zU}GHa<4b&fC_bXq^<;1MFUiIOcURr;QgV1z-Z&L0sV6?>DpcM4fsE!l>BFkL@&>1b%ZUr+K*oUf?{Pq^bvawDBNEhz zG*SCeO}=2_I*y2Bd#x{`eFS$Sl2_X!>rtzlEXcCr3D|!qCJRuj6Cw)Atf-fy`37gY ziPnRg7Js>_q6iuO@}etP-HZGwKi7UvacXPYQiFrrmK1ENC|KlAH;035OFPA1uqub3 zsJD!%c@jyo2%b?&IKnnKM6r?!b+djEbPzd5Ser?N5oJP{UTK+HoR!dxp9rZ4S%fKI zPF_S0OQm=*3BNT6QSXQ<%ub3QRjYmxoj9`MPT~M*^EiCk|in{Jd z`MPp)VngKJzv@BP9aQI1jrN8I3kyj~&rlci#3#;pYiep>mm-om-AO>pZwT=AC%Q*1 z8&ne=TVyzQcl{eUjP_u%3EycY^kLNH*hHy77m8;)N!^(X5d;m)@6-Q z0*P2ywYs0lyfi9H*I~CMv6+(!vKr~qJ^y$7Ba+)DtSyq;q_~^R+%-o+!rO?D9mW`S zBKME&wuXX}(Jki33D%E5&E_m}T$%n9A|Q%nUnbe%m1U&6 z#Vue?bs-s9;fztQFJ0l81gN1CYAWzGeF)op~0i)b%u@l!! zj$_+(#G^Qxo*G6ANzWx@(B9S3p6N*pl}uNKWF|eQ^RSBH$;g3ck>&=j=bUTVozvF2 z{N3a_nN0gKos3=aWG+WRwZl#16c7pA(_2Jffo3w(`{|n@I9er!HO0|{Ef@!^k0E~G zO`}_;@@34UsCoJ@m|lg!p^S~@Eza^Xt?pv*ugLw9y}XpbX4m3WZQ4>S5El&0n8TI# z-C;ApF=QxlCD5z-m=58WgqcLmF`-EFdwEs4n_*Gm zvQe=M%C2_C%Go+{WcR2DHZ3cvG-o-(wO`53x#YO;s{D%FjbV4i*@YFkuVuV67BhlGRy-v)Yj|{)!mabDtNIyoWWM_PungjIC?? ziDDifdW(8_g_l0RPHoRQ%-Cgqv-Z^>5>@xWWd-4NPcrwz+T-gNyAnO8#?K7wN|n_1 zJoGx#%U|2`$9Ei#rK4+m{vyx!YkOo(#on^Ti+FD0UE-G~Tui$*|8rky))ry~;UX0n z7V>sj`}z7nI@9c!{>?UKnr&JfpxM-SGEMSSO%`UF9GPiyh}~ptfVS>HJ~J0X5&B4F z-L5FZ6@mdpwaQlh-_8*o2%3{DlU-ED&mdcBs8aSk`1AFk`y`YRo$_0J0HL(cq=fve zi?RZ0bx+6yFgm%Myfii@6ZOx_#Eaz4{)rdqiA_1Yo*RE(enqBCFZo=a*v&TO=sORC z0a8%~IT(@UgCA?p4w-TDED)WcV-UWXbBGy#?imUOH53dg6SPRhtQ7SNDpCs>`=I<1 zOsW7C1C6t-F(U+0p`TVvBNAcw^2dnF)e|$ju|>=rQgf518@VufUh6cs!!c;krfCI(LJemr36*1Zi$5o(TB5rIc?D31K8PJ|p7T&+q-5V*QoivKI(VlBlUg996gXU67La zU&ucT%rJPL{li~I>-{2!wSu7kt!XQ1Ft1^v{m}Not#;IgUdZJU2_ypZ|;^0 z=s4q^*Oc+HzJ{8&#V+^U|5omAs+>LEkkIb8_{;qIyuJ19%NGa7E(VDu-(v%cn&&J4 z7O|yrtf~1hZBA;U&91JB?lLE4fy6!C#p&3E*8BV*hDbFhGi67X?1>Ey?un0Hi}@s- zDp-qoCY^Gv#b8AIc-mLMzz7UI5v4NW+#{_jy4mUwI$PsOCj7E*$%JPb$XG$?kjw$w z*8zV_^c;@+tS;zHS!+md_0+}m;OwC189zNZRi7uv8-7dLo#X0SF$Bg}VkgW0SfDxH*Vn3{Lz0vOqA5ovIrf>HhD<$c#;@ zxn}_57%_0knr_T7}$_fKcs5Jy0--0DZRGYht zvBubU27Md9^#{6y*UsA}_mruI`{+J~Q+kuo3o7;%BiIq8#=$#uuYF}T9Y3V4O%?mf zYK?7dt0OV4#0C+fevAo(9de#f&Vs5=UBcK0BZ{VdFGJqU{_97{Mcv=WB*}^AO9P?Q zS&5$9_-T@MrzWT@y%juIiA*!sUCb8QXa+Me25_gmWT!WYKPPcGSF1l=l~R+jSCeN( z>X{j7`_k?8`pr8c+_EV=j?ahnU0}V-_*q+l_!p;L%^r{TowdD?_Vo2=8V+$yova*$CJ|7?sGfmS#xJ!ON`X)SZV z^lyfroHOj4yX~A}a*FJno9!HQ5YO>;&Xsmf8981%r_#;|ku$)~3D`MsSI;*CRa+<8 zISa`dWS7zGoJHg~?3_dN9ekFP(`DC6sT`w*2|#9to%y<**0go0UTbSTWVVar#O8{MQ~lmRdV;0vBB6rdKbnk4ukQR&FNit zdcAcI+nXJ{ksnB_Yr#Z-%SDX5h#|KQ!dfsh0PJ){bp<$0R*UZ zNH*&)QHUzJ6l|5`q0DydAFtyIfVCYTwSPROf}`O z=Q4k7#EI8Wlsn=>t#j457y`k%3v&V`?7sAt7}2l9jl#waLx5V}yrI&nW~WLgvfZ90 zjS>B8xP=b29l`~yEp~bAVUCw;$k0o+Ta9*}vTySGNBdR4SiiQ@(s%3kQr!GYG3meC zguENGtm`n=G`)OUryO5Z9`s?-Cy(`ARdtAUwLBB|L0ha${6?SbL{h?Kh13^f91^X5 zW%zzp86SHWu9DV;i*<~oq|J{pz_?zGg9rvLuhNS-nNd3zoYGA#jVyutIFmvXr8eI- zT~A73_$cL%GgLu#QIGZhS3KzaKSO)$O+qz~$Z_7dl59CF~SAPyg zBo?T%!Wrp5JM+ju3G1Dn+4t=H%)Vzw%6{)ZL;skQnW4-_HAAJyAbW};li5==lb4yJ z2t#U)TIWCo#l#fLSF(V$QCu`;qc9-b#%Z`dp^5r7Q5MIs_~WP9Hx@nky0SI;+QeVO zYA=>SH}=>cTlgr9f@2WMT!b zlnYpiI~7PN8H1YnC<+;c=Mz+b!k10*Du2%+o^VgI^X5f1(n zpPBaE$(!5|HpQIt423G7pXqzzc2?C&Xa_?(#m=g&6B&7%^?f^cxC+G~BklWz4NrJA z9Sq;8=qK`dE4PO!%u4 z*U@tp?HxX^3(-CMWLwG3RUCBOVV}31vGS*iq^Z+^^EV2n8c94&0?MwHO6v5WI%D_M zjFm5{!uBxE68(FQXkpbdpuJ`@lpb5|WwBy7c0h==V*rH0(V3tJrtf1OmfTz?eH+Q9 zqqjD*itXi#<)$9w8z*qNjldO0ovc$pg{h~mHJfO|IY;0$B1H=vPRDO3rm`-T8FHqF zQqKD0GKLD-E5qD24CigYh-F}K%B1&dG>1@7+6U%e=QtcT9Mz?_?*|MUw{)qUG+o+t zD_~9s3;;leaDBVxx~ux2JOGp|Z4{he3mlgXCuzg^mB9Ic#c~v!#r@!%q2TmiqjE3W z8~`A?n7%szp{$@_7bMgAxh&Cs_o96VSaNaMCs%^ovDRZ&cD3(C%NM|MFIrcvl$R!o zqzNoN4(ohDbvKMa4S~8BtrheH{IXu~N>PU(z3~i3`CMn&_iPyl=*DkVBONsNLrIyw z)jZY`_~@{<$!-a8FO3>?MURmq_ih;v7Cl7LcwOv(7zl}DkYnp)3yYMOQqm2iC6rR~ zYclzMRNu63lwfLxys3a{fNkvuarZ3uOf?V!XLv zwr@;~ujtFi)R7&_^u0$)9f_k~+euqFYUfvTWsva??mY)&%4L0BC^dRnq*!3wD1T40 z%fnIsCf=DKqLyp$my|<_Jh(IQ&+(l66*Gw2K5J>uQ*I|clX&sn%8f)^CdY(PiTNp@ zv@ib(>T-jxQXNg#EP;(pW{<5neyd+RA_3EHsDNp%^cAN;HYj|FW<9x6Y$FAb2%}9{ zbecidKGhdniq!u6HkNns54uK44^A^0O4$WkF*_T z_D@KrnntLaip+#jR{;Gk3n;iRb0wN=1%t{!t=X>T0#H43|{kX|~EaahRFGkC(3lD}&*hXdG z^jRF%|?VX8^0a_jGhT|yCSPa!ktUuPpTV$8Bpk2IB8UKhRBcD+x!dZoz zq7|a<8J^fevYY>z$L0O0f#q}ZWK(EjXq)2)*t4iV%sK?EGSM#UodEsZ!4I@ft{|Z&o+zrJd47enD>m3Zs_NgWhUYxV!o=*l z^)q24Vpa@v%8`0*V6r=?ei2ff*5Mbu*fbMg4_-DIpUhiJxLdjsuGq(BN+XH+ZVI^L zmsva8VX`4P*}a_q{Z=#Yts(D&ARz_Lrp5a)-SQI|d6C>oA;jJ4RS`nPS%~^FR!>yB zLBGkHLRfRPp}7#ini^oEBB&3td-DhAEhwu%gCB@UMxA8R=cpr8d6_JR^W zZTa(vHGq#vXB`Y?*JT~>Q*jbqBwQeNwV{tNnwu@pQ_k4MMsrav@!zhl=BD@{ZQVZy zFV0Knq|RgMd27(2*x#wDy=MFn#^;Z%Y&amSGz))+(TQZrmZrsO32-Dg8qs9 z(D(I6e~3cgE$S?HjJ%*5SHg*iEH?PzP$q%e?qqCr+2dwOfIqSrAMEkwL#etUT?&V6 zQ;BKsgVv)AY3h#zmjC?~;Tw+>)i9A*P1SNGS4%@wexgL34+tgZW7pt9o5XxSJ*nES zC)Fi4SXe9Z4yco*5>G*!a+Kgrpk6u}j4Ka=qhK$xx01LEk;t%ZMLJigd2^gg|+_#<&i{wFA6^wk2QZaAex-W%GfCG9J8PaWA_gH z<86$ZoEh)QSvH_`0G-7^DQ6jQQj0r4p11@a?WOdwOyC(^K-syi&J&cPVt7tcy(t)M z{dk-#FV}GUozq;+rD@+eRWcu?iLVResE?j6Fnm~V!aUgI|D}u|_83TU#PctsV#~49 zpQ*I%!|HF>nHBgrk~w-LCtkF=G8R4O4S6upfNr2HvqB7UmqnFF*n`3sV{ zYssLkTaONiH<~-1Z7G#x%;WTLvBLP zt~b|IvC|XpXI`06~aa(@5zN6nczTP@7i~ZoJI=Ob8)o&hICu7IK?{@;Y zX14b?p8{=`M6MAoWT`7h9deQUv+WFoR?dQ@F#TTa;320i>WaMNU~o`}U^;|N9503h zpS2MeZwB!F0Pc`0-Q`Hj|5Vk#ANwc2@tULEUnF})@{uB4peFf|C-wYmQJH$aSX9b0 zntZXSSf1uxX)dlj9L?>Kg-;~Og1-AB#QxA4DcKk~h{<>k&aAK9+Deg>s`v%y`7_Lk zXUOkq8;2vogUkH#`}0Z#z4Se97nJiE2T~=)>BG20w|N0DfU@4U1`qUb0(TGpHda+`!$X zO)60O19jAEt3v$;cHL8LgsXy|#>R2Hs;XrBYVZX_!O(C+-q3y+%Q-RB3RU?MyYlJT z-X4sNk8;?kWV`x(`){rPcEm_8SgrGOc>G7~geX5`2~yvJ5LX0>Ag@)z zRysT83z>so;$SWLL=S$lv`_)JiFJbl9s@Pn=X)ghai($mdpPr5j*h@DN;t{35h+lO z?L8&Y;KxgR(IjKaJXK>Vfypx5^ioTtF=RxIREO9_$bcrvxeR~O9{y}mfM|(VRnbEo za(Ah2*mGPrGIQR@tN~;USrg13HTOjemvttQ{mxa?tKA?A(H7>jx`u6ktdym|9ldW< zu@p~}^~j%Hu@TleEref;WJwTy@!1n;Zf?a2fz~L$AjIaN{GYMCRq)K?LeiBb2!+(+qM z?xytq1=^Cm&Q!HLa#B~xBR6%aJn~XASu*oteWysQD%~wUa2^!|4RNJe_XIZJR|erLGnKkEUn9JA-J=^t-oI)-g_xUM zD0-K=k3`ftO|Ar8>t18%M$oP9X@>3u-Rssc6j}4Ae;BS!ZHU#TK9jE7(skSVM7s8* zYtQ-_bnQjgUP3NS-gNC-KcrzFtSy^m9U2 z?}jf@MdB@YkDNt*aCc_t@qNtQ5YQeepuFLDTts1!E}9Fb6xeJqr)~~fFUhMqB6J3( zs_!7AGus37GQNMV5M9@KuOLU8ujJ2+Ntj0-tS6%9pk(aBk^$!qn z6UDshULQ-yqdtmAoBFXt+SZ2=@vI+4#H&7-h>f(>Pzj`5w+4IQQc`it{I&=W$-f>H05xWDw^%oKNC>4(H1_H{;xbb1Tlz zaPGzV15PvES@c@F0vIRD0paep1jL$qhoN122QuZjB6PPU7m*@rY+Uc&sNqCTF+ zs^>^8caa{~C3qg#R)0htJDJx@rZyMiQ(#!%){I7Ub+I>|VwWR4Z+91q=qzYi)^7?= zx!~nj@NmmTu22ckN<~Zs=j{1+yF4bb_nTms$BcGaEV{~mwaB@!%X?Z9?~lhD_pmb? zW_KGjYLA>;j#U$=#s_VG`e7!x2g9VLuGX3eYhHdNUbKiQJihst1yg+i$`6$;w)bKm z{ViDh5*t!Y z6ie!9lh6*zeZ(W@bEjA%vna-aaKtCF*3*3FKg3K^3^A05OchFS+i=7yR_cpS4Az~Z zT82d3@P$v<_rt2}YaGH3EglZHTdr@|JAh?IwSr#E`5dCLuW=Z?g9P?ZYaFuwQ*N;r zm~t!TMAmb{E_WyS52e-ay|8WsA1;Fcpmc_G@eogjTOctEw(hjz1MU3*xF2_q zmP1^o4^vHYEQg4MyIB3;Nvj`*VhIjbKcJbR7F$t^OOo}PVeI}rVxDGY3D!U56#pBx z8z^jj8J@yU&t5dxEa(Ux0(D?4scy2-3_+IFyEl1ri$efh@7{`(Pz@K|Gmn%WhiyZaze z$pix)zPh^)1y$y?i-c*SjTmq3rFT$5_wBSF&+)kidQA&7!myZz>oEJ+bp|CUaqnr~ z20gm+EbOX5yN@(tsWquH@H%ccj2br_H{eZ8HkzwoF5Pj7N69iw221XD3Hy2ZUYZ!T z!-^cUb@i1%czdKGzjOF6h$}~D*@$n=!TmsWJE(oJaGyFY+)>Qh>8U{7moRohC?pf= zOK-Qmjui_$JxqKKbpY|hUm)K4E8k_~+6d{x0osbm;baDsWp%a@ARce(C&qn(n$VMm zs%>rO5N&-2%>QZ^1>44oG<=XrnWqrS3AXpBn2(}_Ka(2bQ6!FQjD>yIU!f8A7tj;X z(%MsFkO6Rx;8l&c)~`Z=S&q72N=ng0PkIF@ZZVd{MwfUjg+7~>7MFB_T(t$V0k#tK zN@9uSIz&G7B&xt2wq?jY8f~**Y#8dEo2>*`u9_|Uq8a+sJZfIzG0WMuEa;eJ4^f|nCA)E9em9`T%E1%i5VCRsYHRU&R(vQ_EOh22yH!}S8*C{-TYx4s zmb9Uy{zL;Ly(p@^L1;~>!C1r^HLRh!xK+!VZOcZXD}X@pm3o$s^L{0)8an}X0W=cm z)Ghy^es`9 z*CEVd6%(whPt`u{qD-(xG(c|?`AM_iR0xYqYRGYMo+mhbq6RHQPxWnOWZF+gw768bKB8wMm$e$dMy2eo=T6^BBF`b)#u1( zv^8=|bkKpZn29u~<8`0!9HlSD{-EXqk=8#Wg3iYzej5{3ty`aurzn)dc(K4Y(Lq&{ z5jRxB^zC#^uEws7a8a=fHtf5l=OZ8aeYqd8VlZWMgK_YsiAR6r6DvMy zDQOvce9`O+DupElbaQm^{ktH&15ixwGSf1Q=?Bb(&F4EJq&0nuB@vsouhh{P8M--IHW74ug6{K=La9t8lU(R^WnsH@>wkeLVbVfk zUsEE*%Z?*%B>6QaY9-T;)1o=5Q`Q>WpY3EixjBe90^bQ)i@0I6oihV(3$bnx+%6;wv&^i{Omt+7?B6*7vmCejLN?t$1^0%BW73Wx=>3QDJ}U z3O^9F@3`DIE^G3WzoDvOuVwFoW$TqXD?DJFBUmKPJjsQ%4Ge3{8<3igx=>*>pgn>m z%c0}Jq!~*Y@fzFY@&& zd_~Y=eCy9a_y25m`xzA$>)E4qtI&5Sc*aC{=S5+W;3wvialRs|6r>XoSu)NgT1Gf6 zAfnlCl_N$9hb?x|F1l6k;S%+%c~1lk;wHpQ`(mi}*MfmXndhw2->!4VB!%iV)K9_K zhz;xauhX%f+I?j6?g`d)XJj?{3c?&)6oG1#xEt>?TUu+q|9P`pO?`AE%vg^cT|O3d z<4>psV(>lD!e5P1P>oM2>Ha&CQDWSFG_Q3JH8)qHRvs5kN4#DL(VbAEM0HvE6Kb#9 z_sC#G=>6+yzFi-+7WNvCS;&c2mz(#1FY_!#WIoJ?B8Y9eh`z}hyr31htT zyqfR!-0$X#JuPy_e97tnBhtWPgzV#T^eX!Epc<+!7_p&=%MZ{s`^`cj@G!d#0ts=s z+dXVgHpZ8KXFp%>+3a_G7z&8-Kg>ky0w~iYmgg2@lwa~f02L1d8w0j3gkWGJEMDB- z)40P)27#o|7czM9oBt+*+2{W!GSC&SqUx&2;ZEHrP$yweSz)7hp1$yIPgn5`)RbZv zt@pUXT0q1Cp{OhrsEU#T42S>^ISWh0a^#wjiW@pjT8!50XF~CBA(|o*&Ca2>5Y383 z|4B5CF&W85d_Zek7BXb>ge^zPXZcaPeB!|ob>sxoR{PoP^m01-8L=lSgL1uvyo4-EvwgFyp! zij=GiXv7j$%+Ru7W~Tu@^?n$m(Ts?Cx>!q4CG~C75tw`{Z9y?qBwc5OwQ4&(8nN)C zAM6HJ8{`%>^fG>jYNFmC0zjFKSWS2rgvAXn4?7$Yv>)~CE+J@tH*7^i-TM*~%%B6s z3?OJK~D6V~G(nq|&Hk+#^L zg}u~U&!I!DHAa^NR76=L{#M3bj;O_`X*`CFpTM?;)s#-ou%#TuD1xsCb@C_A7koMR1_hTZ7x~1@gxjTkmU*nmMV#Zj1 zi>kbV0oND|xP0oy>ORkH8dWmBd5p_qFYIu>QVlEb7KorJ)IjgJG~=$8jCHk5M{UA2 zR1vkd;TT&{`j`ix?szOh#1pLUwy~kJ8$)#^e^c@!F!t8=AdGre82mcJ>qIB7qvRJI z;5uBm`e5`jyn59gv=GZ+a^DhU{g+*C)?Bk#Jd zkk&X^^NwMH)kgP8RSK-|wm0$M)_oGwkb;FSBhaH1=N%I*rkm(cY-_=mT?_b~oA-l_ zZ?eH3UPq@ZtU!YG?>GCE4WZ{kbsfzaBdyq_g_lQ@&g7WwkH4Cm@u*R(ah`S0fQynW z{FOxEL!xL3T?S(h@}7GaZO*zKmdd;(EhG5XRm@^OYw7mdHMqUm((S<}xIHB#gAo=q zbEs{WUKovFFoTgE-kyzlMLhC}nT8kEFXDYvaJAlFLl44gJP7GUgE%W~2KY$AC7N{({77c;vRlwZ-Z~>+ADe>!)F{id@`sJLYut=t#k9vMq8)CC8E#_hum; zkE4=-HEU!*|0|fh`F^JPE<=tH^Sgu#0~+y`-ug8%BRh~0JVXt0j$0@{Tf;Vcq>SZq zGV%T*8*R{LdSD-!r)?5qY*?AtX&0=#^q9wTxMH{Bap;?AaRkkaX&qL3l>b&}|-F>YwlPg|^`u{2IwwtkU5JVQ$h z{-Ek%g-r@w%FDQp2py8=X%=gh>w84NMo$Rc7`oZDce`G$iRo4mb)_b%u)+`Z~DTw!T64bs&|<(ZQ#+?%-ji{$DGk^*A<2-o$Mb#e0^DS4ejQA5X*wOxzl2 z|MR=_?qxi;+S6CtyQlWVhiM`94-3KJgPE2fN2}ZZ| z9^2^7qROG(+xrrR%W8}4YE^?PdkUtlKO7ur5j z5`Fm-8hw>*zZa#yM0{2et!5&rvaoJ92QgX-6S49OUfW<&OCxD24w^RUyyW(s~`lLh(IPV3P+dpXhuH`(=L`}uE&%KJ3TNqiqSeXLXBe@bdR8aRm|n?FfUbX z$2e07sUOTG|UNLoZjH_Gm$oghw(JJTOoTD+paoRXX5;ml z=ws<=C_nXy+Aj}OoVXO-3RpM_!^hznfH%_Ap<7GQ1=irKg@NyzVJQ~fa#-)K_2~JC z;Mh`h(}K^ert2ZWCqZ?qACY0IFX_%+O3}^u9h`l-M~4X4lYVUx?xJpX-}NH=kl|e( zr7$&g*LBnS&Ih7TmG|-Z6LCfN@ofZ&I&vz?tr96`R3Wau9u#8L&&VH!6oX)F^qVT; zs`s4;iX~uspB70Rx@gwT^nv|35Z1^*d|KMqijWwT^mtO_LGL?D(3#&~)XhAE6V}+k z+Kall9*M#|&X?X}19!LyKUKsVDS71o2jDLdU+}BQB(U!+N&i6k>X5kJ9q-on>-U&Q zw9{_*>^oojIE#>baej*vsb)gtxF>OYu-M3Hy%7TV#fbp3J>mt8t40=)jR%mtzVB?2 z6@73nDBK&6g$s!AAg+(#n$FWW&%>>+L1sHRR8TwbDEosSz2DA4%4yuM$UZWtAN~R` z;=;{8*+Yh(y$AeSxWQ;0c$niy!DfDi^C$4AP?b2rcN7YD=w%W0Y`NrDd$@lny&_TLm^RX{;s=#F?E6|ZYe}@a|_8HV(`0)!O|JP>s{g7zWkl|q{ zt#0*WlIz<;xSs6Mm*}aSOD_9P9Xm*ARqZ=*vTr8*B23@@6lT@?T)X$x)%)d<{|oiL z>7b~@XP*STH2cur${f^gIDAYYFU_pncTL}8JNdn)4_*nn_wy{AuYKa2=`U!Wo)@G;Q6rw_jEsKaxuT!;77$9)Udc8@aQH*WX7Ci{IZ zMOeSh!hNV4N9I0W~;`NLLx(I%bxb-uS z>^nL0H0V)r{msnt`%cFFy6@!dvk-ERr$r32_rR?d{(LVNAk4{`eQy#yGt)!hGc$Yq zMEF|VUYrn3+#aW#l2mmfgR}kG5*OjF?QeMhbaKSqqJsEj5&mqh)@ z8;p|po?Rj8V^3tmc3&IvZScK0Nte5sbN46Q8LaAG!S!cE5c*ZX9TH^ zcPMzGHT#A1LOn0`co3mz(4>265A+~%$Sv(=R^RD@*K}hsb|obk$R7qd7EI!uzS~ZN z43niWz6P`V#u#gr^xq}d_U zHLEtTs^On)Ytt}}E4_tn&G4NZMYgc5dD*^1zVKet_O|F3w9%?GpbbMjGF@#%cK9$4 zDK#6KpY6)?Vv1_h*#p<-N?Y3duw7}kwAa2x(%7T|f&OpX(tI(ffb!>2PVhxg))~!O zCWfQ9sScZ(95N<0VIg}g${_~i?n6)3--i)i7vyHUD~es%?2_kYTD`3b*Ll8SO?igP z1qHZv$?an6icoR^Gb}E?6h+vc+|Lo63tiLb-5+{MRE4*i{l3B#UIqNMZ2&BaP$6K* z{^2nxY}{9;A^U#3=LR2^$@Re?G#v(1nia6!*CFG=D1R~26(3E+Hxu#F%kDS>*O)s| zouyssvFP?z2T)e6Cvdq=Y*X4%(TrKX1#06Q1)OEH?ba)kGJYs%-%nj>)O) zAIr&po7WaO*@Z@oSV-B6&4u>)CMMe2{!CgIaIx@APixcVO3&O*(7`Ox3E|i#Bf`Qn zSL$boZK|f#O<1*{+i}(_$J;hcu&&jQFtK!CRakol{JbrNRc^(RyCSTSb4Yt`p@`6J zAv8>4nRp8u2|u1(4K_Whpv{Q7OAE^IMx_v%_nEMKSEPwGE}-{kTBpwwQxTDRAbv5h zvi*(0M16NuICu1A(A*U6)eC(My#T^v1G2Hb8|6ue0@+6YiRMdv za^Y{OxLr0~;03ew2*zq=S`RzWOt1EuA5mVq+%Ae$6@Q$z?Y)GQi1uJI_L*+y^jjU2mEs*c8z8;~E3g5=vig>-d+`*neG4Mr+W z_*)!KhgooIKg7R66NV?Qptb7Sk4c1g}&NHG3A;>hHw%5Ie)Gveu0m zo-G*Om9?(SaBsnA=T^b)u5hP~bx5Sr=EIIIaI~F6V}h~@6MvCZVU&;l@@{uKzz5Ae z2}J4(Ek5p-ckAuI_400m9k^KCwkz?7sZS-|mK&}ZFoNj^Y6688s4@?26j6A()%O<{ zhMN+*)_0K@`WWK7(9S+w7_JjpdA3=Hud1K*SZU~qml2SYmxu_9w?Ydo2A9HRCIyxt zxbMKXVw!u!;wIwF!t$PBRUk!WiO1&ONPVx^cp}#J#g^E53rWJf?F_3kek1?75kw zrQ0#IEnSlsaqUIdBwt*6)3vL-Zb#SH8At9uR+qwBx7-kFzdh-vJ+*c+T){VphNvu5`G=_Mm(8p!%!w@ z6noR2da)(QwhEPyw5U3(DWKBU^GbDLt;@fUZMMbShq(a04Sk0t@t!fTajqO48;QY} zZfM2!c4)#WqbB&{QNE{THd^$z`sm_L0ko0>-^<1llW76|(LvQQy0PCRM_ar1rLjXy z*f%+yQ_L$*D-AIv&*N*d&F1}X87^E2g)8TZcmBUD&A8t-;1!#aTacw{_jB>ih6H zcDF<3=2Lr0qphyi37!$UPbT<4bvUJcbTKW#fOg#C6Hye~9;^Ob!Gnjb6THDo0W+e= z;*Ia|dc$zNr_}0=uw&hc-=>(tncTr|L*cY|ouZ^*@H&=^-VsG6S4a9=C-_Kz2<@Y# z$_Wa%bpl=`pcGj=Icn*952w#b3%GTxyNKN#!tlnYX!p=gEl;p0zmSSyaTn|*@V+!w zmpRR~0pA1j!sUu-E)9Do(U*wB4n^z6AB+k+s9R;k1H3T2;sZr-)2%v<+7pErY8miQ z?MxSnzp~i(vd79jSmmyJBnP9meK#{*_rAP5GtIS@JV5liN5RG9>tIyjsh-#-W{3(p z7==$NyH(mfyaEp#oo)>+Y!)+O`+WFjrZ=LUV!+RRCj88e-*;n$7tVVO_?cEmURK3gH_%e9~um|2jrW#w)nQ7dhd$RZTxqvgev zSdjlywJ~_He`USL-PRYL)8pMlF>c?Ro6k_0*LlNE(~PSX>%901ZU(y>U%|~}cjGI# z#oOKZDl^)?=bYt5$RRI6&hpZ| z*C<3L6);+TqnZen;38D)&8Q)$*w5iXfcD}_?Iq2%0UioaV|0&Vkj52Thl;ItuGr*Z z(St(&BU+j+bBZ1p_ZjdrHw5Z(>=RmXj~+iW4fsh2f%^m#ex}5dw|MfF1xA#K{Kb;L zc=DHpdP;Glo)SSll|0Iz>$#GLooNA|h17Bq9P- zE)fx`ZxRs!s+NcdP_0CQq`6RsqCl0a?cdSghFv64^zn&^4h`6fs*ftP=`UC6a{bXO zSdd$t9z6FBW?cs_EU}Ibs(@-JsBn>f%zE7bFAq=zwqjM0YU2B?K<`5Ku%1y-x4bA@4nkF{-e3 z1=RgAW%t~!j^_(LB1D;{93sNJ2KdzFy6F(OgZMss>*rBxJcCqRnE6&+dMnCWDW6YP zys+4>V=%1@JsS0?3m?(CE#Id^=`ygMgC1OkR4D8Rb*rLBR)M&W^vH@Xo_QgncxDqG zH8XES6wPeL>(Xal1h`5rH`yFump_=7;C@Z`M0~)10bi$3f47L^iWb>r84)}*?kP>t zrB#S$h7azm3*G4mJSYmo-+o6t6n;c^86D>FI?$rdxOfd0^iW9qOthVwcqr^Wv&_H3 z1vmSj9s!Gz5ikt_b!)ytpjl|ZZi=x&k!bCmyc zl>c*-|8t!GbDaNkD`o!At^8lh|1VDYUv^H*KV8ZE)0NCWUCI0}J16o_1od|)JqDS+@dnM&lS5!vPmEk6oN>nBZ^;&diBoW$qPg zypoSh;pg$GR4Ascp0)+^N!u&uLEs9`(1R;OJuo8|n`baTGEJpmfy6A13B?&wuq;l= zO~VWk^HAvdV!(?GTp5~}lU|Fr{^7bX-`_oNqHxVO7(AZ5o!-?6FZqUE1W1EGpf^BX zfb9rw9wv){m~J9-6lt8NZ6`Sv#|7HHco|C zbk149vMjumR=!B+3^-2W*K!eqskxVo^vh43!&&}qXKG*?!qmbvo@qYQGN$h^-NCeq=~1S& zOfNF+#PT#S9n3U>X)M#(OjDUIWx9^(i%d5&{fKD=)1ypnOm8yvXF1%(bS%?YrgNEQ zGhNNJlcj4P znI^p|{S`bU>Cz`8t=@a<@SCEgd-*O&UwHD?{#qrg6wG!J<%#!`{`H+Dou08UBXeCyRg%FsD3SQhRx)uqAJYWi zp!9DQPk)3+Laf;corstz+!EoI36~sPWxy>LG+D`qzZ_f-28vbE;F18GEO;5X$`i2| z;EVi|U;53!Z!V{vgAnN=L<(X}L&`GG6pzDKTB|Y*MnT5IZN5k|N%+jfFQrW>X|XRB zxnC&KoCo(?m5WMvD=APKq+?A){*q8aDlL_42wV){^i~#&cyl2CC7kcU%3S0s7d!(( z%HyBH|EJIt@>b<@mV={|&h>zDEsyybixSf2CmFaNWo72fcdDhDFNOAUh(pxFw6x5` z1orm8t?O~YKe&6&xwZdNcCYOt+fA%h`fFgSR%&5S!pwo<`Z>pxrfm({KO+Zb!{d;TT!qt!11V@*CL#bUqzqRh4TDR}k{Xy&gsdfF2=k)zJ{W){yCgdb1Y2s7n%t=g2PD}&MO2|n}NMmon zIk`!|n!}tqxvBHX13S!_lai2=>x>sAC+22mYc7a4O#^f0Bqz+BFJnf$i|420&cWt8 zacKCiR(Pl#XXR#(7>4|0C)1cDF;@$hmw|!Gyo}@|;h=G;U^FD=;EEwBIW0LiSqX=O zsw&EuF^bX)*WqyJg>%;Z(r0E?a&`jpPbe7vs6GXuk_HFkq-&hiMuXLXVnj{#9Z@M` z5C^;~D(E24zyXS~9P|O4OL6u?pryDN2!0UGV4Op6_Qk0p&=^F}57$d^K7ccRQA%#Y z+_dEW2unx&qPeXwNw~ifpSvV0IWtA`ro___EDggpjKdNQ^YRk1lLRkb4&)sE7Sa8O zRN$URH;g&)^7ct_(F~%MkNBkIl!UyrTti}Jh8EP2n3kE7mo4%dPjw?9`=7&e{LaDW z=SrDV798o@V|QlT`7-OKRY)Ml1Q4Lla-c`n4F%Rk!wg#$kNK0oND+lS&?#g z_;X0Y;K)+Ega0416rY%xwd9|KM&-^+$~9ys=jLT+K%Cu=wA{XGx`)aQh zE%B`*ruwhdYk5PGHK@dArf1AIP#wydkK~kihmd4TalWaPzt;R&_qXs7pPrDBFfTdj zzX`Rqzgr5G(sRi5-z4XdehYt^{9DP{**E+rEy+koN7I;}fe8(Ij)#)74Jnz~2CZIb z{Dj=({Q0>~)!*3{;;~nr|CpTJ-~T9cRPKM1<9~_2MSIUp%}$0wz|rg#tv@sL?rlKy z4xE@dCt-2IeC|f=?qkBK7en7U4gHECA~`29dw!Oqdr%BxsoNNrmXMR<#5E-38swwI znQtb&1k06!SmvXtXD6mEaSAMa7{+C$XHgGrm^^m@o*;&3no8QcB_%!~BQs-3dS+gZ z0rxLCCksuQ0+#Y~t(vL+Z}}Wfz`S}sdhB$}>VtW%9gMj*=_8Wik^=5rTxAP>nsO)H zy}NjE2dQ=Q#u-a-DO?A3f+HYz+C{8UI6`liTy5vTU!0hPBl z_93?(z}no9Ft%B>z$L(*#NgwxR+!dMI`e5Aq%)?~lg{{wR+tuCI`cnrZHYf_g?%_5 z+IUzS$I|`R?s_uxFiE%{G;|r4nH`Dt9h;q*n4AOk*SdRTz0t~ZtQD?VEBQWFNn=@0 zsnOZ9q>YJJlB~;1YF)>J7<}DAfUfoTwj)FHV{-kZjxHB$?AaB1&#VNgqKxs!JM= z;-#=eY5qd-(sDF%qw)7`e3Cnj$;f>;PQqr!;~2++QkW_1K9%VVP>O#hPD-2ZF~yUP z(||JzXLp?0I4Q3MI4Q3ynXUpQ_d=W$&uW|$9`#fifb&JhFN0FPHsPdn-oQ!zKEX-( z`U)rUkK-i%ObC$1khHF!~)#WG^TM(XETjwn#44fX&Td9rUgukm~LdciD^00olGm3?qyoV z^f1$ErpK7pF#UmPEz@6^+L$&lZDi_xLzd5nsTO}H#@(3)Fb!d9VrpR;$25s)D$^{c z1xzObeJ6F)d}f zk!cyz%}mRgZev=(w2EmB(*~wWv&^3szn-yyX$Vsj(>SK7ObeK9VEO{n%}gtp+L&UG zk%?qHH7`SnfmLK0o^vxWx0{xlr;N{@uS`wIC0{N<1%{AS22d7}_6 zTQC3-UW6kK;>pWqG$A2F8J|2?iAl&-%vsr>OOy#ne?nfGV$PeVOij*GCS$@mDRYq$ zk(?+ZMi|VkmQc8CaRFC^PfP_x9P_FFK^)>Cjd+k-xaZBw%i#eR;>=A>pPNkm5gmv> zlMvEycBb^~*c_uMu{i07i5ZfVG-Qd0mv9n}L53I{2D(^+gPawMWpsM_XnMlQW2&(3 zAUyh!3^+{#rcBPjZ<4^Na3T8v*@hq|VUZw8R-q&y8LtfQz%rg3yAK&3jei_&hz{vd z{50xvge7;Gp2JP1OFkWLdGI_}K$)Y3=nZCIF!hvv_ zQ+S!5Jjg*-2$`>3CWj@|cd_9Q0QeJi4Z+ zc&&9^$z$tFAAjP>4NpD&%*JP*d;W!gz4%hu%dfn;>9yD2*!<>OZ@=^Idt1ui|KP)q zKHmDtw(UDU-TB$)yDBPo@7cR=|ADH5hrT%c=a6fLB~x-P}FewDt7zZs+6MUZ?MH zTgOg*oxAwo-nCoz9(VLK^y=Lwpl`qafdd8x4GJDSB;?M!h7KD(Vr1y3(P7X57)=Rt zp%6})mpXsJ!nE{^%&Z5qb8_<*EzV!^(5%__KQJf$pZO0jUABD1|LOAopHBb(w*1Xw z$3;YrzuOWuVPbU5q{*@OOqn_j@8gM^d7qU3KlA@zA^$vRK%9??Hga62>1&j>5}TNo zGHuY@Jtbe$>l84qV5)d=c&4RH8#H%sPLHXk7uw9Yf~jXa>93_;My{@K))&zzgr3g1 z7!}cq6HV)*>5Tqcc+xk~3KuOLX^ZZ163~AOpN4TtBJz-icpegYnJ-3g&hg#(|44i^ z*2qEJlv^sXa|$8$6#iR&X*5PTrtu$*aZ-V4eNPgQ7NgXf$teF@d=v+bNHZ{sa}KZN z=)Z?wf|MydtrXH?pt~TY_TR$G8j+1$XkjV$TIvc)_Mi2I`9cb^4p9s;Wk(FR4o~T6 z+N)sXJr|=$TBVeYv}KNxP@2WJ$kVOkqp*pHgCv=Y5nV81Be}?NX9_r^)1*31vxAm* z%28IjW3--$WYJQ;+A@c{N~>xpIU|bpTy@}V#+f~vt=uA+!Ly4i}t88{nhsD)o9M0OMXp&WVg zHZyI0;u2_&S?M_~IXiuRhFGr^lboBHNz*_3LHVFV-&OXHq|>6qpE0FJhk-HFT;d31 zO!`7PLK$o83`~rvJakwXldh1CSjMD_qa%(n>FVf+XH2>^I#L;vZjFvC#-x*@BcE}5 z36%oI+B%9N#w1%hN*R+bkB*IuZ1I zjH?(&F|KAjfpHDviHvI*Yx-duwW1k@3BZmF}`WX!>JM#`iH_&sfuB_%mL? z{CCbs{h$kX00!o}G7e$v#@NKzow26(_Fx>#{5Fi^8MkGe#n_W^0b?)5n*OjI<5K4P zFfL>4%eb6zd&U)vb&RVS)5j9&sAb%Nv8K!MK3&9gIsE_hekg*uc1)aWBRdjC(V#X55Ey zE#m;j4UGFTR_>7H@5flrxIbe9;{l9A7!PD@VjRRcmhm9Q@r;8R=QAF{xQOvxj5jhK z#&|R1;f%L29>KVZ@kqusjOhcjbl4b=V%*4hG-J=6vixC;{TZu_0~ym6emX)Kn;2Ud zn;FM39>+M9aRlQ6#*vIm8INaN#`tc=<&2{kS1_KyxSH`q#@Cad!`Pp3SH^*i!x)OWXEAQexPY-2<5I@njLR7NFfM1@m2m~*Fviu4U3h?3%h;W91LL;Z z0I-iNuNPxIV{gU=#y*Tg7;jH@*NgQWi&%|BzC=AUt+=08OG_w38}o3TG* zZ^nU)U4}{jp_+fj7R^87IL&{k^q;En8Ru*KF_K@T@fmN__$JBUtnnFd({P03S83QH zagBzfCAMieR^mp+?n@>1>?h0Lm9al#X_Zqj@1G|;lJ1HQZ9Rj9Ek%jYGSET#HA&@2 zlV;m=kX=bq>5ueibfjP=P6zE$la#EM3b@iA={M-0^%Qi_x(PZmI9}R?Mn@K7+66}k zX{{uc@sZw&jvUr!<|q#`Caa->P^nC%KhmwxF&`zOgVvbQkz+59OealP9ci74#3`K5 zMO?mA=w;|gfW+uXhTegWbk0WtBtXYP4o6xoI#M}2>1F6x$o>~{d^yk-(UHgT=5qR3 z9M3#XhqNnnkY0<~-vVWO)$7z%^|luU<)jm@}PP|d@Vmzp9oK5KGmaOSdX>v87L9q$;_vE6%5O(#;5v4 z<<-)sdKL_%`6s;+VJ&^Cca$H^Kh-~ypH_aVhry7h7Jm+;OnglqR4;>(TW;1!o#LBj zkB{mpMNCxy9MNi(wpvdzerwV#ri5LBGqR~Pm?d{is}Ao=~MjFQZ`cLKKQtsjOWq&fx-d^N-21owLjzOu#v47d0jJ4kv z**`eK%l^T^&k*Hz?jPuW#X8j!lHXLgw5;E^-ZQf&fee2^d0#nn;X?$Gk%@>w;Vk2DIeOMmHCLV=Tpi* z%3cp;IyJ#w(Vk>F5%%&s$J_G0ri-4SW&S6l zCCNj^JHZK)9PYK3hssYbTFsF8nrY|D@Z;?Lh$d(4xk};bPP7cK^&)b7N%GM8Url~m ze=F0QU@xakZ<@UxN&ja1eU<*Bo$^De-)CQ+EB$M&O>1uxo%rNG)~O$&(vL%(kcW)l z>{Nc@Pq()V$sgM)d~7TJJ@)z`^P}~eBoB&js{OewvBjw#5Py=>bDwamz5I^xy?oMB zy`V$W6Knl_7VDu0$zmz-!{j_dj;I%&%dG0>e<gGj6Y_)jd3O8D#phc*D&71*v9x>#*K`BX6zX%L>^ZPO0#{5*qseFID z8CNksnsEV#AI!Lh`8kZUID9+CHs)_&+{pMf#-5|3eBWd2&sck|2QuEu{7}X_87ti0 zG&`$>`9;jv?4TnV$1z{CJLYqKeVCuhd~JSF#N{2r{Cwu;GOpq9{)~&5zlHHe#@e`` zfc^V2e>3wZGmho-0vT^({sP8&=J#Y=#ry=uMI3*7#x=}mwVQoif{yt%=0C-_k?}o@ zH*$P>#-5|){nF;!`JA6%=KC{WKCQ9tf%$hbKalzPj5WLSXvU$;U&Xkrt4yy0W6iE? zWNcyo#f;+^Pu0S6`gbu-Wxmvk!7j%9zRb^O{yfGZ%nx8(#C)kWL-`m#rp3?xgBWjS zemdiAj0+hzvj1?#Rm^{sv1W%4V_d`h)r?Cye2C_s`Tt_v$XIIYu$L}O$}^Ao{*0$H z-rQC4Z(|(D{HGa*GM>iR!uT1+woet~f@&t>e%;qPEv!~A&0<;)+( z*v9-987r!k*Tal0?7u%_f9B6;9LPA6aVTRqEj;7XjN=%WGEQauGUI&4A22Rr{1)Sl zjK?$H%s7j&)XUP!XL-nZZUW}3&Uh}gyUsX?tsL4sJDIIf8lKPA91SmED~g5}vb99R zY0&aJ$M4wDCG$hN4rhKQv=7es!B%|Ik~;HA%jt|YEw`5b5~uQ#wo_^Y6P@&c(nbE# z`~I{T$PN{Z+-vbm`-^6sBYO<#9cX>DJfuE~-bYBQl^yX&I}K?Cq}N`n+XF17}$|Lu3I?|_iWID%3T5)Hb*NVT$DL&G(Cp%%Xdr&UqA?;A~ zzETa7Jx8-LlbxCDbeeTl+MP+>TK$yzRY(2Nu+|SrOut(Eq<>Ab*GI`uhrLrC(hlOt zpS06B+NHExI`)}L`;#-D;-_{i52@GItk`59rt-@@zT`vN+2}2*@{o2w&3Y~E>C`W1 z@{)EAM|+i+e&r$GU$6joP#)5LHqS0EY42KSZy(aG>bh4+D-BGiylf9hor=vYe`=Dk;CqCJowA2VwKS;mwkajI+zHDy}KH+qG{gd`T z`jv;Y3u~(lYnPYA+Uf=c z&pT-e(s~RHYb{>GT8or+YHd{nt&gDkL%;Hnc0Nabq#ei6ek693M`HTb!jt_|TV0{q zm1(Dr#+UX3Ee6u((=$nnL9>rI^T}S~%qNLzInwM24or4*+NGkUr?ns2{Y7gSBuCme z{{49<-RUj9xAHIDou8l5o~NZw<)!+n<(4qnd+F^#T7D=GaG&HxuD_Y{l zR(wx8yIC6;vx|$JBQNC3iFGYq8(LvUbV~bQ`}sZm#Yv-cfP5!B{HX^6N4~jPb>hc% zjQGaxzppy?C*z-P&V2G}a`KPM2D^XhUhBZE3m`niJNN=S{7)Chx2^cqcKqD4bR4u} z>3^Rci|88HR|txq8*Q~KXIkFUzw$>be4!QA+XM5KEIl1#e+B35G^Quz)G}X!KaTAEi3eXoM`RGA3s4f zcJiDJM3t#+pC($p=iO(BHf);mEKx(#-_H@v+Vji{M9bQQzDTru-*+zw?6RYbsNvL_ zmx)%mPJczvdA(jGTH4`vK?_{AZ6aJ7y6QEe`t1{6Cu%C}^ajz2jXwxlef8DN0>8E3 zO`_FrhP*`-`4CijZpYh%OG}o&Lsb8*`CX!A54yicG%IPppylta*+RG?FhJb@hJLFB zEj@Zh(2zmn-Y33k*eim@*DD_o)=!xuXl?3eg2sk)`;gpgH|Gl)^3At`mTkG~BXX}+ z*9&S`SubeF;=4uti0}2Ppr(SGl5Uu}mHao{|B;~OKeqpbu+nM1pz$ty1Pyt;`!?b3 zwn)$r|E~o#o$bG!+)L971TA~7Mo`FS2f3HcDH1fR`e#AQuaEeY+^c^n5j3Ru7eP(u zNAD!}EYHUU)&Fu<(6VJ?J|p*nZyy&_`R%NrWtCx{lY9BSrGl2d{fnR#6`{L?|EJdp z8WLP9XxZ-DD@6R0#|aw$S(=~)K2Hm(gzpkmKiMW|!`Kd$t< z?n6OC#{VF3k^64)U;EA=L90KSCTPP;O9d^+*d%DV;jo~kTQ3QU`?!a~86F!eY4vA}!pc3(wxc!2Ltouz+)9bg1{wd`3 zP(fqYJs@al+-gBh?cNeJYtz>f2mCE)_1docDZbbmqoCD3$$}OHu9Y-si=efB$0Yw; zqo7$Y_c%b|YR8Th)O0vS(6Vr=pdrs}5mbNT8$n~;8U;0U?p{UVO7Y2Oq7{E93R=5+ zjiAbsw*^K06SS=CqM%u~br$_`dHN_p3qF`FsB&tBps`J_2%2?mpP=REY=Sm?*6t9c zQ?Punpz#Cl5wz^{96__xrv+`;yiHKU&F=*bQEx~(zvmYe-n7CjXjVa@pbcq{2wEQT zhQw_T3R5VKwLoPfnasLkmEr>cMs6Os*L6xbUzohW- zqen{GK2A{O>wH18mOd+JS?3*sR{!gJK^r<;6Eq~J+gB7G?MTqr8?ywB@3&OY+A%Lk zYT7Ai!CgNHTHWEgbpNT_*A%|`*)T!N#?BJ7;KW0MW$NH3}MA z+pb!qzo?s_A?`tf>WfDUYVw#MXl?#XK^xAb3Ys-OU(kZGHG=9dJ}qcS*z1BeJp8es zu^;UfH2#-wB;V(ZpcO$E1=WvpIYQ~1rsyS|*;CMvxWR%dlfwnA4v!YJEMS(PS#Api zjr~4fP}7@h1dY#nTF|l~uL+9&LC}h)cMDps9uc(Rr=JDQTKtEg@t!vXEqlD(QOZwj z$F72Al>`c^S4IjNvM^H6>aV5>sszoIctw_=rZ1NZ8sD)*P{Wkx1uZLnQ_$M&pGbOo zpP=RL#{`Y-d0NnlyBY*F7;g%i72zYsU*%)F3R*iVP*DBA5rVcDpCRAkSa0~C_fGE* z!jJh59y(w5e)x=|%Wb|-eHA`GeQsF9rEkJ#s3TrGf8Sr>?RK3SlR9p1c!$^a$A4Me z6#mlSo`%f1H^RUC?E7uj$#vm=A!GlnDN@vTmju1u(cM$s`^_H}U7qn!U89b@yLiI8 z;q604HW(MRSNB|QbNBJNr@}k!jOlsUrH#7l*UR_RUOFFMf2r#o?H=+{54cuj6~9^$ ze$N3|W(Mok_8DLPq0I7Aw|wlDHQ>>o!_!|K@!|FvdUf*oHWR8Qc2wWp`SOe3kL#=s zJb&e*H&S}2e_p>5TKmD}@S=vS{nP3$g@1Txw3k=5yZXlc{m-q>>Y<+7{@~&lf9|Qq zxAA^sSAS1c=A*MZ>wyLO%Ol&U6X!0y&~d?S>gc%zUwxo@sXuM-t2+|XNxiddyGvpGC%-u^Gcw+>JTy}ftmAlD!@BKgN<)m@sxUmWQ+Bi`hv z#&>&YgY}4yy8O+h{gdDAqP{ujrF}6)9n@9TZQ}QK=%O}y-Z^Hl*AR8|sh~6aI(1Q> zo1AmwjZgcjg{x~nUjNsP@Tc0v9C&_6AGM>;5{oUTDLf-?zvs@wcc>dDOlhj~>!ohH z^Uj&3E<@Dep-FwMUw2arez*46Jg2An%ZUL^F%tsR4L-eV3>$A#z0SBlX=yi5y_x*_ z+xN!wR1@zRaeJvxFLgx!nK$!wjp2v7SM@ELqE{E>rZ1cNRBgDFkH0$R$;jU}m$y;h zJo$IG#{2ZD-?!8IT|M1J-Sx|RyMCMLtG;SX{eFnGhdOfP=o>$73sBu}doN-6s*dVQ zy1J-`*9}s8%zVbL;rsw~#KU)Hy#Chh>hw0*UiW4XR;Ru5(Dk9+`>9i2N%%S_Wq=ye ze{YAXasKLvFYasiX_7(RW)_`N68s@VU2__8FkAd>}uxDDy6L%j<7PFPIgkc3N~#uS55tDxVmHez^S>DN2${uEqbc|u(oQ$#53)b`+WF5_E#I%{r*v3rLS6c z^x{|6BPd^ahFi0*w)_0$)oANMIz)yq%caj8Sc5$bcgS7xv2Iaqyd`>3ewrv|B~~nQ>R$;Lb-lj`P+yrE{;lEEaP{7c#R)5>j8=6o z9BaOQZ>akH@xWDseL~dQpCdL@cf1h(`pom~6ZL)74#)4(c*{{bRvHdZ|8tk2>-0-jV9{f(PfW?h>dbM4dV?_n!0Nvi{wv z7A<-?C}zw^b!B*6?Q6Dy>Xu%e8}^qER8waCm}|WwMBOm$)88@;coY8N$=TMA8o~#h zPH5M&(5P>+UT^qyS`s9o5X@RQxq<8PAc8P)N>_M+o`n78gAMe%uT;#Oj>LclG z8bi*8siV?PH2nN*Uv*{q`u86>JVLG7e20>L_b|2RH=SQBGLBT&3|!)?pD|Ru?2_=_ zk|Sa2>C1cW)xYYaUh{lmZdM>(NHyg&q}d@*#yAl3E!pU;M_?xmjfH2mw} z;V?D!o6jOVlu-55g7|*B9}iN04%*u9=Z6NW2QyYxO$X&apXD>WJJ?4|pYxR)4yE`@N5j9j3m1;sci_4vkQ|KRIyps?h#w$P-=K7j+n; z-kg$N@8VX*zxKE zcVB+v`9B7#zr;@{TrshqI(W&r(_?)Hs4kN`dK&sitFylTuJhph392RK`z5nuBh+4B z#+*O)X0*EV+of~Emkm%mzO}Py_WK6)$31^QubwgeAUrEtMRd=6l z>5k9GtJ_|mbYuPtVd~qP<`llRAV@v(yKc#z!{gN2$)>&06$8|N)#N=iF~_9d*12}C zdqg*NgXOE;$@@&|m%~q(I~^FRP6}H%{fSN4;p2WVyLnwTsDGU}3tjk&nKTVNn}i@wu=idAyqYn`O(54nx!fM>aj$ z?el0gdC}&Zv&#FbJtlPZ-u;zXed&3V_na@yYF2E&s(VL7s`0%8hu170sUF>K3fb8u zK)v|ql866%%%s-M_+eD$ff#khUp{X<=^m~6y#Cr(-xW?!cg)!5oAq6Y>iwDRwzPv0 zs$ZWoPu@N#Tphb=PRCvcdaKKFzmHL$>#qjAVV?g|fIcl3$P#s|kvcriHw*t<`}<-W~E&z?&g zD%&<2T_1~VJWzMjSn-?7hiwnvG}gQ9c&OmLo5p#cG`xN1<2Q}J#6I&{*W8=N++SS| zj-GMTnA7!#C6AB3X}m)mptUaeziC|iXycjhe!XEl)T8VNmqRy z^tt%N4dbvu+oo+@e8c!bc3#0dvu_xC95dtphOz6c>#q*#f5Vttk+J?`pBu*gyCP<1 zT)b{<_q<#2y*1a3=e}@xI{owO#>Y=R;PK(6>&CHbuie+rdfnLlz=Qa|ZhSP#_sE90 z>&Ax0Jud5wa4#D?>f?UbjkOgk-P*RlZnTy>`bXj4*Nj)%Y$y);@tW~rwJ7<<-fPC{ z9hIG$-nnM%)9fE~$5Ypg)}h~rr!Bi?^!VfRGpCcU87FtMeYA4YHRD%pY9?4lUNfF3 zNHdKvTr+O!ed5lEUe}C)TVCGz=*6qX2TC`ru${bW?3T5!Yu3K2#vAo(hV`tnRacGaU8`SrNxy2Gur{@=dB#;^*G*>pUp1C>-?wJqpsPmLi4Qe> z(;4n%F8IG{JTX-N)MLLj8G}<7c6sS|lhO6%UnU*d-DLb;KmB~bdrd~EA8Rr;S3KrB z70)&r zCzQY4@av z>!_^@-+KOvv1(KP%ILLMjK2Gy>)^TMit+t7hyC)yyer1^JeS>v?!96h-{t9^PJ_oo$Y(h8NA>2P|DDH-SgtNhYn2IbU@OkZK1bLYk$M`FSmtyE*g6D zln=Ls4(zw^fPM?Nh5mNXq`DV8wJkI%_0kW|ny@XDyJXlI=a1I=K0^=aGjv<%pzGpJ zed4BVp`VVp*Q@)L*MMbWd2p(Yz;lRdi`tHE!!Hpyx{}K4_mx7 zH2UZB-(2v*)==)1aW~Y+*&3Su?vWdNKE5@yq1(`ek4A0{CDrH_cUk(@&>1%*p0(ko zt)bPOhrICcHCsd8eCXEDZ+E@8_Neo>hQ8l-ONTnAZw*~kBl|MHFUMe0Wza#oupEDDIcdp<1(_YH#2UVJZACcP}gIRT%PpO=1`L}pW5%tr#6Rv@|)PcOLqsx@b94*h)S^&7hXWpn72hR0v{)sdS+^S=MK+bvBuhemyv z5ZA21=1@}n>&GpM+Z^iimkBT3y=_zIq7Q$YaPjw>LJy~3lzUX(rchSmiE(v56+B^R zr(YIt3NP?}iZy9~Z;9WU z%X6=*e}279p~lVQ^tUOLa@fM#t8d>J>Nx+-v$m|?7)qNTI`hZX8$&N$c+z!Smu(Ck zI&|X9njdToU6FUl&LiH~7&>;td2KIzabxJK7dBltF_YZff84Y;hn%b~W-Jw(RLrMRhJ>|2<^Fv+g#GM`*lOI~$d(hk&Bl1Ic zH*8n?@VoW=-TY&pxGg{Q=JxaJ9z8HW^h@JgAA9!t{Ls#68$asQD?jv~L8)0kT#+BD z-ui#rAHF0%^hWXl?_O|0eyCyfv-PKV=il|*n{Dz#2VH&Gv!fI8L*E{I%g*GM`Jvj? z+D2WU z34BmdZ@OnE7WsLH)!sQz-Fz7N-l?kc6v@a7sGbzPoQZz_bv{;`>94 znMMQoTWjIwlcYH3lZ(BI^nX`pmA~gW*@CO&u9QC{mmoJs&z%JKm#Zl^O3z0M<_j*8 zOOZSE1KsZ>cevbsay8^OzVA4n%Pp3BR_@v*j?+W#61nzrr^p>H*Ff$k#s6CFRc)|% zQEsN(6LO>F{w+61?mD?EDtas%&|1pItN8uo|G;cqKPy1`%Y zshhrO{?9l^cQps2g!x$?Y@;~#*G>L(xybwr-YZSk75N3rK|aCXFvYVW!Fbsb@$5IG znHzXlTp4Vdd`BLnr#q@`G6gUgGDq=RUab&ZF+cKe8+hMM{%ANLEt^WPUMBrO+BObB z%P6PP(_O=X7~x*%kQ;cPCx3Be;7ihsMhEf<{=%LzNUsHLirB_QoM0#|X z{F4O}1l^;hJ7j1)O70uEPRB}5$ZbAO_xPNsyLRN_Pu7C1+)Z)|vr;$ek_60jhKM(*oO( zEE;&}*RP=kowrqYy-wG6Qr%AeGRJ8yXny);$&1phx(+U_#f|+5TOy**0aSaO2SdQ>a-!PgoJCZy-sD&GiD$sweQ@e zMYr~66K7aN7=fe0!>%OW*s!n*%(qz)VFYGJgtb@L9ECL(^zyxcAZJNotP5mtfAcIxrLZQeUDV>OY-#i zLY%KQRAEgD!~RNGioyc?)0(jPX>m>$@v#5xsf0P{k~?_O%hI%EI}~i5TcjFUHu)Jg zOdZH4x>wy<(nxW7`FF)+#W_Rv(Q}HQh>-2!dtmA{EfOT5;+d!7ocxh-!j%a#x8L-;m;}v-zgq~Q1C5?2t3E_Q`6a} zbvdpbL*LNCpspr&C9Y-~GoR{T>n6y<+y?6B9(R-)J zd+C=ze1pr*!ezYLo&+i-+{x83xUKEf?OZb@LEIRxuqH?8jA-e5bSdzBxhn$CK3x*y zYD>U*JJ(E%s}-;71@?2|_OIdW-}(h-|G4>1P2%id+u1)^u5~SE|Hk{|)laFHNSgeB z=DldRf3n_-XZCN^C@*f`n$Et-`#Sr!-pASZ{(33#@ztGb2RJq3lj2hBcfk0#YEHbu z35`3XzH>-&L+6k#`#Oi{yF*e7I5(wEgE*(bU4`{|LlXOm+&t9>7+0&BQ>$II!~#5< z{A($Hm7`U?6fbS1FS;Efx*gK0Fl|#F@FjdUJE@LyX!7gMp{-wY4vl-+@oMYIO`h~c zT$9>PljOQilP-0fCavY~+%Tn)FEbX`tZJ{5>qy(FpZAU8cB!RrYC26?HB5=qL6-Zq zuJ7#Exqg1#yxJ+qQQV>RokP>=DgV08p-TTyrGIFvX88x^?VlT`gLMn)(zLGAG`YUh zRCQ^px-{+FB)@T<($rzN2Pn-0?%y}DPDGimxIpcf+z^#%vtXk@dbZq$D*R}OqYaN%rkR~|N1&W7Q?xkW>iy$-%2Yeui)B#-ra7;_AdZ zb?%Q(G%z(jFoX5x!x;)`a& zSu^3RS?B%pyzmAJudi^u7cVqRRrn#|@77J6L!RD0f4{s&OZLrekWxQMbTRTJx$4qD z?W%y$_qJcoNPRF}n-v$z z+4pgWNC%}IC|!4eXtBRXtGLF_{&~vR&{{N>zHKIb(MyiKh2U$2F?$G-}<*X_VSP=2UfZYo*joA{~+5xo4#2VeS*H{B)j` z|GmI-GLnz3agr3rS%wBFBkoc{#N z*rmS8S%XOS@}a)BeIyfc|L4@ngZpbFR8REk zw}fO%m%EKB*%)@}U9+>~)7mSw}5s&w_JS}f3nx9ZuY+0D=;ulPR-QgxE z?4M14Sd{dsZ??kQ$`w~%=Cb$&^GPltpZsF-X{hmNN%=5W6`4(>U-EP3(%bl*5p4<7atxihr*H4TWr>m0M54iEhp8bvLzF(>}F#&$QnDjZFILcGBuJAbC(fb3fF@y2wePpH}aj z)~|if6x~_eyZwOv%tbmY3F|muzzu^^&KuPKnzX(H`k&iBO;-{-U-9O$zNu-0diLwu z|CYY}lQnl%qig>@rYOnh4!%a04=cKgoW=#jcT%rnUpJ>jey#m-I^%2D%cE@3)oZDC z!9f50fYkF;E0r}dwf8_F%jsPGl0m&wZ%yo-dhLKzA@my6Vvwql>KtA)^$U`nqXMB_ z`UpkI3UoFTdg-kLb#Zc+zBl$hdmuQ+=M1QJLI1vKeS7xn`>)=YcI-Pat%E*s?oo-( z>D_D4b=UPywIx|$(n#wmE(6Gq zlvVCN)jRj>JFs^FE*)nzu{?C^My~5gwPVkLY3HV<4iJvd2FHQtHgO_W@6`6GDzVdCifBrvTF2f!Z|+?ryh+?Sz5De}EArxoK+PjQI=g@Jr73;;8%#TMYINy0@a%s5 z23+GfPvckdF6-G(w` zL7Y3{&JzzCX>#s1{`30kHd3fzz8ho0E|yRbbh&fC=&suIO>RFRxp$&u+j$XLKD)j8 zITOhFALn+$|F)6vMA*Pt6(Q|sJKL&t8q_bXZ@XL5bd}oWeUp2)@6$8YX;jmCy9_9J z@0?Al=k~w3Z|Z>lH;UoCi`mcua}5@wy}AmHxHPQ*Tir;*aP+Myy`3+4@{;MIXQed1 zTF1gW-}L-4F?@joZ<;$aIJ;CbpuJ4S-?_Jk&Fr}I`VAV`ht%5*y7t=M%=y;gdnuEF z1Eh`yrKJo?11B{Cp%MzE^jFHsmx%-V!m?a9_r9;UJbbtC=eHShi@sn+jaD+3w+Nf|XtnL6bGm zPP*&XyAJmQr>yck6EwHQZ|Dz^8(xY@YyoPKiiK# zPw_vPxMt!(&es#yO}wf|4h8AoF~NLsNe#{4uef?ebEn6O>sPcY8vo;EU*!Fyd7C@D zFB`^r_I7skWFa30{Y4Ur2qT^?=?MoGhi=> z88x2CF+5_lcmoEd^%!t%kJO(1uj_3Sj216V1H2x6H463XT!^JT$k(vY?j>j&gUw70 z*{Up)-3+j)+{}8v zA3uV01kaMokssJj?p^truOA^dO8Jf=%=fdd&`OT*B*BStW96SCxI}KU{J<~ea^%k! zj61;d2knlqKWcZl?j2X0WWg*s(gc1Zw^C(bPM>*j!huP?A2?NxIN5^l$dT{6fkGc>`(GFQM2>HP8+?DhU{BfW zY|*#Lf;Y<%XRzQ{Im(kI_=z0l2TnakYn9ik%z_K#h!4D?rRbsX?t+Wu+RFc~;NOmw zO^N(%1#guj{t&@=zJI=8`{TUy&keee3q02MpCEXx@9!gcryOaf3!ZR- z*7fymAHjdi5uPoWf1>O^6%IU34cZ9#TMOPJN1U;Oo8{nvErJPu@%+Gkz8`pME8#@n zE)wkeSIyta-%ap#Im($XcuZ^YzrtDbI{#Fe170UPKEV_@@&XR`{UZc_l543r&S{R* zSdKVN1dsOpNrJb@?NFNOfGHFMeym7tYl;inBnl<#}G&fG3?VJ)`&uf;Y*vls`>yq#XH< z5}fY)a|GA;{`G?0J9y~;bLA)l@K-;a%W~St4OW`KpX9p9U;9FpU9O}2zkOWeLGq3Be}=q|3vU_vLOOL9Rvr;neq$1BUit#WKgiy z#o}rCYYWc*hw{+3!1px=xJCXv!GkW5oXdZX;0U>Q<Yr@;yYb zyYB}+CrA8u1>-LD{M7|p$aPT}fd7`G%y$c}kR$#Y!8^NnJTpqLL092W@y`;xP3}SY zhX_6|=UgwE3dUWg`Y61*;5Bk9=j2si z@B}&P3+(9ofeYn`|GHq@)n1vK3Xbd{+^N2!1P|(|c25371dqB#b(6oP;Ou1SDf#CJ zzI>hPBmW}7<$bhAN&c0BKlfF>^6wO!cZ2G6gLpvjlzytG!rKTgl7pXt)A}nf#mN!8 zK1Jo0zn@@>n;fUQ{J^{As0%R5_XDp;6D^cxcfk+khA93z!3Kl8`27T%-7H!t{1CxI zZ}IBYT(G+wcmT!?_R3RTu#4PS#Ru+`%a*_6t=g0IFHaBG7Q9`K@;oLu{5J8n;*1a+ zJ4B|r{iNpwKbHGM;hzXLx!t1+@c-_R9#EX-f+OVM8Q>Z@cmTNmPRWtt01r<0@;XFt z+EA$^g}1rOac2G7EAukJeeU+sX(N~?N7;ZE-y^-M_=$qg%E24+1xNnZ)3>7pzmNkD zd4dNG^Yao+mLnWE-S_7RZu0$G1kWArrP)DnnjGcN5ge8wIa0pBWpd;TtdpraE4;p7 zCppqj6#QBaepn}1eS}wrhJvHyNE7(39O(cX-K+RYr-@)YIdoLA;QRN9UJ73#c>O5R zLbgi%1UrtF9+n?CO|G{5If6&u@1@^TaG)IJ86r6D0gsN432v7oyy1hw+ZeB2V+9w> z5&o{=ufE@TNNLJ}|Db&oc2lz-k=eEK1->UYR{kY|lOFZzHCeFTIO!RMCki%wLUob9 zx!^N$i{u9`o~XLZ|E^%KN#Zg2lLc>+Bi}`Ww@mi*?O?&D3XigdXAiGpX%P~S#=;NNqkcjRv?c*RW5-(B$CS&{{X1D~6%c1ZsDg5#bRU&;TN zV5hmV^OZkQa1>5u0RAXPdGZC%e8$rWX9*6HqmMdR@P}tro&jn{=4owB&hVAsH*zf$ zzE1Fl=e)Y~6MSFp1cfgVeDZnq=jERxc-1TF56RzMaF!hUXO7^za+Cp>k?ZNM5rV(U z4N-h&q4JdjCzAzxzUt+bF8H-vmg1}vocNkow#kC;ye@hve2HM&H8sK zOBCMlO~+|2mnVOc;D6=l0}m4%vsidj_*lU=jabER$UYa_-{GF?-m>* zXK*X{w|9gq*(Rk6zAx7SdnLiua`V;4V^dO1xm@~?f^Fs2$q$_Qk=GAgBA6$qg;oRm zEcN?`g4oKpRD2+I=7Z%2V%Ob4@qySc5(hZM_XDwsCLDQif@9%eofq18y%F|rx zX&=EPL4m-prkTGRtnhe+O6{i;KU=W6V6I>dL6JDUreMCHK*3KE;f#{F)RrpW^A3B`oBEhap%nDC@x!X>s5KQG^Og|kGQn%(?vI;cl;9y~4i#_S;Qv=gxE7QKQ~b9xL4c{`W2S(MOlK zzy1nNesRD2@=JH*$dPXM?%hq^3l}c5IMID&1c#{>=B^e6z{D@x}!%c*xFP>i*|HZy6lE`Q}#&+w5L_ z_0{hE_uub+{q@&wUS6L2-FM%GeNXwXy6PEs#*F_Nyi@OwK3ZqeT)p~7clz{f_n-g# zr<;_Nq`LQ19#g`~&-Y!sKINWw-gNiebEmtM$8~qQGiNSy@4WMMcgvRT?uHHDEC1E* z(xsofufFV z`_1ktr%ZDD_I<&9?zxrj`RC7Y`}KR#z5VvrRPJZpGtZo2(tP5HkKECt-*Hn?UNU@1 z8t^RTyY$jIZrirmCcn!shfi|dMT^!LnhYMi(C`R!y7%6<#RH2BU-)I%4*$OQ-dd9` zbhz@$xo(dh^GrE`mtFR>d;Rq{51Xr^>(u5{}{<4FIIL&mxnUp!0vyiU68Daq3LlI!yd+!<$_;kIeh#^g&mgZ01< zf5P)Ud(M-N-0tIOr}V+E?!tv%x_|%sRCm>?AB2;gMwhK#z1p?ztFOM2Zg|xVg+h{* z>m>hM!_o(*8#iuq+qa+QPMfyW=op*-_U${A@3Zbb_q=InK{(~3t-)CxzI5qQw_Uq- zMh{0zKR@3~AKgWnp|LIdS!YdgSFYR;lzo%-wr$(oPe1+C)dd6YC6`08GWoNftgY;3N1cKR-W=cY@`If2L0T z)TND~?6eceFT6#2fz0jL@w0UPI>RT_;q0@|E|3A_Va}X6`lhfQ4yF%%|MHg!M!t?c zcD&lsZ%z8h-e;e!H}t11g14Z-+_`hr#~EwdXk_`xCnu{uD~shH=u7{G_NsB?2POaS z7w{zYc<#B+C8Lv#od5Qlr+(fua6MmPw#~=TM;VX0r{6&5F79EA$L`xqUBBzZSJ>X89__67O+;!I*?m-7VY;+#H z3w=nBGN1z=fBZxDg%`dsI+y(6fqU+Gt4R9P0iL0+Q>V@-Q$e5fzw{l`CM8;8!fehVYR5))^u z|FW=%4pe%kEe_U&dhi?^50vHyx5x-Cn3n1>PL6iI%G!6OU8Vh#iuSL{`W^kS=5lT2 z3i@Fh07mx1#Dvt-kshW`bFb>XO72&=Fr3HWnKW0Cho2WVzc%kv^zO|VN1$tN_CE=(EzCl?|n3+8^2=`Zm__%sbV!AZ?510KLQB5%;stHW*!n zzKL|SFJs4kV8YSwKmYub+T&%Wzc7FPd^4_|HEWh>6Q6(ndH2H)KP(s@+q`|aO0Wp8 z(f>K>sK?xW_PO8a_W%38N8F&>fB!LVT-*qw(?^bcNA2{FW-OhMkf3(<@r zJL{~o)P|>;{y+pC!tzE(z542x?g0mkG5s;dj?5jbT)Ez~)3isQf4;$ti4Q;gQ8za? zPxA>|+|8ReOV>VN<|CMwu#UNfYp%J*J?*s9+!IbX!F}+-2MsMEa8Q7I+D+y;XwMjL zGiJ8>&+-F(W%>~4UCPThHa$D15`@fa3>q{@-yEyH-%aYr>?nwDzq1g1+@Zq^(~hHi zZMcQx$6Nw+U%K?WB6``zv(WM#^A+Tul9HnKa(j_LE37@`OTX@YWf9M?riyh z)c5=Ezc=$sLxv17Vnj>phU3Hb)x^-*!xZ{p9{dnejva+(wTu(`LxAlkqC!ah~ee^fX z{0sdd=2DPFtq_`iMPxsVdcX6|JEl(zpSN${UVXVcBp;xX zPf0jD&paMDNIc_`~88+#~Do_{}%pY-miGg3iXZc}0Vf`BQ)TZGZVomYL7A z`svU^$11;t1~)dH^z?K?^Gh$iRQ>!#VPhZW8yQPSj&JR^7TWxo?;) zKItT{?lvy^j(E(^wrKH~U#^{!)oto0KdU*m8{Ndj#DaV;xZncyWB;M~ho0gi-LWCM z*t8-c=^}IRI%NRH$KPxE=ICM@AG$Cn%D95LMdmvRBW-Z}?YG|={4=)--g##H37^-raZK`;9JOKAb%4ci{bvH&&Z=k?{s{V&B1QmiHLrtyr-^_Ss+_v{$ui-Dk#-k-E#~ZOe*m6BnLm?gAO$8^)KEf%$Y~f$=C~Ugme1=YUW4 z+wVd5;Dg7yM;!5}bnqnc;cPQU$NT|wDl3?4PLNdmCL*U^AVR^GTW4k zbSN7R{y68H>1NE@puuQUXXf~slVYxzHk|Um_10HrUZAx6!9h~eJmsHZ>H_^46Q6e4 zWHTRr*kO;jjFp*Bpnt+xAHHMkNO|B{@`EqnK^$^}4x!wyzrMOe{)4W}v(>JBpP6Hr zJ$t#){p762{Uyxq*(FzyEj%p1{n1W!B%`PZj?K_8HJ zTej>l^AOMy9l%@}`L=2Eq{=l)GVzFcW(@(yJKBbtHSbe1^Ho)H7LJ< zyjS^tBfpe^I?bQ|x#1mn*t(uQpELBa&lW;6-q~jh8PCI`^jV|iO@6CHBgT9My2JWC zz3%ldDO1IqC#S{a4S$%ipz_?6V?SG0JN{zqyW7T}5)eBEwqwCn!bbs5T6)9)lBS`z z>Puc`{H^JM-TGsmg0-R~xq^9$7DeYN^xDyw);P+pe#C*Q#|`qoBKKnq@MHO+LXa|0 z7Rp4~a>TH-Qtouz$=E|p-UCw%jOwVNSUpys_domJM9eZg>8Sz3Zu0#%9}RE zIN?$07CIYV27Laa?~I-)DK6!vtn@pWCt{7~3eXV#n;Lok;3 z;)^egTeWJH8PBseN8FOeRHUi8mZ&4a9qW*+8(^pBG+up&5^zd+xbP|6DURWITxd3-crk7A!F9)6m4?AP5y+tbXSk z)@XY5dd{qA(s!;?=RUVtvxm+2g+6Ri_lPO8cA4m#k#3VF4{D9)8I}DfGft!2EnBuU zV_D`ig7b-ye%`YVJ8IM@Q}jb~kuZ2&TkHtoY zemP?tcq*D>Jiz=7<0RH98N(75q&;(Jtl7f%(H!#`tgkbl%G@e*ywHX9_VSdUax$mK zc!%*O6a8v9kGAYJ!TayKROc|FUo)0ZQgu#NqO>a&>&=G zxETjUo1-r6d)|Y4%Flced~eqb;HUEN59Mc$g7Vw>_~P=1Hna!mqJ|CcH?}Y3!96@g z*|6hTvSf+u0y8zY(Y8Q-(Lv0&RUZL$BH*TEf23MFem$&THt+4#V z%^VT-2+Z9vFGb$~n+Vnn(65x8HiEUp;9P1n9I-|;Y}l{@-T==y`VOomz4X#c2H#e% zMoXhCVZrjJr@vwNp8ng{UvD)0f_)lxWz6w-^vN(bBiIxdC%csCqmMq)JXxqfHnA_G zPqcjba`EF1Bcm0;cVwM{<;Ok;J|~Q{kzw%6+|SWRKW64%nM;Qj*r;IJ9IXtpdoSceS8wSLNv&6Jf> z`a$#;VqJFfE2;dHoqihY*sSLqXc=Xm!;1l>8zW>KRW~p7= zW_Zn}1-`*M_FmB8-~WE2V7-z!j0vYsoof0A$U$+AJ|~W`&XreQX~sSl4>qroU}5=( z8(cHreCM67nK@_H=HPqQek|^TX;BCGA32~+X0AWTN7Ui{_urR&{k_KKvUBIoW-MdZ z6dBjBuGg(wH?tRlzCZ1CFptvwh2_sMZIjnd*|yjl6MXkw;W}@$^ssA$2FD*i-t;?y zb+GaYU$6#f$MJSu@SAVGF=PB~+u*;#zE-q+qJpuYvpqUBRuSYi2xnY}(zkY=r&egf-B z^o4*Wts8-F+GEzpX`^We?b>~D`Py*4rN4O8QP_Rv_;oKk9U{vQ4vR<9%jusCudohECl0{C-meS?5$~6SbHR2_M`AV7{4Tcu>7ns zvQ7sMS%ak?M1APbQ3uAEtc{hF{;*+h896%k*vAX(mymrN<)tr?{rj4TyYxOSu4c0c1 zA;x#?Njl?w3t&r!z7uS^f;ohdeAgjxh6YUVG%x5xg-k$D9^6%k)X98)IMA zGim3L57z0K%jnc;rr`&80^Lfzy)q6L%yjG3V-0hx#sHH{pNf4>#6^B8f`4!P?&(bA zH7DnPhA$~2IA%Q-dee?k4rs)_681Mx2G(XNlh?ndjHETftfw*t!XAh`*h5DhsVlaL zR!^};&b%3Yk@A=S7k~Wjl|Lb2g0b--pa1;lO|>h}nRR1phvCtiaT?_uVfxgJDNjFr zvi40pZFq$BY33AJGpFy(d>DKNJ}ghdb2g0jv062Yf7+U|%P+hEUs{~8J{^fmaKm_# zeki;EPax~;?ZYmBGQw}jCjAcDVe~KkBJ_Dl<)J=a`!`&+U)e@yloUTwe);~Xr&bs} z5B<@9=t|}`Z@cYPm;IYBzW9aaLci0PZMo18HD`g6?K)#e1)8=<1zjJsu;h^IiJHLf2 z)5ZqhTR-y}FTcFX*d{=GWXRfQ6<5~c!oeXnyk1{2!}P_l@woKTr;Lmur(L@~ZR|1N zdDaGk?|2_{M;tLuxX3j2FMJn#ho5grA3g+UKx|y7YjI^HTQ@D<##BI-o0&N%)?E>6Uv^>zry1$c-s5h1sF&t58)jLY=6at!EGiHq58_K*j%l7nG~ieoQROK%Inxfz;8~ z7aUl>U-vP}vnp&kcWGTqz}v6F!I&TpI@Fhjp#aypFahp&eUDBzfg7mBk1|^(rpuU7aqoyhxXo>(X%;WeuMck=9w$zy!{}- z{8c86MSs({)I0ZrXWlcn#acYJ2G-fVvBa_QRi85Bfx63m63o9OKVxO~urSBPnLDh% zu>Y;1jHSu3sXe*Mc_cjoU{C-Lg++5WIz${sW3^Gb8f zJ9~3otU-)0>qgkzFc-}kZQvJMG0usz^`TDXaoF5|6VAH9=BBKCP!g^v7q+e5dL4B0 z=6$cf-aD%e8@ZsZYjJ*TUYSb;f8dQXP?j$J-mHf(w@MksO}(i*bhLAb%$b3o(j0T&*swKj?9FwuXOZ=jQ-8&qHy2@b#oXMAA`hh7Y(Umm}uJ$0t;(2c#Ck#;|&rHSn! zc5s&VtRsTEXy3uJLH%#_dNgR`(GFlkWa)2lz&Tr$sXt|8U6`}CC_8!{x|MMr)6@?d zvu15+&)Ng)0p&>}8lHk-)RF!C(A>%aa`D6yPgJ`8!-r$n;^{lq^opZfuslIOHu{|F z2L4zRoj(14C{}ru2w8xgg(*E3Yr^ST!=tmrF8}{Rz`^R}X$h)mO?H~46oEHn8 zO2T7F@1Rw%{^Q4gs3B8yy&ahj?WVOgz`lkx`ij!t(whDOwtk!u!?`K!C84fX=BYn; zz+M{L^~%(p`b5^BGhN_m-a%j9QlHz?e&GR*T6oQ{(q}h z6HFh0b#2ZgAbz`c+2yuVqwehOy6m#cOx=RA9i%lnj=gWl1LH=<#e7TIW8otC|HKos zj13UyC(xg%RSR3CNW3uq12=?cn)PtfDQkHs|MKO_&6zOJHpt`P0mpeox7>1zY`tDE z`zH7%mi4w}4b~r+NW=Jcp5`hjr|;hY;= z!r3mSj*R_-^~cZo!oTPGLl103k#}q(Ict)-Bk!CM#aaGV7jX7Xy)%`)emA<3z24R?oBqOm_i_J4(Ked; zEnd7hY#fjN3u$i}Z9H>B=tuVA&^Id1@jl}G_zKBRWc}@#VUalXY#=?_W3wG84N?~sPAS7h5)7+yFhQ4$|UmZ!Mq$ogaF%v?Ta`+0La-n_6U|0B#k1-q70T$)}z zI5Y1j|6C3af9%yMZjW#k@Q73GBDxY-R2m0>AV#7*oS9me%2O zl2ucG^b_qKd*z@#`^aqFEj_6#`w5v3g%8k?*o=65TG%#GZ|sE_BV!k^V8IurJ>;AV zuTCROKbf@?tItTUu%6x=BX~mZG;i+h>7#wNIEgj=gKa%JF0$`Vov1%Jfp#9AGR*nZ z@WtZAYs?-#_6c!k0CR;230cPeg?<1s1MP$Pcy%6O<_{P%op8cobqnHw z^SwB~h`WWj*MW1e=sPoy2)|jqU~!HNaTal`>wov%oSk9ml4*4M5MZP^eN2eup_U61s7`|@XcB*)pd z#?!vSUwmJZjYzbzB6q2&%s+zbOf$zq`J=@xYZ$ymJG0L|cJFv0Jt-&r3U4FF=x*k@ z;C|7{&te<)2voKmx)<{}XR=d`UPGjwu{L4~S;?X7^a}0e_Z_hYq5>~eUw9Twr zvRByR72ajdqZ}d3*59&mo@GbP_8}JLO8M3*U0TCc1(4jrv5kFOlC< zKJw#k2hY9;e#|g?{#lDGt?v<;UbJU$%b8N%Sk1#NeU;BY|H0Ik{+FdEb@1r=i|g6E z3^#pS`iR7{@1sG+L!1Rb{m~`s)_MKMXmPzTZ?8Ulf*q>Y?q!<2+0dq}yc4a?!7y+L zZEw9bS29oE($j_X*|7yhe{nZz&~d)MH@?p_eR|IN48D)%@7?=(BTJ;uS)hzBqs6mf z-1~R_`P0q(fmbHlnh{3s%CgpE>nL27Y6A+sXG z@%XrG-+6J-$+Y>NeNox;26dM!ll?P%Kz|5?LOcDA6R|xr`i7;#DV0%K_~k1@Q2_3p66A*R;~xDrF(Gi$qgPJ{xJV7U30w} zRm<~WEzXHZ$1jQ(oD(5mN#{fmy|f?t1XS{LK`0xt>R? z`*Pv{ocg#O2d=?6xQ7PN0-8XZs`>@#uDt5#xs&qERGF5Fo`1%D)@2@#mM~VSa2nto z+(QFs0Zpoc58x}yTY`0!S4ZVDSNU(PihAu$v#9-GX*huv&;;7}G%_@UZk732ev(ZN zy5(>^Pf=dmN-NLa_vNQyEN}*Gpb@l!X3!rRR^+ENOnV|7LmFKLzlcQ{_oh+xyaBCz zni(2G%kun)5AVnwpmfs3SKscXTh-GomN$5kl z^79|GgNCAild|xD;u=1IXZF&*{P_Mo@@Rku4nVe{akL-&f%DsYbpBqsmp#(&k*4J> zlg|U`(ALs9k_QN<&nW)rs`z```#%WnEw4aRXlus>LHeT?e0TWXe*Par<}KZW5Za2) zhg*7E9`JQSUGc}1VEn!QKOQeYW6`@VH0K8|C=A$9I%4nK&L2$gN6IiXhSomKZGV8d z_dfseu1S5?3AIhzLQk;kr(J!r0S8oQmU&JWx|^Bp^WHhcNmOUOCV?2BSQ(e8BI+c;su zM`qt@G#-E+(1mmAIj1r|Ki`~X!x@~PfBv~SkApLMUwiE}?V)&4dm5iJXFATBHB0-8 zrkOJvIkz#=aW6FIUvVxL=Y4+g!3XBtiywaYq2LTS_@XNLLFpTtt*WFya=mfmcC(M; zh8tec9;heGKH?fR*gs?U!vJ@e06J?D~eHs6pTL(CcWy?XUB=Qna* z3-^t4E+^--az=CO)~(HXmYi*4&-&s#n`n-6e~82Rmz)dt_rL$$oR7!(=7R?hcAwB0 z&zyM)zf~0|cuaUG>dd5~WGQ6_S z(Ef)Xwwbd8nl?_J2DIdQF`dhw%4}0|JVfrNSX0WUk@yC+> z^qo2TB`xh`opTe8^FrC@JdhFQj10~T&S9CJc{#sNS6_+zEU zZ?T|1@^8-s3*wx9Kw{#osONyk8gHamn(S}bu(eXSs){m4OOv%D?tCq&KZySC)~#Em z@4>7r{b_HxHy1ib_WQUSh4aeF+ulaQNm;^*ll{7NN1D4HcU3vcQr42!r&`i^$0e1kyzfeqea>|+>zU2v&9^Gz zLx1i_*i-1wy4i8Z+5402xR1N>rs|BzU8Qq>alN}r!pEL<>)xk%pifNOP!+VQiZr1= zYsbaOKHjC|1l-(B=CN%py$*E=V?;$x%A;I*`GY2%?CcUoc7F>>TcbLSUr zerdF4ZkRifV{s4Io-F^AopZY*?F?$wy4T#t_j{9l%4=o)n{U1`cB0&C&3$jsy|g)h z+ZROl^Brpkm62U|bWf!}vcGic_ff|kfB*XwvmSwNDoqY|#d|xqPhSmtPS$O(<6#XC zT9%dW&>ud*<`i3Dc&W1G-&5&Nxw)$>Qub@t9{IbFeaZ)YSTEFmd(&3aU&o#k8kR-R zTY0w-KEcK~J3G75bhms{b@U%D9-l3HpwjONvt=nOME03iJoeb4a}K*x_ASkkcjjeZ ze)(nhPT31!CvNXLEv;?0w2p-E%b91MY4#9sUpRS{6<;OAt2+8;=l)`hqejXPx7W5eA=@4owu*=zCr_gnq>p|bM_e8c^0#~;sp zbNF~4*^g$!8KhM#{g&>`!9DxzJY&nlUJy&Oipn}XVB3iH?b{psbM_h8zGJNGP#JzI ze*DKe0Q9kU;AFb=%drvQo+)(qS!X?|d9FF;&OGiMgg@rZgFn{l{_`Kry@}Y9hU<@C z&E1rd_NA;fvY%{M$v!%svD-^8y`=k$ddtS;luFAw{DQuqt-!u-#E20_pCI$(7fZU^ zw5m@2?K)622wwzw10M1C1KUyfgY^XD`LfIA7&}f+e|)TU+@=0nQ@HG(amM6g?`OAl zjTM9z%+oPur%i@t6_s_qv$9U#@P-?1kd4|5?U7t<=pBnbeo6J-J@k*p6Tz^e{6Rmz zW=(Hi&$~~vFg|-s#*E>9`l^wUApW5Jx^?T^n{U3^(7Zfjw_w|DWt}x%Y(FzIGi8td zwwcd|=2a!{!MfnDTKX52@$fdgkcNfphUE?8PQb}#zfo0>_rVpmns=&C58W#w^H$c` z>&bpD)_K`qO4?P?zDLqK^115hpXqYX>%f7pxK~{@S94t1!r2q%{y*-(WZzGGd~y5{ z)a|A5L(s-7He;el9NA}ZHF@%6)$6b2qCLDq8-c9TkH^NBc_8M4cBQP_dIVwB(LclO z+4DKG-=916u(|*0t9;E_f2%%Ip4pqjeX7`MUUk*evK7e|j>gMo|6$$xJUR-06wed& z>fPtwfB$=?pBSuLEdA(X`rsE|e6eY-gSxypza0l4>o?wbqwWEoX=I&p?G9OwhL5VG ze^SysV~cOc`RHfnZdi}Ej{LW7_4s4WntZdC`{IkMjJ+OrCUfua6<0j%9&*UTexEU# zKFBohxxcci`T&%ZGXToc-qS7+@4^c&G=2E@-g{5u+|9dP)^{iUqvdVGqVWg&!Yq%h zSg}ENFi(^~e|RFpJ^l2_x-)Zw;W3+bEFiR}zyHsF{dJx5!WyzqObKeGSOL+?xWIYXjQ{+at5Hf)hu=VM<_xE{zf`#zaxj#XcP zzTfE4qf6BN==}~II%sbCvpquYEl>Sk>5uGlh6rtX_`VX(;uvr4=;luFl#~VjII@sG zh=1y-lXQ;2`k3_v%CaAe@jU&!ShhWuPE`eeuk=TDAAb0K|NNLj+Q!F^Fl$M6EU|iZ zzKe}_IFArN)9umYS%2?Y<@y5HSYngOUVW?UBO&8^;-LGhidI#T?(dQQR`!|K3#V&_ zbntky{zn|}0iV3_##gfae+A=-yvUlIM$y7dJA{DF$K17)E<^ZGq|_B3ZT?rr~}LB;5g>_7hahsIVQNJrNH z?zrQ%V*6H>Z#ZKnyv^|X0^PemW9Fc3yAjkMW$`ngLmMC2?%QX^erKFnn z{lO#j2UzdLJ_vh#)`DW;m}A232>lXS&Wb$$Ug(ePk01YGRM{`7-H%phc!~3f2rtks#L6)TaoJ^;nf0hxv;(_>{>9up* zEY5wgxT;F})91$aqcj||&O349$7by&*zVJZyXBTw$|a+=ULFtp;!c|MiLoaM?+<30 z^MB{eDPLaz9>Ct0y_dU-2lgELd;5PFmm}ZB@c{hy{r6kcMn=xzX1Yfl@u<6G$+~jO zzU2Y(g#T{2B{#~slo`_FSryVP-0^{ZHse9`dRb*R7V-8R`g7jm40qM4AI;q#oXH6v zSi27NGdi8;DN{Z*XLS^n{aiC%v-GS8Bv1MR9Xm$r3vfow9K(OaD{K1bfo02Cp)<1X3l>3^7Sr`b2`H3 zY>@p&Dkb|tTEc7WDe?9Ug`W?_+Vaq$Z_X8QlX@BSZsZJgcz<3VhGIggKX**WK*wOsb@M9Tin zH&>iXX^a_2gH-hOrJ6MO=*7c&-@N>!-fs!UIxzXd*Fcw%>I1t zZMpKwD@~uVW5_w;cZ@AL^XG~yu8^!GnSCJ4A^hh*|1oF1bJhpv zJ#)`gWzYN!){C-NhL6yj(bs=0{fmRveygYr7ku&Fd*76s9>ID=`soW`FL2v!3(frl z;rx~%-927=>gj7#Y!8X$1v}@5Zos~qy@Bi(VLuOZ2-t@#U%uS96)RSlIU(M$2jIK! zzB7EpeNWgCkVY_Fn|5XBRTM9~i~hy&MTWU6ihg5pea6T-l=T^2UAJztIg32Jz47!^ z=gzZ4gDs|?Qr0v}iU*x=v=wD__M2GJxGZHXDNaf6N|Jx7QZFgJ)mHkRh+Sy?Q-o z`hlmOI>C(V>eRt*FOv55Im7G?=8ll^&ij<59`L}lY5$9IH%z7pgYe*?A>MD$NUa3KYzP9lk1&#zA5&ekV2lw)V+7})rQ8_mK)sLz5ufB=_ku~zzm}s z-g|HD?}7)Q5A&2k$A0)&>8Glre}*~#C3yZTW#--;=H1xiRa!exr;fL;i!#PqX3$%l z4|mBWv;FodoChwxc$Voa5HHqwmo+`|#&+qNYo3+<^juQXGrCjp4P(m?3m(|j^v}=V z7WJ%n?rGy*wnF)b9#y-q3ms3NADhC+{vdjRvBK``3vh>3@7~X;Z2y%T?z>^`K?gll zsx3rWd2CnGpLXDxXFk*2zmc+^Dch-e;_-Q^W8`?y+uzNZFICkSm_D7pzylF^XPUVJ z<_vaMUjUu&;UqX`<;ev5Xk&qoT}6L%75lQ7Zw;5VO!4y=chRCXX0DhsVZz^gdLTLZ zxtQ2;N6H1|qHn@^Qjz;iD93TfJ!bAK+Z{aM(I5HW^XZT5&z<{Oly*PE?bGLZqi2cp z(o3t{Lk}&w*B6_hSnunyyg)n48dTS=k-X{k2eBhy4PjUJ1^y`X2XDp6{(%QRD0{gt z%^1O>$1mE;|E|9t6l@E;eO>eC$8KMjr9Tk){_w+fvhQM_aZuhyn6*RBm@dm&b}-G# z_|Z$W|JPiz=gU89eDq_Bw)@x!KWpxcwS8IIBgTB_gvhf!p$m7+v1SyDwl9)C@W8BD z%iR6;E7}*}%o1z~V%-il(B83@oeR%3 zU>v`B^LC9hH<|wY^Ur@_Y~XIc{Z*H}Ywg-iHFr}-8x!p*{Xh7a^E~$3FLK?D^I_&` z-$wNNVZbrGaoAyF#RI{1U_`;bF7%_NU92E9qAzgye*E!w##T7I+#}5XqCtaRF?|8_ zmUW~>ABTP-cM-kt!WZT&TIRmHcb{uy`RJn`Gi?iJ6cm5<74$F3?K$-C)@_dL?LUjs zo|Y{8mM*q0(6?{&zChu_BY&N=nYEU|J7M305*vXW^XjSu!5`X?sNG-o%3%TT7_hXo5(6>0aQ(W{$L`&Czp4A!=c%2aZsvuXG3hB&TbN%}F>1@P@ zWQX#EStq^r+WF?3gY(Xt9>ITm3jL$w47s778`)U1aviN2FFo6 z)BoJC!IR~8-dXED_0$S8zmS^xvU};Jvt>^=Nqx*mG&a58KWn0pE|t^QMP->eEZPqC zG@Na|9iM}PehrTUqWdjGk?CS)J&pny`8D<<9Toa5&>u6z~ylyw` zY*C$SUwdt}&V^fV#u$u?86Uu>9`9l&#u*MGhsJqFWwe2#z%JHRZo_^`JU2f9F6WajP(8(^6$w$?Y`@> zC!TiMn-gJw2zq<=?B(X1#{mNt$R=Z!&hPT(M6eTq4w3!hve7get)X)vjp@5%kB$vE zXAB_A%(>on+pBI?)8kQDTRF)Zw!%N_f^I$H% zc&6sx7HBW^+s5{vu{`s0+*iap4?If$i}{;y{Bz#;Oy4f8Wc^(pT1Uo3Z!kvs$3JF9 zKBFJ__~Rd$d1&_jGe^f<9k?pg*H)Gb+a~zn>Z_lPs8@!ON!s-C;<`NX(JSc2 zqH>jK_RJJF2VI^#h+BF3|7^z5MeRC@(kHUdR;VAM#kFDK`kFN8+ZDAH%P_i|xpizw z&`F#*&-l-ihUU0#5fBmcS zJXl%!Q*QJS_A?cuFLW-duh~1moCtkA_K0!DBkM)ro;%)7JB{MOYZrl>1HzH{kt7mwRbwSRl2gffyvQ>88h_;3kgTV0PB`ylffsn1GiM^# zAK^)C7^!nC@`;uPX=5V|Ucz~Ngqd%iHf?Fl@{a}mNrQRR=k4VW zy5$4rToK+!qg`dgNS8AXJ^hB9*mls9eaa7T*iyojs)q#zFzFecpnSAP_7v>mYM!!Aq_GO z-&K_@GI_3C`Gdh#VciPp&sdfA51PfIjSYgi*it`W)>hEnw9yr<12|%S ztwDoezlb@}u|{s-qgddEcI1Hv-t*V#Ee*J1WRlT!6)k^c*=Xx2GwE@TF>}??XivM( z+7NTcv8rP%=}%h7UQW)kD0}QZ9l#zB^uTk^eQx@%#D|{cam*hvhY)U`<(=_L`vGs2 zC%xk0lFq;WwNSJO>R|7#G3wp<^l9j4a0bQUhew`aZTT+Kj03peG*)`w@*#W| zOI~KojQv{C`&w*WGEAGwy2!u({f60x`N9jUv}Ti6CiluKUz+ula2d%kHdJ%xuGD;S z+0rR3Kgx9Bg*ip&f6+xVW!qEs@fK`jaR8$=oP5JKo;PXmuhCx$^F7!M3(Mu2!v}?)UIiqsGW`rBRmrNVBl* z_wpg{vV2=w9LDw4sukiPG9UX4?YTd(s`ej1f6gW-E5DQ_9z4LD;D7-y`e(XDnzNj&yjPya6~X16 z^o^$zSf}95YjkO>+x#G1MgPrmkO+=v7&jjbm-?}>+Le;Eskdg4Gs$HU&tTu$RFF$ z=fjSKwP$RZxyuUMCG=*j<}sqtBNztlb*|LqlGRPY@L2o3ajs`~$r((n(J)`foGrE; zx8MHSpUSaba^HP#>mKA!%($Qa9rjI(AHh|u@gFTcXb$Z)Xl^Dwuryknst7};Rb=d6 z-m&%XJw9_xIB-$bdOjK*p*ghIS#yr`KxVW!d&72(Ebb0GLvx?@j`Tn$>4UAiqa1tl z-1R&Lt)aPiz>yBX)scVhURvyWTI>#-Lu+Ub?ZpS^e_%)P#kSp1p1pbQI=+L((AuZD z!_U_Nbrm*cFD-T*Ep`X4p|R*)7n<82I>2{_t6%uV?kLyZJgc7Xpsnb9xTUwHKM;QS z;)^e63%W{2e7lz(RZovyiDPIAZJ}{c_AL((h7*s#1L=ytOXeYVB@X_qc|l8P3T-W& zE!~4qaZEd)I0wi-V=oWv`8vR-{S0V|-iO8|{fOi9NRz!huxHahK>H@p6xx>M7vKT( z0BynE{(#oY_N4X$nn63{zC5(I`~eT({Qf{!`i^^2{r}8mg;t_HG_&J6OV)BhrD56v z`i$a*!}UBxe6@Fu=y$3Mpba#FR<@rH4J-5W`vQiK%BA?U4-^WEhhrizYv=;+= zF|Zc{doi#V1G@$T>EYQFX`gb#-xq1$^1|QOifk_<+tbMQHnKgAY_E&7=V2M_tLSk~ zO{ZZ)U~{KWbzsw`-qWx;juY=RZ|*&1D^4{hA;Et-%5kbYZQFWJE!#Ox4JSR_f2vKI zdw;tG19^_qCeCp>OiY~EZDP{IJ`)E|95yj)V)n#26X#FNow#UX-o$ki^Cvc))O=FQ zNgXC7PUQl_O(8#OI!+MH>*)0Rxj zo0dP#nci@E^XUoG+fGlMo-{pWdiwNH)3c_}nVvg+$@IMG`O}>l4QDi;kuam}jKmp9 zGg4-x&loi$YsQ=zxigl`$eWQr!^vrw(>y03r)^GRPEt-vPI}I$oUEKVIk`DYa`JNW zbDWtCXEvXiFthE<#FR8o0TXmm5wWVs*Ms*rBZLDgOt@_MYjTWg+%T%j%s@D$HthVab zRJCiV`n6FFJE)G`RLef9=U~-znCd!Kwar$2=c~qxROe-;);m=1+Nya|)xD)^-$wQC zAPjU94*CcSgN27-!o*nNB3sy)FMKQ#MwSUD>x7jZ!b@#orm1k#QrKxD{B+2HBjcR; z`X8P0gQuiV87BIV6$fOC2j)*%rqp)KsI7EbDvb^~-E#Wm49*#rGd3qXXMWD2oMk!d za(3j@p4oI}%b9Ivc9_|1W}lgZXAYY=c4qd>`7;;ITsCvv%pEgp&uTiW<*YWdI?U=e ztIw>#vxdzYJ1cwE{8@`;Et|D&){a@VXE&YQa(0{99cFi%-DmdT*~4a!ot-^<{_I7w zm(5-`d&g`QxM7^rQG8xIt7%rttTtI4vbtsU$r_wBENg65cGmo?MOn+T)@AL;sy(6U zgq9Q9Oz1G7+k`$722U6^VeEwL3G*i`ny_rbx(Pcb)SlRMV#|qbCU%gtc(O89vNB(C zvP^QaV`A+|O(iF7Bq{&jPT4Zc34>uY>yXG56-Xp3kqH$M2q-f$g4ka-`{As@=2 z2A>Qz7jSuiN$>6b@-N~$whZ8Y4DT~IU;Pu-PvbnU<366Fu)Ym!WMiAy%oet?jU_wT z*{*iCrxnh3fs0)15|_EcRjzU5CO5m)?e26Ux`>~cQjkvpMHEv)85LAfLqrqJw9-x| z3F*r~MlzO(%w!=e*+`O;oaHKac}mgwUC>2cjDBZb(N$f8dQT|#igKTwP(I2XsTk$X zQ0+=JiqxcLwW?j6N@!mPI?}ODv`8-E8-8i|C{Xc7UGTEHh#xq16N0@Q+%bsz?A?3i oJ{y;#?1MFEg1)_v(5@P#+R&!(7e4m?`Rfb(219!C#sB~S literal 0 HcmV?d00001 diff --git a/portable/launchers_final_proposed/VS Code.exe b/portable/launchers_final_proposed/VS Code.exe new file mode 100644 index 0000000000000000000000000000000000000000..731f5f524fc6b6e0914d6c701ea19d5e85f9bd1a GIT binary patch literal 193536 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 literal 0 HcmV?d00001 diff --git a/portable/launchers_final_proposed/WinPython Command Prompt.exe b/portable/launchers_final_proposed/WinPython Command Prompt.exe new file mode 100644 index 0000000000000000000000000000000000000000..a1dae68b3e6de3b0df25939c0a263ef5df954880 GIT binary patch literal 148480 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 literal 0 HcmV?d00001 diff --git a/portable/launchers_final_proposed/WinPython Control Panel.exe b/portable/launchers_final_proposed/WinPython Control Panel.exe new file mode 100644 index 0000000000000000000000000000000000000000..cbcd2a9ece19eff69f530cc0c6d758f87b707c6e GIT binary patch literal 150528 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¬6SfZ@QdO?w2-t_9s zI7)cUEKi5#)(jh5tlA(9yJ~<08k~_pg9l2W5T2U=x^@ipW#OeG9b;ftJd`S@SA5YS<)neAL2G4c~<9k86Wq==n-t z*P);9v!`8tb+*wcGT*GZGh4lNKp0ee*tOkge4R`bNyDsJnyt3*0R?rCD5zVlPs*-F z5f}N|ol_qj(p~BB+WIc#hpV4RSu~)U>Di{MOEmXSGI?n8mE^UX6(2`umd_`iRMj4* zu;hg)iTB+b#=()C<_#A&&1tbD$Q!sB&e!8e67_?A3ul7Ab8)1)U)X9=2yb`SDI z$D8rCY-#sMKv3xxq=HXSNmAo8=j-t47yHl@8=?wblv7je)@J-6;t%ZgEeb9<)*?u- z_J%CNklSsnstI0L>#ZLN2A(Tyra)HEYxQC*{g5^V_gS&HlM$b6F2G)X`YP<=+@@97<_#cJ3h@u95CR!|m(K+tNJ6C10DaF$kaP}f|= zaM-%9ZUNPEvOA|U$fQb}hQO z;cnk)AbQF5#Gsdy*LtFJ)SnSiqOXN9b82RxeC>|LLtQB>GPHQ^tPLhvWQxXAw9XBZnY3dna~Nz`G*APC#G`{|niG!(MDE}67WlLa(o zG`7f?`kMRwGyhg|_NETo!n3^pqGMm(P&#h^GsOl7!Q&QV2P-24XCVYbATy8%70OU$ zd%AB=#y&Q3MjPtSSI(V$qysnIProEn2@}g;sP|0EQ#xNCkWA_%NR$JT$je?sS$NYU zf;H=K#&YomPyJ=#ezL-+-iX4$AAfKKR=}y%tN6c~{}1v15&l1_{uhl4SF^Ux%hb>8 zH=m{|(^^_(CY~u&8u)xao8Tq#VPV+17gC#U%1bSYg_5YVrq?BG61S$8k&^WQ9jM_$ z;gO~QW}`_>)(M=#7wV>}d^oO)^mW;n$cK5L6MHEDzRzRc3l?jRZQ2C)I9`z z_;dqLbmA1K_B+(0Br<-Fgjpxv5y3$GIo%gFa75MLu8t64DW|*q;baIiHBey9%C-il z^1{hWd7V~ZU72kSOXt6^Q55bQB_u*(4`|bFI4qKfO&qlu##Y(%PVD^5PSH8>OYLUG3sEv;2j$8a4@` zAm-+=Swc{?awDb09Y%Z-JJ(ZxpH9ODY`#Ez5fQ33Ghl1N6I=<~ts>YZ1fO8@w!6g{ zJ*$7U9e4W{C2@>aJG)!5qQi*YAiyP~hWY@I{qF!M)EZ`1IC*(C;EH}<5?F~nSmimb z1qhy~f1)?$4b=<@X^iAPBn+WpI>hIzl|`mWwPbFV^z5HD zbadIW4F3pQ#JY3@;y#CtfC`ikj@=NDU8cZVQ6XYuaGLu9#m%zSN0vba0#BFGaN^vTJGYD*6zzLhF@!Zzy2( zM64EdGu{TP0~duyMX8*qtAnnzpOOm1d-n4sTWgYaN(|0gY}a?L&)BZ^s;(48szZC* z-!v1e3hU{FEbi(ce@vD2rjRt;MxWr?sxF1#QDu`$OtBd20`W^6c=Edb-s{PWXE9vs z65ErvHsx*Q`fj154$c`jDNG?EN6B08UDby8axPEJ0{}F~>fM zc`K>3UW8vISLyod|B#@o`|H?hfT#dyA0Vx&i z3WJ1K{S7RMf0kEvo(%6|B=0lYlWP>wH^PM)3m+Glc9pH_H&oyhU%0r(u9nmzfM>FC z9A*$wI3Tw;ppmITI5({xCN0QzzF%TsG31Fs%J}Sf+0M&el-%W8nzjUu%66G+zmB-7 z2T*c)Rv7Fa8kEWWW{dQc-Kh>lZjT3!I{%Y~R@Lx9#5wz9n` z&w_v?T^lns*GWw!fzmSgh3c>S@RW@POF>cj@gPG-Ve6NL(sWSxapw;)Sk_3*DZ+u4r2GltEhyy-kRhEQns&hl}P1#}BTgua)ZPu8$6E7H2+0?y!wpqjZ zne2L5D09`@=n^4o9?E7P{ItR8kdK$$_?81?k+#(Q7AZ5z?wQjkA4LedG1YcndVg zDE&aJ&a;0+Iy^g5(<~@I4lT&jXIt3j|e4FMyY=XYWo+g6quKyNIVpo_j-+vW>g$E&# z6@Sy!q98ru9uqT0^wMAauq#H;a29*=;@VA6U`7EP?&u8DI^k=iN3ZKYlo$@^G1S}` z!sbZtN8S=B$-XKRUCFI4?CXcEzl9Rl7DN&=eJ}&>(fc_*k-z@)Kd3yvJCvB}Ddh^8 zH!D$;B+9OqfgUL@Up}?cs__OYzTotx)#d+_Gf?qmY*5(h32^?g@q?(llGBGL%c^D? zx2jj5bBPUEM!Yi1DYaQHTEVZEjkJvxdJM127>>_-Cfq^xjxwf(lwGW3wyhle8Bp|f5itcYnbEq2c;sys`Vn&q=ROYaPEept>N7tipR#T(h} zUp5|RUX~p3_k}7h_bizy%NIp^c43hkP0yvzMd?zWv5S{id6tYB zQ2fA`Qk)p#^j5R{Qi|hGamCv;Vf%%4O#05@O3{Ii{?~v0*Uta?cM)31k=ca>L6)I6 z)Yc+`xzo*Z)>V%MF7JrL2{@&o@r$?7L!u8(zsc-7(U#Eqe1+*#u8|8k`&*X0oG2O1gcXy?`(28-}Z)%8R*jo2Kq+&MpFw# zQny5`=MJet38G*F3cVj8kj{VeS-_w?z`vHK^KaoT-g8xKd@wmRhf*NNyA5Rgag0XB zNU)@9bN;cv-ZbtQqQ93(e;;VnZJY5IvqKdJjHX*z9gzo~(ftO)!UTl_&J}{GK8n~` z)U7}nJP-=_AIu_4=NHo&zH*&DOIqg3Q?keXz$y(o^+bO>4}RPzZnn}bC>b>*7{iS` zlqK{|Jvr7dEz7~%q0CKh`pGq#%4}QH+6$OUs_E@#Af0DJI$t0KfCLO+<@Q$ID4ogx zU7`UEfRiV1ASc=CJS?_nGXFCk>M%>{7&vzgfOCq5)2}xY4Ns>!sL4)6GJgk&b!amJ zb%TKWZ@ohIFl+S8lg>XESSd~v?fVl=YBsN#yR4bMJ^PG8+6CYr2w+-p-%kR0LlceC z1e%CLT`FB=175=(8nia2^LNla0e^EJc;=L&$U6GQUg`GVuV3%~>bt}z+0G)-^n@q) z5fa$#YB!r|>7D9x9uhBtTt4s^l#U~vDq zJfrV7?PoTyAFP9%z#tsStsX>)l9PIz{I$>NsRw=u@sktrW)2Z9AwzWHTG4Gx`M|aa z&9O_8&foh72*~=A-u6c<`0)_xQ-xc|7dpDI_f%o#e6zpzM4?1j&}y~J4{is5lF;V~ z|4XV`O&;lcqREDAzr~w9VkD6J6!X+qrm`MAI-1V^6BSFhSUu_d8UX=x4hvS1ggJSe z(y?5*a3cqy`{-sttbNWAMe>P1qogDsEfj3w`Rnug=>tO?G`i_VIh$$Ie4j6xxhp~5 zg}4?>ocf*WBY2#QcoNa_Ygt#4=K3h)Jm#Fe#`qft}{m*&4)L+sd_lS6x6!T^h~sRaiDaoY0<%2L0}DB{}T=~GvL8k@FQ zOg9$#METczm-EyYi6$ABqxC|2U;TcP{(ej)Sray`W)7Z?#e>b@a@K(_WMM!Xtm{wW zW`ID_bgJ7~>*;*;w2ZJ_XUk%OTmBze@Q%E(45;5Hr%sc(1Rk+auHnhhQ>iU6N*NrML)mvoMsH~-!z^izUe{1Y`Q~V(q3l6KF+Y)(a>ZfVt&%2Zve90`$A485zBot1N90&9CoaMQtAmt`d4j-5<`f>GuqA?dS z!0Z8uTQ_~iav?ADceh)Y=hWxUb$&(=e`|8_OQAhmBBfXuc~1kt*89F1YdJe}S0pPH zEmmW}K;j_RLsGodV%s{dCuQ|$#`71EZEaVzrF!9_Q#V&Tglha_Q!k zM*ZRIqW`Erd|Ireabv7NS{+h$nUfQLbbD~=ZZa6e=3Oe~<*Yuf58CXyjuFsdc<2FX zK01v;F%Ruenm9OG4l>5;vFeeo%rTzFo;|;RnCZ5Gn2>>|+d3Bro3WvDa9W^uo<^2* zp3TQIxo0k$@R*~yBQr8rlml(zU)QUD_ubt%4igiDW$`3L7YivX)dhN)a)woMhM5WX+w%n9?oB+HguMm2>uMKIn(J3>kChYsSI2%_ z+HGw|WeKbtnJTRRY!U|&oTl6y0rP>}2rUSdUBKC3Zb&5fAh6QQjT#+{eLY5!Lv@|h z+sWvy;t5zeh;=mIB(mE~zevS%IaHi}apI)t1WlO|^Z938rAOrA89EphlCVd}y$tWOy02O5qxn+PWrqe+`jy(n(gr|l%} zM=UdS62UCOdx?>#(8$n;H{}e(UQ~Ly^P^q;NI)j`^{a+2f^5xX1O~+ zIwo-_qtwYPYx*=;ZJ`FAiLh~>EJZb7Z6k2U1R3fc=@a*bN_v&G^T&aj7LxIzn)?*n!CQ9BE8wHIK;)Cdi5QnEes?*?hW26 z=YU3MU<^s;KMV|pL;$V6<|6fWuhMZ8?S;jj(DWP9YPvN!_xbK3{pPm;q*usjlH4>ljGlp`RbwpjV!mv0q2x#q8Qqq(O& zqi(13Q#e^EhoUGhWnx)6pEy+0@+PcQn<2sPPBq}@990nC%=5s_j^$+J~AXW2PS#l!Xdi`R1 z)g2|`Q*uU&v|Fy4Z`SJP_}lWnhs*t9!_)c8#6Y#$tv%e2MG^=@r4+`*6^sv@Wabqv zQiivKm<{pQ=D&*yE=ahLLf~MWSXFEX>HKuQBZC@`z&ZU_(t>=3Gvc#&U0T$57klPm zPM5T<7c;4J3%4PpI~y5T>2Cev>|DwVeSjw9R=Z9eiHBbTJ$2qxp{QK}tJ&65_fIZv z50|^A0WNj|%5bQ3r$z$x9`d71_)ydl}(;D+8`rzdm&)Ct@t-pt9y zArIv3g+kyi`D*rXu2OKo#2l)Vi2t>c(%@t*Q$L-5i3}#;PG5=NF~8h?`HYvo<4JO_ z(H1h~ej@v6+f(rNzC}iu%wbm8^|(IS9vl0gB5;!vt~Gg3*hkIzl2y@x`cPgP9hTWk z+&EF%cF9Uky=ob15%q-_{6~3&Gb`{m=>z_G>Gs-e#t})*^hT0XJy3XAD0xKzPk$)M znc!=MIof=y*N>+5Komi%{wYjzEQ9*DvbtXzy+u3%7ov%l%LPKd_~%*Ce07?)4`a`= zGlQf`jSX-aN-8^`Z-&tzQaSOwRUt5z49JB}+Leoqvz;^j_PID#`;vV1D&xsu|CS6a z&jWc+Q3{3B=I=@OPoxsj53~!}^6b2bq|A@txevv@K0eli8h{DBL)-dzbB3ymhf#B& zD)Y5@h1oUvx?^S&2Xg7V`x1sH$Fh6O(h4oYuJzETP-%y>o1D(#>G{%lK%^hVi2J2XnA3JvifC(n zwbUHMG5ZM7k3s~jBuWu_>HIGr7lga-2e@f*eTgj`y?MqY^AwAU)yFvdv;k9E$K5*`IuJB^*vw-n2pcoE9edjLe21!@L?s~bk zFh|wKd4^0zuTC@eqlq#tTUD`+{N1V+6ObtHhF=!ZR%J<`ynN??Q{OHV`oxybt2tiP zD?_ckJFtGiLzmIw6!#WlGw(XGVEW?)8x>nQfVUK0i!m7_zZaDBi=rV>e&)(&E3cBY z89!qJ4~GicdEdgTN8Z^wuf)!qXXizDIMf))i=Sc2OW&B2`GIH1Mt}OF9EZAuxt8`C zw?s#B+d6pPR zhAi<6o!$~^YK`t-1)HOrG3oVslbJ0bOMaJtew?_VA}cnGx)MIe9Z|{|`#YbEXNMHG z*!u&=k=5ZrT2_NKxK@MUsw?e4Vy__I#sS(xZ>;-q>gU?^xef{IQvC|CDTd38V`_iB zuCNVKMpw{MOJ+v)zXq%8GjOv0Z8(iK9D5uIJ?E@|QwDH?6JS~AlnV=J=UVfq7&!Fw zalMpeuI+L9Gia+7Tr6y-g(QnB)MGF!u#E_6zl5BayK_UhE zYy9!Yspe2;qG!Xm3AolK46Q~A)PrO)8jKZLPhjEX-rsRi=pMk^s+I^|wOZIaUJ(O| zG4o$Q<*)u9EX$)tDqng>xIa<(j;7X)Fd5d>nR=e6Y=vsosQ#C^O6UWJoP4QPX^m|C zvQQoDe=*hH`(LV5NB>Km+S>P$sFxvc=znhp2kJMxg92X$1)v%fyeh6pe*A;X9!$G; zbY?l33>x9p%V#p~Bjh`(OhU5^(De=V$8SofzpFDU@+Kj}q9-w--w+W6^$eBU4q|S# zYCOdfkJssniazOrum`B^&uz5ha;&3o`d^sNrr;~b|R#?2!?-@_8lMX^c8 z7MBv}m8!M!ZlRQ1JE7K7gwOA-Z)eEsgc4N++zxpqC3M}G7YEt*D2K=B2YgGdmvavd zx?=1ED{mYnDN(B%+mYhtza7c|BNSgKjMF+KmgFpYXC8V(n9S*$qwq}41^ZZ_`V#5e zYy0MH!<8&U7_D}f3WN?Vk7NkZWvSb&yx;O&cmH!f)BS}5x_=J?;XZdMVY^4A`+F!y ze>(V&J3 z<^!r1_oFntfm8edpfb3B}%S;$Tm8_G%xt&S2%8BIWHnKBynh%j3OQ3+wek=y;*OPd`q)&?x~#PYg&j6s%N$Q6fh*)B@Ts=vF0+i?$~F5pks;drpUlpqEEgru|yB^ z`RG`pKA1E5VZK1wKA76GcXEfR!P*6d=4agj&vdOQ%Pn*%hNc5a(FB zJDuMJ7$Mugr1Dfd<7m@Anupr1xuYHLo)`ab3@vL{kPU;1A<^P=GiO}lJ>wT0Oa?xP z_Y7Y;Xl))-AM11}VDUm|+OWlxt%r>s0B3q19J-$Q-G$FZUC*?0dhd6i{%+4j zn5__;O)$M-2=L^T{pO)h*hXG7HDvs+{aYCGG2hoY48B@6DmKR~zosBIt-q{XkVsh_;-ppy$`jM!j9cZ_ z@ZE=Y$KT2|9%^A@_@U+%(}8$df$YFqujz}l&}{gTt%B4~W#0gI34S%MEyLqvy&Oo+ z8lr}yK!;_=AT~0czYR&kho3HzRnOCjj6aAT)%)L;3 zDKmU*cS1&R`_cWeBh{ocx*uWP56h0o(EUiDnVU835-bpv2}pC;>N1}g^TJdiJiqXw zDhbb&?T`|E(c{&FE@eTn$alv^s=w1&dpG#*zljOh z`8dee=XfqgpOdRRQDo)E(VC-IqBvD8XsfI`XEG|Df5o!Pl_ho`7hi%cuc%k{u3Qoj zsa#a8{e&s291-k7(A@9K{)gpC{UL1Kq}UkV-`N8)C86&JxJhx)DkMvHSyiaGEle;G zKL*)y#1&%iC24B^SES+#{9ijv;zWf>oe>uEV6)!NoR}rsnRqETdcv-D+1RXTiM_!M zomIB23BQ)(piwwgMl)G5BRQfgVjVIQb8zZ$E_2RY;4@Bfx$Qvr-5Ifng#Iv;esOBq z#3D95i+7Udh-+1ZwZh6AiaS_hQsbH^D(9lu?qpNBV@4wTypZcfiE2Pe2I@az&!DFx z*SQ=W0ht5V`K3+T4i&!vS{Pf(WsmI*(OgD^tYPXc`OTGdTO_#z57y_g1G0I(UAFAm z7=5(xacMGs^ffqobCd(3nf)Bq^O`oLd-a}ve_Ma-EoP3~*LAqG8?TwZ2;xn)cKu}+ zoE%u-tG_|z0?`sA zF^YSC>`R0MX|G;vBdvoGM2e5h;AcFU_^|bI#M-3RWj=1u7`@CBOxAhA)>2}bwi``9 zk<9XoV#NXLuSqjonKV%fW6Du$bYq6l#1!_reK0F9Ki!+UEnIw2U(m(9LQPyxxRl@T zF=i&eaiM9w!hu`WUJP6)^fadCRt;&Zx{>Gec4UH@OWNApnZ@Fxw_P--;U{wyPcM}& z(v_siQDNu3o)o`SK(~6gsVQ*#-d_FFH*h&7e_JR#jmXCm(OE6`XJ;em<(7^nA9`R! zZhHCH+~D*ua32Nuv5nJKW_{zE6UQ$d!tE!`TqfVT$SXeQEqWy~Nt+)xJC)6PXM|H?MA_*GWn<7S#g zvFxdCY}92>OMGGpiM5f@AMj`npZ-2PpdB^#YVC<*Pb2U`=a+JZyDpbloigrn65$#w zEQvoZM(vl})sebb8E0z2KKeKX?1h>dd7MvN=L7qBTn2CooBk}cr(rNVo0FmQCoeA1(vEggt_q1NadI+oQp;acAz zqpB}IH#U4_z=`|FH}TxqAg+kZijHJltSOvZYOEd=^m}b-+F!Qpk*G)3-!J5Luq0QD zh#7Zrg8A07BkU>V{jx_K zHsBcoSb)BQSEYVgyF&~uE;l)!eA$;t3hBy$r!T)J1s^S3A++7FNl3i^z>^r=oma7L zdTs9kX9KWpP#KO=)kcZ>JI*2N=)?V2D+*m%pHO94H(`7OEGNhj>SLI-v22U=7 z4cP0V_hT>F+x0X<=>3G8lK%RoFSV*0#stu6C`d*n6trQr9qBB?wy*NN+ZU4Ga?IHB z1O1POITOl`?kX(2)e?JQp=)UWC8iWkvb?KsM~i&8Lv)#Wc1(ID8)eC=vo9T&%f|hF-u?Ea<8s-!znb@IelCeDImXn*^*tf^3Dz|$9V?uvvrs43 zO6;Xd#rSg{_jYCWR8QI?tBS!mq}ii;=^iD6w(_36*zV``($Db!H(kT?yCyYOy5*2= z&6aMZKvbq%^}A)EatEd0Y`E3)~0ZTI{6xi}rj?^6XFHjkh2GQLnYDh+6rpjNw1_gbOshQqQRjYc-G9I}Eq*iaXj1!y$NEh^Gw zR@C#-{0e8fnbs>dFZz@l-O%A@7hcKguJxsSL1WDnr?I9zHMC;;;@r)_+*)o-3skf( z>5~0|m08@~_cv>5wnU)FE!!o8BW#C56luNCOg7bm2hnqcwZ*VoDdWfWO3T#Z%#3M$ zUrW+78mX7ckEsH6Qv8@&O|=Z-=!y?g(RS)2AC^9JXE~!o>%#>F z-j!kZ9jW~8Eba`Dci+lY?mMW?kBx0vv8teeq>K!6!Hj?CjJ2hvmhRR_O3rW+2=f?$ z@Vd!$S+a$tk|n34y+Mbl?5*t7R)1hYBE6Be44FA`y6cVqjOf1i9%eS(rJS zUCD1FXm(}m;F@2_xf!{4Gqc_5U&-MXZJe~L9{?C{%HI&^h}06ffJw8kK!rbBUq!qY z3S3vjnAHfakcfxXXvB*N+A2%dP9nCvS)$O%2v1f9ZQZb8I2KblT#E{n8^DLa<=ngvTS){uhGmV z0ZaL?#H+fc(qM9&AD4O$^ z8CaW`L=jS#7Gwna$+yF^u&}cd%X{J4@xj7y&n&yH@XY8p%C6S;n*?C3!z*?!9Z|e7 zd6zReqNqN6Q9-urOSAZu*gs@b7S|&CbJI>{IK~?1s)?LdMZ^ z%HIRu^;W)e=0@rPR8&W^aY!lD9YqoS9T zUE_?FBRaA~dIT$)mljrXyGx+qGm)H&PYSHe3A$e7)|c}Og7Wi1y3CUO!gtF~j-e*C z;GX$1T>NS5ci@l?HhiSVdUpJy?C9wDM|sga4xls4u|H*#K!!OsDG7!-_8v(v%(1tS z2p8|m%&eKbGFQ*%%;dyk?S^ z*|SdHEGIP3;_Q3)j-!*vO0E(`AQMuK-cJ+y2&z5=*SSRVo`%B{pv0xVWW!%7(3E-x zFU<|Ce-fGw7{A!K$Q?g?PVAedyHmvthaY(rvhg(>{`EeGW69`-!+(_LI}L|rtwjH3 zs|_(%{4LHooN?*hvSA`?)N@s`p#bj&KRO2^l1pQZ|JqoZ&NMq_V6$s8%{DJ8rPeSbPXNr_5sJ*5G*f=j>(*Q;N^m8 zv2HVY!8GoK$l~?F*gJA9Oqp5yi9GR#ZO$@x9iazkJ3(@A4(ppn@#5?hN)q32bf$@; z_dza$$?Vgft6@+>!=SR)X=l zubh9t&ED_Y)pKTtNDsL3n)96;`gl#k9ogC#p@zQOD}`n3of{yR^^-tJ$V#i$8(2T= zgb2rN;6sQ@PaEqZsR-|_e_$h z_m1Sg@teW0;LyFE0%{j;bnthiC8!dA^2_PYJ@kThe@14kxUb^5y%iHu@e!G*@(IgG zM>(WA;Z_?$^!boAC}RCRQp~S9?GyUD02idbLuH5h8(aPuv@B>>pnhWZq^QBcmuy@e z87KD65d4RL(A1Dj!aPKb)$4Uvg~~6CUd}IN>{F-GEMvm`mYBFtUl|p$g8K;L%ibra z$jUF+7yGa`D0Gh?*w3jHhRX@Bce&9_uACZX@{zLqYTm!;=Hr(tjfPfgb zKE>rewd{h6dVRpjOS9DL+-PGjt>|=|rd-jVCEnae_X=spmLi-&$%qrjJy*nZ%Ma^~ z-ff<~%fI4IYHd|d*yzktQNUQAwmHs`#`y3B@2Qj2Jb{i^-_{$g53Nt-zr-X+ySB@_ zUiYu}vVOUUY~Io5fmovMO(<)cr-?m)A7t5o_Q7`>y}{ zuj~IO*Uq!=bzaY2$7eljt=--+2JTS7WQ|+FxOw3yfZh~!0HZ0%KW6T#xw^5~JX)M{ zT&+fgb~TN~$yi!wjuAtg^+$LZy$4_Wdh0yo0Yw5szCAuSw)mjOinHeJSDeE|n!C|3 zsJ%&lMGk^0p6y*X<7?`TM38FQ68%fJBYV~w_(WH+x9cd@5kPGnKQ!feRbCthQm&Zm zb>igKyKxx`&u{XktC33{&N+RC6<1A%p$0Cz3a<@-RnDiqaL_XOgmoB4Y1s{`?_1uM zM;zzit3eMIBgv(CxLC3S3Df6?+)bOnv=fjyPV3ind)f(nv*v4ePfB(;Qc`wJN=_K0A z@Dgi1x&f32Eb(BkU(3?e-~cnp8VN0oR#$VL0)q9pU6b!l* ziD>*b>N2itnToKWL(XlUZD$bY*jB`O?3m|7ejLPqfxAy+hkQ3!uWjRqB+h>sTC0IM z`+a>2_WLi~3NdLYn7S2W*ibNOD+I&XUlPhl#D`%R-as)tW4p&ds|wlN?I546>+l+I z+B@w~4EU{3L0uG*=rv8uWdbM9_%p12+O2hI*n4m)a&Toq+6HtnjU&93JPu{uW#n2L z6~-0U2J9i%j(Iwe0}LZQ9ofN)tnKfrXsrXFl9Kx8SoN^u4-*-P8nI8}I)t><;ZidU zPg`@+2w-YYqgL3HKB|*>ea9WV+~){JY&^QX@OBtjp`rQ5mjd5IHtts zSn|9H?_#=BoR5a@R?M{u#Q|CaB#aYJKsAcvI zWjuN(Q|KGvHFqNWEts2PoZ@Xe*$dwh?GGks16nDdYxeBRUfXMpXJ0-R`@C3QWv3SS zJkI}XiZ7USh%d0gfOk0R>m4D+(04hWJ-<9}`xwVwl`laiHb6xj;rm5sTE}Ak?>U%_ z2^_RhaY!3vEC=(Oy0F0R*yTBxztVgOebYb)QGF@cigK0$6w1g2BdK|hLmRx@uF@C% zPblLln94ZY31Jq*dIwQR;{ClDfh%|g591oi_vGL(W#rwBbf6}pwMm+X(!!3vFA7Gl z-L6a;hjww@HgG1vSe>g}sWvGru|tXUN{Q6%uCA{G4xo%5K>Ph`w8^O7sn&b=e%6Z! z@h@@ONgO#z>+%L#=_EJ>s}Gt^Gc-zv$<6emmuYLg#mlWdrzYLk`P1hR&-cx_UrP4Z!K zVt@)~jy7?@}TnTt1}@chC?G0|mNdT6KgE-0&KwT|KP4PDzHz@pDy% z)@hS;n0%^D?$Rb@Fd3?S)o7D)n4GUoZl;NfEz)nOE(od=Er~do3?Ju+cPmQ|euKS3 zzu-n8W72VMm&ZXNeJz#`tmb=LuyY0d(kIf@MfxLtPf7wL0(8h6wmARB-T>j7uUjh- zw6|qSK3+L5Z1E?VZvfX@HOj*5fJ-a~-l|a^%0|n~)7BJ1({uq^4?rOR?_RzK^t;-m zu!Qd|W;x6e`1v}34H{8?0J{#NH>@vFo`Lc(N(cH}BQDP{s!l@F+z4o8>EIvXd!~Nh z#P?MF&P5Q*q29yQ3;ewe)#DS~!}l6v!Nt1}464tL$spd_t!fNs*?0n=Zm@NB%?w}q z6ZoW@_sr&bo9C2!oBcIdysbwa|6K~I*65vHsAzl4j|f7BsYyR`1dJY;jKL5-_ct zh;r5Ky>O3rXuEH^7lR2@+$C2)Bf;<%v|-JD3w-it;1=?3>yzooO%75*7NGyE+num? zFIuy6t!v&SCzbwezuk^^-hsQo_H;CJoMZSVK~V@|DU58^eoG}(%~Lsd;mAXY=h1)c z()xK96k|ON`SI|E zcw6H1j(*V^4n;Yy3I3YkuL=IPRLSL8?%7I@x;upJM&`;+#K?v_li? z%ka;h2lN=*B5l+ zt_cR-oR_T*ZKl>S0NXTVFxFr7JM(V+md;!Lg5jIvZ<>+c!SYMeN6=@)$%ozC-mWxd z&S9R?thOT1 z6)v7Ow#%oD?JuQqbP4@lnv_tKM^!@UBt;idjLCEn6*DQL7!0X0YF!O3s76dR`Kmjy z-l5>6WeXc1y_R7ny@4oJw^MjD7?s~YQlC)w8?4!`$5zZu_~e`>XTt|t3~hOU3%Y11 zu-!>bTOifqI-@o1d3XX}I0w)(DCokX4o&2jaC^=3y#;S$qa)@W*La)9Fj(rBGo&C} zn?Ip_4}1q(9o_-+NA+d3+3!Q=_k#6(I1BF9Q)`KgV`Dwn2-m-;mKselFTPKi38923 z2R=?Q*PU7a0@oWdjwB**tR7(-YY|R69lZ|&*tOVXiZgTGG**2JrHIJ}OSW~f11l-m zVXS(KJX7aE9_xM{-c|k!4(cl?yM6`R67$Jp>(#agh(_!aAz!Xij6?h5pBBoP1;i5} z$G4Pif+G+3*OKus2<5C_fOlxnhHIm@FmR=OrCFPvt0w3$z`YJSJhs)y;P4rWe;l9h z#%Yl%WkIN)ZMOm2y*^+e_Vv>vKJd)&X_A+tfPfhvV!2B<{J5C$b>;RP<+jy#CH9=| zg7wobWKZv4&DpmW8=5=xe*7u-Kd4w5%tbgqhr{3&ygY~(aCR#_sa?WqFYT!*_dlx~ z>(5xq`F9y-VdX46VevS|TYB7!%8CV|dN5+^MF7dmE+lT64zv_xEB#xyNysYt`IbM&^~`4Z$}gQ}oCkNM1E zfNU$luhw}EhyGsbbKS{c5_K?hbTCsH%#8>J*$1Ps4Q_LZ_0 z`6jp*6Z^DHGK|NLEWw-F){A^q;@!Gb_sGmniuq5ybCRx9~u*WB%R4o}3+btKM zDQ-z>yO6yFhLK6-zY+iKItD?X?}MK-oH8rJ)JDfdYQ z{~(ZZbH0{hnJO=Ogls(i4ptAT!R(=rTN? zLD_M!GU>8|HZGJgf*DxdiWLp=1xE+Mo@?mC9syLl=B13;<(Sh-$~K?(&EV&N?1pR) zWw;R#^g+2Cfhotk{txjF$9EPS#D1K>_7k|P^8{{77x&3LHpWoA!#XNX62O=6{{!2^ z;=wqb-pD*OYHR?Osi-kvoPhBl7O)u5uDSdO2&mwooQD*aNziW(ojfSyo!+AcDuV`p zi4rR3U%tw3`|1nO4Z8yUXU{3_WTEZ7Iv2(!a$1&`Z!aXkH>V~qi?L}Txz zKVrP~7=-Z2INDuh0Ga_U;IzG{3z{)-z`|cT%E zkSIsGw7jA~RWckT`=?uJJJHCxcsd2|nQ~fRVtr<}D;*7^a&RSLJOiPnx2-d=D4~#y zIIf^#1Q$=UIW-&P4U{J%`K{?e3`CP&I|U!jxKvvwg-K7*xp@!#W|Eb%)OR^tMJmp> z?nkU83X&=Rv*3KNhSrDpAkezv zPKmaEk2P(II8U!{tz5*>4-a~_jFBr5qC(aGGU?M1HK?VF2t&!+8s}wFvQ6n;U$^sa2{^X zFZ{rI4Y4#WPsfd+PNT384QlirakX|LlPBn6;sdJhHU;0!H_Sue=TV9A5~)a3>Awteptab5e6 z#jjbrK!<52xgqx)ec(B^!0_K&X=VnKpe9hf+gsVLRz#bVE`lR#JH7|V`&WxJ9-XktNL_2a|>rFhla($z5V{>&1aWcm5%-t z_g|>(liamutjb3)IP1e$H3~1T{1N{CC=|vj3Vf=Yhj&p31Z^$7?)&W1WE(W?RxVAY z(y;#$jP3$R2say2ALj+DLS>{K-vFU_+tGoHd4y5;M{o|^%h=qzx;bGh3=mgs?4};G zt?R#FV{FDDDl@Y3t@a^m3F;=LXXP=Al5vw`+&!b*1z+4f!YoR~j+NC1FcEs1OMV#t zs1_c>2B&o%1>|U9^HJV#A1h8MD(G&w-j!b$=gUVh!GO8btrDRF5Wm>0igtyHgbc*= zrdlt*&3U@9nsRTe7uL%m_tEMGUE^2`nsZn8=i=R2XIwn@Zci6)ZMW-N(lm+(F?t+> zJvaJnnAJ%W{srzN>$`fR_9BP?4>L%$`4v$%BZlWc`H^@rF;MUS4cLh zL;`MyLwQk)kQm2k`3Y3ROVOO5=U5-yv_{RJ?I-7W;|jhqAm3wfRq3E=8Zr%2)K+tUS=-=4Z3ANn7p; z;eg^Z#R(@_=`roCj+}qPyE1kcs!zTy=SoiNW-l zqJrZ~oW@{efzvN+`3z;;Ig`c4YfL*>lmPqC;`eciEcb(AM0+tdNg9JaEM!nROg(o^ z;<;;5px+m#M7|$m4BAjBs7M{&oL6yC&zgAm8k|wxsy2Fj zsJ5!UsFJ=}`yHVZTvG74Z!orpmgKy=9_d98sr}t+68lG`nEPBYrBI%iY0tTKZjbve z!TsX!Yz%fWzhC439cXb?ulE)lT|B5L;a!aV8#9m(RAv=umJam8;Ki^62bVwy6SnLv zmWuzM7v-G6a@1n<8E~LK#Yb3`SlznfJsxX^OU~I!_%1HS_2x*_*CYr>qjC^$6vAaY|dmqs82iB7Q@?DB!a06b})jnCh#Kfmo1ff#|;l+!P} zct$m^;AI)-g^jArn^FfbzF?g|`B7z`(jL|`?o1kjvV=WtrGR=MZ_hKdT(yu@0cWwl zU4p7OlJyb)Ucseu{=Y-51f4R~O8WeQm*}DjV8#e>96JWJuIqcN1nur?^qS;Z(?1B+ zv;+FB)tiGk;Jy-w56zQBm=ya5tVLzOj)rZR3}&nP@LA9qWrlmetT>+Eh29R+kdQyY zv*sM06Vbuv$wIic!1M*6bE3nt-+gn zZ5+0hyb~OZg5CBs`xLzF2^_)>Xe;5>_g2kFbovLQmKCl|E`%W9Ew=C z>?lLtTZ3KJ1Gg#NCp3%UU)0>0cVx9({pj^PFZ?}>olh0zoI;C?6dSi3z?F}oqedMT z;ZF2h(rB)_uXqP?hXF|^FPV!AmXpK>XOScXZz4$yP9aGOdPsT&$C307UPF=`97WP6 zm`#!r9757JcmYXj@LZC#U@A$!U=oRe4fgJ>1~Ol5_}Z$CH(S}6j|Ml4XFG6XhQC)~ z%d8{80fo?t-?lX!?uv3C`EGL?-^T$WZ8_WAxc}(>mtk(MyKjw3`%9ri2>E0jgOBTa zQU%?3GM+HL>$d_E2ot(~BoMdhA!A+l3sgx<3VsKsCwtMVSFn!nz4_idSjqQfz9$E7 z;d>vx_fdQ~iL3OO^BZX1m+yUpqxr6Kof^E1?`bqo3tq_gethp2H2BVcZyCV^J*`BD0;<1=9&^mYUl&7qyrC>hR>>f@$iX;4|9V z1#9EkcC)Q02ek{c>A;EfC0ji?doU(3mMj}@uKR9#6!%WW1*?#jQ}MyuND@>wPbCIR ziIRdvB)x*;NqPqhNRoqBk@N}XlB5JLCFvU+Op+SRBuNYQC+Qa?i%zL*zEW)j_aSq< zV~#?ctBk>`kaB$ezqeK!i|~}oQ{Ng@Li`uNy$dJuwW0>SrUx*>2*?n?6x0jNm+fd< z?`=aHgJ(USALDr#&u{Vk3C~~fJdLLfPdlEM@w|cO9Xuc4xqchEY&^5^+=1sVJon-G zKAwm1{1MM)JlpWRgy(HMAK^KI=M0{^w_{R@XDy!Z;n{%a7kGY$=g)Ya#PbZEZFu(J z>A>?Qo_FzlhzDc-F7iXwXHKTA&%*j1wjX&b)s`S`a(tSp_pJWdcavFI z&k#qz5Eqs{z`4%937OLiHIyiuwZ0 zzvOC|omFq+sw;(OEEPOhm^yu7-Hp5cN``%%?ncAEOD)baU~1KT=z+s(z3~dV&*v_r zA<&1x-Kk&z1kT_tI`Jx)Wz)iGUG*oP^{D1?%m+1(sS!1g)i9?tq9mDG z9n+^X$tcApO0kJj+)|ZpFZj*bP9{P%MsqOu!>I6oZ;eAZ!HwvFqxxP{*m}sVas0E| zFaz-luXr8(C&aiatCbvwK^a1IVN?mDEii&;1P1vSDZ*eA41n?|g?ohVnF73T)aFiW z309dN^>1aQ1X105Kmu^*P!4lq(@T?i|LH+Pfd}GVAt7!7pkIjXu!DM0r=^qD(N^f1dT= zli}8B_zy9X!We2raD^ghpcbEFHAWmH!$Gi;(^qhPeIAQ4II$)j426S4+`5d}KYocE`l3+qh*%|PvOz{dl7nL6J zs+{AP4VOSSsFO1;vrhaM+VYl%RQXn)#0j-qv;^PDLm_58gk}}y61V}CBX?dR z<;EedCD`ExdTvR}x8hse&tapo2N%k>jDOB!Oxgp~GTDj2qA}_DoHl=7+?4F=rRE1a zc;++KX`=SO+vjf=t7FlydI8Oaado3Zq37NQ_gWGMySHF^?)V8ZnX_%*32cF)=ndO5 z5-`ho@Xbv(L&U|oHM)p%mnF3V0Ob(nLg^Q~*12-mI`z6Wk2e7MWT zDf{~DxOrS$gaIULyFI!-Gp{19RqI&@Cx!jms~8{z2XkuG+ggHPgZ&||=v}q2wp|*e4J;bp}mD5c${o?!j89&X*Nr z%z=ce5hIxAk(3*m6f6Q^TB~+39Bc{Aq)$6RIOi-p&s%wR z&?@{KdV4SBA+XLH3eB#P1gp5Y@L;j|QE~Ia$BWwj1!i8=I@w%xsB>4GW3uV#&W4|- zLK!cBS!@iD;^xBNTN{5%CZaFGM9b4W=f`gIK=YiRL9}AtnCdoP0Lxs>GarR;$q2lM z?g7yk;RG-8qq*?#TEqPun;|SZcswX%7-FeI8PtIVs6V5SJh%C3iMeh!Q&D6dozjx{ zg(rV@-u1q|JUsy8pEF5!f5uVNcac-a6m!*Kx-2#eA1}_?JsvaX?&~KSe}8sNI^>@2 z(C$L>b5G94C6%w26m%F5EXAk~3mDi}^lEWV`!s}&Mh@3tKM!HR__dz6>v8Ht!5epf zT)6tvdopNMf^V6Ch3q%2C$aeoS*FjHr29vOLeRYGWYpUC#5J?OxSoEwSb}zY&U47` zZY-ia=cYQ;%-!xlC{cZ49B~+Gg<`1(ec~;sF_>V5j8$(UGj94c7e0>LkGu)TyEvzV z9GU7%Id4uj{{Cb>^MqYeJRY=QoAJO0U?rAc5!uU(q8=tTdd_= zR>bLe#;R9Tv?WimJ{2>+@Zm&ajZnr1Sz zns6ax?pI~$?}P=q%ERW&N4pX+sb;x`xHK0BpFmTi5ZffyCSDubHrZVFzAi>Dftlmi zcuoH%rb_@;@(|j)$^b{Aw$Au*I?m%-oh3%1Dodk3fTe2=}>}TzlP8Isn=MpA3U% z%)QK{_4+3>SqawuceSTL|R_e`4WvY2SH zC1sKx$uN5uT4Ee?hZ@6hbynJYjys}wz{7$y56-;(O+0uOW%ZkRU5(%@dN1z)OlnygQ`eOk=L`6l9^h!J?BX z{?w<_U{~D?X;~}SgFyp!Y_+V*I?)T!7qm4%C4>`Fwtg6+aR$$puGE{;#2cb`LZXQ4?RXY5>X28 zK$%vfY3>|WnhluYK#a(d5m~OMI#~V2S+&K`i>`c&hf!r(zxo{-eGojE z)L1ZR_)(0R?oe^7ZIU>ZpQ7p<4Wc4>!IA6f|D2E`nF+WnXBWtKC>R5pS*cAy{e`%|5%ruIfsn$60a= zEKlVvt~>t8!i6?2drHfd)s?~#{5JrP7j3BN28pM(Kjf; z^oPnc6{DA#-ILAYlhC_+TNNT>6{QL4oS&6^Ir9?kt&KD8zZ?-yZOOV8sp%+Ym-jCt zz>OEC|20godKpi(S3_gOI+TJz%u^-Z)lka11}#dn|20)(E>sPQwGGy~X@UK~&@NbG zmp|O$_*Wy)iU@;GgfdQC!+xiui!zQv6T2mGSp#K!uUVh{cPNCe#$lEvcl{W)$jJ+z zkQJ$9#mW5TSe!)KeOGdmnm(ZcfMiN9zk9W~g@R$S+gL=!H5n2>Usc zt#`3z-@USOz;n<@U^frd&E|yW322+C$isOt_d};y7sH)Q=EkF8y1XE5J*sEprPv1z z72Z`JGo6wBxT$;4F>Et7d)o5@ovz?H)$&oj{ztShr|d9?nNkvq`IJUr1A=ho`glVV78FBgIFFr|@}wXsa=9=+RDl&Fi4XX>T7nqE9|CRw3iaE!I%c zr2G=^p8Qe%WDyw+@<5-22+f!yXsn$Se{6rrg{?)$_ZJ0P6L6%e?$$7<&tw9zn82^^ z=ZyY#%t=Q%W6+^POuAR)> za#lv9fv=6-kpZoW|5+x@H?dLq8g|jl-cOjl0KWz7x?NTxTmf>;k5Ai+x*C@pm z>&9O&(*t2*eY67iCxAsOP!^ykjV1I$MJrFxV99 zuR8DlJnPuQ;h;@BXj~hOa6iB{YZWecSSp3Nn?#4oX)T4ERu%VRvx)tJv6(|_Owb2# zQj1-^cumE1c@VUvASetsgK_@1&sG;u{UKn9KJUpjbGogWjElQhezFFc;4W4;OZo&$ zym}=m+gthbjj$;k{Xwz$XZB)PR`N6#qKI;JDH-cZ>9Vdg2~7p&$-zFjE7DkZfPH%9 zU)kHNK1MfhK>NiSs@!zL%^A3P3T`~+U)iiiuR);}CPOx{`gbs=252*!Q5*OHYV_d# z$rWC7u((+ed!A0`=^lI`oFFM<0?X6m8-`;Z4AE}YK;K|bemS}<_gdq+?_Uu%iFL19dafE%J!AG!tcPe3U*MGw(Y8|Q= zOHxjyWX5%Bjs@OrWjCw=~5NAzB>i5Y~-_7jyrGVhl5pgeY6%4PiwqFhtfnb6HqEQ940u1jqMi}kuxo?41o zrM8CA0T-jz!&ZrKuG5QAdVvMg7rWm>U9V?dUy8=5T<-zFCtyy*jNde>aEexTKy4sl>%{S-YQ zKIvdap07SMJI6fhh&JzSJmtyC3nrm?W@Y4fLGfB-?a)-EQsZi*P1^Dc?ozXq;EfpL zU=pMUJl9#j=U!Ft`-JuBG4*D3y@4;%Zv7o&uhp%~lHfLo(Z&=m0bp;=3kcC0sDySm zW<_T(=B5OK*};&AYX#sj#tNL%As0>#IFOKwt$%F@C**s}!qcUE?MsciQZef4ZT$%$ z1`kG!=M{I$x8uA<;VF;#PndM$-WczN$8cr@Pc=*R?rufv9O{~i zmY}+D%=BLV8l1LhpqGI{)KVzkAM+)6n)?B`jUR5q{J#rFhdA78+p;>x;#eW~rug8+ zMBQUMi4ub8L?^~}8>_oeWZjz*(OI`{Md$CxX*XYg^*#66{W-6@hwcjwFI+nz(QTgV zUi+B#$NcCc;7_d-VFZ^)*}(j(SkPvxn(1PLL6IHGJ_<}(wXp&k41sZt9Fc%! z=#;9B?EQE;p}_O%Rn=bO9%$#B9(3@2Wn)zvGje~e-bdyB4AfY)TKnlZYJ7CG+PLM@ zYGc$+9T zcc>_#4KXijhmT=9>Em8@0GNV}gfdaaxhkw+T3=A8cdz=1isJbrZevy|^vklLZIs;x zizx^llej_C;SMzILPcl2eZ-jcJRWFUWp^Gi$_5Qp=4EL?mDX7>Q*PR6cU+m3(fvPw zUqCpymD*j}g_?eb{B*DgMS&mDMP$Aehwz;e{Yvh7eN zj?yQFhm1_+VRn*J(XtLC5y`j>(Wei)NM|GWDo~hrBS~K%z&&{1hj%{j;rSS5!#cJ9 z+!Hzhw%se@4sOyj?!J#HE&CA3M*`EYo(+t!@bM1}(*9>}hkYl^pp=%qSHefeX1#>x zUDz>GZFpcG$rQd&g$jCh#w;S1M<-0QPNd-|^m|t$Ptb+H95l^xOwQ zcf7af(MTD-2W@4OxnXVfV3*-7=J!Lp8>r*C^6=ELeG zVQX~EU+g?uwg++U+wor4ABIg(iR}7A?ya;9&f2&0z^wN`Us3O`&iZ)gfwB*G9+>?R zm^|oa6~gT8FzbZ7w9NtdIWTM3-$~z}m89_dvj#m(e7bB09W^#<+wuXH`Kr|b17mJ49*y9_U-d|~-qf)~})q09&9>sS&>bt3iQqhhjU6K2wz zd$}l%fzKHp_l$vnr)5F{Xf|Y&Q{W%7Ll4JkPoqTPkl3=JDCf;dzl1LimW&^6$AX6z zQD{8_Gi|l9JNe}j>^N?|gzh-^gwQkUPB{)PT;4$Wehk7-l$h=25f7GEv0B6R{Im%O zA(U}7{F?hQRQq-)BM#99PW1B6h3&AY@Q17LIYLHq9|HH);NPugL@_CUSe!c1K|nda z9l1F00zU>k3{)S(T?5qh^$4)DsEHx544*erHmB6JZR!s`5bZYGS;MJR<# z<14xdeXJM3MNBUHS$}%K9;Ir9gS!!qj@KTE?cFOwNn7V2!@32Y0#1ij7xoL$ItY5GSa}kvIUA4y)C|Tb0%1K(ue+b)DLR{B$dZ?af}y z74*>-5bL_o&-eFQ_*b^SxY^ZVW%Wjel<4nL$XQU3dm|;!p%Nn$kCJ1ShUIfn^BU^? z9SOWY*gScxE!j5!GV5iAVvaQp0S4Yb9=t^zLE&0;605uv}rdU@gtJA@;u4B97 zaB2vQQyL8|JlhLhc>hafG=TQ0jcHq*wE2g! z`CLtQa2WRi#Xaa2pk8pgKz%?{3~&vBNB`GsQH z)~3N+xxnJ=ek&1Sn+UQkNOSR4j=|>$U0APMOO`TRcilDWmE)=4|I8K7h<9yGB z?Kvt=D3yWEsWWHZPUm?l_H6vez{>h31{1-HP~Z~Ll2SD5QaP~-0kv;T%|GYBc*=0J z^x02lb%F_4)g~`EIMy?1kyoels2en?NmH?2TZpq5Dcbv0b0Wm@=?=A+HnbhQNQ7=s zYC*ey5B{@yjqO!vc-jzL2+Nxw{{lf759~-+@@*bm zwG$n_d+UWvlVSyu?SO-P)g}i%sln&6jO;Jm=01$o+}!Un!X3boqzgRFuKmU>7~=IW z?I<)cZ0zr9-|cEeL+RM35Anv@?uV` z`YtpL`Yu#2^cZI9+eh#*aIpOsqhEP0&EaTmzA+ICJL%1($(p3PkF}=bJY<+X_W75C+9(l5iDHD26FnxwC|Qg!A)rw@iXEN=%wl?D|Nrrh(eC6x zXZjV``Wd$9)7F_F7Rfy#UinXMc;&0F^`8iLT6ZQR;n1r!O%L4$^_v)Cj2U@ zKv8P?v2BTAkbG=gGC^T_z?+(QY+HI5#2?${41+i`VXLDYAq{QAZ64zsPK;nK1$BW! zYTo8Y9Yqky3Bk+Mi}Q@e@j+;)!omqT4DI8%YoGXEBr87(8Q7ZfQPN81U>u@EqdqDi zC}-yfyw145a+d=u=P-X7`l_KJrTB=r`9yy+X#F!NZ#fS3C`=zxT25m2Yxb4~z2t;@ z%lq(Sx}EN!t%3IVX1DT;WgNOg!HDucGu<3tF3!fQaJ=R~Z*ys>^$AKAWgI2x=F3>k zjSFR*a{(C&>`s1!+%ldX-J9=ZBi{S)o&3dn3g6@Pdtbg|*E`Kq&A32kf-jHtcQF6; zV;#=+uIx)5LsJuO((o^*AEZHe@5lEvux{nh&@a$Ak}HU_w7D1A=`Qs)_hMV0&z9fC zLuMcx+u^k5`B*oL^JTQS&mfW|nbx~l-rntCRS)*H_9?(t0zM$tl65+390Yy1C;a^z ztP;L)*r<*lRb#76wevw_PE<6t`q5E0TC9BYh2#5H?pe_k3Jq-^db;n+sP}nI<8rql z2H&t_Z7!eF`ruN-D5GxEKX>{b~&tcy9N{*PnBW$qBRp&|6ntg z?_#qwwYcDwh7{AAobY^c!M=umP|SjZ?81T<8s5`KAcwF}&N1!wAt7DrjCAVTOFeVN+SytXS7CIp-uPZIY z;L8}@y0vdSttMxpE8os!#Ej3OyY5s+TsTY28&L+JKH81pIhS;}^Y*0MyugclO^On5 zI@E+j>((LQZDC?o^)Y?RHSTeKJE3Fs^h95O47SxKSfz{q_c6?o5}uy*#DFj>qF#Em z|LMie1G1=zms~;>!5LYZ#W@`%#`ssOip`6LaV%4UgZ&3qyH~#F=q_pbnWGyEjJpzO z>W5Ye{33S9XLqEdTpF7pRBZE@9Yxs5<8FHo#l-OR#hL7TAUJ-tv)XMef^4F`ot+zi z55kQ4efU@RJW;Z7GsH=6?iESg5y4_k}1hiE&#N9?st1mAKqm$$f+r2Xh`ZsXnrO!qV1NW_w9;Dlk^ zpNftP_{mDeVWX z@p#z5!RE;+u&aipXN@;yJCy68__Te!nF7D#6KUV8nf_dfu3#;tH77yf$Bh#@Y?O4(;cQ_pJ#_C3lVt1aYi{J6fd+KWAJLv$dH}2bx z@>*=}DGD4KjBWAGqMSWNIr~Zy+QJTg1qTwGaX&Y5DG5PXK5(Wk1;O6r#J^iz_&2Y7 z=a(z`;JML>f3sZpS5Xf0wM_^I^!pn%{b{SFzv?9Yaz%5Krr+DB=}%fU{beVp7t8dB z*}HNZNzqD66P<;?QnW-REncMmP-h7)VrvT~O)?+)=|)wI-gbxHXP(!kIN%I#E7tXq zH<&rYX7UCzSJ+J6U{)SBlefC!lqLpN+=m2cqedh^tr{s(8`rt>%nHZO6HB&NuLlRd z%CE!V*J1MOF!^=(KjGJ5;n!i|*J0t;;s5*m+HqEXEkFEKe$mXSITGd<&0_gQvmX4y zcA_YL5k>e#6wNQ=u@j1AS|DYYHuVAH|kJC!_4)ik5-rgXgA>cqc!d00NczUUPs!oQnJ z>8za2>S0mjqPtSME2q19lv9R{a!P`7s)^OX zkw)t^B4G*Bhy-YpMkFk68j%2XXhZ_ksgWYJacoc=5N!`$g%pBM>E~eAY!NRD^z`q> z(HrSS0W1Ajo8ikutKdayjda*0_IDfo`=F;P&S{0Htf;N4x9?74cwBH`jJ(ho?oKy` z_fer4>Bap!aTqe00P}idcu_emaQ$j=e^*gx4-89Th-+Cr{c%TYaepUF@?hemNxG4q z+TZ^eLqzAe0?Qvd=0x8Gk^TjjzB18FAp-Pw!=>R%FyOg=Tx1#-asQS6i6TEp0@{!M z5q+ZWpG;glkumxV^eQ&LQuIum{ECgo->xn)7C|479an&v!ub~o?d-DB*V$cGar3M% zJk7ICqN|zprDx5o5U#`Zb zF1kHKi_ov`KHsq{IE(t3DQpz zo&Ip6Xr~{art4AN9&UM7ebW&TX6UbZ_I7WI`hd27G+Q`uVuhQHoturFJCFa^u({c= zx!JI}?S?I;Mca0k7HvZ~&#Ex0rVJlpy+#`~VXMV2qls#+JbhFHh0?1UC|ytO|B>(I zZCT52(3RCs9~}bBu|U@VU>A;ErnWWi*E@C>x{x^#4~bdmL0(*Q=O|rFW;UByYA(sglh?Ey>MONKRvwep43!$Q zFneWwW#ht5oJWoKz|zb_{}g4q)agw6!TCHz9!{1zhY(OkL~sd!Kg;?7_P!wp*~mXw z%0SDKt$S$LT$XJWEd*nC7dnwD9&`R)WvbM+bUpQ_r-oW|gtinARg;l&5f(dqXiZ!VD7?P$jYZ!DwT(hM+CB zH%42agp$q3(|2N`kJGi>m%1{45Nf-R=O^k*Je7NUY!LMs;(D|U;tF~AAN}rnlr`1i z*!X8nuX{w(n}pT~T`Y8+(1(RSDYRYadqR&1J?9TPygZ>Ep=CmSLcc5YH$tBl`kK&> zg`N?b{zo0|_a)s|3Z5vmOlY;x#X|2B`Xix_3Ed_1U7@{%FXsq#3cXxtzR-z6%Y=Sg z=zT&T6#7S@&kB7>=-Wa+5_&{vuRrPh4HTL!^h%-E3!N;qTxKSN=nkQ;34KrK ze+%s;d>kk=Tj*6n#|yn#XsytDgxZD9Dc{}3wOJ0;CD^p}l*XMg)OPPYt?h06!9_i> zZGMrMzb16X9_?!H@H-a4uEtRXd#9ri{~H{2 zc=(&4%$<(QV*FnQm-7)?1AJ8?M7m$5%<5p$h_^*B^MO`5mcm^l-Y*9#b=1P70=P=q zEy9~$h2n%Ox~E(IUxfcYiM$EbQh^yL|yj+g-PlVY573X~AvJU?l zH)FCxU!qcfhl=xdn4c|Q%;DL%z&QA;MEd3T&M!qxOO<;wBE*~{A+G4H-mm)Fu~w7YJh z7zp(Ioxur*XF~tNLwfrBbI$LJCsC+lICg-?>7@1ekM$(=_U75g0DcCLp7YT-NSN)tZI4j0| zc8vYV7@QY_^99@A#}i}k6>O)cIL5v-2G59bUlxOB$KZ0o36j70G4?evxHbmY3%2>= zi?LrCV}EyyeN&A6su=q+uv5fHve}BhD1UAI%3>+ z3bxaic!^G*-5#Y2w)yWA+)u*G6Kv!L6FB5Eszf`bY zzSax2`Lju|-D$>#@0Idvw{NlSQ*8Z?Z4YW<{KuC64v9ZQ@;i6#yo$!E`8N9;bLUph zud1vCt*>aTtf&=dz>U87z_!8MxxShObRY(E=T=uV`l9jTs!Cs7gKdIvYi%%hZdJv+ z1v+GeyJSJNZ|)W0^k{r#3?3cE^}dE{u0nbmsyJ4z^x5I~7gf|QxP4L8d}UzUGGiQK zi+6`}epPLiugWnF2G?KjaEu-6a16owI2a7U^Q}4BWnFz$Lj}@LlnZw(PdO;0xw&}w zj)!$L_xcfPgwFDgpd4cn2An&t2OSBTJ>22A2lO^PcjLJfp62}N4alVeN|nx?aWcmA!Mzy(T8zl zrSo=wMZeuUoiifs$2T^^xYm z;T+FqV?u33V`G%9v%=@pT}iaPn{p1}t9bD)Kvi$3tXUT2S-Egds9RXi7TP&&-nY?% zIEy(I4mV4V@`^=ui_zxr>lp2@ zdo@Q)xY{}A3=?Y`-JJf11Hg-zPi&~FQpSQORrzkNsP$_zT8R1dXmgGuXkHX9<`WuF z;8EeHgS(Jl6)vUM@Gl9nX?yHL!$H9I+>jW0(>-tta563A_uUx$Kn%w6QV;jk?v3{U z{TNJz;As0N<9p)2#^6**hdmy)$FcnW_E)chG-p1(2Zt^b>KY1Bze^kHDyteHR(rNV z# z=Qkpy87buvv}0Ma?HDfol5+mSaMSV7jN|WfzJbQPa|zV!@>MV|5``tcyXueRd&~l;mLhbOI1g{smQRpV2 z?Lzkp?G~Dtr_+@xG*f7v&@!R*LZ|x|IZCj~G6VhGEtuQQsPQ`{HY{*VukblwH@{*T z)SK%x<@bQQMjFEHBK<~FnAi9llm*`5U-_ds!tpl1POV$)@KjaOy90hOw^~Mj4eAAE@LyR2iZB+i{XrP2lSVj5 zEzJG5`x|Azg)n_p3+Gj_J>n1H*AXF(Xk*3~#_ke_qZAK+B_*Tg&mXl+g-bjizmd)o z{G5DQh98X`Uhj1a7hcC6PXDH>RU`OEJF*ByGk}@MTkwCr!Zk4AItSOBz$dl(LCV#p z`9L~c?LUHbIE`T!Iy{blB4!9qtxIv;sHdqNUnD#oFI`5==zlU&z;sVU$n!u;fXPEQ zT6j`orf{<4la$}W4SGB1bogUmFb$&ueu}B!!(vbm%=u+?_hmiDosNiqogP2wR;|A8{x!{O&2=r`ePI3fzW;*30*XED8t^hKC8(bChAP}y;y=K9;@2Fk4sILCbhDM)%@sg#> z?)uj3Ik(L%|9boH+`ass75}I6|9?9E|7HHW$4~GSPMqW|nmnbrWa_li8*iFE1Ly9R z&AL_d|Lg7lU%`JrBp}hhyleIN&mr=edcm7)^L%YzE_9PnTdvbBIB$%0S1)vvP{(!R zU+5;Gjsk6N%Y`xp=LuaZ^qb^89EGrV_F+^+jTT$#W6O-b$v@>y)S$8bQCf6m6obCW ze=Wu-l}JM^!nsSOWq}&OMTd9A|CaDL)@Vf7Of7R99YbC?hHpwQM`KJe$A28-)Bsa| zXg-h~B6(-?;G4o@7#xu=5`BG}pe#zm_02AQiS>rrwS{ zR<8F|dE-*W1zm<1f{r;7!r9|ze75u|7isrl97-*y2E?u7n2+2nIZK+(9v=NxA`EiU zhY?*aLL*=FxU(8Ilxebzb9T`4OGWa^LO^{f@}j4FwPy;ckHr#Ohi^6y|CgR6opyox zPr{4NG1E+L_N)bwZ^Dwc7%nKqjh4SMg|-aPj+^xC{Gw?+@>mByl;q}ubL7$4S^-^> z?eAm9*)v~S?#1}r4OJ5t)KF3JSkdI#l#Dcj_)Mlj^} z>Q^uLV!=xV+j=KWf}LW&M(_~9>jhsTxak_ruc3lBh<%peje>^>enc?W%=z0S_%aP0 zTLe?a%3rHs%1rrd7o4M^qeJjW!TSa03hopeR;3C1Lf+q_u6Ffz5xnNsf zTqAgz*w+g#6}(jN&4QZ*+w$Z!f^m9+`mGmiOExwLULp1y1;h4;Gv)*eN()@DRaX!Iuaw6FgLKjo>W7O9c-TyhiY)f;R}hOz7Wh~R;Ow+OyKaJ%3^f;$C|6x=PiKydO+I{()T&J;XBaJJw(1iJ*s z$$+XQBe zMeqfJ+XWX0?i3s+1IBK_ee40`44vN;!Rdli1v>>_AUIDjuOr~kD>zODlx2eZ2(A&F zB6z9b3k0tbTp)O(;5a8k$M{chAE$zjR>3KPJ8b`gJ8l12+I_d}U$A4Q4H-PJ8gTHw$HQe1-oqQ(e|Y__G(;i<6@2LZCt8x zliK*v>s31Jb5g5t+;>%>JlOgTURgP+gw%mQ%G)&6BTde}`Qtj1rrI6l zYW!7WX3igX!)eM@Ob2YWJIXuwqkaW{)T7{Uk%Y@#Z~WB@=59OwD8EjD z732{7EtGUrfCK#9A^s@k;;%;hQ%=L*9pe5D39k{-BmVpnu215xmvC;Ecqnb*kCGz( z?vU@WFw75azfjC?m;8~>cfdX6OymS*LYh+yh54Z@YdY3v^^fHv*D>B<&wp4>adtTqy3f)MipxUxwu+7puDVe2V3U_$G1B@{f@|BAfS=*lFjQO?WXL-v7vfWeO zL~O^;^2hYp?pY4WKRf>{kGbHc9eyLYO?#UkET6eZtyFKs&hTc0!((}6`t0ynZka!6 z9*`QwH#6#ckzeDL-W9XRa?SW`{!)g_?`Ox)a-NIS+4D`7cVe4=EccAh&L7KvE?kG_ zvnWT*pQu5=^<4_zivQdb>kGFJyH+WFE_<%!|%#(Kwm*y&!V@>vqjCnd4b}G z7yK@Ec$F%jlTf1ckL^hGchv1kBm~{Au*A($9(4P{5OoQ=6Zs)$#>PxGZPT>f;w z?G4u_%_ny_-I`DCaJ!}X6seDzPZPrRuThl~ozLiW==4YOX{W1HIIPoE9IiJyUDLzq z)afdYN(akZBwn4aN#S(c>9X5L-QJFmO6Nk1AtE(b$L|T3A02;5xE-+LkFg_T^FjBplAB0p(g2{4tH`CCLeAN=ZE>HiCr>u zx@Lv#wf_m>cEskh-LKL=zeG>}b}ORCndFDv{@VPr+glyqzAfwhmIQY_fP647YH z5`&70glIPa7{wCBjx|P&A}Sy@tig^QJGKP-wWCpUDIzF3|KFLN zg$wF??|c9EeeZi;SUC4LXJ&T#o|!#oc6X549xDZJC-|X)UoPw(RR!-P!Ut;M!cL|W zyqgHu)`1>^|3QTN2>w^WYj!}*P8cl0wd+T-1DcEYp(0#c-z*pWOcAcx2@4B8T7+wI zTC*E!cEvam9wFi<2!5g9lLW8H|q1;Hl?{+{5I1%FfU znS#F~c*_8_{?`R>C-{?s*X*R93*J$L`w3pNYif2;7ZE;8gll%wF9h!{!uHA#erig0&P-X?-i7U7y5QnT|H72%m8T)WS(6z6{>!YzlW{Szd3Zy_J;1aBw8 zw+Y@+@Y?!767h?Pa2FBYMev&4+EMWCB7BJ8!^HVj1n(`v`wQMugcldQzX%stO&0z zcsmiUYSHlgzToGJaBUw!9l^VZ@Zo}Y7yLBA2aEE#3f^0U&k(%72yd?OB7C~wZAG|~ z;Dbf@FM0~M?6a6{zX% zHn2|ihb&lbFgINwF^nIb$y@ZKW4so*U~sQFD1e6T2QCBfT?@V|X)f9ZR2oDf^oZv@l@daN<@JWKdFZg7^hY3DY@M{HcIa00P4#C?A zK1T44f^R2y7s2ZVuj*%MXS8~#_q+XZ-)hPafR@*k_Z3zT?S9)&Sf?~TKv;J)eu%KD zX#7xNJ<<4K(Ds|AKMa~UQ=W7lru;}~Ax!yE`NBzCY8p=3PE%gfc5C^MH>odaJyosX zKofnS>ZAVBdkeJ`$S(CIO0T7_+F>+n9oel&|3Lev)kD=w(Yq08H*;<}s=bD^1L~pL zYX;`DGnM5_z8_c(SM4{x&~|G)m4nhV<#V62Q}t=|YZ^|w;`8#_JgDh|hYPEdY7ZKm zqkT~IHuNq{^-%c%IptM(&04AHg$CyIvl>qOn@!IT$SI#1J|w4~RenUi^z}L8QVrLv za9Vz}tJpOC+;OhPpO7;SRlN+2el0%fVQBZYDL)W>mY2^Tp7(s(Wo{Z@eO8iu)ckV$ zTjdAm^qrL8|>Z3mEnVY{pXWXjilXl!R{W1B% z$C{)^`gT7Pp6nl#ih8K_D0*M2#*Tvn?B(jA+Cy^7r`l_BuS?Z_nfn~7YKJlnr}XK%RS#9aty#6nUQG2@ zp8=*AWOt_PQIk`uJy5e|tM+x03tD@r_Kw`^RpsedJ=FIb3_%a7hiXR~oYP*a-D_yh z^`Y9Aa?7vTe>5NBzl8MA+E2BU4b73`s(n$js*`=4?2nqYo$Tk-pSjngYA4jJ>J(1) zCoMPPNezEdqin#9m}?TXiU?TS?G)!Hrz+Al%l zhkn&VwfE(gN44kVUOy_ITOXCDU+sLdgKE1iH2X3=$)knSoSNGrq}L~2OF^@fXgO%S zX*jj0Rw4?g7R}|!o=#7(X!&W^54}x@_B5y=s-5G*`B3#AjduT7eAVA{{#5OHTJBU| z8n0Sui6^@+yQ8!a8>*koh0Y!dEKy3LiG_%-AKca%R1nTAtT zH~Ok8AnD6La_#KhtqKhgajD$l-Z%nG51M;^$ov z&1H(QdE-kj^YJP9c-x$l#mliLYaWlis06!n;$J{R@QsndY19EsH`!2yb zq(u%-=}?+ldemHIAZ-}5hUJiKs@-8R)O1iHZrJLBy(u02)onuweU|PGA`Bn9^t zou?3bSgxE-7(eR$Ou~?`zHxnnGOx-|eySHN`q1&`FQH1f!Z*fd~vo4zRF+(;ICT?_!Aw)SiN-OqlB0g;1q|Jo3 z*II5N3?F5_l~C_{l4I=FncIkucdX9)-}uFJj$xM{aCEBMdOL-?IY)5x`9s=4ysc+H zjt2jO96g*W?j(OhbTCJ!E7v%NZ)>oN{1fE`937_o!O>~l*L-~VR9(l>E#$q5OM300 z_{Q&cag4oP{8!?oG65WYbjLV4MOKRA{)NVJbh5k1(d}`~z2qM@JcMKT)+CN-pMB&X z-Y=A+KJhNc*zCsp$v^SoJdRGY9&&Vh*6aZJ>n#^@w0-!PWB3m(4w8S!wS^p|=Z`st zA8CGw{9}8BaSY$|kYjwj%V8dW*<6lJUm7@uAGMF?>33<((dXbWjv+;tagu<%IFC268kUoyk!ezlkHpAII?URF3*m<+wbK9p02<$c{c7rF)Y(dSpd# z)W1E!G4@F^N8>@8Gn7xrq&#bA#5i9d4;FSn0l;x9Ki8cV+A=rp?G1v($s5l4@A zy*c`PF_EL8#VQru4sZ-#N-+RM?{ z;5x_fshJ!-3^s{8|FIQ0I+@quXgjMJN4LTqI2wX`aWp>g=csQN%rPWfXbI68UP<0y4;<(TN&iDP*6 z-W>IXhH&(_5zNtT<4le|`ehu$zuLeN@_}RgvZEYh^OHFGl%B`Y!E+_Y@L3x<8utFG z;{6jGW6iH}^r&*5V|)W6M+fCSM}3>3eEk*MsscwtQ%8=rwHtHHvpz$)`LV!ZN3{di zJ6x|8tJg4~#CF%7mnS6`TYAAYVEBOMZPKo|_LLiMc=m0&tIgqiE&N*_cP+W$q|fNuiRwWqh5;(&m=(@hdOm%l}kZHfw)%%eW3( zT#Gw3F)Cw=%f~V-zW#l{J=Zb^I#)TTvycxz%IIoHd*=E_T7}PSCRoX*%;NR4*2TMa zJq625JzKf>i1RO{-eu)&y9?=S&A972d|l(6dwbf-U7lHVNa$Ev-g02=>Km=g$+e%o z-W4^dvixWEYZt?g4A)Sj{-oE_G}oPHnps%|n#)n&)qJu*Us-;#chtDmcdN)g7S>UR zYg)=`Im*es`wp?qXksCE956AZ^pH|=vjHI&cF0!poh4#)Hm&%5raCD+|_{6Jl^I&vGo+dm|h&vISeq)<;Ex3aQN#R*I1 zTq-J0+BmVM-kPffJ&IbO27oM~CVMLnyp)51jiuK4la$NoTz1+%w zB{y>Mtug0fMLFcfoXXMts>lzo*UIYLp}M@JXtgAV<)vh+2j+|2ZEDN!{USH@=v+k} z*tM~JSkbC-xy(_bMi@Q~YmyHK(%Nq)D@Px8thI=B2jwpER|!yr#s{_TSH~ zD_8FIQ(5D)T5{v>>yLdYU8r)d@B&Bba? z?RKG&yl-#qZb4m|%3d=p51H&qVcVn5Hi#*Kmt2J!x_s`LkJ7kBx9@D0_^VL(`}1Tlx37jbddvXvvS&62>-@ zAI!Mpd9t{xyv=)t;oSPKHN``+?|rG;H&=R#|qeUb8&Y}I3a zuUFlg%I?Q|WR5)2SWfSsTB6$7>T*Ok*J}><8p%CUXZ4@#*-S36>MG0b;UeGo-EnHY zqE52mZkr{ErBhrZdp#>Y(6)wL^7jTMg6n-DU(B?va9w`k`s4YIlREf)E?3Dnn#eP2k1uB1v!R@!>%VpUrRMVejAK1)*A;244RIV_0TcUrrx2~gV&8rwNw-L%Qyqe#V_pU!lip3=F zhO*t7Qf5!=8jI_wvE0GOa(ZMDMXu_#pOId&NP-QEw0^cs!L7TX;Jy&p(R_$?>&dlyX9J6F8{RJtZOeZ zPHzvLzNl9%c}~rG{W{+)CLeEPQ9ETrimP*rx}nBa?c}~+XGE=hSzCVS(_z}=j$g?2 z#<#xTs#q;q*QK@ZCa@F&lpIzP9Nj`9G;sDnlYRRQz z4rKM&?jYYDdvTyc@A|TP&6u>u(`v~}p0ae`PKsRO+vJJ+4z-ixBENYTu&TMdX??$G z8-~=8FTE%+{@A(JvZ0IH@lNrz3ni%2$_D{~Z7QpYz@1r#){q9eJv= z+%vss)ME2aa?!{Q7k-=8LEhK%L^1tuPO|mE~(c(zEgtYM=aP~^qq3@aGO3OQnMACm4#;YNXk~8oYgHGekfa6c&~5ao$Ire zRJqz>*)-YVBahPgF%c&n_hcD;T_tG9~dwzUUlq`p!5hAo+#eDjS` zQGcR>{=^&Q-5)c*s=V!ua%kWXpFfwsQF`5T>iT%<8)bNf#7N!nH%f=u{zY2$e4|uY z-xB|Cl<-O?X4bCzMltI+A?r#x_=oH8|3J`8`W9Tl?^vOGmSm z8@An_Ro|MWsQR%ig~iV=_SKJBN?=^k%!m3cW$U;HHv9WzDTb%NWyiW_DUa)}oP5$b zOR04~vHe?zEah65u2h#|S;`x`RSS+}WhzROlnI`XGnFfLPV;nEGL>cw3#r4IN=(|& z5_>miDywGcGU9*ER64|NGCrD-sq9@8f1qYireZgvKmIe7G8Vx{r7oGu?L#{z{L~^- z312@|*P%AT`H`tu*!hI$EHV|h$+~xi(_br{$J^Vl{Eq@Zi#~75x;OJ_fVbN_n5uaz3dU%Bd!; zhrYg-q4ZCf@~^We+6*N=F|^s&3lZ)=rJVni z45h+gUE?*QGL)=pU57mHpP{Vl(EP_Po*9a7RhwQ3tumB5@w4N4G|W)k2I$7U`8-2e zvbDbd&N3N_MLBPuDTOnX>@RCM`)0gSo|H|D>;2@Fvf=*oV}p}kDLri$*9krSN?G{k z>yroey;9=8)eSAY`IQoL?(>xXzr0djcu#S z`)S}SMb(GCQr=J9|G382uarMZq`O-+eWi3P9NmM}ex;Pny#K67l%J3*%=~VaDq1H+1%7|?>X2zXKSMDu{ye%J0S9%}z4F7Fg zy3#>6cFW|5bY*bjjt5PbrYj-tx@v_()0OYbZ2kJ)gmh()PcP>S!_$=&7hjz^>yxgW z8GGvf^=|3P+v@}TGTWsqonLNps@W`EnOWspjX__gD_wi_{bIL6x>AN8INz`MrKv>_ zzjUmkdz+>d*|wq8f|qHE*~W(l>fTRNPL7FLc>P+M@?_KZ>zAHRQ@Yps{JPJTTn}=|hDWzSeq$w}kp1#z3Oq$|evP4WL~?ZN38sY=I7@7I3wN2>BuNXPgZhEydS zFD$pd2CO@!^V`#@O35bQ&d)lOs<_qBZ86`KsuVtwwy4s^RAqIkhqYR+PE|IT$Mp_e zoT`+L4J{QLnyPfZu-4_x52;F{np5IDMyDz@b-zvA>7S~kEDF(A>zk_V7`JfJFWpj= zMb+EmKUL}NQ~sx4vuEwMwe;xVwAE__C?W_4vU> zzqUzLN;&B8pQ`Aq9Qncgb&Ap{ZgPwC=P621oYMTy`zgx74)q4VN=i{GPl?!KaWO^d zWvG;0?L>-F>qR@a4*OG-2m4Y7Pu!lOEc?Df|GiNu%IcB^d)?|3WmUx7kZwy-l$&+J zrp3-qQA*iODQPz)MVbCvMf=&~Qk3zdTg|cO;L)~9MkW!-YLrIYwyc@{cGoW#g!DLWI`kSrzo4_U(A|QH$`da^xYHh&r_5y+@tKBDj=L6 zDN2Z~?$FyJ;EnHXjqi<0M2($qUc53YVXGbwef8X^l=PX}-QuB9S=Merw8KrK(rk63 z9&IigmF71NbQyKpsElekXGT=KQAzlv#`DL&8kOD8>ji$b&8S4#`dd$lG%7yRwng6j z#i)2$>6$7_jmmw$F*`TSH7e6>TUl0}4*pqOtu@~pm6NZ(w*F$YQF&Wx{HonUj7s*# zl*^q57?l}g0>fYSGAicIzrX&et5G@OTkc%@_D03lye0k-@9U|*o^&xP75Y}$z0k?1 zJgqe@+t<;kSelznadR*#O(t}0T-^@w`C(K-@FG!jOC#wqaA*iS_Q=8Yom5Z$tJ*J= z)&h^Yebhc76Bj8*q(!1^$2sG?U&^*v& z&?wMAP$qUpO)DEP88iDG7s)EXcS{K$yEkKPx^*}X24j_9_DUc25 zUvZeG;V?4UH=Ov64=2Gg@C4@wW; z!2TdfQ=eGGi$)xL)A)mUng`_{ZxWsa_s80R($Z2ftrw+ldYE!aRL%wPA^OBY{orO2 z?gRIy%0Nj_njh;2o{vc$ra3z9*GaKR7vE|&iILYyAqghoNhWTJNoi<@Y5gf((<2Xu za~#9qL-dJ*_rFQFH{2gx1%U6-4#h_>q z1Nl{zr0+pCpX0qOH6&>j=#HZ#JqLBJg=ZQ-PeBLq(8boyl2qMWlA3^u_rmvqK-)nl zL9anozm=pTkR4A+hFIvNZ$RBaeL!PDA)uL{IiR0FYe8E<`$6YH*FeufX&`!`YP=0* z+lr9c&DDHYVSwl}VH`rR(;FDKP#+)UwG#~&YXunwo*y_j_8C;;_8g9{DM&qlE>ij*^;3C)%n(N%(J{L>p3|M95fhh1m2R; zZtdw+-Me*5DnocaKk|&u>xb4tIrI3n=jX=d^CQpre15IrmjFKppqg)c@{*GC#^ZSy z^Z0r2JTl=&J1^98JU_%+)(sN6S@Rn^a#+xCdgg-W{yw>JCrp^&I{?iu zB`y)=4h$Mty?skwo}@f}-}3SpO#Qsnc*%ME)Obet#T7^X!D_jq*Xg8NRBp~!M~(1p zstvfFfnr=VAivGdK zJ_tiO5l@TD({;9%iZwvmJ{BHT3!6!WA6iLzwE54VcuJ4_f-E_I7Ji954>dfOM`duH zgm`(*MRuknwBzv@}eS@+Fbg5)Tb@a88N;q3e zB|L5Pz8Gz23aM6Q^zCQ(hAreG;Q&yO2`~D{LuZL=27RG}+_V}1ONGiw z7G^#=y>=d(}1|ff6bE&LXA*5v{l{H|@RVpME#|!n$kaJuG^b^k0 z)hH^}@Gp!uE{Qg_MH`nu8yA=Ccc6{SSW0DlOG;(DY^5^JC8RPtZ1q-lW|H0IGEQ1s zL}5-m1=@kOAk1ku5AlUwjOG{-0@&v z$40XEFM&RAkcu0N8mtp7<1O@seaw+&i!61lxOJ1HHJ}?sbR4}saUTWV2%e4yATcIA z?D2BU(z?=8QDbgO)D9Tg(m<>WXl+md=MfTL`x|`sQlt|DcPvN?*LW>lZL4BvE3_HL zP^AXBZKd`D`U2y>4BDVf16zGbk~4v3IsNc$2T7U(dQa;Ht;~UD9y&W~$<7z#WhL3+ zI?52>IE2mNk|(luXpFq1w&xEDzQkl-f$*6cC}tThVyVH&(SV zaRu?(w@~BuBdlmGRrD<c)YX@Y8Ep(!iACZI>&<-%IhlFT z*wiBL5ST#~kd`fBk@nMtJrZ9H@~Sm&Z0)p3S0d!fwE7;9pj zeJt`H5T&|NK5}?ajeEcmje1*ak?UW%HN4|8u|Qgl9xKC;kv_Eu*X=i$5_DiXHfl% z!5`Np`k!Byf$*<{>jc+9r5)-uS|YxfzNin{p37IrRWHa5jD<>`xiZ7v$wsQ;JW8sf z8zk8pF{%@-nLDUTj|tUuO2?dM3+)w#L-qq8U^SzxZS(2MctY^z;AiN)hFGn#XH%H@ZqHX|l%D%2z)I*F7jkYh%7P!@Y7Dn#+r$KZ~Ic(XWdj$4XjCC7nx3 zB?F6L%brzy5xs>ErGxI5#_z&C?rupsCeqmm_Yo8RWBqYs2jn0~yIyof&7`7%g+F@z z-A7s-_h3n=wPPs@sTBIF)DA9zc{%9X4nZ8pUvZx<;@MXzEEUtumMjeBiDvQYc(ug@ zT-DK9a!mhGatNA%`EI6U>lG?lI?s|E4&dG%4v!KdeB;35Arcx5@Xs{DskCHk3Q<2r;oaQ*hk)!25)z)pRfihgEb4Sp>$Pn zZ3b14s`%RD8nweUT1Mhh9-Ye9qys)a-d~)@dyy~T`@vYR(ovGnt3@%V+DH`}lsA?& zluj%eUn1vvOa2{oN|L0;BEGJ?HO5nUsr-(-*ROqTnj;-C7dw1ZRv3|&{g+l!MXxZk ziq7-RD(YsNsl6oHstm&GqfTDS%&IsqF{`4RZ&u1^Yf!H_HI5JBsN>aAvi7vdDPxbD zxQ0QUP0Q$26y>y$$~P!&ENLi_SS%j%o#{Gw2im`;O?UflWppJ!SOuv01*6P-UEfM; z%e=BE>=D-Qpg|&E`zn@_E!McUfw^-w$u%dWLx;|~kYw#|#>dCU#{T%1lC&43^^MNb zOtM^L?qvT3=0bn;yY4f|%0O3GVJCC+Go_tK>C)U?3TtH>j6Lc>uJp3iBeMwhD$nz*VWz*~!p{huK>h>Mie$SUx*-th3_f;{?wAhKd<>!tT6|kLNUuwWX}s`! z@hDs?PYCkNf1n9JSr*da(qWo@8T3p3LrdTAk@Ts)(gvNh{BP8kbhLDs<`ZVmz4H8M z`M4v!{0G&;2mT*zQ=yABP2aLpZVI;1x#`t|+XH$p(#dE?^%%Hqb9v35aKa|lKYWXd z%|u$B0{sP!6*yPmYJs~1CJ4MQFhgLejcU410^11m78oROzQFYY_X)fz@R`8(0&S^I zI2MU=HxPU~f!+cK2^=eMhQMV4w+cKd@Qy$W(JrL~ItZ*M&_!T7f!+d#2%I5siNF|v z2LxUacthZ0fvEy5Hmmh3C(uz~1A(%@4g!4yjujXtFh<~Ufma3I7nm;4LbPK!fsO*5 z1-25{L*OuhlLYe4zz^yDOpm!{o&83S?myVC)yUwUQul6cJsUQt=Q|7!v)UK#<`>j@ zOkkkjh@dtBfqwWfb>R4(_+qjdJ`u*hSr&wklMNUXfdWaJ+|K;GmI#!~2gIh+2$6H3FroAEw^kSE^y+ z>*bFo@`b0AM!wy~kH+W0y#j{&wH!@tPA+L=q4pyJf&%&v3z*>7ty940Aa|T1{fH8^ z@f$E^@L<0{tt2;i8bSThIQsS@294|~O(7q(#nrw-dv|Q>`AyqSTEE|+_VgI&HInk9 zlu>SfbI<+(qy2K)Qj+ddEVa4ub-E#xYN!6AgW3iLjzk-`q&7C;opo(T3>@j}=P@#X zw}T6Kv`6beR0H3m>xR*R9)eP|P$$3sWBoqxFQaSYH_R{SgMgtXEs^h}mLq(-=>taa zmX~4+dkq`ia@equ14&Z`H;UV%|1f-0ekXA#tjcXCu3ey?pR`Ly&?#U*Abs6Ej_OC< z-O|?=ojh8S&J^l2vcIngZ;MMux}~k!CS}I+aww=j+hL^yDhK`g`sPmX%K>@AC z2jSC!Jp+9GTKo48luBA?POp(U;ZjRVqwR>X0f8e&496v*eu$9d#7^F>9}B8ZW5y() zNB_Wp{sXAAy(y$yP)^HwQ|kO`7_aw}?h&VE-~}Fetj_!OMEJxN>XiFEMDT~`9C7(l zi%QbByfwSwih{kKyFLBXc8=Dy8#ZRNKjqhI%%DMjf#`iJIv=8G^hgM|F+ut zO?+{QA*F^?aynBCd|WEh1tA61o~W*l5|I{)_AfpfMBM%IXXu6h+2j0o4wnaArIih1 zG;^pf)lF+6SnT*OemG0vng^j8C)bCvw0>{545ee74w$l;U6zqla(rsO{T zVQ#fRpZ;+4zp23gL)m_8M5umh0X{h_9R7z2_&=M?fA}z=U6G~@wjMWxK2yg}ttvbt z@2ZZq8&sUK#*j@ew@D!!qY?kex*O{p)Zh<(r@U9a+yw6a2jjOC@%JG9#fXOy6{JTI z$q~Ijo&Kb?{EV)JC8_I;zBe4Cem92PXz*eDD@k_@&>PgBq?RnCzPi6rTh(hwCz`rH zNGP9&`>!A0C#gmIcZX}`(9q*k<#kr;5z<{!_48oHs=1(B2c>d*Af5dx&PPV z>Hf}PmhUJe4y_$%e9)osBqPQw*EoC^yKLU;rJmBVho5!}?KV2d*UgPb{#d*L{eAoO z4-D)-zTXJHas7t*jTju{ubuMA_;gdIMMBCSi-$e#0R#K_(XC}p%#X(7Ip&S{v3OL@ z{B`;U-)HvRsCJ;lLFj2e?U3d<#VT*hsfr2|8K@67aHcUj;q{Q96Y0gj>S? zr-`3QQXia4I3GlD!ho?LDo-5nIf%+hc({rrtw;QL;8hUCCmiK~{jl&40^S2{hWjC~ zdsW=k!tD)Q2%`8)fER>25!kz$ntmT(I_Nm!6WV>Q`V+Pk?l! zvf|tj;7Snr#{(_DK;OaN7T6y|{z1TtcSlh zyau8+NdivBeXAS%Lx7h+iEv*9+I)%qWN?=OwgXYV!+_T?0fxgr3HbUe=;+`+P+yWV zK$K=Cuww(YJe`1jL3FMUFi^OIfOA0 zxCuwKQ?G>};Nh=f3&y$eK(7uM!-zw;2ILL@aA38LY8}b;(FR2I^#yMK2G=Ue><%5t zSrGZ317?G0oDdfB!Zm|9=D-w?BhpMKzwSs2Zs#756+MwR#R2XD4TIYVwDHE8AAMm9 zEGgU$z^cOC2N(gOeAfeS3imBwoo^uzQJ1>FQ6P#F1l%Xw2Y_b1Rey6}cMz4?8@Lxl zeIfNhJAtS#2!{x_9=J@n!+}qPI~mxzFUBhJ?F4)SiibNJSfL;K3+_t5j>6puxEMs~ zuL7P0@iqiXK9CoPZwZ{;Uu~;O15n3-xV~0m&oHp5uNuDv@TebT0pcGAIt^0mLfCjP zc*J)Bjt5nTdm^y2KdxK2J%B?%REA-|8NwY3JSN=7f!V@M*daiT?*)tlQ9lyC0#O@g z0-c6nA2ZS?Oab}AO)qUc0P=>L&|;WceoNp$;a(2B3Zn8DfR%@)l} z_y++GfRf-&1g3!~&2*soXw^;F5=8lS0?rj~!Y3e#pAD=Zq`IAfULbdrfp8~?&fNvH z9;3!71Kb9paTpJD9g97jh(8Rt2{aw<&A_K1Bizq{^~a$d;C2Qs2AzX@39x@Kbr-)xCv^$g#Er(%jN^DJ5lu~^aD}7{DHHDdoJ)Qi0Wbl z*8D+rw*f{7_j6#gNorm#fPFxe4&g-MCQJcQI_bdrlhrc20}qAZJ$t{PO@JMyqD*ji z0(PH{vcc^Qy!#{4h1&pp845W7cP7wkHtGg?;U6Fa&V3H78=>|QVdHhEFXFoZ*Mn&M5N3mD zd=i>(z%_+9gbhKImoxB4B<3FYdqm-yjaJKS1b(qmO~(V638MIfgJRHki0=KW?2v-YtIPkG>Cj*;qQ`2t&`~^gH2?tJ$ zRns9n2cj|%z5|6IeQ7(ccMzrD26!Dre*tA9PB^eaoSJ?m;9wAyM-N=ESMAd< z;2$9JH{XZ#`F^!tbAbmzaK{4|$E)>P z0&H*u>sTr$(DDT80=F%2J?H@3gnJWEceoD#Jx}8~Be=bQLqXJT(}B~^V0^BH8(8ri z#x&gi!1Cu+`D_R53ZnR4zzZNgPJn$bV9k&CgfBo&a2tWQuAm%n6W+OseBm|#v#zP` zY~ZlpF&Ds}uxAp|g4-L|{3hxPcMISPP|*ma33R%pwjtpH5S1qkcoRf20^SC>!)*YLe<;Qh@Gxj1{NsVGAE|Y3 z1B?VshkrEihbI_UaEAcvyg(h{t_z$5qOyemSAnR^gx|hYWn&*8-uNb6Mf^nIs6W*< z3iU~&`EzFBe;(jHcF6Vg6Zaud>?QF0T~zEE-#(%w6A z6VjeXaud?tLUI$*em`;((mpwI6UGQP?TbqkZj6wE<6qhWW>O)f=K%3o9Ow-Mm>h*A z%vyLyJ>P;Zg#sylIM5sz2P_Os1OjpnI>!g1A~~NwX@jlkM2e8-Q2jsL@}~Mbd?LQn zC;Z($;qL)|de+dN${>#9SI}8mX&maxAO~%8c{^J(DY`~3AK%DKa%`2$Cyz7B`PMG^ zTH#B#Z9x4%>btz_=SGIh5k$#5fOPy94wLeLyP!W2 znEg7Hr9ZvNQlDIB#z#r)<%8eY^Ltm>i-$K@_S-is^F7P@;Q?b^Z!p&94r6}z7#seO zvC)qi+y9EOlsl(bV)y`dYI$#VD6Bi%9omI$p7b@_F}EK}|MMx!e8;i^4UDz^ov|)A z8S9BOe2~Uqq_I1lG2_jn?A&rMc632!ws%H5wr!Fd+Yr=*ZJO4VrM-N@&mWEW+WFo% zzdv|??fhGGes`Sz4cj~OYjM5{+dR$lf6e)0P~LV)jCtN-toL2U2Ht0E$Roz~Q2lQm zW9L_RvttWA*uGgE*!GatEOKmfw&lm}y!_OESJ7`L(bi`&7&`~|MfBli^xsqJzx3xU z)o_OWc{_nUzj2a1{rxz5eDw%>a{V;ReuIeb-(|gidL8|gz+T=u#s0W{f<5`|7<+gn zo~1mw!=Alm>;%e@fb`EI{R>Dx5ozCe!`K@r_1|Y_W!?UD21{7t$qvu^hVA+BYqn*g z8;b~R!Y=Mw#`dS8Zs^-@Fg{HC_Qz)!U)k#UxAshDrxtf%hvsx-yQj5bn-z7(}@JK}t=+l+mOvEqmEHtlboFXMdYzj^-jfA#r`zCrmruw7GI=azrRVzw9M zZ-x46+T%)i4OlC&3@$cxjoNF6h zeh2;c2>qIk{?p{ZKZ_)1>_ASS964hm=d^TDQj`M4{RfER@#8%Wun*}y{4`Qid-JYj4>GGmL;&p-Xa*b21Q>X(eI`;)QzsQbIuDeU3NHSG5OFm^p|KD)MS z4!g8Hl%3!5BRjouDmxK5nZ>XDp54ECToi_7T*fuf7JbaMsss&$QMo_6M153~t8O1vX+UhkV5@?O&Ud z{uQL}j) z*)PKzu*(P66{P3_0JqO_No z<4|bz$aw!Qo3Cd~;ud_zcFgX@w$1crkCGDDA4q!?+Hk-fT-U(iSOWy2EytlPC!#H< zKz7j_NprfE{wvJWm)3j-nc{)Uq!tNja z8FTi+d~@~;%-Pe}@yHN%WZh(}eXjAf(IQ+&Gm%FAwZKZT7Fdh5!0(u=wehbaF6fV} zIr8|46X??adnBU%f3LH&b=0Sj)?p4HH&D(x%;f$O-uys$u%i689z6g1S-78oY&Z|P zfO+d8=n`bzWzZE6-P2qH{f7RbKDveYS=87#UcbE0QXgJoDGx5OKkp~9mxhb%#oY_+ z`JMCZ+3j=e>8*1t`Q};ny7%gd@z?t< z#vf!DUvFUy4#W7-Lyk>_EGC&v(N@WGh`{P_eh4)dXlaIDg({g zLs5oFm|LIm{NJ&AhZeF6%e!$oeFAHn_<5b!ewqs)t9OL7!u=OrZ#0KPUSkcoX<9dy zk^16;{9Q%rPH&r!d;DuG)&R-dg4Zq5EozRUBUh;i8r zW0&r;Y3!12kH#+Pf@tiLzJ|sw-DA<%oq@5XjvZbEHUHD=*oB|HpufQ!y2yhanco@r zb2NvxV>_m_W?LuXo-VirBR$R<=rT7XTjcoss?{WDz4RW*;*%&XvEJ&?Tfkyv$NS#{0OByqCyc;6Cy>?j!%Wa{>2}=UFoDBcI?t z^6~XE?8&VQ>}?iqNO9cGgq_Xwz7qX_7stYHX^)=Q_q_ZZSi-*uVlHQ{ii0(UR{X{x!y7$mz7}@nk;GQLxuin&LvQm=S z@6kiq#T7mH9)r_MyRnmtyFz!a>SPW;f4+An>1EonomkV69(~J1tn0?RavMJBXTqUR zUp1@&+X5X?W;z-;_sCOz8Rd6_%p-j}tvN~Vc0&2d#zSkr?zHw4>%YFV{uFCK(jSo? zbvTtDwC#iP4?+36qx@c6pL7yyQQ9kUcrNs}v)l7M6Qoz7^3&dn&EJ##vIUDA0~;o6 zMB#eaF^ASi`Mv*U`KkT?OXWxV(;D{gm!H}{Z~2dXqWrO@9sqUvd9Jwqm*mp#3~;u>Pk# z6J#?XyDja#A-f5`hq?Rddl=e}vo+89{|WmoDgb)GZtN`f5hg5#E_~rPeDB5~*i`mo z|3(~ay0nL5$7DC?q-E?aY{B<(&>rlyu&=C!ZfHe7J+}GB9-mzQC*Zzt2<}aWqHM!) zZ=%P&Ng&2|5Z3qOK;vf9l|$L# zp99!|W&Uj6l0od(MZRoz*g(D){cyx2mh~Dpt+_|e{TJ;^dj(XT|G?qBq4rrNjEzeF@Xv)@1&BMuBRKK}BLOO5~7 z*d)J?jZfNJV>&dEbWZtGA0)C{J11dpf9%&B5&Q#TR1iDAA&{L}H;N^M zk7OrS4`;_#4P)^uhOk4+{n`GdgV^51er(Uefo#`;{w#LRci4}-UMoI(`UZPPAqxWT zV4n@-!U)hP@S`Cc#y~CvLoQ5!T$m_i!xYGcX^;y)LN0`YW|T~k#1@s{shvEQ*di-P@c{piNf zanQcC2JC15y6nWpSvgtIe)BGn!z7zOy0(Q}_Pnj`!S%kY?!)bi`jKtWRJTFu1^v_}{vIUi~e`PfvDsd3TloJ2UMWRPD6bw*xzK z9PG@yVP~ejgWD#xgq@c550af3&xOIxyask=(zBl2G$&_)@(}C)ZdmWrGdLf$i+{?l zjP-whyDZ&qlYdKLR^{Jna1Ou=5|rGwFxeBiQ;M za$Ela*!uV5IiY>*?uEVV4s89m&&9#czX#9ups?bg{EkAOwIBC>d_MyAB+!0@cu<}_ z3D7^~>`8!%hwn*%9*OoN&@=7lK=h1B9^H(|{jZkae;DShKmWtZ&5N6FJ5T}pKimSe zPsA4Y+qK^wtu0&T`~30pv0 zLEB){i3M#3?ZEuC6SNES*KW`r(65-o;y`;r`!Ij)2OYrNMb9!E!`x-EpP#q>>zDV~ zv&%c#(@Q&8a^iOOCpWTN zC!*QSw2oal7{M+dSj!Ukg|i!{cVmwo77cli zJma6r@sw`v=>a(^TM8m=j2Z=qW5p8x?Xxm20b&sm+O1UuGJd) z(w2DVL9T6!-pvsSo#}e)Z6o^@J$u1*zp!y_o7IP9WuPPS9(n4Yg!*?teKlL1rdQSW z9MYaE(yfxsPTRLf`qf@{)n_+o?;hz`Y5yVVh&4ScJ%dSl){)SG|M1cJAL2UViz}h$ z{<*u*6MLfm9_%>wBa*II-P6~B?F)5>U61s|>b}11*q2B;W4^Z!&-q8;{X!e?+zIK8 zX@BBsyiq5hln zzux>=^z-7qCbUnO>%Z|XS9-t4VXptCcV&Ie-_=L^g?D1lv#S55cOJQ7&j9UvZpPpH zLGP0d$G%~DXXlCl(*J(bU5JcY%7z~|v0B9)cOy3aD>;ozu4j#zOBMjJ@CELG(VQC;9aMw8!k)dOvn0 zVj#N|-k)7q?ZeKk>dVfo_>Lvu+XE+;eT(<2d$S{pda}d#4#C0s-PnG-Yklu*54H#2 zB-k~hGk@=T?9>iyOGtaR3EwE#II%6>!`_B%2yVsJj*;2!#R2)B5g|)J9{oS)=if_aZT_0Jphm*5KO|Ci|IPgb&^|4o|a-P=q???Hd{$8D9k47!DH z$fzw=7io^BnSrWDxEDdj8-#o|}SDH93sg zjFIg%3Em`oKajtWv-EA759BXoEPW4yryO?u7Iqzc5%`@*}&J8k|cWLfjj(rRHp0T15u~Dma2B>gLt=$W{2Iw*CDML*7efz#m~j}K(H3uPj>hj_$~TmjqZm91H()L`?cOgvoT=3`8#Is%6o(p<+B|YDz zz58fkLH!H*Ki|3&V=(XaUoid)u74r_3*?{ryl#Q~FPQ%d=Kq5APr>@HVEtRL{x7)y zDY*YDxc@D<|1Z#g6zG2n^k4s{^?yHq#BXPW-k^qDj5xugG*{u6eOYwHKHM0ySlcKEYD zLH{l6@W)|?KRO?FczkO})qkt+S5)=ic=s5+W0C8>@%}Mkhu?tjZ*V(2-m^~cT3m^5 z@_tJH-QudM|JL>$(EAAJxif9wf$4K+dG;MZ|E=vi$a(Gz_IK^w_w?Ku(LbX9rtk1R z|7{B_8!V2s(skE{QH6k9_Y4puF?wKY3yP zT0aH#|7-Pkp4#Sn9Y6v5mumr?R9Ldbmxk#r5&q_cc6KTkY9&c#l7oZFMI%lj$q66- zp_tJ%B*|QIb5l9TRuWPvIQ|c{fUQn)(cwE!5&jYSh~S8jh_Hz8h`5OOh=hp5h@=QZ zL}rAv&T^g0I=6N1>-^X0*9ET&Sr@u4Y+d|@gbj%sk~SDNByTWo$lM@BT1F;C8X}V; zjghud4pB}~Zc!dlK2iFpkf^Yz@Tl0R_^8AvLzFQ}infh*h<1v0i}r~2iPlGlM2AI( zN5@9TM<+%bqK(ngM%#@J8=W?~ZS>gavr)e>WMkOI@Qtw><2NR5G;B0(lwxdS9Acbe z++sXpd}8!5Au(Yw;W4o>@iB=ph8Savw8?gp!zQOqZks$d`E1f}3fUC4DST7xrua>X zn+%(bo21RQn;kYgZFbx2vDs&{esjp?u+8C{V>icdPTXwRY}_nuvEAaZ#c7M%7LP4H zTl8B(wuEg7-x9keeoNvO!xrNfX{+s4$w4P&Vi+W^H?GfIuh!KYwe?4RgHhwqsO6}0 zG-@4(dMBXf$x)e6mZ-TM>h2i595sqYoun8`)W#0=aYT(=P$zfP${Y3aN6ms!w@}n> zIqDaU8pffH38-Zf>Y0q1W}>c^sI499>xde=pw8~R*8Zq>Flru(x-UoVqf!4jv_Jyd zAPKFIjCROGOIV^U?9dvHXb%^(h&$TE8?EAxb_qtygraShqjjRuK5?5-VJDpw4G4=| z9vL1P9T^)L7a1R!@c-H=L!LQ-APjR3c@j}^awVbyi9{kQ5EV$|N#sf7N#qQ>z|!8% zAdx4LNaRT*64~kZHO<#w(4^^_O;$`c?>z6*Ex&hvbYAcG=RObyRG-PDQl`{0VS3Du z^|3vUhwlQXT;vj$xx$sMa<#K=azP8CKZf03QQX7-51L7Fc41 zHCmi-#uYa_&~Ji9HBpl^nKYzqs-|wN^kbH8Y|;&12U_HLXO`Ct!kq-X|uLy%eHFk*0z&$Yn5Idt=|Qm>Y^^` zvaaaLu9DoXWIjvYTX%H6YHSnp1jYJ?I@dHr186K z{NHc{nESk%-LK_XkwF^++5Ag+zpt~Jk4TWM*ev_ zd7tFU-t6OjFpE5nC+~|~uT}|*ucB6t3g5Wg2WR=db~y0g;WI- zH&K?CZL!r;+uCX`R(smhV_S<{tR@6W5ae2I&>qA~b>gB%tRZ+|f8S@`%>~4^pWo;A z=a0{ayz|aG^UTaM&pfwzW;SxoYKP0=aAfm8opw0Z@|1sm{r8{$>EZLRaqEXUo*De| zscW6#mrtF&@LP+0wTte!dC?8G`D$*s{q{SezW=z%wU;eF{h0;dvh^i_bjvMbE8K)8kjOumqq?EDQl>7sHjv(jl*{Bu z($V;Y(=kyJT~3GZGM+n~j^_pz@Mk&dY1D5y9b=^2*Zo`Rbl4ru6!1D7)pYIa{+%1W zsV>ULorn1&?aA0P;~=H~`5cbwa~IusL-YoR}y9VbxWsjrmtpSx)Bq8dJFoOJQMikJ1rD|geacTiAp zY-58Ur?OdK>3KeShu0H3&V*U3u~9S zBGzQ%s^&|Rh2IPq!v}51q1jO4N-zHlLRNRU;%(#p`z6o%n;GAlV^-{4GR<6THy|zS zHIumxv*ECi<)S%eGH{kz(PG^HKU6WTcC}_O&!%Rh@xLS^S$mcle|Nu`nAVdzZ|xAt zs^~C{DIEhKCTBX$iuR>abYNNJ-zztjO3WxsO*R&7I?!} zt7&alhdUjPa58(cX}v;^N>wNCro~uGn-@$;WG@I=n@vkbZ82&yzNsWIKX83u-u!v3 zYJJ4v*ruL>47aKCVYAz|36cut*!cFDf9}O+$m#(3ruA{S;zi?u&*?xIM4D#&^PHuH zX5wnE>3Utd(-tTYG^(5ELuG0Af?(o;(oP#At!Cn$LcbYr&*6hv@#2!n1Bc#^$=Q9F z{0@)=lee-~z-07pGg$`~-vf)&dr}vy(^#|=SRVk%n9^w`BN~yj1d&gLtRo<@NMKk! zX5xA;SfsaR;u7g_;`Rd5+M)iW91iJhg=x{rFz7M`g;k)-7npxNsQPYLkhBb9+NN>@ zVfH`&6%eLRh{4)uCi9XGrvsWYlUI1m#85M7dW_*&>Z+4yJn4R%k7mMU(kx)FZ50T| z)Q=pu{z-QIy5rOb?46R`7SPPtOawe+U8+kuSp~Y0Oka=F-v1#|zuMm?M+&kA^s*m7 z=Z~3`{?~0Z_CsKp38xuv@pOJk%>iF+dh*EP^-=N;DQO+1u=Sc0SKBGx-Rg|ytuN4X zy+b_*e-zA@m{yx$Y5p+-0Fr4Y!-YPT#Y!}j`M>!tqt_X~mbQEGIg4rCYsNpzS#q9f z4K|Y_<_NDf8$Q#kwIFN-dd&F7vqHt~kQ>RKaZAUAptXs#U)pT8P1SU4CZ>89Fk^bU z)T$ZB433e~pCabn&B)Z_?&Ey7X32y!A&ShV-KJ5w@#q1`dV^H%Df9|cDhQME!ApKy zSpNmXYdBDktTQe5r$1tprJKw|Q!UH1vh!AqjXC;e<+KRnKXu1?hhw! z>f(QonQW4;p|)mWS__PEL0;0$3#OG9`eBxKT^7rJHHgMmo5^|m&G@pO9MhOi%39WC zHl>ZmZQw2N0tDr#wAx_2$w;+2^MJISH%>;C%pb$U7}rQSp3gcL1S;AVPc_ywZw|Vv zg)FknikD*Vn#s%3rri~|9IUSerZqKSJnPUEa_aAKS36=?hbvm6*M;ILEA`ItYZ&AF zjs*706>2{XKvewi7=8>upeN4mmEcj^nloo>USMjqDqk2t_Tg36d4aisG{ zq4LCgn1MUN{Zn3}@moCU(ouyDpyW0+$8wp52SGt+m@@Xze3_w@1lFF+#89Av0@U}Z zlNeH4u&{QaOqkG2u&|Eqt>FJ7{C|r7Yx&>40bq{Ayx+nZZ+f~^mz!%Qf`tp|xR0)u zNmofFgM~WZlvJ&h@C!AU$)A!Se~RRfud;MYWofez>y>t|PYJ9Ot_3zeg?j1X?etK8 zN6Sl{y94#>JaF^0F zlu%hBgY~7(rZ@F;s;`Gv@FHE?z^rJzNTnk(iPoF~-S{N~XoK8;K^sX1uC~(yfwKlU z(zsU|7l<~soj(BL{s9mn@UKwY(o$6qG`O~v6dqxgZd2c7Y~kdig~CKa*0o5!y9**# zjW1%|T@;Cf8l30c$o?J1u`;Qm~=8?;qO|Q^zzq?y!#2?pdc;l z5P2DScQdmJ44;P4FYk0+82jGM!NMZoiNL(B7eKJk*9QgmE@IPXgV`&z(JMAf5Sz#J zLDtDv`|!4*`_MSBGBQ`o4{Mh#F>Vq1O6JeSCb2UX(Bc4@oH9&ntI7v2Xdfp^`Zm&{ zio9ow1oWSDbdY*aR3~)Y2Vu(c)7?Z^&WyP_usEWamGQhu!bp&0_!KSI%(cxihM?}=fS550>l`HCq zEu(KO1Yi`k4z&qw5M}B5qve~e4D|DBvm)>8hn$X>*KBF=E;!VZPRE?BX3G|D=Mjjt z5BEv;=R$Re@PxB_qcb{0D+ubR=%f9LiA@LV1g&Zz6QjnVzkmbAW65FYL$GRiRKPt9%K{BI$wrj;zEY*Kfl|*B8onA4w)-Eth|-Ka600LokpV= zK22L4rW#)R(jfqUZP)pl|=N!Irb zlwQqqxIFc|oX9}+ge-#g^twjMiT=4;^nzsmhNfQTads{<)_I6t>-8-Q4gwaL@q>?L zL|fDO_mfEHuhy^a>j!5$gaCZkn&~qdB`*<17mOb$TgL*UTpfALPmb1cUPdD2?ZZ={ zUS=vyE6B=AxL^E@8pqikE6Jh^pifFtTy-IA3Gh=Y@7QNQbH4L z?k_W`wa~l6yro%|#;4?&ZP`wl_x^k<@3z$fIGpY4&4i8TJ<^*=#c($>nFdv0Z&O*T z){oZ-Uy)>7k<~R=XZ&H_fYS<@{P=;NtJ zY@S^|=^sC3f~>ub{XZ0d5Z3UJS9$XK0*}q^1b>~n1IYh%EN6#Wpk)m>zz}R%8@UE8tla(J z{~?U(%$mGSBv{!E@^HP>P%ggM*!;CaskERxP!O9PF5YN7J8J}5Sb^!ZA+Y>3oTrkJ94uC{dI``~V^lZcVKYwHV4~voQyR`^-|(rIlS~X^XjzUhoe{r}I+U-xOVL zVYYYSdbXW5hj#LsB|XC1HLta_xpkXXYEVtqI{Xd?Plo+_VIJu-E~dq8+n#o|Zrex# zwe{EJxAr|nHor%+X53S#-nA1LmqN^?&E@W=Xw-P9S;~J4_pm&#mS_BoI|0MH$Zu`X z`#%Rr!+~Z9(At|}egBoxtS{Tz`tsT9P#hg<6D?>XyDPAECsIvq_!|QT8|nP>C~R6k zQL;{x4|nhpnW8z-IQasZOzht58 znP`$`q$4^ru=WvYRm+&B71GZ_=~ku&_FgsSWK}-e2+!HVdeiyu1Jmk&?ZLJIC{ifN zM3OMm`AyOwE&0>=i%7D}^WvX7qn@PcQY~7^d$e$;NZy7`g0Ok5ofm2GtL2IG_)!7C zkjvNEtJf3zrdeZ7G+phP_3Ghqx^> zI+yLUvPR*rYN)7LeB1umnE2fV*|Cw<6~5$s`#-z&-FQ#dl6)LW{vYDN()zI0=Wto6 z>%D+Wpx@8;D6uI>s|Ar`U?;~Ox(y0UPU_;3IssKl1~dq{FVh)s^_UfJEb6osZC2xa zo0jZ;CC6^H>ux%x?!^+oLz# z8nm_st*+87df6C1uN=CQl^baIc=}DZ#}f1YQ8{#1BGO|WPR#itcC8uD`|}DI%Nbph z(}vmReu5WAy~8o7d63f)Et*t4D9aH&byBT7PIf)#%{cql-!0CMONRN)@yJ)_pbNF7P@Ga2k_)S-r5d~G2gf)!o&oM>ZW&%lqcwU-}o zIyQ*rV#fC$X>)JnRj9ko{TwOefk>HOlQh=9H)8Q<3Vqb({z?C*?~qK4eaJ2_+K3lZ znTDJ@&6c-(=FpvHVvdihV~jXz6YHtccUtSkt%hEFmis#D{b7H+-P7g{kre)ra8D-{ z=x*^v=f&H7ZSE3YSs;8km()5o_jc0lk)(sCZ=pY5(m{{BRcwi!uN&BS@y6JxlsR}m z$jLjzUq9tuPmJv(N$J;kq;e>*i-fWM-IEsQn#TGr%t-eO(X-Bpr{$@_Xeb)~F)v%?=;c%LVcA2N=HEGy+%Xu&%ONN^9H(xLldAHjD-^yQ% zNl@vdo&6^+9?WCH6?~x+*A4 zK|#&JMSW(|>(SFhJ@jeY;zxg{8OiT0FgXP??FIqBxM~I8b@a3f?G#@^IAQw22|ol-1(HpV?08USZ@jvl22I?}ex;rn zN@e;o*BVMk5&3_7mt_KMXw#8$Xd@)Psn*s#kLRBVt{fFk&Ttu`!+5^&Jl{yCW6H`^=aujb7w-&MQ@+@v5>v7%>4^>rSXrU? z#_Yrt5AWUq@42v&NODScunhe?R?XL}=rzH_3~y!mkf<4|Il*+j@-?lP#XE!6jBGP`xu>EH`019)ikB9pQX>*Gy(vSRlrNv18bm)5Q@pg|)V=rEy?^MK z-fs+8RbT9RKXC<%;5s$}igC2uTF7o+v&;mu%iIZdt;{M!OR;q_97a&ZU~Oka^Y9u` zH>Ka))rbbbj}KTDBsFIIG`EiGI9^9MrvSY|web$+2JVNT-ZixvEP#m4;8Vqtjb9+iRUv$A^85{kd?G@3fm)nQb& zEJRY6iQ($|XenmJ+_{T~suhy7%(*FX5GH1N)KbYv%$?is+O_?j86Etvx>8rJn;V;; zX6njSb45(D<8}>N@@G*b^Bxh0BU2x!bNYaZh(_L`kN@Wst$T|tH&oa6SNHNo$vc!S z9rBAuMht?!eye@*Au(49_u1TxM{TzArGo4!XnBTgT!@UU)dIabUi~+=Tn@*p_w(qA zSHD98o$+erh*uvV=W5Spe+QteJnF9AHmrGN>b4AEb)zJ#%gQvj30s#D>@nTLzKPEP z(|4KGl_(a^^uUzx{jr9{y21-pqGfO`sUrBsjxa8JttsHN&%vjtnG_rfHgpRdYO!nr ziHx^(s9Qyc!a%qxFuO10#*bDKu@18{jw}va@2k~?#GY6;dm`3FA!~kFr1&4*)3O%? ztb0wP33nw!LcK5(>=5ubydL`uAq}g72CowcDzRUOJ%Ns7yhFFmqpS0mEa&S5)^Zr0eJ-kU9(!*?J zN4#Y}CL4p(8PFz->1qb1mD?I}ZBvgR7K7F>`AR-W3Ry2(BU(e&bbrY8mkcMHj-~{< z)A^TU>8gjRl5VT0Fz!1CNznN`jh8leKF1?u-Qf!rALx9HbdX&V*On=LqfL+}Z!+A) z_kt*2bh60A=I901OM)2CVpga{~nU8c0kxg976B&WLMMAia|vU&|G!=rQh_ z!w@u9gdY6RLkaXy20f5|+YSy2TqkrPYvZq{_4)NqQ2(8!Uvku7@R2%@@#;yr#x1cS zY7d{)hg8UX5M8C>rKoI<6M_*K3@2LYxj5Gw8^R!{aS+eU=w=K)+G^Soy?MoKNRR-J zhH^d6SH!=K!Obq3Z@h>L?Cqt{W1vJd_KQq5$zTD)P1h_Wai~b01F}=T)G6H#FD+Vu zBGd8+R7`U;B~eLz;gC@yn^YJ9aQRMf{d5@zUm0 z_cpU8%XGEGS+Mtv4A-Fj)m-igS-FG5HQ7TVu9lDsKa*Zd8NO8xt7w>f`P8ZVqbD>> zj$FobNW)|qTJ*HkiK>AP$LmTQ%ROod$+U@z56kLvBHTcx?A@8xwH`HFzsxOC<0c6! zv*%{AWX79)^ilYhp08p%k2TVlCs-JcoOj4RC%#>`y8I%I2`cG2xM;OA#jPu;iFOmc zd?B;<tGhr-IjHY#$r?flll3fMXt+8hC@r|7JO6zLOk5nas?p9PS zZ_x7olhOezfR60yg1xymnyxnD4Hp$l`9Qk)YZ?exv#>+bFI85wE_wnsWdvWbHm0(y z7qwlYjgq4+5@^nr9ewt9U#w=t`j|1Z+Z?t!OVfe!I#1My)YL)iNUczEL{4guY5g^5 zrCDf3<6Ta|i<;8W;p!?rV}_eGQ$0BIQbZ5z@Rxm?=$ES~Qhs-CY;gJA*+w#?-?Hx+ zY)#EIU4ZK9o|;`BJwMPr$Q%8JX}MiEJ%k3~;6*|ojHa=KN@i2H(Rh|564Yu>Ra4Is z9UZbFMXVE}ad>YTk1jJTH5ri3=!}pxhXQn!?IIfpeq%?ZW*TkHKKLu4m&UF^A7JFGY8K#s-Cr zL}3Ec11kp=W_Ndt-g0Pfx&`+g?q917HLO`CxJu?09qb+q8T{t9AZS(Rmc!J~mOq8^ zXPo>wnLn%52>C0#=olKv#2OryK;72^<#V%_F}#DRoPbr!T%E7lzf7m&${C%AD=2m| zeisIIX_5K~8>(Tet9*U|YwSk$d(E2pbiX5jqfnF%7C1W-+f^RnOsSH-Y6}Kd8{c28 zzrxN@vh&!_9R_%8R8?7K4EDMeKgXOa2WmjoVe7Yr&AI~&=&f+l^rFc{#M1j~$l9iU z(IvfJRk)KP^xm|dDQuV0pnI6;U)D|&?Q1WL#iSIJ=s@|i%GDj8$^b9*My%~&tFiED zJ|J9Ht}5)2l=aFA-0;AcfIw4}DnCdre-J4>Z65^OO^Ph>OR>`z$)|N zpTovtpE8&HZDE~o(}n}$pJj#oY!NF&Tb#9F>rY+4AjCIpJ)sF-l=j($bs>om*+nqn z<00!~bj@n!K`8?gj4wCg`q7irdct1fb#+IKrU%ejt>tF?qpZ|8^@~h)bcA|@q*Yg^ zR`YE0Yn~oYr;SxtQJzJEuP*5xu`!*Fo*k;Wl2w1Dr{DH)W=uV&n0mdIj8H6!OmZXu zZ0EeugaYUg2ffj>o|HAUPiG(uPowAV5{J?BQ;XH zOa|%uRh^#OKfd~`-tjFV zHJ}&912@U1WnB*Ae!qNb5*IZQdR=0Y1L~xU<_z=u{BTun`+Ooh{+~HYZ zEN{j=5m`}D*=)qqRJAHsF9;dScZ3tm>H)DZV0fn&EHEiYOyCMa>c4w|G=S@dIrwf7 z>9BPvyR>swWcuzC@jMgZL^Ech@JKs00-eJ~}&@E|X950X;EMRus$ z4hluj#BOUwy_yBP*eGgvt(x8Yfy|&a(TlKHezCfQ+^{v3o%a0_DNt+Hc*3qX88ha} zU(^LS?s0>jXU6%I9Z2t>(!K0!&>f2S)a+rds-#(D``%jzT8 zaA+PyFQn5MuYrj#Q#-d-t~%Pc6~VWK3g7EA_*dn6eHmX{jws57!1JYB1ac_p&kk6e zbdW}_Dnt$}tcWxl_YH?lA@2OqS&*Ob+5}D+p-~Y>sfj{lOD?ScvtWnC^aK9d7|;|( z5Co`V)R+^06@N1rv&X-bg6ez1@ML|&{sWg!t+;$X+Dlf$CgDf@tn1o&t$#pa->N!4 z;cGIoLQRB}K-;JqIDou2Dxf<>JChe<_oC3MpHs*zpX-eV8!pkh|HOt%v@LLfCRJ^o0}@j$2(qwYwo5y9 zxU7w~ddA6`X=3Ay4hiW*9KsfIQBLE_n1TCq`J&@%S$z~?$wF>~X;X5w8vnjt>Z`x9 z)axq<@r^$X60FJ<;bh(;&k-HYif^a=Y8j_2d4J!MuP2_{_%6;!z2<|m=wIVSoDwu! zpXu4tvgki##j!Y=Y5!?6QMp!qEK`@su;$r$|3_Xt<%}9qO6`ymyv9C`FWbp>p}GdEwD)wqvqO8YyL6KkH z^y#dm+8_+OYJdb9oRL6-2TGt2o|^!=LcgH;XT=8i(vDjUNInyf znn1ON1QKQ;%e6Y)5=!_ztj+3*$Wz9B3$+S?mde6e^C~!M*d%m()WT5>--PUsYlC3u z`AT2cp`Y)wr(J$^w$Ugu->kVaTfKEa7*u=MwcTiZolF!-!>n1Ft+wz11$B@ps9UX1 z%C1Hc7x~(qQy(4DUFq=J`Yz>%tDi_&G@zR4*`}*YH1|(3d1&*MA4g}F&nKQ# z)gGs?WuL$}) zMxzr@pwFXz0hbJ0&0*JOqfx8^8+~_p)JpMbCv%Hz^rbZVwo3cSrP z5AsCEoAI`6Y4=D#Q0W$=f=^IMQsXn{>+tCp`_L2{q6%G30_$1tse;no-1soKxubi?b)#9z`8T}TVCsr72CR4^z>l4E9ONZ zGh&9>aCf!1hoZxR}AN1J}5yE5DZNwnlF>Nk9)!eMaN&=^d@bYS<$2p{&bRP!@(j&}x?x8>@(LmR504 z*IdQq{L`iueX-}mV8wPLIiE`C+khi*P^ELw3eO=+h8hf7Gs^;aABoD;^(RV}GkY;`=r5WQQiZJ02(E~_84E1}loKlyV)Y_>#_p;{M5vwf&2LMzkq29_yZAzhxVG2=K zc~KVh($?o4sEu3Ghg%cqi_u54Ta%4|8_t10YX80;5GyDL2xM<#VLfSSt^_@@PP%0) zl%#y>A`Dg}`cC*$#(vR<I^t9M{?rG`Y-#oG84)s~$s9No6I_kowN&^|j6}nY2!m z1vF(ew#b^lmn8;%U(lS zc+(?-HS2K3a`6RE{bk{Pvcjj{h{C`he{cm>z^T=%_`jO}5ApvI{y(bz7mW*7v$oF5 z)X(fUpQb9)T3Tf$o+(rs_ZYoEIIfHIdRF!Ch)7Zb%nX;`JU2S3tx*qyMNTZXE^pS# zGV}-5iV>r&RO|rt5>}BoWT}Z0xhHEG2Vbt+RLl07(O5u1k&dh?v1!$IT^8+COxKds zJp_FCbOTRx;uNU%JJh2jGJcPQSts5R!9e^u-4`}+MAhG}ju2rfr@Q>&WC$}gP+-l< zwg#v2!pTc{omOC7nQaYA=fAK~6z&@(Btl{jXwz;uERu&!9JLw7R@wAU?EK75(K+$u z>>w0c)B3ytOHVQ_d`(WRT1SW2&EHG&>L6KR-0iAUcv_;aNbM();aBus?cz1F{Drg{ zHVL61=H{_kLQu7GBc;S0Mtl-G*HeF=PQwOlzCe5t5vn#bU~9q?TnXE)BG@GapJ4O0 zyTutjtADi}cl#D4ag0_wyIZoN!-(A=z$K%G`T&sq?*J&&8fI2Fd3iSAihf@bScyGY zyTlP2rG8IzaGT#RMYSZdYiaK)`Vg{0>y>(M zC}8zOtQK`M-Uh1!7llVfshp^*gRZonk_yCo_VXoMYm#+J49;3?*LSYZ*sk`ft`tS8 zLwnobG!v@|>*<6n?&=_aOqKPfkTl#zpWxc6E`{JxWs^%xu^8(D@k<&c5} zF=8d@EkVPHhqTy-_Ko2-?<&8-6P;|< zAj4cEZTb-T_q%jjg1KyQfZA}BlMk-ftVdx3OXZyUke!k2{UE9UPD+fr{v4PrL1=w3 z$3BU9E2*?zgkL3B>H6ybkf5vk>)2|5r~qgmAg!@*HBVt^WntMZ6@@EYaZlk~h|W)M<1Ah$T6k*PsAH?1BfEy#AhUt(Y}aY9ol#K>UK~eefAVWuC>z9SnbWr$l=MOPh)uV9a z%qHi9B=sieD$V@Gj{UF=7e&!Cg*QWaRqfwo%(>D5qvkTq!Oih|oY{`(Xmx6TmRWP1Gh2Bj!_}&}52tc*pRK=% zP1xJ^OFyHhre9>ej;Q$NJ%3=6Q*#_T1szL#o8~=ig1*O|CW7p){}xSRSC}y0e-(j+ z2O*Iaf78{XAU)z96EjBi(qH_rD@M?87JKsI+D%YkMgbh|=nT_3;cKKvuj@aQ7!K$$ z)Z7@t=1A{H-V!LuzA6)4$*nK!>xZqsg%Z~mL=rQ7Faz(=`#C<5zy9+-s64+rl$h!% zth-on`cF!uRJWH3F<+D6X?+kH%Sk4?5&+wSV z8`(SeTs*MI)k&j0#%5n9NR*@Xo` zmZ3M))*^zr)6H_$RgVQO?})<*IHjQRi?`83q7P2L$?QAPmeBfqh3Q>1$gD6uOLErb z0qo_od(V**;GN9B>05Hjpc!AykNN-7`o|5}M+fYh#WFnYzMaqMR!*oa+M}Zbh5$iF z2Z&hD#F1EIO-iN45@>Of6yKTw)=r!Rs#7}eY;rl@_J)ob=+g%V`bPTWu6z;$Jt_Sw zcu;)1kZ4GUUxlp3bp1xBV|AzkSCd%ivaj9rB#8)j4{0~O6@$S)dT5~(lbE=np^AM* zQwv2>w?wSx4yi&3qF@6Gy&oZv&VTb+z@R+9zm})-Z{aQ8b5(47FgZ1cQXt2>4P^Xr zj7G*tu%v5q{;|K_H0~Ipzn4jWA86EVoADR3Llp;%rdwGZkq4g9{RYFr1cd|66@sZg zir87ytw0$(5DNGo%pyzY7tFsAAoo7QjUmyj51Poy1_Ez2~ zoyq`Rq5%znlP7Q>C)w&eEVgGd|1%!yFiYwfICl+zbBc!3uQw76Pp3Ml$xcNwe+P+m zXfpzJgMj;Qy+ZdeYxK;M&OaAeDNYpa`x8xSHm{kxteL(&`;0=`1>heDU|MkBPXc*E z6OGaYnutSPDqUp*Uc(+5v^J;nchEfne{&yr=9HtzI{L<5>Gt2RU+@3wyTm8i&LYwD zgeUkB64>o(H=Ando$7NQ5-);WMt+?TSSwgof0Eod5l~-W|9f`*4ZS7po*Z5N7^w4) zE-N*TE-#xWczRH|5k=C;@lpep>8Gc&blUD|rklh10LpyW;$EN6O8&OcE8iLpbiw*y zaR0bGqwhEEXEv}Otb?4uARNi99z=+|~Q14A4%y6Hwan`zU0pD&uZ zD?#3cxE4&D`km?{c$|!Q64CN&Syz(g`Y7Z)=gUMW`LqvJF2P9W@BX9oUtcS5Yro$c z@fWu8r_JKTm9>?lQB(+*=D%A*?AV)=LwjDr0E@7x1qT9g+Vcs@QoqY6;@aWqQ&)f* zo3>a?Hx~Lt`PY1x^VAoKCK;Eb^+J1J{eF`EeoQ4<6E>}84xWz1gU#S_)`2f%VL%(K z>rdilfI!l8s@qxX>3sFHjIdp2%VL6C{vTQJj=Zr9sNW~2PLsI=9a}{lqB$Dq z0Q=YGhm7HK@Vwfz#*V8Z1aB*dF-ym8{SOFy&sM&kH&&X>`0hF<^Cr0X>fHI5HS4gt zcrh=|9$@-ku6&E8N&bLh|Dy9#sVy-|9+aHU_hgLLEhs08J@LA1BE4iIjO(rNf;=cDV+xHf zgnHZJmHVzfX(&r_kEC_CH+ok?*>^}rZ)qsQENPBj*HA|J=4hm$>_K^6(opt2d498@ z?ECWcHIzM*#dCN=*`Ih?e~tOq1Iv-Ra6NDwsc)`tl1I_{mGU@seWN^1Uf&>(6W8A_ zkKFZfdAQf##{;*qzJdWgIh{Y6nNQs9O>vhDM_f#g&KyLhnYhK%c_Q;}3u)BMqb-7M z+bs9FH!$tn5_xCpr)lNSyObGx$t=wuLyk-&6i$#F2lMot<+-IG;Z{eH+{x(AusfIw_BIz)aTB1ent>~YjW{Rp*>q7rC1nwPXoZ#`@R}$IXiP# zBr6pySu0K*_Lf~Jeim1uIhkfib$68OAWshAv%nOnpL|-(K(Y6)In8f8^dhGOQx}EO zIift}tjt;AGSjWb^B0kAZCACWdf}XK%y&L=B}sG)P-0K}>yP-NgZMi*_DcaWc=Ob> zBL$cpT-LHON8%~|LN6xzqS+G%%cf@A%AC~4lKp40BkUgLgc7Gn=R)c1LLJi1Zl{}a z>E@M2{o(7P|ENEFTCAjTW2``09a46glM{b*dvNJ)G8n|>T`J|}tUj#|+U&ZH5zt|H z=mBXyI*mdx5A9EyI5=7kGREt%>XEL@F`mbsJ->gL>9&EGkb$S$Iu{6=v7vKtTA+8H zMwWD*&BrsjXD*xYn4`HPGcs3{18w48*QbAbjqc4y`%3t#_zTv>m23 zaL$R-nGFPfF)%vR#aripg4s)x*@!8wYXCg)T)oiMA+GM@Oth1O>6LzFoO8T%IN^Ss zzolDJ-y%e#jP}uuwyMWYN5AWWPZJ*>DN_#tTQp(5suiTUD08yDN(~*41KY8OwM>sM`$l@t9} z$9`PeZEZ(o39KBMDy;u(5(g5TrraC>^MTw5EeModz}aAKNF?|mu+qzo8Xb&%Jw}p4 zb)D4P$>^=(30OIZbu`~3vfE6*NX2tGRGfZs;-u&VO_>t&`Db0FN95ueIv5q>rCr^N z^;x=wrD%o{lSA<~kIG{VVb`ar-^jRwdg9e#>cTOsPZ;Y58jd!b2qzVzNt;i-C~noK z?Ii9;EHiZy!7RdiiIJ$#$k2#4Adqh0+-Kql`+O2Xyf3exiZnP%|hX7u+A zE;D`yziCan^g5yTw9zE-V1hIdk2NP@!*RLH#?}<|0aWys5?FpS&mvJqwI0K09y^z& zYlH}2$Y5%_`u@m1)J-3tukKFC11QHy+%IO*(tZo+O#45A3F!7i{q6rqiYDB@k%v9L&czh_8eK~K zi=Uar#J_QCYFm!=soC<83q8g(rhmzdM^Em*o?KpP*I89qL3Va5Yzl zxkwCH|9$(!^^@AKhQ}IBaxhDC+XviFlEX@{JQ8OQHXo~$BOs!-Sozz7&RM+L7eNdfmqtya9B3d~F?+rru1=^Kqi?J$h z!T@_SB;4@(PtYoJKdJ8`lv14911>@-?7s+QRPRM7-poZP+LZbk2tuqBY_2SVV7NXu z8TkwEKGG_jtlUqUrN`AR$vGX`y2jMwI*`94Dm&C11{GiCb3{4y59enfRr6X|aw6S& z{bGC79VOyZaz=}^TdtaK*6Qc@+w#7L%l%@*)A`H9K(*SfJ=~8)5(q=36vo6Aj1Qb- z<`phdhPQ*54e{6Jzl#bkNVt$f;9#6sRcr_8{B*t}gBp*(IsI4Cf_#QE;NTGV(K zd*)$Im$a@IGpTe7w;`lE8yQ&XZvEoyT*?c5fF|TtyG|X6hhG9cb>38=s9gc8+169{ zPcCi`m%FC{E_MRSaHw>rnaID0SG@++4bY6hDc#+9ng%MoA=%*IhTdPNCv*SQ3EU^% z%*nYW8rhQgFb;9IBIu|Fx3R;AAaRKb?Px3?|`DUy0u_zubQLjF-OS zNpi2z7Bb|1BKv9EQ}Fh_MMjv+VOH4nxIWn)8~dLkaFY|RHF;3jN6q_l?@9Mhq!Q5&vMdKGuU8fC;=q+xmEOhN_E) zQFEXw^R;!K>#f_yGShXBkn`2L_+z+6BC}_fiD88Om3|PGIOhV?ccXD3AaGbb>=*lN zCf49Vv$Ql)il5?IFYXI*T9m$qU2g8#j{Oy`*lK&5&EkD)<^CJ9<#VJ&hiQF|py&~% z;UX36F)Kb_bV@K;i9jY$WV`xyKvov#W7Ig%iIot;VRSd!?jE6KyUd)vGM|GA${6B& zl-?bh?1WHq_l1&Uj&L(SGCfqxviJ=GAqLH|7AwPQs-aPD-j@M7(=fblV)7!E>x=Pv06Nms+} zdbzbQN7cr8hD=7UPBZqSi83u)Rk4oz-KrK7kSOnlUl!3;Wl5mCeCL2u-!2pS#Foyh zIbPK(L#@0!uztZqm(k)B_ZDI^?>e$z`r`!~6a$-q|{@#Lk;%=S6rp)ELQ&pJB>N-@a>=mqSA6ms$_DQeO}GS^J7QH>9K#cH~1CXnMRR_GMxIj{{!P7}m&IO8g> zy2MUf4I*-%%Hoo~_N;_{**v{~#jFopBeRa(_37X5F^hMB+~|KEYC-dHM8_IyoEK*g ziOs{X4yD_pmxIYmP5Wc)?a+q$%)ik3^bz}CGJD7wX=KKv9{wzC7JgU(fM;RdC>GgV(nJpkoewToLoVcJOD>jU}5TMxydox>NY;Yd^pOU!)7dccxMRQ71CFHtE5 z1dX|c?Z7n?vxF;7{+%FH;CXoaSsCAWORN^^v-35jCTC31Z^=1D3lb~DkdRlBYCkGmIz+8TG%^Y z5d(@b^It&aul^q_%cDjrUwTKlKT-LPrq+!x8P?UAdY-6kg=*EP{+GE*=mUqGe5qDx zjcon0P#x@lG1cGuU#e6`|4W_P+V_&EmmzQHe{Ti{>NmWD0$&CNpc)jsDy~R={DaIM zOuKh5>*A<4tXUdblsR22if;1hsWp#d`qpD za}N!=V(bJfZyY5lQL7ucjR9m)VB6kjNe(>f%U@J!7G`&gj* z66xD(`{r%Kl`KOTt#+3Rgbpo_WC+n^soSi)-|}5||8qXm{e=U%e-8uUK6fc$yGNz_ zdniYLI{22Vz#*(Q>Wb3+YD!Y#_qw62(*3Qf3T=eqzoxjj>xrevY^go1F9GIqcptZ;r=5I0_)CSqWf?Z?q7gCS$Qu@iGJLVq#V5&EuGi6ck7DM`Cm|y z&i{jr2heWg{`+i!Q~Us+GPr-`AxR3tdnaIk@X`87GH*OXR)4{%oN!+XP@xvNWjSAY z#iT?Y$hFksU{7`SY9F@FVC9`6-9nCc%i>fKTf>RDtps}c%g1F zD~T5xrsIXAy+YdSjTka(T8Is*XSMtkFeKY04uz4i<}$YK*k^#CV~Osj$iP^lPrfg) zL=W@%=vbmYm^1oezChVNnA)>mIgusdyyW2be1l_9tkAiOh#TF!Y(r$?dL6{9{7 z=UBQso!DzHXwyHMhuW^WqaE*_7yoYzEo)bh4TFjy(c*M7XI$bv;};!F z20n=Q3|~5EZ5~xy8(MvSn#@j__Yu*HHsz7i&9*DXMtM_5H_`Z1|C_g49oC-vDuU1mrO02uls(PSFPg{{h67} zy-FncED)6mNORcgGM^ap!c-wV zzwn|e3D1=6kP>~-}vh69*-OA8HN$GA0GSXcN(xt0) zm-JkG>*%?dYtIGKpm)mdDO|{0`0cr1G^_xO`+*_B+QP3cWkIpXcgIGmztdTJH~8+q zi3!;GILO!McrHetldC*YWaY=vnxj{uI8`lZtE@U_GAf>b#j?wlC3YVdUxF>Ks8{x` zToMqeTvV<7gej{W5$rYCuT_>OW%7 zpr<3(xf~q_*ZY{9T)Vf#mz`+yNF6soJ$i(mi7rd*>JN!B^Tt}mslzd_{! z(GnyvihF2;t%DInijU0TXFQqsu=R4p+N9QHK5oz$z04C#)_KC#Qev65 z8%;lv%<_w3#R2QDNi$oSG*Jp;%28`{V}{Vg6!yA(Fe@-W-J7~CTzpYq(8aw%Ook>~SvWP+MY+S=Ti#p0v4T{NiSCvz1~ zFO@FRm88j0VduS`6u(qJw|cj!DRBGVUj5TIa5*M_TPQq@$j1`VSuOWxXCvt4mX0PL zdSFCudimJg;PfzX9|icajnh_UedC)G$1fei?I+D#Cf~ZqD?aBfdL=SRn`8TeE3*Ri zJr~EgFmf6Wgq_j+h-L4?NXd_Au=7fw2kO-~xvZ?dXZ+IKPzKo3&P6W&$~Lq3RaW8S zW|~E@?5S>S)MZagd}0ZSwUN;u@MsR7{ysdQ9X0l9?TKSgBk)4!mvV-?E|*xHGVXE` z;TkL~i9aqz?U&ruk-AtJXKKMd`Zxvbg_;_9oKIZm1N(Vg25<_S{w%boVK6(JnhB*W z(x;+LqmoPIwulZFBvwq;xM;&C4IKL?!ozzyQ5wN5#}y*Q7ZeIjpmzYLR)$z5sX7K& z&;J$tU(F~VQLzuCQGBfZqg!Z?uIi}Kop(n6=#D8caCFCf(xaO#9f*9P*615Lmen`m zTHhg~sxLn`Hhg8kiTlVm@!Z%Tu87Nuj$~Y{DV$qstR5Bgdu?gjU$*R#s7Kb{FXVQx zBv*@w8Fz7l`PQ=|>?#jJ)<-so_T=OQ7xaI|vN*_3fffF751hwrA3w1wcOKMpC zvPT>?;28o~fWCrPrG8nvLkul0H#wht*_TNQ>B@npFTW=RA1z!VwB4{tNWA~RlNjBd zSFvt-ZSMhR1F&sS8IDrbMv406T5%0?eGMAgHE3wp_&OzoOf-cOttn`APRb|)fAYH1 z_?Yn6%0+>-S6}0ZV_&oY$ojZifM`IX1iZ(>H*26S(ZZ%Zpp}4`Tydk;@CPl-6fKO^ zxMYZE0IO*uW%Vjk$C2a$Rs{KK4HiKj{q+Ea>S!UZLrXF^VW3>|uYXXbR(v=O2UZJe zE%%-?df7xhq)dP`4vWBAH)%QRQp@j=pr+9K5$XID_v_v#xiWyOEFT9a5_D2cLBb8> zhE)da7y1tp*DIR{l2OH#G7BB5UZ0!}qKd4w7q&k)md|gEaqZW1Sq#1m>8Hw7IoPJb zlgnTO_PXf(*h}_yJ&rCTWwmFZUfZds_@K`A&JZo5dc;%t@>#A4?r-40IDu#F^6t-)$KL(;uR_GGHv zr(LY7#u?e)~5W zAaT#p{KjV{uZBuK{o{J(Y>}+hXP16n1h)vnXMRw%pSu&hU;kqs<|tRN0H)Wu~18jW&` zigcM3^}IB{!kKQS^@`1lKIKL?bokkYSF*ZmeJNkiSTn_GtZ7dTt=PUecXKeemK)Oo z741v9WWQi#7I*jk&6=7m5h!xYb_wAK+u;yJS}!z{O|{@b^c-PrG3-{#_;J0`GPO7} zV_M%AR1wbxQ^1{E%Lq%Pc#)_^>ZS5ysz99-Kc-ewErU3^;)7JQojS>fr4QX%&gjtk za6y50W!Qa3D!)66I|Jn1w{n&H4yyBGV_R0NDkvZ+Bg0%U;~zR>ZK5%&H&;oCAiZ69Spzj^scfb5<*^0)Y0tnRztiHNP1fHH4*i|k;Zu&|V zX3l0;^4kcSUD-Og=2voVM(*9rY`6MXa=1ksC++G70LGj0Hv~E&wL~sp(kv`c;m_7r z5wC>;*A+2lH9{*S;$bx!@nV9u%98c?ZAon9M2D_`DN_;wI!rs%PhP6W0dQ;xd&m< ze&YH`F?_p@SeT8bI$-Z|1Oz zX>}ogH@nXw)Bcgcj9>9Ac5gB5*d}rch&bER+eBf3uN`y4tRIe+KbA7W(S$8n2h|54 zzw~vhM@ab!=qQ{V{}#OrS{z<^F?ox#yv%6ih=e2P`V?8tPre*+FG@9}m1cqC`CvTD z#n|(g+YE3F8CqSb=!u;xY}-uyRM=4B`ho?C>&FN)H=b?Pyj(aq2E{Ur>dv>QCd?6v z=KN&_)+Q!Vgw&-48G(NC?eHut?5xD{UbuFAurS;+%dRUtGy09PtM&aR0a)wsik(YG z6mLx4XTfxjl!dkVL;J1Pl8u)9VQIV3J8k&#ebWt~dg?&%!L zyp@l=6K}84^eHVtah->b9oLlGM2*}W;anSsQfEUBf#-#pgp*_Zp_aF^Bd)Ems6g4M z=p|*>IHTo=jx3QL!HVXkg_Ydy5@`5LB@6h1#rrZdYbLME)$=(sIkDJyHh5Ccf__zl7*MSLXw#(EXOf9K@S|T#92vonY=)v#s2ksq>MTfO%^rW_Jz1k-C*$d$mxwo* zhw*IotkXBk2@SM3`yRgI=p?d|t3(mVgp{NA(}X^Pst>_+F44TF;qU|~aj7ra@RtfS zrJlh{a|7$2gr)<=FE%c6#}A(q`)29xRB^-MM_z?&d<}dLALaQ@!(mw~ z(ZAVhL(CO_i*pWVTza=`n8+IST$OAnz`MbZ&cTS}(ir2vHkPI{&5jw^?AlDT&5KHD zHg#sENuIjNf=rVmGffV&n~V-J)*sA)B8iW~&Zul8&Rs4*;w}TDvW@>cIHClivJzz? z9ZmLPL{$1KMV6r(&8NFh-et#we2s74pUzKGqLLf=_5PvJ_)F-QD-9L|%S)nTGN&GR zxnNqX+e}_CjXNQ-c)c+8j$8{yb=mFYJkQ|)D`leC5I6H-s#5WwB zY2xU8kjr2)`?Tk37}U@(s4VwZOGvG)9sPic)IxVY6yo5COUL!?P!8Cp{bKJ{VpH$> zwsiU{=O1vh_q%rWoY^7L1FpR0d?$xKUXyS~wl+qnq3`xeVHtbp2FPXoBv2Bv(yH|a z)(<-&!f_k;5aQC)#yS#VYr$-3Iy@YAHa6^3`Z+(7o8M=JdgPozJP;I8Vks zlVs|>Be`$GlCa=LR5y`bHnkr^xQt9Wj2#e`IRL?)_y z!ZOlP4yjJK)rJs#K4cAwSbvWc^Q%t#g#IqT1*z{)*`fZ%mOln93)&T^pO`%DCfZZs3QzJRE-=kW=q=4s?8FemLKugEeh_VD9@ zf`L~gb1jTQ{*A-mw^-Rw1>^_l<#sIU_W>!+*sanVF6-DwWa5PX5Pu`rfN-A;H+u^p zAcn0^ak)<|yWpZ;A8_*0EcH4!+Sp4gIvuAeSM+CzH}}!KLfWyV2&Ygo;>2;!6*1lN z!+N84o2T#cueg(1Th$XbI`dQ%FxIDSj&r0jK77G@>LfK!pySoI^+xMM>r?qJF$vPH z?eebI{p-D~UoIk>cl3E6mZ*CZ%9`eBVo#y4;Xnz<9sMN|HO9gqK1$Y?U%0L*+gJY& zd+!1sRdu!vPfid*!VXF>9*{wT20|o?hhRWwU;-0JAPQ)(APFHc)Iee~!@-IK2b8c$ zrLApgYb`z7+A6-a2x@D>F(_*Ah*BkZV#o0i;Vs9?{P(@qvu7qF*1rGuUH|uA*Z)th zooC*|&wAEcrAmT*+jcU3w|9(zJ5(@P<5n9mY{wc7y8s zmbc{*$2s_F(1XQDa%mnemh3>n^!Xuo(nM-y!k58^!pxC#V>L@w6J+F(teYJ9uzC>Q z@`Oqd7PIhi3tr-7HWhy)$hT!{pw%LoI^Grz!&1gFE%Fx=XU zb)sjWf=KPi@-`H~$f{>lv6;Jlbf{%oZ)@N|47JUJX43f>k1}W{Zv4B3=X;=n6^$8t z&=()P#9EJT0ObKoJlN~kvNSa~z)Z46LJOnS)tqz?FK8BmZCf#WbXb`P5%Ti2-pYMA zqheb&>*+RZ4feL3=mjkboN1DXS-#Sy_*(;dM(ysW|IXddl{@zLF?GY~t$b_so}~>1 zgKkA48o!OYjO$vaA}r{TbDL+|8N@lZ6>%Or<~flc2k~Fv?i1M|-woDl+c+YL^IwM6 zYGBTOU*CfL{tLH4Od1NNZiN^&6inI*!7%ohgfbHGVHk!tPz=x5?lI7+LN<3h$Y<+1 zyat^1PCFC>ek)W^7lkBxO%rpOz{xZI46C1ZYh4=l9-N9CTv?E|0bNYv2yZ2iLs@qj zxzj0>vr2aWpJ?!|yL zDe*a$Ja59gnC=wkqv5+1bFG4L?dYqFY2(^JursaPZGPqr6omKz3eNb{InZNqmN7PJ znSDbUkKV}?`bK!ooydL*=B5~@c-v0)!goabg9+MzRto5vJ^QlP_FCiFmyg9hFP2x? zsRcfd^Z%OS3nm@n3v4jp9gg~XM~E@>U5;nZFVEXP#<5rBOOS~TP!UJ?ei541v6%mR z4rXHl2W?aw(gqpJ!ThE!EU-Ivc@E~UG+#pBG!Q~mUkbLOoTUJTGIGI4YTo0}1~0d( z^hN&@%6JN+666DB}mve*YS6GU|7#^&Y;T z^&&$2OPqF62q$YrBTdHLY;CDyHSQ3_t7d8eo4FKq=ZH6uRe)v;A7Or0eppgfGyfj-xW%QK9slh8Cb0$N!*_(%Aj zsoyv8JypMR5yWz+_i*(Be{Vze_yqUxy~bE@@h${|>a$}qi1&7@8pByOo&cyDY@J;* z!ruylmx8J_dZ!mE+8*=cLN$%&$~rEXupY)d#rzwK z8_wH7mr$5&E=@iDbH-VS`wh(<=F1np0=YIei{d{zr}uDAuT_f$4Xvcrd$c}VoD;eP zOe-g%Ty=Xd+~XbE?wjt#U;-6)$raE@FuVnAShL>(pZpoPg}mGPWIA$_gOrd3=s)Xr zC+yve*6dvCnm5Twr9azmx8t36;4ZK|9nBo)7`{nR6oOa^Bb&9~QVCV_RL)&E@=)S= z^dGyle%=MeSWiQKJiKA~RX0!bS$7A%-U)=J<`@_tPU&7bhLJ!dTZ^$})ACHU$+gfS z3w#vbmN>nmU$llpQO;|Ezb5!=g1;?Qa(R|}w$h{S4q>~Ixv~>6vSCe7^2(LnJ)zYT zvKb3IZgJ?L#!{&1+D5H7nHH;D5EnE% z5n9(W{Ill)J;t_38?}y<0#vJS8HAs27>J~x&9~5N20A5S6&(A|Mp@Pg$G)7v7>B>V zHC25VlOb4lol>P;=Oyf7WR#2frZWvfG*sdWs%HVqk!^;iAQyj#De^OnD0_~!VVX5@FU{F3w$^civTVK=w8 zD@~bmn5Q)BF6FhK)j%3p0p3EIJPo`>Ped0mE)Q!Q{kfwCtJSh!zA?Va0o zIb7=Y7=qTMkt>l92(r_+ASn*)z*;#QFQL}$oUN|F-ZMmzr`zq8q!4n+uLAeynaUx0 z(KPD=#pM^Q*IsApBJDknq)ggNFL2*aOVM@c?RMx$2ig+VPyPteQ|GVS6NfV=Bc(GD z2AF$=i>Hn4@@ZrHOKBWkLcfQ1b8C^%`^!UjmMWtd5CAd1!P6dnym<@b-&C)E80YqsmL6>}3lIj70l@PQUXTOQzo zE*c7KcT&?9NVT}mXia+_p1>E*0rU(Cy0EB26Zs|FUh{l!!Q0sAhVzR-KZC&iZ zN(y!utKK5d)OnD{x}S%4mH&c+`U=XfU%|G-eDc_Owe10-5&J~Qm#Y-x(Ej+Rg)(LV z@kGe+EoGbF$OHbhWc&+4IqMhT9U8RZ+UP9|Tq$2^)~4sG2|5gLuY(ScZ8b7De1_s5 z$LG6oTBJ%@5b9^!ZNPS~4_JtO{q%?rJTrWn|&(>qvm_N~Q+<_^6df6Dz2DwYOw5zf!yFt`OT58?%!-AYetm$2GPduq!4 z&nn0IGnR7xUB+2hIZIDiJdW{}9`~ZMVu7e0jM#b+0>Xr&9PeP)91x4Qi!yHm(dl@1 zx1kp6>I+HkY9xNkFdX(3uFt5a2w18M!Fp6e4I6Y$r4`uVxGn*4) zj{RcF80vhfKIaa%akivYFetMNiJPVaEd|+1|JH31@=d&wa3f53?wz?VYXe@*H`M8d z&_U(aSWH9L>2(5*L-4)^PVkyd^CrC0krPuboD(`9{r8pZoL{v5fH98Qj!+RkeIPV0 zeq+!E1MSVjn?RD_hplNjIbK7K*CTVKb0cTYAtRewkZvprk7g+e+}Ob)LhaznA)4cQTkn9n2gZ%v1(*BZ5Kp!Dwtb(mvm`xI6sOC=QMw;)2auJobfps zVet^oQx%$JUukRXeWF;WLBKy_z&zt~End{N(Tt6Z0x0Z}7kgWq4*Aez&h~|H5SsTaHN?D_1|34{fzm%MP zrL0B13GT(jK5df>2J zru!kDV{&de{04^N!L+y~X*R=#ylKC^Y5OdF4(Cus-1PCb+Vt^?4{A`6jV+Ca_5NPU zeNw?c2&CMcuccU~%8MQ$8;`$()kEqyJfTdLF8n}fWHodpN6A1AQ=1n%lQf!or>eKL=YF%<8xj*626@Fo2J zz&5dXFixj8G7pU!8-QghY77`BU_6KgEC#e|EXrGzF=I(3HOnJZ_J+Ti+yOSX{r!{EOsEH2* zU4-f*oc2-~3ItTo3P*qH8B&YeAU5M-5;VAw82N?-PA2+_11Ed=&I_DO_Kgpm?CTpB zIBEEjTiij&td=Yfbj2I19!ILMFt2Yb4s`X=Cs7BwdKs(krPawepAXYQbb=0R?QZtq zTxj!WQlLm}SeWChW0!`$Oa%ipl$*3}2xoEnAFn+N_Q5s6?C@H_<2GI#PygpwW56rX z*n8=Z7;ilWA$&59c2^mIW1j436q%0h=CL3+Z7=GAW(*v#@RtsGZQyj@CF8LE{Exr5<4 zC?q3}E2tR3#nWs~%?5b`<;h5XYkCj^(WKW-!ACPL)z(R2(o=M9-UGjxWThs&1fZ5h& zr9Beon`*XYC14Lr(y_Kye~R(+p}q}?q4?mnsCwy5m>*&%JiH~F?g9HOI3KK`^&vh8 zw5~W5o{)@#H+zF-29iH!Sj~MTjAx2Mwqa1GVTem-R3{Y48u&9CH%oinXZ; z1qrpO9QW_twtY=;YKd@dyEKSSPabu{{C@e&S8oftct)0l^3A&j0fa<$V!FTgbGz)URlN_i_2j3e} zCr0DqUKH^cEMDHs?in568`jFf4oATWUrKji%7ApV3c>#7gaNol0-rUhJ5V{`OM4y_ zJ@^QZxzQo|F~P(btt%Bxpt@HF&BG8CMqh-1+4~FX+e2Q~3-U5p^58yoc>%p`-}^*d z*FI$NYt}B%VVX&9$UR3Nc#bVF{P$LxnZYEe2^8=4R<^4Z(dML!;Kw(_!3<3dvRP(%hd+P2bef@Lkd#V zGBq!}zPS^?q#8n%+ zsmE;V`Y+fRn{kNBjI4aCeTZ6ux=HC-dCa0@+~gQ{&nS1n7k7^^i&C*;W%U6}gr4S- zAI3kbg~zbLX`M#_Ia=6!lsDYRiW79U7;c& z12Mg+*2`~mo^GtB+}rAf^>WC4w7NmpI2MEE+|~WLcz4zr7tg)h)5Tlc?fRB9jp9L! z9>-wMjXoP@b<%`?fji0iuHLA<$YDRHDRPeSV`x8nDNBp;gI1U_Dy(VVij`F9-ar2p zl8q{nfZO3vUeqEa#xYuc0@d(RG$$x}dyj%pk#bd5I!qu)QJeU1L(m>v*#ZGchLscv z^rr~4D<3tQS|A^ltp31v$Qw8nZ`_;3exmuIEH6WC{!^Aq(I>O=6@4}<545=X*{p2R zmb*eYp!iI2!bw(oOna*%=il(IjNL^!JByA(6kdi!y3@(V{g^U9KJ(?`swpj3U0!5j zFny+|;P?`!F&J6k^b1=)Lm79@WU=uY(+(CTz&^D2eVii8{h%1pUW`qW#$XQ%8I%rF z&s~#v?wS|Q58*KB_OeL-BF zhwbd|BHqa@SLL8Z4rLsf!RYT9j*W__7sUmi`7TEKa0d`7QinI^Rb14wCf>aUXH>VU zjUFGWt*S4oq;J-KN9Y8X6nyR*jP0Q%IWMnAdJ#lwfA^Zi{!uCBK37aBl;>sIbFQ7+ zJ)B%hySSL_^RN1GrhxLp*lZK!yVNY8rpdQHE^9(IlEo4=| zS?q6@pel}JeZ;?4aH*XC?@%j2r%bhyKEL24x~Kw}F+v>2jzO*K`rax*yZaiwCVAHM z4?;EVfPQQB=3oxEuLR;l^JEbw#r^?nQ5mqKVH+lc*{VK#7Ia3L;T|w6j^}rwx5G3f z3o=CA&O{PAIOl(%|mywei8h#%Am&{5Zkb+#2ZYZEP+c;4~h^0a$Ho z@aA3{hixVA1P7yFw>`~11uuI7hp+?MN_h3XRWlNu{=ukag=>=wAqaSj?KBiY$@0f; z1WgV3+m4ZA$kE&0_c$HFxG6SuIyTdOgnze-C5lQ$;za&>|zn#w`bMlcWTPkn{~+K$03fmn1EiO42WwL}Flry?d*H%vT$}wrbqu}wA++MRZB2)}q8v!R+uX+Yaezo$&NeshKf3>An49bFTcgtcQs@vuJ{ia0 z2AcQfd*9$_zN=iP1~21#8qL#!7xKLy-}?m(zVqK(Mliv+ zWltea>0JF0(u1#a3oh!b+Xe=0*9`JsjqakzY-e@BbOM{D=620R?IpiDJo&d^n))aB zjJ9^c+IY6zY%9t^?ZRw2a3X!lR!`0zj7f|o%f_4QzS|zfy;E_)Dx~F9eDF4s1eMKG ziNR8$q+k(Aui$u+-oXNrr^{{?XG!ijvXs6nsk0gNyLG6XOM^+NMy zJKENJ+t9|~S&!$(cpk>{TReZl^A|i%<7vawj^|}OZ{T?c&j)y}--a$5&ulz*;JFLW zeR#f)=V3g5#IqUCHasukc^l71c#hyXgXiw;n3UpKi|2cIHsJXMp5Nj5GoB~$JcDN& zo;`Rv@VtrVT|6J+!I-~`{806oQ!SSg--%-Ll~A*gankOeVD8ZxEay1&Fhz1l*j;1p z=(Kh`&W4?811-}-fn~`KsC$M`iB2s^K`(a9lYD-nQV#T@W|^-B4#nZ{J~%k5l0L)% z)X2s(aPIc6>KkAJJI4im1I%WZm!he>=3}H>=^G?_E9aEs#88|p0d)ck(zMkF?twN4 ziZRZH&%`WnJBCSj$D8{-rhh5!QKSk&Z;x3I6@(__A4><&w8c3fXVF2huuxcB*~y0E zns|=)cN9gG3ldtPBt_woR>Gw!!YQSSa5+SuP(|3b1S;rgv7v)dGa9L-4gybe;W4x? z#o^GSUP=!E!-nUrMM zxzk#LRVLKb8l?t;z-5bXaSQa$i~pLG<6eXm z(P6CmP6ivCJzWVv%tudsPPRVfN(hfThcTu0?uWe0y8Th`iyA|t4|Fk6-qpA$6HNA> zXFd32xOE!-LyV*_hFTF^p$HnN#phU!5eLa|5Uk|%6^us;umy&)A}%A2 zKmxJVxxjP{AmhjkEIGW0^_4vLmN<+KSm&|J0xn<;h#BX( z$}f~|!f^(#wtPCm%&&y2H0I9|pW8gB)B$E<1IbI)YD9_Ja~x^zkD7HECQhM@%yJ%lbJNWbadB>qF5=u}NiEAExM-OZS8(v29TZ~pg=U=FTy=a4oULwMI&jWXZt&vf8FSU{(y>^gz(zTCvS@)IVd5x;-K|nOKqY1!<{avL>zXIRwd;lNf!hcl z?y_;pzCJr{9v2s30Lj{JkFL+mtB7mWdKSV-VZZh&1_;5yoLcp^mLS+*f5)*y z5}iyaJ0~?I^Pb}`CM-c+7U?YODVZ$YlRMjGJLd5P9@=2 z?Ud3Lg)Za0;fSpB)+@Od7|J8cHGg`Xhg6&O78)7{TS7DG(@qf1ISbG8RvszgDJR%d zQi3zI3O|S5-b;B1tn-FKv#TV*DsC=3SZsb&+`RDdqPBm5nOC(=Hdh_$+!g1TYZ(i_OBvi*t65$IQ9=`iaKhpB9Zy2{!yV2G_N`twe~%6&Fn9(r(Z6XpxvJH z9P+yxizv^zsSY)Bw>uC@RG%0}9EMtxJ9ALG{+9~pP74I7HVi6hrH9Xh?H5VzZn zUjt(V*LzK2a&WNqy;m_k+>Dc|tH%uRF3-gmDJuA<5%@1v`rg#%wCIw2xC=!MXB%A7 zwEO`_mk9?Lmn$o>bC0&g$}lXJ=4j$y2OP#mp~!IFVQ*l<~nh^}Xoo*Kpu-cW>PoT)7reTrxt zB?<4i*Cyt>Lv1LPZ>p-Jj`KrsZ(U!cip$;aqVy)bjRbn~=R839P_Sq%))teV85t?d zq3y6&X+Xu&rJ||0dt74v%m;#dalR-x&|LUqdgezBCi9KKQL`9#D#%C#xjufxNH6^H z5!`FujJxH{lJk`O&&#Icp)41_+R7blvFrgew3qrD__B65f^;8%`V;krnMeH4Cow+5+FYA_L_-pQ_xKmo4$^0 zbW_c}nsnruh4WCMEAmz^=ya`h=R6RarM64k*qvys2kf zsy)xy&*Fj^2C6vDWKz0}cNB0u={pAu$%~tmSg^eT^Pzt>{4AIp$`~~k4D8K4ljgcC zCYo$XnWRTD%pQi87{}b9#xPu+mG++Fjwl}Ruwc!DGjD$r51vI?{bn8*fqPk8Z9ZIK zJO%M5_Id|Sr1;YVlak}ro#@rgypJm$D_bO9Fy(q-3PhXpvz!P3ot#&=;@x*zaU}tb zCY3^QPw#bSWz8D0W&qgs71n%S`0rQ~8IzGW>SE6=^+=G_KGf#VyHIeIGExp3RYq`d z%(g;|+EgE%_E5LxPe}rfwLHPwQo_Y#zAh#>WO7&Ygk&S|l423>4kl6)%R0l+An0_O0w1p(OR)=g{0)C{jhEkKzAlo7E304_JIbs4kqnTkCxYmfA(L&#thmx{~N| zmK+1iQ+bOk4?#MP8`g|f4|7C;3Fu(!aSV*GK+z5&lD0WIimtoi2C^m$zeatgvRPt& zQq=Y(23%t?;7aWpZ~WbNa!kv_(Ac;oeQ=`4@eXJtJPsC|%y;rkX*a%V%lLS!1-&@l zAv)`{uEyAk@k5~;WhdzkbOV#kL~DHh>=XG$%Rj*ZYZu1e_FkYdKT(U*1L5@1D5qoe z4N5Tmp)yUy=w)X2WV84r^zPnPg~(V%X@WZEXC+_Gyo7seAR7rO=l(Mcti_+|WP1TqSRfA$}gSBp2U_UUl z3)a}>4|h2J)d;jA!r&93j1$+e-|6V0jHA%RZb@9$KpEd_)@T163ZbiUm}SXbKZY%G z^1>%%MJicwGJiQ1Cy{pFmE0tGK33KJ%X$Xzb0}s8|JKv&w@`8o{-LMYohM=TL&X`4 zupmiBY4Z-jXas{9jP!6@1?Cm?SM#Hw^T?Q}Q*6%J&yKJI9U%|)#nWav;bJ~sQI&If zo%Ds)4}Wb}66@RQm4ltGZ5T6{C7o7p70D1d7D4&@-ie0{>rW-E6-3K$3r;Fgp z8i7~TyROyrT=+qbzV8-&?iMm9=IC49esZ3dr&@1y2eh@~mzZchgW~1D*e9!C&>iSN zu+OLRG`if|@$NNKxzEKPADjWjDy@ihKIU{&wB1STG0do_UX>V9>`A)P_N0_OW`IX< zJ;-*QhZG~^G~z(k37m=_yk93|G7^GL6dY#n9N2-I(=q?i`T~de+ZH z_CZ61ch$#CXJkKa>K=3q+lYyzr?#If0RF2L`H)=&?g~6Gv){yYbV7Y+h1~FYtixjMS<1?9I2|iH4N%AnLsQi z@ay|IqrV+_DqV@HgA;YecmrR?EuOTp4QhiSY$Vx_wxSLFNNJmu;tjo6?e5!(fyI^( zN?!HQb`CJMI55Ji?u&*5;*e8n$bpjrjn#9}fkC~YsQG#hF(CH3u*m$f+S8m9?1Gs! z5$&Fwl@V#+Yh!n0K&#?^mPzwXY*fC6T{N@z6J{^KuYpUQL)*OxCwLCQpLy2-`mKJL zpFvI)YHb>u?C>99xs8=YZBD_;)VW`gK^29z6@|7#3WV9^Sc1?Wj*3H?yf$`dqLvY$p>cj6t=TlJ1&8Q$|}pWCFA zFR}8g&ig;lI`(ilXwwcF*G41U53tQzh07h5N@4CM(V=o$OChIK#l6^UV!vQ)=Fl1w z^Z}gIVplI-Q*m7$1Z^n@3d7A{od4~!)df_42w0-edveX3Zfhpv;_j87tU)HYixtk2 zKEV>NUP;RKR{ne=YzjwzP;CC0y%?62Jk5nDqFh}{#=26vtSe1IQ-OJMun+EvG}awp zpI-S__BN}J(ajssezArsH{Eb^25z2$8;|){HmlKVP^g8;kWH-q9n7f#+6-sZ27Z7V zJ-B~zg%=$xZWhFzr_*`52VV#$NXnSN^7QzI;g|R zIOD#tOczF$o_weO&=$7PU02fcv3sslo=1c|JC)}P+-pl5Vc%!)5p3U`N*LVr-!O_= zhbqRBlv630aUJRzh{I*E?0LAu&@y_l3{B*XSo?Wit^GXjE4BCSVzErG|AZII3NjHd z7t45T46cS=H4CBb?k$^kSN@EgSBmoCm9pJjDdSp!u?i=HM5mA&BqA$i=Ocw|u($;j z9auI#h#F`+@u7Ey^Kle%<6^xkb`UJ19#I0sS(B0aeX`Vdv%S=Jg}u}lyX$!Id6Ege zdgZ%ER<6`)-`{?!N)KCva2_HXkEc^GfR#R;=B@^nT7v@|o`sab&y^g|yP{Y5a6LNb z2Cp3;)WeH38b}X188PJm7QX9cyy)Kof zmSR?^tzmS)#i;eLRU(}0^kS4=V8Qgo?)OmF>si;AqH!wMdq6M>K?fe*+fn%zj&6oP z1ZN-)c?QX+h^fDI6F!0Nj49p@PRE*`mL+jH2vXpIm$S0@As717Nc21H))QC-4?+}8 zc@x|7cC-W#hJ5!u6eUQL5dlsB(L&|a_NMv!^1tLT1bGT?`aqlBH5aWPXf>xp99URC zMGuHiI+&5?s}If2G0!@p&3hY9d9w0?Nobx~89821ycStIG*zk8xEg7bw)}#-)GQ@< zBgQzG1nB|Kb=L2>R~7s|VSRc`y;)sv;ES|df5+Hsb?dSuxD8^oF@;M2*qieLLi7eI zq1}yH(HV@nDS=>iFeKty0eFnD0_Swdg_8pgB;;c2UmL;+`QEbdbSYo^QlqX^jJkST ze?o}CL)M(vl!*QXD;sR#MEV8mW*A`x)~@9k>RJtb&#VhgwflK6LF-3BW%-rjmO+;t zMkBo%ZOgdJFh7ML9dpVOqY%k?#ohAlIImH7%47Z$Cf&F<#(Uv0oEgDW%~HL)ThTg) zx~8Hfs4g5cy_dfRr!5-jWuOqX6pHu9d-|6 zK6o)v_t;LNgkU<+iLu?r>Mj&n_ohU2)~#F7`8#sj&DURj&%Jhk&g<@>`+~y@*G@=u zo9DXMeybOb!aXxK-nf4=oVl)h$GG>;^n2ZYBk&u%7@LDd1)q7K@I@n;LYNK7aK2P^zIRFRl6~XH#To4?d5Jhw<`g; zZn@V1hK~y&b&Icu&Vr-AqwyMgfNa6pgqT6I94LU4H8?O3Ets(?vta<465l-V_}e8I zHS(&moxyYPYW4mxKl%vxQ!7On!R1jlF#jqRwArd=y4YY)WQVek0#jCPtbhhXU|b_d zBw!gjrD`L4Kb}q~@Vt6ewb!@@+Bv5O9lT%JSk=ai++VBrQMo?@HCCajnn3W3svTSG@ zWw*g%3PQ&uZqRhN15LY7(OGXFF=joF2ijKIokxtaK|_^!Sz1t~br#H&n|9hAS7v2& z{}1375KeBTc9(Xcrk^2yU5GqA5eKPde1w(~js|SQzhT3*i;v)Q2cFmQAl5pt95u0Q zJCuo|^oijiBU5>po#a%stOH3zGHyfk>BBD4*~q;L6z1JX(iaGD58n6TozHuCK8D$_ zPVGPUgie5M_lmfKoAivk?_)~KK1A}7!1SwU10yVa`~!ou|JmDN-w87)rDgAx@R6}u zFX4F?cFa^89@s}Rg)da0f}Wi*OVRX?5oE^SRwH;6C*-N|btsaZ$~^#El$w8beStY| z^?LusNJZK;aON?S>X2~j<7Bi>URz&`w)xt2CT;i9c0@!U+gp&-2iCZ&upp^>6<%KQ z_DwoZ#|kyG^-*aws9)_J-MaHoW5-oH4xPLQZ>I;HhNqpUK03Pd5Ur)LjqL>#cW`ZOrc71XwA@2C(C4Em7tP~*|KorhlA z!?@aazI9;ODC8Y}h8?D#d!LZfy|XKraWzBxBAAv7ibDLm9|0bn{rrx$MwD(C`04ZL zthSw}(+4f1+tcZ}ZqOa?ees7uW%82yIbsFFI+f{_%GoS{eOudiymx5pUIdUfTO~g| z_d(Dd@9lXsQid=2u9V@O!Lrw3wKb_+xh>na^JMrtuSdigHOhQ;Qax#~tYhct+n$H{ zuzE?@8XfZ&JCBy_L7e+`yw~-IVG~p$yZ(@SD{X_b_U$|{>pjp{)cdQmKHhnt?8BW0 zW`6`G54u@}Fnc@9I^iyDa{zu0%o_H0()VX2Dg6GdK@St3F57_ztSQ?bl~Qu`Wm*Sk zXY3~3*Z9g+JG%~Kj379fy=~{dQ@K-_gHtGsF7!vLeE2U%PSSpNuPToRVQt;oi|)f5 z(ABrvE}wM0LA(AdU61VPdOeEe0$BSl!%Hb&SU#8FMKyIO^8xxgmV{EBNPYOIm~7dE zne^sfE{bE|bB4z~V<6yZnUDaQ4H@MW_{Z$f!*SZvC{Z{hwrnWMd2`Y);fsSMX^ z;GsnnTF<~tTdnL)ez^oYj+-x`JI*~J^o+Vwj)M!AH&DJGgYXk2X1jUBgXLAM)^I&P zZ303FWn2xv=6(#-z8%VlL$rYtz5H`wJ1i>v;VOKNkdfSnzyd$E)KlFPXVR-*Fzb*hcGsEXajPD-mR1aymID^gHJU!i`|z9U4)0QI=`Nq31f5- zN+HwuiY`JQ>qT%8lgobApB}JBsaoOSZiJ)bwMSxm_sUSx);Y+qZh@zO(_z(xJqLYS z_u$Zhi0;AbSU~Ft(Oj_alZ4cdGLh=ZIl(PP|su#1>1dp zM{q@a=cwJ~RHODkhBA)f4Of-CY~A@7?cT&t{rxvIv+-S{hU&X;J|EB3O~v5z#TJ!n z%GjbuyLev?OS+Vr?wzJ-HKs* zvlnv(eY6F{x-Rtd{k<0cmF+KXc6C@;y^$d$`nwcz78K;(NXc`k#0bTsl{dYPe^V@*SVf%lIGZ&623xK^FS?9O=lqdtu()>X>tba1Te z*zP!-8Uo{#Mng+aGnL($pc8iSIKBvWeH+gONXNe4bmYrAhC~J4|56zZpnYm%+EyoR z{-JC>SCbta#(h9>54r`Y7o09o-%m+kZuYj+?1B8H8=j2e_25g=!oMT?O8?|@oF!s@ zp;)%HX)sqVusFNlN<`RZ$z09|U94YZG?&64(sY4~n2%Y9(00PqzXaTK1(vUf_xCpo zp9^%p4}1UPf%b&v!sk3@;asjZdeziYtusRUQAY^?m|sp)r^_LEtiU;YM$$?L5@VP7_`wO?Z4`Veq_q&X62XG|m0#CDRzi|tO zc>PN|3QY_f`@7nAyIRpuI(EC%hTmW=CK6o3=beX&Y58td+3}99gtH8^x}0q|6B%oy zvS40cjEpR`o&k4_>|I8-)>*6JM54zpYCIPBB-wcEqAW8p3+YeZ&i2uG40mvCHy(pz zU~4NHts!BvYUA>xw||IcaRA@;<85)u5wDTkj(;QCWWM56(iO6FsV+TutJiEo;Ut^9 zm=mkM3r&N*3)KrfhMD^I5qu0BZ2!gRSDs6AI9i);OvJ)YdUI*ACaLaYt?4)q8D`Ht z0Q-P9F%CxYV)O%T6c3{~G5Vf1N`z6O7-8f@kI67f79&guXq1j(hbIBEnBLg`f4pO~ zJ2}vqeg(FEhAsNEbtZ^Kau17?w$6C5NbF(JH=$L`<6(}_8CIK>Du!_|v<{;(LAZ|z zzlthQl$w5QTVfa_AKR8pP?#R@rY0WSmL3N2$F@1cAkIwK>L^D@L)&nh$2f-*BbZA; zU7(PfxA{>=5kzuA@G|w{Jfm@Z5E`nma6%44`#A2}C;k`7%8x<@wq|^kw9+{khbYmg zj|vFN+4%vlGcK^)<-p20%%6t7YG_C)J|b>D(ccVO{|w4oj)Of4(}$FnlbHRQy`@1f zIpN;&KKz(&r+a8?pgq3Xtvq8Hhwe}?qP)*cH^-NYv+*h%uQ|}$Tv}> z<#+Lr83@OAIPG~p*3II487=NJh-68o^)8mTcRN_sgMF=i3b2)c4~Vs7oz5BuK_Bi3 zfBy!ngl`-+s^dr1*eX-)d=Qxv6-}*vbkvO&E8l$K_`a2URy2h|L)(X*?)x(8eO}YJ z+--=#H|$uO%jdMdIE^-X$gZSJ8d6RXIP{$L4;WHN7fdF4i3npot{}oxWoK^Wj4112 z*duX$w_|9?ly&_a23r3eO951slWmvvw&BWC| z*o@`7*ep#gE_kIO#q=g8JYQU}uc03lv)~}Ru;7J;_w*6S;qcTLGc0y%88@;w2RJWV zS0PW3BwoVva@3Yz3yX{pisRHO)0Nd`4L;rx=#2a7*k((~t(XgpiNj5nl{b!sPRPpZ zN((XgGDf#idz{}+=vX~H(bpe?ZM6wj>Ei!=40EJ}r)NDeAk2!W zmmckZdU5lBENbE7Ci@-;j$iGpb{mTzo2YMR z=LX<|Fr$7S{?$EClx*A#anhUnhIaUIcxG!l&BbA|axL~)(dsmweWfS?yX?*>HayQ4 znX31(vlz)=sM9u!rcw68)?)1;+K%rLdu~Kl+>7xHkdQ{fsvfv1A%J zVHo$PqT`O17fmwP-CGXr%#wuX-JwI<*B6`d=Hz6L@zms0h){3pSKLe$KCG^KQ$1@+ z`$20w9(HiBd2$Nus$uC_<4xHP<$5SSZC`Ju!0-4(+V^UvKUX5`d(odAZd8!;2B+hx zH04?2ijTy>uPbK6b#I^Al8Q?so-Z~g?kOtRW88ZK1~h?j zoqusS5{!G_Lv6ysD!Z`71Nq{}bSz0bmh{UV4oAGPx)Gz;ooDLecl`36y4v_oIsog9 z`?jOJ7MpvD0*3};TfDO&6T$)g{zgrI+N$ZVI!V7=(cGlz_cm(!lU7ZC*$L{! zGCgAUuG~gaw9?WoE9rnEX0SejWZ#_;pzLby)aySon4L|31HVoRwe84}Xg!x6YSbov0 z2fwhLD2iW15q=Rx^UHYbgkqT%NZI9$B@rUh#VFYAZK`1Z6dfb#OFZjKZG1NzG@-;8 z_hHZ~1=~QuPLD3wbg=kNB@a_I&8WL69WS>!@o!!pmJhHmdc}=sO;^lv;$KA`%qP3> z@1{~ZE2p!1SQNSFu9WV|>8>8-lwqTslAxSwqEgiOAj&9`atMl@ETf4mqgI&bOg_pK zt2%h3(Rz(YSi&?S0otSy3Co*CBtRV+kpOjSq)2TX8x#jb+k;mjh2T^AIoLH@#LEIb z{kw7WMtV`eNWpP2$E}+E&@v;*y>=f2PE`m-0 zc?|7%e|ctW96t8fbpea3;Bg&18u!11O!ushXu0F?xY2m6aHH{B;V#F&mHgzS8-=zC z?F5y^yk{%kxcMwCc&Xy5wBRdN+3hyor1im@v^jW_mS%-VH8CJ;TR>E!;)!a6nFG80 zqq#-;4>SFTnf}8}|6xi0VM+htl{)>0SN_k^?~6+R^22ue`KHs)H=TaI>GUr@tkO?{ z^pixVKinwV>Bpz(dQ`WETb@RgHf(OYVT)Er*76&4W%biXhX8Xd&@}+qg=3egF7UC}#MF78nQSe-m6CBiXN0Y?8NFv^eiEb? zY9le`lCJ49^-2J2n@cd~Eb&@Dx`K0rmL|l633a{K{M!b;nsbw_@6f8btQ?bV%*HY2 zo|SLiuFYz!+wfwxY=PTm?@~;ry||_~9}N^22h^&7*Id1kAyEj1SxK?E8iEuA{KGYh z^s&;R^KPBT@B-!aj@^YWWDdkbVitOk7uVc5N*9xv&1ROGOY-sLH7$qwN-dI=$7D4_ zrN%7GUYTFnxUduFQR6+ZG&9jZMVT&jI+K2IK2MQ{lcmlf1e6gGTms~U7AQpH5MkSJ>gT<&)96fWdshl_j;f1PH< zSjZkALR`HcAt3)2h-DTm=flpSy*O!dZLFXb)vHlZ9`8BNZ=_AK{P9RS|o-os(V;8Ew9HN z68db+V%S90B)guK;B)lRfu7pbGwrKcW$ZMj^#~Z{DV*irP|S=l!$bvCN$h?w+E}e2 zXp8NQ(H1D7WHa*gotWt3bS?L#uFM~V+V11|iTV;x<=!3}M16+19xa2oLLUA{zq=k~ zO?5an{#n!O9?|qBp*2Dm3tcDlVWCe7Z5R5U&|^Z+`GXEGPpC&|nNXk5?+X2m(5HpI zCiG*WXN0EzQHT3|N%xh4CkibSS}k<3(EEh`Na$licL{x0XfNT*IYOO6FBh6GbfVBQ zq2CsIpU?+|{!!?&LSGX4w$P7+9ueB>Pda}Cg=P!AQt0(UCkrhXx>)FXp??&*L+EQl z-xK=ZLVF1x2MWy=dX>=eLT?sYEA$?rcA<01ceinEmP2(3Hf=qnac2y*-8)ZfdmDdn zQBQ1}UnJ(Q37xS=yW8*!P3yO4y79=_{lB(Qn>T%`>H4i_cW1}<71|P~^3{5-_SZT< z)0vCzSX8%Uk+W)PWmUazLER$pSoYnsyI=Y>;moU;@2qHOs95G)RJFueTeawRUk!t5 z^ffG4bi316SLdv)TXef)wqulvVYZ{uQR!%KEO4L=#Jl|~c2qe0jzzGmaa6(H=_thi z21gwp{$?n1r{l61|Chn#e1z5jUzG@v?w2XEI+!%#Z4u0TpjD2gaMy_U%YjNAwJ@mw zu2Oc3@a9*cIN^%!>6ZT&;lEE}Z-kG9%11Rqtwqc_tqdpPsx~Gsmm~cXVYWcUIbXS~ z!+*xjnC#G(sMOz~;=CQ^XUi9Jcs4FD4*n{UzWK-@bIY8Kf{7E-`z0#Wdhmv^)gf1x zJLVxxJ|)>dd-|gD5lLnA_p@Wwaq~YrL;h5`sI9H5tk8w4>1)cB4tkeW5O| zrO#-0-9j-C==nQ?6AsUW{)LD1^!ewU-xp7!P{(lW0FTp2>+v7!N$SUOTMvu>hk$jp z)aUhQ=L7i|TSu8R=f&E6vZOOlu+9Jc7<;eaKH|PiFjRWguO9GX&mGDo*_>Ui~^DowpM8O<$@s}>x4nI?{T?Q@^4B@W& zIb(2EjQi{u`;jp?F9zoew!e=j#@;K~PET=+eQ6Ay5#zor2G5Sc<$@C=fAeGPYhrM1 z46YY!^T!uszcj}F?il-~82eQ*_G@DBx){7Z#{YvcctZ?+C?M1rHWnBluFm>tpt%7a-?+^@$ zg8FsDxbGBfr!Vmmoj$ugN*8SN-zm7CgqJ7S&QGaen}79!hl%?Qg0lp-#@JhebHqM# zXit9S3wDZqx!_9#uMwOrc#B{v=<{a@rm7Er$yqvlyM4|S++SNe@&w!MXKZ`vig8~i z*baZGV7q*+7i{xqlVH2kj1Au_<=1ZCV%w+K`W@RI)WrCYE&m-7e}?3D?%a75jaBn) z_BrOxt(;#~SqoZU(O6kgE6#u$ee;2BgSm5kH4ErK4CcuB!vBh(0;-1u?XN&yx)!IHaz8vt9=#oYO5}TU;fG$&x^t2@MVs2-?I9ux@y~*qnty? zT4$pV!MqBJqbqkG2lm>*Rl3C=6#ogU=66%wN!0 zUt3XGwXkZD&$+Oo-p*%Ljq@9lqWKx=#R?u#oB*sP7fF53o8~?++H>Ro0uBw?yO8@d=b8Wg>w<^_i$(PKZeiIuHkb@!=if#bcK078j`{uy zAHN~|9`)T<(@=#8P^8*B?Doug$t6w%AHkJ%b1RlqERbe2Y(91zTQRhqGtjO$JyngB z4GZcc&4a@^p3TOD+KR@;C|hTR&#AkTXnQy19Ku)e;$48M-cVVyEXuQT;ha#nu%0cn zbK1ObqX%&ob1EEemK^03i|Q6FTUh6BbmIF}HP)j_E04o;zwQ#+B(wtZk_Bk77eZ=~ zE3^4rN2QV&RKcVgw)2!Ug7&qJEAU@GD*Kq}|9k(9kPK+)i|zYLgpj8__zxr z>lp2@do@Q)xY{}A3=?Y`-JJf11Hg-zPi&~FQpSQORrzkNsP$_zT8R1dXmgGuXkHX9 z<`WuF;8EeHgS(Jl6)vUM@Gl9nX?yHL!$H9I+>jW0(>-tta563A_uUx$Kn%w6QV;jk z?v3{U{TNJz;As0NamQyg{%Z_Qm2}wSVS60Q?{9zgD#&o=<9l%EGNG=a5cRvXp{}y3 z5n{Dx8$_-k;UqTp#CtahenQh4k$>8B-QC)}Tj)Q;-3g%*tivPWjudw_LO1teP}`j4Wgs4w89wAADa$}69+VG98XnFU z$lKm{$a8)ZQks!c9zi>nCEJeS(l06JFAO&w56w9KK1Uv!b4*5a9EYRaxdl%UTnb7* zH;MUlp|^lC{8@MyH@`8%S%}AprykEmcpC69txb5C)|Eo<1*Lfa55rl7hyGDcDGPHv zEcln8Oy_U#FrMGzp}VK>FkLU=KzLq}D)g8Y&~~AFg?0#iP3V51{}B3t z&~Bk8geK?ea0du=3LPmlPv})b^M#HT>JsV^>J?fnv{dK}p=CnLh1Ll53B6mW9X^i6 zaK(WU>x4cibfeHsLbnKQ7y6pe{X#p1b_-3uT!+iB`O6gS6q+qGPiVeSmr$?JQlaHS z>xDK6-5_+6&{m=Qg?0+Hgmw!(A=EKSr!!e-y3kCaPNCUC^MvLL^$IN)S})WNze(_V zp&Ny6651|wztC=>iFrC*sX{Y_<_RqmS}%0Ef03gEt1L6n&)tH#-HaN)V`9Ss$Mg!H z19tN(mO;I_PE&plxND>#+%D2@G=+JMzd>2x9sZR+nj;*4gP_S3iyRZH<~d3#8XWHW z2GC`W$%uclzt-XQ-|m=RRqvRF3Fp+h#STwZCA~Y~2Xm`s^w*$XU_}Yf3>Co{s1$Px8VPLP_7&KK_{Z6TmU*< zt$C1gwP`+(4p;k+U>#0l*o6*{#4ySm~dRUwwXMpwkiYuhZiPA9R7x>GB~J3uRoY!_n!i3!CZm#=5f8 z-_zWURPt9UlDkD}UJz`|qoEUp4V!g!J$JR$+t^``6R`N{nsnzc|N#_7@$(y^hFV zJjOKt$)D}t`TzMs(6sX2z^c{v-M^-Jt+}q{yAQ1Y-uHj-;17TF;|)Lg>CYbe`NO~1 z_{(4Y`ZvG*-R~dy!yh00)1M!EeA5&E^_M6Ay7{RsTc3XB*}wh$xz@IA+js2TwYz=K z^Dpdu@uinL_Pz4zYp=iY=Ki9R2Tq z9y@;G>xF zVV7Q(J$yvY$lS|E*=&P>2=Gy!**A+kpaD%I29t6VGx7RHA_8qkg7uD6@+0f|o zFJ7{A*??&^hZ z66&~4{0rSA)KQ?#ZMjgU;5?yAg?^K~hocbo&OVHasL^6eeQcT0H~FW$i5fJvKT3

    y9#~O_Yo2g}vqhrVm$M8+*IU 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 literal 0 HcmV?d00001 diff --git a/portable/launchers_final_proposed/WinPython Powershell Prompt.exe b/portable/launchers_final_proposed/WinPython Powershell Prompt.exe new file mode 100644 index 0000000000000000000000000000000000000000..c6bda2eb94b230bbbc712cc0038643cade461541 GIT binary patch literal 137216 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¬@i@U7XjOU0KkV{rPb}R`!WM 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

    JB z5V6MfNJ4**n=cIWRdCk`tS}BH5Unlbn}am|T=xne4j8ZH>no?=`+_0@sADiCGi7X2lxg znw&LxYYNvCt*Kn&iXP{I-sX#*77AX+g3rd3oRqwjLdafaiYw&K12X5E8mLIz3P@W{ zYF=t#YEf!ss;kk>=wb9W`Wgd`p~e_vtZ{|WXv{I@84Ha?#!91Wnj7TOJIyyOFfBAK z2GY3#l9>akEQCZt9^GX=>e25#(dYfq-y{A{^!WIU?2O!uf(%oJIfG^DGu<;iGkr4s zGlMcCG7Xt=nemy~nYoz-nWjv0Cd<-ixo3H1`DFQL1!YBK8M5NC;4LU|&r#7we zfb4}r?u?K)S=W(<^M||zLE<8y Date: Fri, 9 May 2025 10:46:07 +0200 Subject: [PATCH 190/305] now the CONSOLE launchers as said earlier, they may be moved one by one to the release, to not scare anti-viruses --- .../launchers_final_proposed/Jupyter Lab.exe | Bin 150528 -> 153600 bytes .../Jupyter Notebook.exe | Bin 150528 -> 153600 bytes .../WinPython Command Prompt.exe | Bin 148480 -> 151552 bytes .../WinPython Control Panel.exe | Bin 150528 -> 153600 bytes .../WinPython Interpreter.exe | Bin 135680 -> 138752 bytes 5 files changed, 0 insertions(+), 0 deletions(-) diff --git a/portable/launchers_final_proposed/Jupyter Lab.exe b/portable/launchers_final_proposed/Jupyter Lab.exe index e89d37c10610e34a6acc513fee492a016e37a139..93003fcb302c1862887a426517102d788a892338 100644 GIT binary patch delta 38674 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

    r>Q2gWcA{1iqfT@crSHcI}r1UZ>vSCI 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 delta 35698 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 diff --git a/portable/launchers_final_proposed/WinPython Command Prompt.exe b/portable/launchers_final_proposed/WinPython Command Prompt.exe index a1dae68b3e6de3b0df25939c0a263ef5df954880..6f1b6bd61955008ddc8fc102d5b0155fa3e3912e 100644 GIT binary patch delta 38756 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

    @E}@k?UBhD28U~nGVHD7M zP@rl3TzJc~ezYU`dW75h@=%d>rckLFEWSI_LwWl*(dz6Yep?1pCFJ?=}x3ivQ3@zfChbT ziyTB|{{Dt_^z+p1Ot=0NC*IF*k@p8m)dhQbEOFVtR!praRg~U8R{ZrrYgsw)u?YBZ zr*i79inl*psmK;F_>(K$zl+f_Xm(py^~F+L?Rw)Wx4RA(_=)&J6y*X}$>-67S6rz` zxiDAm*plx2>CWID{;8W=~_yB%v0TLYiV0^{JiyLI+o4(?qOP!RNKZ^C2LITYj z=mpRSSB80F)cN%!_li2TUL3yE$^IwcRdZUnT{G#`&kGx8^QsG&pJ5z61t=K@($1zY zVVB(5-vyR*?s5{|AyCZ=@XkT6@IMgK{P>sDCcyqaq?<{ zd5Ygbfc@uhfcGp zrm(Jh7}ry{L*gjLSL%jB7VEh&>PMWEdcwK7E(VO?5gpcr2Ed@(drJmBSM}JE_fi%t? z`Rd9`;ftXpA!_Y9;aS_M`)bW7?eNh{skKKhP4WM3Eu3AN68*!l# z)D?-{|IzCUvoUqiUZfa}{}h6=@uf~v9tqS7c0$m`FnUsjL$tcwDR$?1T1heG{GHR2 zt~;XfQLqPi1g^FogJZmvlt?f6>__{>yRFgP(Tqi=htG@om)o_Ngvi*0-&%@I`1EdK z^W_+OE2!L7Q#VX%7cc`qLN%-lxm5BGW7IgpWB@$472!Nd%>)eJ4?UyAi#&2Mq;D@@9~6FB+> zb^^o1n6F1GcYPsBz8(=0)K!~-Uv^v1LULTd2Kixnt-|pMrrq~t>Oz}h~}CPGt{XKZ)52X;-{0piFf?P6HdH?CBiYl zx^LWQ{D993@h&{x!wwW1uHQAVe{X7NXC5-57O7dP;~lIISl;pOWP1uKN=;WCBUIJl ztvaT}y1aBz3G2+Bcq zcx82y5PXR08ZtxoN>$uAQmPT@?tetmZYXqbvBLRRP`i+S2Gd1|9^6d4_g7ox$Hn5) zzijf;;^to+X1==kf6Cd;O^rhwV^ee=#s5(6!%D}_XEyOPHd>F+UOakh^%EXh_I2-| z7vL#>Pv@ie>pYElHuJU2w=jQ=c@^`Ing77t^KIQv5c3%36PRb{+%7%JiYJ+uGe5@s zGv?Qr`)Rl3l4N7vhxvcF023K!GJlkLA@eQF%QSAsB^fJfn7f!uTr&~OW0((Pp2B=8 z^GxQCGT+L)jQJksrG#X6BTt9vu2w-qF7WdJ8m}(XdFer&*WBb7tvr|Nn(}Kp zuR0_>nJY&H zd(cq5(B9ks-Or5avuv|-XU@)|ETXi=Q`}RxrwNFjQpR|BM0?7bgjX{5;qYo5+a+IC zTwntOyBPa%ctaBhp1t%8&>b&57RE*bwk9~b369q=Mum}Ml?{vxq%v-<`+$e21aJ?jY5sKiD^dy3h>z?+&x*wQ3?YZF}B1eY;3n&{0Y;g!I4 z%8iku15FI7n&2ah4g2aQ_;eFo!!hdfP-q6dgcOoMLe>E|XqV;ei1D;K=cN6T_1Y4Tm)=hAby@{d&W24G!O)ze- zv>G!q6ww4nHo?)1jZqQb1lvfWZYVBLMg9FcroJu4liR&pH$IP%{W+x zlIx%0cFDW9ULwOFg0bO1W!#w^WHD~XxR|kxF+LO4YAA&91;$+%OMUckJwC>tjTL4# zh-PdwK@4O1Ac~&&CiW?ejSOZpHYTP##zqqqGj2i7X#AJ5!YEM{W1|LY8RHE|?eXrb zmmrLBG-D$?m2nRaFJx@^FJo*&IHfPuu%Z(IJPnK^bSOo{=m~aboXWU8<6OqZR9(op zC5M+XHfGXBGpClmRNf>)HDeFX?~C&euLC;kg> zIZ*bZ_v<`}cTxsFP@wB=t99=8w$3A%8-BCdZyMWg(RsL3`?4OP!z(&ZS)y|zfmP4& zK5CeuF)|oXW0?

    7uJ6KW1d>8X_=5I2uWPX5o74sv^tC`m@ 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 QexET)!r?{V%B$u72Z%MOJOBUy diff --git a/portable/launchers_final_proposed/WinPython Control Panel.exe b/portable/launchers_final_proposed/WinPython Control Panel.exe index cbcd2a9ece19eff69f530cc0c6d758f87b707c6e..664ff576ae8fe6f7a44dce52b682503c327a850a 100644 GIT binary patch delta 38709 zcmeFad0bT0|37~3g^@*Y26Pk^bW~7WP!tywmjOX9ib-zaR=5%7MhZ%$4u%Ujj#5X% z$_&ej%8H~C%?fv1D$Ewj7Hl1(g{%y>=KFlz`?^ZJ`@BEjKYqWze!uJE#q&I0=XGA^ z+;h%7+uRxRw)^Fk`IX3>Ln^~ECBEvV&Qf!wMWo~{OVVrzuA$vTXSthPBF4zWqqgpo zrJ}h%_OPhaajs|s8jpa>5s{hU3a7#*kmbPd8kvnhZWyJ zSzd^-Ku_6uH}Zm@O_I`kFP%FpdzK_sK1mALlmLBYF+yoO&>n_xC3FG6QedOYj+owA zdRnb?wTKUf!E0i((y_0kNYX~I zn5?j?&UaPk5%ugvwdWx<&b^|K>hkWcIzLn6s#SABjYF-_J$oFgYpkrsRhc(@gwm^C zCv#fHJFnM`ZEO%AscWuK-7oE>y5hU3afi(7pCfB$m3tx@R9#nTURy*8S8g{o|A$(& zaCAeRuX_;1IUCf%J42G4pNw^d4ooRrZb?D8+B)BNCtQ-GjKsq5I5q!<&+@*ivxVwv zwMdNd?d0f{4A1Q-b>VQ;d0chk_EaZsIK_#3RGl-z)71Q!duPDPx}0 zl~pZdbPzA<=jaU6k5F3J9wPOLcnfX|(eb`e?Q9`peYz=8T5_dN2eHDZSBr~*lw4Nx z5BXkP*Fn7M6B_Xjsc@f#GM*IZ-BXa$u)pqiSKAuUeR8Q44cJCdW^rZjG_QRa$e+<5AcABw^?BB!&3|rt*gd!kQDQCBKmY{d<6}es%smKfH5aM*8YC7WWJ-)9F$~BDO}`;#-CW# zwT`0I6US*_NO2xFceG2%p300-gL~O?E^}(tHO}UKqru}TQe87`Db5_os@UXwk596B z^p~o0RkXU!V_th4RS$jC5vTno>Vw4XXVI>c+uWeL748G|j^qQ8IGATPROtx8ZcCx16P##xf% z8dA&&CsfyD8{go^xP8f8@|VYRA~8Ib<{%LfFvxKMjWR8rfX5j_3DYF2I?Ld_7>Id?@Xb=zBy6Ov#Lu~+<&%3+31;HkBAg#@RXT5CPL{s zoDrWt^mZxd&$`|RY>1_i_qcAJ?U>HCw{Ejh0@az+fYE7157o7*7EiK|>Iw~33n$mB z=FzKaF%~Bycl7HkKWfG5)v+#s#zNP)TK5~cQPq_Mqj8YQ4axaeshJO@IFstft*gv# zKgQL{t~wo67)qC!Gx7)9ax%H?mj0$X-=q4xa^LuqO7aAS-?8FP-C(t6m3sC{-46I2lm`tt zE&^(0w?2XnjQf3A zSX6$P(ONz2mrp3!WAcBvp*pv1Coiar`_Qi zVI&ybC_xF7l)y275_ClZ)tM8We9)MylJW3kqRMaZH9zRaW1iw#g#mO`tWOFW&ZhU( zbndHJDX!(dZ)yXNYgPKKS!h2xCF=V3z~^t{Nth1?IQC$<7;?o4Qa+n(|j+0?o-%3uoq{ z!wuB>*(cP`dbp{sO@bbbAn%SDqa203R-n73}0-Wgs!8q6IHgD^dI}^3}w|V^|@RscSOU-}J zN3Ad#OpU8wj@GWfRsD@>dFiy9l^l)CsFJTz&8@3+nAi3sjjPcdKTys8+rNSu4|R

    L5ZR`R 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 Z1#{Olp2BA3o-rrmWWw2p|B3C7{RdR1m4N^N delta 35786 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%0DlC?+ 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

    lM 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 Bi|GIW delta 35858 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 Date: Fri, 9 May 2025 20:53:36 +0200 Subject: [PATCH 191/305] trying a move, like in a game of D&G --- .../launchers_final/IDLE (Python GUI).exe | Bin 122368 -> 132608 bytes portable/launchers_final/Jupyter Lab.exe | Bin 150528 -> 153600 bytes portable/launchers_final/Jupyter Notebook.exe | Bin 150528 -> 153600 bytes .../IDLE (Python GUI).exe | Bin 122368 -> 132608 bytes 4 files changed, 0 insertions(+), 0 deletions(-) diff --git a/portable/launchers_final/IDLE (Python GUI).exe b/portable/launchers_final/IDLE (Python GUI).exe index 2d13cae77b53fe7fb0abac44de243a8189362e1c..01eed2ceb1d8abd7392722bba7ae4220f72746c7 100644 GIT binary patch delta 45470 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 delta 34932 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 RhVDdSx4!m8zAZ14{|}3`LoEOR diff --git a/portable/launchers_final/Jupyter Lab.exe b/portable/launchers_final/Jupyter Lab.exe index 98bb8bde1e2eb892eff87091b02f875179517de6..93003fcb302c1862887a426517102d788a892338 100644 GIT binary patch delta 38674 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 G{(k_Em55OQ diff --git a/portable/launchers_final/Jupyter Notebook.exe b/portable/launchers_final/Jupyter Notebook.exe index 5d59af59cff017f32bfe545849be988ac711610e..28fdbea3b86ae1a1b40fc44ce03c28088661f4df 100644 GIT binary patch delta 38627 zcmeFad0bWH_dmM#hNFPs0putS$WcL2L2*WLI4I~wG11g;#)&XZNkOT!gMkVjk5Z2Y zl^QnEq!g)WRygBOVK!hkVB;~Y$od#&dhUDey|xmczTe;drUEOXSY2D?`#He(I&pQVXSJgybnp(mW8Jq;8_K+)XYKW98vdTldS-P))5! zG5HW`Who*+Q|NyR6)CToB-KAHOC28T)V_7uQ?g{!9q9&ESxQwN>(uUX#cNQG2SWUz zr{p{vd4Xt^q|{!^7tGC^D@m2lkODR(;9jyAp|l-n3xQk-oiBJPc%#RLkX{*jTrGFC z2oHq8TVk^k+DB3(X(P~y|B7YnwS3`{W%DJi3=+yBdBHBZ{41riEHX@El<+^q0n<3; zwLsCV*+?ZlP>gLBqGbIp7B#clC)^`RXI(o`j#xD^~UG zTW;;Kk9S;8a$Hp%zp1h3%^RYT7qwtXm`%++-CT7n3RVkNhp9;g3&N5U`h5qJRW{Y} zzUnxtp1Z8}JgmmLR`ph$p50Z)=W1-VY93i*S1WYSZoBFnC#$hl<_(`9_o~OKtX6T3 zzw5>|Ht?0ywb!Zcmq)73xNd6fVe|Tz$l6imnu7*a*HxPH3Q6J2?xyDcSgRI{X{hsZ zjiN9|gIX{OntQYP%08;2rRog2UySwY zWRFaQ=dKjHV7Tfyp*m1J)qw&hIZ#H`F*7Vh%{^v~n-e#C_EFd6DO8JtJm~LX`fHnd zPu!Hasi?w;B*z2(>U%~ts*aQ69hVb(!Xs+(i22b+w3?hr^;StWnnJaiWJgV=CZSHP z-DsQKLF0hhW+$l* zRN`l@s(MKp?>L$0_$1MB)^!jFWk!vo<4S391+P8;cv0#PxDjI5p6~-l}c@fDns8?ipA*lfta7xQ-&qYgEUX zep-E=92MMLOLvri8nUM4%N03EZ1!r~dM(cDs4{oYu23DO_AkRz zKSWwrjd76B@8@{*>EyTynle@AHktwZopM|Hd&`pfo=S5-f;Fk&etR_j#Hh}76s(>+ zK@&rg_s&j&yhJWk_n6nNiIXy?knfIfw!rmw6kY+4pO-+hDnmH{o*QL~5`tJx- zinO#eb7&qsOVR=A?C210wU8zF@=qJ=pDFtLgbeba5^Gh0nmP5m**@MsF}5MeJo2RK zoMPnyev0Cw)&6w5PsWEO(;6hgeFxdEVBUAt_@E{H6C|osv;TO1bHMm$w`Eduqo!+7 z$@S{Vga+y!nD*|kJy=oq_rWSK? zB2q`c_O8>i6&YIROLL)fe64FA3aUC2U^E^yr6Do*FKXt)Nsfg2@#`ux+mCey*;I$U z3RCF{b6W0TYgRh9-SXd5#|KoO_ncC5ue&o-%mM34kZ)A1vkW{5OUR=Sp(>Jk9!|_{ za3`8a)>BeO5}21%v2`F4$6Us92bIXdAB@) z4vx4K;5wqmCHXyUHlR5V@?b`5 z^|W0(sbr4L{qd&i*j7wlP!}tQAe&RP9_7%|65D+`Mb09Rc6cmA9656|B2*X=1~-aO z0wqPT+bBX`L{J@B(TRtQwJH&V9}87(gO~Zy-!aUSoNF+Fu8C=$god-~eKnQ)YDSWC zrPtfq#N%9(dS?|nfKG|J{(a^0M8{WZ?wRI^v0tnln&|jKb>3dn?aRmBUeq5)I@Glm z!Ijn%Um!)}MZK#UdjW&-!tGtd9J0Xr_GY5vCf26j6qAA5V;E7EfrWyH(22*3} zSE9A+?^J)IT3$Z=b|uFmF{!5}jw#q@9HE_MZiBqM zGfF0_1quEbS=zWjBPK{EJyn|DNLSaM_NUe)r=JO)X@p`&MKkH7KiqC}q<^&8Kifa4 zARPnFrmdc6vIr!CJst+xz&m4Ryp0A-`ybJKt~%72IUvhs4p@T?Au>d^$>KHNs7^0X z_;U!a3r3o+G}F>N7^dZByv;TEs<@{`S9`&l*Qjfh^{X@o#ABCI5FeI~x!#68kV5?s zl9TnQiuf?}<#=pBv7pA#pJ-ZIBj}Gcq2DPKiWb)6Sn|*%JH{QL-A9tsv;ZqF`sWnn zfx_QWWT~$EL0VylsE(wt6t~5JC@f~Phyidv#5e~goByd2?%s$V?Rpg5;J^BMT_>d2 zfWdJ)7e@go`7TIa8wv26{a=-vs#R_W^4k)A)6C0ECrmQUtO*%ZQ>ipzhE=0ru0yEd z|60%BG)8mUSM>I6BP@Ovdz@<-EFC9Rhm$rWYQM9tM<~nA?P0WYNp#GJPIRn@Npw7H zi!(>8sK=j&YZD#c(#Ae+R@}^4M_uj4U?z11V-hcPwbbM*=rw0uQ}MUZRjbKkHMxE? zS^lK`{Z9Kk>nn}b;IFnf%$@6x)-b(BjiPT156dLVs^c(rUN-EPap-bfpw8{|%R(6D z6Sbg)>bx7fNY%?6ptv^Bsl;h2_LRkYex2<74WoE$Zw*Uq3(3@`n@-e{<85j*wy90h z`3-IT-|2Yhk^e^1HQwVkiEG{auaQrp`yrF{9(pD-4Woa_WR7n7a^rL;lc)+Dxv(*z zJ?@W~^cRWL?hw6!^`#YuWmO=aZ}IT6kFc4ER*Y^=or{V zeo2fBjPky87y2@4=rNHU*xBCWFRg0DW~2Id;U44c zwp3}b>Y%r$RH+?CRCo9x(iJ3yd7=4Y4zxj;+?F!v&??Qf{qg(VQT$%do!Z%C}{efe@qrE%9cnKK4_8YMJ&zs?m-r zE!U&r%aujGp^QLQq9}LBbOdMm9ZJk$YOQB_!?Tpp`|(%L=)I8ij6T59oeVks7D0zI zceGj%BqJBGkKRN(kH^p`q=PLT-L&f)y1KDp7I9mCyG9v#8+D63Os0#A53x|VEtjr| z9YF(P-_(LyC-SDyWc6- z9O&zQD#N);D}~;la)!mfC_cAzn9vIjT<@c+VPV4(?>CU}I~vaH1y}uOp}2GdMa->o zW3e#Zq<&IhY6d%k!~xA~oC zZ{*2eBhJ~gW%ALpM<8I@y^cP1RO4bzaF-4>k7It{T1lD% zd-RZ(iRXqNeoh<;?yP)pRn!J|@{RqHy2*ItV$oIM*EU$W=c?$|c7)RLsz`4eEk7@w zY}-lcd{rE3+urY;-^ey8%;vVd@|*asZGYwC-$c81la;Q&iHvrmZ8Z0)1=yv{@pAp3 z%dQ{BQ$DGSdQm5{s?Lz!D^UXHun4faK-J-a?Pz8*x25!|xYn*qTMs?-@2r1@F1afD zw$C*Gyalx#UO&QZR!^Ef*&_C~k7-?0f?Y>$l^kDS+61w#dA!4vTOvF<3{l3Eh!GuZ zV{T#&d%GD8h}_y+CrwuY^#OMU63qap-U|@T2Y(D&(H=&>o;1CGC+J;>1tG^aixV9N z+BX5bS({tsb<*@8L~Jai0@Er;an}x8GiT*iSx=f$0nzsnFdNbVN%E-1@E;91z6*|~ zwKtJo458RlS$)wbteuYxIg-^0Hl3l(_3MVeHrQP(2x$uu);?f$xOFuJ$&kzke`vG9 zS2Z834@TIpPO&AVTaVK_VY&8H1l?u)c~0%(x7SHg{dR+4$GozIntSOz;GIrU8xpMK zI>lch9qmK01ev#09yRYjlH@pyO=X&SY2{UOMisVV8RxKBstk9VQ9;A%@po0{-{Z{7 z=!lYL&Z+_(F;4~i>@Y@YNCjG4stZVq!|g_RTEbwj%nlV)w@DtAbrt4ARY@L)DQvts zzA6zrpMI6N1gI3D9fwA}JOBycY7zaQLz1JJ>bwVgqbk=AiKIRncLE2k#DZr1F4F4V zUF3I+m46n;Iwo}p`bE3_!VcN0uDh6tBf(@yv<^+bA|gXabm(-2Jj}!{+L0NCz2~uH zZNj5%*;!!^9iq(tS-c%OTq!>-ZiI&T)OMAnksCMlsqZQ}TW2XF%9mB* zT&IDCHUMz~I(KXg2mce!?VKNUbOTz1ZpsqOxZ1!0)bz$L;%4VdU3ULS869t?z3RL= z%uZ{M)uQTV9X*@mi1SZ!hP-}4$YB=4eOshv4GV1yFZ~lP4;$JzwBnzkO^kiQqZ%8> zh2O3UO6b6d4lUYp)c}`o2`^B(^!y3g%j}4Wt}`Upwqx3&*zzC^D{ZxC@so&+7^C=n zTb>tDB`ek6h`V~+QmPBZT|GwxZ?0x6&@Nu+Y3+Cq0$l^U zXb$f>m;(dn*tM>xVPq0(7vJ{mp_uK$9BEOqzZP91BSJsGeLBwVncXqU)L9%B#f}NkBIG&qm=jG5tkx67=@>XZypua7!HW)-WaAw zo%1_S!wOy1>bBH;RX)0x#Y36+pqSOi(d8IkZ)A2)oIlk|^_c2q-sh8h$voElZl27w zC!_XS^gX4tt=a2#$C>weAzVdx0EKVdM1APz{-NG?kYzw)G;BbLyi9yGAj;>$Vr0QN zKHpU#ECa_V$(dsIz{$$hkHuR9%M`V|JZ+GV95VDxw>#01+$bNKXLN9HB;BHFq zgu9;Aj*)+#cO@1id&L#lI^4;9<5(ACV&#G5Z3YkX2uazEZt5|mk^8~yZ!p|HFm$d_ zZv?*>n$#Hf9rm`;`$O^Tu%AP!Uxk~3iH+Pesx5JS_@t1z|Eop%2&>^4)hpt{JG5x* z;J}F6eVKx5M+{Ovd0*`E3yS>lOWFjOta#PY_^6}uaV=QWYxnp!&y`QJy(KHFP6_kK zSCrph5^s-;H4?>$czo2LMo7esTGJR-jq2AJ_KCNMcJY4yRQ;%IT`1Zm90{s^-tE5A zW6b+DQJ1Mt_(hhNmVZ5Fv8+74L?k5+wD#CVx8>)O9H+S(QKUwLR6LtFy-^b7&Bk_8 zyuYtRQJt29XGC<;AZ0*?Sd@SLStxF>dP? zk9QpUvvdIN0X|A}d>B_j?<(DvC*e|`?z0}j^#D+A!#!D1@y=1rVTBy#oX3<>-a#9} zt?813V!JJK@5CFOh<82CVeak7&xX7|k#-Q)_T!$3u~*FNmf%b{e#2Xov9sg5*$>i}n!rjVw>K9JS$6zi8 z9Z(UEj+ojG68o~ZDU-CDgggg+&)SV6zT*P?>_xl-G)cnMF5T6$V&-I&4{g}ghG;;Lmp~oi#^;cnv7fw#g2y#PP7-Xj> z#eW6y>9qJEWyQ;F`3ecwVRQDxArbjp_>krl@pBkoJ4bCuF8+XY0M}lU>n=+BJdPU_ zw?(|;gxg~0=%I(oUz#vi?(qCHUI5qCB1)X2!Ex1bf#zkCD?o%z9MSGEY?hK7dvUXh zTAmzcOLTmo9bVQR5Njq5R_;0=DkcsZd_S!EopLm|E$t!EmQ;0HydctPVVyh6H}{4+ zvpIGP9q?WW*FcmQEv?}qVp6CwV6jM?G*Nl-X~_@#Nj@mGlE*-`(9>emE5i&zamy zBh-E&PcJI3yE{#8a|V_L5Bt~oJ5bo@VlmQ)nW0Q z0tctnewHiHke~CX@p_K7W^}SD@cV=eVfX!H88viRGdP{lKCEhey4Ejj)S^o(n7I)+92iJ0`bYT{@&#a zD3)pKg7U!Wt7WC*d{H>#v@&m=m^rgux8d_-2`#>#hL3*wqmv^xw-yAT^JH~Z2b%)s zi5)XT=KnMoD$Pi&`u!N z1GteX#6c)GM#^f1Ar-Jkv-}AWTugdyGqro~Yp)bM3kO8If2MeO-n&Y|7_n&ncIBnfqWOY;%JR`-=z=I^)M&AIfmP`=S~wSU zP&`J9R~IZ*M1p9)aI*L7FVP%j8kium7mihaiWkQgj#OGt6JBZ4lyUK5e%j2g?ADawycFp`%G~f^LPqtY`QLaOYP`-kh>J+?;WY7Kq~@KiC4~L3n zOT!fJ9b((kp7E=P>Su-au8;ar(%Qik_m((ftf{--;WrcEn%f%)#-K=Vo5uVtgWx@;%i@mTTTvM}YDSnm^r=SU+7Xh6{;zH2 z#=)fVR_;~Ux&0O*c-_UUuZP zPvw>9a?gk2W#x~;^05#5%gRq%#LU%qE9Tlm@T6%o zWFTZtbztLT$-QwiE9j(Y)opcms2w$RZE|n?jaiMZdrz9C*+ksh6-se;v2X1hr6@wQ zc{E&!*jPUN(MM%vlcW4dZi=k*?J7E~>!nPJ5=rY4!e&I`)$tG%TfZ8^onU5Iuzo*A zAGo{jFkOxmd)JLu#)b>e^;7K$u{2bY(ElSMXl(d(f&wk}c^EN2k8Y$i1(CAA? zE5d~ng40iiD#=m#rhEWxpLlrM+n~yeH8OLF=E452s(b|2zBs)%LvIF=sNfz%19r5>4MB9IR>1D8qqI;nb)m_Id-2e z`lv+`-mhcV(?{Ic6q>vd!LD=P(*bP2Baq=d%UjKT-+lQ!(t`H~pv>y2^?3TsTQ8W> zF3B{FA{GO|W<2Cf>^KJu?IZ4UzNT!B7QvgRD}AHOGdG`Cl&ptD;$sg5UhYQ?ibXEA ze)T|{cP{i6pF9@Yq5|sNN?ULC9Jc58X&Pn9gJSOE zom%#Q{fhf=m6qfj(6P5Dd^}ls>p}6&ni2DNO5}W z6vde(I&BM5?p-AYZHra<_7$1iHYjiO6gRhxu~)a(Hh?dDLEUbgRgLvKp=*S$iGb#i zu34*VqM>FinpwKW2F*@gGfvm2&}`K;gLO?hG|w*3Ro!$|22{nm#-eMo zq1mi!JT#3X2b}@RwYu_`i9j1tSaLmc+U-VP>8`61i^S{C1ji22 zBiAYYE~0N<7)#^vA~weO!03j&YyQYU9X{51)Bv;v)sOGLEPlMCO{Z->$jn8$bQo)# zQJG7NPBBrEcZz@M!6iPB4=5-Yi;vrz#IAB9#<<^eqS*4!;FtOiX<2D>Z zp>b)@NxWFn(o*{bHVYkKg1%i186|oD32~~VV~+vIc15_tZ#S{OqgfQQtv9T+TY|s0 zY34V#iGW?Ll!nEk>#nF)=SbLq=BLeFT+0@$aVB0pXh)c^L~Y z#(_Zdvy1%Dn+y1H>VDRfA8+^(C!aO99Nj4P)pWW`mp>);I< zCU@=<{z7VWm+)q~c9+nCBGO&LUxMm|?h^dTMIc9NjWv3Q4WI%$%H>-q5TJyvKOEmRzT{Iw4nqEKhj z;6Aqt=qR?SrpQjB?+az^KPTRwE46Gtf)_>I)rD4oSy#iW;BQBofgw_X|*GAx6o^)-%x~0mbmU_d(J8hLSXZjsA`P!b4HfI9r2U-DimZym7bk@pLiv&GyRv>EhluLzO3{i~KidbRIliTT{QU>u3&@5_|rV z82j@|d~W4a)$u+)J?OTyoi0q}FDkoch}X-1Q3CK%|E;zDy{1$7j-}8mwYtkLv*@+A zi!x(?xO;C`W&8W$;k^fyn)k~G?Hej9!5@gM{h!%CIxR^TK((MBLBD|h1Ns}}aYmAS zKmnj&P$;M?C<@dcv>CJm^cv`G&}q=8pl?9Gfc^qCJB#nLfI5PDfChp_g6;yHJuAgZ z=OKI!x&(58eg$0v-2{2QFG(#xfuOb^E2tZ&7ihryqS=8;<%jz6ssnE*%K1s+;X}WB z?2zU12i}>lC>2TK)A#l(p*_Tw$_OR(UU8r@TuHxI)K<1u{Kt!i%CUZZo1xXP$3^R} z8Yd$s$t|2m9#wYyC<2a#D35d#(MLN6 zNT12lSVw$4J}i>3-)(s~QOrMjpWoMA@mk1ne!OGTN$E53`O%1Avcm_T_ayZ^Inul@ zsebrq^Sg%z`=1i+j?M5H1aqv@wXn4xTPmLtzZ{$3vn(8M5FA@cIp+8|z;}tN=$;hb12-2P5Xm+$<*3%>N<9{1I&XEUC zcq^KdR6oo!X3Cbjvu;a7yjXg2n6hh(c>QFkQZ-6^a57SP^P9&{S(U=;qGQ#Hek(?4 zeK?RlBO{OTj6J&Ctj7Ll`O|f{QT}lxE=94e$Ar2m%!c`zE@n557GIz0AZn{RD!VU{ zqfHHP6edQWN>frsiruH$wLTm7FY)j??37K}Tq~@nt;&)=#mLj=m0xY5%^7R!SvJ^f zpMOI-sho}^#-B;ET)!?!D;Co?I2^yLhi^4Yaz_2|A5nGYd&T{S*mL$C<;6dQ*ZbXj zKKzG-R`PU>jG5Um*qn!vLF>UnP3!Bz$2RN7I+CtOxGft;h?(!_D`msP5AXL>p8j35 z`rtv|>|s<1S>A5Tt)Zg$gDJ{;SH-U%EN>Z$&(>t#ug<@Lxoc2^SoUE%TYIQ5rCoRJ z_NMKVJJZu0Pj9kKiXPCQ&uzX#$;|KPKiN9^IqG(%FaH#$KFn>I`X7|4EB5kO;wJxA zKE1j`Q39@%|NT*rtZe^O1b+OI^6H@Sw?AI1$o^v3XP0}N=&xna?6xfEho!j6^~RHK zcO5S9e?z`Ao8FfW$z8Kni#1{HQXM`)wJUPlklY2+q*es4->}>A_c-1^Je2=akFbErG zb6ySRXBdYU043o-+Qno>cv2U?V6en9q9!@bH#hYU+X0FIIbDd>{ z=Bv(cF~z|<*tUqBUk-~uteMQT9MHJ`PYAMvkeOe`g8`M|q=q$%C*IBkvgx~7?oZ#pa&2|F*KJ)ak!z<8Pp!kHM z{yy#S@f-dj7s&R8f7CAUW8eJta!3UWQ4=7bYHBs@Lw0v~1i6a6RJ4@pFGg?RJR5+ScC9 zph7Pgu}SQy4Ij}^pdky=az$eIfBgEgOiW$07b!&JpF(gZzPo8EBY}FsXArb83?JV* zM5{}kV>XNoL< z^=q;DoBLb7@eL+r-U+<$6?Ot6#kgyCE$(*pL_cd5bP`% zzUYv9%zp;Hop=TBZ%pAkMcW^*`wqdq_==!3b1zfOj`EJK?TT{RT7KxKzH*x{t5DX= z@N0){nO4_tICj-_I$^4+5~eF>JifSjOPs&*lJdE=eD%+1vNEKj`0kgH9_w%165W4o zulR2-AN^~T+^G-^<6(aE8w}sXwGEP0l2*1RK?;^u`CT(Ta7Jvc|5HicUhe#@m#k!N z7w=r%trS;@`+q;86mKu@^GC6)eEWwu^Pfnia=W)#0T&rp36L>$-H;t?0-9vNbQmow;j&v>5Z(qt<@W4;9mH4DUU+mv$r5;!Wi1 zjO*(t`f9_(-kPsy^5u%x0p9Ma5w1bv#Ep(!(h-L~cpQz&(29oCesU==%*~FL9`SPh z*-JG4J7iHwCaU&!y;4C?4ywb;>zjn&C8}%qJl!i*apOoSMx=@Vh@{<6=-y(4^Y7qx zq5llVs~rqgO01c9@9(zCl@;Rizpe69;>O<{=D)t;f6CcQTN{Ts#wY7O3jd)#;C0*i z{3f2pN9z&Vi-&HmFDkRj$@Wd}pda8Vdr#+M59)j-^GxO&nHMwP&AgKNr_6t1?)kRv zCzyGE=98GG>D(?o#EK`FmoY!V{0rvSnEPt?<&tD&-k15aT!6`p)0scSJfC?n^HPo5 zaZSdGYUVEH64y)w^Zv|7GEZhcoq0O*hnR0?UdntQ^RvvqB98Q>pIC8?x$>@Fb*-6q zWgf$PB=ftNPiLONd_D6L<_DR7%=|m%SHUTL$&;(DHS?~_W0=P?pTsGm|k&{NMCpAONUh9==&y>)wU4iDC` zUGiZ?1REGQhOsY)t4$nCW{ho|_M|om&uD^kn&3hWqthEXE@lHG1Eq{xZ~_%g92{ZH z!O}6tG@;W|&Dii?!&o2DlJo^(8g$r+XiqI082Gy;5nN5euQb8+O>hHaqlrAD^(HX< zdjZ=iH%5+pn;7^v!9k1-``{+HLlbOeOv8a5+^=XO)rcPvE!+R0h-_jI&Dh9s|0dxv zO~QvZ3AZ%~k8cvLM%(|HqogJV$xR$gZh}*q;F(QuY7@Mm2~M{+Q7mC>R9Qw7oY}-a zy9r+11m`d|hFxJ3Y%gJj(MwAi8=aAK-oTh%MbQ)7N3Y=!9ZE5b zIovL#G%?8jr-4+=xC=X|WZaH%En_QVufBSMp^PIKblf!Em8~z&@TM4VQh4=WX47fWiW2b2{uYV)6h)Uc%r*AQK@>2rsG^~5&<*S zKO8h21%(6l_w|)OZ5CL`IgtkH5o`nZw`(O2RP4U1^>vnWC{1pHI~>%*lbOfxM#vbOaw$4@NhTpC1cQxBr=p23LRXxH`<{2w>Y$Wjf)4WX@X=n_WUo^?;cE*NX zJY(x^{r<77<)w1F>>+w3u-lK{Y)y!*{*D`l8uV>!C+{>nC*vdSbxsia4 zaWeB%<{8ZMZSn|hNEfrBjQKIb$*V>2VI8+(RA#=PR$rD9eXTk8_W#)44F*jPZy82j-Q zRKZwVGNG$vY%JMTjQ!cZnz6o~pr6;U!dO6R8MopHF2=?#r=GEe!y6dW2Qjo~re34L z480f|3y?o!ZONr^7R(A`MYA$CRPWJM%LC}teR zxP)Je<>)s#!6D4Qd$M7}qk6W9(u)ig7*Tc*YHk zM>CdY=`}Kju@~b+z5MuPPF9R%gJ8zv7+V?N#W;fT1jf;flNrY_p32z9_#Vb8WBYVg zB(q{6;}pYyaa9++1Ts$qsT{5_&S31pIES$(<5FJVO^gfmaJ$ru6(t;@IpZ?MUW_Xl zbMs|7KSBYYH?4V=LnT#>S2%kg>62X~j62 z?SmNG7+V-8Gj7c|l`yq`Fe@_Hpe^GZ#_bpvGH%bfgmDMPWsE}@S2FI%xSDY&<62;C zowc%}o((!NmgeYf-kGsK<1UP?jKdg5GY)5LW89T-GUINHQ|Is*zdI{3*q{gF9L7Bv z7c!1yT*5etaRuYvjH?*;Wn9C!KV#P%yI#TptY}~Z`bjZ*yi)b>L5zbL$1sjyJeY9| z;~|Vy#`Gl(dQunZu3qA?jQtspV{B!d#5kJqU5ssvCooQCto`02Y9N*IBt6_NWw2r@N62A(5930{ z(;1gAUdXtN@nXi6jF&L3X1tbhEn`{RkzoAQv%-_ND8`9|ek)0P=IJ%!&Dfu@4`VB1 zU&hgl{TbUBw_=>kIEXNf|5R4AW`hjI?HK1U4q;r(IFfNG<5W;}{u@B=a#=eYe7`J2WVjRm@TBsM; zF7qzapB3JWt&DvbM>B56*v2@PaSCJEs@GULV{gXUjC~mA>)0;EvZB~<5T-jQH5@Rm zFdQ(hVjRo3#)u!G$9Ea=88;a58GEHs4WRwyNIgQZrjR6W#u1Et7{@S{qjh`LuxFfN z*fUNy?ECBX*@ivie8SZKd{|LzM2OKNlrr{VTw#O{)x)cdaK<%8xJ?gt8R3i@3>>eA zd)+JB@I^UfK-Cq&P-r+w#}Nij)^QAD&(%6s8MkAca_|0EV&vA!OI1T;AG@(*9H|>i z#wMMsQ!2^QQ+t5JlldIQP%7i_8dg*?{+w|&<2M-BGA_}vU8-lr7B-Mp>Ir_x*q`wy zjIE46VjRu*WyUtf2N)+aKE^ne@fR9K%Vw~`I3?sTKFbjb8NbK4gmD#P;}~R|qsln^ zX%4SqyqIwcpE|UI9`&qRHkfZ1a1~P{(^Jpk+#&Fp6upMl=)sadV|)c)dr~>Raaj<- z;Rzg`&EcNFl)exkF0E?SXN-kj~-Ha{O$@k1@_?oM@aZ zi&;_52BnN&Wo#UC;uu$OxPx&aXRtZrDh@Z!X~i7w#o;v^{v5Atl8Y7Zvq1yn*BEs5Y=aWLb@8AmWa$T)`aamFg+w-~1|{#2`fDAQR{%?8rfkVLn8SJLm8v-dW)6?waD4Dqdtw+*WL#tC2>z^4 z*;IR z?`CY=x%FjS%Ha<(&gKk;Gp^w9dv%PHB^!jXK@}UMF|J{}nQFDIl*Yg5gfjQaSY>Cj8(>2j8hm-VQkz~2NI^C zlFkNCut7HC$&B+E7cs7%p_iZ)<6;hXGM2c_jeFNp4u6EhjjQk=U`k)AU<2bCQktnJ zVBrW=9DWbu8pg$pU5qy|ZeaWjW3M&3zfuFw)NyNL{SRh?6gKc@gEovKID8u8XfEMU z#xWeej|~6^SzG@fW}MFsyD?7T@I{Q%882g;&Dg_;&-fe0 z#lYIhvXB*}Y_N-Q1>-jvS22EtaSh|qj9vEq%H8s+aF0q^|AeP+YG=I&8Q}DpPs=xL9Eru`+ zv=x*Gx)(GBbP)6ss0{QZs1TF`nh%-?s>6R5`VRCZ=u^;#pyQyoL2rOw0=?=dOV5LL zfSv$t0j&c)40-@`Z#e#lma?=7v<~zLXcZ^}vv@DhGKt6Vm zsvT6GgDZiJr@E0$x@g!N4}OTnO|lI{KBS`GcFApgQea};DN7By%cAHtvS;fUD2yis zat^3kGiW`MA}Ac#*e5w@{N%&V&@{Fy-KiC)sBE=t3TzZdPeU&H^&vULha#6Eux4k` z($#V(l{?}YczZ@GcTqIr+6eQL0=a3~DX8p!$b;rfFMkcCgy=bjYbt+bBj2@7$lJdzJ?rDT{?02b;lwT7>5 z!(Cm5mIu%Hsk9i3+2J`@t8KV{SHs}_}&DOXbfl~Xf|ju zXbotczg?ELLwF8E|EaDJyR=H|jgzt0p@g@40Lz%v5KR9qG6y9p!w78!eQGONvI1)l z;!1zuJM5VYvopi)*H=BvaW<$8U08IqWP>ilr;*Oyw~ywq+S5>GOOh1{qI>jOME^oE zOj{8#wQJScD>{09+P#ug4D3bDM@^a>mNF_1qEymEN6ONF>ZX%jStFf2EG1EkT+v8L zI#O0P(T#$x3OXyeo^T?mB-cOfv_$Ivp-a}%Xn>9?N{^eI0?{scb!l9Z|EErK z82k_2WX+)!x;qXhYj)Al)uIxOf8Oc89aSzHm>L01iP?}|!uMKk*Q$6qbP|?GsR3M% z7`AfRlFa)T0Mnv36Yb6VhaP%p!928pRPzF7e0k>lFulU0+JES#YZ-Di)=iGnGG1@! z>=b#jZrA{23eK{+7;QpfR39F%N z)Q7Z94}G_!&~)2wAjP%Q|1gcF9;v6PEgMEB=!S$_cgQ^27{gd%!n=nb5{Gu#3Zo%(DZ2>}#5*vdGhOiqdSh=KwFS_dR^hDZYo5V4roKUTaL!63=L# zV7fk$n<-MWzDjaYWv(1-r!LkVRDskwnH0&C>80Tr&{dHRF(~{FM*hCT-5~7#5f^ri zvD~tm)UtmIsbycEdav4Msh!$1liD2fkpeTlCDUXtDH>HgJpfG<@e(D{3||07Lm^PQ z6Ubp$_;q6q%PmY&i;>N1P1PP5N~$DvYVRer|HD&ieau(#o7_S&_4knq110HQP>$vs z8AZ5+a0%hkKf*CJQVH)wDC(6b507{YQzSa4bRBmMx4KGFB+b9zeKFz3gA81>Jx`8q zP1fiUQa?=l?|{a_`kkId-{i^rl>9D5Ppy-O-?sS^y|oQyy?L-{Goa{~b#mX^VGoQz zmO;VDRnCZ_f$QaYoi{1^YFaoGKQsc`h#zhtUW)Ui87HQafTDxz<*p+s4=AKmj#Y(L zmecS-obW?9ZC?kb=Px>WV{$UW4Se0dsPhJSc%V_1SMJ6#2HNdkv>f_LMvXj#N%4(% zy}Whc=Rm~CJ8^G|mt;ZTuqI+3rawQu5`#R6hgr@tJ7w zrTOw$;s^8P&bRZ?14j}Y=x9LEFZuE#cEi^$49tKGkDJdgi_@G7OuA z2ww`i02_K_Y`&Y1gl$kWDQJPW6x82K3Yz49+y3NAeES;IGLY>96)A9ei)6WlEVY=2 z_`yC!bp>*#=|%!kn6?Iij0FBI6N?bOqLGa^R!L7}!tn9L8XPx3l;qAeMQI!59=8j5 z0cX0)p#RPPv>ZuV2KwJ@b|L)S|G}m$!n^4lm)d1cmD=^6 zBDIqzNiC8k39a;|LvOtw9CF9otrhh&mK0D#U{UK$a*wX$Bcu7hx6YGW@g<-qDC0$G zo8)dAgPcvLprgc;d}!Gs&lKv)e7Y zwjBR75;Q%q=pm;(P^(xP*QegWz6&=jD>#kokOSVkga54|dmKVf1Q``A`zn&}a#QlZ z+4hC6r$JkdG6Xi00{i2`2Z3+4to6-kk!lpC8b;Zb7!GXMHq<2f$s46+wVu@q^i+ZL z`Ls?EK2pRV>m+ODdMS9p2FZVNzU0-vK*~5SNoPO}Z|D)Hp?T4|Fu~jd%N+5eTJwRjyGMcA0OGcUA zEo?M>(Eq&hZqUkfwNUO#Wp4MFJofeo!#6vniJ)HaN!8Ea_?NaA;>E^bR*1=99xUvc;!#AC3VaE@&)o-iTNdNyAVZq(w^?-m`!36LPM{{tup%J1hIP%e5wN+erNyR4#hpVYyY&-@D`} z<)lpCTo3V3|BphHXYxtDD{WO7uY0nM)_LU+&CLLN?QvaEg1c851EY8txDb_aJZ{~LV&H_yp;DN0$_qP{O;b_bvSqTGx4M#gV4{~WwWSyw&hTp+2} zh`6cCvNGo^OPjNN?$Ub~+E!#Pu-R~l(6vZ;N%z;|C3%k>ldf?_YJ3)=Gm!~LlP_>i zA|4E?hfF*SB;oi$yay;4a^qtR&OXv3SVUr=C%zFh88UG?jbuPJP9=6a$Iy8u8k2k> zWa2|XWsr%F1XV+(MPL(%4%>y`XIZ8dsV|818Q^b%BxJM_ycXmOnRr}l-6k1)E+`oK zjMg}$tz}RKzO57HLIlvf{s)Mh5|70UT}v4Pr`ekH#NT3>_ze)*{0$z8C7%+uf{$W3 z9y|v`acN8N0x0-J++&qO@Cd_g3?kD>ITut9xdi-OkXI>616~KB$oM@7>Dh2y#&1GM z_@xM~G{oO$xf(nPhdE!wB|aNOB~As;AwA@L@I!X|A*YAHx8Q;z2@wjxp9fI{;&I(^ zGK4-J{0-1#$Zvs%<2o=Eas>EX5ZNyP-^p?bcu$-e$$upHG0+m&6L+!RPC`JWZWIK5 z7t6`u_kzf2I(QJ??QccoWbnlx(iei);2N?7`daWly>)#&_%k5t2PNQNuuMESTGtc* zrZ3vR43X3O;deGcA46^c59zOG$O?WE_&_{re!E3nwkbPq%X*7sxLIr;sM48(jYsWDZfFhTHA7S|z_!l6GK>QDuiI?Lz zyZ}yVpM7RHnhNq+@IOH0hq&JeUB<6oNH2gYVe=aJMG*OvZ1}w|kYq=MbO;ZDDDrCX z%`6v!?_s$N{1nS)!5wjubOlZ~fu9Fa+>gPpu`G?0q@O`lL-pXl#UssEkvZ_a3Fw57 zE5PjqqjBc~unC<0QSLFwh2VL2;b%`F6F)pb9}&mE%@c71gWezf`MdFRr;v&N3X&k# zgD;<~my-5DTR~Lfx4`8TT*JH~OU2V9sXgxaptnmMASBU+A4)*{?pc`OU^E##ZZ;+# z$noH3L02H>&5@)@smL5kHW}P=E;=XlHt-oBFX&Uj=dzpu{s7CbfnNnthW-HWInS@UG@c^#PVeD7eJKhQgH8udUGU$7lNoch#zFR68s02 z>%j-5asRMG5ci_TBH``eW7Bby4><|^K9CLa67Z*4-VXjPh!VI0-hPpuxenmTpw+NX z0ss6yy|$JtMk(*dbPjzacmaqCwh26N8QOn40)imqfT%RY*Jof{L!S?R3Un6oS@0bX zpdUak0Y3<$OdJCLl;s-mR?BsL5O@;H#GhjMd2p{4dgj3GQUU-atb*r&B40-)z~eG8 zO+rp4o&_7o#HWI&1S#OkpFHp6Zj2KB;>!r2j}2G4%t2w!dg%=KpyzFpiIc$fxod9 z6A0wDz&{2BK_-6cQB*hNv*7)5C9V1TgL~!a2@~G~qJouy<2M4d3=!W8qKxAA0;JE^ zq5TPb0T8xckANQ@kXEt075pm8LpNY21ERjN3H&t>#U*~0W#V!9x}SLPwIIrLF?h?3 zSZ*QvgFod!fgo>ppekN)B6k3#;JvqCLfL~|5cu%NF&{uy!KVo}G&}52C8}d>IP~s1!DTfa9kgw4D<1SWrIn z_}K?(HHeyt`1;q7IQ048e}Jeth$p?S^$EKsOx}$)gc0#v5G9re9#Do+0euO0>o@gW z+rU?X$WaNnTCUp@-v{!Qj3I_~?ClO{n0H?nC=)i2$2QvypM><3YfD#5=#qPJ@;cHV}A#N0L9N(;Wkou>Mf^rX9A}9ttYkW}drI5;9&51~SizmVgim3|b!H0;&i@q4J z4*?6g#}vCeLpH1NPr0BzoY;q)XbEaHeP|nLJyWcDpwzUs;^%u=IS+pK`OfT2W@dMG zc6NR+JBd%heX*X0FJL;O|6eWCD&p@w8u1|x26)pt(=v2wo%{bB0iDM4@Xaq79yw5l z#S^p!?ZH2>XVK!0Z)iRGMyRhumeFj<=6s5&V10!0yKlLK#EUPUwe5ZwC{?+oZ1tS<9Ur@ac#Vrsz<-n%gwOlIM8nBHtk@XXIth|KdN<_(zA zABOubOvZ+Jc;q6D`Ixf;@B5W_(r4j1w$-2DuHP7ONwb_nyo2cy9EO*$Sq_Zh*PC=M zbRWKUiB_Ty!V{QAI`+47E@G;L*!pWSO19x0W5xl}r{U+A&f;)#|% z@(NRLOtm`>fBBp1M?72VIo?&gg=n#gX+|X8c8y+5d=}=gA-W0;rq?SAk2!qifcP%l zz*Nx@oMt&zXFZwV`Oh~VoU0@f-;EC(g~u>uNU<*aGs|za%AD_Se|&c z7j$mHdW@KCG3Y#m_0b+=XF+GIkrbZ3o&*9hYiu9d~a!{;iCL<$}7sZr!-;{dx?jWxco&N5aoVQ22sv0X;Drq zX)zOPQEn8)i%YQ<<@!*(C^v<)C{Kj6_|-%|vL!a+1LCzUbutfc zhevO%vWw{ZwW&1sZDV@geeg~%C$g)P!CpuW?+L(&<)mt71K1;t!GQNY%8{EYqoB!?b@F0+kqY0kuA2oR;g8P zm<9L#M5S?Z!M&&P&w`s>8n#F6&GxwMM9C->%|z)a6J?{hC>Q0ULR5^rs1%i>N<`T? z##B%+MdO*0DVvI^nwqJbxUQya)=baz&A<%J$TVKr?>;kCV0y87YQOtrVt2RIYYkeX z*0_}nXTnT47v}Yh_Y%(SbmrB^^X{#QsWRhU delta 35698 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 diff --git a/portable/launchers_final_proposed/IDLE (Python GUI).exe b/portable/launchers_final_proposed/IDLE (Python GUI).exe index 2d13cae77b53fe7fb0abac44de243a8189362e1c..01eed2ceb1d8abd7392722bba7ae4220f72746c7 100644 GIT binary patch delta 45470 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 delta 34932 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 RhVDdSx4!m8zAZ14{|}3`LoEOR From 2ef81a12fbd6ccf871c780e0b353fa7a70b7a81f Mon Sep 17 00:00:00 2001 From: stonebig Date: Sun, 11 May 2025 08:53:08 +0200 Subject: [PATCH 192/305] remove unused clean_up logic --- make.py | 2 -- winpython/wppm.py | 15 --------------- 2 files changed, 17 deletions(-) diff --git a/make.py b/make.py index 773660d8..c1a6a93a 100644 --- a/make.py +++ b/make.py @@ -252,8 +252,6 @@ def build(self, rebuild: bool = True, requirements_files_list=None, winpy_dirnam self.distribution.do_pip_action(actions) self.distribution.patch_standard_packages() - self._print_action("Cleaning up distribution") - self.distribution.clean_up() # still usefull ? self._print_action("Writing package index") self.winpyver2 = f"{self.python_full_version}.{self.build_number}" output_markdown_filename = str(self.winpython_directory.parent / f"WinPython{self.flavor}-{self.distribution.architecture}bit-{self.winpyver2}.md") diff --git a/winpython/wppm.py b/winpython/wppm.py index e24ca6c2..9eb932bc 100644 --- a/winpython/wppm.py +++ b/winpython/wppm.py @@ -47,21 +47,6 @@ def __init__(self, target: str = None, verbose: bool = False): self.version, self.architecture = utils.get_python_infos(self.target) self.short_exe = Path(utils.get_python_executable(self.target)).name - def clean_up(self): - """Remove directories that were marked for removal.""" - for path in self.to_be_removed: - try: - shutil.rmtree(path, onexc=utils.onerror) - except OSError as e: - print(f"Error: Could not remove directory {path}: {e}", file=sys.stderr) - - def remove_directory(self, path: str): - """Try to remove a directory, add to removal list on failure.""" - try: - shutil.rmtree(path) - except OSError: - self.to_be_removed.append(path) - def create_file(self, package, name, dstdir, contents): """Generate data file -- path is relative to distribution root dir""" dst = Path(dstdir) / name From a5c1feec0f7768ae5cf8991feaeaade1ae9d463d Mon Sep 17 00:00:00 2001 From: stonebig Date: Sun, 11 May 2025 09:45:04 +0200 Subject: [PATCH 193/305] remove winqtconsole.bat --- portable/scripts/winqtconsole.bat | 3 --- 1 file changed, 3 deletions(-) delete mode 100644 portable/scripts/winqtconsole.bat diff --git a/portable/scripts/winqtconsole.bat b/portable/scripts/winqtconsole.bat deleted file mode 100644 index c05e36fa..00000000 --- a/portable/scripts/winqtconsole.bat +++ /dev/null @@ -1,3 +0,0 @@ -@echo off -call "%~dp0env_for_icons.bat" %* -"%WINPYDIR%\scripts\jupyter-qtconsole.exe" %* \ No newline at end of file From 316c6e640938b88e39a71ba7baa67880cb48b5b5 Mon Sep 17 00:00:00 2001 From: stonebig Date: Sun, 11 May 2025 09:51:05 +0200 Subject: [PATCH 194/305] replace --fix and --movable per wppm options --- portable/scripts/make_winpython_fix.bat | 6 - portable/scripts/make_winpython_movable.bat | 6 - winpython/wppm.py | 137 +++++++------------- 3 files changed, 48 insertions(+), 101 deletions(-) delete mode 100644 portable/scripts/make_winpython_fix.bat delete mode 100644 portable/scripts/make_winpython_movable.bat diff --git a/portable/scripts/make_winpython_fix.bat b/portable/scripts/make_winpython_fix.bat deleted file mode 100644 index a0dddfa6..00000000 --- a/portable/scripts/make_winpython_fix.bat +++ /dev/null @@ -1,6 +0,0 @@ -@echo off -call "%~dp0env.bat" -echo patch pip and current launchers for non-move - -"%WINPYDIR%\python.exe" -c "from winpython import wppm;dist=wppm.Distribution(r'%WINPYDIR%');dist.patch_standard_packages('pip', to_movable=False)" -pause \ No newline at end of file diff --git a/portable/scripts/make_winpython_movable.bat b/portable/scripts/make_winpython_movable.bat deleted file mode 100644 index 2ae903f8..00000000 --- a/portable/scripts/make_winpython_movable.bat +++ /dev/null @@ -1,6 +0,0 @@ -@echo off -call "%~dp0env.bat" -echo patch pip and current launchers for move - -"%WINPYDIR%\python.exe" -c "from winpython import wppm;dist=wppm.Distribution(r'%WINPYDIR%');dist.patch_standard_packages('pip', to_movable=True)" -pause \ No newline at end of file diff --git a/winpython/wppm.py b/winpython/wppm.py index 9eb932bc..659d14a4 100644 --- a/winpython/wppm.py +++ b/winpython/wppm.py @@ -45,7 +45,8 @@ def __init__(self, target: str = None, verbose: bool = False): self.pip = None self.to_be_removed = [] self.version, self.architecture = utils.get_python_infos(self.target) - self.short_exe = Path(utils.get_python_executable(self.target)).name + self.python_exe = utils.get_python_executable(self.target) + self.short_exe = Path(self.python_exe).name def create_file(self, package, name, dstdir, contents): """Generate data file -- path is relative to distribution root dir""" @@ -224,81 +225,30 @@ def install_bdist_direct(self, package, install_options=None): def main(test=False): - registerWinPythonHelp = f"Register distribution: associate file extensions, icons and context menu with this WinPython" - unregisterWinPythonHelp = f"Unregister distribution: de-associate file extensions, icons and context menu from this WinPython" + registerWinPythonHelp = f"Register WinPython: associate file extensions, icons and context menu with this WinPython" + unregisterWinPythonHelp = f"Unregister WinPython: de-associate file extensions, icons and context menu from this WinPython" parser = ArgumentParser( description="WinPython Package Manager: handle a WinPython Distribution and its packages", formatter_class=RawTextHelpFormatter, ) - parser.add_argument( - "fname", - metavar="package", - nargs="?", - default="", - type=str, - help="optional package name or package wheel", - ) - parser.add_argument( - "--register", - dest="registerWinPython", - action="store_true", # Store True when flag is present - help=registerWinPythonHelp, - ) - parser.add_argument( - "--unregister", - dest="unregisterWinPython", - action="store_true", - help=unregisterWinPythonHelp, - ) - parser.add_argument( - "-v", "--verbose", - action="store_true", - help="show more details on packages and actions", - ) - parser.add_argument( - "-ls", "--list", - action="store_true", - help="list installed packages matching the given [optional] package expression: wppm -ls, wppm -ls pand", - ) - parser.add_argument( - "-p", - dest="pipdown", - action="store_true", - help="show Package dependencies of the given package[option]: wppm -p pandas[test]", - ) - parser.add_argument( - "-r", - dest="pipup", - action="store_true", - help=f"show Reverse dependancies of the given package[option]: wppm -r pytest[test]", - ) - parser.add_argument( - "-l", "--levels", - type=int, - default=2, - help="show 'LEVELS' levels of dependencies (with -p, -r), default is 2: wppm -p pandas -l1", - ) - parser.add_argument( - "-lsa", - dest="all", - action="store_true", - help=f"list details of package names matching given regular expression: wppm -lsa pandas -l1", - ) - parser.add_argument( - "-t", "--target", - default=sys.prefix, - help=f'path to target Python distribution (default: "{sys.prefix}")', - ) - parser.add_argument( - "-i", "--install", - action="store_true", - help="install a given package wheel (use pip for more features)", - ) - parser.add_argument( - "-u", "--uninstall", - action="store_true", # Store True when flag is present - help="uninstall package (use pip for more features)", - ) + parser.add_argument("fname", metavar="package", nargs="?", default="", type=str, help="optional package name or package wheel") + parser.add_argument("-v", "--verbose", action="store_true", help="show more details on packages and actions") + parser.add_argument( "--register", dest="registerWinPython", action="store_true", help=registerWinPythonHelp) + # parser.add_argument( "--register_forall", action="store_true", help="Register distribution for all users") + parser.add_argument("--unregister", dest="unregisterWinPython", action="store_true", help=unregisterWinPythonHelp) + # parser.add_argument( "--unregister_forall", action="store_true", help="un-Register distribution for all users") + parser.add_argument("--fix", action="store_true", help="make WinPython fix") + parser.add_argument("--movable", action="store_true", help="make WinPython movable") + parser.add_argument("-ls", "--list", action="store_true", help="list installed packages matching the given [optional] package expression: wppm -ls, wppm -ls pand") + parser.add_argument("-lsa", dest="all", action="store_true",help=f"list details of package names matching given regular expression: wppm -lsa pandas -l1") + parser.add_argument("-p",dest="pipdown",action="store_true",help="show Package dependencies of the given package[option]: wppm -p pandas[test]") + parser.add_argument("-r", dest="pipup", action="store_true", help=f"show Reverse dependancies of the given package[option]: wppm -r pytest[test]") + parser.add_argument("-l", "--levels", type=int, default=2, help="show 'LEVELS' levels of dependencies (with -p, -r), default is 2: wppm -p pandas -l1") + parser.add_argument("-t", "--target", default=sys.prefix, help=f'path to target Python distribution (default: "{sys.prefix}")') + parser.add_argument("-i", "--install", action="store_true", help="install a given package wheel (use pip for more features)") + parser.add_argument("-u", "--uninstall", action="store_true", help="uninstall package (use pip for more features)") + + args = parser.parse_args() targetpython = None if args.target and args.target != sys.prefix: @@ -362,26 +312,35 @@ def main(test=False): if theAnswer == "Y": associate.unregister(dist.target, verbose=args.verbose) sys.exit() - elif not args.install and not args.uninstall: - args.install = True - if not Path(args.fname).is_file() and args.install: - if args.fname == "": - parser.print_help() - sys.exit() - else: - raise FileNotFoundError(f"File not found: {args.fname}") if utils.is_python_distribution(args.target): dist = Distribution(args.target, verbose=True) - try: - if args.uninstall: - package = dist.find_package(args.fname) - dist.uninstall(package) + cmd_fix = rf"from winpython import wppm;dist=wppm.Distribution(r'{dist.target}');dist.patch_standard_packages('pip', to_movable=False)" + cmd_mov = rf"from winpython import wppm;dist=wppm.Distribution(r'{dist.target}');dist.patch_standard_packages('pip', to_movable=True)" + if args.fix: + # dist.patch_standard_packages('pip', to_movable=False) # would fail on wppm.exe + p = subprocess.Popen(["start", "cmd", "/k",dist.python_exe, "-c" , cmd_fix], shell = True, cwd=dist.target) + sys.exit() + if args.movable: + p = subprocess.Popen(["start", "cmd", "/k",dist.python_exe, "-c" , cmd_mov], shell = True, cwd=dist.target) + sys.exit() + if not args.install and not args.uninstall: + args.install = True + if not Path(args.fname).is_file() and args.install: + if args.fname == "": + parser.print_help() + sys.exit() else: - package = Package(args.fname) - if args.install: - dist.install(package) - except NotImplementedError: - raise RuntimeError("Package is not (yet) supported by WPPM") + raise FileNotFoundError(f"File not found: {args.fname}") + try: + if args.uninstall: + package = dist.find_package(args.fname) + dist.uninstall(package) + elif args.install: + package = Package(args.fname) + if args.install: + dist.install(package) + except NotImplementedError: + raise RuntimeError("Package is not (yet) supported by WPPM") else: raise OSError(f"Invalid Python distribution {args.target}") From 8617893b774ec0cf47703c4c1682df57c712fd73 Mon Sep 17 00:00:00 2001 From: stonebig Date: Sun, 11 May 2025 09:55:21 +0200 Subject: [PATCH 195/305] remove no more needed register/unregister .bat, as wppm as the option --- portable/scripts/register_python.bat | 3 --- portable/scripts/unregister_python.bat | 3 --- 2 files changed, 6 deletions(-) delete mode 100644 portable/scripts/register_python.bat delete mode 100644 portable/scripts/unregister_python.bat diff --git a/portable/scripts/register_python.bat b/portable/scripts/register_python.bat deleted file mode 100644 index 0298a25f..00000000 --- a/portable/scripts/register_python.bat +++ /dev/null @@ -1,3 +0,0 @@ -@echo off -call "%~dp0env_for_icons.bat" -"%WINPYDIR%\python.exe" "%WINPYDIR%\Lib\site-packages\winpython\associate.py" diff --git a/portable/scripts/unregister_python.bat b/portable/scripts/unregister_python.bat deleted file mode 100644 index 6b170231..00000000 --- a/portable/scripts/unregister_python.bat +++ /dev/null @@ -1,3 +0,0 @@ -@echo off -call "%~dp0env_for_icons.bat" -"%WINPYDIR%\python.exe" "%WINPYDIR%\Lib\site-packages\winpython\associate.py" --unregister From 5dd8bd2d01869714b91a7c01e70e1f6a751856c3 Mon Sep 17 00:00:00 2001 From: stonebig Date: Sun, 11 May 2025 10:39:22 +0200 Subject: [PATCH 196/305] backpedal against gdata not happy --- .../launchers_final/IDLE (Python GUI).exe | Bin 132608 -> 119296 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/portable/launchers_final/IDLE (Python GUI).exe b/portable/launchers_final/IDLE (Python GUI).exe index 01eed2ceb1d8abd7392722bba7ae4220f72746c7..c1e0c9dc452c9d6f29f91bfd398b6e1403291494 100644 GIT binary patch delta 34299 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\OSL^iOG8KWv<**N=0?-L$zazxEUzi?S5k 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 delta 47284 zcmeFad0bUh_Xm8=feRM|?{&C{1A0|ZoJrJB94-oaP)ITdG6&2d8dOqH>PasOmUN@2 zlVML2%~n~%JXJWPb63M1y)Z?tg;I_q3Qw9-~kh> z`U#p`Wf62j)f6G0Ec6_YOnyEC_`87!1fFx{@?6S8;U_CiQC8d-GEh07 z_sun#Ey@6;lh%2d@&-85Rlzf{l3R;bEEVmGLYb2ey=s#JFtdh&-; zQ;I?qrQEG5eQxjHJ1T3ls<@;fsnDb-x^{d2UWQ!@8+#l)I|5}Fj1cfR6(winx)sav zmnq6MuR_p-P=j#FxJc_YE+GcdN*Im+y(2IKMR7rKWS&ea3Wq|9Z0Sp^L3Sh0GDDm9s}Z`y83Kza1iYhqn`@v%_db7iz%dPA(9QMw{FD=qOesBCoUp4WBHLH*=eeORrY z?AxqE&JSh*(_C0uD9LvHfo>;9WCgV;`zOKR-i(JqHpb=XmgKn#_m6Q{stZ=Yi{AH6~I-|AO>YYI{Ppe+KBs$&m z?yRyt<1$J&*fUTrx95a+>pvA`RcdK$vR?eJ&0{kfm+3j1J`5(|<^#5^=#a={5jnMn+?`FX zCNJk?z~9cyvWZcsmS}_IciH82e{%V+(&epz4xR0mF7H7(NS8PM_bxxnF8`q`QjyC~ z372QX<)6ak)5zuTlFZYnd*;UG%`OXu!#CSA%VN<(Hb?88*D}f`c1;g@C&OJf<`Uud zIl2d4eAnChvZ7>q>e4-Lr+bcjzXC#?xj9y)l!ml5iSC&#nnWM=i(WQEHpxZ0=NBC< zT7k@)`{Lqt#24fp@X#;k$kw%2|-{Y9*#2k+1DwVsu$N<&#vrmJQ&(1?p0!; z(xobf6!_k8D8TuHYJTLtXvzf6Xt5iggpP7|D^gM1j990)3sjC%x6{ia4Wu=?k%i#7{n)QMx}?aBWk) z8D#}(dhs9j4Iz5*Z`KX#QeIU^i7J-nsY^WNy%RGpI?NK?^M;=Mef|JjzY=n{Td}>Q zu1ZO+TR*|}j~cj2JCYjgMDIUV@P%F$v36CtDeqKtL$Fh^ZM%c~mwdujawkQK&uYyd zii{^^p!<4`qUbsJp%>R^$W1M1(UafJ@1qxgr8U2;4|`WX`K#_Z(0r#p z?1X+2y}Y)$RIjTc|DN519~^Hk@wcPyxtMy`w%1UCZSGULE$x8lh;16Kd6?n#vfZ)H z-(g_O*G-uJ(Uy+w+?LyFFj1u?p4ZEE>_PEUs)O+}@u<&{Sg$Cy1vMF^1unhr2$ca* z-PR>7K`+}zs_>7kpOWsYSv7t97#Etn)O~NPVu5*SN=J)Y1j(A4t?$}0@ zfLgl&)O+jCunPy3ImS>G$}$tYo`0dB}htJJ=000w{^*M`5ZxY zX6+O(TlNk>`(u4TgVd#2LkWzx77X;9)XQ|uyP*$xwBz`7V^a%t zwqIWqB^i_496?J#S!RoOqj1t{G&E^%YDvc$mfS`wUK*|D#|_@Nf~99XAu`2ltu*BpWJ;heC1Bk|(p8VRn4>2myM0&FO4O_`w5TF*N+bT(; zblWZvTbFILerF_~vu%AEzRnnSPA^Mq$w)q*Zku{uR_+LDRfl1uqdKJQP5a5`OH2Gl zFT0N*?HaD+qTP;xrD6=6Mu$!Jyd_3hcN$>}(uciOa88b;v)9o0;S!!Wdl`_h=6DjR z;OC6e)lTYQpz+kXyzl%7{j$aOSH&K|Gtb)Aw_2!gO?(a8NpF`HKsEDzVQMM@|qill}^~lLUm%?D(l=U(d z3Y=VOmbSgvK3JsApOumP!-jR~o{#k6*FyE=_clz_J?~+7)4rHgZEPb0Q!1v#`; zL;v6LJo(h}%n|67WoFsBxP$wxnqE45BkGqMieZwO<#U`npeV(yK3hpGX0Kg#TghHf zsem-BbO=h@Y6>DSxh$(wl(YAe4u*}G)t)XQch_y(4nppMBl0i-tj^PEC=Elao1S)K z+v;Ig_p)u>MH6W8CTl2M-2zwlqOL=(ZV}yuT`f9MM)J?L8*hQ}bk84p@d-HhmkrbX z4M1zU-_7e5wt0CLWdSdbv4U=MWAo)APFcX_Yn)!}3$LaYgtOak_vCKRN-5y>htfSC z!tGz7T(ngyU5ts)vLDVB^C~uNXbEf*W{t6R2|{Do?2*qxXzMbI^j@H-yUR4E$FdL6 z(rF3aU-w{oLUXJaUD}iB#Daxwe|qwvbpucVY+QZ~)l1Vbn8Xa7X0Hp@2T(DAn|o)J zMNSfVufS3+W;Z*Atarx`*g@FQ>^jC#F2<3|97plGr}qwOBU_i$*gRVoF&T(aG8NN& z9*v}tD%#aM5EZo9NyjdAFyg39k)(*SrHJTpG79#Q8eH& zVbTX9k(XX5w+Q9YC~JaI6cO*9<-Hx6vr6C++ojqthMt-Y9$`K3bQXu*aVNI=M5^RwAKvIfm*Mo2c1gyoXhZ>*`?Y_ zAfR4mw{1oCXs+*Pl?@L|DgMHSNj@BBSe&|1MjQt18`o!e4%1;U`YCh|+gh;GlRwTM zYU}3$l>2$*2iw|d=n2hs&yjsrZ0{kNu&h31-C(E|eELI*ZEbLD`pIuSM^ZfRNRh30 zI2B=e?b%_V>BBxiR6p6Q2OT`yiv*sZia)pM#b30fBKM%5>G-(wNl}2gD1h8+>nFdV zqAbGh76q6k3XtJBVRNHsl&4y4Mc4H-P>!`J>qAqL>r-vBYtxHs?HS2$6nwDloBSxx zVH8-F_oQDX1#4EpY%2WYWGI3Pk1RrkL9Ro9MZLJrt|$K?EOz%CcC$u+!Sv-d%`;F- zP+807@iWUJW@lovIz%2o(tY)~Yrx8r-))-hrS7S#lI{89#rY$-w%~gx7JSIZ3Yt9< zXuO08M=grYqeF8c4!174-$+@s2&d(APfhc?ZHEhroP7=Zbf=e(a{ z*~IEvGZ^vLDBkFG4N;W6sJ2oX?M+3)mDJ>~_in_=0V8rZi1*_#{CG$ve6ydJoaYGa zJp(2xid{zJW<$yIvG6 zzbjVEl(H-h>!&Bk=SU-Cy91QFlkN)E zBD&=~l(3ZBVI+!EE}LW^qUgybP%H->L)2`dk6~G~#r2qaj~_P{^;%+!+n_4GxRxnC zn_g#$++ZB-l@$AFk*cH=*Q=?emPSOILsLDL6Nq37k>WX*<~f<>dC!RJJ=|@8S=_4L z(38rnlYLGNKJ0Jp#Ud2*eF-i zA9a?YfYi8kmRQ87q4ZKq7esCQzU;ofHapY3`gzuY9m&RO-D72@7G~)`%;vSEfZQmC?)<@{JeJ!|M zva_LUQ0nE)}FP;`IKO#_)KW2B?@O?ealgd5mo>Bq&_h68(Q*8 zBfkKFhc|T6i_g3Y{0=Y~bgW0W!{*htuc_PmFp#k?uQxi!^m2>kQ>?Gg;~LoqeQ^^ePO{$4f>1oGTj$fNW9VvEW5>D zC++P45BeO}fQK;`x|bU2^&#lqUtNXkVeji`Lfw-Zn*q>5n^nuMtwOSWYhVeHb0 zlv;*CoitsDj{*yg3l8O5XYp+^`$8Ca)GNg5qhDP^V_My8T--Hk;H9*CD9s3Vnle@Q zM3$IL=a{TyZYax3LpHkU5u zPhfWOIqrMTDCjm;Tl1W;yIV}3DMG7?v=VXpuOZbOTvqrTBc3xp?>1Kb!|2_;mo_lO zxUhSFEo+OhuzMf(_$_dfx6iMbU%tc~P*PJ6Ji4a2yLaXw0m2fGdVdDL`KvuR`e2ea zyFk$-1t}HJdj(furrmgz_ihXiv}*je(*?08`d1j^-Yd~*F!|eozbAaD!1*JQLn8J> zmdMlSxq5NE?+2UPvKJa~*Z~lNL;+s|IbzvSWW+cIb=`CVi(;X^JaP{r=%lMp81o!O z6N-ar4n*diN=_Gq>NhzKP&W|^j_j{RlU@Qxx%s{P;F41X5#BFQ4ou+1R>Kw*)%Om_ zaKH9mL8!L|(=M&=Z=%FEfbAVP(3loAX{Kup48A=2p^r!0Jq#sIK3I^i7q6tPbEe(r zIDpF~-GlQWW+|LhfIKz&1r*;Y<7JuA5*IyV9E%!1=bx)#jxOuvUVJdI z=HT&a>a*~3wc-*KMfoT7C12b~SUY}vk9zR<0YtFZei3|J#)2C2dJODS4Li0wYlyS* zW+|CRv^Z|lX5-Et1GJl;HmZB{A2j%3>PMLQ)UKG)Nj_V+# zxy0pjtlDktkG?Q6k_^)9g1KY&9X*F@b9Wmfd(PD!d&(&3Io&lMeMv9HJC>!mP?2%( z^!`-&wtaw8FN+C9=6cyA1*EwvR$02k4DmVaPaEOA2D(pQBBXDD1WMnc!W19GUFFB? z&Qc>JP)}J3*N?Xp-UJ8kKpO-+wwDfMcxthRt+K7D`QDaSk4<{sNt_RA;(T;3KB)yi zHx8ivE^c0+RZx#`z~-6{`fe?{e@rzUa+|xXN*Qm@kHgKXHNQ`_23AH;O>?zve|<(! zEy*%%srBieTIvL_e$a5mB#$_U?GSA*P_sT6o)Eok0cNUtZ-|rF2UCtrx2ox-A&IAH z8=7wHib+-@jn85-`b@;B12X{p@1)ClTwP%QFXrmMKVf9_oziF76J$Ybg7d{DIBRKJ zwT%b*z8Eq1O_VUdFM40!H;tTr4lVReV`IM=+Q?m1HT^18EqIr4dH+YlG9QPXGRNkh z4f}v3Ep~%3bHJ2nZ6!ujL1<#l*>V{1IWBt?y(99Q6~==DoPA$gfpN7Jt1Rkt(Y_)m zl+E1Yy|y>0JiEg9c)-w}#ZbX(kR&Kk#TxK}(sRP+_}~#^z`*!^Qz6AcBR>xLMqyEh zKbqlAnCo0;xvs#ta$ro?5YqX@mmlGchp0I6r{zXXS`Teff$`kH7;Soi(J(N!zY~d@ zV=!92!+Ps`4VP8-Ak_ODp^u={k!peAh)w8GcfjXMFMh+9={b|`@n(3wO81ob%AYqD z#m2b{pI4P~a&V{gF8ISl5BLFt5AP;L{5!;{bL~Q}O26qAB!^2L z^)K_dJ=%R5UFj(9XzoD-1-%!<>!DLP($QH+%(R%EUZ$eTb>AJg7KYpQ3!e92XA{zi z%{xq8DNS8Prcz)EMqn($w6xA|DQ>bbBt_f74LvxcRJUSA^EvLi z&uADnXvP;SZ-Q%!a1_Q_RM8{j;kexS=>Dx~6OpNSky~Odw@!>)heybI# zPpmd34e!~hGnMFghR5>sLSxzR-dgVJs?Ec%(VW`V*zt;&eP~i_VlIlM%8dP#7V^@V z{cDWyQMX&i17SD0#&~$t9NW9d1PfT{ChR{Qr&b%m2^VU6uQDbjj0wBvDoSO!;i{_Z z6Y^E9@0CW&1-+*HnyV^kQx9D>$*mEcU@>8yguqMhArOC^;`J2wNd6)j|7Wg|J~}RJ z1B!{2?15Zk@2jGljRuCeKGwTqrm(^-sClI5Ezp^;}_ex$suUH4Cs1l%?S1 zHGlEov0T60c;Uj>E_0W|)wQynkt}_=arVMjw3QbbPbA%|)nytp#wTibWEwY&AE7PJ zG@cso)KW5y*T?tK24)(~FnE zwb*J^9Qq32+Q!10Daz9I`5_Cwi+VatQT>Y!Z7Sr>-K@#x71TR7I-j=+>Ac}WRA7U2A)etg|3250ZN5C$Ny#6q5R?^1P#DU>aax_0m zFP^k}6?8FpZlBVY1Sw|A6#8Lf)uaL12Oi_*NhS8ObR6mPhw|Yuuhi%}c~QjEm~xbY zNW8;om|b<_p*sbr;TO{EvpNOadwwbJlj$O^P&x-lu`0j=THs*h5_ z)K28k{2pk`h?&OsQ>R&9EkTEkyf)RCG%YrERw~u{n9qBDl<2Qt?yJXIAupejG108XaA7OxdgHHM|dYEN%9 zE>0Vvjht!}rH$8@ z(^~?U>X;Q617cS+3@U-UqJz-$MW#WFGv3E$FFH;)&}9)t@Z+yyKQ3(Ew#9HypAgvz z3k=?SCZ6&+_G~eZOdqHn+;22bUl_I4g-n8RVva3M^3J4%w=8CX%eZXDXl<~|xNSyX zEy!g&J7d26RV)p#Aa0v|j%7uLL%*QcW-xt@gd(vN_V7*MBA~!ICpVhHO8>dIimF~FdFCF zu05P+TzyHuhy&||>Fz#9PQG#1B`<5I_ZpYXovDSU8xPEVOuIriX3X26HCylc*|Z zC!pH$L}b@X^JAmsXO8q`<1cuJF~<05VWxKda3l4y`R=%>C{#fP#z6Kc8Xu7=7-+F@ zyiEWzaU?MXq=lH*DFO>I`zZnoF;6{aT)kwf>NcKPvL|ZEm1NH1o=iRHxhn*?ezK9j^m6Un zT%&R6)4?-x@omDE;XRDXoKS5t!f1;jR!BkzUvvJ77GY&D96!0 zdx9}ydB6BQU>Dc8N-d9*+;_0KR$i_upJHcP*L<_S{3N!IH%~C`UEVvgU4F08BeU-sC{suF<{la=p8vUfqC(T5Y~%d=q}NNqtVjKjoVfwYeOd) z$5-8?Ju%Lhcf}01caYc#l{HZ}nB~NqjE^MeZ;}%a&RddmrQ{@lb4+p;NKO(sHIkDi zIWBPiAvuYXql2?sa{5b7E;##ENR~~q^1#|7Isf`t6sQoK$0Vm&a6Fhfur5a4Et&5~ z=61=vMKWt8lMb-ZbPqDzxv?{k#)*pFDDC17A@Wtp$(J0w&We0daxRygY;c+-Crfg2 zz&R6F^-XTA8nmR3TJ_vjHdPz5*f?Uk5et8LZ+gS$!(MKPWT_a3kbAF{ z+-`if#kJ&x3-Hbp2Aj3S(-~!B&lI4wu(U+tg&t0==c#DT_{8;~321{TkFej)M@gVM zukHLh(nlZKIqq|y%%`bBGtDFJF`-+NKN|b4%@FT%p?)c1+dS-~@xZmVQRI^55lB4` z;^t~ZG7w4e9PsZf^*2wXC;mF?rv30A4%nj{MYz(~i}!wX3e7_tbzl9c(SKcEEpCC4 zvMy?H?IV0_egP3kUj*@1(@KY0;9mX^ou|C>jm_(NIqrqbJc@3Y>RWC#o?h3(T}g%K z!|dF7xN;M3)5SS>F(nF?B}kWv=3sZ}9f3T|b18>(*bSJPR8(ij_I+ z4;vTdFV^P)^i&tsSWyrcM=#~^3XhH}cFdJ{`|EQ& zJ_k062O{9EvCN{3FrF#c)B7>vZmYoxM8=9y!h z-Y`R(I>(6JIJR?@&40e$INZ2mV^$9b8j-(kH;S+8ACw!Z z8joK$saw%(3>RNRb7%MoU$S}}YiC#ee4SMd`zan}SZ?_uzRLPHpQ?R6$Ozjs&`oo= z_oib$ADyKw`v{!_(#OX z3ns0yv3G)`mtB;ADP&)z4ei(aJhh)?F7#>ra;l2))TRxK-o%8fdm=h{@90MjX*noy z5I&Gh@HyU2rLKcnu#$Y}plrHP!MZd>daB(_?MSpJi2$Eh?HDv?xS1 zs*38hvonlMTQ+G|%`kr7GC>B?nYd>wtbi-PF z*#LFAShhcJ?n_@N5BoMf`I`;+5&<7`zn<zu?WKuMk9kRM4IT)i`=(#!CqJ)1GC zZmR7c87-5i+g{l}-uZ;_)$Nys*Uk0$u+BF@clI5tHE>_KV|KXj5}$9T=T74GFivXu zV~nqiEN#FTW8$5&Y}@Aed^ZPQ=sPgebIYgDxa-bL4dnAXhmZK}V$&M-%Lhvr-!pZ4 z>bc3YJSDKCDpQLxS|$Z2&AYAnxX)2N+L*j!lJ;Dov1vy?Eqk)N@9|UCto8 zRW-ibu`cm9{H7L`zpnH?Rhd~lsjPyT7$Je2X-x^n=89fXixU1KCARw&F0Jo(MoWb==xd8=blZ7K z+c?Vja;G!un~_L>-`v2R;w`Z`oR!^(xqDRQ^?-VIps={6zQmr5^mEL)`jzdJ-z+nqyE22bQ_Q@ip>>VlTVu=4l& zwsvj`LgfbG)PSY(Enn5p`|s2uHpGi!*wA$c8^X80_TBp#HG%vlE-mp? zMp?|Ws;XpeL*hxc?5b-Yx($a@Lw#hJ_JhwD`AEO02e8pwWsCQ&vdtZ_T*OC>xa=`w z`6C0|HvxWcTNG!*VQ!Ue)YuA8TS=ozXl~qDpbQ)z2U^xbFJoY2AxQekGwFCQrrXxw zJ=&N$@9T zdrUW&0F6A21mD{(eIMZ%!U5!^V630Yo=5u8H1@PEDz%bdk%62-Y@-bub zW0O+*%N!j&1+{+#kz*4!dGPCIWWWCHF{^C9j<^TXA8cRzboLzfj;qQG`odb|d2Ffh z1<$C*j8`9XB(_TAKykdst=J_E4g7M=auj0Rr6pVTP~;80ljYrqjnK!3x@jkP_}4Ff zIQ+}$5pIhAGHS#|P+Lig26XbfZ@@WhyYW->1?V`QBAwqB#U-MUkc@p9)K+q7AAaw2+;=if+~bsHE53$MbT>N7;j_(-pD4k(=E!eA z(I-~D2>8RIV~1+jqqBf979KeK!=<%{f3wGoCo{ja`@i!2F5o3k4Z|F+~93J{mT17&K$4rT>>k<4jVUjW1k%3KKKP)w>^rpn5Pl* z=~ejN07;5lLkgB+Dtr`DGr@!Ooo4Zh*aXbek&94q#N+XnC%PE zm0B)?B^*R_&)Yb;irnapTDIYRGF5B%-Wd7R>dwo~D{U+Myzh<0q`ZYN}7NE+^S@Nu0R5ab3Byy7oDWXCV$6@QI)DVA+78hfApCF1Wdpcvg(*+yD+ zzEJhbo_jUz=I&LCsz$3lp8fz;&5t`@>&ka}&*AXX-2aGW=Lg24FTAGRd%?r&UR1U3 zyBhibn5xZBFslF2N897BdgmV_)c)Bg@X4EP>n9o}<}Iy?Q&BcVQACMWHb$PeWWI02 zR{yNExT|9Jj#RboMMmbnXSDoxjeqSspd}Sm)xNw_)vAUVm;H0NmQ!Su{`0o}(~b&@ zAF3FT$(G4L8=?@Iga}zoddnF9$|x=PsBzUR>$S=vh9m-;-}R_|_NmS)F$Up5}A z9jxADyiwcJvAP7;s4mOsE(%7mA&Vba1sUk*%*FKl+Ac|16nkoh}}+5{=1~9 zOcya-$Fzv)T}*c|eTC^Mre8Bv?veKTFrC2kB1zrK<;>X3bSKkim>y#K5z`-;TJM#H zdojI;D=?997Sqd_<}oc|S}v#?zfr}E8m5g*74}R7(_T#DnT}@aVmgOuKGPzmw=#W% z=^m#0i6Vcco*5r7{hH|?Os)6Jns#UEWICFu&U6XWLZ){xeTeBErU#gw0;T+w&zRA| z^be+8*`@JJCorWn^hBF&ETK{~TK=60le$hwoYR4_x>9*U>4H~3{%1_Q;;OiKpxS-- zHG^eROvysy&|{J|ZIbkZ9g-&0bBb=kS(0NvDCzHaDHSaf)v;ZRwy45HjzbFe^e~3j z^&Q%{wIf@KTmP)Su5MhA6W8$%*G;0;q3U$q5ViLJ#Fi_ol@-cJWu;Px;8aF|<5UJ1 zF-Lo=P9x~(Cij(VHY~g5$`#J_`RlG+bA>Z+?fNV8uUxxExqR6Q=dx??hc1>0h}Gw> zOH=g!!ncd1$C4zygMZ3Ic(GH)KLC2ryGY zgq*}7p(+u=Oo>oH`XI`m3IIq3Bo#y`NURbe%#;WlKnxjZEN4nY$|YYlF;fsx2P#0Y zn`#Kk1rSs~Xpsj*21E!mCBg-ea*gFoiAcHRt0ra&(pCWEPc;aV889Ux4M@IfVx}Ob z0g+DCSf42f%OzhmG1CxkWO%?0Md<;HYyvZ`}qYF7xBJ2Ud zM<0-wDF{rEhuvsx=>awX2mx`~1JZzrnS!tZP0B%pK2s2uOTKDirWVr!c<&n&EDI1U zYXB$;5NsAeV0b`crXXekq+DY;QxKL*zG`Bo!CU}0^+L*!h^&F6fNVfw)x=DL%o?bg zNCzVInQCov$yZIxRP=fpe_|NO0w9012^>OH5b)(ZAp1ZFVG@H9!9Pkb^aUYI5R{0N zOHA{Cz)V440{x!~Kp6@m3;>b=5Rrf;0AL~lGX7jJRmXCU=+a3H3$+l#K4yZ zBn4yx5@Q~am}wBzKvqDc!#p4{Q>{%d`KpPThRE?Rn}7_V34$%`0ipzD29i(nfWS;a z@K2-{>8K9~%oK#>l8-(hF;ldETMdFJL+S(4fTVzIKw|U(iJ1mj+R}@3=n7KKRBMw< zzG`Bo7BT*14Maln02e?|K(hb>!vkCZNrQsh3Lxbg%b99za>-Xs%+wt$eBQ1JxCTLj zYC&cO600U=8uX|1tglI`b(FWq{_$@O#WWZag4q~d(PF`*C@IA)!NEZtvB@V{a8Qu; z-^n}b%XID_I0{wKH1*#z;7|Y88TjR9LCyRGbt7ZST*GChITKpL!aGGocD6|eny9l) z5nCBQrhZ}~(x>!(4yE@aDQ}Mnxn)-Jr!0VJQWn5O(m=2!5c`ooeV|+mGLb27kAd8x zrY76;fK)d)*Zrfd+yt?G3cYCJIa+sILV{ z#f(QGHDhNaXi`AIm;K5@}d^z%Q45AW%+u`7zc%3H>FcZWn04L}mu< zv55lH2WCKhfU@(;+hI2ZB>uAph)Y3^0*d(y5EAOgt=~hk)lGdrGCe2@ zOZskqS=zgh+SPBsM5clE*hGF8%aLyu$V7g*w2hzs@&D&0ps^a*2MGBKAf*z^d7ym- z0_EfZO6@OziFy1>*uD*EY?~QUCv0z^J(j3_`ape}2ijMVv76_5f`8oy0zF_2GYe$) z0Tau#fi;w^Zpuv*=mE0kHW^g*_9c|_fZqVMa$pASu|(}X5U5XmpuK&8-N;t9A;G`$ zKwtqvLfaQ05L4Rr8Bm@5`Vs{ekfdV%lLa97=K=&82)4A(pgktkF@2!E7SvG=O#6S+ z1Lj<3;=p-;hN+whrL_G#5D`h(pSd|oWUCXB>CL=MIo3aE&h&sp?F-<~Q1%GYH4Vs- zZ(&v{Rt%U7f5zOe}=LT`1NTb3QR9i`}Bcw>H`54c4IYb#}NC0zw&^;1|)4? zfIuvz?F$enClB}wfc2j|;AhZ?{i`PMXGk6h)F%%FVnQ7&5GbepK%1P_e?<*o07pay zj`YAjAluw8ZQlpNJ4tLBH``c_0zzhb=^f&T^0t8}09n%NOX&w-AbNyE^4+JI%@8oagKo9t9Ahk^_Jzxzpv6Oc7 zfL|`>fwuWyjsk0#KLN!83uMj%W(HKeKz-Q<{OL*BF@2yu^#REJ>p%5@zy#K?|A`0u z8A=cMG1&^VC;Nb3P96~Ve`bxS4+JLQE6BFxS$ZJQfV@=lr*Dsg`HsggZ(kvCvl6)e zcg&z8ws-Cv(K#X_oI*r+xYeW-54T!FI%1PgGHXak@L$Q@Bs3K|CNTMwI3ze&`zr(g zoAiHS-z`dJX3#N1lTVokYj~T_mq(^c1DnenC8mt988@k!o@5k6`v)qLLLin({x&xa zmBaq@Nbn!M zM*FwlqRIPzyb+_jUl0@p9uSm>tf9pJ)oV1F9y5waFR7eh$U_qU1bx8tfPBkkVx}O-nEQZ8kN0BI12Vn&)(m}s_(X(0QxJOp zCk#l1fA=*Sb$?la|K(dWcUukqqt|FO3PcV6w{Owh{5lKu*CERg$hka|Nj@S(PRxV;;Dup0y70+5B&HaD#8tvbHi-z}4!u9{*YqYkSJNxvB?h_r|okDc??sk(>yt~~V(Gj~%0SRey z(NUqJydyT#nH!V;WqP-@qk;b}gO2)U#vOM=fm^V^EuEMr&`G6Sod0DLm z;m#$sXp~UbYQF=LJ05etASqA2ZB0YzoDX>Y7k$A0s#RuXmed&?ZI8CwtrVzm z_}$TVPdR^T<>F7$@}82PUfFj``t^AE;h0&a@~)Ck)fAuCRWc)#HFgCk5UZMT7|ZJ! z<4-M$r?CU}GLB$*Ylrl~-DCmqNw&yeu`|QWz}W#ObigjgW`T9aW`VL9<1c-PC$~fT zb&SpYm3(GkLoJ>n#%2cF8Jph%-ohA167iIGz;|}g-`PQauZd;-@xN4=3^urnvDp=0 z=pe6VY!+yL2YF2ge5iwdJ!7|N;CKgx2FCO~Aw6$(kT-U~A9TP?j7<-H)0sc;4)WFx`1cN2=`K5&X+O9Fwh9dYn+g#f6zm;v_YOF^1Mb7v^q8{)j_sfy zPng=@EWq#%3JHwOQQ_)L7Y(Q=MIGejz@q)>cbMtf#R~X!0rAu` z#%~vh$J;?}bx0SR@_5E(dY$n=PM^mZzgZxja);^`U%on-QOyed7&kH=#8`=v8JY&1 zjPc90;z?j^Ho+Li7M8m@=x5lNmiZ!;Tqroas7FR2|28 z$9bXSMAd#2pl7&xs#V=iz8%snk4v(LX$u6uy*pNOe?7PT0y<`1dz^Hu#Mdyrfj=`h z>HZ~B?p!LVew(B#m~zdPe73uY^><1dr?k3df-yyGpiojXgOYsy$b72FF-`98P}Cb3 zn|iUPyp3Nq^z<6FcYI&jOi4_2rrCY*OW+@5x)b_K`52~2OeZpRF->KvGtFQ+muU{u zT&9IgOPH23y_adFq;BOAX6$0Ro9P~=FEFiUx}Rwc(?d+_nKm$OWcnG?ubGbGrfW7cBYj~>zOvis#Pz4{C1eTa+u7)9QjR*ox_>Ww1KH} zgyfquL=NLhrcF$pBRM_O2BywY%$Kx}f+CQ zVr;HIdl-uqm&RE&Gt3pOhOxQE*E2SEK@E)iat4iz`!Q}}>}2d^+@Em^V_MQFf2C!p zY-4ki(#i_vCIV}L=tSlo!phj(HQ5;t<_w}44`J+NZ0-@_8DkG3@>dd=F`N@5F~;BQ z6AwnCD8MMjI^%JSvlw54cQHLYU#= z1fh(x7}Ni3Mo$i7{J#O>!5k|Lc4C~z@(9L7j3XJBGw#f|QegPs#*96zU}s#zxC>)* z$I_Ltxnt?ZxPkS%Gj3w+VBEquim@^k6`=NyW`>;@z&#l|8TVqGz_>SK7vnyRvlz!P z&SBh_aUSD-jEjK9I_qRcIV<#MT*-I<<2{TAGOl49%eaAY9OEX&gBZ6k9?V#o#>cZE z%&QL%b5N|Dm|@?Co{IXQ)L0BFe93=i*Y>T6vj!6r!m$Ur!vlAoW?kh z@pQ&TjAt-*mop=s8I_D@GTy_O{*yv_Y8YoQZeV;7<0i(l8MiRbVyvXe3eS<)t=O3{ zpB0>p7cfp>ypXYr@k+*7jIU;#!}uD;d5pI(E@G^T9SO!?IWvNJi(;NgLK#=GJdE)k z#^H=>7)LN}U~FgH#JC&d7RKEPi}`=LbV(E|*cta?>|`9nIEnFa#yaC<#yN~9GtOf? zjd2mSD@uEKr!U-X?iZ&@RV9n} zlk7~zb*c2uwJbN!p$wHQmNzmZhw=N2^BB{gHKM18aiu_*SIU`jn`9`Jj88D$!}x8+ zHH=R&ZeaWb<0i&?8MiP##8_D`?v6@4%gwt5>t)i#4{`cv#uf%S}U`8t| zG%>a=mL7STaWvyM7{@a{!#IiYX~sI^j~Hh&evfgk!0`VOW>|R~o3|^4oWMM3yI5}C zj%;W7HJskba`U!jC(CnLu5%NGGu}mVYX1yo+{!qUv2_WbEC0caXfSBf+0VF%3pAN=Jj=H;Hg8AF>zpK(o1HqF3mn1vI?K(= zkzCYYWN6+OWwSy)C#Yrvyctq*S^g}`3mKc2BRQ-e$@1+ipUpUdD-_Ro=MuN9@m0() zuiW}E-o*x%G0x=-Iy0_jIWN3Q9?NYkuV?uV#*K_GW?bmz1a@Y4Sz!+2Y%cK##;q)0 zXBuGn1&pmrWrYeE*RXs7<7k#|W$Z5E0(4=9dEqpLaXcp|Wt_zL62?WG!Dz-h%dcY` z&GI(fT}C8o<5tES7+aUg z^!J+Ue+_5YlNF*_;WEYwXE=ayJj+)wPGbBDW1aCq#@USbFwSLME&LB=Av0cMh3$;% z7}s+FdokY0@Af` zcsqM2k#RiBuV>uCau?$yDR(P3Gh+`cBr(?6KoR3=mXBwg&GIdb8@a%J80WHl3FAV> zYZx~PefU3y8QWQ5DdU}-;aC&1{07G6+ZZR~T`a$xv6lUe1LjkNDG2)z9zZBZup>N;P=K%s zp#{3dpji!=0^$*A0OPJxigFvm7KHT(D-kY6n1nC{!GUn(O+|SX;W>nd5q2PKL0FA& zDMA{;fVUN;H$o(W?=3|+hwv%F+X!_CdlBfl;~ho0m5u=SAX18O2;l{U3WRM4Um?7U z(1dUlp$1_Of`PCFp?9OAbVrCp2tn|@t0+GqG$Wirco*R`_-`S+j&KCwRfHE2oFCi!W{_sAJEmH4b*tyt|wJx*A`VN+EQ_DqS_0*;PExU z=F<=mCm!jW4}GmFc=$m!l!|l9)gIxwP;qWml~!r8B4Mf;9F+uy`D7zrgwP-qqNY*; zjfH_W$w=U{6M7~mP;b{(DtlA~UL{$&2BeXBs1@H$QDZt$;$0Bp&o2r_cnuiw#jsZ_ zYF?3m)GosOWFy|O_9UWordD7nge~a-FXe^gMW$);Kuv({Cd8$EQSul{@K+unBkWcC zQ>v0sqAJ!BE-u;B!7!g(!~<r@ypR970U-?`9bq2AQiN*|u0!x37zj@y zJcppz@vjGZGA7=vZqj~)1^hQKZO{&)1ta7*aLxyc;sg~B5+%HhgKGdDJSS_-1d_6|H^mbd3EB)y&OcM+=o7bm#Gb^iK!9bJAGXDzyA6a zm!k!ggi?$)ksyD0YCeX_wz6&&?MjmbfPiDqd$u~7d@HNjw7B@sVXk&kTOp(f471y zaO^rUq(y$BFRoiZfzsq)oHyVIIr8%L>j^70m?t^|=dl&|yGgiw{kr9`3F5Tcbh6^x z>FQ-e@3SfQ{rGof$6NO(WrrS8w&XvktQ%8_uQ~5kEKNZNN*+QbJlG$_X^(?3hLNa)o*EgV zM2-npB1ea{gyw`~^|xq>({kXM-d3gekHJdRp$H{%ZYRZpT9$WJlvfaHgmDxUas_e) za^+8Q3?Nf~7!u&`H!2}>w1l2<;Y!q8n-Vpqvl6wgYm2?9b4^5EryOdM1XQ-7NLQn$ zm0u`7ZO=!yDI6lFOQMe>>S!%XbyyY03WPDCilb}iCRnVf)71;2$PgM@*$CU} z1^EAX-X~hoIb9u9adEnOiG~~>N>>LBFcss_ImaLjf+A5hG)M`ZN}Z&v!%TJSIFr9O11+72|J(<5E&=U=Z&7SxLKNHRPI;!zCg|LV zaO(Yvk+amkZ8jgDttcNOgr2TgGE1Ga(A1B-SW$W)oPtey{>o-LD(-p^Hr;Wesc|~~-;p5X4zhxyza!eH1W8ul0Mw-{To zas=9e5mjlRV8)`yJb;+{&uC&g=tuj<#k^LmvUn;6PF1^vN8g3j5Mj>_vG2Z&P9F3G z8Y_pB0v|g79UkZj)XVCiM{+aM?RTja{ZiDZnIbQlmgMF`X9#)%?O6w!Qa?5AdCA^X z)e&yRvR~=1Kq4I+=m|7bGQe-ZjG2bAD%en7dqdOdv_Mawq11p9Sp)v${vgDYK9PG6 zGlP-zpBFUU-aqR9|BoI1zx^LO;6(PH{KpOz@6T7`yELgYR_0GzyL$DqH7hc%T(fe) zOX>pkyP%h}%hWg2yOyXK6?2!UeXIpLWrwZ6FH>}XDSwH2jU}ulPF|a-71z4dZWX^T zSBD2>Kd#b$$q@5Dh>Qr%d7N*uy5+@7Q!PUz&Fd@7jCHp>Dj9olGe*M(dkpckA}QfL z`~PpKo1fp=?hDfHFoh%k1Nzb@E3t@F+%i=S!E=BjZ)6uB%{9U&qflT&3z zP9ri5I-)wVa@hV)NtwU4Ab;uFRZG_`TXV%q*ZTYwE|)YKbftR4jj7VyS_kf+X(w&z zg8#7bW>wH=#1jxF8jIjUoaj)5Y{UaMzqDiCjH$m6e4;la+=)0*+QjZb+}zB%Y4=OJ z-~>#~4Tuw+h|q#K(WwY_kE+nreG9@3I0KY}9_P4%HDfda@pC{QLMTCe4`>5IIpRdm zAnZiE1yqfaahyrqZHE*(tPJge-!Xs^(dh^ch!edJp$T!Kk1@XibUCJNIwI2aU4uY{ zAR3BU*oi{Z`am->@rf33oM;__(}RO>JtEBrRMM|OZLu)%M2YS=wyT}#Ob2sY6Q~9e~+RJz{a2A_%Biv{KqLGEzwLjgDlWmoCM|~ z@gdN65GaF2(1(VjK;Sr8`-ElL zP9i=Dub^Z27JT5-j2J$?5tBobp#a~qJ-3Exv(Ks^3Y`m>b213Kk@QBm%Jw1nr0oY` z8MQ|UhHmHPioAo+L=t}n&g)_RoqHW()M}*gVfafVi6-DjKVuzG9@uAlVcPcI&$4NY zy2v{U-$2s1I^6R)wup$Ai!*%@7ufg$oI+Cm)FSq-F4zJ7ZveHHTco|x2)G4Fq5-(u z_T%s@3X!G`|8Dyxe8=|PpI7Q0Bzc#?@7O*9Ke?C#oV;GR8KvVSiejFW0Dchu6-f`y z!5i4M6F&!jo9~G#nfqZ8NqhzV$M%=u9bdBI7sGu>PQ?^_2T8>N)}E*Ck-3_t#5tAZ{VLS5ty!?%`js^JHga@O3<{Q+Z39CtPCtWpE5hFNL0ERwIP# zki>^!8r3LMxb|y|1U>@0md8152y`uHw-rfCqwrIR_c3b=i{vZ8!>y46eO(JUU>6*tDr8p9!aZX@Y1))OwXEdYrj&5@!R394fGD5 zgx5z{G4U>V)A#8R-U}CPVSA)=@2-wS~%v z?}R6RK*RBqkjI`?KVEnqNoR!Whn5$f_%YK#nlZQ_MrZKxUd$#W87ASw4>KKnupK_K z)#_OSjv+ZdgzL9i4eE!-P>b}!zU_QZ9AGNphDWR=IRf86QvOwVVFw2|X)Z#Z<>vdJ z07flLa5Uq4-~f_ySGeO*)&t@b@FJ2a5H5MlIu3-(e!}TQ8sRo1m2HQ!cCi6Ud>YQ) zV>Q|jA4F14dJh!`l2!(xfvRK}fggI@YJ?kJ`l+?_HsKe4W{pGuZbj|N;DjA7yl$_R zrW3BP{e3Wpq+b;+nmxl5xH??NSijTreX{%!`c_#$-(;GUx z@1D5ppXRp)Di(eUweUW8%`;ZdI^YrHKFFxR*bzE|Prx}D&K$h();zt(cf;pV51zNw zsk3?JUn=(M{8Wr&>8-&J6s-6;@ChVymV)z&9Gqkp9z`4RBk-`n1u965k777EhUzaQ<`5|6V@uVP^i08w0!xKKDGANcb^0 z`vt2q7wkqdTEc%KS;a2GbrYOUqz^;Ki`J-gz~3XOtPYp{L9wdQ2sq;SwrwR|DBG^$g$3KM5c8rP5WZ=9;k&jM%6_I~7Ro-Pc;QOh%f4fx z?S~%yf@AYR*EJW8&)(`-=!n0{{LEnT?LXBsoNkW)g*eJzXE}6Ehtq%K2%b3|mf!md zpO_98X3bCq*K{~IcZP~|OovBrB0L>b$H%uh?p!{zF8|7S=-QKxk1h0Od>MZxlnG}d znP?`KNn}*snRn&gc~9P(_vQWh0BZx+U6c|mhsxn{Wa!_g9D~<#rOa76wCl8ERXkJ- z7b8WjJW?JnSIbl7TDe|sl$+&N*;#Q_+!as7Tk%!=l|Us_iBw{hL?u~CRnirw;WFHY z$A}s+BViN(V`joknkh4FYG%P4F-OgDbIPolb+chM&6X*@32v8>(43k}b88;WtNAp)7SMXN zpcc}?T11O#F)g7bwUn0DG_9bGXrtP=R@J7onpW2uT2pIjYS=mK8g>tRhP}h8>@2&= z?()!#Nr#6Y=(vYsE{}ik6~|nMKUqu{3&qi5wOA`QimjrvJF+4NKir^U9ecG|ZU(Yl%D(lL6 zvc7B}8_b5Y(QG1{%4*q>?09x6ThBJLD(A|1a=u(37tDoo(Oe>z$_@3Latu7EqAb@G zTWAk&(2V?l Date: Sun, 11 May 2025 14:54:27 +0200 Subject: [PATCH 197/305] creating lockFile generation in build --- generate_a_winpython_distro.bat | 43 ++++++++++++++++++++++++++++++--- winpython/__init__.py | 2 +- 2 files changed, 41 insertions(+), 4 deletions(-) diff --git a/generate_a_winpython_distro.bat b/generate_a_winpython_distro.bat index 7fdbc12f..cdabf95e 100644 --- a/generate_a_winpython_distro.bat +++ b/generate_a_winpython_distro.bat @@ -2,7 +2,7 @@ rem generate_a_winpython_distro.bat: to be launched from a winpython directory, @echo on REM Initialize variables -if "%my_release_level%"=="" set my_release_level=b3 +if "%my_release_level%"=="" set my_release_level=b1 if "%my_create_installer%"=="" set my_create_installer=True rem Set archive directory and log file @@ -26,8 +26,8 @@ if "%target_python_exe%"=="" set target_python_exe=python.exe rem Set Python target release based on my_python_target if %my_python_target%==311 set my_python_target_release=3119& set my_release=1 -if %my_python_target%==312 set my_python_target_release=31210& set my_release=0 -if %my_python_target%==313 set my_python_target_release=3133& set my_release=0 +if %my_python_target%==312 set my_python_target_release=31210& set my_release=1 +if %my_python_target%==313 set my_python_target_release=3133& set my_release=1 if %my_python_target%==314 set my_python_target_release=3140& set my_release=0 echo -------------------------------------- >>%my_archive_log% @@ -114,6 +114,43 @@ cd /D %~dp0 call %my_buildenv%\scripts\env.bat python.exe -c "from make import *;make_all(%my_release%, '%my_release_level%', pyver='%my_pyver%', basedir=r'%my_basedir%', verbose=True, architecture=%my_arch%, flavor='%my_flavor%', install_options=r'%my_install_options%', find_links=r'%my_find_links%', source_dirs=r'%my_source_dirs%', create_installer='%my_create_installer%', rebuild=False, python_target_release='%my_python_target_release%')" >> %my_archive_log% +echo -------------------------------------- >>%my_archive_log% +echo "(%date% %time%) generate lock files">>%my_archive_log% +echo -------------------------------------- >>%my_archive_log% + +set path=%my_original_path% +call %my_WINPYDIRBASE%\scripts\env.bat + +rem generate pip freeze requirements +echo %date% %time% +set LOCKDIR=%WINPYDIRBASE%\notebooks\ +set req=%LOCKDIR%requirement_%WINPYVER%_raw.txt +set wanted_req=%LOCKDIR%requirement_%WINPYVER%.txt +set pip_lock_web=%LOCKDIR%pylock_%WINPYVER%.toml +set pip_lock_local=%LOCKDIR%pylock_%WINPYVER%_local.toml +set my_archive_lockfile=%my_archive_dir%\pylock_%WINPYVER%_%date:/=-%at_%my_time%.toml +set my_archive_lockfile_local=%my_archive_dir%\pylock_%WINPYVER%_%date:/=-%at_%my_time%_local.tml +set my_changelog_lockfile=%~dp0changelogs\pylock_%WINPYVER%.toml + + +python.exe -m pip freeze>%req% +findstr /v "winpython" %req% > %wanted_req% + +rem pip lock from pypi the local, from a frozen req +python.exe -m pip lock --no-deps -c C:\WinP\constraints.txt -r %wanted_req% +copy pylock.toml %pip_lock_web% +python.exe -m pip lock --no-deps --no-index --trusted-host=None --find-links=C:\WinP\packages.srcreq -c C:\WinP\constraints.txt -r %wanted_req% +copy pylock.toml %pip_lock_local% + +rem compare the two +findstr /V /R "^url =$" %pip_lock_web% > %pip_lock_web%.no_url.txt +findstr /V /R "^url =$" %pip_lock_local% > %pip_lock_local%.no_url.txt + +fc %pip_lock_web%.no_url.txt %pip_lock_local%.no_url.txt + +copy/Y %pip_lock_web% %my_archive_lockfile% +copy/Y %pip_lock_web% %my_changelog_lockfile% + echo -------------------------------------- >>%my_archive_log% echo "(%date% %time%) END OF CREATION">>%my_archive_log% echo -------------------------------------- >>%my_archive_log% diff --git a/winpython/__init__.py b/winpython/__init__.py index b865bf4c..c1fdd2f8 100644 --- a/winpython/__init__.py +++ b/winpython/__init__.py @@ -28,6 +28,6 @@ OTHER DEALINGS IN THE SOFTWARE. """ -__version__ = '15.4.20250507' +__version__ = '15.5.20250511' __license__ = __doc__ __project_url__ = 'http://winpython.github.io/' From 72c8ecda5eb8677ac66d73c0c917e88d823777f9 Mon Sep 17 00:00:00 2001 From: stonebig Date: Sun, 11 May 2025 18:02:18 +0200 Subject: [PATCH 198/305] from pylock to requirement with hash via openai + a small tweaking --- pylock_to_requirements.py | 67 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 67 insertions(+) create mode 100644 pylock_to_requirements.py diff --git a/pylock_to_requirements.py b/pylock_to_requirements.py new file mode 100644 index 00000000..6d182a59 --- /dev/null +++ b/pylock_to_requirements.py @@ -0,0 +1,67 @@ +import tomli # or import tomllib for Python 3.11+ +import hashlib +import sys +from pathlib import Path +from collections import defaultdict + + +def parse_pylock_toml(path): + with open(path, "rb") as f: + data = tomli.load(f) + + # This dictionary maps package names to (version, [hashes]) + package_hashes = defaultdict(lambda: {"version": "", "hashes": []}) + + for entry in data.get("packages", []): + name = entry["name"] + version = entry["version"] + all_hashes = [] + + # Handle wheels + for wheel in entry.get("wheels", []): + sha256 = wheel.get("hashes", {}).get("sha256") + if sha256: + all_hashes.append(sha256) + + # Handle sdist (if present) + sdist = entry.get("sdist") + if sdist and "hashes" in sdist: + sha256 = sdist["hashes"].get("sha256") + if sha256: + all_hashes.append(sha256) + + package_hashes[name]["version"] = version + package_hashes[name]["hashes"].extend(all_hashes) + + return package_hashes + + +def write_requirements_txt(package_hashes, output_path="requirements.txt"): + with open(output_path, "w") as f: + for name, data in sorted(package_hashes.items()): + version = data["version"] + hashes = data["hashes"] + + if hashes: + f.write(f"{name}=={version} \\\n") + for i, h in enumerate(hashes): + end = " \\\n" if i < len(hashes) - 1 else "\n" + f.write(f" --hash=sha256:{h}{end}") + else: + f.write(f"{name}=={version}\n") + + print(f"✅ requirements.txt written to {output_path}") + +if __name__ == "__main__": + if len(sys.argv) != 2: + print("Usage: python pylock_to_requirements.py pylock.toml") + sys.exit(1) + + path = Path(sys.argv[1]) + if not path.exists(): + print(f"❌ File not found: {path}") + sys.exit(1) + + pkgs = parse_pylock_toml(path) + dest = path.parent / (path.stem.replace('pylock','requirement_with_hash')+ '.txt') + write_requirements_txt(pkgs, dest) From 92022e4acb8abf34ab5bb8bdec96f2361e7913da Mon Sep 17 00:00:00 2001 From: stonebig Date: Sun, 11 May 2025 18:10:19 +0200 Subject: [PATCH 199/305] compatible with dot version and python-3.10 --- pylock_to_requirements.py | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/pylock_to_requirements.py b/pylock_to_requirements.py index 6d182a59..9438233f 100644 --- a/pylock_to_requirements.py +++ b/pylock_to_requirements.py @@ -1,13 +1,22 @@ -import tomli # or import tomllib for Python 3.11+ -import hashlib import sys from pathlib import Path from collections import defaultdict +# Use tomllib if available (Python 3.11+), otherwise fall back to tomli +try: + import tomllib # Python 3.11+ +except ImportError: + try: + import tomli as tomllib # For older Python versions + except ImportError: + print("Please install tomli for Python < 3.11: pip install tomli") + sys.exit(1) + + def parse_pylock_toml(path): with open(path, "rb") as f: - data = tomli.load(f) + data = tomllib.load(f) # This dictionary maps package names to (version, [hashes]) package_hashes = defaultdict(lambda: {"version": "", "hashes": []}) From d87e94541f12c8f8d309725895106f0cab7eb115 Mon Sep 17 00:00:00 2001 From: stonebig Date: Tue, 13 May 2025 20:33:32 +0200 Subject: [PATCH 200/305] generate pylock.toml and requirement_with_hash.txt at end of build creating a Wheelhouse.py separated file, that should grow the full WheelHouse feature --- generate_a_winpython_distro.bat | 27 ++++++++++++------- winpython/__init__.py | 2 +- .../wheelhouse.py | 12 +++++++-- 3 files changed, 29 insertions(+), 12 deletions(-) rename pylock_to_requirements.py => winpython/wheelhouse.py (86%) diff --git a/generate_a_winpython_distro.bat b/generate_a_winpython_distro.bat index cdabf95e..ecbf76b1 100644 --- a/generate_a_winpython_distro.bat +++ b/generate_a_winpython_distro.bat @@ -115,7 +115,7 @@ call %my_buildenv%\scripts\env.bat python.exe -c "from make import *;make_all(%my_release%, '%my_release_level%', pyver='%my_pyver%', basedir=r'%my_basedir%', verbose=True, architecture=%my_arch%, flavor='%my_flavor%', install_options=r'%my_install_options%', find_links=r'%my_find_links%', source_dirs=r'%my_source_dirs%', create_installer='%my_create_installer%', rebuild=False, python_target_release='%my_python_target_release%')" >> %my_archive_log% echo -------------------------------------- >>%my_archive_log% -echo "(%date% %time%) generate lock files">>%my_archive_log% +echo "(%date% %time%) generate pylock.tomle files and requirement_with_hash.txt files">>%my_archive_log% echo -------------------------------------- >>%my_archive_log% set path=%my_original_path% @@ -123,30 +123,39 @@ call %my_WINPYDIRBASE%\scripts\env.bat rem generate pip freeze requirements echo %date% %time% -set LOCKDIR=%WINPYDIRBASE%\notebooks\ +set LOCKDIR=%WINPYDIRBASE%\..\ set req=%LOCKDIR%requirement_%WINPYVER%_raw.txt set wanted_req=%LOCKDIR%requirement_%WINPYVER%.txt set pip_lock_web=%LOCKDIR%pylock_%WINPYVER%.toml set pip_lock_local=%LOCKDIR%pylock_%WINPYVER%_local.toml +set req_lock_web=%LOCKDIR%requirement_with_hash_%WINPYVER%.txt +set req_lock_local=%LOCKDIR%requirement_with_hash_%WINPYVER%_local.txt + set my_archive_lockfile=%my_archive_dir%\pylock_%WINPYVER%_%date:/=-%at_%my_time%.toml set my_archive_lockfile_local=%my_archive_dir%\pylock_%WINPYVER%_%date:/=-%at_%my_time%_local.tml set my_changelog_lockfile=%~dp0changelogs\pylock_%WINPYVER%.toml +rem to get pylock.toml in a ok place... +cd/D %LOCKDIR% python.exe -m pip freeze>%req% findstr /v "winpython" %req% > %wanted_req% -rem pip lock from pypi the local, from a frozen req -python.exe -m pip lock --no-deps -c C:\WinP\constraints.txt -r %wanted_req% + +rem pip lock from pypi, from the frozen req +python.exe -m pip lock --no-deps -c C:\WinP\constraints.txt -r "%wanted_req%" copy pylock.toml %pip_lock_web% -python.exe -m pip lock --no-deps --no-index --trusted-host=None --find-links=C:\WinP\packages.srcreq -c C:\WinP\constraints.txt -r %wanted_req% + +rem pip lock from local WheelHouse, from the frozen req +python.exe -m pip lock --no-deps --no-index --trusted-host=None --find-links=C:\WinP\packages.srcreq -c C:\WinP\constraints.txt -r "%wanted_req%" copy pylock.toml %pip_lock_local% -rem compare the two -findstr /V /R "^url =$" %pip_lock_web% > %pip_lock_web%.no_url.txt -findstr /V /R "^url =$" %pip_lock_local% > %pip_lock_local%.no_url.txt +rem generating also classic requirement with hash-256, from obtained pylock.toml +python.exe -c "from winpython import wheelhouse as wh;wh.pylock_to_req(r'%pip_lock_web%', r'%req_lock_web%')" +python.exe -c "from winpython import wheelhouse as wh;wh.pylock_to_req(r'%pip_lock_local%', r'%req_lock_local%')" -fc %pip_lock_web%.no_url.txt %pip_lock_local%.no_url.txt +rem compare the two (result from pypi and local Wheelhouse must be equal) +fc "%pip_lock_web%" "%pip_lock_local%" copy/Y %pip_lock_web% %my_archive_lockfile% copy/Y %pip_lock_web% %my_changelog_lockfile% diff --git a/winpython/__init__.py b/winpython/__init__.py index c1fdd2f8..cac91627 100644 --- a/winpython/__init__.py +++ b/winpython/__init__.py @@ -28,6 +28,6 @@ OTHER DEALINGS IN THE SOFTWARE. """ -__version__ = '15.5.20250511' +__version__ = '15.5620250513' __license__ = __doc__ __project_url__ = 'http://winpython.github.io/' diff --git a/pylock_to_requirements.py b/winpython/wheelhouse.py similarity index 86% rename from pylock_to_requirements.py rename to winpython/wheelhouse.py index 9438233f..b29f560e 100644 --- a/pylock_to_requirements.py +++ b/winpython/wheelhouse.py @@ -1,3 +1,5 @@ +# +# WheelHouse.py import sys from pathlib import Path from collections import defaultdict @@ -15,7 +17,7 @@ def parse_pylock_toml(path): - with open(path, "rb") as f: + with open(Path(path), "rb") as f: data = tomllib.load(f) # This dictionary maps package names to (version, [hashes]) @@ -46,7 +48,7 @@ def parse_pylock_toml(path): def write_requirements_txt(package_hashes, output_path="requirements.txt"): - with open(output_path, "w") as f: + with open(Path(output_path), "w") as f: for name, data in sorted(package_hashes.items()): version = data["version"] hashes = data["hashes"] @@ -61,6 +63,12 @@ def write_requirements_txt(package_hashes, output_path="requirements.txt"): print(f"✅ requirements.txt written to {output_path}") +def pylock_to_req(path, output_path=None): + pkgs = parse_pylock_toml(path) + if not output_path: + output_path = path.parent / (path.stem.replace('pylock','requirement_with_hash')+ '.txt') + write_requirements_txt(pkgs, output_path) + if __name__ == "__main__": if len(sys.argv) != 2: print("Usage: python pylock_to_requirements.py pylock.toml") From 09ac673367074b96f77a037127520bfd7fcbc743 Mon Sep 17 00:00:00 2001 From: stonebig Date: Tue, 13 May 2025 23:24:49 +0200 Subject: [PATCH 201/305] pip lock can do more --- generate_a_winpython_distro.bat | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/generate_a_winpython_distro.bat b/generate_a_winpython_distro.bat index ecbf76b1..1766a18d 100644 --- a/generate_a_winpython_distro.bat +++ b/generate_a_winpython_distro.bat @@ -135,27 +135,22 @@ set my_archive_lockfile=%my_archive_dir%\pylock_%WINPYVER%_%date:/=-%at_%my_time set my_archive_lockfile_local=%my_archive_dir%\pylock_%WINPYVER%_%date:/=-%at_%my_time%_local.tml set my_changelog_lockfile=%~dp0changelogs\pylock_%WINPYVER%.toml -rem to get pylock.toml in a ok place... -cd/D %LOCKDIR% - python.exe -m pip freeze>%req% findstr /v "winpython" %req% > %wanted_req% rem pip lock from pypi, from the frozen req -python.exe -m pip lock --no-deps -c C:\WinP\constraints.txt -r "%wanted_req%" -copy pylock.toml %pip_lock_web% +python.exe -m pip lock --no-deps -c C:\WinP\constraints.txt -r "%wanted_req%" -o %pip_lock_web% rem pip lock from local WheelHouse, from the frozen req -python.exe -m pip lock --no-deps --no-index --trusted-host=None --find-links=C:\WinP\packages.srcreq -c C:\WinP\constraints.txt -r "%wanted_req%" -copy pylock.toml %pip_lock_local% +python.exe -m pip lock --no-deps --no-index --trusted-host=None --find-links=C:\WinP\packages.srcreq -c C:\WinP\constraints.txt -r "%wanted_req%" -o %pip_lock_local% rem generating also classic requirement with hash-256, from obtained pylock.toml python.exe -c "from winpython import wheelhouse as wh;wh.pylock_to_req(r'%pip_lock_web%', r'%req_lock_web%')" python.exe -c "from winpython import wheelhouse as wh;wh.pylock_to_req(r'%pip_lock_local%', r'%req_lock_local%')" rem compare the two (result from pypi and local Wheelhouse must be equal) -fc "%pip_lock_web%" "%pip_lock_local%" +fc "%req_lock_web%" "%req_lock_local%" copy/Y %pip_lock_web% %my_archive_lockfile% copy/Y %pip_lock_web% %my_changelog_lockfile% From 9978bfd76f11f0a7b57542d32c7d99237f0e4991 Mon Sep 17 00:00:00 2001 From: stonebig Date: Sat, 17 May 2025 18:31:39 +0200 Subject: [PATCH 202/305] Spyder "edit with" working as expected --- portable/launchers_final/Spyder.exe | Bin 201728 -> 226816 bytes portable/launchers_final_proposed/Spyder.exe | Bin 204800 -> 226816 bytes .../Spyder_2025-05-08_no_drag_and_drop.exe | Bin 0 -> 204800 bytes portable/scripts/winspyder.bat | 4 +++- winpython/__init__.py | 2 +- winpython/associate.py | 4 ++-- 6 files changed, 6 insertions(+), 4 deletions(-) create mode 100644 portable/launchers_final_proposed/Spyder_2025-05-08_no_drag_and_drop.exe diff --git a/portable/launchers_final/Spyder.exe b/portable/launchers_final/Spyder.exe index 43874aa73321e432f55941c8898c345d0c23ea50..93b1a050376acabb1c1ee025c9865064badf33f2 100644 GIT binary patch delta 79176 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 delta 54055 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 A6#xJL diff --git a/portable/launchers_final_proposed/Spyder.exe b/portable/launchers_final_proposed/Spyder.exe index f3729201f61f2d3d042e5c34984f6d5c94c8cdc8..93b1a050376acabb1c1ee025c9865064badf33f2 100644 GIT binary patch delta 78059 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 diff --git a/portable/launchers_final_proposed/Spyder_2025-05-08_no_drag_and_drop.exe b/portable/launchers_final_proposed/Spyder_2025-05-08_no_drag_and_drop.exe new file mode 100644 index 0000000000000000000000000000000000000000..f3729201f61f2d3d042e5c34984f6d5c94c8cdc8 GIT binary patch literal 204800 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

    bj{CUl}#OwK@*7{t)?Jh19HlS4u@p^ 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 literal 0 HcmV?d00001 diff --git a/portable/scripts/winspyder.bat b/portable/scripts/winspyder.bat index deae01c5..1a843ca0 100644 --- a/portable/scripts/winspyder.bat +++ b/portable/scripts/winspyder.bat @@ -1,3 +1,5 @@ @echo off call "%~dp0env_for_icons.bat" %* -"%WINPYDIR%\scripts\spyder.exe" %* -w "%WINPYWORKDIR1%" \ No newline at end of file +rem "%WINPYDIR%\scripts\spyder.exe" %* -w "%WINPYWORKDIR1%" +"%WINPYDIR%\scripts\spyder.exe" %* + diff --git a/winpython/__init__.py b/winpython/__init__.py index cac91627..a9a855a8 100644 --- a/winpython/__init__.py +++ b/winpython/__init__.py @@ -28,6 +28,6 @@ OTHER DEALINGS IN THE SOFTWARE. """ -__version__ = '15.5620250513' +__version__ = '16.0.20250513' __license__ = __doc__ __project_url__ = 'http://winpython.github.io/' diff --git a/winpython/associate.py b/winpython/associate.py index 5d5854ff..b3a2eb85 100644 --- a/winpython/associate.py +++ b/winpython/associate.py @@ -133,8 +133,8 @@ def register_in_registery(target, current=True, reg_type=winreg.REG_SZ, verbose= lost_entries.append((rf"Software\Classes\Python.NoConFile\shell\Edit with IDLE", None, None)) if Path(spyder_exe).exists(): - dynamic_entries.append((rf"Software\Classes\Python.File\shell\Edit with Spyder\command", None, f'"{spyder_exe}" "%1"')) - dynamic_entries.append((rf"Software\Classes\Python.NoConFile\shell\Edit with Spyder\command", None, f'"{spyder_exe}" "%1"')) + dynamic_entries.append((rf"Software\Classes\Python.File\shell\Edit with Spyder\command", None, f'"{spyder_exe}" "%1" -w "%~p1."')) + dynamic_entries.append((rf"Software\Classes\Python.NoConFile\shell\Edit with Spyder\command", None, f'"{spyder_exe}" "%1" -w "%~p1."')) lost_entries.append((rf"Software\Classes\Python.File\shell\Edit with Spyder", None, None)) lost_entries.append((rf"Software\Classes\Python.NoConFile\shell\Edit with Spyder", None, None)) From 13f0c385a40ae0887f60d6a7ea1a402b19ec320e Mon Sep 17 00:00:00 2001 From: stonebig Date: Sat, 17 May 2025 18:38:15 +0200 Subject: [PATCH 203/305] "%w" is better --- winpython/associate.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/winpython/associate.py b/winpython/associate.py index b3a2eb85..7825ce48 100644 --- a/winpython/associate.py +++ b/winpython/associate.py @@ -133,8 +133,8 @@ def register_in_registery(target, current=True, reg_type=winreg.REG_SZ, verbose= lost_entries.append((rf"Software\Classes\Python.NoConFile\shell\Edit with IDLE", None, None)) if Path(spyder_exe).exists(): - dynamic_entries.append((rf"Software\Classes\Python.File\shell\Edit with Spyder\command", None, f'"{spyder_exe}" "%1" -w "%~p1."')) - dynamic_entries.append((rf"Software\Classes\Python.NoConFile\shell\Edit with Spyder\command", None, f'"{spyder_exe}" "%1" -w "%~p1."')) + dynamic_entries.append((rf"Software\Classes\Python.File\shell\Edit with Spyder\command", None, f'"{spyder_exe}" "%1" -w "%w"')) + dynamic_entries.append((rf"Software\Classes\Python.NoConFile\shell\Edit with Spyder\command", None, f'"{spyder_exe}" "%1" -w "%w"')) lost_entries.append((rf"Software\Classes\Python.File\shell\Edit with Spyder", None, None)) lost_entries.append((rf"Software\Classes\Python.NoConFile\shell\Edit with Spyder", None, None)) From f1d5293c4080bb881bd116bd660c292f98604d1c Mon Sep 17 00:00:00 2001 From: stonebig Date: Sat, 17 May 2025 19:14:32 +0200 Subject: [PATCH 204/305] retrying IDLE Drag&Drop with update VS toolchain --- .../launchers_final/IDLE (Python GUI).exe | Bin 119296 -> 144384 bytes .../IDLE (Python GUI).exe | Bin 132608 -> 144384 bytes .../IDLE (Python GUI)_2025-05-09_not_ok.exe | Bin 0 -> 132608 bytes .../IDLE (Python GUI)_20250401.exe | Bin 0 -> 119296 bytes 4 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 portable/launchers_final_proposed/IDLE (Python GUI)_2025-05-09_not_ok.exe create mode 100644 portable/launchers_final_proposed/IDLE (Python GUI)_20250401.exe diff --git a/portable/launchers_final/IDLE (Python GUI).exe b/portable/launchers_final/IDLE (Python GUI).exe index c1e0c9dc452c9d6f29f91bfd398b6e1403291494..655231994190695525c083a6183388780987aeb7 100644 GIT binary patch literal 144384 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
    a+K$4q#O?#%;kWiMh!b z_nHJ4>T&BNz^}}WdrAzJiKj~Isoqx2h`UzX;m11<7iGu?cj>9JN_xao{T@5GHOJ*t}iCHc(xZ;7YP-JU9D?F^p+OW{fs?!vEEYZ!2jF1ucbNO-?RF?0rT=RdFk_6dd2m~ zQ0(s%bLpWW+f1^LvZCgP42Yaf1L_19m$4P{E=jmpQy%lTte-vst5aj}it@IBSl5Y)csEBn%B{FoR(HExp`x7bB`p!`l( zVkSS=qR(ed_?t3!GsQQULm7P8p4kB3Hs2ayvjw_h{W}wrhZI8<(u4E~Lt4x{hSk}b zm^tK|oUGB8`RL(G*%0FhVQ_b;B1oY51O7lBPEarg00RkkgBp8uN>>jSrFmQ~B~!Oq zNU_$9FW6Jt=;C+i_faJ1&WBm){@t$&1*UwV@@h&u`FZ1LyEd~!9gIpk=aR`>!bphi z&-p`%eJv-kP4v8I+vuR?c%Ir&F*H*SPA!IQK#L1B8nhuZVGR zMUN3~IF=UHem?o(M4aEq+O>hV5AmvfV?pY{Hh1jM^k}kWdWtP0dirHX?kal}XW<$N}GLp<2zClZ#~Dq|qoVb2$nKNr4Tg?m(_GSQTyPOblwNcQNF zoOtmxRsx1|@}9;s2?Q%ojSpf{cpA%y%}$<@5=9A~4wh}S{&hhcUMdZXip1eAJ{s=s zZ}>ULK^?JCZ!rI=I?}-y07dIy1F3pOs)(N|a%O>NMd9qEV-*S1#g!kHYi!OTUT=}> zm2I9CTtIMnX{9*=V8ZAsABC_UafR3r?>;jW`24O@^+*xk-c9^)bNgyBi^2aW3NPEU z=}>xg7+~g`N1Ms*9)Zqz-wRgWW{*_@CY{jNg;XOf0NJt}^n$L46OI7UwIcK7J+dA= zO`;n%-w+GldUnlIsV+56ra|)bU8p>)fv-D~3zoZ|)~Dnq^xS%LJ}D|RxW_8|)vbFK znw;%vu;Vg)a(zdib9_BzMjiNenFp;h%Xc4MM&v_T(q8j;+M3v{JoaDXriwzam^FZ{v;(7grvNI=W@y z<4Mxz_j*PD&>ksY7uk=>cpAp6gD%e!;go6u-z=Cl**NEnhz>)2C=%Ge(B~ON7eoZ( z$W+F=D=bq-^Gw+jaqvB}-~(# zHj3j_HRW5D(_TOn4GJyIAJnJCa!w4fLKS{*g7o|D({sJu9~&Lzuu=II�jE_dCk} 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 literal 0 HcmV?d00001 From 14d47b684b6bdcf067e8a29e29fa21fcb59cdfb1 Mon Sep 17 00:00:00 2001 From: stonebig Date: Sat, 17 May 2025 19:47:13 +0200 Subject: [PATCH 205/305] respect PEP-0751 regular expression: r"^pylock\.([^.]+)\.toml$" only two "." allowed, like "pylock.any_thing.toml" ... REGEX is a foreign langage, like APL --- generate_a_winpython_distro.bat | 24 +++++++++++++----------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/generate_a_winpython_distro.bat b/generate_a_winpython_distro.bat index 1766a18d..0b466928 100644 --- a/generate_a_winpython_distro.bat +++ b/generate_a_winpython_distro.bat @@ -2,7 +2,7 @@ rem generate_a_winpython_distro.bat: to be launched from a winpython directory, @echo on REM Initialize variables -if "%my_release_level%"=="" set my_release_level=b1 +if "%my_release_level%"=="" set my_release_level=b2 if "%my_create_installer%"=="" set my_create_installer=True rem Set archive directory and log file @@ -124,16 +124,18 @@ call %my_WINPYDIRBASE%\scripts\env.bat rem generate pip freeze requirements echo %date% %time% set LOCKDIR=%WINPYDIRBASE%\..\ -set req=%LOCKDIR%requirement_%WINPYVER%_raw.txt -set wanted_req=%LOCKDIR%requirement_%WINPYVER%.txt -set pip_lock_web=%LOCKDIR%pylock_%WINPYVER%.toml -set pip_lock_local=%LOCKDIR%pylock_%WINPYVER%_local.toml -set req_lock_web=%LOCKDIR%requirement_with_hash_%WINPYVER%.txt -set req_lock_local=%LOCKDIR%requirement_with_hash_%WINPYVER%_local.txt - -set my_archive_lockfile=%my_archive_dir%\pylock_%WINPYVER%_%date:/=-%at_%my_time%.toml -set my_archive_lockfile_local=%my_archive_dir%\pylock_%WINPYVER%_%date:/=-%at_%my_time%_local.tml -set my_changelog_lockfile=%~dp0changelogs\pylock_%WINPYVER%.toml + +set WINPYVERLOCK=%WINPYVER:.=_% +set req=%LOCKDIR%requirement.%WINPYVERLOCK%_raw.txt +set wanted_req=%LOCKDIR%requirement.%WINPYVERLOCK%.txt +set pip_lock_web=%LOCKDIR%pylock.%WINPYVERLOCK%.toml +set pip_lock_local=%LOCKDIR%pylock.%WINPYVER%_local.toml +set req_lock_web=%LOCKDIR%requirement_with_hash.%WINPYVERLOCK%.txt +set req_lock_local=%LOCKDIR%requirement_with_hash.%WINPYVERLOCK%_local.txt + +set my_archive_lockfile=%my_archive_dir%\pylock.%WINPYVERLOCK%_%date:/=-%at_%my_time%.toml +set my_archive_lockfile_local=%my_archive_dir%\pylock.%WINPYVERLOCK%_%date:/=-%at_%my_time%.local.toml +set my_changelog_lockfile=%~dp0changelogs\pylock.%WINPYVERLOCK%.toml python.exe -m pip freeze>%req% findstr /v "winpython" %req% > %wanted_req% From 22afd3354513090dc1a078989afb965140cbc064 Mon Sep 17 00:00:00 2001 From: stonebig Date: Sun, 18 May 2025 14:40:58 +0200 Subject: [PATCH 206/305] restore Drag & Drop on WinPythonControlPanel launcher --- .../WinPython Control Panel.exe | Bin 150528 -> 174080 bytes .../WinPython Control Panel.exe | Bin 153600 -> 174080 bytes .../WinPython Control Panel_2025-05-09.exe | Bin 0 -> 153600 bytes 3 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 portable/launchers_final_proposed/WinPython Control Panel_2025-05-09.exe diff --git a/portable/launchers_final/WinPython Control Panel.exe b/portable/launchers_final/WinPython Control Panel.exe index 5795bf9c7d21bed97783602689c0e32337cea753..72a57a6762d3237857f7e8b853afb69f14b59d4b 100644 GIT binary patch literal 174080 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 z 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 K;p;!S2L2!MrBw0& delta 62000 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 wNA8X?b%*Yv-NW7qUL1Lpw>n(*Dz#@=1 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 z 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 K;p;!S2L2!MrBw0& delta 63109 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ËG5Wb(SSks1`8DaMJj`|U!1Iyv4JDOWC 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 Y*R=uHQQ*3{XmED+w`ayY!&2qH0h<|Tn*aa+ diff --git a/portable/launchers_final_proposed/WinPython Control Panel_2025-05-09.exe b/portable/launchers_final_proposed/WinPython Control Panel_2025-05-09.exe new file mode 100644 index 0000000000000000000000000000000000000000..664ff576ae8fe6f7a44dce52b682503c327a850a GIT binary patch literal 153600 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 literal 0 HcmV?d00001 From cf4fea956cad75fcf691b25f1c064063f76a986b Mon Sep 17 00:00:00 2001 From: stonebig Date: Sun, 18 May 2025 14:42:53 +0200 Subject: [PATCH 207/305] reduce .bat script quantity --- portable/scripts/WinPython_Terminal.bat | 3 --- portable/scripts/register_python_for_all.bat | 3 --- portable/scripts/unregister_python_for_all.bat | 3 --- 3 files changed, 9 deletions(-) delete mode 100644 portable/scripts/WinPython_Terminal.bat delete mode 100644 portable/scripts/register_python_for_all.bat delete mode 100644 portable/scripts/unregister_python_for_all.bat diff --git a/portable/scripts/WinPython_Terminal.bat b/portable/scripts/WinPython_Terminal.bat deleted file mode 100644 index 3e55a021..00000000 --- a/portable/scripts/WinPython_Terminal.bat +++ /dev/null @@ -1,3 +0,0 @@ -@echo off -Powershell.exe -Command "& {Start-Process PowerShell.exe -ArgumentList '-ExecutionPolicy RemoteSigned -noexit -File ""%~dp0WinPython_PS_Prompt.ps1""'}" -exit \ No newline at end of file diff --git a/portable/scripts/register_python_for_all.bat b/portable/scripts/register_python_for_all.bat deleted file mode 100644 index 9f45aa70..00000000 --- a/portable/scripts/register_python_for_all.bat +++ /dev/null @@ -1,3 +0,0 @@ -@echo off -call "%~dp0env.bat" -"%WINPYDIR%\python.exe" "%WINPYDIR%\Lib\site-packages\winpython\associate.py" --all diff --git a/portable/scripts/unregister_python_for_all.bat b/portable/scripts/unregister_python_for_all.bat deleted file mode 100644 index b1600226..00000000 --- a/portable/scripts/unregister_python_for_all.bat +++ /dev/null @@ -1,3 +0,0 @@ -@echo off -call "%~dp0env.bat" -"%WINPYDIR%\python.exe" "%WINPYDIR%\Lib\site-packages\winpython\associate.py" --unregister --all From 1be9e944b4a84da6f56abb1b6242ff28647324d9 Mon Sep 17 00:00:00 2001 From: stonebig Date: Sun, 25 May 2025 00:05:07 +0200 Subject: [PATCH 208/305] WheelHouse integrated management --- winpython/__init__.py | 2 +- winpython/wheelhouse.py | 140 ++++++++++++++++++++++++++++++++++++---- winpython/wppm.py | 12 +++- 3 files changed, 138 insertions(+), 16 deletions(-) diff --git a/winpython/__init__.py b/winpython/__init__.py index a9a855a8..c8ebca8a 100644 --- a/winpython/__init__.py +++ b/winpython/__init__.py @@ -28,6 +28,6 @@ OTHER DEALINGS IN THE SOFTWARE. """ -__version__ = '16.0.20250513' +__version__ = '16.1.20250524' __license__ = __doc__ __project_url__ = 'http://winpython.github.io/' diff --git a/winpython/wheelhouse.py b/winpython/wheelhouse.py index b29f560e..e93e7bc4 100644 --- a/winpython/wheelhouse.py +++ b/winpython/wheelhouse.py @@ -1,8 +1,14 @@ -# -# WheelHouse.py +#!/usr/bin/env python3 +""" +WheelHouse.py - manage WinPython local WheelHouse. +""" + import sys from pathlib import Path from collections import defaultdict +import shutil +import subprocess +from typing import Dict, List, Optional, Tuple # Use tomllib if available (Python 3.11+), otherwise fall back to tomli try: @@ -14,10 +20,9 @@ print("Please install tomli for Python < 3.11: pip install tomli") sys.exit(1) - - -def parse_pylock_toml(path): - with open(Path(path), "rb") as f: +def parse_pylock_toml(path: Path) -> Dict[str, Dict[str, str | List[str]]]: + """Parse a pylock.toml file and extract package information.""" + with open(path, "rb") as f: data = tomllib.load(f) # This dictionary maps package names to (version, [hashes]) @@ -46,9 +51,9 @@ def parse_pylock_toml(path): return package_hashes - -def write_requirements_txt(package_hashes, output_path="requirements.txt"): - with open(Path(output_path), "w") as f: +def write_requirements_txt(package_hashes: Dict[str, Dict[str, str | List[str]]], output_path: Path) -> None: + """Write package requirements to a requirements.txt file.""" + with open(output_path, "w") as f: for name, data in sorted(package_hashes.items()): version = data["version"] hashes = data["hashes"] @@ -63,13 +68,119 @@ def write_requirements_txt(package_hashes, output_path="requirements.txt"): print(f"✅ requirements.txt written to {output_path}") -def pylock_to_req(path, output_path=None): +def pylock_to_req(path: Path, output_path: Optional[Path] = None) -> None: + """Convert a pylock.toml file to requirements.txt.""" pkgs = parse_pylock_toml(path) if not output_path: - output_path = path.parent / (path.stem.replace('pylock','requirement_with_hash')+ '.txt') + output_path = path.parent / (path.stem.replace('pylock', 'requirement_with_hash') + '.txt') write_requirements_txt(pkgs, output_path) -if __name__ == "__main__": +def run_pip_command(command: List[str], check: bool = True, capture_output=True) -> Tuple[bool, Optional[str]]: + """Run a pip command and return the result.""" + print('\n', ' '.join(command),'\n') + try: + result = subprocess.run( + command, + capture_output=capture_output, + text=True, + check=check + ) + return (result.returncode == 0), (result.stderr or result.stdout) + except subprocess.CalledProcessError as e: + return False, e.stderr + except FileNotFoundError: + return False, "pip or Python not found." + except Exception as e: + return False, f"Unexpected error: {e}" + +def get_wheels(requirements: Path, wheeldir: Path, from_local: Optional[Path] = None + , only_check: bool = True,post_install: bool = False) -> bool: + """Download or check Python wheels based on requirements.""" + added = [] + if from_local: + added += ['--no-index', '--trusted-host=None', f'--find-links={from_local}'] + pre_checks = [sys.executable, "-m", "pip", "install", "--dry-run", "--no-deps", "--require-hashes", "-r", str(requirements)] + added + instruction = [sys.executable, "-m", "pip", "download", "--no-deps", "--require-hashes", "-r", str(requirements), "--dest", str(wheeldir)] + added + post_install_cmd = [sys.executable, "-m", "pip", "install", "--no-deps", "--require-hashes", "-r", str(requirements)] + added + + # Run pip dry-run, only if a move of directory + if from_local and from_local != wheeldir: + success, output = run_pip_command(pre_checks, check=False) + if not success: + print("❌ Dry-run failed. Here's the output:\n") + print(output or "") + return False + + print("✅ Requirements can be installed successfully (dry-run passed).\n") + + # All ok + if only_check and not post_install: + return True + + # Want to install + if not only_check and post_install: + success, output = run_pip_command(post_install_cmd, check=False, capture_output=False) + if not success: + print("❌ Installation failed. Here's the output:\n") + print(output or "") + return False + return True + + # Otherwise download also, but not install direct + success, output = run_pip_command(instruction) + if not success: + print("❌ Download failed. Here's the output:\n") + print(output or "") + return False + + return True + +def get_pylock_wheels(wheelhouse: Path, lockfile: Path, from_local: Optional[Path] = None) -> None: + """Get wheels for a pylock file.""" + filename = Path(lockfile).name + wheelhouse.mkdir(parents=True, exist_ok=True) + trusted_wheelhouse = wheelhouse / "included.wheels" + trusted_wheelhouse.mkdir(parents=True, exist_ok=True) + + filename_lock = wheelhouse / filename + filename_req = wheelhouse / (Path(lockfile).stem.replace('pylock', 'requirement_with_hash') + '.txt') + + pylock_to_req(Path(lockfile), filename_req) + + if not str(Path(lockfile)) == str(filename_lock): + shutil.copy2(lockfile, filename_lock) + + # We create a destination for wheels that is specific, so we can check all is there + destination_wheelhouse = wheelhouse / Path(lockfile).name.replace('.toml', '.wheels') + in_trusted = False + + if from_local is None: + # Try from trusted WheelHouse + print(f"\n\n*** Checking if we can install from our Local WheelHouse: ***\n {trusted_wheelhouse}\n\n") + in_trusted = get_wheels(filename_req, destination_wheelhouse, from_local=trusted_wheelhouse, only_check=True) + if in_trusted: + print(f"\n\n*** We can install from Local WheelHouse: ***\n {trusted_wheelhouse}\n\n") + user_input = input("Do you want to continue and install from {trusted_wheelhouse} ? (yes/no):") + if user_input.lower() == "yes": + in_installed = get_wheels(filename_req, trusted_wheelhouse, from_local=trusted_wheelhouse, only_check=True, post_install=True) + + if not in_trusted: + post_install = True if from_local and Path(from_local).is_dir and Path(from_local).samefile(destination_wheelhouse) else False + if post_install: + print(f"\n\n*** Installing from Local WheelHouse: ***\n {destination_wheelhouse}\n\n") + else: + print(f"\n\n*** Re-Checking if we can install from: {'pypi.org' if not from_local or from_local == '' else from_local}\n\n") + + in_pylock = get_wheels(filename_req, destination_wheelhouse, from_local=from_local, only_check=False, post_install=post_install) + if in_pylock: + if not post_install: + print(f"\n\n*** You can now install from this dedicated WheelHouse: ***\n {destination_wheelhouse}") + print(f"\n via:\n wppm {filename_lock} -wh {destination_wheelhouse}\n") + else: + print(f"\n\n*** We can't install {filename} ! ***\n\n") + +def main() -> None: + """Main entry point for the script.""" if len(sys.argv) != 2: print("Usage: python pylock_to_requirements.py pylock.toml") sys.exit(1) @@ -80,5 +191,8 @@ def pylock_to_req(path, output_path=None): sys.exit(1) pkgs = parse_pylock_toml(path) - dest = path.parent / (path.stem.replace('pylock','requirement_with_hash')+ '.txt') + dest = path.parent / (path.stem.replace('pylock', 'requirement_with_hash') + '.txt') write_requirements_txt(pkgs, dest) + +if __name__ == "__main__": + main() diff --git a/winpython/wppm.py b/winpython/wppm.py index 659d14a4..258795e3 100644 --- a/winpython/wppm.py +++ b/winpython/wppm.py @@ -231,7 +231,7 @@ def main(test=False): description="WinPython Package Manager: handle a WinPython Distribution and its packages", formatter_class=RawTextHelpFormatter, ) - parser.add_argument("fname", metavar="package", nargs="?", default="", type=str, help="optional package name or package wheel") + parser.add_argument("fname", metavar="package or lockfile", nargs="?", default="", type=str, help="optional package name or package wheel") parser.add_argument("-v", "--verbose", action="store_true", help="show more details on packages and actions") parser.add_argument( "--register", dest="registerWinPython", action="store_true", help=registerWinPythonHelp) # parser.add_argument( "--register_forall", action="store_true", help="Register distribution for all users") @@ -239,13 +239,14 @@ def main(test=False): # parser.add_argument( "--unregister_forall", action="store_true", help="un-Register distribution for all users") parser.add_argument("--fix", action="store_true", help="make WinPython fix") parser.add_argument("--movable", action="store_true", help="make WinPython movable") + parser.add_argument("-wh", "--wheelhouse", default=None, type=str, help="wheelhouse location to search for wheels: wppm pylock.toml -wh directory_of_wheels") parser.add_argument("-ls", "--list", action="store_true", help="list installed packages matching the given [optional] package expression: wppm -ls, wppm -ls pand") parser.add_argument("-lsa", dest="all", action="store_true",help=f"list details of package names matching given regular expression: wppm -lsa pandas -l1") parser.add_argument("-p",dest="pipdown",action="store_true",help="show Package dependencies of the given package[option]: wppm -p pandas[test]") parser.add_argument("-r", dest="pipup", action="store_true", help=f"show Reverse dependancies of the given package[option]: wppm -r pytest[test]") parser.add_argument("-l", "--levels", type=int, default=2, help="show 'LEVELS' levels of dependencies (with -p, -r), default is 2: wppm -p pandas -l1") parser.add_argument("-t", "--target", default=sys.prefix, help=f'path to target Python distribution (default: "{sys.prefix}")') - parser.add_argument("-i", "--install", action="store_true", help="install a given package wheel (use pip for more features)") + parser.add_argument("-i", "--install", action="store_true", help="install a given package wheel or pylock file (use pip for more features)") parser.add_argument("-u", "--uninstall", action="store_true", help="uninstall package (use pip for more features)") @@ -331,7 +332,14 @@ def main(test=False): sys.exit() else: raise FileNotFoundError(f"File not found: {args.fname}") + else: try: + filename = Path(args.fname).name + if filename.split('.')[0] == "pylock" and filename.split('.')[-1] == 'toml': + print(' a lock file !', args.fname, dist.target) + from winpython import wheelhouse as wh + wh.get_pylock_wheels(Path(dist.target).parent/ "WheelHouse", Path(args.fname), args.wheelhouse) + sys.exit() if args.uninstall: package = dist.find_package(args.fname) dist.uninstall(package) From 64a41c37e0c689020723755658c8de8d27502e67 Mon Sep 17 00:00:00 2001 From: stonebig Date: Sun, 25 May 2025 11:10:23 +0200 Subject: [PATCH 209/305] the end of suffering --- make.py | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/make.py b/make.py index c1a6a93a..18aa8117 100644 --- a/make.py +++ b/make.py @@ -221,10 +221,7 @@ def build(self, rebuild: bool = True, requirements_files_list=None, winpy_dirnam if rebuild: self._print_action(f"Creating WinPython {self.winpython_directory} base directory") if self.winpython_directory.is_dir(): - try: - shutil.rmtree(self.winpython_directory, onexc=utils.onerror) - except TypeError: # before 3.12 - shutil.rmtree(self.winpython_directory, onerror=utils.onerror) + shutil.rmtree(self.winpython_directory) os.makedirs(self.winpython_directory, exist_ok=True) # preventive re-Creation of settings directory (self.winpython_directory / "settings" / "AppData" / "Roaming").mkdir(parents=True, exist_ok=True) From aa9ca121cfb2ec889956fbf1e92a6699591332c6 Mon Sep 17 00:00:00 2001 From: stonebig Date: Sun, 25 May 2025 21:29:11 +0200 Subject: [PATCH 210/305] Wheelhouses and how to raise them --- generate_a_winpython_distro.bat | 89 +++++++++++++++++++------ generate_winpython_distros313_wheel.bat | 40 +++++++++++ make.py | 3 +- winpython/__init__.py | 2 +- winpython/wheelhouse.py | 40 ++++++----- winpython/wppm.py | 21 +++--- 6 files changed, 144 insertions(+), 51 deletions(-) create mode 100644 generate_winpython_distros313_wheel.bat diff --git a/generate_a_winpython_distro.bat b/generate_a_winpython_distro.bat index 0b466928..51c7dad0 100644 --- a/generate_a_winpython_distro.bat +++ b/generate_a_winpython_distro.bat @@ -2,7 +2,7 @@ rem generate_a_winpython_distro.bat: to be launched from a winpython directory, @echo on REM Initialize variables -if "%my_release_level%"=="" set my_release_level=b2 +if "%my_release_level%"=="" set my_release_level=b3 if "%my_create_installer%"=="" set my_create_installer=True rem Set archive directory and log file @@ -101,21 +101,47 @@ echo -------------------------------------- >>%my_archive_log% python -m pip install -r %my_requirements% -c %my_constraints% --pre --no-index --trusted-host=None --find-links=%my_find_links% >>%my_archive_log% python -c "from winpython import wppm;dist=wppm.Distribution(r'%WINPYDIR%');dist.patch_standard_packages('spyder', to_movable=True)" -REM Archive success +REM Add Wheelhouse (to replace per pip lock direct ? would allow paralellism) echo -------------------------------------- >>%my_archive_log% -echo "(%date% %time%) Archive success">>%my_archive_log% +echo "(%date% %time%) Add lockfile wheels">>%my_archive_log% echo -------------------------------------- >>%my_archive_log% -%target_python_exe% -m pip freeze > %my_archive_log%.packages_versions.txt - -REM Generate changelog and binaries -echo "(%date% %time%) Generate changelog and binaries">>%my_archive_log% set path=%my_original_path% -cd /D %~dp0 -call %my_buildenv%\scripts\env.bat -python.exe -c "from make import *;make_all(%my_release%, '%my_release_level%', pyver='%my_pyver%', basedir=r'%my_basedir%', verbose=True, architecture=%my_arch%, flavor='%my_flavor%', install_options=r'%my_install_options%', find_links=r'%my_find_links%', source_dirs=r'%my_source_dirs%', create_installer='%my_create_installer%', rebuild=False, python_target_release='%my_python_target_release%')" >> %my_archive_log% +@echo on +call %my_WINPYDIRBASE%\scripts\env.bat +@echo on +set WINPYVERLOCK=%WINPYVER2:.=_% +set pylockinclude=%my_root_dir_for_builds%\bd%my_python_target%\bu%addlockfile%\pylock.%addlockfile%-%WINPYARCH%bit-%WINPYVERLOCK%.toml +echo pylockinclude="%pylockinclude%" +if not "Z%addlockfile%Z"=="ZZ" if exist "%pylockinclude%" ( +echo %my_WINPYDIRBASE%\python\scripts\wppm.exe "%pylockinclude%" -ws "%my_find_links%" -wd "%my_WINPYDIRBASE%\wheelhouse\included.wheels">>%my_archive_log% +%my_WINPYDIRBASE%\python\scripts\wppm.exe "%pylockinclude%" -ws "%my_find_links%" -wd "%my_WINPYDIRBASE%\wheelhouse\included.wheels" +) -echo -------------------------------------- >>%my_archive_log% -echo "(%date% %time%) generate pylock.tomle files and requirement_with_hash.txt files">>%my_archive_log% +@echo on +echo wheelhousereq=%wheelhousereq% +set LOCKDIR=%WINPYDIRBASE%\..\ +set pip_lock_includedlocal=%LOCKDIR%pylock.%my_flavor%-%WINPYARCH%bit-%WINPYVERLOCK%_includedwheelslocal.toml +set pip_lock_includedweb=%LOCKDIR%pylock.%my_flavor%-%WINPYARCH%bit-%WINPYVERLOCK%_includedwheels.toml +set req_lock_includedlocal=%LOCKDIR%requirement.%my_flavor%-%WINPYARCH%bit-%WINPYVERLOCK%_includedwheelslocal.txt +set req_lock_includedweb=%LOCKDIR%requirement.%my_flavor%-%WINPYARCH%bit-%WINPYVERLOCK%_includedwheels.txt + +if not "Z%wheelhousereq%Z"=="ZZ" if exist "%wheelhousereq%" ( +echo JOYYYwheelhousereq=%wheelhousereq% +echo z%pip_lock_includedlocal%z=%pip_lock_includedlocal% +rem no winpython in it naturally, with deps +python.exe -m pip lock --no-index --trusted-host=None --find-links=%my_find_links% -c C:\WinP\constraints.txt -r "%wheelhousereq%" -o %pip_lock_includedlocal% +rem generating also classic requirement with hash-256, from obtained pylock.toml +python.exe -c "from winpython import wheelhouse as wh;wh.pylock_to_req(r'%pip_lock_includedlocal%', r'%req_lock_includedlocal%')" + +rem same with frozen web from local +python.exe -m pip lock --no-deps --require-hashes -c C:\WinP\constraints.txt -r "%req_lock_includedlocal%" -o %pip_lock_includedweb% + +echo %my_WINPYDIRBASE%\python\scripts\wppm.exe "%pip_lock_includedweb%" -ws "%my_find_links%" -wd "%my_WINPYDIRBASE%\wheelhouse\included.wheels">>%my_archive_log% +%my_WINPYDIRBASE%\python\scripts\wppm.exe "%pip_lock_includedweb%" -ws "%my_find_links%" -wd "%my_WINPYDIRBASE%\wheelhouse\included.wheels" +) + +echo -------------------------------------- >>%my_archive_log%; +echo "(%date% %time%) generate pylock.toml files and requirement.txt with hash files">>%my_archive_log% echo -------------------------------------- >>%my_archive_log% set path=%my_original_path% @@ -125,17 +151,17 @@ rem generate pip freeze requirements echo %date% %time% set LOCKDIR=%WINPYDIRBASE%\..\ -set WINPYVERLOCK=%WINPYVER:.=_% -set req=%LOCKDIR%requirement.%WINPYVERLOCK%_raw.txt -set wanted_req=%LOCKDIR%requirement.%WINPYVERLOCK%.txt -set pip_lock_web=%LOCKDIR%pylock.%WINPYVERLOCK%.toml -set pip_lock_local=%LOCKDIR%pylock.%WINPYVER%_local.toml -set req_lock_web=%LOCKDIR%requirement_with_hash.%WINPYVERLOCK%.txt -set req_lock_local=%LOCKDIR%requirement_with_hash.%WINPYVERLOCK%_local.txt +set WINPYVERLOCK=%WINPYVER2:.=_% +set req=%LOCKDIR%requirement.%my_flavor%-%WINPYARCH%bit-%WINPYVERLOCK%_raw.txt +set wanted_req=%LOCKDIR%requirement.%my_flavor%-%WINPYARCH%bit-%WINPYVERLOCK%.txt +set pip_lock_web=%LOCKDIR%pylock.%my_flavor%-%WINPYARCH%bit-%WINPYVERLOCK%.toml +set pip_lock_local=%LOCKDIR%pylock.%my_flavor%-%WINPYARCH%bit-%WINPYVERLOCK%_local.toml +set req_lock_web=%LOCKDIR%requirement.%my_flavor%-%WINPYARCH%bit-%WINPYVERLOCK%.txt +set req_lock_local=%LOCKDIR%requirement.%my_flavor%-%WINPYARCH%bit-%WINPYVERLOCK%_local.txt -set my_archive_lockfile=%my_archive_dir%\pylock.%WINPYVERLOCK%_%date:/=-%at_%my_time%.toml -set my_archive_lockfile_local=%my_archive_dir%\pylock.%WINPYVERLOCK%_%date:/=-%at_%my_time%.local.toml -set my_changelog_lockfile=%~dp0changelogs\pylock.%WINPYVERLOCK%.toml +set my_archive_lockfile=%my_archive_dir%\pylock.%my_flavor%-%WINPYARCH%bit-%WINPYVERLOCK%_%date:/=-%at_%my_time%.toml +set my_archive_lockfile_local=%my_archive_dir%\pylock.%my_flavor%-%WINPYARCH%bit-%WINPYVERLOCK%_%date:/=-%at_%my_time%.local.toml +set my_changelog_lockfile=%~dp0changelogs\pylock.%my_flavor%-%WINPYARCH%bit-%WINPYVERLOCK%.toml python.exe -m pip freeze>%req% findstr /v "winpython" %req% > %wanted_req% @@ -157,6 +183,25 @@ fc "%req_lock_web%" "%req_lock_local%" copy/Y %pip_lock_web% %my_archive_lockfile% copy/Y %pip_lock_web% %my_changelog_lockfile% + +REM Archive success +echo -------------------------------------- >>%my_archive_log% +echo "(%date% %time%) Archive success">>%my_archive_log% +echo -------------------------------------- >>%my_archive_log% +set path=%my_original_path% +call %my_WINPYDIRBASE%\scripts\env.bat + +%target_python_exe% -m pip freeze > %my_archive_log%.packages_versions.txt + +REM Generate changelog and binaries +echo "(%date% %time%) Generate changelog and binaries">>%my_archive_log% +set path=%my_original_path% +cd /D %~dp0 +call %my_buildenv%\scripts\env.bat + +python.exe -c "from make import *;make_all(%my_release%, '%my_release_level%', pyver='%my_pyver%', basedir=r'%my_basedir%', verbose=True, architecture=%my_arch%, flavor='%my_flavor%', install_options=r'%my_install_options%', find_links=r'%my_find_links%', source_dirs=r'%my_source_dirs%', create_installer='%my_create_installer%', rebuild=False, python_target_release='%my_python_target_release%')" >> %my_archive_log% + + echo -------------------------------------- >>%my_archive_log% echo "(%date% %time%) END OF CREATION">>%my_archive_log% echo -------------------------------------- >>%my_archive_log% diff --git a/generate_winpython_distros313_wheel.bat b/generate_winpython_distros313_wheel.bat new file mode 100644 index 00000000..9ae54ff3 --- /dev/null +++ b/generate_winpython_distros313_wheel.bat @@ -0,0 +1,40 @@ +rem this replace running manually from spyder the make.py +rem to launch from a winpython module 'make' directory + +set my_original_path=%path% + +set my_root_dir_for_builds=C:\Winp +set my_python_target=313 +set my_pyver=3.13 +set my_flavor=whl +set my_arch=64 + +rem settings delegated to generate_a_winpython_distro.bat +set my_release= +set my_release_level= + +rem list of installers to create separated per dot: False=none, .zip=zip, .7z=.7z, 7zip=auto-extractible 7z +set my_create_installer=7zip.7z.zip +set my_create_installer=.7z + +set my_preclear_build_directory=Yes + +set tmp_reqdir=%my_root_dir_for_builds%\bd%my_python_target% + +set my_requirements=C:\Winp\bd313\dot_requirements.txt +set my_source_dirs=C:\Winp\bd313\packages.win-amd64 + +set my_find_links=C:\Winp\packages.srcreq +set my_toolsdirs=C:\Winp\bdTools\Tools.dot +set my_docsdirs=C:\WinP\bdDocs\docs.dot + +set my_install_options=--no-index --pre --trusted-host=None + +rem set addlockfile=dot + +set wheelhousereq=C:\Winp\bd313\requirements64_whl.txt + + +call %~dp0\generate_a_winpython_distro.bat + +pause diff --git a/make.py b/make.py index 18aa8117..a23d719d 100644 --- a/make.py +++ b/make.py @@ -208,6 +208,7 @@ def _create_initial_batch_scripts(self): # Replacements for batch scripts (PyPy compatibility) executable_name = self.distribution.short_exe if self.distribution else "python.exe" # default to python.exe if distribution is not yet set init_variables = [('WINPYthon_exe', executable_name), ('WINPYthon_subdirectory_name', self.python_directory_name), ('WINPYVER', self.winpython_version_name)] + init_variables += [('WINPYVER2', f"{self.python_full_version}.{self.build_number}"), ('WINPYFLAVOR', self.flavor), ('WINPYARCH', self.architecture_bits)] with open(self.winpython_directory / "scripts" / "env.ini", "w") as f: f.writelines([f'{a}={b}\n' for a, b in init_variables]) @@ -264,7 +265,7 @@ def rebuild_winpython_package(source_directory: Path, target_directory: Path, ar for file in target_directory.glob("winpython-*"): if file.suffix in (".exe", ".whl", ".gz"): file.unlink() - utils.buildflit_wininst(source_directory, copy_to=target_directory, verbose=verbose) + utils.buildflit_wininst(source_directory, copy_to=target_directory, verbose=True) def make_all(build_number: int, release_level: str, pyver: str, architecture: int, basedir: Path, verbose: bool = False, rebuild: bool = True, create_installer: str = "True", install_options=["--no-index"], diff --git a/winpython/__init__.py b/winpython/__init__.py index c8ebca8a..5ab80ad9 100644 --- a/winpython/__init__.py +++ b/winpython/__init__.py @@ -28,6 +28,6 @@ OTHER DEALINGS IN THE SOFTWARE. """ -__version__ = '16.1.20250524' +__version__ = '16.1.20250525' __license__ = __doc__ __project_url__ = 'http://winpython.github.io/' diff --git a/winpython/wheelhouse.py b/winpython/wheelhouse.py index e93e7bc4..e54f9dac 100644 --- a/winpython/wheelhouse.py +++ b/winpython/wheelhouse.py @@ -93,18 +93,20 @@ def run_pip_command(command: List[str], check: bool = True, capture_output=True) except Exception as e: return False, f"Unexpected error: {e}" -def get_wheels(requirements: Path, wheeldir: Path, from_local: Optional[Path] = None +def get_wheels(requirements: Path, wheeldrain: Path, wheelorigin: Optional[Path] = None , only_check: bool = True,post_install: bool = False) -> bool: """Download or check Python wheels based on requirements.""" added = [] - if from_local: - added += ['--no-index', '--trusted-host=None', f'--find-links={from_local}'] + if wheelorigin: + added = ['--no-index', '--trusted-host=None', f'--find-links={wheelorigin}'] pre_checks = [sys.executable, "-m", "pip", "install", "--dry-run", "--no-deps", "--require-hashes", "-r", str(requirements)] + added - instruction = [sys.executable, "-m", "pip", "download", "--no-deps", "--require-hashes", "-r", str(requirements), "--dest", str(wheeldir)] + added + instruction = [sys.executable, "-m", "pip", "download", "--no-deps", "--require-hashes", "-r", str(requirements), "--dest", str(wheeldrain)] + added + if wheeldrain: + added = ['--no-index', '--trusted-host=None', f'--find-links={wheeldrain}'] post_install_cmd = [sys.executable, "-m", "pip", "install", "--no-deps", "--require-hashes", "-r", str(requirements)] + added - # Run pip dry-run, only if a move of directory - if from_local and from_local != wheeldir: + # Run pip dry-run, only if a move of wheels + if wheelorigin and wheelorigin != wheeldrain: success, output = run_pip_command(pre_checks, check=False) if not success: print("❌ Dry-run failed. Here's the output:\n") @@ -135,15 +137,15 @@ def get_wheels(requirements: Path, wheeldir: Path, from_local: Optional[Path] = return True -def get_pylock_wheels(wheelhouse: Path, lockfile: Path, from_local: Optional[Path] = None) -> None: - """Get wheels for a pylock file.""" +def get_pylock_wheels(wheelhouse: Path, lockfile: Path, wheelorigin: Optional[Path] = None, wheeldrain: Optional[Path] = None) -> None: + """Get wheels asked pylock file.""" filename = Path(lockfile).name wheelhouse.mkdir(parents=True, exist_ok=True) trusted_wheelhouse = wheelhouse / "included.wheels" trusted_wheelhouse.mkdir(parents=True, exist_ok=True) filename_lock = wheelhouse / filename - filename_req = wheelhouse / (Path(lockfile).stem.replace('pylock', 'requirement_with_hash') + '.txt') + filename_req = wheelhouse / (Path(lockfile).stem.replace('pylock', 'requirement') + '.txt') pylock_to_req(Path(lockfile), filename_req) @@ -151,27 +153,29 @@ def get_pylock_wheels(wheelhouse: Path, lockfile: Path, from_local: Optional[Pat shutil.copy2(lockfile, filename_lock) # We create a destination for wheels that is specific, so we can check all is there - destination_wheelhouse = wheelhouse / Path(lockfile).name.replace('.toml', '.wheels') + destination_wheelhouse = Path(wheeldrain) if wheeldrain else wheelhouse / Path(lockfile).name.replace('.toml', '.wheels') + destination_wheelhouse.mkdir(parents=True, exist_ok=True) + # there can be an override + + in_trusted = False - if from_local is None: + if wheelorigin is None: # Try from trusted WheelHouse print(f"\n\n*** Checking if we can install from our Local WheelHouse: ***\n {trusted_wheelhouse}\n\n") - in_trusted = get_wheels(filename_req, destination_wheelhouse, from_local=trusted_wheelhouse, only_check=True) + in_trusted = get_wheels(filename_req, destination_wheelhouse, wheelorigin=trusted_wheelhouse, only_check=True) if in_trusted: print(f"\n\n*** We can install from Local WheelHouse: ***\n {trusted_wheelhouse}\n\n") - user_input = input("Do you want to continue and install from {trusted_wheelhouse} ? (yes/no):") - if user_input.lower() == "yes": - in_installed = get_wheels(filename_req, trusted_wheelhouse, from_local=trusted_wheelhouse, only_check=True, post_install=True) + in_installed = get_wheels(filename_req, trusted_wheelhouse, wheelorigin=trusted_wheelhouse, only_check=True, post_install=True) if not in_trusted: - post_install = True if from_local and Path(from_local).is_dir and Path(from_local).samefile(destination_wheelhouse) else False + post_install = True if wheelorigin and Path(wheelorigin).is_dir and Path(wheelorigin).samefile(destination_wheelhouse) else False if post_install: print(f"\n\n*** Installing from Local WheelHouse: ***\n {destination_wheelhouse}\n\n") else: - print(f"\n\n*** Re-Checking if we can install from: {'pypi.org' if not from_local or from_local == '' else from_local}\n\n") + print(f"\n\n*** Re-Checking if we can install from: {'pypi.org' if not wheelorigin or wheelorigin == '' else wheelorigin}\n\n") - in_pylock = get_wheels(filename_req, destination_wheelhouse, from_local=from_local, only_check=False, post_install=post_install) + in_pylock = get_wheels(filename_req, destination_wheelhouse, wheelorigin=wheelorigin, only_check=False, post_install=post_install) if in_pylock: if not post_install: print(f"\n\n*** You can now install from this dedicated WheelHouse: ***\n {destination_wheelhouse}") diff --git a/winpython/wppm.py b/winpython/wppm.py index 258795e3..71296c72 100644 --- a/winpython/wppm.py +++ b/winpython/wppm.py @@ -15,7 +15,7 @@ from pathlib import Path from argparse import ArgumentParser, RawTextHelpFormatter from winpython import utils, piptree, associate - +from winpython import wheelhouse as wh # Workaround for installing PyVISA on Windows from source: os.environ["HOME"] = os.environ["USERPROFILE"] @@ -24,7 +24,7 @@ class Package: def __init__(self, fname: str, suggested_summary: str = None): self.fname = fname self.description = piptree.sum_up(suggested_summary) if suggested_summary else "" - self.name, self.version = None, None + self.name, self.version = fname, '?.?.?' if fname.lower().endswith((".zip", ".tar.gz", ".whl")): bname = Path(self.fname).name # e.g., "sqlite_bro-1.0.0..." infos = utils.get_source_package_infos(bname) # get name, version @@ -47,6 +47,7 @@ def __init__(self, target: str = None, verbose: bool = False): self.version, self.architecture = utils.get_python_infos(self.target) self.python_exe = utils.get_python_executable(self.target) self.short_exe = Path(self.python_exe).name + self.wheelhouse = Path(self.target).parent / "wheelhouse" def create_file(self, package, name, dstdir, contents): """Generate data file -- path is relative to distribution root dir""" @@ -91,7 +92,8 @@ def patch_all_shebang(self, to_movable: bool = True, max_exe_size: int = 999999, def install(self, package: Package, install_options: list[str] = None): """Install package in distribution.""" - if package.fname.endswith((".whl", ".tar.gz", ".zip")): # Check extension with tuple + if package.fname.endswith((".whl", ".tar.gz", ".zip")) or ( + ' ' not in package.fname and ';' not in package.fname and len(package.fname) >1): # Check extension with tuple self.install_bdist_direct(package, install_options=install_options) self.handle_specific_packages(package) # minimal post-install actions @@ -239,7 +241,8 @@ def main(test=False): # parser.add_argument( "--unregister_forall", action="store_true", help="un-Register distribution for all users") parser.add_argument("--fix", action="store_true", help="make WinPython fix") parser.add_argument("--movable", action="store_true", help="make WinPython movable") - parser.add_argument("-wh", "--wheelhouse", default=None, type=str, help="wheelhouse location to search for wheels: wppm pylock.toml -wh directory_of_wheels") + parser.add_argument("-ws", dest="wheelsource", default=None, type=str, help="location to search wheels: wppm pylock.toml -ws source_of_wheels") + parser.add_argument("-wd", dest="wheeldrain" , default=None, type=str, help="location of found wheels: wppm pylock.toml -wd destination_of_wheels") parser.add_argument("-ls", "--list", action="store_true", help="list installed packages matching the given [optional] package expression: wppm -ls, wppm -ls pand") parser.add_argument("-lsa", dest="all", action="store_true",help=f"list details of package names matching given regular expression: wppm -lsa pandas -l1") parser.add_argument("-p",dest="pipdown",action="store_true",help="show Package dependencies of the given package[option]: wppm -p pandas[test]") @@ -326,7 +329,7 @@ def main(test=False): sys.exit() if not args.install and not args.uninstall: args.install = True - if not Path(args.fname).is_file() and args.install: + if not Path(args.fname).is_file() and not args.install: if args.fname == "": parser.print_help() sys.exit() @@ -335,18 +338,18 @@ def main(test=False): else: try: filename = Path(args.fname).name + install_from_wheelhouse = ["--no-index", "--trusted-host=None", f"--find-links={dist.wheelhouse / 'included.wheels'}"] if filename.split('.')[0] == "pylock" and filename.split('.')[-1] == 'toml': print(' a lock file !', args.fname, dist.target) - from winpython import wheelhouse as wh - wh.get_pylock_wheels(Path(dist.target).parent/ "WheelHouse", Path(args.fname), args.wheelhouse) - sys.exit() + wh.get_pylock_wheels(dist.wheelhouse, Path(args.fname), args.wheelsource, args.wheeldrain) + sys.exit() if args.uninstall: package = dist.find_package(args.fname) dist.uninstall(package) elif args.install: package = Package(args.fname) if args.install: - dist.install(package) + dist.install(package, install_options=install_from_wheelhouse) except NotImplementedError: raise RuntimeError("Package is not (yet) supported by WPPM") else: From aae61bac9abb8d6d70a00bdeb340c1c359a2ede0 Mon Sep 17 00:00:00 2001 From: stonebig Date: Tue, 27 May 2025 21:22:16 +0200 Subject: [PATCH 211/305] sometimes --- winpython/wheelhouse.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/winpython/wheelhouse.py b/winpython/wheelhouse.py index e54f9dac..1653aded 100644 --- a/winpython/wheelhouse.py +++ b/winpython/wheelhouse.py @@ -166,7 +166,7 @@ def get_pylock_wheels(wheelhouse: Path, lockfile: Path, wheelorigin: Optional[Pa in_trusted = get_wheels(filename_req, destination_wheelhouse, wheelorigin=trusted_wheelhouse, only_check=True) if in_trusted: print(f"\n\n*** We can install from Local WheelHouse: ***\n {trusted_wheelhouse}\n\n") - in_installed = get_wheels(filename_req, trusted_wheelhouse, wheelorigin=trusted_wheelhouse, only_check=True, post_install=True) + in_installed = get_wheels(filename_req, trusted_wheelhouse, wheelorigin=trusted_wheelhouse, only_check=False, post_install=True) if not in_trusted: post_install = True if wheelorigin and Path(wheelorigin).is_dir and Path(wheelorigin).samefile(destination_wheelhouse) else False From 03e73b94bfb1d1bcac2819ed01c1eaa9f4119b22 Mon Sep 17 00:00:00 2001 From: stonebig Date: Wed, 28 May 2025 18:45:55 +0200 Subject: [PATCH 212/305] build with parametrized compression levels --- generate_winpython_distros313_wheel.bat | 4 ++-- make.py | 23 ++++++++++++----------- 2 files changed, 14 insertions(+), 13 deletions(-) diff --git a/generate_winpython_distros313_wheel.bat b/generate_winpython_distros313_wheel.bat index 9ae54ff3..02edeb99 100644 --- a/generate_winpython_distros313_wheel.bat +++ b/generate_winpython_distros313_wheel.bat @@ -14,8 +14,8 @@ set my_release= set my_release_level= rem list of installers to create separated per dot: False=none, .zip=zip, .7z=.7z, 7zip=auto-extractible 7z -set my_create_installer=7zip.7z.zip -set my_create_installer=.7z +set my_create_installer=7zip-mx5.7z-mx7.zip +set my_create_installer=.7z-mx7 set my_preclear_build_directory=Yes diff --git a/make.py b/make.py index a23d719d..1445cadc 100644 --- a/make.py +++ b/make.py @@ -146,17 +146,18 @@ def architecture_bits(self) -> int: """Returns the architecture (32 or 64 bits) of the distribution.""" return self.distribution.architecture if self.distribution else 64 - def create_installer_7zip(self, installer_type: str = ".exe"): - """Creates a WinPython installer using 7-Zip: ".exe", ".7z", ".zip")""" + def create_installer_7zip(self, installer_type: str = "exe", compression= "mx5"): + """Creates a WinPython installer using 7-Zip: "exe", "7z", "zip")""" self._print_action(f"Creating WinPython installer ({installer_type})") - if installer_type not in [".exe", ".7z", ".zip"]: - raise RuntimeError("installer_type {installer_type} is undefined") + if installer_type not in ["exe", "7z", "zip"]: + return DISTDIR = self.winpython_directory filename_stem = f"Winpython{self.architecture_bits}-{self.python_full_version}.{self.build_number}{self.flavor}{self.release_level}" - fullfilename = DISTDIR.parent / (filename_stem + installer_type) - sfx_option = "-sfx7z.sfx" if installer_type == ".exe" else "" - zip_option = "-tzip" if installer_type == ".zip" else "" - command = f'"{find_7zip_executable()}" {zip_option} -mx5 a "{fullfilename}" "{DISTDIR}" {sfx_option}' + fullfilename = DISTDIR.parent / (filename_stem + "." + installer_type) + sfx_option = "-sfx7z.sfx" if installer_type == "exe" else "" + zip_option = "-tzip" if installer_type == "zip" else "" + compress_level = "mx5" if compression == "" else compression + command = f'"{find_7zip_executable()}" {zip_option} -{compress_level} a "{fullfilename}" "{DISTDIR}" {sfx_option}' print(f'Executing 7-Zip script: "{command}"') try: subprocess.run(command, shell=True, check=True, stderr=sys.stderr, stdout=sys.stderr) @@ -331,9 +332,9 @@ def make_all(build_number: int, release_level: str, pyver: str, architecture: in builder.build(rebuild=rebuild, requirements_files_list=requirements_files_list, winpy_dirname=winpython_dirname) - for installer_type in [".zip", ".7z", ".exe"]: - if installer_type in create_installer.lower().replace("7zip",".exe"): - builder.create_installer_7zip(installer_type) + for commmand in create_installer.lower().replace("7zip",".exe").split('.'): + installer_type, compression = (commmand + "-").split("-")[:2] + builder.create_installer_7zip(installer_type, compression) if __name__ == "__main__": # DO create only one Winpython distribution at a time From 83baeddef72d098e797761838a648c5937e65f37 Mon Sep 17 00:00:00 2001 From: stonebig Date: Wed, 28 May 2025 19:52:04 +0200 Subject: [PATCH 213/305] restore default behavior --- winpython/wppm.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/winpython/wppm.py b/winpython/wppm.py index 71296c72..9e676ce9 100644 --- a/winpython/wppm.py +++ b/winpython/wppm.py @@ -329,12 +329,12 @@ def main(test=False): sys.exit() if not args.install and not args.uninstall: args.install = True - if not Path(args.fname).is_file() and not args.install: + if not Path(args.fname).is_file() and args.install: if args.fname == "": parser.print_help() sys.exit() else: - raise FileNotFoundError(f"File not found: {args.fname}") + args.install = True # for Drag & Drop of .toml (and not wheel) else: try: filename = Path(args.fname).name From 99709de4edd0c48ed6dab6e18a43305f9db06be4 Mon Sep 17 00:00:00 2001 From: stonebig Date: Wed, 28 May 2025 23:49:33 +0200 Subject: [PATCH 214/305] wheelhouse in changelogs --- diff.py | 23 +++++++++++++++++------ make.py | 6 ++++++ winpython/wppm.py | 11 +++++++++++ 3 files changed, 34 insertions(+), 6 deletions(-) diff --git a/diff.py b/diff.py index 1fd01586..61b4ef80 100644 --- a/diff.py +++ b/diff.py @@ -31,7 +31,7 @@ def __str__(self): def from_text(self, text): match = re.match(self.PATTERN_OLD, text) or re.match(self.PATTERN, text) if not match: - raise ValueError("Text does not match expected pattern") + raise ValueError("Text does not match expected pattern: "+ text) self.name, self.url, self.version, self.description = match.groups() def to_wiki(self): @@ -45,6 +45,7 @@ class PackageIndex: WINPYTHON_PATTERN = r"\#\# WinPython\-*[0-9b-t]* ([0-9\.a-zA-Z]*)" TOOLS_LINE = "### Tools" PYTHON_PACKAGES_LINE = "### Python packages" + WHEELHOUSE_PACKAGES_LINE = "### WheelHouse packages" HEADER_LINE1 = "Name | Version | Description" HEADER_LINE2 = "-----|---------|------------" @@ -55,6 +56,7 @@ def __init__(self, version, basedir=None, flavor="", architecture=64): self.architecture = architecture self.other_packages = {} self.python_packages = {} + self.wheelhouse_packages = {} self.from_file(basedir) def from_file(self, basedir): @@ -67,24 +69,29 @@ def from_file(self, basedir): def from_text(self, text): version = re.match(self.WINPYTHON_PATTERN + self.flavor, text).groups()[0] assert version == self.version - tools_flag = python_flag = False + tools_flag = python_flag = wheelhouse_flag = False for line in text.splitlines(): if line: if line == self.TOOLS_LINE: - tools_flag, python_flag = True, False + tools_flag, python_flag, wheelhouse_flag = True, False, False continue elif line == self.PYTHON_PACKAGES_LINE: - tools_flag, python_flag = False, True + tools_flag, python_flag, wheelhouse_flag = False, True, False + continue + elif line == self.WHEELHOUSE_PACKAGES_LINE: + tools_flag, python_flag, wheelhouse_flag = False, False, True continue elif line in (self.HEADER_LINE1, self.HEADER_LINE2, "

    ", "
    "): continue - if tools_flag or python_flag: + if tools_flag or python_flag or wheelhouse_flag: package = Package() package.from_text(line) if tools_flag: self.other_packages[package.name] = package - else: + elif python_flag: self.python_packages[package.name] = package + else: + self.wheelhouse_packages[package.name] = package def diff_package_dicts(old_packages, new_packages): """Return difference between package old and package new""" @@ -141,6 +148,10 @@ def compare_package_indexes(version2, version1=None, basedir=None, flavor="", fl if py_text: text += PackageIndex.PYTHON_PACKAGES_LINE + "\r\n\r\n" + py_text + py_text = diff_package_dicts(pi1.wheelhouse_packages, pi2.wheelhouse_packages) + if py_text: + text += PackageIndex.WHEELHOUSE_PACKAGES_LINE + "\r\n\r\n" + py_text + text += "\r\n\r\n* * *\r\n" return text diff --git a/make.py b/make.py index 1445cadc..d66a5213 100644 --- a/make.py +++ b/make.py @@ -120,6 +120,12 @@ def package_index_markdown(self) -> str: -----|---------|------------ {self.distribution.get_installed_packages_markdown()} +### WheelHouse packages + +Name | Version | Description +-----|---------|------------ +{self.distribution.get_wheelhouse_packages_markdown()} + """ diff --git a/winpython/wppm.py b/winpython/wppm.py index 9e676ce9..342f3471 100644 --- a/winpython/wppm.py +++ b/winpython/wppm.py @@ -76,6 +76,17 @@ def get_installed_packages_markdown(self) -> str: ] return "\n".join(package_lines) + def get_wheelhouse_packages_markdown(self) -> str: + wheeldir = self.wheelhouse / 'included.wheels' + if wheeldir.is_dir(): + package_lines = [ + f"[{name}](https://pypi.org/project/{name}) | {version} | {summary}" + for name, version, summary in wh.list_packages_with_metadata(str(wheeldir)) + #for pkg in sorted(wh.list_packages_with_metadata(str(wheeldir)), key=lambda p: p.name.lower()) + ] + return "\n".join(package_lines) + return "" + def find_package(self, name: str) -> Package | None: """Find installed package by name.""" for pack in self.get_installed_packages(): From 2e7f790deb8ce1405a723dce3daeeb8b467982b1 Mon Sep 17 00:00:00 2001 From: stonebig Date: Thu, 29 May 2025 09:38:12 +0200 Subject: [PATCH 215/305] fix the fix on historic behavioir --- winpython/wppm.py | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/winpython/wppm.py b/winpython/wppm.py index 342f3471..d6194829 100644 --- a/winpython/wppm.py +++ b/winpython/wppm.py @@ -338,14 +338,11 @@ def main(test=False): if args.movable: p = subprocess.Popen(["start", "cmd", "/k",dist.python_exe, "-c" , cmd_mov], shell = True, cwd=dist.target) sys.exit() - if not args.install and not args.uninstall: - args.install = True - if not Path(args.fname).is_file() and args.install: - if args.fname == "": + if not args.install and not args.uninstall and args.fname.endswith(".toml"): + args.install = True # for Drag & Drop of .toml (and not wheel) + if args.fname == "" or (not args.install and not args.uninstall): parser.print_help() sys.exit() - else: - args.install = True # for Drag & Drop of .toml (and not wheel) else: try: filename = Path(args.fname).name From 88ceb637a5d8bed123ea06705a304fc1911ad90a Mon Sep 17 00:00:00 2001 From: stonebig Date: Thu, 29 May 2025 15:38:25 +0200 Subject: [PATCH 216/305] stronger fix of wheelhouse report --- winpython/piptree.py | 12 ++------- winpython/wheelhouse.py | 56 ++++++++++++++++++++++++++++++++++++++++- winpython/wppm.py | 6 ++--- 3 files changed, 60 insertions(+), 14 deletions(-) diff --git a/winpython/piptree.py b/winpython/piptree.py index 23a53ff3..a2fa5ee8 100644 --- a/winpython/piptree.py +++ b/winpython/piptree.py @@ -17,6 +17,7 @@ from pip._vendor.packaging.markers import Marker from importlib.metadata import Distribution, distributions from pathlib import Path +from winpython import utils logging.basicConfig(level=logging.INFO) logger = logging.getLogger(__name__) @@ -25,15 +26,6 @@ class PipDataError(Exception): """Custom exception for PipData related errors.""" pass -def sum_up(text: str, max_length: int = 144, stop_at: str = ". ") -> str: - """Summarize text to fit within max_length, ending at last complete sentence.""" - summary = (text + os.linesep).splitlines()[0] - if len(summary) <= max_length: - return summary - if stop_at and stop_at in summary[:max_length]: - return summary[:summary.rfind(stop_at, 0, max_length)] + stop_at.rstrip() - return summary[:max_length].rstrip() - class PipData: """Manages package metadata and dependency relationships in a Python environment.""" @@ -287,5 +279,5 @@ def pip_list(self, full: bool = False, max_length: int = 144) -> List[Tuple[str, """ pkgs = sorted(self.distro.items()) if full: - return [(p, d["version"], sum_up(d["summary"], max_length)) for p, d in pkgs] + return [(p, d["version"], utils.sum_up(d["summary"], max_length)) for p, d in pkgs] return [(p, d["version"]) for p, d in pkgs] diff --git a/winpython/wheelhouse.py b/winpython/wheelhouse.py index 1653aded..f0963aed 100644 --- a/winpython/wheelhouse.py +++ b/winpython/wheelhouse.py @@ -2,13 +2,20 @@ """ WheelHouse.py - manage WinPython local WheelHouse. """ - +import os +import re +import tarfile +import zipfile import sys from pathlib import Path from collections import defaultdict import shutil import subprocess from typing import Dict, List, Optional, Tuple +from email import message_from_bytes +from . import utils + +from packaging.utils import canonicalize_name # Use tomllib if available (Python 3.11+), otherwise fall back to tomli try: @@ -183,6 +190,53 @@ def get_pylock_wheels(wheelhouse: Path, lockfile: Path, wheelorigin: Optional[Pa else: print(f"\n\n*** We can't install {filename} ! ***\n\n") +def extract_metadata_from_wheel(filepath: Path) -> Optional[Tuple[str, str, str]]: + "get metadata from a wheel package" + with zipfile.ZipFile(filepath, 'r') as z: + # Locate *.dist-info/METADATA file inside but not in a vendored directory (flit-core) + for name in z.namelist(): + if name.endswith(r'.dist-info/METADATA') and name.split("/")[1] == "METADATA": + with z.open(name) as meta_file: + metadata = message_from_bytes(meta_file.read()) + name = canonicalize_name(str(metadata.get('Name', 'unknown'))) # Avoid Head type + version = str(metadata.get('Version', 'unknown')) + summary = utils.sum_up(str(metadata.get('Summary', ''))) + return name, version, summary + return None + +def extract_metadata_from_sdist(filepath: Path) -> Optional[Tuple[str, str, str]]: + "get metadata from a tar.gz or .zip package" + open_func = tarfile.open if filepath.suffixes[-2:] == ['.tar', '.gz'] else zipfile.ZipFile + with open_func(filepath, 'r') as archive: + namelist = archive.getnames() if isinstance(archive, tarfile.TarFile) else archive.namelist() + for name in namelist: + if name.endswith('PKG-INFO'): + content = archive.extractfile(name).read() if isinstance(archive, tarfile.TarFile) else archive.open(name).read() + metadata = message_from_bytes(content) + name = canonicalize_name(str(metadata.get('Name', 'unknown'))) # Avoid Head type + version = str(metadata.get('Version', 'unknown')) + summary = utils.sum_up(str(metadata.get('Summary', ''))) + return name, version, summary + return None + +def list_packages_with_metadata(directory: str) -> List[Tuple[str, str, str]]: + "get metadata from a Wheelhouse directory" + results = [] + for file in os.listdir(directory): + path = Path(directory) / file + try: + if path.suffix == '.whl': + meta = extract_metadata_from_wheel(path) + elif path.suffix == '.zip' or path.name.endswith('.tar.gz'): + meta = extract_metadata_from_sdist(path) + else: + continue + if meta: + results.append(meta) + except OSError: #Exception as e: # need to see it + print(f"Skipping {file}: {e}") + return results + def main() -> None: """Main entry point for the script.""" if len(sys.argv) != 2: diff --git a/winpython/wppm.py b/winpython/wppm.py index d6194829..a8c92abf 100644 --- a/winpython/wppm.py +++ b/winpython/wppm.py @@ -16,6 +16,7 @@ from argparse import ArgumentParser, RawTextHelpFormatter from winpython import utils, piptree, associate from winpython import wheelhouse as wh +from operator import itemgetter # Workaround for installing PyVISA on Windows from source: os.environ["HOME"] = os.environ["USERPROFILE"] @@ -23,7 +24,7 @@ class Package: """Standardize a Package from filename or pip list.""" def __init__(self, fname: str, suggested_summary: str = None): self.fname = fname - self.description = piptree.sum_up(suggested_summary) if suggested_summary else "" + self.description = (utils.sum_up(suggested_summary) if suggested_summary else "").strip() self.name, self.version = fname, '?.?.?' if fname.lower().endswith((".zip", ".tar.gz", ".whl")): bname = Path(self.fname).name # e.g., "sqlite_bro-1.0.0..." @@ -81,8 +82,7 @@ def get_wheelhouse_packages_markdown(self) -> str: if wheeldir.is_dir(): package_lines = [ f"[{name}](https://pypi.org/project/{name}) | {version} | {summary}" - for name, version, summary in wh.list_packages_with_metadata(str(wheeldir)) - #for pkg in sorted(wh.list_packages_with_metadata(str(wheeldir)), key=lambda p: p.name.lower()) + for name, version, summary in sorted(wh.list_packages_with_metadata(str(wheeldir)), key=itemgetter(0 , 1)) # lambda p: p[0].lower()) ] return "\n".join(package_lines) return "" From 82b6794df5ff5a5bfc76107dba6e182f4cbbb93d Mon Sep 17 00:00:00 2001 From: stonebig Date: Thu, 29 May 2025 15:39:15 +0200 Subject: [PATCH 217/305] fix further --- winpython/utils.py | 32 ++++++++------------------------ 1 file changed, 8 insertions(+), 24 deletions(-) diff --git a/winpython/utils.py b/winpython/utils.py index 40961ec1..97f38e78 100644 --- a/winpython/utils.py +++ b/winpython/utils.py @@ -71,30 +71,14 @@ def onerror(function, path, excinfo): else: raise -def getFileProperties(fname): - """Read all properties of the given file return them as a dictionary.""" - import win32api - prop_names = ('ProductName', 'ProductVersion', 'FileDescription', 'FileVersion') - props = {'FixedFileInfo': None, 'StringFileInfo': None, 'FileVersion': None} - - try: - fixed_info = win32api.GetFileVersionInfo(fname, '\\') - props['FixedFileInfo'] = fixed_info - props['FileVersion'] = "{}.{}.{}.{}".format( - fixed_info['FileVersionMS'] // 65536, - fixed_info['FileVersionMS'] % 65536, - fixed_info['FileVersionLS'] // 65536, - fixed_info['FileVersionLS'] % 65536 - ) - lang, codepage = win32api.GetFileVersionInfo(fname, '\\VarFileInfo\\Translation')[0] - props['StringFileInfo'] = { - prop_name: win32api.GetFileVersionInfo(fname, f'\\StringFileInfo\\{lang:04X}{codepage:04X}\\{prop_name}') - for prop_name in prop_names - } - except: - pass - - return props +def sum_up(text: str, max_length: int = 144, stop_at: str = ". ") -> str: + """Summarize text to fit within max_length, ending at last complete sentence.""" + summary = (text + os.linesep).splitlines()[0].strip() + if len(summary) <= max_length: + return summary + if stop_at and stop_at in summary[:max_length]: + return summary[:summary.rfind(stop_at, 0, max_length)] + stop_at.strip() + return summary[:max_length].strip() def get_special_folder_path(path_name): """Return special folder path.""" From de0423cefe10f5f1d853706be919e9117c44ac3c Mon Sep 17 00:00:00 2001 From: stonebig Date: Thu, 29 May 2025 16:11:00 +0200 Subject: [PATCH 218/305] at last... a glitch-less one --- winpython/wheelhouse.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/winpython/wheelhouse.py b/winpython/wheelhouse.py index f0963aed..87c6a9ac 100644 --- a/winpython/wheelhouse.py +++ b/winpython/wheelhouse.py @@ -13,6 +13,8 @@ import subprocess from typing import Dict, List, Optional, Tuple from email import message_from_bytes +from email.parser import BytesParser +from email.policy import default from . import utils from packaging.utils import canonicalize_name @@ -197,7 +199,7 @@ def extract_metadata_from_wheel(filepath: Path) -> Optional[Tuple[str, str, str] for name in z.namelist(): if name.endswith(r'.dist-info/METADATA') and name.split("/")[1] == "METADATA": with z.open(name) as meta_file: - metadata = message_from_bytes(meta_file.read()) + metadata = BytesParser(policy=default).parse(meta_file) name = canonicalize_name(str(metadata.get('Name', 'unknown'))) # Avoid Head type version = str(metadata.get('Version', 'unknown')) summary = utils.sum_up(str(metadata.get('Summary', ''))) From e9da3e55c5709947cb94157e867c59ccc22dbb68 Mon Sep 17 00:00:00 2001 From: stonebig Date: Thu, 29 May 2025 18:03:35 +0200 Subject: [PATCH 219/305] more checks, less bagages --- winpython/__init__.py | 2 +- winpython/piptree.py | 2 +- winpython/utils.py | 2 -- winpython/wheelhouse.py | 54 ++++++++++++++++++++++++++++++++--------- winpython/wppm.py | 4 +-- 5 files changed, 47 insertions(+), 17 deletions(-) diff --git a/winpython/__init__.py b/winpython/__init__.py index 5ab80ad9..f4815474 100644 --- a/winpython/__init__.py +++ b/winpython/__init__.py @@ -28,6 +28,6 @@ OTHER DEALINGS IN THE SOFTWARE. """ -__version__ = '16.1.20250525' +__version__ = '16.2.20250529' __license__ = __doc__ __project_url__ = 'http://winpython.github.io/' diff --git a/winpython/piptree.py b/winpython/piptree.py index a2fa5ee8..1cc1d1ab 100644 --- a/winpython/piptree.py +++ b/winpython/piptree.py @@ -17,7 +17,7 @@ from pip._vendor.packaging.markers import Marker from importlib.metadata import Distribution, distributions from pathlib import Path -from winpython import utils +from . import utils logging.basicConfig(level=logging.INFO) logger = logging.getLogger(__name__) diff --git a/winpython/utils.py b/winpython/utils.py index 97f38e78..b825fbce 100644 --- a/winpython/utils.py +++ b/winpython/utils.py @@ -18,8 +18,6 @@ import re import tarfile import zipfile -import atexit -import winreg # SOURCE_PATTERN defines what an acceptable source package name is SOURCE_PATTERN = r'([a-zA-Z0-9\-\_\.]*)-([0-9\.\_]*[a-z]*[\-]?[0-9]*)(\.zip|\.tar\.gz|\-(py[2-7]*|py[2-7]*\.py[2-7]*)\-none\-any\.whl)' diff --git a/winpython/wheelhouse.py b/winpython/wheelhouse.py index 87c6a9ac..aa095af4 100644 --- a/winpython/wheelhouse.py +++ b/winpython/wheelhouse.py @@ -17,7 +17,7 @@ from email.policy import default from . import utils -from packaging.utils import canonicalize_name +from packaging.utils import canonicalize_name, parse_wheel_filename, parse_sdist_filename # Use tomllib if available (Python 3.11+), otherwise fall back to tomli try: @@ -193,32 +193,64 @@ def get_pylock_wheels(wheelhouse: Path, lockfile: Path, wheelorigin: Optional[Pa print(f"\n\n*** We can't install {filename} ! ***\n\n") def extract_metadata_from_wheel(filepath: Path) -> Optional[Tuple[str, str, str]]: - "get metadata from a wheel package" + "Extract package metadata from a .whl file and validate it matches the filename" + wheel_name = filepath.name + try: + name, version, build, tags = parse_wheel_filename(wheel_name) + filename_name = canonicalize_name(name) + filename_version = str(version) + except Exception as e: + print(f"❌ Could not parse filename: {wheel_name}", e) + return None + with zipfile.ZipFile(filepath, 'r') as z: # Locate *.dist-info/METADATA file inside but not in a vendored directory (flit-core) for name in z.namelist(): if name.endswith(r'.dist-info/METADATA') and name.split("/")[1] == "METADATA": with z.open(name) as meta_file: metadata = BytesParser(policy=default).parse(meta_file) - name = canonicalize_name(str(metadata.get('Name', 'unknown'))) # Avoid Head type - version = str(metadata.get('Version', 'unknown')) + meta_name = canonicalize_name(str(metadata.get('Name', 'unknown'))) # Avoid Head type + meta_version = str(metadata.get('Version', 'unknown')) summary = utils.sum_up(str(metadata.get('Summary', ''))) - return name, version, summary + # Assert consistency + if meta_name != filename_name or meta_version != filename_version: + print(f"⚠️ Mismatch in {wheel_name}: filename says {filename_name}=={filename_version}, " + f"but METADATA says {meta_name}=={meta_version}") + return None + return meta_name, meta_version , summary return None def extract_metadata_from_sdist(filepath: Path) -> Optional[Tuple[str, str, str]]: "get metadata from a tar.gz or .zip package" open_func = tarfile.open if filepath.suffixes[-2:] == ['.tar', '.gz'] else zipfile.ZipFile + sdist_name = filepath.name + try: + name, version = parse_sdist_filename(sdist_name) + filename_name = canonicalize_name(name) + filename_version = str(version) + except Exception as e: + print(f"❌ Could not parse filename: {sdist_name}", e) + return None + with open_func(filepath, 'r') as archive: namelist = archive.getnames() if isinstance(archive, tarfile.TarFile) else archive.namelist() for name in namelist: if name.endswith('PKG-INFO'): - content = archive.extractfile(name).read() if isinstance(archive, tarfile.TarFile) else archive.open(name).read() - metadata = message_from_bytes(content) - name = canonicalize_name(str(metadata.get('Name', 'unknown'))) # Avoid Head type - version = str(metadata.get('Version', 'unknown')) - summary = utils.sum_up(str(metadata.get('Summary', ''))) - return name, version, summary + if isinstance(archive, tarfile.TarFile): + content = archive.extractfile(name) + else: + content = archive.open(name) + if content: + metadata = BytesParser(policy=default).parse(content) + meta_name = canonicalize_name(str(metadata.get('Name', 'unknown'))) # Avoid Head type + meta_version = str(metadata.get('Version', 'unknown')) + summary = utils.sum_up(str(metadata.get('Summary', ''))) + # Assert consistency + if meta_name != filename_name or meta_version != filename_version: + print(f"⚠️ Mismatch in {sdist_name}: filename says {filename_name}=={filename_version}, " + f"but METADATA says {meta_name}=={meta_version}") + return None + return meta_name, meta_version, summary return None def list_packages_with_metadata(directory: str) -> List[Tuple[str, str, str]]: diff --git a/winpython/wppm.py b/winpython/wppm.py index a8c92abf..58f5769b 100644 --- a/winpython/wppm.py +++ b/winpython/wppm.py @@ -14,8 +14,8 @@ import json from pathlib import Path from argparse import ArgumentParser, RawTextHelpFormatter -from winpython import utils, piptree, associate -from winpython import wheelhouse as wh +from . import utils, piptree, associate +from . import wheelhouse as wh from operator import itemgetter # Workaround for installing PyVISA on Windows from source: os.environ["HOME"] = os.environ["USERPROFILE"] From 07207881fefa6fd58c79f1e320751ac28f47c44c Mon Sep 17 00:00:00 2001 From: stonebig Date: Fri, 30 May 2025 11:49:41 +0200 Subject: [PATCH 220/305] change changelog naming for upload readability --- winpython/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/winpython/__init__.py b/winpython/__init__.py index f4815474..d2fdc391 100644 --- a/winpython/__init__.py +++ b/winpython/__init__.py @@ -28,6 +28,6 @@ OTHER DEALINGS IN THE SOFTWARE. """ -__version__ = '16.2.20250529' +__version__ = '16.3.20250530' __license__ = __doc__ __project_url__ = 'http://winpython.github.io/' From 6957b34e4bd7bf791c09bdd0588708dec00ddb5a Mon Sep 17 00:00:00 2001 From: stonebig Date: Fri, 30 May 2025 11:50:14 +0200 Subject: [PATCH 221/305] change changelog naming for upload readability --- generate_a_winpython_distro.bat | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/generate_a_winpython_distro.bat b/generate_a_winpython_distro.bat index 51c7dad0..e9c73d9a 100644 --- a/generate_a_winpython_distro.bat +++ b/generate_a_winpython_distro.bat @@ -2,7 +2,7 @@ rem generate_a_winpython_distro.bat: to be launched from a winpython directory, @echo on REM Initialize variables -if "%my_release_level%"=="" set my_release_level=b3 +if "%my_release_level%"=="" set my_release_level=b4 if "%my_create_installer%"=="" set my_create_installer=True rem Set archive directory and log file @@ -159,6 +159,12 @@ set pip_lock_local=%LOCKDIR%pylock.%my_flavor%-%WINPYARCH%bit-%WINPYVERLOCK%_loc set req_lock_web=%LOCKDIR%requirement.%my_flavor%-%WINPYARCH%bit-%WINPYVERLOCK%.txt set req_lock_local=%LOCKDIR%requirement.%my_flavor%-%WINPYARCH%bit-%WINPYVERLOCK%_local.txt +set pip_lock_web=%LOCKDIR%pylock.%WINPYARCH%-%WINPYVERLOCK%%my_flavor%%my_release_level%.toml +set pip_lock_local=%LOCKDIR%pylock.%WINPYARCH%-%WINPYVERLOCK%%my_flavor%%my_release_level%_local.toml +set req_lock_web=%LOCKDIR%requirement.%WINPYARCH%-%WINPYVERLOCK%%my_flavor%%my_release_level%.txt +set req_lock_local=%LOCKDIR%requirement.%WINPYARCH%-%WINPYVERLOCK%%my_flavor%_local.txt + + set my_archive_lockfile=%my_archive_dir%\pylock.%my_flavor%-%WINPYARCH%bit-%WINPYVERLOCK%_%date:/=-%at_%my_time%.toml set my_archive_lockfile_local=%my_archive_dir%\pylock.%my_flavor%-%WINPYARCH%bit-%WINPYVERLOCK%_%date:/=-%at_%my_time%.local.toml set my_changelog_lockfile=%~dp0changelogs\pylock.%my_flavor%-%WINPYARCH%bit-%WINPYVERLOCK%.toml From b5a339a72a8a029e6808474cf830469c3a15a904 Mon Sep 17 00:00:00 2001 From: stonebig Date: Fri, 30 May 2025 11:51:57 +0200 Subject: [PATCH 222/305] move windows menu and register logic to associate.py --- winpython/associate.py | 72 +++++++++++++++++++++++++++++++++++++++--- winpython/utils.py | 63 ------------------------------------ 2 files changed, 67 insertions(+), 68 deletions(-) diff --git a/winpython/associate.py b/winpython/associate.py index 7825ce48..894d8bda 100644 --- a/winpython/associate.py +++ b/winpython/associate.py @@ -10,9 +10,71 @@ from pathlib import Path import importlib.util import winreg -from winpython import utils +from . import utils from argparse import ArgumentParser +def get_special_folder_path(path_name): + """Return special folder path.""" + from win32com.shell import shell, shellcon + try: + csidl = getattr(shellcon, path_name) + return shell.SHGetSpecialFolderPath(0, csidl, False) + except OSError: + print(f"{path_name} is an unknown path ID") + +def get_winpython_start_menu_folder(current=True): + """Return WinPython Start menu shortcuts folder.""" + folder = get_special_folder_path("CSIDL_PROGRAMS") + if not current: + try: + folder = get_special_folder_path("CSIDL_COMMON_PROGRAMS") + except OSError: + pass + return str(Path(folder) / 'WinPython') + +def remove_winpython_start_menu_folder(current=True): + """Remove WinPython Start menu folder -- remove it if it already exists""" + path = get_winpython_start_menu_folder(current=current) + if Path(path).is_dir(): + try: + shutil.rmtree(path, onexc=onerror) + except WindowsError: + print(f"Directory {path} could not be removed", file=sys.stderr) + +def create_winpython_start_menu_folder(current=True): + """Create WinPython Start menu folder.""" + path = get_winpython_start_menu_folder(current=current) + if Path(path).is_dir(): + try: + shutil.rmtree(path, onexc=onerror) + except WindowsError: + print(f"Directory {path} could not be removed", file=sys.stderr) + Path(path).mkdir(parents=True, exist_ok=True) + return path + +def create_shortcut(path, description, filename, arguments="", workdir="", iconpath="", iconindex=0, verbose=True): + """Create Windows shortcut (.lnk file).""" + import pythoncom + from win32com.shell import shell + ilink = pythoncom.CoCreateInstance(shell.CLSID_ShellLink, None, pythoncom.CLSCTX_INPROC_SERVER, shell.IID_IShellLink) + ilink.SetPath(path) + ilink.SetDescription(description) + if arguments: + ilink.SetArguments(arguments) + if workdir: + ilink.SetWorkingDirectory(workdir) + if iconpath or iconindex: + ilink.SetIconLocation(iconpath, iconindex) + # now save it. + ipf = ilink.QueryInterface(pythoncom.IID_IPersistFile) + if not filename.endswith('.lnk'): + filename += '.lnk' + if verbose: + print(f'create menu *{filename}*') + try: + ipf.Save(filename, 0) + except: + print("a fail !") # --- Helper functions for Registry --- @@ -53,7 +115,7 @@ def _has_pywin32(): def _remove_start_menu_folder(target, current=True, has_pywin32=False): "remove menu Folder for target WinPython if pywin32 exists" if has_pywin32: - utils.remove_winpython_start_menu_folder(current=current) + remove_winpython_start_menu_folder(current=current) else: print("Skipping start menu removal as pywin32 package is not installed.") @@ -68,7 +130,7 @@ def _get_shortcut_data(target, current=True, has_pywin32=False): bname, ext = Path(name).stem, Path(name).suffix if ext.lower() == ".exe": # Path for the shortcut file in the start menu folder - shortcut_name = str(Path(utils.create_winpython_start_menu_folder(current=current)) / bname) + '.lnk' + shortcut_name = str(Path(create_winpython_start_menu_folder(current=current)) / bname) + '.lnk' data.append( ( str(Path(wpdir) / name), # Target executable path @@ -180,9 +242,9 @@ def register(target, current=True, reg_type=winreg.REG_SZ, verbose=True): print(f'Creating WinPython menu for all icons in {target.parent}') for path, desc, fname in _get_shortcut_data(target, current=current, has_pywin32=True): try: - utils.create_shortcut(path, desc, fname, verbose=verbose) + create_shortcut(path, desc, fname, verbose=verbose) except Exception as e: - print(f"Error creating shortcut for {desc} at {fname}: {e}", file=sys.stderr) + print(f"Error creating shortcut for {desc} at {fname}: {e}", file=sys.stderr) else: print("Skipping start menu shortcut creation as pywin32 package is needed.") diff --git a/winpython/utils.py b/winpython/utils.py index b825fbce..3e764ca3 100644 --- a/winpython/utils.py +++ b/winpython/utils.py @@ -78,69 +78,6 @@ def sum_up(text: str, max_length: int = 144, stop_at: str = ". ") -> str: return summary[:summary.rfind(stop_at, 0, max_length)] + stop_at.strip() return summary[:max_length].strip() -def get_special_folder_path(path_name): - """Return special folder path.""" - from win32com.shell import shell, shellcon - try: - csidl = getattr(shellcon, path_name) - return shell.SHGetSpecialFolderPath(0, csidl, False) - except OSError: - print(f"{path_name} is an unknown path ID") - -def get_winpython_start_menu_folder(current=True): - """Return WinPython Start menu shortcuts folder.""" - folder = get_special_folder_path("CSIDL_PROGRAMS") - if not current: - try: - folder = get_special_folder_path("CSIDL_COMMON_PROGRAMS") - except OSError: - pass - return str(Path(folder) / 'WinPython') - -def remove_winpython_start_menu_folder(current=True): - """Remove WinPython Start menu folder -- remove it if it already exists""" - path = get_winpython_start_menu_folder(current=current) - if Path(path).is_dir(): - try: - shutil.rmtree(path, onexc=onerror) - except WindowsError: - print(f"Directory {path} could not be removed", file=sys.stderr) - -def create_winpython_start_menu_folder(current=True): - """Create WinPython Start menu folder.""" - path = get_winpython_start_menu_folder(current=current) - if Path(path).is_dir(): - try: - shutil.rmtree(path, onexc=onerror) - except WindowsError: - print(f"Directory {path} could not be removed", file=sys.stderr) - Path(path).mkdir(parents=True, exist_ok=True) - return path - -def create_shortcut(path, description, filename, arguments="", workdir="", iconpath="", iconindex=0, verbose=True): - """Create Windows shortcut (.lnk file).""" - import pythoncom - from win32com.shell import shell - ilink = pythoncom.CoCreateInstance(shell.CLSID_ShellLink, None, pythoncom.CLSCTX_INPROC_SERVER, shell.IID_IShellLink) - ilink.SetPath(path) - ilink.SetDescription(description) - if arguments: - ilink.SetArguments(arguments) - if workdir: - ilink.SetWorkingDirectory(workdir) - if iconpath or iconindex: - ilink.SetIconLocation(iconpath, iconindex) - # now save it. - ipf = ilink.QueryInterface(pythoncom.IID_IPersistFile) - if not filename.endswith('.lnk'): - filename += '.lnk' - if verbose: - print(f'create menu *{filename}*') - try: - ipf.Save(filename, 0) - except: - print("a fail !") - def print_box(text): """Print text in a box""" line0 = "+" + ("-" * (len(text) + 2)) + "+" From f1b88838e45a0aa9371963c8bc154c37667a0958 Mon Sep 17 00:00:00 2001 From: stonebig Date: Fri, 30 May 2025 19:02:00 +0200 Subject: [PATCH 223/305] post-simplification of diff.py after Wheelhouse addition --- diff.py | 190 +++++++++++++++++++++++--------------------------------- 1 file changed, 78 insertions(+), 112 deletions(-) diff --git a/diff.py b/diff.py index 61b4ef80..02317cd0 100644 --- a/diff.py +++ b/diff.py @@ -17,120 +17,94 @@ assert CHANGELOGS_DIR.is_dir() class Package: - # SourceForge Wiki syntax: - PATTERN = r"\[([a-zA-Z\-\:\/\.\_0-9]*)\]\(([^\]\ ]*)\) \| ([^\|]*) \| ([^\|]*)" - # Google Code Wiki syntax: - PATTERN_OLD = r"\[([a-zA-Z\-\:\/\.\_0-9]*) ([^\]\ ]*)\] \| ([^\|]*) \| ([^\|]*)" + PATTERNS = [ + r"\[([\w\-\:\/\.\_]+)\]\(([^)]+)\) \| ([^\|]*) \| ([^\|]*)", # SourceForge + r"\[([\w\-\:\/\.\_]+) ([^\]\ ]+)\] \| ([^\|]*) \| ([^\|]*)" # Google Code + ] - def __init__(self): - self.name = self.version = self.description = self.url = None - - def __str__(self): - return f"{self.name} {self.version}\r\n{self.description}\r\nWebsite: {self.url}" + def __init__(self, text=None): + self.name = self.url = self.version = self.description = None + if text: + self.from_text(text) def from_text(self, text): - match = re.match(self.PATTERN_OLD, text) or re.match(self.PATTERN, text) - if not match: - raise ValueError("Text does not match expected pattern: "+ text) - self.name, self.url, self.version, self.description = match.groups() + for pattern in self.PATTERNS: + match = re.match(pattern, text) + if match: + self.name, self.url, self.version, self.description = match.groups() + return + raise ValueError(f"Unrecognized package line format: {text}") def to_wiki(self): return f" * [{self.name}]({self.url}) {self.version} ({self.description})\r\n" def upgrade_wiki(self, other): - assert self.name.replace("-", "_").lower() == other.name.replace("-", "_").lower() return f" * [{self.name}]({self.url}) {other.version} → {self.version} ({self.description})\r\n" class PackageIndex: - WINPYTHON_PATTERN = r"\#\# WinPython\-*[0-9b-t]* ([0-9\.a-zA-Z]*)" - TOOLS_LINE = "### Tools" - PYTHON_PACKAGES_LINE = "### Python packages" - WHEELHOUSE_PACKAGES_LINE = "### WheelHouse packages" - HEADER_LINE1 = "Name | Version | Description" - HEADER_LINE2 = "-----|---------|------------" + HEADERS = {"tools": "### Tools", "python": "### Python packages", "wheelhouse": "### WheelHouse packages"} + BLANKS = ["Name | Version | Description", "-----|---------|------------", "", "
    ", "
    "] def __init__(self, version, basedir=None, flavor="", architecture=64): self.version = version self.flavor = flavor self.basedir = basedir self.architecture = architecture - self.other_packages = {} - self.python_packages = {} - self.wheelhouse_packages = {} - self.from_file(basedir) - - def from_file(self, basedir): - fname = CHANGELOGS_DIR / f"WinPython{self.flavor}-{self.architecture}bit-{self.version}.md" - if not fname.exists(): - raise FileNotFoundError(f"Changelog file not found: {fname}") - with open(fname, "r", encoding=utils.guess_encoding(fname)[0]) as fdesc: - self.from_text(fdesc.read()) + self.packages = {"tools": {}, "python": {}, "wheelhouse": {}} + self._load_index() - def from_text(self, text): - version = re.match(self.WINPYTHON_PATTERN + self.flavor, text).groups()[0] - assert version == self.version - tools_flag = python_flag = wheelhouse_flag = False + def _load_index(self): + filename = CHANGELOGS_DIR / f"WinPython{self.flavor}-{self.architecture}bit-{self.version}.md" + if not filename.exists(): + raise FileNotFoundError(f"Changelog not found: {filename}") + + with open(filename, "r", encoding=utils.guess_encoding(filename)[0]) as f: + self._parse_index(f.read()) + + def _parse_index(self, text): + current = None for line in text.splitlines(): - if line: - if line == self.TOOLS_LINE: - tools_flag, python_flag, wheelhouse_flag = True, False, False - continue - elif line == self.PYTHON_PACKAGES_LINE: - tools_flag, python_flag, wheelhouse_flag = False, True, False - continue - elif line == self.WHEELHOUSE_PACKAGES_LINE: - tools_flag, python_flag, wheelhouse_flag = False, False, True - continue - elif line in (self.HEADER_LINE1, self.HEADER_LINE2, "
    ", "
    "): - continue - if tools_flag or python_flag or wheelhouse_flag: - package = Package() - package.from_text(line) - if tools_flag: - self.other_packages[package.name] = package - elif python_flag: - self.python_packages[package.name] = package - else: - self.wheelhouse_packages[package.name] = package - -def diff_package_dicts(old_packages, new_packages): + if line in self.HEADERS.values(): + current = [k for k, v in self.HEADERS.items() if v == line][0] + continue + if line.strip() in self.BLANKS: + continue + if current: + pkg = Package(line) + self.packages[current][pkg.name] = pkg + +def compare_packages(old, new): """Return difference between package old and package new""" # wheel replace '-' per '_' in key - old = {k.replace("-", "_").lower(): v for k, v in old_packages.items()} - new = {k.replace("-", "_").lower(): v for k, v in new_packages.items()} - text = "" - - if new_keys := sorted(set(new) - set(old)): - text += "New packages:\r\n\r\n" + "".join(new[k].to_wiki() for k in new_keys) + "\r\n" - - if upgraded := [new[k].upgrade_wiki(old[k]) for k in sorted(set(old) & set(new)) if old[k].version != new[k].version]: - text += "Upgraded packages:\r\n\r\n" + f"{''.join(upgraded)}" + "\r\n" - - if removed_keys := sorted(set(old) - set(new)): - text += "Removed packages:\r\n\r\n" + "".join(old[k].to_wiki() for k in removed_keys) + "\r\n" - return text - -def find_closer_version(version1, basedir=None, flavor="", architecture=64): + def normalize(d): return {k.replace("-", "_").lower(): v for k, v in d.items()} + old, new = normalize(old), normalize(new) + output = "" + + added = [new[k].to_wiki() for k in new if k not in old] + upgraded = [new[k].upgrade_wiki(old[k]) for k in new if k in old and new[k].version != old[k].version] + removed = [old[k].to_wiki() for k in old if k not in new] + + if added: + output += "New packages:\r\n\r\n" + "".join(added) + "\r\n" + if upgraded: + output += "Upgraded packages:\r\n\r\n" + "".join(upgraded) + "\r\n" + if removed: + output += "Removed packages:\r\n\r\n" + "".join(removed) + "\r\n" + return output + +def find_previous_version(target_version, basedir=None, flavor="", architecture=64): """Find version which is the closest to `version`""" - builddir = Path(basedir) / f"bu{flavor}" - pattern = re.compile(rf"WinPython{flavor}-{architecture}bit-([0-9\.]*)\.(txt|md)") - versions = [pattern.match(name).groups()[0] for name in os.listdir(builddir) if pattern.match(name)] - - if version1 not in versions: - raise ValueError(f"Unknown version {version1}") - - version_below = '0.0.0.0' - for v in versions: - if version.parse(version_below) < version.parse(v) and version.parse(v) < version.parse(version1): - version_below = v + build_dir = Path(basedir) / f"bu{flavor}" + pattern = re.compile(rf"WinPython{flavor}-{architecture}bit-([0-9\.]+)\.(txt|md)") + versions = [pattern.match(f).group(1) for f in os.listdir(build_dir) if pattern.match(f)] + versions = [v for v in versions if version.parse(v) < version.parse(target_version)] + return max(versions, key=version.parse, default=target_version) - return version_below if version_below != '0.0.0.0' else version1 +def compare_package_indexes(version2, version1=None, basedir=None, flavor="", flavor1=None, architecture=64): + version1 = version1 or find_previous_version(version2, basedir, flavor, architecture) + flavor1 = flavor1 or flavor -def compare_package_indexes(version2, version1=None, basedir=None, flavor="", flavor1=None,architecture=64): - """Compare two package index Wiki pages""" - version1 = version1 if version1 else find_closer_version(version2, basedir, flavor, architecture) - flavor1 = flavor1 if flavor1 else flavor pi1 = PackageIndex(version1, basedir, flavor1, architecture) pi2 = PackageIndex(version2, basedir, flavor, architecture) @@ -140,37 +114,29 @@ def compare_package_indexes(version2, version1=None, basedir=None, flavor="", fl "
    \r\n\r\n" ) - tools_text = diff_package_dicts(pi1.other_packages, pi2.other_packages) - if tools_text: - text += PackageIndex.TOOLS_LINE + "\r\n\r\n" + tools_text + for key in PackageIndex.HEADERS: + diff = compare_packages(pi1.packages[key], pi2.packages[key]) + if diff: + text += f"{PackageIndex.HEADERS[key]}\r\n\r\n{diff}" - py_text = diff_package_dicts(pi1.python_packages, pi2.python_packages) - if py_text: - text += PackageIndex.PYTHON_PACKAGES_LINE + "\r\n\r\n" + py_text + return text + "\r\n
    \r\n* * *\r\n" - py_text = diff_package_dicts(pi1.wheelhouse_packages, pi2.wheelhouse_packages) - if py_text: - text += PackageIndex.WHEELHOUSE_PACKAGES_LINE + "\r\n\r\n" + py_text - - text += "\r\n\r\n* * *\r\n" - return text - -def _copy_all_changelogs(version, basedir, flavor="", architecture=64): +def copy_changelogs(version, basedir, flavor="", architecture=64): basever = ".".join(version.split(".")[:2]) - pattern = re.compile(rf"WinPython{flavor}-{architecture}bit-{basever}([0-9\.]*)\.(txt|md)") - for name in os.listdir(CHANGELOGS_DIR): - if pattern.match(name): - shutil.copyfile(CHANGELOGS_DIR / name, Path(basedir) / f"bu{flavor}" / name) + pattern = re.compile(rf"WinPython{flavor}-{architecture}bit-{basever}[0-9\.]*\.(txt|md)") + dest = Path(basedir) / f"bu{flavor}" + for fname in os.listdir(CHANGELOGS_DIR): + if pattern.match(fname): + shutil.copyfile(CHANGELOGS_DIR / fname, dest / fname) def write_changelog(version2, version1=None, basedir=None, flavor="", architecture=64): """Write changelog between version1 and version2 of WinPython""" - _copy_all_changelogs(version2, basedir, flavor, architecture) + copy_changelogs(version2, basedir, flavor, architecture) print("comparing_package_indexes", version2, basedir, flavor, architecture) - changelog_text = compare_package_indexes(version2, version1, basedir, flavor, architecture=architecture) + changelog = compare_package_indexes(version2, version1, basedir, flavor, architecture=architecture) output_file = Path(basedir) / f"bu{flavor}" / f"WinPython{flavor}-{architecture}bit-{version2}_History.md" - - with open(output_file, "w", encoding="utf-8") as fdesc: - fdesc.write(changelog_text) + with open(output_file, "w", encoding="utf-8") as f: + f.write(changelog) # Copy to winpython/changelogs shutil.copyfile(output_file, CHANGELOGS_DIR / output_file.name) From d65b8e2c7b3805c4bc205f0e13d5dd47f7c7c67f Mon Sep 17 00:00:00 2001 From: stonebig Date: Sat, 31 May 2025 00:11:02 +0200 Subject: [PATCH 224/305] move diff in winpython for BUILD simplification --- make.py | 6 ++--- diff.py => winpython/diff.py | 52 +++++++++++++++++++----------------- 2 files changed, 29 insertions(+), 29 deletions(-) rename diff.py => winpython/diff.py (71%) diff --git a/make.py b/make.py index d66a5213..f4706dc2 100644 --- a/make.py +++ b/make.py @@ -12,9 +12,7 @@ import subprocess import sys from pathlib import Path -from winpython import wppm, utils -# Local import -import diff +from winpython import wppm, utils, diff # Define constant paths for clarity CHANGELOGS_DIRECTORY = Path(__file__).parent / "changelogs" @@ -265,7 +263,7 @@ def build(self, rebuild: bool = True, requirements_files_list=None, winpy_dirnam self._print_action("Writing changelog") shutil.copyfile(output_markdown_filename, str(Path(CHANGELOGS_DIRECTORY) / Path(output_markdown_filename).name)) - diff.write_changelog(self.winpyver2, None, self.base_directory, self.flavor, self.distribution.architecture) + diff.write_changelog(self.winpyver2, None, CHANGELOGS_DIRECTORY, self.flavor, self.distribution.architecture, basedir=self.winpython_directory.parent) def rebuild_winpython_package(source_directory: Path, target_directory: Path, architecture: int = 64, verbose: bool = False): """Rebuilds the winpython package from source using flit.""" diff --git a/diff.py b/winpython/diff.py similarity index 71% rename from diff.py rename to winpython/diff.py index 02317cd0..594cbe36 100644 --- a/diff.py +++ b/winpython/diff.py @@ -11,9 +11,9 @@ import re import shutil from packaging import version -from winpython import utils +from . import utils -CHANGELOGS_DIR = Path(__file__).parent / "changelogs" +CHANGELOGS_DIR = Path(__file__).parent.parent / "changelogs" assert CHANGELOGS_DIR.is_dir() class Package: @@ -45,16 +45,16 @@ class PackageIndex: HEADERS = {"tools": "### Tools", "python": "### Python packages", "wheelhouse": "### WheelHouse packages"} BLANKS = ["Name | Version | Description", "-----|---------|------------", "", "
    ", "
    "] - def __init__(self, version, basedir=None, flavor="", architecture=64): + def __init__(self, version, searchdir=None, flavor="", architecture=64): self.version = version self.flavor = flavor - self.basedir = basedir + self.searchdir = searchdir self.architecture = architecture self.packages = {"tools": {}, "python": {}, "wheelhouse": {}} self._load_index() def _load_index(self): - filename = CHANGELOGS_DIR / f"WinPython{self.flavor}-{self.architecture}bit-{self.version}.md" + filename = self.searchdir / f"WinPython{self.flavor}-{self.architecture}bit-{self.version}.md" if not filename.exists(): raise FileNotFoundError(f"Changelog not found: {filename}") @@ -93,20 +93,20 @@ def normalize(d): return {k.replace("-", "_").lower(): v for k, v in d.items()} output += "Removed packages:\r\n\r\n" + "".join(removed) + "\r\n" return output -def find_previous_version(target_version, basedir=None, flavor="", architecture=64): +def find_previous_version(target_version, searchdir=None, flavor="", architecture=64): """Find version which is the closest to `version`""" - build_dir = Path(basedir) / f"bu{flavor}" + search_dir = Path(searchdir) if searchdir else CHANGELOGS_DIR pattern = re.compile(rf"WinPython{flavor}-{architecture}bit-([0-9\.]+)\.(txt|md)") - versions = [pattern.match(f).group(1) for f in os.listdir(build_dir) if pattern.match(f)] + versions = [pattern.match(f).group(1) for f in os.listdir(search_dir) if pattern.match(f)] versions = [v for v in versions if version.parse(v) < version.parse(target_version)] return max(versions, key=version.parse, default=target_version) -def compare_package_indexes(version2, version1=None, basedir=None, flavor="", flavor1=None, architecture=64): - version1 = version1 or find_previous_version(version2, basedir, flavor, architecture) +def compare_package_indexes(version2, version1=None, searchdir=None, flavor="", flavor1=None, architecture=64): + version1 = version1 or find_previous_version(version2, searchdir, flavor, architecture) flavor1 = flavor1 or flavor - pi1 = PackageIndex(version1, basedir, flavor1, architecture) - pi2 = PackageIndex(version2, basedir, flavor, architecture) + pi1 = PackageIndex(version1, searchdir, flavor1, architecture) + pi2 = PackageIndex(version2, searchdir, flavor, architecture) text = ( f"## History of changes for WinPython-{architecture}bit {version2 + flavor}\r\n\r\n" @@ -121,25 +121,27 @@ def compare_package_indexes(version2, version1=None, basedir=None, flavor="", fl return text + "\r\n\r\n* * *\r\n" -def copy_changelogs(version, basedir, flavor="", architecture=64): +def copy_changelogs(version, searchdir, flavor="", architecture=64, basedir=None): basever = ".".join(version.split(".")[:2]) pattern = re.compile(rf"WinPython{flavor}-{architecture}bit-{basever}[0-9\.]*\.(txt|md)") - dest = Path(basedir) / f"bu{flavor}" - for fname in os.listdir(CHANGELOGS_DIR): + dest = Path(basedir) + for fname in os.listdir(searchdir): if pattern.match(fname): - shutil.copyfile(CHANGELOGS_DIR / fname, dest / fname) + shutil.copyfile(searchdir / fname, dest / fname) -def write_changelog(version2, version1=None, basedir=None, flavor="", architecture=64): +def write_changelog(version2, version1=None, searchdir=None, flavor="", architecture=64, basedir=None): """Write changelog between version1 and version2 of WinPython""" - copy_changelogs(version2, basedir, flavor, architecture) - print("comparing_package_indexes", version2, basedir, flavor, architecture) - changelog = compare_package_indexes(version2, version1, basedir, flavor, architecture=architecture) - output_file = Path(basedir) / f"bu{flavor}" / f"WinPython{flavor}-{architecture}bit-{version2}_History.md" + if basedir: + copy_changelogs(version2, searchdir, flavor, architecture, basedir) + print("comparing_package_indexes", version2, searchdir, flavor, architecture) + changelog = compare_package_indexes(version2, version1, searchdir, flavor, architecture=architecture) + output_file = searchdir / f"WinPython{flavor}-{architecture}bit-{version2}_History.md" with open(output_file, "w", encoding="utf-8") as f: f.write(changelog) - # Copy to winpython/changelogs - shutil.copyfile(output_file, CHANGELOGS_DIR / output_file.name) + # Copy to winpython/changelogs back to basedir + if basedir: + shutil.copyfile(output_file, basedir / output_file.name) if __name__ == "__main__": - print(compare_package_indexes("3.7.4.0", "3.7.2.0", r"C:\WinP\bd37", "Zero", architecture=32)) - write_changelog("3.7.4.0", "3.7.2.0", r"C:\WinP\bd37", "Ps2", architecture=64) + print(compare_package_indexes("3.7.4.0", "3.7.2.0", r"C:\WinP\bd37\budot", "Zero", architecture=32)) + write_changelog("3.7.4.0", "3.7.2.0", r"C:\WinP\bd37\budot", "Ps2", architecture=64) From c465cfb7d6ca301876b3db6b43f10befbbfc9082 Mon Sep 17 00:00:00 2001 From: stonebig Date: Sat, 31 May 2025 14:22:38 +0200 Subject: [PATCH 225/305] markdown reportlog pushed down to wppm --- make.py | 33 +++++++-------------------------- winpython/wppm.py | 32 ++++++++++++++++++++++++++++++++ 2 files changed, 39 insertions(+), 26 deletions(-) diff --git a/make.py b/make.py index f4706dc2..ec75c078 100644 --- a/make.py +++ b/make.py @@ -100,32 +100,13 @@ def _get_python_zip_file(self) -> Path: @property def package_index_markdown(self) -> str: """Generates a Markdown formatted package index page.""" - return f"""## WinPython {self.winpyver2 + self.flavor} - -The following packages are included in WinPython-{self.architecture_bits}bit v{self.winpyver2 + self.flavor} {self.release_level}. - -
    - -### Tools - -Name | Version | Description ------|---------|------------ -{utils.get_installed_tools_markdown(utils.get_python_executable(self.python_executable_directory))} - -### Python packages - -Name | Version | Description ------|---------|------------ -{self.distribution.get_installed_packages_markdown()} - -### WheelHouse packages - -Name | Version | Description ------|---------|------------ -{self.distribution.get_wheelhouse_packages_markdown()} - -
    -""" + return self.distribution.generate_package_index_markdown( + self.python_executable_directory, + self.winpyver2, + self.flavor, + self.architecture_bits, + self.release_level + ) @property def winpython_version_name(self) -> str: diff --git a/winpython/wppm.py b/winpython/wppm.py index 58f5769b..6b967e71 100644 --- a/winpython/wppm.py +++ b/winpython/wppm.py @@ -87,6 +87,38 @@ def get_wheelhouse_packages_markdown(self) -> str: return "\n".join(package_lines) return "" + def generate_package_index_markdown(self, python_executable_directory: str, winpyver2: str, + flavor: str, architecture_bits: int, release_level: str) -> str: + """Generates a Markdown formatted package index page.""" + from winpython import utils # If needed + + return f"""## WinPython {winpyver2 + flavor} + +The following packages are included in WinPython-{architecture_bits}bit v{winpyver2 + flavor} {release_level}. + +
    + +### Tools + +Name | Version | Description +-----|---------|------------ +{utils.get_installed_tools_markdown(utils.get_python_executable(python_executable_directory))} + +### Python packages + +Name | Version | Description +-----|---------|------------ +{self.get_installed_packages_markdown()} + +### WheelHouse packages + +Name | Version | Description +-----|---------|------------ +{self.get_wheelhouse_packages_markdown()} + +
    +""" + def find_package(self, name: str) -> Package | None: """Find installed package by name.""" for pack in self.get_installed_packages(): From cd48d21f07e695ae0759a24bbebde3352bd8557a Mon Sep 17 00:00:00 2001 From: stonebig Date: Sat, 31 May 2025 15:41:35 +0200 Subject: [PATCH 226/305] wppm can auto-report from winpython import wppm;print(wppm.Distribution().generate_package_index_markdown()) --- winpython/wppm.py | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/winpython/wppm.py b/winpython/wppm.py index 6b967e71..782a51c5 100644 --- a/winpython/wppm.py +++ b/winpython/wppm.py @@ -87,14 +87,19 @@ def get_wheelhouse_packages_markdown(self) -> str: return "\n".join(package_lines) return "" - def generate_package_index_markdown(self, python_executable_directory: str, winpyver2: str, - flavor: str, architecture_bits: int, release_level: str) -> str: + def generate_package_index_markdown(self, python_executable_directory: str|None = None, winpyver2: str|None = None, + flavor: str|None = None, architecture_bits: int|None = None, release_level: str|None = None) -> str: """Generates a Markdown formatted package index page.""" - from winpython import utils # If needed + my_ver , my_arch = utils.get_python_infos(python_executable_directory or self.target) + # suppose we suite ourself (method will vary over time) + my_winpyver2 = winpyver2 or os.getenv("WINPYVER2","") + my_winpyver2 = my_winpyver2 if my_winpyver2 != "" else my_ver + my_flavor = flavor or os.getenv("WINPYFLAVOR", "") + my_release_level = release_level or os.getenv("WINPYVER", "").replace(my_winpyver2+my_flavor, "") - return f"""## WinPython {winpyver2 + flavor} + return f"""## WinPython {my_winpyver2 + my_flavor} -The following packages are included in WinPython-{architecture_bits}bit v{winpyver2 + flavor} {release_level}. +The following packages are included in WinPython-{my_arch}bit v{my_winpyver2 + my_flavor} {my_release_level}.
    From ec7a132041fd46ede4fe3f8f58a44945a8153c30 Mon Sep 17 00:00:00 2001 From: stonebig Date: Sun, 1 Jun 2025 11:05:16 +0200 Subject: [PATCH 227/305] simplify markdown generation --- winpython/utils.py | 15 +++++------- winpython/wppm.py | 57 +++++++++++++++++----------------------------- 2 files changed, 27 insertions(+), 45 deletions(-) diff --git a/winpython/utils.py b/winpython/utils.py index 3e764ca3..2d549f20 100644 --- a/winpython/utils.py +++ b/winpython/utils.py @@ -11,9 +11,7 @@ import stat import shutil import locale -import tempfile import subprocess -import configparser as cp from pathlib import Path import re import tarfile @@ -41,25 +39,24 @@ def get_site_packages_path(path=None): pypy_site_packages = base_dir / 'site-packages' # For PyPy return str(pypy_site_packages if pypy_site_packages.is_dir() else site_packages) -def get_installed_tools_markdown(path=None)-> str: +def get_installed_tools(path=None)-> str: """Generates Markdown for installed tools section in package index.""" tool_lines = [] python_exe = Path(get_python_executable(path)) version = exec_shell_cmd(f'powershell (Get-Item {python_exe}).VersionInfo.FileVersion', python_exe.parent).splitlines()[0] - tool_lines.append(f"[Python](http://www.python.org/) | {version} | Python programming language with standard library") + tool_lines.append(("Python" ,f"http://www.python.org/", version, "Python programming language with standard library")) if (node_exe := python_exe.parent.parent / "n" / "node.exe").exists(): version = exec_shell_cmd(f'powershell (Get-Item {node_exe}).VersionInfo.FileVersion', node_exe.parent).splitlines()[0] - tool_lines.append(f"[Nodejs](https://nodejs.org) | {version} | a JavaScript runtime built on Chrome's V8 JavaScript engine") + tool_lines.append("Nodejs", "https://nodejs.org", version, "a JavaScript runtime built on Chrome's V8 JavaScript engine") if (pandoc_exe := python_exe.parent.parent / "t" / "pandoc.exe").exists(): version = exec_shell_cmd("pandoc -v", pandoc_exe.parent).splitlines()[0].split(" ")[-1] - tool_lines.append(f"[Pandoc](https://pandoc.org) | {version} | an universal document converter") + tool_lines.append("Pandoc", "https://pandoc.org", version, "an universal document converter") if (vscode_exe := python_exe.parent.parent / "t" / "VSCode" / "Code.exe").exists(): version = exec_shell_cmd(f'powershell (Get-Item {vscode_exe}).VersionInfo.FileVersion', vscode_exe.parent).splitlines()[0] - tool_lines.append(f"[VSCode](https://code.visualstudio.com) | {version} | a source-code editor developed by Microsoft") - return "\n".join(tool_lines) - + tool_lines.append("VSCode","https://code.visualstudio.com", version, "a source-code editor developed by Microsoft") + return tool_lines def onerror(function, path, excinfo): """Error handler for `shutil.rmtree`.""" diff --git a/winpython/wppm.py b/winpython/wppm.py index 782a51c5..8b733b68 100644 --- a/winpython/wppm.py +++ b/winpython/wppm.py @@ -69,24 +69,16 @@ def get_installed_packages(self, update: bool = False) -> list[Package]: pip_list = self.pip.pip_list(full=True) return [Package(f"{i[0].replace('-', '_').lower()}-{i[1]}-py3-none-any.whl", suggested_summary=i[2]) for i in pip_list] - def get_installed_packages_markdown(self) -> str: - """Generates Markdown for installed packages section in package index.""" - package_lines = [ - f"[{pkg.name}]({pkg.url}) | {pkg.version} | {pkg.description}" - for pkg in sorted(self.get_installed_packages(), key=lambda p: p.name.lower()) - ] - return "\n".join(package_lines) - - def get_wheelhouse_packages_markdown(self) -> str: - wheeldir = self.wheelhouse / 'included.wheels' - if wheeldir.is_dir(): - package_lines = [ - f"[{name}](https://pypi.org/project/{name}) | {version} | {summary}" - for name, version, summary in sorted(wh.list_packages_with_metadata(str(wheeldir)), key=itemgetter(0 , 1)) # lambda p: p[0].lower()) - ] - return "\n".join(package_lines) - return "" - + def render_markdown_for_list(self, title, items): + """Generates a Markdown section; name, url, version, summary""" + md = f"### {title}\n\n" + md += "Name | Version | Description\n" + md += "-----|---------|------------\n" + for name, url, version, summary in sorted(items, key=lambda p: (p[0].lower(), p[2])): + md += f"[{name}]({url}) | {version} | {summary} \n" + md += "\n" + return md + def generate_package_index_markdown(self, python_executable_directory: str|None = None, winpyver2: str|None = None, flavor: str|None = None, architecture_bits: int|None = None, release_level: str|None = None) -> str: """Generates a Markdown formatted package index page.""" @@ -97,30 +89,23 @@ def generate_package_index_markdown(self, python_executable_directory: str|None my_flavor = flavor or os.getenv("WINPYFLAVOR", "") my_release_level = release_level or os.getenv("WINPYVER", "").replace(my_winpyver2+my_flavor, "") + tools_list = utils.get_installed_tools(utils.get_python_executable(python_executable_directory)) + package_list = [(pkg.name, pkg.url, pkg.version, pkg.description) for pkg in self.get_installed_packages()] + wheelhouse_list = [] + wheeldir = self.wheelhouse / 'included.wheels' + if wheeldir.is_dir(): + wheelhouse_list = [(name, f"https://pypi.org/project/{name}", version, summary) + for name, version, summary in wh.list_packages_with_metadata(str(wheeldir)) ] + return f"""## WinPython {my_winpyver2 + my_flavor} The following packages are included in WinPython-{my_arch}bit v{my_winpyver2 + my_flavor} {my_release_level}.
    -### Tools - -Name | Version | Description ------|---------|------------ -{utils.get_installed_tools_markdown(utils.get_python_executable(python_executable_directory))} - -### Python packages - -Name | Version | Description ------|---------|------------ -{self.get_installed_packages_markdown()} - -### WheelHouse packages - -Name | Version | Description ------|---------|------------ -{self.get_wheelhouse_packages_markdown()} - +{self.render_markdown_for_list("Tools", tools_list)} +{self.render_markdown_for_list("Python packages", package_list)} +{self.render_markdown_for_list("WheelHouse packages", wheelhouse_list)}
    """ From eb7548fd244c677a440cbcc0337fa3e59f9835bf Mon Sep 17 00:00:00 2001 From: stonebig Date: Sun, 1 Jun 2025 20:11:13 +0200 Subject: [PATCH 228/305] wppm -ls -ws ... works navigating into a WheelHouse.. --- winpython/packagemetadata.py | 109 +++++++++++++++++++++++++++++++++++ winpython/piptree.py | 13 +++-- winpython/wppm.py | 8 +-- 3 files changed, 121 insertions(+), 9 deletions(-) create mode 100644 winpython/packagemetadata.py diff --git a/winpython/packagemetadata.py b/winpython/packagemetadata.py new file mode 100644 index 00000000..469925d6 --- /dev/null +++ b/winpython/packagemetadata.py @@ -0,0 +1,109 @@ +#!/usr/bin/env python3 +""" +packagemetadata.py - get metadata from designated place +""" +import os +import re +import tarfile +import zipfile +import sys +from pathlib import Path +from collections import defaultdict +import shutil +import subprocess +from typing import Dict, List, Optional, Tuple +from . import utils + +from packaging.utils import canonicalize_name, parse_wheel_filename, parse_sdist_filename +# --- Abstract metadata accessor --- + +class PackageMetadata: + """A minimal abstraction for package metadata.""" + def __init__(self, name, version, requires, summary, description, metadata): + self.name = name + self.version = version + self.requires = requires # List[str] of dependencies + self.summary = summary + self.description = description + self.metadata = metadata + +def get_installed_metadata(path = None) -> List[PackageMetadata]: + # Use importlib.metadata or pkg_resources + import importlib.metadata + pkgs = [] + distro = importlib.metadata.distributions(path = path) if path else importlib.metadata.distributions() + for dist in distro: + name = dist.metadata['Name'] + version = dist.version + summary = dist.metadata.get("Summary", ""), + description = dist.metadata.get("Description", ""), + requires = dist.requires or [] + metadata = dist.metadata + pkgs.append(PackageMetadata(name, version, requires, summary, description, metadata)) + return pkgs + +def get_directory_metadata(directory: str) -> List[PackageMetadata]: + # For each .whl/.tar.gz file in directory, extract metadata + pkgs = [] + for fname in os.listdir(directory): + if fname.endswith('.whl'): + # Extract METADATA from wheel + meta = extract_metadata_from_wheel(os.path.join(directory, fname)) + pkgs.append(meta) + elif fname.endswith('.tar.gz'): + # Extract PKG-INFO from sdist + meta = extract_metadata_from_sdist(os.path.join(directory, fname)) + pkgs.append(meta) + return pkgs + +def extract_metadata_from_wheel(path: str) -> PackageMetadata: + import zipfile + with zipfile.ZipFile(path) as zf: + for name in zf.namelist(): + if name.endswith(r'.dist-info/METADATA') and name.split("/")[1] == "METADATA": + with zf.open(name) as f: + # Parse metadata (simple parsing for Name, Version, Requires-Dist) + return parse_metadata_file(f.read().decode()) + raise ValueError(f"No METADATA found in {path}") + +def extract_metadata_from_sdist(path: str) -> PackageMetadata: + import tarfile + with tarfile.open(path, "r:gz") as tf: + for member in tf.getmembers(): + if member.name.endswith('PKG-INFO'): + f = tf.extractfile(member) + return parse_metadata_file(f.read().decode()) + raise ValueError(f"No PKG-INFO found in {path}") + +def parse_metadata_file(txt: str) -> PackageMetadata: + name = version = summary = description = "" + requires = [] + for line in txt.splitlines(): + if line.startswith('Name: '): + name = line[6:].strip() + elif line.startswith('Version: '): + version = line[9:].strip() + elif line.startswith('Summary: '): + summary = description = line[9:].strip() + elif line.startswith('Requires-Dist: '): + requires.append(line[14:].strip()) + return PackageMetadata(name, version, requires, summary, description, {'Name': name, "Summary": summary, "Description": description}) + +# --- Main dependency tree logic --- + +def build_dependency_tree(pkgs: List[PackageMetadata]): + # Existing logic, but using our PackageMetadata objects + pass + +def main(): + if len(sys.argv) > 1: + # Directory mode + directory = sys.argv[1] + pkgs = get_directory_metadata(directory) + else: + # Installed packages mode + pkgs = get_installed_metadata() + build_dependency_tree(pkgs) + +if __name__ == "__main__": + main() \ No newline at end of file diff --git a/winpython/piptree.py b/winpython/piptree.py index 1cc1d1ab..e46bd465 100644 --- a/winpython/piptree.py +++ b/winpython/piptree.py @@ -18,6 +18,7 @@ from importlib.metadata import Distribution, distributions from pathlib import Path from . import utils +from . import packagemetadata as pm logging.basicConfig(level=logging.INFO) logger = logging.getLogger(__name__) @@ -29,7 +30,7 @@ class PipDataError(Exception): class PipData: """Manages package metadata and dependency relationships in a Python environment.""" - def __init__(self, target: Optional[str] = None): + def __init__(self, target: Optional[str] = None, wheelhouse = None): """ Initialize the PipData instance. @@ -39,7 +40,7 @@ def __init__(self, target: Optional[str] = None): self.raw: Dict[str, Dict] = {} self.environment = self._get_environment() try: - packages = self._get_packages(target or sys.executable) + packages = self._get_packages(target or sys.executable, wheelhouse) self._process_packages(packages) self._populate_reverse_dependencies() except Exception as e: @@ -67,12 +68,14 @@ def _get_environment(self) -> Dict[str, str]: "sys_platform": sys.platform, } - def _get_packages(self, search_path: str) -> List[Distribution]: + def _get_packages(self, search_path: str, wheelhouse) -> List[Distribution]: """Retrieve installed packages from the specified path.""" + if wheelhouse: + return pm.get_directory_metadata(wheelhouse) if sys.executable == search_path: - return Distribution.discover() + return pm.get_installed_metadata() #Distribution.discover() else: - return distributions(path=[str(Path(search_path).parent / 'lib' / 'site-packages')]) + return pm.get_installed_metadata(path=[str(Path(search_path).parent / 'lib' / 'site-packages')]) #distributions(path=[str(Path(search_path).parent / 'lib' / 'site-packages')]) def _process_packages(self, packages: List[Distribution]) -> None: """Process packages metadata and store them in the distro dictionary.""" diff --git a/winpython/wppm.py b/winpython/wppm.py index 8b733b68..5b83988c 100644 --- a/winpython/wppm.py +++ b/winpython/wppm.py @@ -295,17 +295,17 @@ def main(test=False): if args.registerWinPython and args.unregisterWinPython: raise RuntimeError("Incompatible arguments: --install and --uninstall") if args.pipdown: - pip = piptree.PipData(targetpython) + pip = piptree.PipData(targetpython, args.wheelsource) pack, extra, *other = (args.fname + "[").replace("]", "[").split("[") print(pip.down(pack, extra, args.levels, verbose=args.verbose)) sys.exit() elif args.pipup: - pip = piptree.PipData(targetpython) + pip = piptree.PipData(targetpython, args.wheelsource) pack, extra, *other = (args.fname + "[").replace("]", "[").split("[") print(pip.up(pack, extra, args.levels, verbose=args.verbose)) sys.exit() elif args.list: - pip = piptree.PipData(targetpython) + pip = piptree.PipData(targetpython, args.wheelsource) todo = [l for l in pip.pip_list(full=True) if bool(re.search(args.fname, l[0]))] titles = [['Package', 'Version', 'Summary'], ['_' * max(x, 6) for x in utils.columns_width(todo)]] listed = utils.formatted_list(titles + todo, max_width=70) @@ -313,7 +313,7 @@ def main(test=False): print(*p) sys.exit() elif args.all: - pip = piptree.PipData(targetpython) + pip = piptree.PipData(targetpython, args.wheelsource) todo = [l for l in pip.pip_list(full=True) if bool(re.search(args.fname, l[0]))] for l in todo: # print(pip.distro[l[0]]) From c017a18357ed98a6274b58577a8bd38c342f9036 Mon Sep 17 00:00:00 2001 From: stonebig Date: Tue, 3 Jun 2025 21:23:30 +0200 Subject: [PATCH 229/305] less spaces in the raw changelog --- winpython/diff.py | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/winpython/diff.py b/winpython/diff.py index 594cbe36..a8e52e1d 100644 --- a/winpython/diff.py +++ b/winpython/diff.py @@ -36,10 +36,10 @@ def from_text(self, text): raise ValueError(f"Unrecognized package line format: {text}") def to_wiki(self): - return f" * [{self.name}]({self.url}) {self.version} ({self.description})\r\n" + return f" * [{self.name}]({self.url}) {self.version} ({self.description})\n" def upgrade_wiki(self, other): - return f" * [{self.name}]({self.url}) {other.version} → {self.version} ({self.description})\r\n" + return f" * [{self.name}]({self.url}) {other.version} → {self.version} ({self.description})\n" class PackageIndex: HEADERS = {"tools": "### Tools", "python": "### Python packages", "wheelhouse": "### WheelHouse packages"} @@ -86,11 +86,11 @@ def normalize(d): return {k.replace("-", "_").lower(): v for k, v in d.items()} removed = [old[k].to_wiki() for k in old if k not in new] if added: - output += "New packages:\r\n\r\n" + "".join(added) + "\r\n" + output += "New packages:\n\n" + "".join(added) + "\n\n" if upgraded: - output += "Upgraded packages:\r\n\r\n" + "".join(upgraded) + "\r\n" + output += "Upgraded packages:\n\n" + "".join(upgraded) + "\n\n" if removed: - output += "Removed packages:\r\n\r\n" + "".join(removed) + "\r\n" + output += "Removed packages:\n\n" + "".join(removed) + "\n\n" return output def find_previous_version(target_version, searchdir=None, flavor="", architecture=64): @@ -110,16 +110,16 @@ def compare_package_indexes(version2, version1=None, searchdir=None, flavor="", text = ( f"## History of changes for WinPython-{architecture}bit {version2 + flavor}\r\n\r\n" - f"The following changes were made to WinPython-{architecture}bit distribution since version {version1 + flavor1}.\r\n\r\n" - "
    \r\n\r\n" + f"The following changes were made to WinPython-{architecture}bit distribution since version {version1 + flavor1}.\n\n\n" + "
    \n\n" ) for key in PackageIndex.HEADERS: diff = compare_packages(pi1.packages[key], pi2.packages[key]) if diff: - text += f"{PackageIndex.HEADERS[key]}\r\n\r\n{diff}" + text += f"\n{PackageIndex.HEADERS[key]}\n\n{diff}" - return text + "\r\n
    \r\n* * *\r\n" + return text + "\n
    \n\n* * *\n" def copy_changelogs(version, searchdir, flavor="", architecture=64, basedir=None): basever = ".".join(version.split(".")[:2]) From bdb7288f9d1b9ea32c3a735310bf52b36a48ec6e Mon Sep 17 00:00:00 2001 From: stonebig Date: Tue, 3 Jun 2025 21:26:09 +0200 Subject: [PATCH 230/305] -md markdown and -ws . options for comfort --- winpython/__init__.py | 2 +- winpython/packagemetadata.py | 14 ++----- winpython/wheelhouse.py | 81 ++---------------------------------- winpython/wppm.py | 24 +++++++---- 4 files changed, 24 insertions(+), 97 deletions(-) diff --git a/winpython/__init__.py b/winpython/__init__.py index d2fdc391..468eed57 100644 --- a/winpython/__init__.py +++ b/winpython/__init__.py @@ -28,6 +28,6 @@ OTHER DEALINGS IN THE SOFTWARE. """ -__version__ = '16.3.20250530' +__version__ = '16.4.20250603' __license__ = __doc__ __project_url__ = 'http://winpython.github.io/' diff --git a/winpython/packagemetadata.py b/winpython/packagemetadata.py index 469925d6..4e2a4989 100644 --- a/winpython/packagemetadata.py +++ b/winpython/packagemetadata.py @@ -14,7 +14,6 @@ from typing import Dict, List, Optional, Tuple from . import utils -from packaging.utils import canonicalize_name, parse_wheel_filename, parse_sdist_filename # --- Abstract metadata accessor --- class PackageMetadata: @@ -64,7 +63,7 @@ def extract_metadata_from_wheel(path: str) -> PackageMetadata: with zf.open(name) as f: # Parse metadata (simple parsing for Name, Version, Requires-Dist) return parse_metadata_file(f.read().decode()) - raise ValueError(f"No METADATA found in {path}") + raise ValueError(f"No METADATA found in {path}") def extract_metadata_from_sdist(path: str) -> PackageMetadata: import tarfile @@ -78,6 +77,8 @@ def extract_metadata_from_sdist(path: str) -> PackageMetadata: def parse_metadata_file(txt: str) -> PackageMetadata: name = version = summary = description = "" requires = [] + description_lines = [] + in_description = False for line in txt.splitlines(): if line.startswith('Name: '): name = line[6:].strip() @@ -86,15 +87,9 @@ def parse_metadata_file(txt: str) -> PackageMetadata: elif line.startswith('Summary: '): summary = description = line[9:].strip() elif line.startswith('Requires-Dist: '): - requires.append(line[14:].strip()) + requires.append(line[14:].strip()) return PackageMetadata(name, version, requires, summary, description, {'Name': name, "Summary": summary, "Description": description}) -# --- Main dependency tree logic --- - -def build_dependency_tree(pkgs: List[PackageMetadata]): - # Existing logic, but using our PackageMetadata objects - pass - def main(): if len(sys.argv) > 1: # Directory mode @@ -103,7 +98,6 @@ def main(): else: # Installed packages mode pkgs = get_installed_metadata() - build_dependency_tree(pkgs) if __name__ == "__main__": main() \ No newline at end of file diff --git a/winpython/wheelhouse.py b/winpython/wheelhouse.py index aa095af4..f500dc31 100644 --- a/winpython/wheelhouse.py +++ b/winpython/wheelhouse.py @@ -12,9 +12,7 @@ import shutil import subprocess from typing import Dict, List, Optional, Tuple -from email import message_from_bytes -from email.parser import BytesParser -from email.policy import default +from . import packagemetadata as pm from . import utils from packaging.utils import canonicalize_name, parse_wheel_filename, parse_sdist_filename @@ -192,83 +190,10 @@ def get_pylock_wheels(wheelhouse: Path, lockfile: Path, wheelorigin: Optional[Pa else: print(f"\n\n*** We can't install {filename} ! ***\n\n") -def extract_metadata_from_wheel(filepath: Path) -> Optional[Tuple[str, str, str]]: - "Extract package metadata from a .whl file and validate it matches the filename" - wheel_name = filepath.name - try: - name, version, build, tags = parse_wheel_filename(wheel_name) - filename_name = canonicalize_name(name) - filename_version = str(version) - except Exception as e: - print(f"❌ Could not parse filename: {wheel_name}", e) - return None - - with zipfile.ZipFile(filepath, 'r') as z: - # Locate *.dist-info/METADATA file inside but not in a vendored directory (flit-core) - for name in z.namelist(): - if name.endswith(r'.dist-info/METADATA') and name.split("/")[1] == "METADATA": - with z.open(name) as meta_file: - metadata = BytesParser(policy=default).parse(meta_file) - meta_name = canonicalize_name(str(metadata.get('Name', 'unknown'))) # Avoid Head type - meta_version = str(metadata.get('Version', 'unknown')) - summary = utils.sum_up(str(metadata.get('Summary', ''))) - # Assert consistency - if meta_name != filename_name or meta_version != filename_version: - print(f"⚠️ Mismatch in {wheel_name}: filename says {filename_name}=={filename_version}, " - f"but METADATA says {meta_name}=={meta_version}") - return None - return meta_name, meta_version , summary - return None - -def extract_metadata_from_sdist(filepath: Path) -> Optional[Tuple[str, str, str]]: - "get metadata from a tar.gz or .zip package" - open_func = tarfile.open if filepath.suffixes[-2:] == ['.tar', '.gz'] else zipfile.ZipFile - sdist_name = filepath.name - try: - name, version = parse_sdist_filename(sdist_name) - filename_name = canonicalize_name(name) - filename_version = str(version) - except Exception as e: - print(f"❌ Could not parse filename: {sdist_name}", e) - return None - - with open_func(filepath, 'r') as archive: - namelist = archive.getnames() if isinstance(archive, tarfile.TarFile) else archive.namelist() - for name in namelist: - if name.endswith('PKG-INFO'): - if isinstance(archive, tarfile.TarFile): - content = archive.extractfile(name) - else: - content = archive.open(name) - if content: - metadata = BytesParser(policy=default).parse(content) - meta_name = canonicalize_name(str(metadata.get('Name', 'unknown'))) # Avoid Head type - meta_version = str(metadata.get('Version', 'unknown')) - summary = utils.sum_up(str(metadata.get('Summary', ''))) - # Assert consistency - if meta_name != filename_name or meta_version != filename_version: - print(f"⚠️ Mismatch in {sdist_name}: filename says {filename_name}=={filename_version}, " - f"but METADATA says {meta_name}=={meta_version}") - return None - return meta_name, meta_version, summary - return None - def list_packages_with_metadata(directory: str) -> List[Tuple[str, str, str]]: "get metadata from a Wheelhouse directory" - results = [] - for file in os.listdir(directory): - path = Path(directory) / file - try: - if path.suffix == '.whl': - meta = extract_metadata_from_wheel(path) - elif path.suffix == '.zip' or path.name.endswith('.tar.gz'): - meta = extract_metadata_from_sdist(path) - else: - continue - if meta: - results.append(meta) - except OSError: #Exception as e: # need to see it - print(f"Skipping {file}: {e}") + packages = pm.get_directory_metadata(directory) + results = [ (p.name, p.version, p.summary) for p in packages] return results def main() -> None: diff --git a/winpython/wppm.py b/winpython/wppm.py index 5b83988c..01ed2c83 100644 --- a/winpython/wppm.py +++ b/winpython/wppm.py @@ -274,14 +274,15 @@ def main(test=False): # parser.add_argument( "--unregister_forall", action="store_true", help="un-Register distribution for all users") parser.add_argument("--fix", action="store_true", help="make WinPython fix") parser.add_argument("--movable", action="store_true", help="make WinPython movable") - parser.add_argument("-ws", dest="wheelsource", default=None, type=str, help="location to search wheels: wppm pylock.toml -ws source_of_wheels") - parser.add_argument("-wd", dest="wheeldrain" , default=None, type=str, help="location of found wheels: wppm pylock.toml -wd destination_of_wheels") - parser.add_argument("-ls", "--list", action="store_true", help="list installed packages matching the given [optional] package expression: wppm -ls, wppm -ls pand") - parser.add_argument("-lsa", dest="all", action="store_true",help=f"list details of package names matching given regular expression: wppm -lsa pandas -l1") - parser.add_argument("-p",dest="pipdown",action="store_true",help="show Package dependencies of the given package[option]: wppm -p pandas[test]") - parser.add_argument("-r", dest="pipup", action="store_true", help=f"show Reverse dependancies of the given package[option]: wppm -r pytest[test]") - parser.add_argument("-l", "--levels", type=int, default=2, help="show 'LEVELS' levels of dependencies (with -p, -r), default is 2: wppm -p pandas -l1") - parser.add_argument("-t", "--target", default=sys.prefix, help=f'path to target Python distribution (default: "{sys.prefix}")') + parser.add_argument("-ws", dest="wheelsource", default=None, type=str, help="wheels location, '.' = WheelHouse): wppm pylock.toml -ws source_of_wheels, wppm -ls -ws .") + parser.add_argument("-wd", dest="wheeldrain" , default=None, type=str, help="wheels destination: wppm pylock.toml -wd destination_of_wheels") + parser.add_argument("-ls", "--list", action="store_true", help="list installed packages matching [optional] expression: wppm -ls, wppm -ls pand") + parser.add_argument("-lsa", dest="all", action="store_true",help=f"list details of packages matching [optional] expression: wppm -lsa pandas -l1") + parser.add_argument("-md", dest="markdown", action="store_true",help=f"markdown summary if the installation") + parser.add_argument("-p",dest="pipdown",action="store_true",help="show Package dependencies of the given package[option], [.]=all: wppm -p pandas[.]") + parser.add_argument("-r", dest="pipup", action="store_true", help=f"show Reverse wppmdependancies of the given package[option]: wppm -r pytest[test]") + parser.add_argument("-l", dest="levels", type=int, default=2, help="show 'LEVELS' levels of dependencies (with -p, -r), default is 2: wppm -p pandas -l1") + parser.add_argument("-t", dest="target", default=sys.prefix, help=f'path to target Python distribution (default: "{sys.prefix}")') parser.add_argument("-i", "--install", action="store_true", help="install a given package wheel or pylock file (use pip for more features)") parser.add_argument("-u", "--uninstall", action="store_true", help="uninstall package (use pip for more features)") @@ -290,6 +291,10 @@ def main(test=False): targetpython = None if args.target and args.target != sys.prefix: targetpython = args.target if args.target.lower().endswith('.exe') else str(Path(args.target) / 'python.exe') + if args.wheelsource == ".": # play in default WheelHouse + if utils.is_python_distribution(args.target): + dist = Distribution(args.target) + args.wheelsource = dist.wheelhouse / 'included.wheels' if args.install and args.uninstall: raise RuntimeError("Incompatible arguments: --install and --uninstall") if args.registerWinPython and args.unregisterWinPython: @@ -360,6 +365,9 @@ def main(test=False): if args.movable: p = subprocess.Popen(["start", "cmd", "/k",dist.python_exe, "-c" , cmd_mov], shell = True, cwd=dist.target) sys.exit() + if args.markdown: + print(dist.generate_package_index_markdown()) + sys.exit() if not args.install and not args.uninstall and args.fname.endswith(".toml"): args.install = True # for Drag & Drop of .toml (and not wheel) if args.fname == "" or (not args.install and not args.uninstall): From d4bf8a9a3bdd4901c9f295e223a8710f7533236f Mon Sep 17 00:00:00 2001 From: stonebig Date: Thu, 5 Jun 2025 21:25:17 +0200 Subject: [PATCH 231/305] move hash.py in winpython --- hash_launch.bat | 6 ++++-- hash.py => winpython/hash.py | 5 +++-- 2 files changed, 7 insertions(+), 4 deletions(-) rename hash.py => winpython/hash.py (96%) diff --git a/hash_launch.bat b/hash_launch.bat index 714925a4..623765d7 100644 --- a/hash_launch.bat +++ b/hash_launch.bat @@ -1,8 +1,10 @@ -call C:\WPy64-3890\scripts\env.bat +call C:\WinPdev\WPy64-310111\scripts\env.bat cd %~dp0 rem echo %date% %time%>>gdc_counting.txt -python hash.py %* >>hash_counting_%date:/=_%.txt +python -c "import sys;from winpython import hash; hash.print_hashes(sys.argv[1:])" %* >>hash_counting_%date:/=_%.txt +rem python hash.py %* >>hash_counting_%date:/=_%.txt start notepad.exe hash_counting_%date:/=_%.txt + \ No newline at end of file diff --git a/hash.py b/winpython/hash.py similarity index 96% rename from hash.py rename to winpython/hash.py index d16bff0a..e0bdd46a 100644 --- a/hash.py +++ b/winpython/hash.py @@ -1,6 +1,7 @@ # -*- coding: utf-8 -*- -# -# WinPython hash.py script +""" +hash.py: compute hash of given files into a markdown output +""" # Copyright © 2014-2025+ The Winpython development team https://github.com/winpython/ # Licensed under the terms of the MIT License # (see winpython/__init__.py for details) From b84ef841776325ef19ac186183ea93a174f6b4cb Mon Sep 17 00:00:00 2001 From: stonebig Date: Thu, 5 Jun 2025 23:48:48 +0200 Subject: [PATCH 232/305] taking gloves, as bitten per this dark art --- winpython/packagemetadata.py | 35 ++++++++++++----------------------- 1 file changed, 12 insertions(+), 23 deletions(-) diff --git a/winpython/packagemetadata.py b/winpython/packagemetadata.py index 4e2a4989..a51e8331 100644 --- a/winpython/packagemetadata.py +++ b/winpython/packagemetadata.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python3 +# -*- coding: utf-8 -*- """ packagemetadata.py - get metadata from designated place """ @@ -8,12 +8,11 @@ import zipfile import sys from pathlib import Path -from collections import defaultdict -import shutil -import subprocess from typing import Dict, List, Optional, Tuple from . import utils - +import importlib.metadata +import email +from packaging.utils import canonicalize_name # --- Abstract metadata accessor --- class PackageMetadata: @@ -28,11 +27,10 @@ def __init__(self, name, version, requires, summary, description, metadata): def get_installed_metadata(path = None) -> List[PackageMetadata]: # Use importlib.metadata or pkg_resources - import importlib.metadata pkgs = [] distro = importlib.metadata.distributions(path = path) if path else importlib.metadata.distributions() for dist in distro: - name = dist.metadata['Name'] + name = canonicalize_name(dist.metadata['Name']) version = dist.version summary = dist.metadata.get("Summary", ""), description = dist.metadata.get("Description", ""), @@ -56,7 +54,6 @@ def get_directory_metadata(directory: str) -> List[PackageMetadata]: return pkgs def extract_metadata_from_wheel(path: str) -> PackageMetadata: - import zipfile with zipfile.ZipFile(path) as zf: for name in zf.namelist(): if name.endswith(r'.dist-info/METADATA') and name.split("/")[1] == "METADATA": @@ -66,7 +63,6 @@ def extract_metadata_from_wheel(path: str) -> PackageMetadata: raise ValueError(f"No METADATA found in {path}") def extract_metadata_from_sdist(path: str) -> PackageMetadata: - import tarfile with tarfile.open(path, "r:gz") as tf: for member in tf.getmembers(): if member.name.endswith('PKG-INFO'): @@ -75,20 +71,13 @@ def extract_metadata_from_sdist(path: str) -> PackageMetadata: raise ValueError(f"No PKG-INFO found in {path}") def parse_metadata_file(txt: str) -> PackageMetadata: - name = version = summary = description = "" - requires = [] - description_lines = [] - in_description = False - for line in txt.splitlines(): - if line.startswith('Name: '): - name = line[6:].strip() - elif line.startswith('Version: '): - version = line[9:].strip() - elif line.startswith('Summary: '): - summary = description = line[9:].strip() - elif line.startswith('Requires-Dist: '): - requires.append(line[14:].strip()) - return PackageMetadata(name, version, requires, summary, description, {'Name': name, "Summary": summary, "Description": description}) + meta = email.message_from_string(txt) + name = canonicalize_name(meta.get('Name', '')) + version = meta.get('Version', '') + summary = meta.get('Summary', '') + description = meta.get('Description', '') + requires = meta.get_all('Requires-Dist') or [] + return PackageMetadata(name, version, requires, summary, description, dict(meta.items())) def main(): if len(sys.argv) > 1: From effb981f4e8250f06f1d5648bd0b3c8205f92a9a Mon Sep 17 00:00:00 2001 From: stonebig Date: Sat, 7 Jun 2025 11:37:57 +0200 Subject: [PATCH 233/305] slight refresh --- README.rst | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.rst b/README.rst index a5f445e9..9a1e05cf 100644 --- a/README.rst +++ b/README.rst @@ -19,7 +19,7 @@ This is the `winpython` Python package, not the distribution itself. It includes two main features: WinPython Package Manager (WPPM) - a complementary tool to navigate provided package list or register WinPython. + a complementary tool to navigate provided packages, install packages from included Wheelhouse, or register WinPython. pip is the recommanded way to add or remove packages WinPython build toolchain @@ -29,7 +29,7 @@ WinPython build toolchain Dependencies ------------ -* Python3 >= 3.9 +* Python3 >= 3.10 Requirements @@ -58,6 +58,6 @@ More informations * Downloads: https://sourceforge.net/projects/winpython/files/ or https://github.com/winpython/winpython/releases -* Development, bug reports and feature requests: https://github.com/winpython/winpython +* Development, bug reports, discussions and feature requests: https://github.com/winpython/winpython * Discussions: https://groups.google.com/group/winpython From 42f8e52f1b82d8b89ed2a634be829cdec0778327 Mon Sep 17 00:00:00 2001 From: stonebig Date: Sat, 7 Jun 2025 12:02:09 +0200 Subject: [PATCH 234/305] bug fix after changing markdown generation --- winpython/utils.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/winpython/utils.py b/winpython/utils.py index 2d549f20..0c83cb80 100644 --- a/winpython/utils.py +++ b/winpython/utils.py @@ -47,15 +47,15 @@ def get_installed_tools(path=None)-> str: tool_lines.append(("Python" ,f"http://www.python.org/", version, "Python programming language with standard library")) if (node_exe := python_exe.parent.parent / "n" / "node.exe").exists(): version = exec_shell_cmd(f'powershell (Get-Item {node_exe}).VersionInfo.FileVersion', node_exe.parent).splitlines()[0] - tool_lines.append("Nodejs", "https://nodejs.org", version, "a JavaScript runtime built on Chrome's V8 JavaScript engine") + tool_lines.append(("Nodejs", "https://nodejs.org", version, "a JavaScript runtime built on Chrome's V8 JavaScript engine")) if (pandoc_exe := python_exe.parent.parent / "t" / "pandoc.exe").exists(): version = exec_shell_cmd("pandoc -v", pandoc_exe.parent).splitlines()[0].split(" ")[-1] - tool_lines.append("Pandoc", "https://pandoc.org", version, "an universal document converter") + tool_lines.append(("Pandoc", "https://pandoc.org", version, "an universal document converter")) if (vscode_exe := python_exe.parent.parent / "t" / "VSCode" / "Code.exe").exists(): version = exec_shell_cmd(f'powershell (Get-Item {vscode_exe}).VersionInfo.FileVersion', vscode_exe.parent).splitlines()[0] - tool_lines.append("VSCode","https://code.visualstudio.com", version, "a source-code editor developed by Microsoft") + tool_lines.append(("VSCode","https://code.visualstudio.com", version, "a source-code editor developed by Microsoft")) return tool_lines def onerror(function, path, excinfo): From 0c010cf4f42cd511ce3d8060d47de809c3e37ad5 Mon Sep 17 00:00:00 2001 From: stonebig Date: Sat, 7 Jun 2025 12:24:30 +0200 Subject: [PATCH 235/305] allow to compare two markdown files directly --- winpython/diff.py | 56 ++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 51 insertions(+), 5 deletions(-) diff --git a/winpython/diff.py b/winpython/diff.py index a8e52e1d..2b059d9d 100644 --- a/winpython/diff.py +++ b/winpython/diff.py @@ -11,10 +11,11 @@ import re import shutil from packaging import version +import sys + from . import utils CHANGELOGS_DIR = Path(__file__).parent.parent / "changelogs" -assert CHANGELOGS_DIR.is_dir() class Package: PATTERNS = [ @@ -48,7 +49,7 @@ class PackageIndex: def __init__(self, version, searchdir=None, flavor="", architecture=64): self.version = version self.flavor = flavor - self.searchdir = searchdir + self.searchdir = Path(searchdir) if searchdir else CHANGELOGS_DIR self.architecture = architecture self.packages = {"tools": {}, "python": {}, "wheelhouse": {}} self._load_index() @@ -102,6 +103,10 @@ def find_previous_version(target_version, searchdir=None, flavor="", architectur return max(versions, key=version.parse, default=target_version) def compare_package_indexes(version2, version1=None, searchdir=None, flavor="", flavor1=None, architecture=64): + """Comparison by looking versions in a given Changelog directory""" + if not searchdir or (not Path(searchdir).is_dir() and not CHANGELOGS_DIR.is_dir()): + print(f"Error: changelogs directory {CHANGELOGS_DIR} does not exist.") + sys.exit(1) version1 = version1 or find_previous_version(version2, searchdir, flavor, architecture) flavor1 = flavor1 or flavor @@ -140,8 +145,49 @@ def write_changelog(version2, version1=None, searchdir=None, flavor="", architec f.write(changelog) # Copy to winpython/changelogs back to basedir if basedir: - shutil.copyfile(output_file, basedir / output_file.name) + shutil.copyfile(output_file, Path(basedir) / output_file.name) + +def compare_two_markdown_files(file1, file2): + """Compare two arbitrary markdown files with WinPython changelog format.""" + class DummyPackageIndex(PackageIndex): + def __init__(self, filename): + self.packages = {"tools": {}, "python": {}, "wheelhouse": {}} + self._load_index(filename) + + def _load_index(self, filename): + with open(filename, "r", encoding=utils.guess_encoding(filename)[0]) as f: + self._parse_index(f.read()) + + pi1 = DummyPackageIndex(Path(file1)) + pi2 = DummyPackageIndex(Path(file2)) + + text = f"## Differences between {file1} and {file2}\n\n
    \n\n" + for key in PackageIndex.HEADERS: + diff = compare_packages(pi1.packages[key], pi2.packages[key]) + if diff: + text += f"\n{PackageIndex.HEADERS[key]}\n\n{diff}" + return text + "\n
    \n\n* * *\n" + +def print_usage(): + print("Usage:") + print(" python diff.py file1.md file2.md") + print(" - Compare two markdown changelog files directly.") + print(" python diff.py [searchdir] [flavor] [architecture]") + print(" - Compare WinPython markdown changelogs by version.") if __name__ == "__main__": - print(compare_package_indexes("3.7.4.0", "3.7.2.0", r"C:\WinP\bd37\budot", "Zero", architecture=32)) - write_changelog("3.7.4.0", "3.7.2.0", r"C:\WinP\bd37\budot", "Ps2", architecture=64) + if len(sys.argv) == 3 and all(arg.lower().endswith('.md') for arg in sys.argv[1:]): + # Usage: python diff.py file1.md file2.md + file1, file2 = sys.argv[1], sys.argv[2] + print(compare_two_markdown_files(file1, file2)) + elif len(sys.argv) >= 3: + # Original usage (version comparison) + # Example: python diff.py 3.7.4.0 3.7.2.0 "C:\WinP\bd37\budot" "Zero" 32 + version2 = sys.argv[1] + version1 = sys.argv[2] + searchdir = Path(sys.argv[3]) if len(sys.argv) > 3 else CHANGELOGS_DIR + flavor = sys.argv[4] if len(sys.argv) > 4 else "" + architecture = int(sys.argv[5]) if len(sys.argv) > 5 else 64 + print(compare_package_indexes(version2, version1, searchdir, flavor, architecture=architecture)) + else: + print_usage() \ No newline at end of file From 81dabf7214f5c05b1a25e21b69186ae32ded11ef Mon Sep 17 00:00:00 2001 From: stonebig Date: Sat, 7 Jun 2025 19:09:57 +0200 Subject: [PATCH 236/305] allows diffing from history, files, strings, and mixed sections --- winpython/diff.py | 216 +++++++++++++++++++++++++--------------------- 1 file changed, 117 insertions(+), 99 deletions(-) diff --git a/winpython/diff.py b/winpython/diff.py index 2b059d9d..12671faf 100644 --- a/winpython/diff.py +++ b/winpython/diff.py @@ -1,18 +1,16 @@ # -*- coding: utf-8 -*- # -# WinPython diff.py script +# WinPython diff.py script (streamlined, with historical and flexible modes) # Copyright © 2013 Pierre Raybaut # Copyright © 2014-2025+ The Winpython development team https://github.com/winpython/ # Licensed under the terms of the MIT License -# (see winpython/__init__.py for details) import os -from pathlib import Path import re +import sys import shutil +from pathlib import Path from packaging import version -import sys - from . import utils CHANGELOGS_DIR = Path(__file__).parent.parent / "changelogs" @@ -22,12 +20,10 @@ class Package: r"\[([\w\-\:\/\.\_]+)\]\(([^)]+)\) \| ([^\|]*) \| ([^\|]*)", # SourceForge r"\[([\w\-\:\/\.\_]+) ([^\]\ ]+)\] \| ([^\|]*) \| ([^\|]*)" # Google Code ] - def __init__(self, text=None): self.name = self.url = self.version = self.description = None if text: self.from_text(text) - def from_text(self, text): for pattern in self.PATTERNS: match = re.match(pattern, text) @@ -36,31 +32,13 @@ def from_text(self, text): return raise ValueError(f"Unrecognized package line format: {text}") - def to_wiki(self): - return f" * [{self.name}]({self.url}) {self.version} ({self.description})\n" - - def upgrade_wiki(self, other): - return f" * [{self.name}]({self.url}) {other.version} → {self.version} ({self.description})\n" - class PackageIndex: HEADERS = {"tools": "### Tools", "python": "### Python packages", "wheelhouse": "### WheelHouse packages"} BLANKS = ["Name | Version | Description", "-----|---------|------------", "", "
    ", "
    "] - def __init__(self, version, searchdir=None, flavor="", architecture=64): - self.version = version - self.flavor = flavor - self.searchdir = Path(searchdir) if searchdir else CHANGELOGS_DIR - self.architecture = architecture - self.packages = {"tools": {}, "python": {}, "wheelhouse": {}} - self._load_index() - - def _load_index(self): - filename = self.searchdir / f"WinPython{self.flavor}-{self.architecture}bit-{self.version}.md" - if not filename.exists(): - raise FileNotFoundError(f"Changelog not found: {filename}") - - with open(filename, "r", encoding=utils.guess_encoding(filename)[0]) as f: - self._parse_index(f.read()) + def __init__(self, content): + self.packages = {k: {} for k in self.HEADERS} + self._parse_index(content) def _parse_index(self, text): current = None @@ -71,123 +49,163 @@ def _parse_index(self, text): if line.strip() in self.BLANKS: continue if current: - pkg = Package(line) - self.packages[current][pkg.name] = pkg + try: + pkg = Package(line) + self.packages[current][pkg.name] = pkg + except Exception: + continue def compare_packages(old, new): - """Return difference between package old and package new""" - - # wheel replace '-' per '_' in key def normalize(d): return {k.replace("-", "_").lower(): v for k, v in d.items()} old, new = normalize(old), normalize(new) + added = [new[k] for k in new if k not in old] + upgraded = [new[k] for k in new if k in old and new[k].version != old[k].version] + removed = [old[k] for k in old if k not in new] output = "" - - added = [new[k].to_wiki() for k in new if k not in old] - upgraded = [new[k].upgrade_wiki(old[k]) for k in new if k in old and new[k].version != old[k].version] - removed = [old[k].to_wiki() for k in old if k not in new] - if added: - output += "New packages:\n\n" + "".join(added) + "\n\n" + output += "\nNew packages:\n" + "".join(f" * {p.name} {p.version} ({p.description})\n" for p in added) if upgraded: - output += "Upgraded packages:\n\n" + "".join(upgraded) + "\n\n" + output += "\nUpgraded packages:\n" + "".join(f" * {p.name} {old[p.name].version} → {p.version} ({p.description})\n" for p in upgraded if p.name in old) if removed: - output += "Removed packages:\n\n" + "".join(removed) + "\n\n" - return output + output += "\nRemoved packages:\n" + "".join(f" * {p.name} {p.version} ({p.description})\n" for p in removed) + return output or "\nNo differences found.\n" + +def compare_markdown_sections(md1, md2, header1="python", header2="python", label1="Input1", label2="Input2"): + pkgs1 = PackageIndex(md1).packages + pkgs2 = PackageIndex(md2).packages + diff = compare_packages(pkgs1[header1], pkgs2[header2]) + # If comparing the same section, use the historical header + if header1 == header2 and header1 in PackageIndex.HEADERS: + title = PackageIndex.HEADERS[header1] + else: + title = f"## {label1} [{header1}] vs {label2} [{header2}]" + return f"{title}\n\n{diff}" + +def compare_markdown_section_pairs(md1, md2, header_pairs, label1="Input1", label2="Input2"): + pkgs1 = PackageIndex(md1).packages + pkgs2 = PackageIndex(md2).packages + text = f"# {label1} vs {label2} section-pairs comparison\n" + for h1, h2 in header_pairs: + diff = compare_packages(pkgs1[h1], pkgs2[h2]) + if diff.strip() and diff != "No differences found.\n": + text += f"\n## {label1} [{h1}] vs {label2} [{h2}]\n\n{diff}\n" + return text + +def compare_files(file1, file2, mode="full", header1=None, header2=None, header_pairs=None): + with open(file1, encoding=utils.guess_encoding(file1)[0]) as f1, \ + open(file2, encoding=utils.guess_encoding(file2)[0]) as f2: + md1, md2 = f1.read(), f2.read() + if mode == "full": + result = "" + for k in PackageIndex.HEADERS: + result += compare_markdown_sections(md1, md2, k, k, file1, file2) + "\n" + return result + elif mode == "section": + return compare_markdown_sections(md1, md2, header1, header2, file1, file2) + elif mode == "pairs": + return compare_markdown_section_pairs(md1, md2, header_pairs, file1, file2) + else: + raise ValueError("Unknown mode.") + +# --- ORIGINAL/HISTORICAL VERSION-TO-VERSION COMPARISON --- def find_previous_version(target_version, searchdir=None, flavor="", architecture=64): - """Find version which is the closest to `version`""" search_dir = Path(searchdir) if searchdir else CHANGELOGS_DIR pattern = re.compile(rf"WinPython{flavor}-{architecture}bit-([0-9\.]+)\.(txt|md)") versions = [pattern.match(f).group(1) for f in os.listdir(search_dir) if pattern.match(f)] versions = [v for v in versions if version.parse(v) < version.parse(target_version)] return max(versions, key=version.parse, default=target_version) +def load_version_markdown(version, searchdir, flavor="", architecture=64): + filename = Path(searchdir) / f"WinPython{flavor}-{architecture}bit-{version}.md" + if not filename.exists(): + raise FileNotFoundError(f"Changelog not found: {filename}") + with open(filename, "r", encoding=utils.guess_encoding(filename)[0]) as f: + return f.read() + def compare_package_indexes(version2, version1=None, searchdir=None, flavor="", flavor1=None, architecture=64): - """Comparison by looking versions in a given Changelog directory""" - if not searchdir or (not Path(searchdir).is_dir() and not CHANGELOGS_DIR.is_dir()): - print(f"Error: changelogs directory {CHANGELOGS_DIR} does not exist.") - sys.exit(1) + searchdir = Path(searchdir) if searchdir else CHANGELOGS_DIR version1 = version1 or find_previous_version(version2, searchdir, flavor, architecture) flavor1 = flavor1 or flavor - - pi1 = PackageIndex(version1, searchdir, flavor1, architecture) - pi2 = PackageIndex(version2, searchdir, flavor, architecture) - - text = ( + md1 = load_version_markdown(version1, searchdir, flavor1, architecture) + md2 = load_version_markdown(version2, searchdir, flavor, architecture) + result = f"# WinPython {architecture}bit {version2}{flavor} vs {version1}{flavor1}\n" + result = ( f"## History of changes for WinPython-{architecture}bit {version2 + flavor}\r\n\r\n" f"The following changes were made to WinPython-{architecture}bit distribution since version {version1 + flavor1}.\n\n\n" "
    \n\n" ) - - for key in PackageIndex.HEADERS: - diff = compare_packages(pi1.packages[key], pi2.packages[key]) - if diff: - text += f"\n{PackageIndex.HEADERS[key]}\n\n{diff}" - - return text + "\n
    \n\n* * *\n" + for k in PackageIndex.HEADERS: + result += compare_markdown_sections(md1, md2, k, k, version1, version2) + "\n" + return result+ "\n
    \n\n* * *\n" def copy_changelogs(version, searchdir, flavor="", architecture=64, basedir=None): - basever = ".".join(version.split(".")[:2]) + """Copy all changelogs for a major.minor version into basedir.""" + basever = ".".join(str(version).split(".")[:2]) pattern = re.compile(rf"WinPython{flavor}-{architecture}bit-{basever}[0-9\.]*\.(txt|md)") dest = Path(basedir) for fname in os.listdir(searchdir): if pattern.match(fname): - shutil.copyfile(searchdir / fname, dest / fname) + shutil.copyfile(Path(searchdir) / fname, dest / fname) def write_changelog(version2, version1=None, searchdir=None, flavor="", architecture=64, basedir=None): - """Write changelog between version1 and version2 of WinPython""" + """Write changelog between version1 and version2 of WinPython.""" + searchdir = Path(searchdir) if searchdir else CHANGELOGS_DIR if basedir: copy_changelogs(version2, searchdir, flavor, architecture, basedir) - print("comparing_package_indexes", version2, searchdir, flavor, architecture) changelog = compare_package_indexes(version2, version1, searchdir, flavor, architecture=architecture) output_file = searchdir / f"WinPython{flavor}-{architecture}bit-{version2}_History.md" with open(output_file, "w", encoding="utf-8") as f: f.write(changelog) - # Copy to winpython/changelogs back to basedir if basedir: shutil.copyfile(output_file, Path(basedir) / output_file.name) -def compare_two_markdown_files(file1, file2): - """Compare two arbitrary markdown files with WinPython changelog format.""" - class DummyPackageIndex(PackageIndex): - def __init__(self, filename): - self.packages = {"tools": {}, "python": {}, "wheelhouse": {}} - self._load_index(filename) - - def _load_index(self, filename): - with open(filename, "r", encoding=utils.guess_encoding(filename)[0]) as f: - self._parse_index(f.read()) - - pi1 = DummyPackageIndex(Path(file1)) - pi2 = DummyPackageIndex(Path(file2)) - - text = f"## Differences between {file1} and {file2}\n\n
    \n\n" - for key in PackageIndex.HEADERS: - diff = compare_packages(pi1.packages[key], pi2.packages[key]) - if diff: - text += f"\n{PackageIndex.HEADERS[key]}\n\n{diff}" - return text + "\n
    \n\n* * *\n" - def print_usage(): print("Usage:") print(" python diff.py file1.md file2.md") - print(" - Compare two markdown changelog files directly.") + print(" - Compare all sections of two markdown files.") + print(" python diff.py file1.md file2.md --section header1 header2") + print(" - Compare section 'header1' of file1 with section 'header2' of file2.") + print(" python diff.py file1.md file2.md --pairs header1a header2a [header1b header2b ...]") + print(" - Compare pairs of sections. Example: python diff.py f1.md f2.md --pairs python wheelhouse tools tools") print(" python diff.py [searchdir] [flavor] [architecture]") - print(" - Compare WinPython markdown changelogs by version.") + print(" - Compare WinPython markdown changelogs by version (historical mode).") + print(" python diff.py --write-changelog [searchdir] [flavor] [architecture] [basedir]") + print(" - Write changelog between version1 and version2 to file (and optionally copy to basedir).") if __name__ == "__main__": - if len(sys.argv) == 3 and all(arg.lower().endswith('.md') for arg in sys.argv[1:]): - # Usage: python diff.py file1.md file2.md - file1, file2 = sys.argv[1], sys.argv[2] - print(compare_two_markdown_files(file1, file2)) - elif len(sys.argv) >= 3: - # Original usage (version comparison) - # Example: python diff.py 3.7.4.0 3.7.2.0 "C:\WinP\bd37\budot" "Zero" 32 - version2 = sys.argv[1] - version1 = sys.argv[2] - searchdir = Path(sys.argv[3]) if len(sys.argv) > 3 else CHANGELOGS_DIR - flavor = sys.argv[4] if len(sys.argv) > 4 else "" - architecture = int(sys.argv[5]) if len(sys.argv) > 5 else 64 + args = sys.argv + if len(args) >= 3 and all(arg.lower().endswith('.md') for arg in args[1:3]): + file1, file2 = args[1], args[2] + if len(args) == 3: + print(compare_files(file1, file2)) + elif args[3] == "--section" and len(args) >= 6: + h1, h2 = args[4], args[5] + print(compare_files(file1, file2, mode="section", header1=h1, header2=h2)) + elif args[3] == "--pairs" and len(args) > 4 and len(args[4:]) % 2 == 0: + pairs = list(zip(args[4::2], args[5::2])) + print(compare_files(file1, file2, mode="pairs", header_pairs=pairs)) + else: + print_usage() + elif len(args) >= 2 and args[1] == "--write-changelog": + # Usage: --write-changelog [searchdir] [flavor] [architecture] [basedir] + if len(args) < 4: + print_usage() + sys.exit(1) + version2 = args[2] + version1 = args[3] + searchdir = args[4] if len(args) > 4 else CHANGELOGS_DIR + flavor = args[5] if len(args) > 5 else "" + architecture = int(args[6]) if len(args) > 6 else 64 + basedir = args[7] if len(args) > 7 else None + write_changelog(version2, version1, searchdir, flavor, architecture, basedir) + print(f"Changelog written for {version2} vs {version1}.") + elif len(args) >= 3: + version2 = args[1] + version1 = args[2] if len(args) > 2 and not args[2].endswith('.md') else None + searchdir = args[3] if len(args) > 3 else CHANGELOGS_DIR + flavor = args[4] if len(args) > 4 else "" + architecture = int(args[5]) if len(args) > 5 else 64 print(compare_package_indexes(version2, version1, searchdir, flavor, architecture=architecture)) else: print_usage() \ No newline at end of file From cb85466e4d46d45e5af9551db5950538c62bd3ac Mon Sep 17 00:00:00 2001 From: stonebig Date: Sat, 7 Jun 2025 20:25:39 +0200 Subject: [PATCH 237/305] wppm -md -ws . will compare Installed package to WheelHouse packages --- winpython/wppm.py | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/winpython/wppm.py b/winpython/wppm.py index 01ed2c83..60f1c692 100644 --- a/winpython/wppm.py +++ b/winpython/wppm.py @@ -14,7 +14,7 @@ import json from pathlib import Path from argparse import ArgumentParser, RawTextHelpFormatter -from . import utils, piptree, associate +from . import utils, piptree, associate, diff from . import wheelhouse as wh from operator import itemgetter # Workaround for installing PyVISA on Windows from source: @@ -80,10 +80,10 @@ def render_markdown_for_list(self, title, items): return md def generate_package_index_markdown(self, python_executable_directory: str|None = None, winpyver2: str|None = None, - flavor: str|None = None, architecture_bits: int|None = None, release_level: str|None = None) -> str: + flavor: str|None = None, architecture_bits: int|None = None + , release_level: str|None = None, wheeldir: str|None = None) -> str: """Generates a Markdown formatted package index page.""" my_ver , my_arch = utils.get_python_infos(python_executable_directory or self.target) - # suppose we suite ourself (method will vary over time) my_winpyver2 = winpyver2 or os.getenv("WINPYVER2","") my_winpyver2 = my_winpyver2 if my_winpyver2 != "" else my_ver my_flavor = flavor or os.getenv("WINPYFLAVOR", "") @@ -92,10 +92,10 @@ def generate_package_index_markdown(self, python_executable_directory: str|None tools_list = utils.get_installed_tools(utils.get_python_executable(python_executable_directory)) package_list = [(pkg.name, pkg.url, pkg.version, pkg.description) for pkg in self.get_installed_packages()] wheelhouse_list = [] - wheeldir = self.wheelhouse / 'included.wheels' - if wheeldir.is_dir(): + my_wheeldir = Path(wheeldir) if wheeldir else self.wheelhouse / 'included.wheels' + if my_wheeldir.is_dir(): wheelhouse_list = [(name, f"https://pypi.org/project/{name}", version, summary) - for name, version, summary in wh.list_packages_with_metadata(str(wheeldir)) ] + for name, version, summary in wh.list_packages_with_metadata(str(my_wheeldir)) ] return f"""## WinPython {my_winpyver2 + my_flavor} @@ -366,7 +366,12 @@ def main(test=False): p = subprocess.Popen(["start", "cmd", "/k",dist.python_exe, "-c" , cmd_mov], shell = True, cwd=dist.target) sys.exit() if args.markdown: - print(dist.generate_package_index_markdown()) + default = dist.generate_package_index_markdown() + if args.wheelsource: + compare = dist.generate_package_index_markdown(wheeldir = args.wheelsource) + print(diff.compare_markdown_sections(default, compare,'python', 'wheelhouse', 'installed', 'wheelhouse')) + else: + print(default) sys.exit() if not args.install and not args.uninstall and args.fname.endswith(".toml"): args.install = True # for Drag & Drop of .toml (and not wheel) From 25ca4cfc6f7284b5aa78d86f96f158b42c6da6e6 Mon Sep 17 00:00:00 2001 From: stonebig Date: Sat, 7 Jun 2025 20:29:09 +0200 Subject: [PATCH 238/305] wppm support multiple packages install, list or navigation --- winpython/wppm.py | 77 ++++++++++++++++++++++++----------------------- 1 file changed, 40 insertions(+), 37 deletions(-) diff --git a/winpython/wppm.py b/winpython/wppm.py index 60f1c692..308030ce 100644 --- a/winpython/wppm.py +++ b/winpython/wppm.py @@ -184,7 +184,7 @@ def patch_standard_packages(self, package_name="", to_movable=True): # create movable launchers for previous package installations self.patch_all_shebang(to_movable=to_movable) if package_name.lower() in ("", "spyder"): - # spyder don't goes on internet without I ask + # spyder don't goes on internet without you ask utils.patch_sourcefile( Path(self.target) / "lib" / "site-packages" / "spyder" / "config" / "main.py", "'check_updates_on_startup': True,", @@ -266,19 +266,17 @@ def main(test=False): description="WinPython Package Manager: handle a WinPython Distribution and its packages", formatter_class=RawTextHelpFormatter, ) - parser.add_argument("fname", metavar="package or lockfile", nargs="?", default="", type=str, help="optional package name or package wheel") + parser.add_argument("fname", metavar="package(s) or lockfile", nargs="*", default=[""], type=str, help="optional package names, wheels, or lockfile") parser.add_argument("-v", "--verbose", action="store_true", help="show more details on packages and actions") parser.add_argument( "--register", dest="registerWinPython", action="store_true", help=registerWinPythonHelp) - # parser.add_argument( "--register_forall", action="store_true", help="Register distribution for all users") parser.add_argument("--unregister", dest="unregisterWinPython", action="store_true", help=unregisterWinPythonHelp) - # parser.add_argument( "--unregister_forall", action="store_true", help="un-Register distribution for all users") parser.add_argument("--fix", action="store_true", help="make WinPython fix") parser.add_argument("--movable", action="store_true", help="make WinPython movable") parser.add_argument("-ws", dest="wheelsource", default=None, type=str, help="wheels location, '.' = WheelHouse): wppm pylock.toml -ws source_of_wheels, wppm -ls -ws .") parser.add_argument("-wd", dest="wheeldrain" , default=None, type=str, help="wheels destination: wppm pylock.toml -wd destination_of_wheels") parser.add_argument("-ls", "--list", action="store_true", help="list installed packages matching [optional] expression: wppm -ls, wppm -ls pand") parser.add_argument("-lsa", dest="all", action="store_true",help=f"list details of packages matching [optional] expression: wppm -lsa pandas -l1") - parser.add_argument("-md", dest="markdown", action="store_true",help=f"markdown summary if the installation") + parser.add_argument("-md", dest="markdown", action="store_true",help=f"markdown summary of the installation") parser.add_argument("-p",dest="pipdown",action="store_true",help="show Package dependencies of the given package[option], [.]=all: wppm -p pandas[.]") parser.add_argument("-r", dest="pipup", action="store_true", help=f"show Reverse wppmdependancies of the given package[option]: wppm -r pytest[test]") parser.add_argument("-l", dest="levels", type=int, default=2, help="show 'LEVELS' levels of dependencies (with -p, -r), default is 2: wppm -p pandas -l1") @@ -286,7 +284,6 @@ def main(test=False): parser.add_argument("-i", "--install", action="store_true", help="install a given package wheel or pylock file (use pip for more features)") parser.add_argument("-u", "--uninstall", action="store_true", help="uninstall package (use pip for more features)") - args = parser.parse_args() targetpython = None if args.target and args.target != sys.prefix: @@ -301,17 +298,22 @@ def main(test=False): raise RuntimeError("Incompatible arguments: --install and --uninstall") if args.pipdown: pip = piptree.PipData(targetpython, args.wheelsource) - pack, extra, *other = (args.fname + "[").replace("]", "[").split("[") - print(pip.down(pack, extra, args.levels, verbose=args.verbose)) + for args_fname in args.fname: + pack, extra, *other = (args_fname + "[").replace("]", "[").split("[") + print(pip.down(pack, extra, args.levels, verbose=args.verbose)) sys.exit() elif args.pipup: pip = piptree.PipData(targetpython, args.wheelsource) - pack, extra, *other = (args.fname + "[").replace("]", "[").split("[") - print(pip.up(pack, extra, args.levels, verbose=args.verbose)) + for args_fname in args.fname: + pack, extra, *other = (args_fname + "[").replace("]", "[").split("[") + print(pip.up(pack, extra, args.levels, verbose=args.verbose)) sys.exit() elif args.list: pip = piptree.PipData(targetpython, args.wheelsource) - todo = [l for l in pip.pip_list(full=True) if bool(re.search(args.fname, l[0]))] + todo= [] + for args_fname in args.fname: + todo += [l for l in pip.pip_list(full=True) if bool(re.search(args_fname, l[0]))] + todo = sorted(set(todo)) #, key=lambda p: (p[0].lower(), p[2]) titles = [['Package', 'Version', 'Summary'], ['_' * max(x, 6) for x in utils.columns_width(todo)]] listed = utils.formatted_list(titles + todo, max_width=70) for p in listed: @@ -319,17 +321,17 @@ def main(test=False): sys.exit() elif args.all: pip = piptree.PipData(targetpython, args.wheelsource) - todo = [l for l in pip.pip_list(full=True) if bool(re.search(args.fname, l[0]))] - for l in todo: - # print(pip.distro[l[0]]) - title = f"** Package: {l[0]} **" - print("\n" + "*" * len(title), f"\n{title}", "\n" + "*" * len(title)) - for key, value in pip.raw[l[0]].items(): - rawtext = json.dumps(value, indent=2, ensure_ascii=False) - lines = [l for l in rawtext.split(r"\n") if len(l.strip()) > 2] - if key.lower() != 'description' or args.verbose: - print(f"{key}: ", "\n".join(lines).replace('"', "")) - sys.exit() + for args_fname in args.fname: + todo = [l for l in pip.pip_list(full=True) if bool(re.search(args_fname, l[0]))] + for l in sorted(set(todo)): + title = f"** Package: {l[0]} **" + print("\n" + "*" * len(title), f"\n{title}", "\n" + "*" * len(title)) + for key, value in pip.raw[l[0]].items(): + rawtext = json.dumps(value, indent=2, ensure_ascii=False) + lines = [l for l in rawtext.split(r"\n") if len(l.strip()) > 2] + if key.lower() != 'description' or args.verbose: + print(f"{key}: ", "\n".join(lines).replace('"', "")) + sys.exit() if args.registerWinPython: print(registerWinPythonHelp) if utils.is_python_distribution(args.target): @@ -373,26 +375,27 @@ def main(test=False): else: print(default) sys.exit() - if not args.install and not args.uninstall and args.fname.endswith(".toml"): + if not args.install and not args.uninstall and args.fname[0].endswith(".toml"): args.install = True # for Drag & Drop of .toml (and not wheel) - if args.fname == "" or (not args.install and not args.uninstall): + if args.fname[0] == "" or (not args.install and not args.uninstall): parser.print_help() sys.exit() else: try: - filename = Path(args.fname).name - install_from_wheelhouse = ["--no-index", "--trusted-host=None", f"--find-links={dist.wheelhouse / 'included.wheels'}"] - if filename.split('.')[0] == "pylock" and filename.split('.')[-1] == 'toml': - print(' a lock file !', args.fname, dist.target) - wh.get_pylock_wheels(dist.wheelhouse, Path(args.fname), args.wheelsource, args.wheeldrain) - sys.exit() - if args.uninstall: - package = dist.find_package(args.fname) - dist.uninstall(package) - elif args.install: - package = Package(args.fname) - if args.install: - dist.install(package, install_options=install_from_wheelhouse) + for args_fname in args.fname: + filename = Path(args_fname).name + install_from_wheelhouse = ["--no-index", "--trusted-host=None", f"--find-links={dist.wheelhouse / 'included.wheels'}"] + if filename.split('.')[0] == "pylock" and filename.split('.')[-1] == 'toml': + print(' a lock file !', args_fname, dist.target) + wh.get_pylock_wheels(dist.wheelhouse, Path(args_fname), args.wheelsource, args.wheeldrain) + sys.exit() + if args.uninstall: + package = dist.find_package(args_fname) + dist.uninstall(package) + elif args.install: + package = Package(args_fname) + if args.install: + dist.install(package, install_options=install_from_wheelhouse) except NotImplementedError: raise RuntimeError("Package is not (yet) supported by WPPM") else: From 04b1b2cff3cb2277409b156174a6d7fd4d730535 Mon Sep 17 00:00:00 2001 From: stonebig Date: Wed, 11 Jun 2025 20:14:50 +0200 Subject: [PATCH 239/305] summarize launchers categories --- portable/build_my_launchers.bat | 21 +++++++++++++-------- winpython/__init__.py | 2 +- winpython/piptree.py | 2 +- 3 files changed, 15 insertions(+), 10 deletions(-) diff --git a/portable/build_my_launchers.bat b/portable/build_my_launchers.bat index 579a96e6..2585eb5c 100644 --- a/portable/build_my_launchers.bat +++ b/portable/build_my_launchers.bat @@ -9,24 +9,29 @@ rem pick the right ones and rename them in launchers_final set do_launcher=%~dp0launchers_src\build_one_launcher.bat set do_launcher_original=%~dp0launchers_src_original\build_one_launcher.bat -::WINDOWS launchers -rem call %do_launcher% "python.ico" "winidle.bat" "IDLE (Python GUI)" WINDOWS proposed echo displace this pause if you want to re-build more pause rem exit -call %do_launcher% "powershell.ico" "cmd_ps.bat" "WinPython Powershell Prompt" WINDOWS proposed +:: WINDOWS launchers with Drag & Drop +call %do_launcher% "python.ico" "winidle.bat" "IDLE (Python GUI)" WINDOWS proposed call %do_launcher% "spyder.ico" "winspyder.bat" "Spyder" WINDOWS proposed -call %do_launcher% "spyder_reset.ico" "spyder_reset.bat" "Spyder reset" WINDOWS proposed -call %do_launcher% "code.ico" "winvscode.bat" "VS Code" WINDOWS proposed -:: CONSOLE launchers -call %do_launcher% "cmd.ico" "cmd.bat" "WinPython Command Prompt" CONSOLE proposed -call %do_launcher% "python.ico" "winpython.bat" "WinPython Interpreter" CONSOLE proposed +:: CONSOLE launchers with Drag & Drop call %do_launcher% "jupyter.ico" "winipython_notebook.bat" "Jupyter Notebook" CONSOLE proposed call %do_launcher% "jupyter.ico" "winjupyter_lab.bat" "Jupyter Lab" CONSOLE proposed call %do_launcher% "winpython.ico" "wpcp.bat" "WinPython Control Panel" CONSOLE proposed + +:: WINDOWS launchers with no Drag & Drop +call %do_launcher_original% "powershell.ico" "cmd_ps.bat" "WinPython Powershell Prompt" WINDOWS proposed +call %do_launcher_original% "spyder_reset.ico" "spyder_reset.bat" "Spyder reset" WINDOWS proposed +call %do_launcher_original% "code.ico" "winvscode.bat" "VS Code" WINDOWS proposed + +:: CONSOLE launchers with no Drag & Drop +call %do_launcher_original% "cmd.ico" "cmd.bat" "WinPython Command Prompt" CONSOLE proposed +call %do_launcher_original% "python.ico" "winpython.bat" "WinPython Interpreter" CONSOLE proposed + pause diff --git a/winpython/__init__.py b/winpython/__init__.py index 468eed57..d169819a 100644 --- a/winpython/__init__.py +++ b/winpython/__init__.py @@ -28,6 +28,6 @@ OTHER DEALINGS IN THE SOFTWARE. """ -__version__ = '16.4.20250603' +__version__ = '16.5.20250608' __license__ = __doc__ __project_url__ = 'http://winpython.github.io/' diff --git a/winpython/piptree.py b/winpython/piptree.py index e46bd465..1c61501e 100644 --- a/winpython/piptree.py +++ b/winpython/piptree.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- """ -Enhanced script to inspect and display Python package dependencies, +piptree.py: inspect and display Python package dependencies, supporting both downward and upward dependency trees. Requires Python 3.8+ due to importlib.metadata. """ From 77a2fe05f4b14976cdb264e19f3fd39eaec33e9c Mon Sep 17 00:00:00 2001 From: stonebig Date: Wed, 11 Jun 2025 20:39:13 +0200 Subject: [PATCH 240/305] tweak output of build --- generate_a_winpython_distro.bat | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/generate_a_winpython_distro.bat b/generate_a_winpython_distro.bat index e9c73d9a..cbb74682 100644 --- a/generate_a_winpython_distro.bat +++ b/generate_a_winpython_distro.bat @@ -162,7 +162,7 @@ set req_lock_local=%LOCKDIR%requirement.%my_flavor%-%WINPYARCH%bit-%WINPYVERLOCK set pip_lock_web=%LOCKDIR%pylock.%WINPYARCH%-%WINPYVERLOCK%%my_flavor%%my_release_level%.toml set pip_lock_local=%LOCKDIR%pylock.%WINPYARCH%-%WINPYVERLOCK%%my_flavor%%my_release_level%_local.toml set req_lock_web=%LOCKDIR%requirement.%WINPYARCH%-%WINPYVERLOCK%%my_flavor%%my_release_level%.txt -set req_lock_local=%LOCKDIR%requirement.%WINPYARCH%-%WINPYVERLOCK%%my_flavor%_local.txt +set req_lock_local=%LOCKDIR%requirement.%WINPYARCH%-%WINPYVERLOCK%%my_flavor%%my_release_level%_local.txt set my_archive_lockfile=%my_archive_dir%\pylock.%my_flavor%-%WINPYARCH%bit-%WINPYVERLOCK%_%date:/=-%at_%my_time%.toml From 11e984e7b6ea61ede870625a55a723537e0cc6dc Mon Sep 17 00:00:00 2001 From: stonebig Date: Sat, 14 Jun 2025 20:22:56 +0200 Subject: [PATCH 241/305] ensure a closer match between wppm -md and make.py markdowns --- winpython/__init__.py | 2 +- winpython/wppm.py | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/winpython/__init__.py b/winpython/__init__.py index d169819a..0fe7dcc2 100644 --- a/winpython/__init__.py +++ b/winpython/__init__.py @@ -28,6 +28,6 @@ OTHER DEALINGS IN THE SOFTWARE. """ -__version__ = '16.5.20250608' +__version__ = '16.5.20250614' __license__ = __doc__ __project_url__ = 'http://winpython.github.io/' diff --git a/winpython/wppm.py b/winpython/wppm.py index 308030ce..59f14ff8 100644 --- a/winpython/wppm.py +++ b/winpython/wppm.py @@ -75,7 +75,7 @@ def render_markdown_for_list(self, title, items): md += "Name | Version | Description\n" md += "-----|---------|------------\n" for name, url, version, summary in sorted(items, key=lambda p: (p[0].lower(), p[2])): - md += f"[{name}]({url}) | {version} | {summary} \n" + md += f"[{name}]({url}) | {version} | {summary}\n" md += "\n" return md @@ -94,7 +94,7 @@ def generate_package_index_markdown(self, python_executable_directory: str|None wheelhouse_list = [] my_wheeldir = Path(wheeldir) if wheeldir else self.wheelhouse / 'included.wheels' if my_wheeldir.is_dir(): - wheelhouse_list = [(name, f"https://pypi.org/project/{name}", version, summary) + wheelhouse_list = [(name, f"https://pypi.org/project/{name}", version, utils.sum_up(summary)) for name, version, summary in wh.list_packages_with_metadata(str(my_wheeldir)) ] return f"""## WinPython {my_winpyver2 + my_flavor} From cbe3bbd99115f14e0e9124afbcdd88d28f0ea8aa Mon Sep 17 00:00:00 2001 From: stonebig Date: Fri, 20 Jun 2025 19:32:29 +0200 Subject: [PATCH 242/305] simplify constraints hunting --- winpython/__init__.py | 2 +- winpython/piptree.py | 16 ++++++++++------ winpython/wppm.py | 8 ++++---- 3 files changed, 15 insertions(+), 11 deletions(-) diff --git a/winpython/__init__.py b/winpython/__init__.py index 0fe7dcc2..b6c1d768 100644 --- a/winpython/__init__.py +++ b/winpython/__init__.py @@ -28,6 +28,6 @@ OTHER DEALINGS IN THE SOFTWARE. """ -__version__ = '16.5.20250614' +__version__ = '16.6.20250620' __license__ = __doc__ __project_url__ = 'http://winpython.github.io/' diff --git a/winpython/piptree.py b/winpython/piptree.py index 1c61501e..970f4edf 100644 --- a/winpython/piptree.py +++ b/winpython/piptree.py @@ -197,10 +197,12 @@ def _get_dependency_tree(self, package_name: str, extra: str = "", version_req: extra + ',' in dependency["req_extra"] + ',' and \ Marker(dependency["req_marker"]).evaluate(environment=environment | {"extra": up_req})): # IA risk error: # dask[array] go upwards as dask[dataframe], so {"extra": up_req} , not {"extra": extra} + #tag downward limiting dependancies + wall = " " if dependency["req_version"].startswith("<") or dependency["req_version"].startswith("==") else "" ret += self._get_dependency_tree( dependency["req_key"], up_req, - f"[requires: {package_name}" + f"[requires{wall}: {package_name}" + (f"[{dependency['req_extra']}]" if dependency["req_extra"] != "" else "") + f'{dependency["req_version"]}]', depth, @@ -242,16 +244,18 @@ def down(self, pp: str = "", extra: str = "", depth: int = 20, indent: int = 5, lines = [l for l in rawtext.split("\n") if len(l.strip()) > 2] return "\n".join(lines).replace('"', "") - def up(self, pp: str, extra: str = "", depth: int = 20, indent: int = 5, version_req: str = "", verbose: bool = False) -> str: + def up(self, ppw: str, extra: str = "", depth: int = 20, indent: int = 5, version_req: str = "", verbose: bool = False) -> str: """Generate upward dependency tree as formatted string.""" + pp = ppw[:-1] if ppw.endswith('!') else ppw + ppend = "!" if ppw.endswith('!') else "" #show only downward limiting dependancies if pp == ".": - results = [self.up(p, extra, depth, indent, version_req, verbose) for p in sorted(self.distro)] + results = [self.up(p + ppend, extra, depth, indent, version_req, verbose) for p in sorted(self.distro)] return '\n'.join(filter(None, results)) if extra == ".": if pp in self.distro: extras = set(self.distro[pp]["provided"]).union(set(self.distro[pp]["provides"])) - results = [self.up(pp, e, depth, indent, version_req, verbose=verbose) for e in sorted(extras)] + results = [self.up(pp + ppend, e, depth, indent, version_req, verbose=verbose) for e in sorted(extras)] return '\n'.join(filter(None, results)) return "" @@ -259,8 +263,8 @@ def up(self, pp: str, extra: str = "", depth: int = 20, indent: int = 5, version return "" rawtext = json.dumps(self._get_dependency_tree(pp, extra, version_req, depth, verbose=verbose, upward=True), indent=indent) - lines = [l for l in rawtext.split("\n") if len(l.strip()) > 2] - return "\n".join(filter(None, lines)).replace('"', "") + lines = [l for l in rawtext.split("\n") if len(l.strip()) > 2 and ( ppend=="" or not "[requires:" in l)] + return "\n".join(filter(None, lines)).replace('"', "").replace('[requires :', '[requires:') def description(self, pp: str) -> None: """Return package description or None if not found.""" diff --git a/winpython/wppm.py b/winpython/wppm.py index 59f14ff8..77a937ac 100644 --- a/winpython/wppm.py +++ b/winpython/wppm.py @@ -278,8 +278,8 @@ def main(test=False): parser.add_argument("-lsa", dest="all", action="store_true",help=f"list details of packages matching [optional] expression: wppm -lsa pandas -l1") parser.add_argument("-md", dest="markdown", action="store_true",help=f"markdown summary of the installation") parser.add_argument("-p",dest="pipdown",action="store_true",help="show Package dependencies of the given package[option], [.]=all: wppm -p pandas[.]") - parser.add_argument("-r", dest="pipup", action="store_true", help=f"show Reverse wppmdependancies of the given package[option]: wppm -r pytest[test]") - parser.add_argument("-l", dest="levels", type=int, default=2, help="show 'LEVELS' levels of dependencies (with -p, -r), default is 2: wppm -p pandas -l1") + parser.add_argument("-r", dest="pipup", action="store_true", help=f"show Reverse (!= constraining) dependancies of the given package[option]: wppm -r pytest![test]") + parser.add_argument("-l", dest="levels", type=int, default=-1, help="show 'LEVELS' levels of dependencies (with -p, -r): wppm -p pandas -l1") parser.add_argument("-t", dest="target", default=sys.prefix, help=f'path to target Python distribution (default: "{sys.prefix}")') parser.add_argument("-i", "--install", action="store_true", help="install a given package wheel or pylock file (use pip for more features)") parser.add_argument("-u", "--uninstall", action="store_true", help="uninstall package (use pip for more features)") @@ -300,13 +300,13 @@ def main(test=False): pip = piptree.PipData(targetpython, args.wheelsource) for args_fname in args.fname: pack, extra, *other = (args_fname + "[").replace("]", "[").split("[") - print(pip.down(pack, extra, args.levels, verbose=args.verbose)) + print(pip.down(pack, extra, args.levels if args.levels>0 else 2, verbose=args.verbose)) sys.exit() elif args.pipup: pip = piptree.PipData(targetpython, args.wheelsource) for args_fname in args.fname: pack, extra, *other = (args_fname + "[").replace("]", "[").split("[") - print(pip.up(pack, extra, args.levels, verbose=args.verbose)) + print(pip.up(pack, extra, args.levels if args.levels>=0 else 1, verbose=args.verbose)) sys.exit() elif args.list: pip = piptree.PipData(targetpython, args.wheelsource) From ddd15c5fdfe475d66f5f1287e7fb95218d2551fc Mon Sep 17 00:00:00 2001 From: stonebig Date: Sat, 21 Jun 2025 12:12:48 +0200 Subject: [PATCH 243/305] include "~" as a contraining factor and hides internals leak --- winpython/piptree.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/winpython/piptree.py b/winpython/piptree.py index 970f4edf..11700945 100644 --- a/winpython/piptree.py +++ b/winpython/piptree.py @@ -198,7 +198,7 @@ def _get_dependency_tree(self, package_name: str, extra: str = "", version_req: Marker(dependency["req_marker"]).evaluate(environment=environment | {"extra": up_req})): # IA risk error: # dask[array] go upwards as dask[dataframe], so {"extra": up_req} , not {"extra": extra} #tag downward limiting dependancies - wall = " " if dependency["req_version"].startswith("<") or dependency["req_version"].startswith("==") else "" + wall = " " if dependency["req_version"][:1] in("<", "~") or dependency["req_version"].startswith("==") else "" ret += self._get_dependency_tree( dependency["req_key"], up_req, @@ -249,7 +249,7 @@ def up(self, ppw: str, extra: str = "", depth: int = 20, indent: int = 5, versio pp = ppw[:-1] if ppw.endswith('!') else ppw ppend = "!" if ppw.endswith('!') else "" #show only downward limiting dependancies if pp == ".": - results = [self.up(p + ppend, extra, depth, indent, version_req, verbose) for p in sorted(self.distro)] + results = [aa:=self.up(p + ppend, extra, depth, indent, version_req, verbose) if '[requires :' in aa else None for p in sorted(self.distro)] return '\n'.join(filter(None, results)) if extra == ".": From af2bbae14693315e8819f44bb8f25782e3655826 Mon Sep 17 00:00:00 2001 From: stonebig Date: Sun, 22 Jun 2025 09:08:05 +0200 Subject: [PATCH 244/305] tweak launcher creation --- portable/launchers_src/build_one_launcher.bat | 3 ++- portable/launchers_src_original/build_one_launcher.bat | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/portable/launchers_src/build_one_launcher.bat b/portable/launchers_src/build_one_launcher.bat index 233f68de..c48374c4 100644 --- a/portable/launchers_src/build_one_launcher.bat +++ b/portable/launchers_src/build_one_launcher.bat @@ -3,6 +3,7 @@ set icon_name=%1 set LAUNCH_TARGET=%2 set launcher_name=%3 set subsystem=%4 +set destination=%5 set icon_name=%icon_name:"=% set LAUNCH_TARGET=%LAUNCH_TARGET:"=% @@ -12,7 +13,7 @@ set subsystem=%subsystem:"=% set ROOT_PATH=%~dp0..\ set SCRIPT_PATH=%~dp0 set TEMPO_PATH=%ROOT_PATH%launchers_temp -set OUTPUT_DIR=%ROOT_PATH%launchers_final +set OUTPUT_DIR=%ROOT_PATH%launchers_%destination% set "ICON_FILE=%ROOT_PATH%icons\%icon_name%" set LAUNCHER_EXE=%OUTPUT_DIR%\%launcher_name%.exe diff --git a/portable/launchers_src_original/build_one_launcher.bat b/portable/launchers_src_original/build_one_launcher.bat index 233f68de..c48374c4 100644 --- a/portable/launchers_src_original/build_one_launcher.bat +++ b/portable/launchers_src_original/build_one_launcher.bat @@ -3,6 +3,7 @@ set icon_name=%1 set LAUNCH_TARGET=%2 set launcher_name=%3 set subsystem=%4 +set destination=%5 set icon_name=%icon_name:"=% set LAUNCH_TARGET=%LAUNCH_TARGET:"=% @@ -12,7 +13,7 @@ set subsystem=%subsystem:"=% set ROOT_PATH=%~dp0..\ set SCRIPT_PATH=%~dp0 set TEMPO_PATH=%ROOT_PATH%launchers_temp -set OUTPUT_DIR=%ROOT_PATH%launchers_final +set OUTPUT_DIR=%ROOT_PATH%launchers_%destination% set "ICON_FILE=%ROOT_PATH%icons\%icon_name%" set LAUNCHER_EXE=%OUTPUT_DIR%\%launcher_name%.exe From 4e60831885873b0465e15caab9d678e17dc0c6ec Mon Sep 17 00:00:00 2001 From: nevsal <81089868+nevsal@users.noreply.github.com> Date: Tue, 24 Jun 2025 08:37:23 +0200 Subject: [PATCH 245/305] Remove console colorization from WinPython_PS_Prompt.ps1 --- portable/scripts/WinPython_PS_Prompt.ps1 | 4 ---- 1 file changed, 4 deletions(-) diff --git a/portable/scripts/WinPython_PS_Prompt.ps1 b/portable/scripts/WinPython_PS_Prompt.ps1 index ecd2d6aa..fc730090 100644 --- a/portable/scripts/WinPython_PS_Prompt.ps1 +++ b/portable/scripts/WinPython_PS_Prompt.ps1 @@ -63,8 +63,4 @@ Param([int]$x=$host.ui.rawui.windowsize.width, } # Windows10 yelling at us with 150 40 6000 # Set-WindowSize 195 40 6000 - -### Colorize to distinguish -$host.ui.RawUI.BackgroundColor = "Black" -$host.ui.RawUI.ForegroundColor = "White" } From abcc27d55666a33e3cf2f4fb24661c7424821e08 Mon Sep 17 00:00:00 2001 From: stonebig Date: Sat, 28 Jun 2025 12:47:20 +0200 Subject: [PATCH 246/305] WinPython 2025-03 changelogs and hashes --- changelogs/WinPythondot-64bit-3.12.10.1.md | 36 ++ .../WinPythondot-64bit-3.12.10.1_History.md | 34 ++ changelogs/WinPythondot-64bit-3.13.5.0.md | 36 ++ .../WinPythondot-64bit-3.13.5.0_History.md | 34 ++ changelogs/WinPythondot-64bit-3.14.0.0.md | 24 +- .../WinPythondot-64bit-3.14.0.0_History.md | 32 +- changelogs/WinPythonfree-64bit-3.14.0.0.md | 36 ++ .../WinPythonfree-64bit-3.14.0.0_History.md | 58 ++ changelogs/WinPythonslim-64bit-3.12.10.1.md | 528 ++++++++++++++++++ .../WinPythonslim-64bit-3.12.10.1_History.md | 201 +++++++ changelogs/WinPythonslim-64bit-3.13.5.0.md | 528 ++++++++++++++++++ .../WinPythonslim-64bit-3.13.5.0_History.md | 200 +++++++ changelogs/WinPythonwhl-64bit-3.12.10.1.md | 522 +++++++++++++++++ .../WinPythonwhl-64bit-3.12.10.1_History.md | 26 + changelogs/WinPythonwhl-64bit-3.13.5.0.md | 522 +++++++++++++++++ .../WinPythonwhl-64bit-3.13.5.0_History.md | 26 + changelogs/md5_sha1.txt | 22 + 17 files changed, 2850 insertions(+), 15 deletions(-) create mode 100644 changelogs/WinPythondot-64bit-3.12.10.1.md create mode 100644 changelogs/WinPythondot-64bit-3.12.10.1_History.md create mode 100644 changelogs/WinPythondot-64bit-3.13.5.0.md create mode 100644 changelogs/WinPythondot-64bit-3.13.5.0_History.md create mode 100644 changelogs/WinPythonfree-64bit-3.14.0.0.md create mode 100644 changelogs/WinPythonfree-64bit-3.14.0.0_History.md create mode 100644 changelogs/WinPythonslim-64bit-3.12.10.1.md create mode 100644 changelogs/WinPythonslim-64bit-3.12.10.1_History.md create mode 100644 changelogs/WinPythonslim-64bit-3.13.5.0.md create mode 100644 changelogs/WinPythonslim-64bit-3.13.5.0_History.md create mode 100644 changelogs/WinPythonwhl-64bit-3.12.10.1.md create mode 100644 changelogs/WinPythonwhl-64bit-3.12.10.1_History.md create mode 100644 changelogs/WinPythonwhl-64bit-3.13.5.0.md create mode 100644 changelogs/WinPythonwhl-64bit-3.13.5.0_History.md diff --git a/changelogs/WinPythondot-64bit-3.12.10.1.md b/changelogs/WinPythondot-64bit-3.12.10.1.md new file mode 100644 index 00000000..75cf9d16 --- /dev/null +++ b/changelogs/WinPythondot-64bit-3.12.10.1.md @@ -0,0 +1,36 @@ +## WinPython 3.12.10.1dot + +The following packages are included in WinPython-64bit v3.12.10.1dot 3.10.11.1dot. + +
    + +### Tools + +Name | Version | Description +-----|---------|------------ +[Python](http://www.python.org/) | 3.12.10 | Python programming language with standard library + + +### Python packages + +Name | Version | Description +-----|---------|------------ +[build](https://pypi.org/project/build) | 1.2.2.post1 | A simple, correct Python build frontend +[colorama](https://pypi.org/project/colorama) | 0.4.6 | Cross-platform colored terminal text. +[packaging](https://pypi.org/project/packaging) | 25.0 | Core utilities for Python packages +[pip](https://pypi.org/project/pip) | 25.1.1 | The PyPA recommended tool for installing Python packages. +[pyproject-hooks](https://pypi.org/project/pyproject-hooks) | 1.2.0 | Wrappers to call pyproject.toml-based build backend hooks. +[setuptools](https://pypi.org/project/setuptools) | 79.0.1 | Easily download, build, install, upgrade, and uninstall Python packages +[sqlite-bro](https://pypi.org/project/sqlite-bro) | 0.13.1 | a graphic SQLite Client in 1 Python file +[sv-ttk](https://pypi.org/project/sv-ttk) | 2.6.0 | A gorgeous theme for Tkinter, based on Windows 11's UI +[wheel](https://pypi.org/project/wheel) | 0.45.1 | A built-package format for Python +[winpython](https://pypi.org/project/winpython) | 16.5.20250614 | WinPython distribution tools, including WPPM + + +### WheelHouse packages + +Name | Version | Description +-----|---------|------------ + + +
    diff --git a/changelogs/WinPythondot-64bit-3.12.10.1_History.md b/changelogs/WinPythondot-64bit-3.12.10.1_History.md new file mode 100644 index 00000000..1b70bafc --- /dev/null +++ b/changelogs/WinPythondot-64bit-3.12.10.1_History.md @@ -0,0 +1,34 @@ +## History of changes for WinPython-64bit 3.12.10.1dot + +The following changes were made to WinPython-64bit distribution since version 3.12.10.0dot. + + +
    + +### Tools + + +New packages: + * Python 3.12.10 (Python programming language with standard library) + +### Python packages + + +Upgraded packages: + * packaging 24.2 → 25.0 (Core utilities for Python packages) + * pip 25.0.1 → 25.1.1 (The PyPA recommended tool for installing Python packages.) + * setuptools 75.8.2 → 79.0.1 (Easily download, build, install, upgrade, and uninstall Python packages) + * winpython 15.3.20250425 → 16.5.20250614 (WinPython distribution tools, including WPPM) + +Removed packages: + * Python 3.12.10 (Python programming language with standard library) + +### WheelHouse packages + + +No differences found. + + +
    + +* * * diff --git a/changelogs/WinPythondot-64bit-3.13.5.0.md b/changelogs/WinPythondot-64bit-3.13.5.0.md new file mode 100644 index 00000000..e012294a --- /dev/null +++ b/changelogs/WinPythondot-64bit-3.13.5.0.md @@ -0,0 +1,36 @@ +## WinPython 3.13.5.0dot + +The following packages are included in WinPython-64bit v3.13.5.0dot 3.10.11.1dot. + +
    + +### Tools + +Name | Version | Description +-----|---------|------------ +[Python](http://www.python.org/) | 3.13.5 | Python programming language with standard library + + +### Python packages + +Name | Version | Description +-----|---------|------------ +[build](https://pypi.org/project/build) | 1.2.2.post1 | A simple, correct Python build frontend +[colorama](https://pypi.org/project/colorama) | 0.4.6 | Cross-platform colored terminal text. +[packaging](https://pypi.org/project/packaging) | 25.0 | Core utilities for Python packages +[pip](https://pypi.org/project/pip) | 25.1.1 | The PyPA recommended tool for installing Python packages. +[pyproject-hooks](https://pypi.org/project/pyproject-hooks) | 1.2.0 | Wrappers to call pyproject.toml-based build backend hooks. +[setuptools](https://pypi.org/project/setuptools) | 79.0.1 | Easily download, build, install, upgrade, and uninstall Python packages +[sqlite-bro](https://pypi.org/project/sqlite-bro) | 0.13.1 | a graphic SQLite Client in 1 Python file +[sv-ttk](https://pypi.org/project/sv-ttk) | 2.6.0 | A gorgeous theme for Tkinter, based on Windows 11's UI +[wheel](https://pypi.org/project/wheel) | 0.45.1 | A built-package format for Python +[winpython](https://pypi.org/project/winpython) | 16.6.20250620 | WinPython distribution tools, including WPPM + + +### WheelHouse packages + +Name | Version | Description +-----|---------|------------ + + +
    diff --git a/changelogs/WinPythondot-64bit-3.13.5.0_History.md b/changelogs/WinPythondot-64bit-3.13.5.0_History.md new file mode 100644 index 00000000..fb07f130 --- /dev/null +++ b/changelogs/WinPythondot-64bit-3.13.5.0_History.md @@ -0,0 +1,34 @@ +## History of changes for WinPython-64bit 3.13.5.0dot + +The following changes were made to WinPython-64bit distribution since version 3.13.3.0dot. + + +
    + +### Tools + + +New packages: + * Python 3.13.5 (Python programming language with standard library) + +### Python packages + + +Upgraded packages: + * packaging 24.2 → 25.0 (Core utilities for Python packages) + * pip 25.0.1 → 25.1.1 (The PyPA recommended tool for installing Python packages.) + * setuptools 75.8.2 → 79.0.1 (Easily download, build, install, upgrade, and uninstall Python packages) + * winpython 15.3.20250425 → 16.6.20250620 (WinPython distribution tools, including WPPM) + +Removed packages: + * Python 3.13.3 (Python programming language with standard library) + +### WheelHouse packages + + +No differences found. + + +
    + +* * * diff --git a/changelogs/WinPythondot-64bit-3.14.0.0.md b/changelogs/WinPythondot-64bit-3.14.0.0.md index a97b3e37..32acdb7e 100644 --- a/changelogs/WinPythondot-64bit-3.14.0.0.md +++ b/changelogs/WinPythondot-64bit-3.14.0.0.md @@ -1,6 +1,6 @@ ## WinPython 3.14.0.0dot -The following packages are included in WinPython-64bit v3.14.0.0dot a5b. +The following packages are included in WinPython-64bit v3.14.0.0dot b3.
    @@ -8,21 +8,29 @@ The following packages are included in WinPython-64bit v3.14.0.0dot a5b. Name | Version | Description -----|---------|------------ +[Python](http://www.python.org/) | 3.14.0b3 | Python programming language with standard library ### Python packages Name | Version | Description -----|---------|------------ -[Python](http://www.python.org/) | 3.14.0 | Python programming language with standard library [build](https://pypi.org/project/build) | 1.2.2.post1 | A simple, correct Python build frontend [colorama](https://pypi.org/project/colorama) | 0.4.6 | Cross-platform colored terminal text. -[packaging](https://pypi.org/project/packaging) | 24.2 | Core utilities for Python packages -[pip](https://pypi.org/project/pip) | 25.0.1 | The PyPA recommended tool for installing Python packages. -[pyproject_hooks](https://pypi.org/project/pyproject_hooks) | 1.1.0 | Wrappers to call pyproject.toml-based build backend hooks. -[setuptools](https://pypi.org/project/setuptools) | 75.6.0 | Easily download, build, install, upgrade, and uninstall Python packages -[sqlite_bro](https://pypi.org/project/sqlite_bro) | 0.13.1 | a graphic SQLite Client in 1 Python file +[packaging](https://pypi.org/project/packaging) | 25.0 | Core utilities for Python packages +[pip](https://pypi.org/project/pip) | 25.1.1 | The PyPA recommended tool for installing Python packages. +[pyproject-hooks](https://pypi.org/project/pyproject-hooks) | 1.2.0 | Wrappers to call pyproject.toml-based build backend hooks. +[setuptools](https://pypi.org/project/setuptools) | 79.0.1 | Easily download, build, install, upgrade, and uninstall Python packages +[sqlite-bro](https://pypi.org/project/sqlite-bro) | 0.13.1 | a graphic SQLite Client in 1 Python file +[sv-ttk](https://pypi.org/project/sv-ttk) | 2.6.0 | A gorgeous theme for Tkinter, based on Windows 11's UI [wheel](https://pypi.org/project/wheel) | 0.45.1 | A built-package format for Python -[winpython](https://pypi.org/project/winpython) | 13.1.20250222 | WinPython distribution tools, including WPPM +[winpython](https://pypi.org/project/winpython) | 16.6.20250620 | WinPython distribution tools, including WPPM + + +### WheelHouse packages + +Name | Version | Description +-----|---------|------------ +
    diff --git a/changelogs/WinPythondot-64bit-3.14.0.0_History.md b/changelogs/WinPythondot-64bit-3.14.0.0_History.md index 5b7848f1..d692feba 100644 --- a/changelogs/WinPythondot-64bit-3.14.0.0_History.md +++ b/changelogs/WinPythondot-64bit-3.14.0.0_History.md @@ -1,8 +1,26 @@ -## History of changes for WinPython-64bit 3.14.0.0dot +## History of changes for WinPython-64bit 3.14.0.0dot -The following changes were made to WinPython-64bit distribution since version 3.14.0.0dot. - -
    - -
    -* * * +The following changes were made to WinPython-64bit distribution since version 3.13.5.0dot. + + +
    + +### Tools + + +Upgraded packages: + +### Python packages + + +No differences found. + +### WheelHouse packages + + +No differences found. + + +
    + +* * * diff --git a/changelogs/WinPythonfree-64bit-3.14.0.0.md b/changelogs/WinPythonfree-64bit-3.14.0.0.md new file mode 100644 index 00000000..763af9fc --- /dev/null +++ b/changelogs/WinPythonfree-64bit-3.14.0.0.md @@ -0,0 +1,36 @@ +## WinPython 3.14.0.0free + +The following packages are included in WinPython-64bit v3.14.0.0free b3. + +
    + +### Tools + +Name | Version | Description +-----|---------|------------ +[Python](http://www.python.org/) | 3.14.0b3 | Python programming language with standard library + + +### Python packages + +Name | Version | Description +-----|---------|------------ +[build](https://pypi.org/project/build) | 1.2.2.post1 | A simple, correct Python build frontend +[colorama](https://pypi.org/project/colorama) | 0.4.6 | Cross-platform colored terminal text. +[packaging](https://pypi.org/project/packaging) | 25.0 | Core utilities for Python packages +[pip](https://pypi.org/project/pip) | 25.1.1 | The PyPA recommended tool for installing Python packages. +[pyproject-hooks](https://pypi.org/project/pyproject-hooks) | 1.2.0 | Wrappers to call pyproject.toml-based build backend hooks. +[setuptools](https://pypi.org/project/setuptools) | 79.0.1 | Easily download, build, install, upgrade, and uninstall Python packages +[sqlite-bro](https://pypi.org/project/sqlite-bro) | 0.13.1 | a graphic SQLite Client in 1 Python file +[sv-ttk](https://pypi.org/project/sv-ttk) | 2.6.0 | A gorgeous theme for Tkinter, based on Windows 11's UI +[wheel](https://pypi.org/project/wheel) | 0.45.1 | A built-package format for Python +[winpython](https://pypi.org/project/winpython) | 16.6.20250620 | WinPython distribution tools, including WPPM + + +### WheelHouse packages + +Name | Version | Description +-----|---------|------------ + + +
    diff --git a/changelogs/WinPythonfree-64bit-3.14.0.0_History.md b/changelogs/WinPythonfree-64bit-3.14.0.0_History.md new file mode 100644 index 00000000..e70c94b5 --- /dev/null +++ b/changelogs/WinPythonfree-64bit-3.14.0.0_History.md @@ -0,0 +1,58 @@ +## History of changes for WinPython-64bit 3.14.0.0free + +The following changes were made to WinPython-64bit distribution since version 3.13.0.1free. + + +
    + +### Tools + + +New packages: + * Python 3.14.0b3 (Python programming language with standard library) + +### Python packages + + +New packages: + * sv-ttk 2.6.0 (A gorgeous theme for Tkinter, based on Windows 11's UI) + +Upgraded packages: + * build 1.2.1 → 1.2.2.post1 (A simple, correct Python build frontend) + * packaging 24.1 → 25.0 (Core utilities for Python packages) + * pip 24.2 → 25.1.1 (The PyPA recommended tool for installing Python packages.) + * setuptools 72.2.0 → 79.0.1 (Easily download, build, install, upgrade, and uninstall Python packages) + * wheel 0.44.0 → 0.45.1 (A built-package format for Python) + * winpython 10.7.20240908 → 16.6.20250620 (WinPython distribution tools, including WPPM) + +Removed packages: + * Python 3.13.0 (Python programming language with standard library) + * appdirs 1.4.4 (A small Python module for determining appropriate platform-specific dirs, e.g. a "user data dir".) + * asttokens 2.4.1 (Annotate AST trees with source code positions) + * cython 3.1.0a0 (The Cython compiler for writing C extensions in the Python language.) + * decorator 5.1.1 (Decorators for Humans) + * executing 2.0.1 (Get the currently executing AST node of a frame, and other information) + * interpreters_pep_734 0.1.0 (Use this module to try out multiple interpreters and a per-interpreter GIL in Python 3.13+. Do not use this for anything important yet.) + * ipython 8.26.0 (IPython: Productive Interactive Computing) + * jedi 0.19.1 (An autocompletion tool for Python that can be used for text editors.) + * matplotlib_inline 0.1.7 (Inline Matplotlib backend for Jupyter) + * msvc_runtime 14.40.33807 (Install the Microsoft™ Visual C++™ runtime DLLs to the sys.prefix and Scripts directories) + * parso 0.8.4 (A Python Parser) + * prompt_toolkit 3.0.47 (Library for building powerful interactive command lines in Python) + * ptpython 3.0.29 (Python REPL build on top of prompt_toolkit) + * pure_eval 0.2.2 (Safely evaluate AST nodes without side effects) + * pygments 2.18.0 (Pygments is a syntax highlighting package written in Python.) + * six 1.16.0 (Python 2 and 3 compatibility utilities) + * stack_data 0.6.3 (Extract data from python stack frames and tracebacks for informative displays) + * traitlets 5.14.1 (Traitlets Python configuration system) + * wcwidth 0.2.13 (Measures the displayed width of unicode strings in a terminal) + +### WheelHouse packages + + +No differences found. + + +
    + +* * * diff --git a/changelogs/WinPythonslim-64bit-3.12.10.1.md b/changelogs/WinPythonslim-64bit-3.12.10.1.md new file mode 100644 index 00000000..7c78fc18 --- /dev/null +++ b/changelogs/WinPythonslim-64bit-3.12.10.1.md @@ -0,0 +1,528 @@ +## WinPython 3.12.10.1slim + +The following packages are included in WinPython-64bit v3.12.10.1slim 3.10.11.1dot. + +
    + +### Tools + +Name | Version | Description +-----|---------|------------ +[Pandoc](https://pandoc.org) | 3.1.9 | an universal document converter +[Python](http://www.python.org/) | 3.12.10 | Python programming language with standard library + + +### Python packages + +Name | Version | Description +-----|---------|------------ +[absl-py](https://pypi.org/project/absl-py) | 2.2.2 | Abseil Python Common Libraries, see https://github.com/abseil/abseil-py. +[adbc-driver-manager](https://pypi.org/project/adbc-driver-manager) | 1.3.0 | A generic entrypoint for ADBC drivers. +[aiofiles](https://pypi.org/project/aiofiles) | 23.2.1 | File support for asyncio. +[aiohappyeyeballs](https://pypi.org/project/aiohappyeyeballs) | 2.6.1 | Happy Eyeballs for asyncio +[aiohttp](https://pypi.org/project/aiohttp) | 3.11.18 | Async http client/server framework (asyncio) +[aiosignal](https://pypi.org/project/aiosignal) | 1.3.2 | aiosignal: a list of registered asynchronous callbacks +[aiosqlite](https://pypi.org/project/aiosqlite) | 0.20.0 | asyncio bridge to the standard sqlite3 module +[alabaster](https://pypi.org/project/alabaster) | 0.7.16 | A light, configurable Sphinx theme +[alembic](https://pypi.org/project/alembic) | 1.15.2 | A database migration tool for SQLAlchemy. +[altair](https://pypi.org/project/altair) | 5.5.0 | Vega-Altair: A declarative statistical visualization library for Python. +[annotated-types](https://pypi.org/project/annotated-types) | 0.7.0 | Reusable constraint types to use with typing.Annotated +[ansicolors](https://pypi.org/project/ansicolors) | 1.1.8 | ANSI colors for Python +[anthropic](https://pypi.org/project/anthropic) | 0.51.0 | The official Python library for the anthropic API +[anyio](https://pypi.org/project/anyio) | 4.9.0 | High level compatibility layer for multiple asynchronous event loop implementations +[anywidget](https://pypi.org/project/anywidget) | 0.9.18 | custom jupyter widgets made easy +[appdirs](https://pypi.org/project/appdirs) | 1.4.4 | A small Python module for determining appropriate platform-specific dirs, e.g. a "user data dir". +[argcomplete](https://pypi.org/project/argcomplete) | 3.6.2 | Bash tab completion for argparse +[argon2-cffi](https://pypi.org/project/argon2-cffi) | 23.1.0 | Argon2 for Python +[argon2-cffi-bindings](https://pypi.org/project/argon2-cffi-bindings) | 21.2.0 | Low-level CFFI bindings for Argon2 +[array-api-compat](https://pypi.org/project/array-api-compat) | 1.12.0 | A wrapper around NumPy and other array libraries to make them compatible with the Array API standard +[arrow](https://pypi.org/project/arrow) | 1.3.0 | Better dates & times for Python +[asgi-csrf](https://pypi.org/project/asgi-csrf) | 0.11 | ASGI middleware for protecting against CSRF attacks +[asgiref](https://pypi.org/project/asgiref) | 3.8.1 | ASGI specs, helper code, and adapters +[asn1crypto](https://pypi.org/project/asn1crypto) | 1.5.1 | Fast ASN.1 parser and serializer with definitions for private keys, public keys, certificates, CRL, OCSP, CMS, PKCS#3, PKCS#7, PKCS#8, PKCS#12, +[asteval](https://pypi.org/project/asteval) | 1.0.5 | Safe, minimalistic evaluator of python expression using ast module +[astroid](https://pypi.org/project/astroid) | 3.3.9 | An abstract syntax tree for Python with inference support. +[astropy](https://pypi.org/project/astropy) | 6.1.6 | Astronomy and astrophysics core library +[astropy-iers-data](https://pypi.org/project/astropy-iers-data) | 0.2024.12.23.0.33.24 | IERS Earth Rotation and Leap Second tables for the astropy core package +[asttokens](https://pypi.org/project/asttokens) | 3.0.0 | Annotate AST trees with source code positions +[async-lru](https://pypi.org/project/async-lru) | 2.0.5 | Simple LRU cache for asyncio +[asyncssh](https://pypi.org/project/asyncssh) | 2.20.0 | AsyncSSH: Asynchronous SSHv2 client and server library +[atomicwrites](https://pypi.org/project/atomicwrites) | 1.4.0 | Atomic file writes. +[attrs](https://pypi.org/project/attrs) | 25.3.0 | Classes Without Boilerplate +[autopep8](https://pypi.org/project/autopep8) | 2.0.4 | A tool that automatically formats Python code to conform to the PEP 8 style guide +[azure-core](https://pypi.org/project/azure-core) | 1.32.0 | Microsoft Azure Core Library for Python +[azure-cosmos](https://pypi.org/project/azure-cosmos) | 4.9.0 | Microsoft Azure Cosmos Client Library for Python +[azure-identity](https://pypi.org/project/azure-identity) | 1.21.0 | Microsoft Azure Identity Library for Python +[babel](https://pypi.org/project/babel) | 2.17.0 | Internationalization utilities +[baresql](https://pypi.org/project/baresql) | 1.0.0 | playing SQL directly on Python datas +[bcrypt](https://pypi.org/project/bcrypt) | 4.3.0 | Modern password hashing for your software and your servers +[beautifulsoup4](https://pypi.org/project/beautifulsoup4) | 4.13.3 | Screen-scraping library +[binaryornot](https://pypi.org/project/binaryornot) | 0.4.4 | Ultra-lightweight pure Python package to check if a file is binary or text. +[black](https://pypi.org/project/black) | 25.1.0 | The uncompromising code formatter. +[bleach](https://pypi.org/project/bleach) | 6.2.0 | An easy safelist-based HTML-sanitizing tool. +[blinker](https://pypi.org/project/blinker) | 1.9.0 | Fast, simple object-to-object and broadcast signaling +[bokeh](https://pypi.org/project/bokeh) | 3.7.3 | Interactive plots and applications in the browser from Python +[branca](https://pypi.org/project/branca) | 0.8.1 | Generate complex HTML+JS pages with Python +[brotli](https://pypi.org/project/brotli) | 1.1.0 | Python bindings for the Brotli compression library +[build](https://pypi.org/project/build) | 1.2.2.post1 | A simple, correct Python build frontend +[cachetools](https://pypi.org/project/cachetools) | 5.5.2 | Extensible memoizing collections and decorators +[certifi](https://pypi.org/project/certifi) | 2025.1.31 | Python package for providing Mozilla's CA Bundle. +[cffi](https://pypi.org/project/cffi) | 1.17.1 | Foreign Function Interface for Python calling C code. +[chardet](https://pypi.org/project/chardet) | 5.2.0 | Universal encoding detector for Python 3 +[charset-normalizer](https://pypi.org/project/charset-normalizer) | 3.4.2 | The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet. +[clarabel](https://pypi.org/project/clarabel) | 0.10.0 | Clarabel Conic Interior Point Solver for Rust / Python +[click](https://pypi.org/project/click) | 8.1.8 | Composable command line interface toolkit +[click-default-group](https://pypi.org/project/click-default-group) | 1.2.4 | click_default_group +[cloudpickle](https://pypi.org/project/cloudpickle) | 3.1.1 | Pickler class to extend the standard pickle.Pickler functionality +[cohere](https://pypi.org/project/cohere) | 5.15.0 | +[colorama](https://pypi.org/project/colorama) | 0.4.6 | Cross-platform colored terminal text. +[colorcet](https://pypi.org/project/colorcet) | 3.1.0 | Collection of perceptually uniform colormaps +[colorlog](https://pypi.org/project/colorlog) | 6.9.0 | Add colours to the output of Python's logging module. +[comm](https://pypi.org/project/comm) | 0.2.2 | Jupyter Python Comm implementation, for usage in ipykernel, xeus-python etc. +[contourpy](https://pypi.org/project/contourpy) | 1.3.2 | Python library for calculating contours of 2D quadrilateral grids +[cookiecutter](https://pypi.org/project/cookiecutter) | 2.6.0 | A command-line utility that creates projects from project templates, e.g. +[cryptography](https://pypi.org/project/cryptography) | 44.0.0 | cryptography is a package which provides cryptographic recipes and primitives to Python developers. +[cvxopt](https://pypi.org/project/cvxopt) | 1.3.2 | Convex optimization package +[cvxpy](https://pypi.org/project/cvxpy) | 1.6.4 | A domain-specific language for modeling convex optimization problems in Python. +[cycler](https://pypi.org/project/cycler) | 0.12.1 | Composable style cycles +[cython](https://pypi.org/project/cython) | 3.1.1 | The Cython compiler for writing C extensions in the Python language. +[cytoolz](https://pypi.org/project/cytoolz) | 1.0.1 | Cython implementation of Toolz: High performance functional utilities +[dask](https://pypi.org/project/dask) | 2025.4.1 | Parallel PyData with Task Scheduling +[datasette](https://pypi.org/project/datasette) | 0.65.1 | An open source multi-tool for exploring and publishing data +[datasette-graphql](https://pypi.org/project/datasette-graphql) | 2.2 | Datasette plugin providing an automatic GraphQL API for your SQLite databases +[datashader](https://pypi.org/project/datashader) | 0.17.0 | Data visualization toolchain based on aggregating into a grid +[deap](https://pypi.org/project/deap) | 1.4.2 | Distributed Evolutionary Algorithms in Python +[debugpy](https://pypi.org/project/debugpy) | 1.8.13 | An implementation of the Debug Adapter Protocol for Python +[decorator](https://pypi.org/project/decorator) | 5.2.1 | Decorators for Humans +[defusedxml](https://pypi.org/project/defusedxml) | 0.7.1 | XML bomb protection for Python stdlib modules +[deprecated](https://pypi.org/project/deprecated) | 1.2.14 | Python @deprecated decorator to deprecate old python classes, functions or methods. +[diff-match-patch](https://pypi.org/project/diff-match-patch) | 20241021 | Repackaging of Google's Diff Match and Patch libraries. +[dill](https://pypi.org/project/dill) | 0.4.0 | serialize all of Python +[distributed](https://pypi.org/project/distributed) | 2025.4.1 | Distributed scheduler for Dask +[distro](https://pypi.org/project/distro) | 1.9.0 | Distro - an OS platform information API +[django](https://pypi.org/project/django) | 5.2 | A high-level Python web framework that encourages rapid development and clean, pragmatic design. +[dnspython](https://pypi.org/project/dnspython) | 2.7.0 | DNS toolkit +[docstring-to-markdown](https://pypi.org/project/docstring-to-markdown) | 0.17 | On the fly conversion of Python docstrings to markdown +[docutils](https://pypi.org/project/docutils) | 0.21.2 | Docutils -- Python Documentation Utilities +[duckdb](https://pypi.org/project/duckdb) | 1.3.0 | DuckDB in-process database +[entrypoints](https://pypi.org/project/entrypoints) | 0.4 | Discover and load entry points from installed packages. +[et-xmlfile](https://pypi.org/project/et-xmlfile) | 1.1.0 | An implementation of lxml.xmlfile for the standard library +[eval-type-backport](https://pypi.org/project/eval-type-backport) | 0.2.2 | Like `typing._eval_type`, but lets older Python versions use newer typing features. +[executing](https://pypi.org/project/executing) | 2.2.0 | Get the currently executing AST node of a frame, and other information +[faker](https://pypi.org/project/faker) | 37.1.0 | Faker is a Python package that generates fake data for you. +[fasta2a](https://pypi.org/project/fasta2a) | 0.2.9 | Convert an AI Agent into a A2A server! ✨ +[fastapi](https://pypi.org/project/fastapi) | 0.115.12 | FastAPI framework, high performance, easy to learn, fast to code, ready for production +[fastavro](https://pypi.org/project/fastavro) | 1.10.0 | Fast read/write of AVRO files +[fastjsonschema](https://pypi.org/project/fastjsonschema) | 2.21.1 | Fastest Python implementation of JSON schema +[filelock](https://pypi.org/project/filelock) | 3.18.0 | A platform independent file lock. +[flake8](https://pypi.org/project/flake8) | 7.1.1 | the modular source code checker: pep8 pyflakes and co +[flask](https://pypi.org/project/flask) | 3.1.0 | A simple framework for building complex web applications. +[flexcache](https://pypi.org/project/flexcache) | 0.3 | Saves and loads to the cache a transformed versions of a source object. +[flexparser](https://pypi.org/project/flexparser) | 0.4 | Parsing made fun ... using typing. +[flit](https://pypi.org/project/flit) | 3.12.0 | A simple packaging tool for simple packages. +[flit-core](https://pypi.org/project/flit-core) | 3.12.0 | Distribution-building parts of Flit. See flit package for more information +[folium](https://pypi.org/project/folium) | 0.19.5 | Make beautiful maps with Leaflet.js & Python +[fonttools](https://pypi.org/project/fonttools) | 4.57.0 | Tools to manipulate font files +[fqdn](https://pypi.org/project/fqdn) | 1.5.1 | Validates fully-qualified domain names against RFC 1123, so that they are acceptable to modern bowsers +[frozenlist](https://pypi.org/project/frozenlist) | 1.5.0 | A list-like structure which implements collections.abc.MutableSequence +[fsspec](https://pypi.org/project/fsspec) | 2025.3.2 | File-system specification +[fuzzywuzzy](https://pypi.org/project/fuzzywuzzy) | 0.18.0 | Fuzzy string matching in python +[geographiclib](https://pypi.org/project/geographiclib) | 2.0 | The geodesic routines from GeographicLib +[geopandas](https://pypi.org/project/geopandas) | 1.0.1 | Geographic pandas extensions +[geopy](https://pypi.org/project/geopy) | 2.4.1 | Python Geocoding Toolbox +[gitdb](https://pypi.org/project/gitdb) | 4.0.12 | Git Object Database +[gitpython](https://pypi.org/project/gitpython) | 3.1.44 | GitPython is a Python library used to interact with Git repositories +[google-auth](https://pypi.org/project/google-auth) | 2.38.0 | Google Authentication Library +[google-genai](https://pypi.org/project/google-genai) | 1.16.1 | GenAI Python SDK +[graphene](https://pypi.org/project/graphene) | 3.4.3 | GraphQL Framework for Python +[graphql-core](https://pypi.org/project/graphql-core) | 3.2.6 | GraphQL implementation for Python, a port of GraphQL.js, the JavaScript reference implementation for GraphQL. +[graphql-relay](https://pypi.org/project/graphql-relay) | 3.2.0 | Relay library for graphql-core +[greenlet](https://pypi.org/project/greenlet) | 3.1.1 | Lightweight in-process concurrent programming +[griffe](https://pypi.org/project/griffe) | 1.7.2 | Signatures for entire Python programs. +[groq](https://pypi.org/project/groq) | 0.25.0 | The official Python library for the groq API +[guidata](https://pypi.org/project/guidata) | 3.9.0 | Automatic GUI generation for easy dataset editing and display +[h11](https://pypi.org/project/h11) | 0.14.0 | A pure-Python, bring-your-own-I/O implementation of HTTP/1.1 +[h2](https://pypi.org/project/h2) | 4.2.0 | Pure-Python HTTP/2 protocol implementation +[h5py](https://pypi.org/project/h5py) | 3.12.1 | Read and write HDF5 files from Python +[hatchling](https://pypi.org/project/hatchling) | 1.27.0 | Modern, extensible Python build backend +[holoviews](https://pypi.org/project/holoviews) | 1.20.2 | A high-level plotting API for the PyData ecosystem built on HoloViews. +[hpack](https://pypi.org/project/hpack) | 4.1.0 | Pure-Python HPACK header encoding +[html5lib](https://pypi.org/project/html5lib) | 1.1 | HTML parser based on the WHATWG HTML specification +[httpcore](https://pypi.org/project/httpcore) | 1.0.7 | A minimal low-level HTTP client. +[httpie](https://pypi.org/project/httpie) | 3.2.4 | HTTPie: modern, user-friendly command-line HTTP client for the API era. +[httpx](https://pypi.org/project/httpx) | 0.28.1 | The next generation HTTP client. +[httpx-sse](https://pypi.org/project/httpx-sse) | 0.4.0 | Consume Server-Sent Event (SSE) messages with HTTPX. +[huggingface-hub](https://pypi.org/project/huggingface-hub) | 0.33.0 | Client library to download and publish models, datasets and other repos on the huggingface.co hub +[hupper](https://pypi.org/project/hupper) | 1.12.1 | Integrated process monitor for developing and reloading daemons. +[hvplot](https://pypi.org/project/hvplot) | 0.11.2 | A high-level plotting API for the PyData ecosystem built on HoloViews. +[hypercorn](https://pypi.org/project/hypercorn) | 0.17.3 | A ASGI Server based on Hyper libraries and inspired by Gunicorn +[hyperframe](https://pypi.org/project/hyperframe) | 6.1.0 | Pure-Python HTTP/2 framing +[hypothesis](https://pypi.org/project/hypothesis) | 6.130.4 | A library for property-based testing +[id](https://pypi.org/project/id) | 1.5.0 | A tool for generating OIDC identities +[idna](https://pypi.org/project/idna) | 3.10 | Internationalized Domain Names in Applications (IDNA) +[imageio](https://pypi.org/project/imageio) | 2.37.0 | Library for reading and writing a wide range of image, video, scientific, and volumetric data formats. +[imagesize](https://pypi.org/project/imagesize) | 1.4.1 | Getting image size from png/jpeg/jpeg2000/gif file +[imbalanced-learn](https://pypi.org/project/imbalanced-learn) | 0.13.0 | Toolbox for imbalanced dataset in machine learning +[importlib-metadata](https://pypi.org/project/importlib-metadata) | 8.6.1 | Read metadata from Python packages +[inflection](https://pypi.org/project/inflection) | 0.5.1 | A port of Ruby on Rails inflector to Python +[iniconfig](https://pypi.org/project/iniconfig) | 2.1.0 | brain-dead simple config-ini parsing +[intervaltree](https://pypi.org/project/intervaltree) | 3.1.0 | Editable interval tree data structure for Python 2 and 3 +[ipycanvas](https://pypi.org/project/ipycanvas) | 0.13.3 | Interactive widgets library exposing the browser's Canvas API +[ipykernel](https://pypi.org/project/ipykernel) | 6.29.5 | IPython Kernel for Jupyter +[ipyleaflet](https://pypi.org/project/ipyleaflet) | 0.19.2 | A Jupyter widget for dynamic Leaflet maps +[ipympl](https://pypi.org/project/ipympl) | 0.9.7 | Matplotlib Jupyter Extension +[ipython](https://pypi.org/project/ipython) | 8.36.0 | IPython: Productive Interactive Computing +[ipython-genutils](https://pypi.org/project/ipython-genutils) | 0.2.0 | Vestigial utilities from IPython +[ipython-sql](https://pypi.org/project/ipython-sql) | 0.5.0 | RDBMS access via IPython +[ipywidgets](https://pypi.org/project/ipywidgets) | 8.1.6 | Jupyter interactive widgets +[isoduration](https://pypi.org/project/isoduration) | 20.11.0 | Operations with ISO 8601 durations +[isort](https://pypi.org/project/isort) | 5.13.2 | A Python utility / library to sort Python imports. +[itsdangerous](https://pypi.org/project/itsdangerous) | 2.2.0 | Safely pass data to untrusted environments and back. +[janus](https://pypi.org/project/janus) | 2.0.0 | Mixed sync-async queue to interoperate between asyncio tasks and classic threads +[jaraco-classes](https://pypi.org/project/jaraco-classes) | 3.4.0 | Utility functions for Python class constructs +[jaraco-context](https://pypi.org/project/jaraco-context) | 6.0.1 | Useful decorators and context managers +[jaraco-functools](https://pypi.org/project/jaraco-functools) | 4.1.0 | Functools like those found in stdlib +[jedi](https://pypi.org/project/jedi) | 0.19.2 | An autocompletion tool for Python that can be used for text editors. +[jellyfish](https://pypi.org/project/jellyfish) | 1.1.3 | Approximate and phonetic matching of strings. +[jinja2](https://pypi.org/project/jinja2) | 3.1.6 | A very fast and expressive template engine. +[jiter](https://pypi.org/project/jiter) | 0.9.0 | Fast iterable JSON parser. +[joblib](https://pypi.org/project/joblib) | 1.4.2 | Lightweight pipelining with Python functions +[json5](https://pypi.org/project/json5) | 0.10.0 | A Python implementation of the JSON5 data format. +[jsonpatch](https://pypi.org/project/jsonpatch) | 1.33 | Apply JSON-Patches (RFC 6902) +[jsonpointer](https://pypi.org/project/jsonpointer) | 3.0.0 | Identify specific nodes in a JSON document (RFC 6901) +[jsonschema](https://pypi.org/project/jsonschema) | 4.23.0 | An implementation of JSON Schema validation for Python +[jsonschema-specifications](https://pypi.org/project/jsonschema-specifications) | 2024.10.1 | The JSON Schema meta-schemas and vocabularies, exposed as a Registry +[julia](https://pypi.org/project/julia) | 0.6.2 | Julia/Python bridge with IPython support. +[jupyter](https://pypi.org/project/jupyter) | 1.1.1 | Jupyter metapackage. Install all the Jupyter components in one go. +[jupyter-bokeh](https://pypi.org/project/jupyter-bokeh) | 4.0.5 | A Jupyter extension for rendering Bokeh content. +[jupyter-client](https://pypi.org/project/jupyter-client) | 8.6.3 | Jupyter protocol implementation and client libraries +[jupyter-console](https://pypi.org/project/jupyter-console) | 6.6.3 | Jupyter terminal console +[jupyter-core](https://pypi.org/project/jupyter-core) | 5.7.2 | Jupyter core package. A base package on which Jupyter projects rely. +[jupyter-events](https://pypi.org/project/jupyter-events) | 0.12.0 | Jupyter Event System library +[jupyter-leaflet](https://pypi.org/project/jupyter-leaflet) | 0.19.2 | ipyleaflet extensions for JupyterLab and Jupyter Notebook +[jupyter-lsp](https://pypi.org/project/jupyter-lsp) | 2.2.5 | Multi-Language Server WebSocket proxy for Jupyter Notebook/Lab server +[jupyter-server](https://pypi.org/project/jupyter-server) | 2.15.0 | The backend—i.e. core services, APIs, and REST endpoints—to Jupyter web applications. +[jupyter-server-terminals](https://pypi.org/project/jupyter-server-terminals) | 0.5.3 | A Jupyter Server Extension Providing Terminals. +[jupyterlab](https://pypi.org/project/jupyterlab) | 4.4.2 | JupyterLab computational environment +[jupyterlab-pygments](https://pypi.org/project/jupyterlab-pygments) | 0.3.0 | Pygments theme using JupyterLab CSS variables +[jupyterlab-server](https://pypi.org/project/jupyterlab-server) | 2.27.3 | A set of server components for JupyterLab and JupyterLab like applications. +[jupyterlab-widgets](https://pypi.org/project/jupyterlab-widgets) | 3.0.14 | Jupyter interactive widgets for JupyterLab +[keras](https://pypi.org/project/keras) | 3.10.0 | Multi-backend Keras +[keyring](https://pypi.org/project/keyring) | 25.6.0 | Store and access your passwords safely. +[kiwisolver](https://pypi.org/project/kiwisolver) | 1.4.8 | A fast implementation of the Cassowary constraint solver +[langchain](https://pypi.org/project/langchain) | 0.3.25 | Building applications with LLMs through composability +[langchain-core](https://pypi.org/project/langchain-core) | 0.3.59 | Building applications with LLMs through composability +[langchain-text-splitters](https://pypi.org/project/langchain-text-splitters) | 0.3.8 | LangChain text splitting utilities +[langsmith](https://pypi.org/project/langsmith) | 0.3.42 | Client library to connect to the LangSmith LLM Tracing and Evaluation Platform. +[lazy-loader](https://pypi.org/project/lazy-loader) | 0.4 | Makes it easy to load subpackages and functions on demand. +[linkify-it-py](https://pypi.org/project/linkify-it-py) | 2.0.3 | Links recognition library with FULL unicode support. +[llvmlite](https://pypi.org/project/llvmlite) | 0.44.0 | lightweight wrapper around basic LLVM functionality +[lmfit](https://pypi.org/project/lmfit) | 1.3.3 | Least-Squares Minimization with Bounds and Constraints +[locket](https://pypi.org/project/locket) | 1.0.0 | File-based locks for Python on Linux and Windows +[logfire-api](https://pypi.org/project/logfire-api) | 3.12.0 | Shim for the Logfire SDK which does nothing unless Logfire is installed +[lxml](https://pypi.org/project/lxml) | 5.3.0 | Powerful and Pythonic XML processing library combining libxml2/libxslt with the ElementTree API. +[mako](https://pypi.org/project/mako) | 1.3.9 | A super-fast templating language that borrows the best ideas from the existing templating languages. +[markdown](https://pypi.org/project/markdown) | 3.7 | Python implementation of John Gruber's Markdown. +[markdown-it-py](https://pypi.org/project/markdown-it-py) | 3.0.0 | Python port of markdown-it. Markdown parsing, done right! +[markupsafe](https://pypi.org/project/markupsafe) | 3.0.2 | Safely add untrusted strings to HTML/XML markup. +[matplotlib](https://pypi.org/project/matplotlib) | 3.10.3 | Python plotting package +[matplotlib-inline](https://pypi.org/project/matplotlib-inline) | 0.1.7 | Inline Matplotlib backend for Jupyter +[maturin](https://pypi.org/project/maturin) | 1.8.3 | Build and publish crates with pyo3, cffi and uniffi bindings as well as rust binaries as python packages +[mccabe](https://pypi.org/project/mccabe) | 0.7.0 | McCabe checker, plugin for flake8 +[mcp](https://pypi.org/project/mcp) | 1.9.3 | Model Context Protocol SDK +[mdit-py-plugins](https://pypi.org/project/mdit-py-plugins) | 0.4.2 | Collection of plugins for markdown-it-py +[mdurl](https://pypi.org/project/mdurl) | 0.1.2 | Markdown URL utilities +[mercantile](https://pypi.org/project/mercantile) | 1.2.1 | Web mercator XYZ tile utilities +[mergedeep](https://pypi.org/project/mergedeep) | 1.3.4 | A deep merge function for 🐍. +[missingno](https://pypi.org/project/missingno) | 0.5.2 | Missing data visualization module for Python. +[mistralai](https://pypi.org/project/mistralai) | 1.8.1 | Python Client SDK for the Mistral AI API. +[mistune](https://pypi.org/project/mistune) | 3.1.3 | A sane and fast Markdown parser with useful plugins and renderers +[mizani](https://pypi.org/project/mizani) | 0.11.4 | Scales for Python +[ml-dtypes](https://pypi.org/project/ml-dtypes) | 0.5.1 | +[mlxtend](https://pypi.org/project/mlxtend) | 0.23.3 | Machine Learning Library Extensions +[more-itertools](https://pypi.org/project/more-itertools) | 10.6.0 | More routines for operating on iterables, beyond itertools +[mpld3](https://pypi.org/project/mpld3) | 0.5.10 | D3 Viewer for Matplotlib +[mpmath](https://pypi.org/project/mpmath) | 1.3.0 | Python library for arbitrary-precision floating-point arithmetic +[msal](https://pypi.org/project/msal) | 1.30.0 | The Microsoft Authentication Library (MSAL) for Python library enables your app to access the Microsoft Cloud by supporting authentication of us +[msal-extensions](https://pypi.org/project/msal-extensions) | 1.2.0 | Microsoft Authentication Library extensions (MSAL EX) provides a persistence API that can save your data on disk, encrypted on Windows, macOS an +[msgpack](https://pypi.org/project/msgpack) | 1.1.0 | MessagePack serializer +[multidict](https://pypi.org/project/multidict) | 6.4.3 | multidict implementation +[multipledispatch](https://pypi.org/project/multipledispatch) | 1.0.0 | Multiple dispatch +[mypy](https://pypi.org/project/mypy) | 1.15.0 | Optional static typing for Python +[mypy-extensions](https://pypi.org/project/mypy-extensions) | 1.0.0 | Type system extensions for programs checked with the mypy type checker. +[mysql-connector-python](https://pypi.org/project/mysql-connector-python) | 9.2.0 | A self-contained Python driver for communicating with MySQL servers, using an API that is compliant with the Python Database API Specification v +[namex](https://pypi.org/project/namex) | 0.0.8 | A simple utility to separate the implementation of your Python package and its public API surface. +[narwhals](https://pypi.org/project/narwhals) | 1.36.0 | Extremely lightweight compatibility layer between dataframe libraries +[nbclient](https://pypi.org/project/nbclient) | 0.10.2 | A client library for executing notebooks. Formerly nbconvert's ExecutePreprocessor. +[nbconvert](https://pypi.org/project/nbconvert) | 7.16.6 | Converting Jupyter Notebooks (.ipynb files) to other formats. Output formats include asciidoc, html, latex, markdown, pdf, py, rst, script. +[nbformat](https://pypi.org/project/nbformat) | 5.10.4 | The Jupyter Notebook format +[nest-asyncio](https://pypi.org/project/nest-asyncio) | 1.6.0 | Patch asyncio to allow nested event loops +[networkx](https://pypi.org/project/networkx) | 3.4.2 | Python package for creating and manipulating graphs and networks +[nh3](https://pypi.org/project/nh3) | 0.2.18 | Python bindings to the ammonia HTML sanitization library. +[nltk](https://pypi.org/project/nltk) | 3.9.1 | Natural Language Toolkit +[notebook](https://pypi.org/project/notebook) | 7.4.2 | Jupyter Notebook - A web-based notebook environment for interactive computing +[notebook-shim](https://pypi.org/project/notebook-shim) | 0.2.4 | A shim layer for notebook traits and config +[numba](https://pypi.org/project/numba) | 0.61.2 | compiling Python code using LLVM +[numpy](https://pypi.org/project/numpy) | 2.2.6 | Fundamental package for array computing in Python +[numpydoc](https://pypi.org/project/numpydoc) | 1.8.0 | Sphinx extension to support docstrings in Numpy format +[openai](https://pypi.org/project/openai) | 1.82.0 | The official Python library for the openai API +[opencv-python](https://pypi.org/project/opencv-python) | 4.11.0.86 | Wrapper package for OpenCV python bindings. +[openpyxl](https://pypi.org/project/openpyxl) | 3.1.5 | A Python library to read/write Excel 2010 xlsx/xlsm files +[opentelemetry-api](https://pypi.org/project/opentelemetry-api) | 1.32.1 | OpenTelemetry Python API +[optree](https://pypi.org/project/optree) | 0.14.1 | Optimized PyTree Utilities. +[optuna](https://pypi.org/project/optuna) | 4.2.1 | A hyperparameter optimization framework +[orjson](https://pypi.org/project/orjson) | 3.10.16 | Fast, correct Python JSON library supporting dataclasses, datetimes, and numpy +[osqp](https://pypi.org/project/osqp) | 0.6.7.post3 | OSQP: The Operator Splitting QP Solver +[outcome](https://pypi.org/project/outcome) | 1.3.0.post0 | Capture the outcome of Python function calls. +[overrides](https://pypi.org/project/overrides) | 7.7.0 | A decorator to automatically detect mismatch when overriding a method. +[packaging](https://pypi.org/project/packaging) | 24.2 | Core utilities for Python packages +[pandas](https://pypi.org/project/pandas) | 2.2.3 | Powerful data structures for data analysis, time series, and statistics +[pandocfilters](https://pypi.org/project/pandocfilters) | 1.5.1 | Utilities for writing pandoc filters in python +[panel](https://pypi.org/project/panel) | 1.6.3 | The powerful data exploration & web app framework for Python. +[papermill](https://pypi.org/project/papermill) | 2.6.0 | Parameterize and run Jupyter and nteract Notebooks +[param](https://pypi.org/project/param) | 2.2.0 | Make your Python code clearer and more reliable by declaring Parameters. +[parso](https://pypi.org/project/parso) | 0.8.4 | A Python Parser +[partd](https://pypi.org/project/partd) | 1.4.2 | Appendable key-value storage +[pathspec](https://pypi.org/project/pathspec) | 0.12.1 | Utility library for gitignore style pattern matching of file paths. +[patsy](https://pypi.org/project/patsy) | 1.0.1 | A Python package for describing statistical models and for building design matrices. +[pep8](https://pypi.org/project/pep8) | 1.7.1 | Python style guide checker +[pexpect](https://pypi.org/project/pexpect) | 4.9.0 | Pexpect allows easy control of interactive console applications. +[pg8000](https://pypi.org/project/pg8000) | 1.31.2 | PostgreSQL interface library +[pickleshare](https://pypi.org/project/pickleshare) | 0.7.5 | Tiny 'shelve'-like database with concurrency support +[pillow](https://pypi.org/project/pillow) | 11.1.0 | Python Imaging Library (Fork) +[pip](https://pypi.org/project/pip) | 25.1.1 | The PyPA recommended tool for installing Python packages. +[platformdirs](https://pypi.org/project/platformdirs) | 4.3.7 | A small Python package for determining appropriate platform-specific dirs, e.g. a `user data dir`. +[plotly](https://pypi.org/project/plotly) | 6.0.1 | An open-source interactive data visualization library for Python +[plotnine](https://pypi.org/project/plotnine) | 0.13.6 | A Grammar of Graphics for Python +[plotpy](https://pypi.org/project/plotpy) | 2.7.4 | Curve and image plotting tools for Python/Qt applications +[pluggy](https://pypi.org/project/pluggy) | 1.5.0 | plugin and hook calling mechanisms for python +[ply](https://pypi.org/project/ply) | 3.11 | Python Lex & Yacc +[polars](https://pypi.org/project/polars) | 1.31.0 | Blazingly fast DataFrame library +[portalocker](https://pypi.org/project/portalocker) | 2.7.0 | Wraps the portalocker recipe for easy usage +[prettytable](https://pypi.org/project/prettytable) | 3.16.0 | A simple Python library for easily displaying tabular data in a visually appealing ASCII table format +[prince](https://pypi.org/project/prince) | 0.16.0 | Factor analysis in Python: PCA, CA, MCA, MFA, FAMD, GPA +[priority](https://pypi.org/project/priority) | 2.0.0 | A pure-Python implementation of the HTTP/2 priority tree +[prometheus-client](https://pypi.org/project/prometheus-client) | 0.21.1 | Python client for the Prometheus monitoring system. +[prompt-toolkit](https://pypi.org/project/prompt-toolkit) | 3.0.51 | Library for building powerful interactive command lines in Python +[propcache](https://pypi.org/project/propcache) | 0.3.1 | Accelerated property cache +[protobuf](https://pypi.org/project/protobuf) | 6.30.2 | +[psutil](https://pypi.org/project/psutil) | 7.0.0 | Cross-platform lib for process and system monitoring in Python. NOTE: the syntax of this script MUST be kept compatible with Python 2.7. +[psygnal](https://pypi.org/project/psygnal) | 0.12.0 | Fast python callback/event system modeled after Qt Signals +[ptpython](https://pypi.org/project/ptpython) | 3.0.29 | Python REPL build on top of prompt_toolkit +[ptyprocess](https://pypi.org/project/ptyprocess) | 0.7.0 | Run a subprocess in a pseudo terminal +[pure-eval](https://pypi.org/project/pure-eval) | 0.2.3 | Safely evaluate AST nodes without side effects +[pyarrow](https://pypi.org/project/pyarrow) | 20.0.0 | Python library for Apache Arrow +[pyasn1](https://pypi.org/project/pyasn1) | 0.6.1 | Pure-Python implementation of ASN.1 types and DER/BER/CER codecs (X.208) +[pyasn1-modules](https://pypi.org/project/pyasn1-modules) | 0.4.1 | A collection of ASN.1-based protocols modules +[pybind11](https://pypi.org/project/pybind11) | 2.13.6 | Seamless operability between C++11 and Python +[pycodestyle](https://pypi.org/project/pycodestyle) | 2.12.0 | Python style guide checker +[pycparser](https://pypi.org/project/pycparser) | 2.22 | C parser in Python +[pyct](https://pypi.org/project/pyct) | 0.5.0 | Python package common tasks for users (e.g. copy examples, fetch data, ...) +[pydantic](https://pypi.org/project/pydantic) | 2.10.6 | Data validation using Python type hints +[pydantic-ai-slim](https://pypi.org/project/pydantic-ai-slim) | 0.2.9 | Agent Framework / shim to use Pydantic with LLMs, slim package +[pydantic-core](https://pypi.org/project/pydantic-core) | 2.27.2 | Core functionality for Pydantic validation and serialization +[pydantic-evals](https://pypi.org/project/pydantic-evals) | 0.2.9 | Framework for evaluating stochastic code execution, especially code making use of LLMs +[pydantic-graph](https://pypi.org/project/pydantic-graph) | 0.2.9 | Graph and state machine library +[pydantic-settings](https://pypi.org/project/pydantic-settings) | 2.8.1 | Settings management using Pydantic +[pydeck](https://pypi.org/project/pydeck) | 0.9.1 | Widget for deck.gl maps +[pydocstyle](https://pypi.org/project/pydocstyle) | 6.3.0 | Python docstring style checker +[pydub](https://pypi.org/project/pydub) | 0.25.1 | Manipulate audio with an simple and easy high level interface +[pyerfa](https://pypi.org/project/pyerfa) | 2.0.1.5 | Python bindings for ERFA +[pyflakes](https://pypi.org/project/pyflakes) | 3.2.0 | passive checker of Python programs +[pygithub](https://pypi.org/project/pygithub) | 2.6.1 | Use the full Github API v3 +[pygments](https://pypi.org/project/pygments) | 2.19.1 | Pygments is a syntax highlighting package written in Python. +[pyjwt](https://pypi.org/project/pyjwt) | 2.10.1 | JSON Web Token implementation in Python +[pylint](https://pypi.org/project/pylint) | 3.3.6 | python code static checker +[pylint-venv](https://pypi.org/project/pylint-venv) | 3.0.4 | pylint-venv provides a Pylint init-hook to use the same Pylint installation with different virtual environments. +[pyls-spyder](https://pypi.org/project/pyls-spyder) | 0.4.0 | Spyder extensions for the python-lsp-server +[pymongo](https://pypi.org/project/pymongo) | 4.10.1 | Python driver for MongoDB +[pympler](https://pypi.org/project/pympler) | 1.1 | A development tool to measure, monitor and analyze the memory behavior of Python objects. +[pynacl](https://pypi.org/project/pynacl) | 1.5.0 | Python binding to the Networking and Cryptography (NaCl) library +[pynndescent](https://pypi.org/project/pynndescent) | 0.5.13 | Nearest Neighbor Descent +[pyodbc](https://pypi.org/project/pyodbc) | 5.2.0 | DB API module for ODBC +[pyogrio](https://pypi.org/project/pyogrio) | 0.10.0 | Vectorized spatial vector file format I/O using GDAL/OGR +[pyomo](https://pypi.org/project/pyomo) | 6.9.2 | Pyomo: Python Optimization Modeling Objects +[pypandoc](https://pypi.org/project/pypandoc) | 1.15 | Thin wrapper for pandoc. +[pyparsing](https://pypi.org/project/pyparsing) | 3.2.3 | pyparsing module - Classes and methods to define and execute parsing grammars +[pypdf](https://pypi.org/project/pypdf) | 5.4.0 | A pure-python PDF library capable of splitting, merging, cropping, and transforming PDF files +[pyproj](https://pypi.org/project/pyproj) | 3.7.0 | Python interface to PROJ (cartographic projections and coordinate transformations library) +[pyproject-hooks](https://pypi.org/project/pyproject-hooks) | 1.2.0 | Wrappers to call pyproject.toml-based build backend hooks. +[pyqt5](https://pypi.org/project/pyqt5) | 5.15.11 | Python bindings for the Qt cross platform application toolkit +[pyqt5-qt5](https://pypi.org/project/pyqt5-qt5) | 5.15.2 | The subset of a Qt installation needed by PyQt5. +[pyqt5-sip](https://pypi.org/project/pyqt5-sip) | 12.17.0 | The sip module support for PyQt5 +[pyqtgraph](https://pypi.org/project/pyqtgraph) | 0.13.7 | Scientific Graphics and GUI Library for Python +[pyqtwebengine](https://pypi.org/project/pyqtwebengine) | 5.15.7 | Python bindings for the Qt WebEngine framework +[pyqtwebengine-qt5](https://pypi.org/project/pyqtwebengine-qt5) | 5.15.2 | The subset of a Qt installation needed by PyQtWebEngine. +[pyserial](https://pypi.org/project/pyserial) | 3.5 | Python Serial Port Extension +[pysocks](https://pypi.org/project/pysocks) | 1.7.1 | A Python SOCKS client module. See https://github.com/Anorov/PySocks for more information. +[pyspnego](https://pypi.org/project/pyspnego) | 0.11.2 | Windows Negotiate Authentication Client and Server +[pytest](https://pypi.org/project/pytest) | 8.3.5 | pytest: simple powerful testing with Python +[python-barcode](https://pypi.org/project/python-barcode) | 0.15.1 | Create standard barcodes with Python. No external modules needed. (optional Pillow support included). +[python-dateutil](https://pypi.org/project/python-dateutil) | 2.8.2 | Extensions to the standard Python datetime module +[python-dotenv](https://pypi.org/project/python-dotenv) | 1.1.0 | Read key-value pairs from a .env file and set them as environment variables +[python-json-logger](https://pypi.org/project/python-json-logger) | 3.3.0 | JSON Log Formatter for the Python Logging Package +[python-lsp-black](https://pypi.org/project/python-lsp-black) | 2.0.0 | Black plugin for the Python LSP Server +[python-lsp-jsonrpc](https://pypi.org/project/python-lsp-jsonrpc) | 1.1.2 | JSON RPC 2.0 server library +[python-lsp-server](https://pypi.org/project/python-lsp-server) | 1.12.2 | Python Language Server for the Language Server Protocol +[python-multipart](https://pypi.org/project/python-multipart) | 0.0.20 | A streaming multipart parser for Python +[python-slugify](https://pypi.org/project/python-slugify) | 8.0.4 | A Python slugify application that also handles Unicode +[pythonqwt](https://pypi.org/project/pythonqwt) | 0.14.5 | Qt plotting widgets for Python +[pytoolconfig](https://pypi.org/project/pytoolconfig) | 1.3.1 | Python tool configuration +[pytz](https://pypi.org/project/pytz) | 2025.2 | World timezone definitions, modern and historical +[pyuca](https://pypi.org/project/pyuca) | 1.2 | a Python implementation of the Unicode Collation Algorithm +[pyusb](https://pypi.org/project/pyusb) | 1.3.1 | Easy USB access for Python +[pyviz-comms](https://pypi.org/project/pyviz-comms) | 3.0.4 | A JupyterLab extension for rendering HoloViz content. +[pywavelets](https://pypi.org/project/pywavelets) | 1.8.0 | PyWavelets, wavelet transform module +[pywin32](https://pypi.org/project/pywin32) | 310 | Python for Window Extensions +[pywin32-ctypes](https://pypi.org/project/pywin32-ctypes) | 0.2.3 | A (partial) reimplementation of pywin32 using ctypes/cffi +[pywinpty](https://pypi.org/project/pywinpty) | 2.0.15 | Pseudo terminal support for Windows from Python. +[pyyaml](https://pypi.org/project/pyyaml) | 6.0.2 | YAML parser and emitter for Python +[pyzmq](https://pypi.org/project/pyzmq) | 26.4.0 | Python bindings for 0MQ +[qdarkstyle](https://pypi.org/project/qdarkstyle) | 3.2.3 | The most complete dark/light style sheet for C++/Python and Qt applications +[qdldl](https://pypi.org/project/qdldl) | 0.1.7.post5 | QDLDL, a free LDL factorization routine. +[qrcode](https://pypi.org/project/qrcode) | 8.0 | QR Code image generator +[qstylizer](https://pypi.org/project/qstylizer) | 0.2.4 | Stylesheet Generator for PyQt{4-5}/PySide{1-2} +[qtawesome](https://pypi.org/project/qtawesome) | 1.4.0 | FontAwesome icons in PyQt and PySide applications +[qtconsole](https://pypi.org/project/qtconsole) | 5.6.1 | Jupyter Qt console +[qtpy](https://pypi.org/project/qtpy) | 2.4.3 | Provides an abstraction layer on top of the various Qt bindings (PyQt5/6 and PySide2/6). +[quantecon](https://pypi.org/project/quantecon) | 0.7.2 | Import the main names to top level. +[quart](https://pypi.org/project/quart) | 0.20.0 | A Python ASGI web framework with the same API as Flask +[rapidfuzz](https://pypi.org/project/rapidfuzz) | 3.13.0 | rapid fuzzy string matching +[readme-renderer](https://pypi.org/project/readme-renderer) | 44.0 | readme_renderer is a library for rendering readme descriptions for Warehouse +[redis](https://pypi.org/project/redis) | 5.2.1 | Python client for Redis database and key-value store +[referencing](https://pypi.org/project/referencing) | 0.36.2 | JSON Referencing + Python +[regex](https://pypi.org/project/regex) | 2024.11.6 | Alternative regular expression module, to replace re. +[reportlab](https://pypi.org/project/reportlab) | 4.3.1 | The Reportlab Toolkit +[requests](https://pypi.org/project/requests) | 2.32.3 | Python HTTP for Humans. +[requests-ntlm](https://pypi.org/project/requests-ntlm) | 1.3.0 | This package allows for HTTP NTLM authentication using the requests library. +[requests-toolbelt](https://pypi.org/project/requests-toolbelt) | 1.0.0 | A utility belt for advanced users of python-requests +[rfc3339-validator](https://pypi.org/project/rfc3339-validator) | 0.1.4 | A pure python RFC3339 validator +[rfc3986](https://pypi.org/project/rfc3986) | 2.0.0 | Validating URI References per RFC 3986 +[rfc3986-validator](https://pypi.org/project/rfc3986-validator) | 0.1.1 | Pure python rfc3986 validator +[rich](https://pypi.org/project/rich) | 14.0.0 | Render rich text, tables, progress bars, syntax highlighting, markdown and more to the terminal +[rope](https://pypi.org/project/rope) | 1.13.0 | a python refactoring library... +[rpds-py](https://pypi.org/project/rpds-py) | 0.24.0 | Python bindings to Rust's persistent data structures (rpds) +[rsa](https://pypi.org/project/rsa) | 4.7.2 | Pure-Python RSA implementation +[rtree](https://pypi.org/project/rtree) | 1.4.0 | R-Tree spatial index for Python GIS +[rx](https://pypi.org/project/rx) | 3.2.0 | Reactive Extensions (Rx) for Python +[scikit-image](https://pypi.org/project/scikit-image) | 0.25.2 | Image processing in Python +[scikit-learn](https://pypi.org/project/scikit-learn) | 1.6.1 | A set of python modules for machine learning and data mining +[scipy](https://pypi.org/project/scipy) | 1.15.3 | Fundamental algorithms for scientific computing in Python +[scramp](https://pypi.org/project/scramp) | 1.4.5 | An implementation of the SCRAM protocol. +[scs](https://pypi.org/project/scs) | 3.2.7.post2 | Splitting conic solver +[seaborn](https://pypi.org/project/seaborn) | 0.13.2 | Statistical data visualization +[send2trash](https://pypi.org/project/send2trash) | 1.8.3 | Send file to trash natively under Mac OS X, Windows and Linux +[setuptools](https://pypi.org/project/setuptools) | 79.0.1 | Easily download, build, install, upgrade, and uninstall Python packages +[shapely](https://pypi.org/project/shapely) | 2.1.0 | Manipulation and analysis of geometric objects +[shellingham](https://pypi.org/project/shellingham) | 1.5.4 | Tool to Detect Surrounding Shell +[simplejson](https://pypi.org/project/simplejson) | 3.19.3 | Simple, fast, extensible JSON encoder/decoder for Python +[simpy](https://pypi.org/project/simpy) | 4.1.1 | Event discrete, process based simulation for Python. +[six](https://pypi.org/project/six) | 1.17.0 | Python 2 and 3 compatibility utilities +[sklearn-compat](https://pypi.org/project/sklearn-compat) | 0.1.3 | Ease support for compatible scikit-learn estimators across versions +[skrub](https://pypi.org/project/skrub) | 0.5.3 | Prepping tables for machine learning +[smmap](https://pypi.org/project/smmap) | 5.0.2 | A pure Python implementation of a sliding window memory map manager +[sniffio](https://pypi.org/project/sniffio) | 1.3.1 | Sniff out which async library your code is running under +[snowballstemmer](https://pypi.org/project/snowballstemmer) | 2.2.0 | This package provides 29 stemmers for 28 languages generated from Snowball algorithms. +[sortedcontainers](https://pypi.org/project/sortedcontainers) | 2.4.0 | Sorted Containers -- Sorted List, Sorted Dict, Sorted Set +[sounddevice](https://pypi.org/project/sounddevice) | 0.5.1 | Play and Record Sound with Python +[soupsieve](https://pypi.org/project/soupsieve) | 2.6 | A modern CSS selector implementation for Beautiful Soup. +[sphinx](https://pypi.org/project/sphinx) | 8.1.3 | Python documentation generator +[sphinx-rtd-theme](https://pypi.org/project/sphinx-rtd-theme) | 3.0.2 | Read the Docs theme for Sphinx +[sphinxcontrib-applehelp](https://pypi.org/project/sphinxcontrib-applehelp) | 2.0.0 | sphinxcontrib-applehelp is a Sphinx extension which outputs Apple help books +[sphinxcontrib-devhelp](https://pypi.org/project/sphinxcontrib-devhelp) | 2.0.0 | sphinxcontrib-devhelp is a sphinx extension which outputs Devhelp documents +[sphinxcontrib-htmlhelp](https://pypi.org/project/sphinxcontrib-htmlhelp) | 2.1.0 | sphinxcontrib-htmlhelp is a sphinx extension which renders HTML help files +[sphinxcontrib-jquery](https://pypi.org/project/sphinxcontrib-jquery) | 4.1 | Extension to include jQuery on newer Sphinx releases +[sphinxcontrib-jsmath](https://pypi.org/project/sphinxcontrib-jsmath) | 1.0.1 | A sphinx extension which renders display math in HTML via JavaScript +[sphinxcontrib-qthelp](https://pypi.org/project/sphinxcontrib-qthelp) | 2.0.0 | sphinxcontrib-qthelp is a sphinx extension which outputs QtHelp documents +[sphinxcontrib-serializinghtml](https://pypi.org/project/sphinxcontrib-serializinghtml) | 2.0.0 | sphinxcontrib-serializinghtml is a sphinx extension which outputs "serialized" HTML files (json and pickle) +[spyder](https://pypi.org/project/spyder) | 6.0.7 | The Scientific Python Development Environment +[spyder-kernels](https://pypi.org/project/spyder-kernels) | 3.0.5 | Jupyter kernels for Spyder's console +[sqlalchemy](https://pypi.org/project/sqlalchemy) | 2.0.40 | Database Abstraction Library +[sqlite-bro](https://pypi.org/project/sqlite-bro) | 0.13.1 | a graphic SQLite Client in 1 Python file +[sqlite-fts4](https://pypi.org/project/sqlite-fts4) | 1.0.3 | Python functions for working with SQLite FTS4 search +[sqlite-utils](https://pypi.org/project/sqlite-utils) | 3.38 | CLI tool and Python library for manipulating SQLite databases +[sqlparse](https://pypi.org/project/sqlparse) | 0.5.3 | A non-validating SQL parser. +[squarify](https://pypi.org/project/squarify) | 0.4.4 | Pure Python implementation of the squarify treemap layout algorithm +[sse-starlette](https://pypi.org/project/sse-starlette) | 2.2.1 | SSE plugin for Starlette +[sspilib](https://pypi.org/project/sspilib) | 0.2.0 | SSPI API bindings for Python +[stack-data](https://pypi.org/project/stack-data) | 0.6.3 | Extract data from python stack frames and tracebacks for informative displays +[starlette](https://pypi.org/project/starlette) | 0.46.2 | The little ASGI library that shines. +[statsmodels](https://pypi.org/project/statsmodels) | 0.14.4 | Statistical computations and models for Python +[streamlit](https://pypi.org/project/streamlit) | 1.46.0 | A faster way to build and share data apps +[superqt](https://pypi.org/project/superqt) | 0.7.3 | Missing widgets and components for PyQt/PySide +[sv-ttk](https://pypi.org/project/sv-ttk) | 2.6.0 | A gorgeous theme for Tkinter, based on Windows 11's UI +[sympy](https://pypi.org/project/sympy) | 1.14.0 | Computer algebra system (CAS) in Python +[tabulate](https://pypi.org/project/tabulate) | 0.9.0 | Pretty-print tabular data +[tblib](https://pypi.org/project/tblib) | 3.1.0 | Traceback serialization library. +[tenacity](https://pypi.org/project/tenacity) | 9.1.2 | Retry code until it succeeds +[termcolor](https://pypi.org/project/termcolor) | 3.1.0 | ANSI color formatting for output in terminal +[terminado](https://pypi.org/project/terminado) | 0.18.1 | Tornado websocket backend for the Xterm.js Javascript terminal emulator library. +[text-unidecode](https://pypi.org/project/text-unidecode) | 1.3 | The most basic Text::Unidecode port +[textdistance](https://pypi.org/project/textdistance) | 4.6.3 | Compute distance between the two texts. +[thefuzz](https://pypi.org/project/thefuzz) | 0.22.1 | Fuzzy string matching in python +[threadpoolctl](https://pypi.org/project/threadpoolctl) | 3.6.0 | threadpoolctl +[three-merge](https://pypi.org/project/three-merge) | 0.1.1 | Simple library for merging two strings with respect to a base one +[tifffile](https://pypi.org/project/tifffile) | 2025.3.30 | Read and write TIFF files +[tiktoken](https://pypi.org/project/tiktoken) | 0.9.0 | tiktoken is a fast BPE tokeniser for use with OpenAI's models +[tinycss2](https://pypi.org/project/tinycss2) | 1.4.0 | A tiny CSS parser +[tokenizers](https://pypi.org/project/tokenizers) | 0.21.1 | +[toml](https://pypi.org/project/toml) | 0.10.2 | Python Library for Tom's Obvious, Minimal Language +[tomli](https://pypi.org/project/tomli) | 2.2.1 | A lil' TOML parser +[tomli-w](https://pypi.org/project/tomli-w) | 1.2.0 | A lil' TOML writer +[tomlkit](https://pypi.org/project/tomlkit) | 0.13.2 | Style preserving TOML library +[toolz](https://pypi.org/project/toolz) | 1.0.0 | List processing tools and functional utilities +[tornado](https://pypi.org/project/tornado) | 6.5.1 | Tornado is a Python web framework and asynchronous networking library, originally developed at FriendFeed. +[tqdm](https://pypi.org/project/tqdm) | 4.67.1 | Fast, Extensible Progress Meter +[traitlets](https://pypi.org/project/traitlets) | 5.14.3 | Traitlets Python configuration system +[traittypes](https://pypi.org/project/traittypes) | 0.2.1 | Scipy trait types +[trio](https://pypi.org/project/trio) | 0.30.0 | A friendly Python library for async concurrency and I/O +[trove-classifiers](https://pypi.org/project/trove-classifiers) | 2025.5.9.12 | Canonical source for classifiers on PyPI (pypi.org). +[twine](https://pypi.org/project/twine) | 6.1.0 | Collection of utilities for publishing packages on PyPI +[typer](https://pypi.org/project/typer) | 0.15.2 | Typer, build great CLIs. Easy to code. Based on Python type hints. +[types-python-dateutil](https://pypi.org/project/types-python-dateutil) | 2.9.0.20240316 | Typing stubs for python-dateutil +[types-requests](https://pypi.org/project/types-requests) | 2.32.0.20250328 | Typing stubs for requests +[typing-extensions](https://pypi.org/project/typing-extensions) | 4.13.2 | Backported and Experimental Type Hints for Python 3.8+ +[typing-inspection](https://pypi.org/project/typing-inspection) | 0.4.0 | Runtime typing introspection tools +[tzdata](https://pypi.org/project/tzdata) | 2025.2 | Provider of IANA time zone data +[tzlocal](https://pypi.org/project/tzlocal) | 5.3.1 | tzinfo object for the local timezone +[uc-micro-py](https://pypi.org/project/uc-micro-py) | 1.0.3 | Micro subset of unicode data files for linkify-it-py projects. +[ujson](https://pypi.org/project/ujson) | 5.10.0 | Ultra fast JSON encoder and decoder for Python +[umap-learn](https://pypi.org/project/umap-learn) | 0.5.7 | Uniform Manifold Approximation and Projection +[uncertainties](https://pypi.org/project/uncertainties) | 3.2.2 | calculations with values with uncertainties, error propagation +[uri-template](https://pypi.org/project/uri-template) | 1.3.0 | RFC 6570 URI Template Processor +[urllib3](https://pypi.org/project/urllib3) | 2.4.0 | HTTP library with thread-safe connection pooling, file post, and more. +[uvicorn](https://pypi.org/project/uvicorn) | 0.34.2 | The lightning-fast ASGI server. +[vega-datasets](https://pypi.org/project/vega-datasets) | 0.9.0 | A Python package for offline access to Vega datasets +[waitress](https://pypi.org/project/waitress) | 3.0.0 | Waitress WSGI server +[watchdog](https://pypi.org/project/watchdog) | 6.0.0 | Filesystem events monitoring +[wcwidth](https://pypi.org/project/wcwidth) | 0.2.13 | Measures the displayed width of unicode strings in a terminal +[webcolors](https://pypi.org/project/webcolors) | 24.11.1 | A library for working with the color formats defined by HTML and CSS. +[webencodings](https://pypi.org/project/webencodings) | 0.5.1 | Character encoding aliases for legacy web content +[websocket-client](https://pypi.org/project/websocket-client) | 1.8.0 | WebSocket client for Python with low level API options +[websockets](https://pypi.org/project/websockets) | 14.2 | An implementation of the WebSocket Protocol (RFC 6455 & 7692) +[werkzeug](https://pypi.org/project/werkzeug) | 3.1.3 | The comprehensive WSGI web application library. +[whatthepatch](https://pypi.org/project/whatthepatch) | 1.0.7 | A patch parsing and application library. +[wheel](https://pypi.org/project/wheel) | 0.45.1 | A built-package format for Python +[widgetsnbextension](https://pypi.org/project/widgetsnbextension) | 4.0.14 | Jupyter interactive widgets for Jupyter Notebook +[winpython](https://pypi.org/project/winpython) | 16.6.20250620 | WinPython distribution tools, including WPPM +[wordcloud](https://pypi.org/project/wordcloud) | 1.9.4 | A little word cloud generator +[wrapt](https://pypi.org/project/wrapt) | 1.16.0 | Module for decorators, wrappers and monkey patching. +[wsproto](https://pypi.org/project/wsproto) | 1.2.0 | WebSockets state-machine based protocol implementation +[xarray](https://pypi.org/project/xarray) | 2025.4.0 | N-D labeled arrays and datasets in Python +[xlsxwriter](https://pypi.org/project/xlsxwriter) | 3.2.3 | A Python module for creating Excel XLSX files. +[xyzservices](https://pypi.org/project/xyzservices) | 2023.10.1 | Source of XYZ tiles providers +[yapf](https://pypi.org/project/yapf) | 0.40.1 | A formatter for Python code. +[yarl](https://pypi.org/project/yarl) | 1.18.3 | Yet another URL library +[yt-dlp](https://pypi.org/project/yt-dlp) | 2025.2.19 | A feature-rich command-line audio/video downloader +[zict](https://pypi.org/project/zict) | 3.0.0 | Mutable mapping tools +[zipp](https://pypi.org/project/zipp) | 3.21.0 | Backport of pathlib-compatible object wrapper for zip files +[zstandard](https://pypi.org/project/zstandard) | 0.23.0 | Zstandard bindings for Python + + +### WheelHouse packages + +Name | Version | Description +-----|---------|------------ + + +
    diff --git a/changelogs/WinPythonslim-64bit-3.12.10.1_History.md b/changelogs/WinPythonslim-64bit-3.12.10.1_History.md new file mode 100644 index 00000000..27c73ef0 --- /dev/null +++ b/changelogs/WinPythonslim-64bit-3.12.10.1_History.md @@ -0,0 +1,201 @@ +## History of changes for WinPython-64bit 3.12.10.1slim + +The following changes were made to WinPython-64bit distribution since version 3.12.10.0slim. + + +
    + +### Tools + + +New packages: + * Python 3.12.10 (Python programming language with standard library) + +### Python packages + + +New packages: + * argcomplete 3.6.2 (Bash tab completion for argparse) + * bcrypt 4.3.0 (Modern password hashing for your software and your servers) + * fasta2a 0.2.9 (Convert an AI Agent into a A2A server! ✨) + * google-genai 1.16.1 (GenAI Python SDK) + * mcp 1.9.3 (Model Context Protocol SDK) + * opentelemetry-api 1.32.1 (OpenTelemetry Python API) + * pydantic-evals 0.2.9 (Framework for evaluating stochastic code execution, especially code making use of LLMs) + * pydantic-settings 2.8.1 (Settings management using Pydantic) + * sse-starlette 2.2.1 (SSE plugin for Starlette) + * typing-inspection 0.4.0 (Runtime typing introspection tools) + * websockets 14.2 (An implementation of the WebSocket Protocol (RFC 6455 & 7692)) + +Upgraded packages: + * aiohappyeyeballs 2.4.4 → 2.6.1 (Happy Eyeballs for asyncio) + * aiohttp 3.11.11 → 3.11.18 (Async http client/server framework (asyncio)) + * aiosignal 1.3.1 → 1.3.2 (aiosignal: a list of registered asynchronous callbacks) + * alembic 1.15.1 → 1.15.2 (A database migration tool for SQLAlchemy.) + * anthropic 0.49.0 → 0.51.0 (The official Python library for the anthropic API) + * anyio 4.8.0 → 4.9.0 (High level compatibility layer for multiple asynchronous event loop implementations) + * anywidget 0.9.12 → 0.9.18 (custom jupyter widgets made easy) + * asteval 0.9.31 → 1.0.5 (Safe, minimalistic evaluator of python expression using ast module) + * astroid 3.1.0 → 3.3.9 (An abstract syntax tree for Python with inference support.) + * asttokens 2.4.1 → 3.0.0 (Annotate AST trees with source code positions) + * attrs 23.2.0 → 25.3.0 (Classes Without Boilerplate) + * babel 2.16.0 → 2.17.0 (Internationalization utilities) + * beautifulsoup4 4.12.2 → 4.13.3 (Screen-scraping library) + * bleach 6.1.0 → 6.2.0 (An easy safelist-based HTML-sanitizing tool.) + * bokeh 3.7.2 → 3.7.3 (Interactive plots and applications in the browser from Python) + * branca 0.8.0 → 0.8.1 (Generate complex HTML+JS pages with Python) + * cohere 5.13.12 → 5.15.0 () + * colorlog 6.8.2 → 6.9.0 (Add colours to the output of Python's logging module.) + * contourpy 1.3.1 → 1.3.2 (Python library for calculating contours of 2D quadrilateral grids) + * cython 3.0.12 → 3.1.1 (The Cython compiler for writing C extensions in the Python language.) + * dask 2025.3.0 → 2025.4.1 (Parallel PyData with Task Scheduling) + * debugpy 1.8.0 → 1.8.13 (An implementation of the Debug Adapter Protocol for Python) + * decorator 5.1.1 → 5.2.1 (Decorators for Humans) + * dill 0.3.9 → 0.4.0 (serialize all of Python) + * distributed 2025.3.0 → 2025.4.1 (Distributed scheduler for Dask) + * distro 1.8.0 → 1.9.0 (Distro - an OS platform information API) + * django 5.0.7 → 5.2 (A high-level Python web framework that encourages rapid development and clean, pragmatic design.) + * dnspython 2.6.1 → 2.7.0 (DNS toolkit) + * duckdb 1.2.2 → 1.3.0 (DuckDB in-process database) + * executing 2.0.1 → 2.2.0 (Get the currently executing AST node of a frame, and other information) + * faker 36.1.1 → 37.1.0 (Faker is a Python package that generates fake data for you.) + * fastapi 0.115.8 → 0.115.12 (FastAPI framework, high performance, easy to learn, fast to code, ready for production) + * fastjsonschema 2.18.0 → 2.21.1 (Fastest Python implementation of JSON schema) + * filelock 3.17.0 → 3.18.0 (A platform independent file lock.) + * flit 3.10.1 → 3.12.0 (A simple packaging tool for simple packages.) + * fonttools 4.55.3 → 4.57.0 (Tools to manipulate font files) + * fsspec 2024.6.1 → 2025.3.2 (File-system specification) + * gitdb 4.0.10 → 4.0.12 (Git Object Database) + * gitpython 3.1.32 → 3.1.44 (GitPython is a Python library used to interact with Git repositories) + * graphene 3.3 → 3.4.3 (GraphQL Framework for Python) + * griffe 1.5.5 → 1.7.2 (Signatures for entire Python programs.) + * groq 0.13.1 → 0.25.0 (The official Python library for the groq API) + * guidata 3.7.1 → 3.9.0 (Automatic GUI generation for easy dataset editing and display) + * h2 4.1.0 → 4.2.0 (Pure-Python HTTP/2 protocol implementation) + * httpcore 1.0.5 → 1.0.7 (A minimal low-level HTTP client.) + * httpx 0.27.2 → 0.28.1 (The next generation HTTP client.) + * hupper 1.12 → 1.12.1 (Integrated process monitor for developing and reloading daemons.) + * iniconfig 2.0.0 → 2.1.0 (brain-dead simple config-ini parsing) + * intervaltree 3.0.2 → 3.1.0 (Editable interval tree data structure for Python 2 and 3) + * ipython 8.34.0 → 8.36.0 (IPython: Productive Interactive Computing) + * jinja2 3.1.2 → 3.1.6 (A very fast and expressive template engine.) + * jiter 0.8.2 → 0.9.0 (Fast iterable JSON parser.) + * json5 0.9.14 → 0.10.0 (A Python implementation of the JSON5 data format.) + * jsonpointer 2.4 → 3.0.0 (Identify specific nodes in a JSON document (RFC 6901)) + * jsonschema 4.19.2 → 4.23.0 (An implementation of JSON Schema validation for Python) + * jupyterlab 4.4.1 → 4.4.2 (JupyterLab computational environment) + * keras 3.9.2 → 3.10.0 (Multi-backend Keras) + * langchain 0.3.23 → 0.3.25 (Building applications with LLMs through composability) + * langsmith 0.3.24 → 0.3.42 (Client library to connect to the LangSmith LLM Tracing and Evaluation Platform.) + * lmfit 1.3.1 → 1.3.3 (Least-Squares Minimization with Bounds and Constraints) + * mako 1.3.5 → 1.3.9 (A super-fast templating language that borrows the best ideas from the existing templating languages.) + * matplotlib 3.10.1 → 3.10.3 (Python plotting package) + * maturin 1.8.1 → 1.8.3 (Build and publish crates with pyo3, cffi and uniffi bindings as well as rust binaries as python packages) + * missingno 0.5.1 → 0.5.2 (Missing data visualization module for Python.) + * mistralai 1.2.5 → 1.8.1 (Python Client SDK for the Mistral AI API.) + * mistune 2.0.5 → 3.1.3 (A sane and fast Markdown parser with useful plugins and renderers) + * mpld3 0.5.8 → 0.5.10 (D3 Viewer for Matplotlib) + * multidict 6.1.0 → 6.4.3 (multidict implementation) + * narwhals 1.30.0 → 1.36.0 (Extremely lightweight compatibility layer between dataframe libraries) + * nbclient 0.10.0 → 0.10.2 (A client library for executing notebooks. Formerly nbconvert's ExecutePreprocessor.) + * nbconvert 7.16.1 → 7.16.6 (Converting Jupyter Notebooks (.ipynb files) to other formats. Output formats include asciidoc, html, latex, markdown, pdf, py, rst, script.) + * notebook 7.4.0 → 7.4.2 (Jupyter Notebook - A web-based notebook environment for interactive computing) + * numpy 2.2.4 → 2.2.6 (Fundamental package for array computing in Python) + * numpydoc 1.6.0 → 1.8.0 (Sphinx extension to support docstrings in Numpy format) + * openai 1.72.0 → 1.82.0 (The official Python library for the openai API) + * openpyxl 3.1.2 → 3.1.5 (A Python library to read/write Excel 2010 xlsx/xlsm files) + * optree 0.14.0 → 0.14.1 (Optimized PyTree Utilities.) + * optuna 3.6.1 → 4.2.1 (A hyperparameter optimization framework) + * orjson 3.10.12 → 3.10.16 (Fast, correct Python JSON library supporting dataclasses, datetimes, and numpy) + * pandocfilters 1.5.0 → 1.5.1 (Utilities for writing pandoc filters in python) + * panel 1.6.2 → 1.6.3 (The powerful data exploration & web app framework for Python.) + * partd 1.4.0 → 1.4.2 (Appendable key-value storage) + * pathspec 0.11.0 → 0.12.1 (Utility library for gitignore style pattern matching of file paths.) + * patsy 0.5.6 → 1.0.1 (A Python package for describing statistical models and for building design matrices.) + * pexpect 4.8.0 → 4.9.0 (Pexpect allows easy control of interactive console applications.) + * pg8000 1.23.0 → 1.31.2 (PostgreSQL interface library) + * pip 25.0.1 → 25.1.1 (The PyPA recommended tool for installing Python packages.) + * platformdirs 4.3.6 → 4.3.7 (A small Python package for determining appropriate platform-specific dirs, e.g. a `user data dir`.) + * plotpy 2.7.2 → 2.7.4 (Curve and image plotting tools for Python/Qt applications) + * polars 1.27.1 → 1.31.0 (Blazingly fast DataFrame library) + * prettytable 3.3.0 → 3.16.0 (A simple Python library for easily displaying tabular data in a visually appealing ASCII table format) + * prince 0.15.0 → 0.16.0 (Factor analysis in Python: PCA, CA, MCA, MFA, FAMD, GPA) + * propcache 0.2.1 → 0.3.1 (Accelerated property cache) + * protobuf 5.27.3 → 6.30.2 () + * psutil 5.9.8 → 7.0.0 (Cross-platform lib for process and system monitoring in Python. NOTE: the syntax of this script MUST be kept compatible with Python 2.7.) + * psygnal 0.11.1 → 0.12.0 (Fast python callback/event system modeled after Qt Signals) + * pyarrow 19.0.1 → 20.0.0 (Python library for Apache Arrow) + * pyerfa 2.0.1.4 → 2.0.1.5 (Python bindings for ERFA) + * pylint 3.1.0 → 3.3.6 (python code static checker) + * pynndescent 0.5.12 → 0.5.13 (Nearest Neighbor Descent) + * pyomo 6.9.1 → 6.9.2 (Pyomo: Python Optimization Modeling Objects) + * pyparsing 3.2.1 → 3.2.3 (pyparsing module - Classes and methods to define and execute parsing grammars) + * pypdf 5.1.0 → 5.4.0 (A pure-python PDF library capable of splitting, merging, cropping, and transforming PDF files) + * pyqt5 5.15.10 → 5.15.11 (Python bindings for the Qt cross platform application toolkit) + * pyqtwebengine 5.15.6 → 5.15.7 (Python bindings for the Qt WebEngine framework) + * pytest 8.3.4 → 8.3.5 (pytest: simple powerful testing with Python) + * pythonqwt 0.14.4 → 0.14.5 (Qt plotting widgets for Python) + * pytz 2024.2 → 2025.2 (World timezone definitions, modern and historical) + * pywin32 308 → 310 (Python for Window Extensions) + * pywinpty 2.0.14 → 2.0.15 (Pseudo terminal support for Windows from Python.) + * pyzmq 26.2.1 → 26.4.0 (Python bindings for 0MQ) + * qstylizer 0.2.2 → 0.2.4 (Stylesheet Generator for PyQt{4-5}/PySide{1-2}) + * qtpy 2.4.1 → 2.4.3 (Provides an abstraction layer on top of the various Qt bindings (PyQt5/6 and PySide2/6).) + * rapidfuzz 3.9.6 → 3.13.0 (rapid fuzzy string matching) + * redis 5.0.8 → 5.2.1 (Python client for Redis database and key-value store) + * referencing 0.35.1 → 0.36.2 (JSON Referencing + Python) + * reportlab 4.2.5 → 4.3.1 (The Reportlab Toolkit) + * rich 13.9.4 → 14.0.0 (Render rich text, tables, progress bars, syntax highlighting, markdown and more to the terminal) + * rope 1.12.0 → 1.13.0 (a python refactoring library...) + * rtree 1.3.0 → 1.4.0 (R-Tree spatial index for Python GIS) + * scipy 1.15.2 → 1.15.3 (Fundamental algorithms for scientific computing in Python) + * setuptools 75.8.2 → 79.0.1 (Easily download, build, install, upgrade, and uninstall Python packages) + * shapely 2.0.6 → 2.1.0 (Manipulation and analysis of geometric objects) + * six 1.16.0 → 1.17.0 (Python 2 and 3 compatibility utilities) + * skrub 0.5.1 → 0.5.3 (Prepping tables for machine learning) + * smmap 5.0.0 → 5.0.2 (A pure Python implementation of a sliding window memory map manager) + * sniffio 1.3.0 → 1.3.1 (Sniff out which async library your code is running under) + * sphinx 7.3.7 → 8.1.3 (Python documentation generator) + * spyder 6.0.5 → 6.0.7 (The Scientific Python Development Environment) + * sqlalchemy 2.0.38 → 2.0.40 (Database Abstraction Library) + * starlette 0.45.3 → 0.46.2 (The little ASGI library that shines.) + * streamlit 1.44.0 → 1.46.0 (A faster way to build and share data apps) + * superqt 0.7.1 → 0.7.3 (Missing widgets and components for PyQt/PySide) + * sympy 1.13.3 → 1.14.0 (Computer algebra system (CAS) in Python) + * tblib 3.0.0 → 3.1.0 (Traceback serialization library.) + * tenacity 9.0.0 → 9.1.2 (Retry code until it succeeds) + * termcolor 2.5.0 → 3.1.0 (ANSI color formatting for output in terminal) + * threadpoolctl 3.5.0 → 3.6.0 (threadpoolctl) + * tifffile 2025.1.10 → 2025.3.30 (Read and write TIFF files) + * tiktoken 0.8.0 → 0.9.0 (tiktoken is a fast BPE tokeniser for use with OpenAI's models) + * tokenizers 0.21.0 → 0.21.1 () + * tornado 6.4.2 → 6.5.1 (Tornado is a Python web framework and asynchronous networking library, originally developed at FriendFeed.) + * tqdm 4.66.4 → 4.67.1 (Fast, Extensible Progress Meter) + * traitlets 5.14.1 → 5.14.3 (Traitlets Python configuration system) + * trio 0.29.0 → 0.30.0 (A friendly Python library for async concurrency and I/O) + * tzdata 2024.1 → 2025.2 (Provider of IANA time zone data) + * tzlocal 5.2 → 5.3.1 (tzinfo object for the local timezone) + * urllib3 2.2.3 → 2.4.0 (HTTP library with thread-safe connection pooling, file post, and more.) + * uvicorn 0.34.0 → 0.34.2 (The lightning-fast ASGI server.) + * winpython 15.3.20250425 → 16.6.20250620 (WinPython distribution tools, including WPPM) + * xarray 2025.3.0 → 2025.4.0 (N-D labeled arrays and datasets in Python) + * xlsxwriter 3.1.9 → 3.2.3 (A Python module for creating Excel XLSX files.) + +Removed packages: + * Python 3.12.10 (Python programming language with standard library) + * aniso8601 9.0.1 (A library for parsing ISO 8601 strings.) + * fast-histogram 0.14 (Fast simple 1D and 2D histograms) + * jsonpath-python 1.0.6 (A more powerful JSONPath implementation in modern python) + * mpl-scatter-density 0.7 (Matplotlib helpers to make density scatter plots) + * pydantic-ai 0.0.24 (Agent Framework / shim to use Pydantic with LLMs) + * typing-inspect 0.9.0 (Runtime inspection utilities for typing module.) + +### WheelHouse packages + + +No differences found. + + +
    + +* * * diff --git a/changelogs/WinPythonslim-64bit-3.13.5.0.md b/changelogs/WinPythonslim-64bit-3.13.5.0.md new file mode 100644 index 00000000..e20a7b65 --- /dev/null +++ b/changelogs/WinPythonslim-64bit-3.13.5.0.md @@ -0,0 +1,528 @@ +## WinPython 3.13.5.0slim + +The following packages are included in WinPython-64bit v3.13.5.0slim 3.10.11.1dot. + +
    + +### Tools + +Name | Version | Description +-----|---------|------------ +[Pandoc](https://pandoc.org) | 3.1.9 | an universal document converter +[Python](http://www.python.org/) | 3.13.5 | Python programming language with standard library + + +### Python packages + +Name | Version | Description +-----|---------|------------ +[absl-py](https://pypi.org/project/absl-py) | 2.2.2 | Abseil Python Common Libraries, see https://github.com/abseil/abseil-py. +[adbc-driver-manager](https://pypi.org/project/adbc-driver-manager) | 1.3.0 | A generic entrypoint for ADBC drivers. +[aiofiles](https://pypi.org/project/aiofiles) | 23.2.1 | File support for asyncio. +[aiohappyeyeballs](https://pypi.org/project/aiohappyeyeballs) | 2.6.1 | Happy Eyeballs for asyncio +[aiohttp](https://pypi.org/project/aiohttp) | 3.11.18 | Async http client/server framework (asyncio) +[aiosignal](https://pypi.org/project/aiosignal) | 1.3.2 | aiosignal: a list of registered asynchronous callbacks +[aiosqlite](https://pypi.org/project/aiosqlite) | 0.20.0 | asyncio bridge to the standard sqlite3 module +[alabaster](https://pypi.org/project/alabaster) | 0.7.16 | A light, configurable Sphinx theme +[alembic](https://pypi.org/project/alembic) | 1.15.2 | A database migration tool for SQLAlchemy. +[altair](https://pypi.org/project/altair) | 5.5.0 | Vega-Altair: A declarative statistical visualization library for Python. +[annotated-types](https://pypi.org/project/annotated-types) | 0.7.0 | Reusable constraint types to use with typing.Annotated +[ansicolors](https://pypi.org/project/ansicolors) | 1.1.8 | ANSI colors for Python +[anthropic](https://pypi.org/project/anthropic) | 0.51.0 | The official Python library for the anthropic API +[anyio](https://pypi.org/project/anyio) | 4.9.0 | High level compatibility layer for multiple asynchronous event loop implementations +[anywidget](https://pypi.org/project/anywidget) | 0.9.18 | custom jupyter widgets made easy +[appdirs](https://pypi.org/project/appdirs) | 1.4.4 | A small Python module for determining appropriate platform-specific dirs, e.g. a "user data dir". +[argcomplete](https://pypi.org/project/argcomplete) | 3.6.2 | Bash tab completion for argparse +[argon2-cffi](https://pypi.org/project/argon2-cffi) | 23.1.0 | Argon2 for Python +[argon2-cffi-bindings](https://pypi.org/project/argon2-cffi-bindings) | 21.2.0 | Low-level CFFI bindings for Argon2 +[array-api-compat](https://pypi.org/project/array-api-compat) | 1.12.0 | A wrapper around NumPy and other array libraries to make them compatible with the Array API standard +[arrow](https://pypi.org/project/arrow) | 1.3.0 | Better dates & times for Python +[asgi-csrf](https://pypi.org/project/asgi-csrf) | 0.11 | ASGI middleware for protecting against CSRF attacks +[asgiref](https://pypi.org/project/asgiref) | 3.8.1 | ASGI specs, helper code, and adapters +[asn1crypto](https://pypi.org/project/asn1crypto) | 1.5.1 | Fast ASN.1 parser and serializer with definitions for private keys, public keys, certificates, CRL, OCSP, CMS, PKCS#3, PKCS#7, PKCS#8, PKCS#12, +[asteval](https://pypi.org/project/asteval) | 1.0.5 | Safe, minimalistic evaluator of python expression using ast module +[astroid](https://pypi.org/project/astroid) | 3.3.9 | An abstract syntax tree for Python with inference support. +[astropy](https://pypi.org/project/astropy) | 6.1.6 | Astronomy and astrophysics core library +[astropy-iers-data](https://pypi.org/project/astropy-iers-data) | 0.2024.12.23.0.33.24 | IERS Earth Rotation and Leap Second tables for the astropy core package +[asttokens](https://pypi.org/project/asttokens) | 3.0.0 | Annotate AST trees with source code positions +[async-lru](https://pypi.org/project/async-lru) | 2.0.5 | Simple LRU cache for asyncio +[asyncssh](https://pypi.org/project/asyncssh) | 2.20.0 | AsyncSSH: Asynchronous SSHv2 client and server library +[atomicwrites](https://pypi.org/project/atomicwrites) | 1.4.0 | Atomic file writes. +[attrs](https://pypi.org/project/attrs) | 25.3.0 | Classes Without Boilerplate +[autopep8](https://pypi.org/project/autopep8) | 2.0.4 | A tool that automatically formats Python code to conform to the PEP 8 style guide +[azure-core](https://pypi.org/project/azure-core) | 1.32.0 | Microsoft Azure Core Library for Python +[azure-cosmos](https://pypi.org/project/azure-cosmos) | 4.9.0 | Microsoft Azure Cosmos Client Library for Python +[azure-identity](https://pypi.org/project/azure-identity) | 1.21.0 | Microsoft Azure Identity Library for Python +[babel](https://pypi.org/project/babel) | 2.17.0 | Internationalization utilities +[baresql](https://pypi.org/project/baresql) | 1.0.0 | playing SQL directly on Python datas +[bcrypt](https://pypi.org/project/bcrypt) | 4.3.0 | Modern password hashing for your software and your servers +[beautifulsoup4](https://pypi.org/project/beautifulsoup4) | 4.13.3 | Screen-scraping library +[binaryornot](https://pypi.org/project/binaryornot) | 0.4.4 | Ultra-lightweight pure Python package to check if a file is binary or text. +[black](https://pypi.org/project/black) | 25.1.0 | The uncompromising code formatter. +[bleach](https://pypi.org/project/bleach) | 6.2.0 | An easy safelist-based HTML-sanitizing tool. +[blinker](https://pypi.org/project/blinker) | 1.9.0 | Fast, simple object-to-object and broadcast signaling +[bokeh](https://pypi.org/project/bokeh) | 3.7.3 | Interactive plots and applications in the browser from Python +[branca](https://pypi.org/project/branca) | 0.8.1 | Generate complex HTML+JS pages with Python +[brotli](https://pypi.org/project/brotli) | 1.1.0 | Python bindings for the Brotli compression library +[build](https://pypi.org/project/build) | 1.2.2.post1 | A simple, correct Python build frontend +[cachetools](https://pypi.org/project/cachetools) | 5.5.2 | Extensible memoizing collections and decorators +[certifi](https://pypi.org/project/certifi) | 2025.1.31 | Python package for providing Mozilla's CA Bundle. +[cffi](https://pypi.org/project/cffi) | 1.17.1 | Foreign Function Interface for Python calling C code. +[chardet](https://pypi.org/project/chardet) | 5.2.0 | Universal encoding detector for Python 3 +[charset-normalizer](https://pypi.org/project/charset-normalizer) | 3.4.2 | The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet. +[clarabel](https://pypi.org/project/clarabel) | 0.10.0 | Clarabel Conic Interior Point Solver for Rust / Python +[click](https://pypi.org/project/click) | 8.1.8 | Composable command line interface toolkit +[click-default-group](https://pypi.org/project/click-default-group) | 1.2.4 | click_default_group +[cloudpickle](https://pypi.org/project/cloudpickle) | 3.1.1 | Pickler class to extend the standard pickle.Pickler functionality +[cohere](https://pypi.org/project/cohere) | 5.15.0 | +[colorama](https://pypi.org/project/colorama) | 0.4.6 | Cross-platform colored terminal text. +[colorcet](https://pypi.org/project/colorcet) | 3.1.0 | Collection of perceptually uniform colormaps +[colorlog](https://pypi.org/project/colorlog) | 6.9.0 | Add colours to the output of Python's logging module. +[comm](https://pypi.org/project/comm) | 0.2.2 | Jupyter Python Comm implementation, for usage in ipykernel, xeus-python etc. +[contourpy](https://pypi.org/project/contourpy) | 1.3.2 | Python library for calculating contours of 2D quadrilateral grids +[cookiecutter](https://pypi.org/project/cookiecutter) | 2.6.0 | A command-line utility that creates projects from project templates, e.g. +[cryptography](https://pypi.org/project/cryptography) | 44.0.0 | cryptography is a package which provides cryptographic recipes and primitives to Python developers. +[cvxopt](https://pypi.org/project/cvxopt) | 1.3.2 | Convex optimization package +[cvxpy](https://pypi.org/project/cvxpy) | 1.6.4 | A domain-specific language for modeling convex optimization problems in Python. +[cycler](https://pypi.org/project/cycler) | 0.12.1 | Composable style cycles +[cython](https://pypi.org/project/cython) | 3.1.1 | The Cython compiler for writing C extensions in the Python language. +[cytoolz](https://pypi.org/project/cytoolz) | 1.0.1 | Cython implementation of Toolz: High performance functional utilities +[dask](https://pypi.org/project/dask) | 2025.4.1 | Parallel PyData with Task Scheduling +[datasette](https://pypi.org/project/datasette) | 0.65.1 | An open source multi-tool for exploring and publishing data +[datasette-graphql](https://pypi.org/project/datasette-graphql) | 2.2 | Datasette plugin providing an automatic GraphQL API for your SQLite databases +[datashader](https://pypi.org/project/datashader) | 0.17.0 | Data visualization toolchain based on aggregating into a grid +[deap](https://pypi.org/project/deap) | 1.4.2 | Distributed Evolutionary Algorithms in Python +[debugpy](https://pypi.org/project/debugpy) | 1.8.13 | An implementation of the Debug Adapter Protocol for Python +[decorator](https://pypi.org/project/decorator) | 5.2.1 | Decorators for Humans +[defusedxml](https://pypi.org/project/defusedxml) | 0.7.1 | XML bomb protection for Python stdlib modules +[deprecated](https://pypi.org/project/deprecated) | 1.2.14 | Python @deprecated decorator to deprecate old python classes, functions or methods. +[diff-match-patch](https://pypi.org/project/diff-match-patch) | 20241021 | Repackaging of Google's Diff Match and Patch libraries. +[dill](https://pypi.org/project/dill) | 0.4.0 | serialize all of Python +[distributed](https://pypi.org/project/distributed) | 2025.4.1 | Distributed scheduler for Dask +[distro](https://pypi.org/project/distro) | 1.9.0 | Distro - an OS platform information API +[django](https://pypi.org/project/django) | 5.2 | A high-level Python web framework that encourages rapid development and clean, pragmatic design. +[dnspython](https://pypi.org/project/dnspython) | 2.7.0 | DNS toolkit +[docstring-to-markdown](https://pypi.org/project/docstring-to-markdown) | 0.17 | On the fly conversion of Python docstrings to markdown +[docutils](https://pypi.org/project/docutils) | 0.21.2 | Docutils -- Python Documentation Utilities +[duckdb](https://pypi.org/project/duckdb) | 1.3.0 | DuckDB in-process database +[entrypoints](https://pypi.org/project/entrypoints) | 0.4 | Discover and load entry points from installed packages. +[et-xmlfile](https://pypi.org/project/et-xmlfile) | 1.1.0 | An implementation of lxml.xmlfile for the standard library +[eval-type-backport](https://pypi.org/project/eval-type-backport) | 0.2.2 | Like `typing._eval_type`, but lets older Python versions use newer typing features. +[executing](https://pypi.org/project/executing) | 2.2.0 | Get the currently executing AST node of a frame, and other information +[faker](https://pypi.org/project/faker) | 37.1.0 | Faker is a Python package that generates fake data for you. +[fasta2a](https://pypi.org/project/fasta2a) | 0.2.9 | Convert an AI Agent into a A2A server! ✨ +[fastapi](https://pypi.org/project/fastapi) | 0.115.12 | FastAPI framework, high performance, easy to learn, fast to code, ready for production +[fastavro](https://pypi.org/project/fastavro) | 1.10.0 | Fast read/write of AVRO files +[fastjsonschema](https://pypi.org/project/fastjsonschema) | 2.21.1 | Fastest Python implementation of JSON schema +[filelock](https://pypi.org/project/filelock) | 3.18.0 | A platform independent file lock. +[flake8](https://pypi.org/project/flake8) | 7.1.1 | the modular source code checker: pep8 pyflakes and co +[flask](https://pypi.org/project/flask) | 3.1.0 | A simple framework for building complex web applications. +[flexcache](https://pypi.org/project/flexcache) | 0.3 | Saves and loads to the cache a transformed versions of a source object. +[flexparser](https://pypi.org/project/flexparser) | 0.4 | Parsing made fun ... using typing. +[flit](https://pypi.org/project/flit) | 3.12.0 | A simple packaging tool for simple packages. +[flit-core](https://pypi.org/project/flit-core) | 3.12.0 | Distribution-building parts of Flit. See flit package for more information +[folium](https://pypi.org/project/folium) | 0.19.5 | Make beautiful maps with Leaflet.js & Python +[fonttools](https://pypi.org/project/fonttools) | 4.57.0 | Tools to manipulate font files +[fqdn](https://pypi.org/project/fqdn) | 1.5.1 | Validates fully-qualified domain names against RFC 1123, so that they are acceptable to modern bowsers +[frozenlist](https://pypi.org/project/frozenlist) | 1.5.0 | A list-like structure which implements collections.abc.MutableSequence +[fsspec](https://pypi.org/project/fsspec) | 2025.3.2 | File-system specification +[fuzzywuzzy](https://pypi.org/project/fuzzywuzzy) | 0.18.0 | Fuzzy string matching in python +[geographiclib](https://pypi.org/project/geographiclib) | 2.0 | The geodesic routines from GeographicLib +[geopandas](https://pypi.org/project/geopandas) | 1.0.1 | Geographic pandas extensions +[geopy](https://pypi.org/project/geopy) | 2.4.1 | Python Geocoding Toolbox +[gitdb](https://pypi.org/project/gitdb) | 4.0.12 | Git Object Database +[gitpython](https://pypi.org/project/gitpython) | 3.1.44 | GitPython is a Python library used to interact with Git repositories +[google-auth](https://pypi.org/project/google-auth) | 2.38.0 | Google Authentication Library +[google-genai](https://pypi.org/project/google-genai) | 1.16.1 | GenAI Python SDK +[graphene](https://pypi.org/project/graphene) | 3.4.3 | GraphQL Framework for Python +[graphql-core](https://pypi.org/project/graphql-core) | 3.2.6 | GraphQL implementation for Python, a port of GraphQL.js, the JavaScript reference implementation for GraphQL. +[graphql-relay](https://pypi.org/project/graphql-relay) | 3.2.0 | Relay library for graphql-core +[greenlet](https://pypi.org/project/greenlet) | 3.1.1 | Lightweight in-process concurrent programming +[griffe](https://pypi.org/project/griffe) | 1.7.2 | Signatures for entire Python programs. +[groq](https://pypi.org/project/groq) | 0.25.0 | The official Python library for the groq API +[guidata](https://pypi.org/project/guidata) | 3.9.0 | Automatic GUI generation for easy dataset editing and display +[h11](https://pypi.org/project/h11) | 0.14.0 | A pure-Python, bring-your-own-I/O implementation of HTTP/1.1 +[h2](https://pypi.org/project/h2) | 4.2.0 | Pure-Python HTTP/2 protocol implementation +[h5py](https://pypi.org/project/h5py) | 3.12.1 | Read and write HDF5 files from Python +[hatchling](https://pypi.org/project/hatchling) | 1.27.0 | Modern, extensible Python build backend +[holoviews](https://pypi.org/project/holoviews) | 1.20.2 | A high-level plotting API for the PyData ecosystem built on HoloViews. +[hpack](https://pypi.org/project/hpack) | 4.1.0 | Pure-Python HPACK header encoding +[html5lib](https://pypi.org/project/html5lib) | 1.1 | HTML parser based on the WHATWG HTML specification +[httpcore](https://pypi.org/project/httpcore) | 1.0.7 | A minimal low-level HTTP client. +[httpie](https://pypi.org/project/httpie) | 3.2.4 | HTTPie: modern, user-friendly command-line HTTP client for the API era. +[httpx](https://pypi.org/project/httpx) | 0.28.1 | The next generation HTTP client. +[httpx-sse](https://pypi.org/project/httpx-sse) | 0.4.0 | Consume Server-Sent Event (SSE) messages with HTTPX. +[huggingface-hub](https://pypi.org/project/huggingface-hub) | 0.33.0 | Client library to download and publish models, datasets and other repos on the huggingface.co hub +[hupper](https://pypi.org/project/hupper) | 1.12.1 | Integrated process monitor for developing and reloading daemons. +[hvplot](https://pypi.org/project/hvplot) | 0.11.2 | A high-level plotting API for the PyData ecosystem built on HoloViews. +[hypercorn](https://pypi.org/project/hypercorn) | 0.17.3 | A ASGI Server based on Hyper libraries and inspired by Gunicorn +[hyperframe](https://pypi.org/project/hyperframe) | 6.1.0 | Pure-Python HTTP/2 framing +[hypothesis](https://pypi.org/project/hypothesis) | 6.130.4 | A library for property-based testing +[id](https://pypi.org/project/id) | 1.5.0 | A tool for generating OIDC identities +[idna](https://pypi.org/project/idna) | 3.10 | Internationalized Domain Names in Applications (IDNA) +[imageio](https://pypi.org/project/imageio) | 2.37.0 | Library for reading and writing a wide range of image, video, scientific, and volumetric data formats. +[imagesize](https://pypi.org/project/imagesize) | 1.4.1 | Getting image size from png/jpeg/jpeg2000/gif file +[imbalanced-learn](https://pypi.org/project/imbalanced-learn) | 0.13.0 | Toolbox for imbalanced dataset in machine learning +[importlib-metadata](https://pypi.org/project/importlib-metadata) | 8.6.1 | Read metadata from Python packages +[inflection](https://pypi.org/project/inflection) | 0.5.1 | A port of Ruby on Rails inflector to Python +[iniconfig](https://pypi.org/project/iniconfig) | 2.1.0 | brain-dead simple config-ini parsing +[intervaltree](https://pypi.org/project/intervaltree) | 3.1.0 | Editable interval tree data structure for Python 2 and 3 +[ipycanvas](https://pypi.org/project/ipycanvas) | 0.13.3 | Interactive widgets library exposing the browser's Canvas API +[ipykernel](https://pypi.org/project/ipykernel) | 6.29.5 | IPython Kernel for Jupyter +[ipyleaflet](https://pypi.org/project/ipyleaflet) | 0.19.2 | A Jupyter widget for dynamic Leaflet maps +[ipympl](https://pypi.org/project/ipympl) | 0.9.7 | Matplotlib Jupyter Extension +[ipython](https://pypi.org/project/ipython) | 8.36.0 | IPython: Productive Interactive Computing +[ipython-genutils](https://pypi.org/project/ipython-genutils) | 0.2.0 | Vestigial utilities from IPython +[ipython-sql](https://pypi.org/project/ipython-sql) | 0.5.0 | RDBMS access via IPython +[ipywidgets](https://pypi.org/project/ipywidgets) | 8.1.6 | Jupyter interactive widgets +[isoduration](https://pypi.org/project/isoduration) | 20.11.0 | Operations with ISO 8601 durations +[isort](https://pypi.org/project/isort) | 5.13.2 | A Python utility / library to sort Python imports. +[itsdangerous](https://pypi.org/project/itsdangerous) | 2.2.0 | Safely pass data to untrusted environments and back. +[janus](https://pypi.org/project/janus) | 2.0.0 | Mixed sync-async queue to interoperate between asyncio tasks and classic threads +[jaraco-classes](https://pypi.org/project/jaraco-classes) | 3.4.0 | Utility functions for Python class constructs +[jaraco-context](https://pypi.org/project/jaraco-context) | 6.0.1 | Useful decorators and context managers +[jaraco-functools](https://pypi.org/project/jaraco-functools) | 4.1.0 | Functools like those found in stdlib +[jedi](https://pypi.org/project/jedi) | 0.19.2 | An autocompletion tool for Python that can be used for text editors. +[jellyfish](https://pypi.org/project/jellyfish) | 1.1.3 | Approximate and phonetic matching of strings. +[jinja2](https://pypi.org/project/jinja2) | 3.1.6 | A very fast and expressive template engine. +[jiter](https://pypi.org/project/jiter) | 0.9.0 | Fast iterable JSON parser. +[joblib](https://pypi.org/project/joblib) | 1.4.2 | Lightweight pipelining with Python functions +[json5](https://pypi.org/project/json5) | 0.10.0 | A Python implementation of the JSON5 data format. +[jsonpatch](https://pypi.org/project/jsonpatch) | 1.33 | Apply JSON-Patches (RFC 6902) +[jsonpointer](https://pypi.org/project/jsonpointer) | 3.0.0 | Identify specific nodes in a JSON document (RFC 6901) +[jsonschema](https://pypi.org/project/jsonschema) | 4.23.0 | An implementation of JSON Schema validation for Python +[jsonschema-specifications](https://pypi.org/project/jsonschema-specifications) | 2024.10.1 | The JSON Schema meta-schemas and vocabularies, exposed as a Registry +[julia](https://pypi.org/project/julia) | 0.6.2 | Julia/Python bridge with IPython support. +[jupyter](https://pypi.org/project/jupyter) | 1.1.1 | Jupyter metapackage. Install all the Jupyter components in one go. +[jupyter-bokeh](https://pypi.org/project/jupyter-bokeh) | 4.0.5 | A Jupyter extension for rendering Bokeh content. +[jupyter-client](https://pypi.org/project/jupyter-client) | 8.6.3 | Jupyter protocol implementation and client libraries +[jupyter-console](https://pypi.org/project/jupyter-console) | 6.6.3 | Jupyter terminal console +[jupyter-core](https://pypi.org/project/jupyter-core) | 5.7.2 | Jupyter core package. A base package on which Jupyter projects rely. +[jupyter-events](https://pypi.org/project/jupyter-events) | 0.12.0 | Jupyter Event System library +[jupyter-leaflet](https://pypi.org/project/jupyter-leaflet) | 0.19.2 | ipyleaflet extensions for JupyterLab and Jupyter Notebook +[jupyter-lsp](https://pypi.org/project/jupyter-lsp) | 2.2.5 | Multi-Language Server WebSocket proxy for Jupyter Notebook/Lab server +[jupyter-server](https://pypi.org/project/jupyter-server) | 2.15.0 | The backend—i.e. core services, APIs, and REST endpoints—to Jupyter web applications. +[jupyter-server-terminals](https://pypi.org/project/jupyter-server-terminals) | 0.5.3 | A Jupyter Server Extension Providing Terminals. +[jupyterlab](https://pypi.org/project/jupyterlab) | 4.4.2 | JupyterLab computational environment +[jupyterlab-pygments](https://pypi.org/project/jupyterlab-pygments) | 0.3.0 | Pygments theme using JupyterLab CSS variables +[jupyterlab-server](https://pypi.org/project/jupyterlab-server) | 2.27.3 | A set of server components for JupyterLab and JupyterLab like applications. +[jupyterlab-widgets](https://pypi.org/project/jupyterlab-widgets) | 3.0.14 | Jupyter interactive widgets for JupyterLab +[keras](https://pypi.org/project/keras) | 3.10.0 | Multi-backend Keras +[keyring](https://pypi.org/project/keyring) | 25.6.0 | Store and access your passwords safely. +[kiwisolver](https://pypi.org/project/kiwisolver) | 1.4.8 | A fast implementation of the Cassowary constraint solver +[langchain](https://pypi.org/project/langchain) | 0.3.25 | Building applications with LLMs through composability +[langchain-core](https://pypi.org/project/langchain-core) | 0.3.59 | Building applications with LLMs through composability +[langchain-text-splitters](https://pypi.org/project/langchain-text-splitters) | 0.3.8 | LangChain text splitting utilities +[langsmith](https://pypi.org/project/langsmith) | 0.3.42 | Client library to connect to the LangSmith LLM Tracing and Evaluation Platform. +[lazy-loader](https://pypi.org/project/lazy-loader) | 0.4 | Makes it easy to load subpackages and functions on demand. +[linkify-it-py](https://pypi.org/project/linkify-it-py) | 2.0.3 | Links recognition library with FULL unicode support. +[llvmlite](https://pypi.org/project/llvmlite) | 0.44.0 | lightweight wrapper around basic LLVM functionality +[lmfit](https://pypi.org/project/lmfit) | 1.3.3 | Least-Squares Minimization with Bounds and Constraints +[locket](https://pypi.org/project/locket) | 1.0.0 | File-based locks for Python on Linux and Windows +[logfire-api](https://pypi.org/project/logfire-api) | 3.12.0 | Shim for the Logfire SDK which does nothing unless Logfire is installed +[lxml](https://pypi.org/project/lxml) | 5.3.0 | Powerful and Pythonic XML processing library combining libxml2/libxslt with the ElementTree API. +[mako](https://pypi.org/project/mako) | 1.3.9 | A super-fast templating language that borrows the best ideas from the existing templating languages. +[markdown](https://pypi.org/project/markdown) | 3.7 | Python implementation of John Gruber's Markdown. +[markdown-it-py](https://pypi.org/project/markdown-it-py) | 3.0.0 | Python port of markdown-it. Markdown parsing, done right! +[markupsafe](https://pypi.org/project/markupsafe) | 3.0.2 | Safely add untrusted strings to HTML/XML markup. +[matplotlib](https://pypi.org/project/matplotlib) | 3.10.3 | Python plotting package +[matplotlib-inline](https://pypi.org/project/matplotlib-inline) | 0.1.7 | Inline Matplotlib backend for Jupyter +[maturin](https://pypi.org/project/maturin) | 1.8.3 | Build and publish crates with pyo3, cffi and uniffi bindings as well as rust binaries as python packages +[mccabe](https://pypi.org/project/mccabe) | 0.7.0 | McCabe checker, plugin for flake8 +[mcp](https://pypi.org/project/mcp) | 1.9.3 | Model Context Protocol SDK +[mdit-py-plugins](https://pypi.org/project/mdit-py-plugins) | 0.4.2 | Collection of plugins for markdown-it-py +[mdurl](https://pypi.org/project/mdurl) | 0.1.2 | Markdown URL utilities +[mercantile](https://pypi.org/project/mercantile) | 1.2.1 | Web mercator XYZ tile utilities +[mergedeep](https://pypi.org/project/mergedeep) | 1.3.4 | A deep merge function for 🐍. +[missingno](https://pypi.org/project/missingno) | 0.5.2 | Missing data visualization module for Python. +[mistralai](https://pypi.org/project/mistralai) | 1.8.1 | Python Client SDK for the Mistral AI API. +[mistune](https://pypi.org/project/mistune) | 3.1.3 | A sane and fast Markdown parser with useful plugins and renderers +[mizani](https://pypi.org/project/mizani) | 0.11.4 | Scales for Python +[ml-dtypes](https://pypi.org/project/ml-dtypes) | 0.5.1 | +[mlxtend](https://pypi.org/project/mlxtend) | 0.23.3 | Machine Learning Library Extensions +[more-itertools](https://pypi.org/project/more-itertools) | 10.6.0 | More routines for operating on iterables, beyond itertools +[mpld3](https://pypi.org/project/mpld3) | 0.5.10 | D3 Viewer for Matplotlib +[mpmath](https://pypi.org/project/mpmath) | 1.3.0 | Python library for arbitrary-precision floating-point arithmetic +[msal](https://pypi.org/project/msal) | 1.30.0 | The Microsoft Authentication Library (MSAL) for Python library enables your app to access the Microsoft Cloud by supporting authentication of us +[msal-extensions](https://pypi.org/project/msal-extensions) | 1.2.0 | Microsoft Authentication Library extensions (MSAL EX) provides a persistence API that can save your data on disk, encrypted on Windows, macOS an +[msgpack](https://pypi.org/project/msgpack) | 1.1.0 | MessagePack serializer +[multidict](https://pypi.org/project/multidict) | 6.4.3 | multidict implementation +[multipledispatch](https://pypi.org/project/multipledispatch) | 1.0.0 | Multiple dispatch +[mypy](https://pypi.org/project/mypy) | 1.15.0 | Optional static typing for Python +[mypy-extensions](https://pypi.org/project/mypy-extensions) | 1.0.0 | Type system extensions for programs checked with the mypy type checker. +[mysql-connector-python](https://pypi.org/project/mysql-connector-python) | 9.2.0 | A self-contained Python driver for communicating with MySQL servers, using an API that is compliant with the Python Database API Specification v +[namex](https://pypi.org/project/namex) | 0.0.8 | A simple utility to separate the implementation of your Python package and its public API surface. +[narwhals](https://pypi.org/project/narwhals) | 1.36.0 | Extremely lightweight compatibility layer between dataframe libraries +[nbclient](https://pypi.org/project/nbclient) | 0.10.2 | A client library for executing notebooks. Formerly nbconvert's ExecutePreprocessor. +[nbconvert](https://pypi.org/project/nbconvert) | 7.16.6 | Converting Jupyter Notebooks (.ipynb files) to other formats. Output formats include asciidoc, html, latex, markdown, pdf, py, rst, script. +[nbformat](https://pypi.org/project/nbformat) | 5.10.4 | The Jupyter Notebook format +[nest-asyncio](https://pypi.org/project/nest-asyncio) | 1.6.0 | Patch asyncio to allow nested event loops +[networkx](https://pypi.org/project/networkx) | 3.4.2 | Python package for creating and manipulating graphs and networks +[nh3](https://pypi.org/project/nh3) | 0.2.18 | Python bindings to the ammonia HTML sanitization library. +[nltk](https://pypi.org/project/nltk) | 3.9.1 | Natural Language Toolkit +[notebook](https://pypi.org/project/notebook) | 7.4.2 | Jupyter Notebook - A web-based notebook environment for interactive computing +[notebook-shim](https://pypi.org/project/notebook-shim) | 0.2.4 | A shim layer for notebook traits and config +[numba](https://pypi.org/project/numba) | 0.61.2 | compiling Python code using LLVM +[numpy](https://pypi.org/project/numpy) | 2.2.6 | Fundamental package for array computing in Python +[numpydoc](https://pypi.org/project/numpydoc) | 1.8.0 | Sphinx extension to support docstrings in Numpy format +[openai](https://pypi.org/project/openai) | 1.82.0 | The official Python library for the openai API +[opencv-python](https://pypi.org/project/opencv-python) | 4.11.0.86 | Wrapper package for OpenCV python bindings. +[openpyxl](https://pypi.org/project/openpyxl) | 3.1.5 | A Python library to read/write Excel 2010 xlsx/xlsm files +[opentelemetry-api](https://pypi.org/project/opentelemetry-api) | 1.32.1 | OpenTelemetry Python API +[optree](https://pypi.org/project/optree) | 0.14.1 | Optimized PyTree Utilities. +[optuna](https://pypi.org/project/optuna) | 4.2.1 | A hyperparameter optimization framework +[orjson](https://pypi.org/project/orjson) | 3.10.16 | Fast, correct Python JSON library supporting dataclasses, datetimes, and numpy +[osqp](https://pypi.org/project/osqp) | 0.6.7.post3 | OSQP: The Operator Splitting QP Solver +[outcome](https://pypi.org/project/outcome) | 1.3.0.post0 | Capture the outcome of Python function calls. +[overrides](https://pypi.org/project/overrides) | 7.7.0 | A decorator to automatically detect mismatch when overriding a method. +[packaging](https://pypi.org/project/packaging) | 24.2 | Core utilities for Python packages +[pandas](https://pypi.org/project/pandas) | 2.2.3 | Powerful data structures for data analysis, time series, and statistics +[pandocfilters](https://pypi.org/project/pandocfilters) | 1.5.1 | Utilities for writing pandoc filters in python +[panel](https://pypi.org/project/panel) | 1.6.3 | The powerful data exploration & web app framework for Python. +[papermill](https://pypi.org/project/papermill) | 2.6.0 | Parameterize and run Jupyter and nteract Notebooks +[param](https://pypi.org/project/param) | 2.2.0 | Make your Python code clearer and more reliable by declaring Parameters. +[parso](https://pypi.org/project/parso) | 0.8.4 | A Python Parser +[partd](https://pypi.org/project/partd) | 1.4.2 | Appendable key-value storage +[pathspec](https://pypi.org/project/pathspec) | 0.12.1 | Utility library for gitignore style pattern matching of file paths. +[patsy](https://pypi.org/project/patsy) | 1.0.1 | A Python package for describing statistical models and for building design matrices. +[pep8](https://pypi.org/project/pep8) | 1.7.1 | Python style guide checker +[pexpect](https://pypi.org/project/pexpect) | 4.9.0 | Pexpect allows easy control of interactive console applications. +[pg8000](https://pypi.org/project/pg8000) | 1.31.2 | PostgreSQL interface library +[pickleshare](https://pypi.org/project/pickleshare) | 0.7.5 | Tiny 'shelve'-like database with concurrency support +[pillow](https://pypi.org/project/pillow) | 11.1.0 | Python Imaging Library (Fork) +[pip](https://pypi.org/project/pip) | 25.1.1 | The PyPA recommended tool for installing Python packages. +[platformdirs](https://pypi.org/project/platformdirs) | 4.3.7 | A small Python package for determining appropriate platform-specific dirs, e.g. a `user data dir`. +[plotly](https://pypi.org/project/plotly) | 6.0.1 | An open-source interactive data visualization library for Python +[plotnine](https://pypi.org/project/plotnine) | 0.13.6 | A Grammar of Graphics for Python +[plotpy](https://pypi.org/project/plotpy) | 2.7.4 | Curve and image plotting tools for Python/Qt applications +[pluggy](https://pypi.org/project/pluggy) | 1.5.0 | plugin and hook calling mechanisms for python +[ply](https://pypi.org/project/ply) | 3.11 | Python Lex & Yacc +[polars](https://pypi.org/project/polars) | 1.31.0 | Blazingly fast DataFrame library +[portalocker](https://pypi.org/project/portalocker) | 2.7.0 | Wraps the portalocker recipe for easy usage +[prettytable](https://pypi.org/project/prettytable) | 3.16.0 | A simple Python library for easily displaying tabular data in a visually appealing ASCII table format +[prince](https://pypi.org/project/prince) | 0.16.0 | Factor analysis in Python: PCA, CA, MCA, MFA, FAMD, GPA +[priority](https://pypi.org/project/priority) | 2.0.0 | A pure-Python implementation of the HTTP/2 priority tree +[prometheus-client](https://pypi.org/project/prometheus-client) | 0.21.1 | Python client for the Prometheus monitoring system. +[prompt-toolkit](https://pypi.org/project/prompt-toolkit) | 3.0.51 | Library for building powerful interactive command lines in Python +[propcache](https://pypi.org/project/propcache) | 0.3.1 | Accelerated property cache +[protobuf](https://pypi.org/project/protobuf) | 6.30.2 | +[psutil](https://pypi.org/project/psutil) | 7.0.0 | Cross-platform lib for process and system monitoring in Python. NOTE: the syntax of this script MUST be kept compatible with Python 2.7. +[psygnal](https://pypi.org/project/psygnal) | 0.12.0 | Fast python callback/event system modeled after Qt Signals +[ptpython](https://pypi.org/project/ptpython) | 3.0.29 | Python REPL build on top of prompt_toolkit +[ptyprocess](https://pypi.org/project/ptyprocess) | 0.7.0 | Run a subprocess in a pseudo terminal +[pure-eval](https://pypi.org/project/pure-eval) | 0.2.3 | Safely evaluate AST nodes without side effects +[pyarrow](https://pypi.org/project/pyarrow) | 20.0.0 | Python library for Apache Arrow +[pyasn1](https://pypi.org/project/pyasn1) | 0.6.1 | Pure-Python implementation of ASN.1 types and DER/BER/CER codecs (X.208) +[pyasn1-modules](https://pypi.org/project/pyasn1-modules) | 0.4.1 | A collection of ASN.1-based protocols modules +[pybind11](https://pypi.org/project/pybind11) | 2.13.6 | Seamless operability between C++11 and Python +[pycodestyle](https://pypi.org/project/pycodestyle) | 2.12.0 | Python style guide checker +[pycparser](https://pypi.org/project/pycparser) | 2.22 | C parser in Python +[pyct](https://pypi.org/project/pyct) | 0.5.0 | Python package common tasks for users (e.g. copy examples, fetch data, ...) +[pydantic](https://pypi.org/project/pydantic) | 2.10.6 | Data validation using Python type hints +[pydantic-ai-slim](https://pypi.org/project/pydantic-ai-slim) | 0.2.9 | Agent Framework / shim to use Pydantic with LLMs, slim package +[pydantic-core](https://pypi.org/project/pydantic-core) | 2.27.2 | Core functionality for Pydantic validation and serialization +[pydantic-evals](https://pypi.org/project/pydantic-evals) | 0.2.9 | Framework for evaluating stochastic code execution, especially code making use of LLMs +[pydantic-graph](https://pypi.org/project/pydantic-graph) | 0.2.9 | Graph and state machine library +[pydantic-settings](https://pypi.org/project/pydantic-settings) | 2.8.1 | Settings management using Pydantic +[pydeck](https://pypi.org/project/pydeck) | 0.9.1 | Widget for deck.gl maps +[pydocstyle](https://pypi.org/project/pydocstyle) | 6.3.0 | Python docstring style checker +[pydub](https://pypi.org/project/pydub) | 0.25.1 | Manipulate audio with an simple and easy high level interface +[pyerfa](https://pypi.org/project/pyerfa) | 2.0.1.5 | Python bindings for ERFA +[pyflakes](https://pypi.org/project/pyflakes) | 3.2.0 | passive checker of Python programs +[pygithub](https://pypi.org/project/pygithub) | 2.6.1 | Use the full Github API v3 +[pygments](https://pypi.org/project/pygments) | 2.19.1 | Pygments is a syntax highlighting package written in Python. +[pyjwt](https://pypi.org/project/pyjwt) | 2.10.1 | JSON Web Token implementation in Python +[pylint](https://pypi.org/project/pylint) | 3.3.6 | python code static checker +[pylint-venv](https://pypi.org/project/pylint-venv) | 3.0.4 | pylint-venv provides a Pylint init-hook to use the same Pylint installation with different virtual environments. +[pyls-spyder](https://pypi.org/project/pyls-spyder) | 0.4.0 | Spyder extensions for the python-lsp-server +[pymongo](https://pypi.org/project/pymongo) | 4.10.1 | Python driver for MongoDB +[pympler](https://pypi.org/project/pympler) | 1.1 | A development tool to measure, monitor and analyze the memory behavior of Python objects. +[pynacl](https://pypi.org/project/pynacl) | 1.5.0 | Python binding to the Networking and Cryptography (NaCl) library +[pynndescent](https://pypi.org/project/pynndescent) | 0.5.13 | Nearest Neighbor Descent +[pyodbc](https://pypi.org/project/pyodbc) | 5.2.0 | DB API module for ODBC +[pyogrio](https://pypi.org/project/pyogrio) | 0.10.0 | Vectorized spatial vector file format I/O using GDAL/OGR +[pyomo](https://pypi.org/project/pyomo) | 6.9.2 | Pyomo: Python Optimization Modeling Objects +[pypandoc](https://pypi.org/project/pypandoc) | 1.15 | Thin wrapper for pandoc. +[pyparsing](https://pypi.org/project/pyparsing) | 3.2.3 | pyparsing module - Classes and methods to define and execute parsing grammars +[pypdf](https://pypi.org/project/pypdf) | 5.4.0 | A pure-python PDF library capable of splitting, merging, cropping, and transforming PDF files +[pyproj](https://pypi.org/project/pyproj) | 3.7.0 | Python interface to PROJ (cartographic projections and coordinate transformations library) +[pyproject-hooks](https://pypi.org/project/pyproject-hooks) | 1.2.0 | Wrappers to call pyproject.toml-based build backend hooks. +[pyqt5](https://pypi.org/project/pyqt5) | 5.15.11 | Python bindings for the Qt cross platform application toolkit +[pyqt5-qt5](https://pypi.org/project/pyqt5-qt5) | 5.15.2 | The subset of a Qt installation needed by PyQt5. +[pyqt5-sip](https://pypi.org/project/pyqt5-sip) | 12.17.0 | The sip module support for PyQt5 +[pyqtgraph](https://pypi.org/project/pyqtgraph) | 0.13.7 | Scientific Graphics and GUI Library for Python +[pyqtwebengine](https://pypi.org/project/pyqtwebengine) | 5.15.7 | Python bindings for the Qt WebEngine framework +[pyqtwebengine-qt5](https://pypi.org/project/pyqtwebengine-qt5) | 5.15.2 | The subset of a Qt installation needed by PyQtWebEngine. +[pyserial](https://pypi.org/project/pyserial) | 3.5 | Python Serial Port Extension +[pysocks](https://pypi.org/project/pysocks) | 1.7.1 | A Python SOCKS client module. See https://github.com/Anorov/PySocks for more information. +[pyspnego](https://pypi.org/project/pyspnego) | 0.11.2 | Windows Negotiate Authentication Client and Server +[pytest](https://pypi.org/project/pytest) | 8.3.5 | pytest: simple powerful testing with Python +[python-barcode](https://pypi.org/project/python-barcode) | 0.15.1 | Create standard barcodes with Python. No external modules needed. (optional Pillow support included). +[python-dateutil](https://pypi.org/project/python-dateutil) | 2.8.2 | Extensions to the standard Python datetime module +[python-dotenv](https://pypi.org/project/python-dotenv) | 1.1.0 | Read key-value pairs from a .env file and set them as environment variables +[python-json-logger](https://pypi.org/project/python-json-logger) | 3.3.0 | JSON Log Formatter for the Python Logging Package +[python-lsp-black](https://pypi.org/project/python-lsp-black) | 2.0.0 | Black plugin for the Python LSP Server +[python-lsp-jsonrpc](https://pypi.org/project/python-lsp-jsonrpc) | 1.1.2 | JSON RPC 2.0 server library +[python-lsp-server](https://pypi.org/project/python-lsp-server) | 1.12.2 | Python Language Server for the Language Server Protocol +[python-multipart](https://pypi.org/project/python-multipart) | 0.0.20 | A streaming multipart parser for Python +[python-slugify](https://pypi.org/project/python-slugify) | 8.0.4 | A Python slugify application that also handles Unicode +[pythonqwt](https://pypi.org/project/pythonqwt) | 0.14.5 | Qt plotting widgets for Python +[pytoolconfig](https://pypi.org/project/pytoolconfig) | 1.3.1 | Python tool configuration +[pytz](https://pypi.org/project/pytz) | 2025.2 | World timezone definitions, modern and historical +[pyuca](https://pypi.org/project/pyuca) | 1.2 | a Python implementation of the Unicode Collation Algorithm +[pyusb](https://pypi.org/project/pyusb) | 1.3.1 | Easy USB access for Python +[pyviz-comms](https://pypi.org/project/pyviz-comms) | 3.0.4 | A JupyterLab extension for rendering HoloViz content. +[pywavelets](https://pypi.org/project/pywavelets) | 1.8.0 | PyWavelets, wavelet transform module +[pywin32](https://pypi.org/project/pywin32) | 310 | Python for Window Extensions +[pywin32-ctypes](https://pypi.org/project/pywin32-ctypes) | 0.2.3 | A (partial) reimplementation of pywin32 using ctypes/cffi +[pywinpty](https://pypi.org/project/pywinpty) | 2.0.15 | Pseudo terminal support for Windows from Python. +[pyyaml](https://pypi.org/project/pyyaml) | 6.0.2 | YAML parser and emitter for Python +[pyzmq](https://pypi.org/project/pyzmq) | 26.4.0 | Python bindings for 0MQ +[qdarkstyle](https://pypi.org/project/qdarkstyle) | 3.2.3 | The most complete dark/light style sheet for C++/Python and Qt applications +[qdldl](https://pypi.org/project/qdldl) | 0.1.7.post5 | QDLDL, a free LDL factorization routine. +[qrcode](https://pypi.org/project/qrcode) | 8.0 | QR Code image generator +[qstylizer](https://pypi.org/project/qstylizer) | 0.2.4 | Stylesheet Generator for PyQt{4-5}/PySide{1-2} +[qtawesome](https://pypi.org/project/qtawesome) | 1.4.0 | FontAwesome icons in PyQt and PySide applications +[qtconsole](https://pypi.org/project/qtconsole) | 5.6.1 | Jupyter Qt console +[qtpy](https://pypi.org/project/qtpy) | 2.4.3 | Provides an abstraction layer on top of the various Qt bindings (PyQt5/6 and PySide2/6). +[quantecon](https://pypi.org/project/quantecon) | 0.7.2 | Import the main names to top level. +[quart](https://pypi.org/project/quart) | 0.20.0 | A Python ASGI web framework with the same API as Flask +[rapidfuzz](https://pypi.org/project/rapidfuzz) | 3.13.0 | rapid fuzzy string matching +[readme-renderer](https://pypi.org/project/readme-renderer) | 44.0 | readme_renderer is a library for rendering readme descriptions for Warehouse +[redis](https://pypi.org/project/redis) | 5.2.1 | Python client for Redis database and key-value store +[referencing](https://pypi.org/project/referencing) | 0.36.2 | JSON Referencing + Python +[regex](https://pypi.org/project/regex) | 2024.11.6 | Alternative regular expression module, to replace re. +[reportlab](https://pypi.org/project/reportlab) | 4.3.1 | The Reportlab Toolkit +[requests](https://pypi.org/project/requests) | 2.32.3 | Python HTTP for Humans. +[requests-ntlm](https://pypi.org/project/requests-ntlm) | 1.3.0 | This package allows for HTTP NTLM authentication using the requests library. +[requests-toolbelt](https://pypi.org/project/requests-toolbelt) | 1.0.0 | A utility belt for advanced users of python-requests +[rfc3339-validator](https://pypi.org/project/rfc3339-validator) | 0.1.4 | A pure python RFC3339 validator +[rfc3986](https://pypi.org/project/rfc3986) | 2.0.0 | Validating URI References per RFC 3986 +[rfc3986-validator](https://pypi.org/project/rfc3986-validator) | 0.1.1 | Pure python rfc3986 validator +[rich](https://pypi.org/project/rich) | 14.0.0 | Render rich text, tables, progress bars, syntax highlighting, markdown and more to the terminal +[rope](https://pypi.org/project/rope) | 1.13.0 | a python refactoring library... +[rpds-py](https://pypi.org/project/rpds-py) | 0.24.0 | Python bindings to Rust's persistent data structures (rpds) +[rsa](https://pypi.org/project/rsa) | 4.7.2 | Pure-Python RSA implementation +[rtree](https://pypi.org/project/rtree) | 1.4.0 | R-Tree spatial index for Python GIS +[rx](https://pypi.org/project/rx) | 3.2.0 | Reactive Extensions (Rx) for Python +[scikit-image](https://pypi.org/project/scikit-image) | 0.25.2 | Image processing in Python +[scikit-learn](https://pypi.org/project/scikit-learn) | 1.6.1 | A set of python modules for machine learning and data mining +[scipy](https://pypi.org/project/scipy) | 1.15.3 | Fundamental algorithms for scientific computing in Python +[scramp](https://pypi.org/project/scramp) | 1.4.5 | An implementation of the SCRAM protocol. +[scs](https://pypi.org/project/scs) | 3.2.7.post2 | Splitting conic solver +[seaborn](https://pypi.org/project/seaborn) | 0.13.2 | Statistical data visualization +[send2trash](https://pypi.org/project/send2trash) | 1.8.3 | Send file to trash natively under Mac OS X, Windows and Linux +[setuptools](https://pypi.org/project/setuptools) | 79.0.1 | Easily download, build, install, upgrade, and uninstall Python packages +[shapely](https://pypi.org/project/shapely) | 2.1.0 | Manipulation and analysis of geometric objects +[shellingham](https://pypi.org/project/shellingham) | 1.5.4 | Tool to Detect Surrounding Shell +[simplejson](https://pypi.org/project/simplejson) | 3.19.3 | Simple, fast, extensible JSON encoder/decoder for Python +[simpy](https://pypi.org/project/simpy) | 4.1.1 | Event discrete, process based simulation for Python. +[six](https://pypi.org/project/six) | 1.17.0 | Python 2 and 3 compatibility utilities +[sklearn-compat](https://pypi.org/project/sklearn-compat) | 0.1.3 | Ease support for compatible scikit-learn estimators across versions +[skrub](https://pypi.org/project/skrub) | 0.5.3 | Prepping tables for machine learning +[smmap](https://pypi.org/project/smmap) | 5.0.2 | A pure Python implementation of a sliding window memory map manager +[sniffio](https://pypi.org/project/sniffio) | 1.3.1 | Sniff out which async library your code is running under +[snowballstemmer](https://pypi.org/project/snowballstemmer) | 2.2.0 | This package provides 29 stemmers for 28 languages generated from Snowball algorithms. +[sortedcontainers](https://pypi.org/project/sortedcontainers) | 2.4.0 | Sorted Containers -- Sorted List, Sorted Dict, Sorted Set +[sounddevice](https://pypi.org/project/sounddevice) | 0.5.1 | Play and Record Sound with Python +[soupsieve](https://pypi.org/project/soupsieve) | 2.6 | A modern CSS selector implementation for Beautiful Soup. +[sphinx](https://pypi.org/project/sphinx) | 8.1.3 | Python documentation generator +[sphinx-rtd-theme](https://pypi.org/project/sphinx-rtd-theme) | 3.0.2 | Read the Docs theme for Sphinx +[sphinxcontrib-applehelp](https://pypi.org/project/sphinxcontrib-applehelp) | 2.0.0 | sphinxcontrib-applehelp is a Sphinx extension which outputs Apple help books +[sphinxcontrib-devhelp](https://pypi.org/project/sphinxcontrib-devhelp) | 2.0.0 | sphinxcontrib-devhelp is a sphinx extension which outputs Devhelp documents +[sphinxcontrib-htmlhelp](https://pypi.org/project/sphinxcontrib-htmlhelp) | 2.1.0 | sphinxcontrib-htmlhelp is a sphinx extension which renders HTML help files +[sphinxcontrib-jquery](https://pypi.org/project/sphinxcontrib-jquery) | 4.1 | Extension to include jQuery on newer Sphinx releases +[sphinxcontrib-jsmath](https://pypi.org/project/sphinxcontrib-jsmath) | 1.0.1 | A sphinx extension which renders display math in HTML via JavaScript +[sphinxcontrib-qthelp](https://pypi.org/project/sphinxcontrib-qthelp) | 2.0.0 | sphinxcontrib-qthelp is a sphinx extension which outputs QtHelp documents +[sphinxcontrib-serializinghtml](https://pypi.org/project/sphinxcontrib-serializinghtml) | 2.0.0 | sphinxcontrib-serializinghtml is a sphinx extension which outputs "serialized" HTML files (json and pickle) +[spyder](https://pypi.org/project/spyder) | 6.0.7 | The Scientific Python Development Environment +[spyder-kernels](https://pypi.org/project/spyder-kernels) | 3.0.5 | Jupyter kernels for Spyder's console +[sqlalchemy](https://pypi.org/project/sqlalchemy) | 2.0.40 | Database Abstraction Library +[sqlite-bro](https://pypi.org/project/sqlite-bro) | 0.13.1 | a graphic SQLite Client in 1 Python file +[sqlite-fts4](https://pypi.org/project/sqlite-fts4) | 1.0.3 | Python functions for working with SQLite FTS4 search +[sqlite-utils](https://pypi.org/project/sqlite-utils) | 3.38 | CLI tool and Python library for manipulating SQLite databases +[sqlparse](https://pypi.org/project/sqlparse) | 0.5.3 | A non-validating SQL parser. +[squarify](https://pypi.org/project/squarify) | 0.4.4 | Pure Python implementation of the squarify treemap layout algorithm +[sse-starlette](https://pypi.org/project/sse-starlette) | 2.2.1 | SSE plugin for Starlette +[sspilib](https://pypi.org/project/sspilib) | 0.2.0 | SSPI API bindings for Python +[stack-data](https://pypi.org/project/stack-data) | 0.6.3 | Extract data from python stack frames and tracebacks for informative displays +[starlette](https://pypi.org/project/starlette) | 0.46.2 | The little ASGI library that shines. +[statsmodels](https://pypi.org/project/statsmodels) | 0.14.4 | Statistical computations and models for Python +[streamlit](https://pypi.org/project/streamlit) | 1.46.0 | A faster way to build and share data apps +[superqt](https://pypi.org/project/superqt) | 0.7.3 | Missing widgets and components for PyQt/PySide +[sv-ttk](https://pypi.org/project/sv-ttk) | 2.6.0 | A gorgeous theme for Tkinter, based on Windows 11's UI +[sympy](https://pypi.org/project/sympy) | 1.14.0 | Computer algebra system (CAS) in Python +[tabulate](https://pypi.org/project/tabulate) | 0.9.0 | Pretty-print tabular data +[tblib](https://pypi.org/project/tblib) | 3.1.0 | Traceback serialization library. +[tenacity](https://pypi.org/project/tenacity) | 9.1.2 | Retry code until it succeeds +[termcolor](https://pypi.org/project/termcolor) | 3.1.0 | ANSI color formatting for output in terminal +[terminado](https://pypi.org/project/terminado) | 0.18.1 | Tornado websocket backend for the Xterm.js Javascript terminal emulator library. +[text-unidecode](https://pypi.org/project/text-unidecode) | 1.3 | The most basic Text::Unidecode port +[textdistance](https://pypi.org/project/textdistance) | 4.6.3 | Compute distance between the two texts. +[thefuzz](https://pypi.org/project/thefuzz) | 0.22.1 | Fuzzy string matching in python +[threadpoolctl](https://pypi.org/project/threadpoolctl) | 3.6.0 | threadpoolctl +[three-merge](https://pypi.org/project/three-merge) | 0.1.1 | Simple library for merging two strings with respect to a base one +[tifffile](https://pypi.org/project/tifffile) | 2025.3.30 | Read and write TIFF files +[tiktoken](https://pypi.org/project/tiktoken) | 0.9.0 | tiktoken is a fast BPE tokeniser for use with OpenAI's models +[tinycss2](https://pypi.org/project/tinycss2) | 1.4.0 | A tiny CSS parser +[tokenizers](https://pypi.org/project/tokenizers) | 0.21.1 | +[toml](https://pypi.org/project/toml) | 0.10.2 | Python Library for Tom's Obvious, Minimal Language +[tomli](https://pypi.org/project/tomli) | 2.2.1 | A lil' TOML parser +[tomli-w](https://pypi.org/project/tomli-w) | 1.2.0 | A lil' TOML writer +[tomlkit](https://pypi.org/project/tomlkit) | 0.13.2 | Style preserving TOML library +[toolz](https://pypi.org/project/toolz) | 1.0.0 | List processing tools and functional utilities +[tornado](https://pypi.org/project/tornado) | 6.5.1 | Tornado is a Python web framework and asynchronous networking library, originally developed at FriendFeed. +[tqdm](https://pypi.org/project/tqdm) | 4.67.1 | Fast, Extensible Progress Meter +[traitlets](https://pypi.org/project/traitlets) | 5.14.3 | Traitlets Python configuration system +[traittypes](https://pypi.org/project/traittypes) | 0.2.1 | Scipy trait types +[trio](https://pypi.org/project/trio) | 0.30.0 | A friendly Python library for async concurrency and I/O +[trove-classifiers](https://pypi.org/project/trove-classifiers) | 2025.5.9.12 | Canonical source for classifiers on PyPI (pypi.org). +[twine](https://pypi.org/project/twine) | 6.1.0 | Collection of utilities for publishing packages on PyPI +[typer](https://pypi.org/project/typer) | 0.15.2 | Typer, build great CLIs. Easy to code. Based on Python type hints. +[types-python-dateutil](https://pypi.org/project/types-python-dateutil) | 2.9.0.20240316 | Typing stubs for python-dateutil +[types-requests](https://pypi.org/project/types-requests) | 2.32.0.20250328 | Typing stubs for requests +[typing-extensions](https://pypi.org/project/typing-extensions) | 4.13.2 | Backported and Experimental Type Hints for Python 3.8+ +[typing-inspection](https://pypi.org/project/typing-inspection) | 0.4.0 | Runtime typing introspection tools +[tzdata](https://pypi.org/project/tzdata) | 2025.2 | Provider of IANA time zone data +[tzlocal](https://pypi.org/project/tzlocal) | 5.3.1 | tzinfo object for the local timezone +[uc-micro-py](https://pypi.org/project/uc-micro-py) | 1.0.3 | Micro subset of unicode data files for linkify-it-py projects. +[ujson](https://pypi.org/project/ujson) | 5.10.0 | Ultra fast JSON encoder and decoder for Python +[umap-learn](https://pypi.org/project/umap-learn) | 0.5.7 | Uniform Manifold Approximation and Projection +[uncertainties](https://pypi.org/project/uncertainties) | 3.2.2 | calculations with values with uncertainties, error propagation +[uri-template](https://pypi.org/project/uri-template) | 1.3.0 | RFC 6570 URI Template Processor +[urllib3](https://pypi.org/project/urllib3) | 2.4.0 | HTTP library with thread-safe connection pooling, file post, and more. +[uvicorn](https://pypi.org/project/uvicorn) | 0.34.2 | The lightning-fast ASGI server. +[vega-datasets](https://pypi.org/project/vega-datasets) | 0.9.0 | A Python package for offline access to Vega datasets +[waitress](https://pypi.org/project/waitress) | 3.0.0 | Waitress WSGI server +[watchdog](https://pypi.org/project/watchdog) | 6.0.0 | Filesystem events monitoring +[wcwidth](https://pypi.org/project/wcwidth) | 0.2.13 | Measures the displayed width of unicode strings in a terminal +[webcolors](https://pypi.org/project/webcolors) | 24.11.1 | A library for working with the color formats defined by HTML and CSS. +[webencodings](https://pypi.org/project/webencodings) | 0.5.1 | Character encoding aliases for legacy web content +[websocket-client](https://pypi.org/project/websocket-client) | 1.8.0 | WebSocket client for Python with low level API options +[websockets](https://pypi.org/project/websockets) | 14.2 | An implementation of the WebSocket Protocol (RFC 6455 & 7692) +[werkzeug](https://pypi.org/project/werkzeug) | 3.1.3 | The comprehensive WSGI web application library. +[whatthepatch](https://pypi.org/project/whatthepatch) | 1.0.7 | A patch parsing and application library. +[wheel](https://pypi.org/project/wheel) | 0.45.1 | A built-package format for Python +[widgetsnbextension](https://pypi.org/project/widgetsnbextension) | 4.0.14 | Jupyter interactive widgets for Jupyter Notebook +[winpython](https://pypi.org/project/winpython) | 16.6.20250620 | WinPython distribution tools, including WPPM +[wordcloud](https://pypi.org/project/wordcloud) | 1.9.4 | A little word cloud generator +[wrapt](https://pypi.org/project/wrapt) | 1.16.0 | Module for decorators, wrappers and monkey patching. +[wsproto](https://pypi.org/project/wsproto) | 1.2.0 | WebSockets state-machine based protocol implementation +[xarray](https://pypi.org/project/xarray) | 2025.4.0 | N-D labeled arrays and datasets in Python +[xlsxwriter](https://pypi.org/project/xlsxwriter) | 3.2.3 | A Python module for creating Excel XLSX files. +[xyzservices](https://pypi.org/project/xyzservices) | 2023.10.1 | Source of XYZ tiles providers +[yapf](https://pypi.org/project/yapf) | 0.40.1 | A formatter for Python code. +[yarl](https://pypi.org/project/yarl) | 1.18.3 | Yet another URL library +[yt-dlp](https://pypi.org/project/yt-dlp) | 2025.2.19 | A feature-rich command-line audio/video downloader +[zict](https://pypi.org/project/zict) | 3.0.0 | Mutable mapping tools +[zipp](https://pypi.org/project/zipp) | 3.21.0 | Backport of pathlib-compatible object wrapper for zip files +[zstandard](https://pypi.org/project/zstandard) | 0.23.0 | Zstandard bindings for Python + + +### WheelHouse packages + +Name | Version | Description +-----|---------|------------ + + +
    diff --git a/changelogs/WinPythonslim-64bit-3.13.5.0_History.md b/changelogs/WinPythonslim-64bit-3.13.5.0_History.md new file mode 100644 index 00000000..894ae809 --- /dev/null +++ b/changelogs/WinPythonslim-64bit-3.13.5.0_History.md @@ -0,0 +1,200 @@ +## History of changes for WinPython-64bit 3.13.5.0slim + +The following changes were made to WinPython-64bit distribution since version 3.13.3.0slim. + + +
    + +### Tools + + +New packages: + * Python 3.13.5 (Python programming language with standard library) + +### Python packages + + +New packages: + * argcomplete 3.6.2 (Bash tab completion for argparse) + * bcrypt 4.3.0 (Modern password hashing for your software and your servers) + * fasta2a 0.2.9 (Convert an AI Agent into a A2A server! ✨) + * google-genai 1.16.1 (GenAI Python SDK) + * mcp 1.9.3 (Model Context Protocol SDK) + * opentelemetry-api 1.32.1 (OpenTelemetry Python API) + * pydantic-evals 0.2.9 (Framework for evaluating stochastic code execution, especially code making use of LLMs) + * pydantic-settings 2.8.1 (Settings management using Pydantic) + * sse-starlette 2.2.1 (SSE plugin for Starlette) + * typing-inspection 0.4.0 (Runtime typing introspection tools) + * websockets 14.2 (An implementation of the WebSocket Protocol (RFC 6455 & 7692)) + +Upgraded packages: + * aiohappyeyeballs 2.4.4 → 2.6.1 (Happy Eyeballs for asyncio) + * aiohttp 3.11.11 → 3.11.18 (Async http client/server framework (asyncio)) + * aiosignal 1.3.1 → 1.3.2 (aiosignal: a list of registered asynchronous callbacks) + * alembic 1.15.1 → 1.15.2 (A database migration tool for SQLAlchemy.) + * anthropic 0.49.0 → 0.51.0 (The official Python library for the anthropic API) + * anyio 4.8.0 → 4.9.0 (High level compatibility layer for multiple asynchronous event loop implementations) + * anywidget 0.9.12 → 0.9.18 (custom jupyter widgets made easy) + * asteval 0.9.31 → 1.0.5 (Safe, minimalistic evaluator of python expression using ast module) + * astroid 3.1.0 → 3.3.9 (An abstract syntax tree for Python with inference support.) + * asttokens 2.4.1 → 3.0.0 (Annotate AST trees with source code positions) + * attrs 23.2.0 → 25.3.0 (Classes Without Boilerplate) + * babel 2.16.0 → 2.17.0 (Internationalization utilities) + * beautifulsoup4 4.12.2 → 4.13.3 (Screen-scraping library) + * bleach 6.1.0 → 6.2.0 (An easy safelist-based HTML-sanitizing tool.) + * bokeh 3.7.2 → 3.7.3 (Interactive plots and applications in the browser from Python) + * branca 0.8.0 → 0.8.1 (Generate complex HTML+JS pages with Python) + * cohere 5.13.12 → 5.15.0 () + * colorlog 6.8.2 → 6.9.0 (Add colours to the output of Python's logging module.) + * contourpy 1.3.1 → 1.3.2 (Python library for calculating contours of 2D quadrilateral grids) + * cython 3.0.12 → 3.1.1 (The Cython compiler for writing C extensions in the Python language.) + * dask 2025.3.0 → 2025.4.1 (Parallel PyData with Task Scheduling) + * debugpy 1.8.0 → 1.8.13 (An implementation of the Debug Adapter Protocol for Python) + * decorator 5.1.1 → 5.2.1 (Decorators for Humans) + * dill 0.3.9 → 0.4.0 (serialize all of Python) + * distributed 2025.3.0 → 2025.4.1 (Distributed scheduler for Dask) + * distro 1.8.0 → 1.9.0 (Distro - an OS platform information API) + * django 5.0.7 → 5.2 (A high-level Python web framework that encourages rapid development and clean, pragmatic design.) + * dnspython 2.6.1 → 2.7.0 (DNS toolkit) + * duckdb 1.2.2 → 1.3.0 (DuckDB in-process database) + * faker 36.1.1 → 37.1.0 (Faker is a Python package that generates fake data for you.) + * fastapi 0.115.8 → 0.115.12 (FastAPI framework, high performance, easy to learn, fast to code, ready for production) + * fastjsonschema 2.18.0 → 2.21.1 (Fastest Python implementation of JSON schema) + * filelock 3.17.0 → 3.18.0 (A platform independent file lock.) + * flit 3.10.1 → 3.12.0 (A simple packaging tool for simple packages.) + * fonttools 4.55.3 → 4.57.0 (Tools to manipulate font files) + * fsspec 2024.6.1 → 2025.3.2 (File-system specification) + * gitdb 4.0.10 → 4.0.12 (Git Object Database) + * gitpython 3.1.32 → 3.1.44 (GitPython is a Python library used to interact with Git repositories) + * graphene 3.3 → 3.4.3 (GraphQL Framework for Python) + * griffe 1.5.5 → 1.7.2 (Signatures for entire Python programs.) + * groq 0.13.1 → 0.25.0 (The official Python library for the groq API) + * guidata 3.7.1 → 3.9.0 (Automatic GUI generation for easy dataset editing and display) + * h2 4.1.0 → 4.2.0 (Pure-Python HTTP/2 protocol implementation) + * httpcore 1.0.5 → 1.0.7 (A minimal low-level HTTP client.) + * httpx 0.27.2 → 0.28.1 (The next generation HTTP client.) + * hupper 1.12 → 1.12.1 (Integrated process monitor for developing and reloading daemons.) + * iniconfig 2.0.0 → 2.1.0 (brain-dead simple config-ini parsing) + * intervaltree 3.0.2 → 3.1.0 (Editable interval tree data structure for Python 2 and 3) + * ipython 8.34.0 → 8.36.0 (IPython: Productive Interactive Computing) + * jinja2 3.1.2 → 3.1.6 (A very fast and expressive template engine.) + * jiter 0.8.2 → 0.9.0 (Fast iterable JSON parser.) + * json5 0.9.14 → 0.10.0 (A Python implementation of the JSON5 data format.) + * jsonpointer 2.4 → 3.0.0 (Identify specific nodes in a JSON document (RFC 6901)) + * jsonschema 4.19.2 → 4.23.0 (An implementation of JSON Schema validation for Python) + * jupyterlab 4.4.1 → 4.4.2 (JupyterLab computational environment) + * keras 3.9.2 → 3.10.0 (Multi-backend Keras) + * langchain 0.3.23 → 0.3.25 (Building applications with LLMs through composability) + * langsmith 0.3.24 → 0.3.42 (Client library to connect to the LangSmith LLM Tracing and Evaluation Platform.) + * lmfit 1.3.1 → 1.3.3 (Least-Squares Minimization with Bounds and Constraints) + * mako 1.3.5 → 1.3.9 (A super-fast templating language that borrows the best ideas from the existing templating languages.) + * matplotlib 3.10.1 → 3.10.3 (Python plotting package) + * maturin 1.8.1 → 1.8.3 (Build and publish crates with pyo3, cffi and uniffi bindings as well as rust binaries as python packages) + * missingno 0.5.1 → 0.5.2 (Missing data visualization module for Python.) + * mistralai 1.2.5 → 1.8.1 (Python Client SDK for the Mistral AI API.) + * mistune 2.0.5 → 3.1.3 (A sane and fast Markdown parser with useful plugins and renderers) + * mpld3 0.5.8 → 0.5.10 (D3 Viewer for Matplotlib) + * multidict 6.1.0 → 6.4.3 (multidict implementation) + * narwhals 1.30.0 → 1.36.0 (Extremely lightweight compatibility layer between dataframe libraries) + * nbclient 0.10.0 → 0.10.2 (A client library for executing notebooks. Formerly nbconvert's ExecutePreprocessor.) + * nbconvert 7.16.1 → 7.16.6 (Converting Jupyter Notebooks (.ipynb files) to other formats. Output formats include asciidoc, html, latex, markdown, pdf, py, rst, script.) + * notebook 7.4.0 → 7.4.2 (Jupyter Notebook - A web-based notebook environment for interactive computing) + * numpy 2.2.4 → 2.2.6 (Fundamental package for array computing in Python) + * numpydoc 1.6.0 → 1.8.0 (Sphinx extension to support docstrings in Numpy format) + * openai 1.72.0 → 1.82.0 (The official Python library for the openai API) + * openpyxl 3.1.2 → 3.1.5 (A Python library to read/write Excel 2010 xlsx/xlsm files) + * optree 0.14.0 → 0.14.1 (Optimized PyTree Utilities.) + * optuna 3.6.1 → 4.2.1 (A hyperparameter optimization framework) + * orjson 3.10.12 → 3.10.16 (Fast, correct Python JSON library supporting dataclasses, datetimes, and numpy) + * pandocfilters 1.5.0 → 1.5.1 (Utilities for writing pandoc filters in python) + * panel 1.6.2 → 1.6.3 (The powerful data exploration & web app framework for Python.) + * partd 1.4.0 → 1.4.2 (Appendable key-value storage) + * pathspec 0.11.0 → 0.12.1 (Utility library for gitignore style pattern matching of file paths.) + * patsy 0.5.6 → 1.0.1 (A Python package for describing statistical models and for building design matrices.) + * pexpect 4.8.0 → 4.9.0 (Pexpect allows easy control of interactive console applications.) + * pg8000 1.23.0 → 1.31.2 (PostgreSQL interface library) + * pip 25.0.1 → 25.1.1 (The PyPA recommended tool for installing Python packages.) + * platformdirs 4.3.6 → 4.3.7 (A small Python package for determining appropriate platform-specific dirs, e.g. a `user data dir`.) + * plotpy 2.7.2 → 2.7.4 (Curve and image plotting tools for Python/Qt applications) + * polars 1.27.1 → 1.31.0 (Blazingly fast DataFrame library) + * prettytable 3.3.0 → 3.16.0 (A simple Python library for easily displaying tabular data in a visually appealing ASCII table format) + * prince 0.15.0 → 0.16.0 (Factor analysis in Python: PCA, CA, MCA, MFA, FAMD, GPA) + * propcache 0.2.1 → 0.3.1 (Accelerated property cache) + * protobuf 5.27.3 → 6.30.2 () + * psutil 5.9.8 → 7.0.0 (Cross-platform lib for process and system monitoring in Python. NOTE: the syntax of this script MUST be kept compatible with Python 2.7.) + * psygnal 0.11.1 → 0.12.0 (Fast python callback/event system modeled after Qt Signals) + * pyarrow 19.0.1 → 20.0.0 (Python library for Apache Arrow) + * pyerfa 2.0.1.4 → 2.0.1.5 (Python bindings for ERFA) + * pylint 3.1.0 → 3.3.6 (python code static checker) + * pynndescent 0.5.12 → 0.5.13 (Nearest Neighbor Descent) + * pyomo 6.9.1 → 6.9.2 (Pyomo: Python Optimization Modeling Objects) + * pyparsing 3.2.1 → 3.2.3 (pyparsing module - Classes and methods to define and execute parsing grammars) + * pypdf 5.1.0 → 5.4.0 (A pure-python PDF library capable of splitting, merging, cropping, and transforming PDF files) + * pyqt5 5.15.10 → 5.15.11 (Python bindings for the Qt cross platform application toolkit) + * pyqtwebengine 5.15.6 → 5.15.7 (Python bindings for the Qt WebEngine framework) + * pytest 8.3.4 → 8.3.5 (pytest: simple powerful testing with Python) + * pythonqwt 0.14.4 → 0.14.5 (Qt plotting widgets for Python) + * pytz 2024.2 → 2025.2 (World timezone definitions, modern and historical) + * pywin32 308 → 310 (Python for Window Extensions) + * pywinpty 2.0.14 → 2.0.15 (Pseudo terminal support for Windows from Python.) + * pyzmq 26.2.1 → 26.4.0 (Python bindings for 0MQ) + * qstylizer 0.2.2 → 0.2.4 (Stylesheet Generator for PyQt{4-5}/PySide{1-2}) + * qtpy 2.4.1 → 2.4.3 (Provides an abstraction layer on top of the various Qt bindings (PyQt5/6 and PySide2/6).) + * rapidfuzz 3.9.6 → 3.13.0 (rapid fuzzy string matching) + * redis 5.0.8 → 5.2.1 (Python client for Redis database and key-value store) + * referencing 0.35.1 → 0.36.2 (JSON Referencing + Python) + * reportlab 4.2.5 → 4.3.1 (The Reportlab Toolkit) + * rich 13.9.4 → 14.0.0 (Render rich text, tables, progress bars, syntax highlighting, markdown and more to the terminal) + * rope 1.12.0 → 1.13.0 (a python refactoring library...) + * rtree 1.3.0 → 1.4.0 (R-Tree spatial index for Python GIS) + * scipy 1.15.2 → 1.15.3 (Fundamental algorithms for scientific computing in Python) + * setuptools 75.8.2 → 79.0.1 (Easily download, build, install, upgrade, and uninstall Python packages) + * shapely 2.0.6 → 2.1.0 (Manipulation and analysis of geometric objects) + * six 1.16.0 → 1.17.0 (Python 2 and 3 compatibility utilities) + * skrub 0.5.1 → 0.5.3 (Prepping tables for machine learning) + * smmap 5.0.0 → 5.0.2 (A pure Python implementation of a sliding window memory map manager) + * sniffio 1.3.0 → 1.3.1 (Sniff out which async library your code is running under) + * sphinx 7.3.7 → 8.1.3 (Python documentation generator) + * spyder 6.0.5 → 6.0.7 (The Scientific Python Development Environment) + * sqlalchemy 2.0.38 → 2.0.40 (Database Abstraction Library) + * starlette 0.45.3 → 0.46.2 (The little ASGI library that shines.) + * streamlit 1.44.0 → 1.46.0 (A faster way to build and share data apps) + * superqt 0.7.1 → 0.7.3 (Missing widgets and components for PyQt/PySide) + * sympy 1.13.3 → 1.14.0 (Computer algebra system (CAS) in Python) + * tblib 3.0.0 → 3.1.0 (Traceback serialization library.) + * tenacity 9.0.0 → 9.1.2 (Retry code until it succeeds) + * termcolor 2.5.0 → 3.1.0 (ANSI color formatting for output in terminal) + * threadpoolctl 3.5.0 → 3.6.0 (threadpoolctl) + * tifffile 2025.1.10 → 2025.3.30 (Read and write TIFF files) + * tiktoken 0.8.0 → 0.9.0 (tiktoken is a fast BPE tokeniser for use with OpenAI's models) + * tokenizers 0.21.0 → 0.21.1 () + * tornado 6.4.2 → 6.5.1 (Tornado is a Python web framework and asynchronous networking library, originally developed at FriendFeed.) + * tqdm 4.66.4 → 4.67.1 (Fast, Extensible Progress Meter) + * traitlets 5.14.1 → 5.14.3 (Traitlets Python configuration system) + * trio 0.29.0 → 0.30.0 (A friendly Python library for async concurrency and I/O) + * tzdata 2024.1 → 2025.2 (Provider of IANA time zone data) + * tzlocal 5.2 → 5.3.1 (tzinfo object for the local timezone) + * urllib3 2.2.3 → 2.4.0 (HTTP library with thread-safe connection pooling, file post, and more.) + * uvicorn 0.34.0 → 0.34.2 (The lightning-fast ASGI server.) + * winpython 15.3.20250425 → 16.6.20250620 (WinPython distribution tools, including WPPM) + * xarray 2025.3.0 → 2025.4.0 (N-D labeled arrays and datasets in Python) + * xlsxwriter 3.1.9 → 3.2.3 (A Python module for creating Excel XLSX files.) + +Removed packages: + * Python 3.13.3 (Python programming language with standard library) + * aniso8601 9.0.1 (A library for parsing ISO 8601 strings.) + * fast-histogram 0.14 (Fast simple 1D and 2D histograms) + * jsonpath-python 1.0.6 (A more powerful JSONPath implementation in modern python) + * mpl-scatter-density 0.7 (Matplotlib helpers to make density scatter plots) + * pydantic-ai 0.0.24 (Agent Framework / shim to use Pydantic with LLMs) + * typing-inspect 0.9.0 (Runtime inspection utilities for typing module.) + +### WheelHouse packages + + +No differences found. + + +
    + +* * * diff --git a/changelogs/WinPythonwhl-64bit-3.12.10.1.md b/changelogs/WinPythonwhl-64bit-3.12.10.1.md new file mode 100644 index 00000000..2872b31f --- /dev/null +++ b/changelogs/WinPythonwhl-64bit-3.12.10.1.md @@ -0,0 +1,522 @@ +## WinPython 3.12.10.1whl + +The following packages are included in WinPython-64bit v3.12.10.1whl 3.10.11.1dot. + +
    + +### Tools + +Name | Version | Description +-----|---------|------------ +[Python](http://www.python.org/) | 3.12.10 | Python programming language with standard library + + +### Python packages + +Name | Version | Description +-----|---------|------------ +[build](https://pypi.org/project/build) | 1.2.2.post1 | A simple, correct Python build frontend +[colorama](https://pypi.org/project/colorama) | 0.4.6 | Cross-platform colored terminal text. +[packaging](https://pypi.org/project/packaging) | 25.0 | Core utilities for Python packages +[pip](https://pypi.org/project/pip) | 25.1.1 | The PyPA recommended tool for installing Python packages. +[pyproject-hooks](https://pypi.org/project/pyproject-hooks) | 1.2.0 | Wrappers to call pyproject.toml-based build backend hooks. +[setuptools](https://pypi.org/project/setuptools) | 79.0.1 | Easily download, build, install, upgrade, and uninstall Python packages +[sqlite-bro](https://pypi.org/project/sqlite-bro) | 0.13.1 | a graphic SQLite Client in 1 Python file +[sv-ttk](https://pypi.org/project/sv-ttk) | 2.6.0 | A gorgeous theme for Tkinter, based on Windows 11's UI +[wheel](https://pypi.org/project/wheel) | 0.45.1 | A built-package format for Python +[winpython](https://pypi.org/project/winpython) | 16.6.20250620 | WinPython distribution tools, including WPPM + + +### WheelHouse packages + +Name | Version | Description +-----|---------|------------ +[absl-py](https://pypi.org/project/absl-py) | 2.2.2 | Abseil Python Common Libraries, see https://github.com/abseil/abseil-py. +[adbc-driver-manager](https://pypi.org/project/adbc-driver-manager) | 1.3.0 | A generic entrypoint for ADBC drivers. +[aiofiles](https://pypi.org/project/aiofiles) | 23.2.1 | File support for asyncio. +[aiohappyeyeballs](https://pypi.org/project/aiohappyeyeballs) | 2.6.1 | Happy Eyeballs for asyncio +[aiohttp](https://pypi.org/project/aiohttp) | 3.11.18 | Async http client/server framework (asyncio) +[aiosignal](https://pypi.org/project/aiosignal) | 1.3.2 | aiosignal: a list of registered asynchronous callbacks +[aiosqlite](https://pypi.org/project/aiosqlite) | 0.20.0 | asyncio bridge to the standard sqlite3 module +[alabaster](https://pypi.org/project/alabaster) | 0.7.16 | A light, configurable Sphinx theme +[alembic](https://pypi.org/project/alembic) | 1.15.2 | A database migration tool for SQLAlchemy. +[altair](https://pypi.org/project/altair) | 5.5.0 | Vega-Altair: A declarative statistical visualization library for Python. +[annotated-types](https://pypi.org/project/annotated-types) | 0.7.0 | Reusable constraint types to use with typing.Annotated +[ansicolors](https://pypi.org/project/ansicolors) | 1.1.8 | ANSI colors for Python +[anthropic](https://pypi.org/project/anthropic) | 0.51.0 | The official Python library for the anthropic API +[anyio](https://pypi.org/project/anyio) | 4.9.0 | High level compatibility layer for multiple asynchronous event loop implementations +[anywidget](https://pypi.org/project/anywidget) | 0.9.18 | custom jupyter widgets made easy +[appdirs](https://pypi.org/project/appdirs) | 1.4.4 | A small Python module for determining appropriate platform-specific dirs, e.g. a "user data dir". +[argcomplete](https://pypi.org/project/argcomplete) | 3.6.2 | Bash tab completion for argparse +[argon2-cffi](https://pypi.org/project/argon2-cffi) | 23.1.0 | Argon2 for Python +[argon2-cffi-bindings](https://pypi.org/project/argon2-cffi-bindings) | 21.2.0 | Low-level CFFI bindings for Argon2 +[array-api-compat](https://pypi.org/project/array-api-compat) | 1.12.0 | A wrapper around NumPy and other array libraries to make them compatible with the Array API standard +[arrow](https://pypi.org/project/arrow) | 1.3.0 | Better dates & times for Python +[asgi-csrf](https://pypi.org/project/asgi-csrf) | 0.11 | ASGI middleware for protecting against CSRF attacks +[asgiref](https://pypi.org/project/asgiref) | 3.8.1 | ASGI specs, helper code, and adapters +[asn1crypto](https://pypi.org/project/asn1crypto) | 1.5.1 | Fast ASN.1 parser and serializer with definitions for private keys, public keys, certificates, CRL, OCSP, CMS, PKCS#3, PKCS#7, PKCS#8, PKCS#12, +[asteval](https://pypi.org/project/asteval) | 1.0.5 | Safe, minimalistic evaluator of python expression using ast module +[astroid](https://pypi.org/project/astroid) | 3.3.9 | An abstract syntax tree for Python with inference support. +[astropy](https://pypi.org/project/astropy) | 6.1.6 | Astronomy and astrophysics core library +[astropy-iers-data](https://pypi.org/project/astropy-iers-data) | 0.2024.12.23.0.33.24 | IERS Earth Rotation and Leap Second tables for the astropy core package +[asttokens](https://pypi.org/project/asttokens) | 3.0.0 | Annotate AST trees with source code positions +[async-lru](https://pypi.org/project/async-lru) | 2.0.5 | Simple LRU cache for asyncio +[asyncssh](https://pypi.org/project/asyncssh) | 2.20.0 | AsyncSSH: Asynchronous SSHv2 client and server library +[atomicwrites](https://pypi.org/project/atomicwrites) | 1.4.0 | Atomic file writes. +[attrs](https://pypi.org/project/attrs) | 25.3.0 | Classes Without Boilerplate +[autopep8](https://pypi.org/project/autopep8) | 2.0.4 | A tool that automatically formats Python code to conform to the PEP 8 style guide +[azure-core](https://pypi.org/project/azure-core) | 1.32.0 | Microsoft Azure Core Library for Python +[azure-cosmos](https://pypi.org/project/azure-cosmos) | 4.9.0 | Microsoft Azure Cosmos Client Library for Python +[azure-identity](https://pypi.org/project/azure-identity) | 1.21.0 | Microsoft Azure Identity Library for Python +[babel](https://pypi.org/project/babel) | 2.17.0 | Internationalization utilities +[baresql](https://pypi.org/project/baresql) | 1.0.0 | playing SQL directly on Python datas +[bcrypt](https://pypi.org/project/bcrypt) | 4.3.0 | Modern password hashing for your software and your servers +[beautifulsoup4](https://pypi.org/project/beautifulsoup4) | 4.13.3 | Screen-scraping library +[binaryornot](https://pypi.org/project/binaryornot) | 0.4.4 | Ultra-lightweight pure Python package to check if a file is binary or text. +[black](https://pypi.org/project/black) | 25.1.0 | The uncompromising code formatter. +[bleach](https://pypi.org/project/bleach) | 6.2.0 | An easy safelist-based HTML-sanitizing tool. +[blinker](https://pypi.org/project/blinker) | 1.9.0 | Fast, simple object-to-object and broadcast signaling +[bokeh](https://pypi.org/project/bokeh) | 3.7.3 | Interactive plots and applications in the browser from Python +[branca](https://pypi.org/project/branca) | 0.8.1 | Generate complex HTML+JS pages with Python +[brotli](https://pypi.org/project/brotli) | 1.1.0 | Python bindings for the Brotli compression library +[build](https://pypi.org/project/build) | 1.2.2.post1 | A simple, correct Python build frontend +[cachetools](https://pypi.org/project/cachetools) | 5.5.2 | Extensible memoizing collections and decorators +[certifi](https://pypi.org/project/certifi) | 2025.1.31 | Python package for providing Mozilla's CA Bundle. +[cffi](https://pypi.org/project/cffi) | 1.17.1 | Foreign Function Interface for Python calling C code. +[chardet](https://pypi.org/project/chardet) | 5.2.0 | Universal encoding detector for Python 3 +[charset-normalizer](https://pypi.org/project/charset-normalizer) | 3.4.2 | The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet. +[clarabel](https://pypi.org/project/clarabel) | 0.10.0 | Clarabel Conic Interior Point Solver for Rust / Python +[click](https://pypi.org/project/click) | 8.1.8 | Composable command line interface toolkit +[click-default-group](https://pypi.org/project/click-default-group) | 1.2.4 | click_default_group +[cloudpickle](https://pypi.org/project/cloudpickle) | 3.1.1 | Pickler class to extend the standard pickle.Pickler functionality +[cohere](https://pypi.org/project/cohere) | 5.15.0 | +[colorama](https://pypi.org/project/colorama) | 0.4.6 | Cross-platform colored terminal text. +[colorlog](https://pypi.org/project/colorlog) | 6.9.0 | Add colours to the output of Python's logging module. +[comm](https://pypi.org/project/comm) | 0.2.2 | Jupyter Python Comm implementation, for usage in ipykernel, xeus-python etc. +[contourpy](https://pypi.org/project/contourpy) | 1.3.2 | Python library for calculating contours of 2D quadrilateral grids +[cookiecutter](https://pypi.org/project/cookiecutter) | 2.6.0 | A command-line utility that creates projects from project templates, e.g. +[cryptography](https://pypi.org/project/cryptography) | 44.0.0 | cryptography is a package which provides cryptographic recipes and primitives to Python developers. +[cvxpy](https://pypi.org/project/cvxpy) | 1.6.4 | A domain-specific language for modeling convex optimization problems in Python. +[cycler](https://pypi.org/project/cycler) | 0.12.1 | Composable style cycles +[cython](https://pypi.org/project/cython) | 3.1.1 | The Cython compiler for writing C extensions in the Python language. +[cytoolz](https://pypi.org/project/cytoolz) | 1.0.1 | Cython implementation of Toolz: High performance functional utilities +[dask](https://pypi.org/project/dask) | 2025.4.1 | Parallel PyData with Task Scheduling +[datasette](https://pypi.org/project/datasette) | 0.65.1 | An open source multi-tool for exploring and publishing data +[datasette-graphql](https://pypi.org/project/datasette-graphql) | 2.2 | Datasette plugin providing an automatic GraphQL API for your SQLite databases +[deap](https://pypi.org/project/deap) | 1.4.2 | Distributed Evolutionary Algorithms in Python +[debugpy](https://pypi.org/project/debugpy) | 1.8.13 | An implementation of the Debug Adapter Protocol for Python +[decorator](https://pypi.org/project/decorator) | 5.2.1 | Decorators for Humans +[defusedxml](https://pypi.org/project/defusedxml) | 0.7.1 | XML bomb protection for Python stdlib modules +[deprecated](https://pypi.org/project/deprecated) | 1.2.14 | Python @deprecated decorator to deprecate old python classes, functions or methods. +[diff-match-patch](https://pypi.org/project/diff-match-patch) | 20241021 | Repackaging of Google's Diff Match and Patch libraries. +[dill](https://pypi.org/project/dill) | 0.4.0 | serialize all of Python +[distributed](https://pypi.org/project/distributed) | 2025.4.1 | Distributed scheduler for Dask +[distro](https://pypi.org/project/distro) | 1.9.0 | Distro - an OS platform information API +[django](https://pypi.org/project/django) | 5.2 | A high-level Python web framework that encourages rapid development and clean, pragmatic design. +[dnspython](https://pypi.org/project/dnspython) | 2.7.0 | DNS toolkit +[docstring-to-markdown](https://pypi.org/project/docstring-to-markdown) | 0.17 | On the fly conversion of Python docstrings to markdown +[docutils](https://pypi.org/project/docutils) | 0.21.2 | Docutils -- Python Documentation Utilities +[duckdb](https://pypi.org/project/duckdb) | 1.3.0 | DuckDB in-process database +[entrypoints](https://pypi.org/project/entrypoints) | 0.4 | Discover and load entry points from installed packages. +[et-xmlfile](https://pypi.org/project/et-xmlfile) | 1.1.0 | An implementation of lxml.xmlfile for the standard library +[eval-type-backport](https://pypi.org/project/eval-type-backport) | 0.2.2 | Like `typing._eval_type`, but lets older Python versions use newer typing features. +[executing](https://pypi.org/project/executing) | 2.2.0 | Get the currently executing AST node of a frame, and other information +[faker](https://pypi.org/project/faker) | 37.1.0 | Faker is a Python package that generates fake data for you. +[fasta2a](https://pypi.org/project/fasta2a) | 0.2.9 | Convert an AI Agent into a A2A server! ✨ +[fastapi](https://pypi.org/project/fastapi) | 0.115.12 | FastAPI framework, high performance, easy to learn, fast to code, ready for production +[fastavro](https://pypi.org/project/fastavro) | 1.10.0 | Fast read/write of AVRO files +[fastjsonschema](https://pypi.org/project/fastjsonschema) | 2.21.1 | Fastest Python implementation of JSON schema +[filelock](https://pypi.org/project/filelock) | 3.18.0 | A platform independent file lock. +[flake8](https://pypi.org/project/flake8) | 7.1.1 | the modular source code checker: pep8 pyflakes and co +[flask](https://pypi.org/project/flask) | 3.1.0 | A simple framework for building complex web applications. +[flexcache](https://pypi.org/project/flexcache) | 0.3 | Saves and loads to the cache a transformed versions of a source object. +[flexparser](https://pypi.org/project/flexparser) | 0.4 | Parsing made fun ... using typing. +[flit](https://pypi.org/project/flit) | 3.12.0 | A simple packaging tool for simple packages. +[flit-core](https://pypi.org/project/flit-core) | 3.12.0 | Distribution-building parts of Flit. See flit package for more information +[folium](https://pypi.org/project/folium) | 0.19.5 | Make beautiful maps with Leaflet.js & Python +[fonttools](https://pypi.org/project/fonttools) | 4.57.0 | Tools to manipulate font files +[fqdn](https://pypi.org/project/fqdn) | 1.5.1 | Validates fully-qualified domain names against RFC 1123, so that they are acceptable to modern bowsers +[frozenlist](https://pypi.org/project/frozenlist) | 1.5.0 | A list-like structure which implements collections.abc.MutableSequence +[fsspec](https://pypi.org/project/fsspec) | 2025.3.2 | File-system specification +[fuzzywuzzy](https://pypi.org/project/fuzzywuzzy) | 0.18.0 | Fuzzy string matching in python +[geographiclib](https://pypi.org/project/geographiclib) | 2.0 | The geodesic routines from GeographicLib +[geopandas](https://pypi.org/project/geopandas) | 1.0.1 | Geographic pandas extensions +[geopy](https://pypi.org/project/geopy) | 2.4.1 | Python Geocoding Toolbox +[gitdb](https://pypi.org/project/gitdb) | 4.0.12 | Git Object Database +[gitpython](https://pypi.org/project/gitpython) | 3.1.44 | GitPython is a Python library used to interact with Git repositories +[google-auth](https://pypi.org/project/google-auth) | 2.38.0 | Google Authentication Library +[google-genai](https://pypi.org/project/google-genai) | 1.16.1 | GenAI Python SDK +[graphene](https://pypi.org/project/graphene) | 3.4.3 | GraphQL Framework for Python +[graphql-core](https://pypi.org/project/graphql-core) | 3.2.6 | GraphQL implementation for Python, a port of GraphQL.js, the JavaScript reference implementation for GraphQL. +[graphql-relay](https://pypi.org/project/graphql-relay) | 3.2.0 | Relay library for graphql-core +[greenlet](https://pypi.org/project/greenlet) | 3.1.1 | Lightweight in-process concurrent programming +[griffe](https://pypi.org/project/griffe) | 1.7.2 | Signatures for entire Python programs. +[groq](https://pypi.org/project/groq) | 0.25.0 | The official Python library for the groq API +[guidata](https://pypi.org/project/guidata) | 3.9.0 | Automatic GUI generation for easy dataset editing and display +[h11](https://pypi.org/project/h11) | 0.14.0 | A pure-Python, bring-your-own-I/O implementation of HTTP/1.1 +[h2](https://pypi.org/project/h2) | 4.2.0 | Pure-Python HTTP/2 protocol implementation +[h5py](https://pypi.org/project/h5py) | 3.12.1 | Read and write HDF5 files from Python +[hatchling](https://pypi.org/project/hatchling) | 1.27.0 | Modern, extensible Python build backend +[hpack](https://pypi.org/project/hpack) | 4.1.0 | Pure-Python HPACK header encoding +[html5lib](https://pypi.org/project/html5lib) | 1.1 | HTML parser based on the WHATWG HTML specification +[httpcore](https://pypi.org/project/httpcore) | 1.0.7 | A minimal low-level HTTP client. +[httpie](https://pypi.org/project/httpie) | 3.2.4 | HTTPie: modern, user-friendly command-line HTTP client for the API era. +[httpx](https://pypi.org/project/httpx) | 0.28.1 | The next generation HTTP client. +[httpx-sse](https://pypi.org/project/httpx-sse) | 0.4.0 | Consume Server-Sent Event (SSE) messages with HTTPX. +[huggingface-hub](https://pypi.org/project/huggingface-hub) | 0.33.0 | Client library to download and publish models, datasets and other repos on the huggingface.co hub +[hupper](https://pypi.org/project/hupper) | 1.12.1 | Integrated process monitor for developing and reloading daemons. +[hypercorn](https://pypi.org/project/hypercorn) | 0.17.3 | A ASGI Server based on Hyper libraries and inspired by Gunicorn +[hyperframe](https://pypi.org/project/hyperframe) | 6.1.0 | Pure-Python HTTP/2 framing +[hypothesis](https://pypi.org/project/hypothesis) | 6.130.4 | A library for property-based testing +[id](https://pypi.org/project/id) | 1.5.0 | A tool for generating OIDC identities +[idna](https://pypi.org/project/idna) | 3.10 | Internationalized Domain Names in Applications (IDNA) +[imageio](https://pypi.org/project/imageio) | 2.37.0 | Library for reading and writing a wide range of image, video, scientific, and volumetric data formats. +[imagesize](https://pypi.org/project/imagesize) | 1.4.1 | Getting image size from png/jpeg/jpeg2000/gif file +[imbalanced-learn](https://pypi.org/project/imbalanced-learn) | 0.13.0 | Toolbox for imbalanced dataset in machine learning +[importlib-metadata](https://pypi.org/project/importlib-metadata) | 8.6.1 | Read metadata from Python packages +[inflection](https://pypi.org/project/inflection) | 0.5.1 | A port of Ruby on Rails inflector to Python +[iniconfig](https://pypi.org/project/iniconfig) | 2.1.0 | brain-dead simple config-ini parsing +[intervaltree](https://pypi.org/project/intervaltree) | 3.1.0 | Editable interval tree data structure for Python 2 and 3 +[ipycanvas](https://pypi.org/project/ipycanvas) | 0.13.3 | Interactive widgets library exposing the browser's Canvas API +[ipykernel](https://pypi.org/project/ipykernel) | 6.29.5 | IPython Kernel for Jupyter +[ipyleaflet](https://pypi.org/project/ipyleaflet) | 0.19.2 | A Jupyter widget for dynamic Leaflet maps +[ipympl](https://pypi.org/project/ipympl) | 0.9.7 | Matplotlib Jupyter Extension +[ipython](https://pypi.org/project/ipython) | 8.36.0 | IPython: Productive Interactive Computing +[ipython-genutils](https://pypi.org/project/ipython-genutils) | 0.2.0 | Vestigial utilities from IPython +[ipython-sql](https://pypi.org/project/ipython-sql) | 0.5.0 | RDBMS access via IPython +[ipywidgets](https://pypi.org/project/ipywidgets) | 8.1.6 | Jupyter interactive widgets +[isoduration](https://pypi.org/project/isoduration) | 20.11.0 | Operations with ISO 8601 durations +[isort](https://pypi.org/project/isort) | 5.13.2 | A Python utility / library to sort Python imports. +[itsdangerous](https://pypi.org/project/itsdangerous) | 2.2.0 | Safely pass data to untrusted environments and back. +[janus](https://pypi.org/project/janus) | 2.0.0 | Mixed sync-async queue to interoperate between asyncio tasks and classic threads +[jaraco-classes](https://pypi.org/project/jaraco-classes) | 3.4.0 | Utility functions for Python class constructs +[jaraco-context](https://pypi.org/project/jaraco-context) | 6.0.1 | Useful decorators and context managers +[jaraco-functools](https://pypi.org/project/jaraco-functools) | 4.1.0 | Functools like those found in stdlib +[jedi](https://pypi.org/project/jedi) | 0.19.2 | An autocompletion tool for Python that can be used for text editors. +[jellyfish](https://pypi.org/project/jellyfish) | 1.1.3 | Approximate and phonetic matching of strings. +[jinja2](https://pypi.org/project/jinja2) | 3.1.6 | A very fast and expressive template engine. +[jiter](https://pypi.org/project/jiter) | 0.9.0 | Fast iterable JSON parser. +[joblib](https://pypi.org/project/joblib) | 1.4.2 | Lightweight pipelining with Python functions +[json5](https://pypi.org/project/json5) | 0.10.0 | A Python implementation of the JSON5 data format. +[jsonpatch](https://pypi.org/project/jsonpatch) | 1.33 | Apply JSON-Patches (RFC 6902) +[jsonpointer](https://pypi.org/project/jsonpointer) | 3.0.0 | Identify specific nodes in a JSON document (RFC 6901) +[jsonschema](https://pypi.org/project/jsonschema) | 4.23.0 | An implementation of JSON Schema validation for Python +[jsonschema-specifications](https://pypi.org/project/jsonschema-specifications) | 2024.10.1 | The JSON Schema meta-schemas and vocabularies, exposed as a Registry +[julia](https://pypi.org/project/julia) | 0.6.2 | Julia/Python bridge with IPython support. +[jupyter](https://pypi.org/project/jupyter) | 1.1.1 | Jupyter metapackage. Install all the Jupyter components in one go. +[jupyter-bokeh](https://pypi.org/project/jupyter-bokeh) | 4.0.5 | A Jupyter extension for rendering Bokeh content. +[jupyter-client](https://pypi.org/project/jupyter-client) | 8.6.3 | Jupyter protocol implementation and client libraries +[jupyter-console](https://pypi.org/project/jupyter-console) | 6.6.3 | Jupyter terminal console +[jupyter-core](https://pypi.org/project/jupyter-core) | 5.7.2 | Jupyter core package. A base package on which Jupyter projects rely. +[jupyter-events](https://pypi.org/project/jupyter-events) | 0.12.0 | Jupyter Event System library +[jupyter-leaflet](https://pypi.org/project/jupyter-leaflet) | 0.19.2 | ipyleaflet extensions for JupyterLab and Jupyter Notebook +[jupyter-lsp](https://pypi.org/project/jupyter-lsp) | 2.2.5 | Multi-Language Server WebSocket proxy for Jupyter Notebook/Lab server +[jupyter-server](https://pypi.org/project/jupyter-server) | 2.15.0 | The backend—i.e. core services, APIs, and REST endpoints—to Jupyter web applications. +[jupyter-server-terminals](https://pypi.org/project/jupyter-server-terminals) | 0.5.3 | A Jupyter Server Extension Providing Terminals. +[jupyterlab](https://pypi.org/project/jupyterlab) | 4.4.2 | JupyterLab computational environment +[jupyterlab-pygments](https://pypi.org/project/jupyterlab-pygments) | 0.3.0 | Pygments theme using JupyterLab CSS variables +[jupyterlab-server](https://pypi.org/project/jupyterlab-server) | 2.27.3 | A set of server components for JupyterLab and JupyterLab like applications. +[jupyterlab-widgets](https://pypi.org/project/jupyterlab-widgets) | 3.0.14 | Jupyter interactive widgets for JupyterLab +[keras](https://pypi.org/project/keras) | 3.10.0 | Multi-backend Keras +[keyring](https://pypi.org/project/keyring) | 25.6.0 | Store and access your passwords safely. +[kiwisolver](https://pypi.org/project/kiwisolver) | 1.4.8 | A fast implementation of the Cassowary constraint solver +[langchain](https://pypi.org/project/langchain) | 0.3.25 | Building applications with LLMs through composability +[langchain-core](https://pypi.org/project/langchain-core) | 0.3.59 | Building applications with LLMs through composability +[langchain-text-splitters](https://pypi.org/project/langchain-text-splitters) | 0.3.8 | LangChain text splitting utilities +[langsmith](https://pypi.org/project/langsmith) | 0.3.42 | Client library to connect to the LangSmith LLM Tracing and Evaluation Platform. +[lazy-loader](https://pypi.org/project/lazy-loader) | 0.4 | Makes it easy to load subpackages and functions on demand. +[llvmlite](https://pypi.org/project/llvmlite) | 0.44.0 | lightweight wrapper around basic LLVM functionality +[lmfit](https://pypi.org/project/lmfit) | 1.3.3 | Least-Squares Minimization with Bounds and Constraints +[locket](https://pypi.org/project/locket) | 1.0.0 | File-based locks for Python on Linux and Windows +[logfire-api](https://pypi.org/project/logfire-api) | 3.12.0 | Shim for the Logfire SDK which does nothing unless Logfire is installed +[lxml](https://pypi.org/project/lxml) | 5.3.0 | Powerful and Pythonic XML processing library combining libxml2/libxslt with the ElementTree API. +[mako](https://pypi.org/project/mako) | 1.3.9 | A super-fast templating language that borrows the best ideas from the existing templating languages. +[markdown](https://pypi.org/project/markdown) | 3.7 | Python implementation of John Gruber's Markdown. +[markdown-it-py](https://pypi.org/project/markdown-it-py) | 3.0.0 | Python port of markdown-it. Markdown parsing, done right! +[markupsafe](https://pypi.org/project/markupsafe) | 3.0.2 | Safely add untrusted strings to HTML/XML markup. +[matplotlib](https://pypi.org/project/matplotlib) | 3.10.3 | Python plotting package +[matplotlib-inline](https://pypi.org/project/matplotlib-inline) | 0.1.7 | Inline Matplotlib backend for Jupyter +[maturin](https://pypi.org/project/maturin) | 1.8.3 | Build and publish crates with pyo3, cffi and uniffi bindings as well as rust binaries as python packages +[mccabe](https://pypi.org/project/mccabe) | 0.7.0 | McCabe checker, plugin for flake8 +[mcp](https://pypi.org/project/mcp) | 1.9.3 | Model Context Protocol SDK +[mdurl](https://pypi.org/project/mdurl) | 0.1.2 | Markdown URL utilities +[mercantile](https://pypi.org/project/mercantile) | 1.2.1 | Web mercator XYZ tile utilities +[mergedeep](https://pypi.org/project/mergedeep) | 1.3.4 | A deep merge function for 🐍. +[missingno](https://pypi.org/project/missingno) | 0.5.2 | Missing data visualization module for Python. +[mistralai](https://pypi.org/project/mistralai) | 1.8.1 | Python Client SDK for the Mistral AI API. +[mistune](https://pypi.org/project/mistune) | 3.1.3 | A sane and fast Markdown parser with useful plugins and renderers +[mizani](https://pypi.org/project/mizani) | 0.11.4 | Scales for Python +[ml-dtypes](https://pypi.org/project/ml-dtypes) | 0.5.1 | +[mlxtend](https://pypi.org/project/mlxtend) | 0.23.3 | Machine Learning Library Extensions +[more-itertools](https://pypi.org/project/more-itertools) | 10.6.0 | More routines for operating on iterables, beyond itertools +[mpld3](https://pypi.org/project/mpld3) | 0.5.10 | D3 Viewer for Matplotlib +[mpmath](https://pypi.org/project/mpmath) | 1.3.0 | Python library for arbitrary-precision floating-point arithmetic +[msal](https://pypi.org/project/msal) | 1.30.0 | The Microsoft Authentication Library (MSAL) for Python library enables your app to access the Microsoft Cloud by supporting authentication of us +[msal-extensions](https://pypi.org/project/msal-extensions) | 1.2.0 | Microsoft Authentication Library extensions (MSAL EX) provides a persistence API that can save your data on disk, encrypted on Windows, macOS an +[msgpack](https://pypi.org/project/msgpack) | 1.1.0 | MessagePack serializer +[multidict](https://pypi.org/project/multidict) | 6.4.3 | multidict implementation +[mypy](https://pypi.org/project/mypy) | 1.15.0 | Optional static typing for Python +[mypy-extensions](https://pypi.org/project/mypy-extensions) | 1.0.0 | Type system extensions for programs checked with the mypy type checker. +[namex](https://pypi.org/project/namex) | 0.0.8 | A simple utility to separate the implementation of your Python package and its public API surface. +[narwhals](https://pypi.org/project/narwhals) | 1.36.0 | Extremely lightweight compatibility layer between dataframe libraries +[nbclient](https://pypi.org/project/nbclient) | 0.10.2 | A client library for executing notebooks. Formerly nbconvert's ExecutePreprocessor. +[nbconvert](https://pypi.org/project/nbconvert) | 7.16.6 | Converting Jupyter Notebooks (.ipynb files) to other formats. Output formats include asciidoc, html, latex, markdown, pdf, py, rst, script. +[nbformat](https://pypi.org/project/nbformat) | 5.10.4 | The Jupyter Notebook format +[nest-asyncio](https://pypi.org/project/nest-asyncio) | 1.6.0 | Patch asyncio to allow nested event loops +[networkx](https://pypi.org/project/networkx) | 3.4.2 | Python package for creating and manipulating graphs and networks +[nh3](https://pypi.org/project/nh3) | 0.2.18 | Python bindings to the ammonia HTML sanitization library. +[nltk](https://pypi.org/project/nltk) | 3.9.1 | Natural Language Toolkit +[notebook](https://pypi.org/project/notebook) | 7.4.2 | Jupyter Notebook - A web-based notebook environment for interactive computing +[notebook-shim](https://pypi.org/project/notebook-shim) | 0.2.4 | A shim layer for notebook traits and config +[numba](https://pypi.org/project/numba) | 0.61.2 | compiling Python code using LLVM +[numpy](https://pypi.org/project/numpy) | 2.2.6 | Fundamental package for array computing in Python +[numpydoc](https://pypi.org/project/numpydoc) | 1.8.0 | Sphinx extension to support docstrings in Numpy format +[openai](https://pypi.org/project/openai) | 1.82.0 | The official Python library for the openai API +[opencv-python](https://pypi.org/project/opencv-python) | 4.11.0.86 | Wrapper package for OpenCV python bindings. +[openpyxl](https://pypi.org/project/openpyxl) | 3.1.5 | A Python library to read/write Excel 2010 xlsx/xlsm files +[opentelemetry-api](https://pypi.org/project/opentelemetry-api) | 1.32.1 | OpenTelemetry Python API +[optree](https://pypi.org/project/optree) | 0.14.1 | Optimized PyTree Utilities. +[optuna](https://pypi.org/project/optuna) | 4.2.1 | A hyperparameter optimization framework +[orjson](https://pypi.org/project/orjson) | 3.10.16 | Fast, correct Python JSON library supporting dataclasses, datetimes, and numpy +[osqp](https://pypi.org/project/osqp) | 0.6.7.post3 | OSQP: The Operator Splitting QP Solver +[outcome](https://pypi.org/project/outcome) | 1.3.0.post0 | Capture the outcome of Python function calls. +[overrides](https://pypi.org/project/overrides) | 7.7.0 | A decorator to automatically detect mismatch when overriding a method. +[packaging](https://pypi.org/project/packaging) | 24.2 | Core utilities for Python packages +[pandas](https://pypi.org/project/pandas) | 2.2.3 | Powerful data structures for data analysis, time series, and statistics +[pandocfilters](https://pypi.org/project/pandocfilters) | 1.5.1 | Utilities for writing pandoc filters in python +[papermill](https://pypi.org/project/papermill) | 2.6.0 | Parameterize and run Jupyter and nteract Notebooks +[parso](https://pypi.org/project/parso) | 0.8.4 | A Python Parser +[partd](https://pypi.org/project/partd) | 1.4.2 | Appendable key-value storage +[pathspec](https://pypi.org/project/pathspec) | 0.12.1 | Utility library for gitignore style pattern matching of file paths. +[patsy](https://pypi.org/project/patsy) | 1.0.1 | A Python package for describing statistical models and for building design matrices. +[pep8](https://pypi.org/project/pep8) | 1.7.1 | Python style guide checker +[pexpect](https://pypi.org/project/pexpect) | 4.9.0 | Pexpect allows easy control of interactive console applications. +[pg8000](https://pypi.org/project/pg8000) | 1.31.2 | PostgreSQL interface library +[pickleshare](https://pypi.org/project/pickleshare) | 0.7.5 | Tiny 'shelve'-like database with concurrency support +[pillow](https://pypi.org/project/pillow) | 11.1.0 | Python Imaging Library (Fork) +[pip](https://pypi.org/project/pip) | 25.1.1 | The PyPA recommended tool for installing Python packages. +[platformdirs](https://pypi.org/project/platformdirs) | 4.3.7 | A small Python package for determining appropriate platform-specific dirs, e.g. a `user data dir`. +[plotly](https://pypi.org/project/plotly) | 6.0.1 | An open-source interactive data visualization library for Python +[plotnine](https://pypi.org/project/plotnine) | 0.13.6 | A Grammar of Graphics for Python +[plotpy](https://pypi.org/project/plotpy) | 2.7.4 | Curve and image plotting tools for Python/Qt applications +[pluggy](https://pypi.org/project/pluggy) | 1.5.0 | plugin and hook calling mechanisms for python +[ply](https://pypi.org/project/ply) | 3.11 | Python Lex & Yacc +[polars](https://pypi.org/project/polars) | 1.31.0 | Blazingly fast DataFrame library +[portalocker](https://pypi.org/project/portalocker) | 2.7.0 | Wraps the portalocker recipe for easy usage +[prettytable](https://pypi.org/project/prettytable) | 3.16.0 | A simple Python library for easily displaying tabular data in a visually appealing ASCII table format +[prince](https://pypi.org/project/prince) | 0.16.0 | Factor analysis in Python: PCA, CA, MCA, MFA, FAMD, GPA +[priority](https://pypi.org/project/priority) | 2.0.0 | A pure-Python implementation of the HTTP/2 priority tree +[prometheus-client](https://pypi.org/project/prometheus-client) | 0.21.1 | Python client for the Prometheus monitoring system. +[prompt-toolkit](https://pypi.org/project/prompt-toolkit) | 3.0.51 | Library for building powerful interactive command lines in Python +[propcache](https://pypi.org/project/propcache) | 0.3.1 | Accelerated property cache +[protobuf](https://pypi.org/project/protobuf) | 6.30.2 | +[psutil](https://pypi.org/project/psutil) | 7.0.0 | Cross-platform lib for process and system monitoring in Python. NOTE: the syntax of this script MUST be kept compatible with Python 2.7. +[psygnal](https://pypi.org/project/psygnal) | 0.12.0 | Fast python callback/event system modeled after Qt Signals +[ptpython](https://pypi.org/project/ptpython) | 3.0.29 | Python REPL build on top of prompt_toolkit +[ptyprocess](https://pypi.org/project/ptyprocess) | 0.7.0 | Run a subprocess in a pseudo terminal +[pure-eval](https://pypi.org/project/pure-eval) | 0.2.3 | Safely evaluate AST nodes without side effects +[pyarrow](https://pypi.org/project/pyarrow) | 20.0.0 | Python library for Apache Arrow +[pyasn1](https://pypi.org/project/pyasn1) | 0.6.1 | Pure-Python implementation of ASN.1 types and DER/BER/CER codecs (X.208) +[pyasn1-modules](https://pypi.org/project/pyasn1-modules) | 0.4.1 | A collection of ASN.1-based protocols modules +[pybind11](https://pypi.org/project/pybind11) | 2.13.6 | Seamless operability between C++11 and Python +[pycodestyle](https://pypi.org/project/pycodestyle) | 2.12.0 | Python style guide checker +[pycparser](https://pypi.org/project/pycparser) | 2.22 | C parser in Python +[pydantic](https://pypi.org/project/pydantic) | 2.10.6 | Data validation using Python type hints +[pydantic-ai-slim](https://pypi.org/project/pydantic-ai-slim) | 0.2.9 | Agent Framework / shim to use Pydantic with LLMs, slim package +[pydantic-core](https://pypi.org/project/pydantic-core) | 2.27.2 | Core functionality for Pydantic validation and serialization +[pydantic-evals](https://pypi.org/project/pydantic-evals) | 0.2.9 | Framework for evaluating stochastic code execution, especially code making use of LLMs +[pydantic-graph](https://pypi.org/project/pydantic-graph) | 0.2.9 | Graph and state machine library +[pydantic-settings](https://pypi.org/project/pydantic-settings) | 2.8.1 | Settings management using Pydantic +[pydeck](https://pypi.org/project/pydeck) | 0.9.1 | Widget for deck.gl maps +[pydocstyle](https://pypi.org/project/pydocstyle) | 6.3.0 | Python docstring style checker +[pydub](https://pypi.org/project/pydub) | 0.25.1 | Manipulate audio with an simple and easy high level interface +[pyerfa](https://pypi.org/project/pyerfa) | 2.0.1.5 | Python bindings for ERFA +[pyflakes](https://pypi.org/project/pyflakes) | 3.2.0 | passive checker of Python programs +[pygithub](https://pypi.org/project/pygithub) | 2.6.1 | Use the full Github API v3 +[pygments](https://pypi.org/project/pygments) | 2.19.1 | Pygments is a syntax highlighting package written in Python. +[pyjwt](https://pypi.org/project/pyjwt) | 2.10.1 | JSON Web Token implementation in Python +[pylint](https://pypi.org/project/pylint) | 3.3.6 | python code static checker +[pylint-venv](https://pypi.org/project/pylint-venv) | 3.0.4 | pylint-venv provides a Pylint init-hook to use the same Pylint installation with different virtual environments. +[pyls-spyder](https://pypi.org/project/pyls-spyder) | 0.4.0 | Spyder extensions for the python-lsp-server +[pymongo](https://pypi.org/project/pymongo) | 4.10.1 | Python driver for MongoDB +[pympler](https://pypi.org/project/pympler) | 1.1 | A development tool to measure, monitor and analyze the memory behavior of Python objects. +[pynacl](https://pypi.org/project/pynacl) | 1.5.0 | Python binding to the Networking and Cryptography (NaCl) library +[pynndescent](https://pypi.org/project/pynndescent) | 0.5.13 | Nearest Neighbor Descent +[pyodbc](https://pypi.org/project/pyodbc) | 5.2.0 | DB API module for ODBC +[pyogrio](https://pypi.org/project/pyogrio) | 0.10.0 | Vectorized spatial vector file format I/O using GDAL/OGR +[pyomo](https://pypi.org/project/pyomo) | 6.9.2 | Pyomo: Python Optimization Modeling Objects +[pypandoc](https://pypi.org/project/pypandoc) | 1.15 | Thin wrapper for pandoc. +[pyparsing](https://pypi.org/project/pyparsing) | 3.2.3 | pyparsing module - Classes and methods to define and execute parsing grammars +[pypdf](https://pypi.org/project/pypdf) | 5.4.0 | A pure-python PDF library capable of splitting, merging, cropping, and transforming PDF files +[pyproj](https://pypi.org/project/pyproj) | 3.7.0 | Python interface to PROJ (cartographic projections and coordinate transformations library) +[pyproject-hooks](https://pypi.org/project/pyproject-hooks) | 1.2.0 | Wrappers to call pyproject.toml-based build backend hooks. +[pyqt5](https://pypi.org/project/pyqt5) | 5.15.11 | Python bindings for the Qt cross platform application toolkit +[pyqt5-qt5](https://pypi.org/project/pyqt5-qt5) | 5.15.2 | The subset of a Qt installation needed by PyQt5. +[pyqt5-sip](https://pypi.org/project/pyqt5-sip) | 12.17.0 | The sip module support for PyQt5 +[pyqtgraph](https://pypi.org/project/pyqtgraph) | 0.13.7 | Scientific Graphics and GUI Library for Python +[pyqtwebengine](https://pypi.org/project/pyqtwebengine) | 5.15.7 | Python bindings for the Qt WebEngine framework +[pyqtwebengine-qt5](https://pypi.org/project/pyqtwebengine-qt5) | 5.15.2 | The subset of a Qt installation needed by PyQtWebEngine. +[pyserial](https://pypi.org/project/pyserial) | 3.5 | Python Serial Port Extension +[pysocks](https://pypi.org/project/pysocks) | 1.7.1 | A Python SOCKS client module. See https://github.com/Anorov/PySocks for more information. +[pyspnego](https://pypi.org/project/pyspnego) | 0.11.2 | Windows Negotiate Authentication Client and Server +[pytest](https://pypi.org/project/pytest) | 8.3.5 | pytest: simple powerful testing with Python +[python-barcode](https://pypi.org/project/python-barcode) | 0.15.1 | Create standard barcodes with Python. No external modules needed. (optional Pillow support included). +[python-dateutil](https://pypi.org/project/python-dateutil) | 2.8.2 | Extensions to the standard Python datetime module +[python-dotenv](https://pypi.org/project/python-dotenv) | 1.1.0 | Read key-value pairs from a .env file and set them as environment variables +[python-json-logger](https://pypi.org/project/python-json-logger) | 3.3.0 | JSON Log Formatter for the Python Logging Package +[python-lsp-black](https://pypi.org/project/python-lsp-black) | 2.0.0 | Black plugin for the Python LSP Server +[python-lsp-jsonrpc](https://pypi.org/project/python-lsp-jsonrpc) | 1.1.2 | JSON RPC 2.0 server library +[python-lsp-server](https://pypi.org/project/python-lsp-server) | 1.12.2 | Python Language Server for the Language Server Protocol +[python-multipart](https://pypi.org/project/python-multipart) | 0.0.20 | A streaming multipart parser for Python +[python-slugify](https://pypi.org/project/python-slugify) | 8.0.4 | A Python slugify application that also handles Unicode +[pythonqwt](https://pypi.org/project/pythonqwt) | 0.14.5 | Qt plotting widgets for Python +[pytoolconfig](https://pypi.org/project/pytoolconfig) | 1.3.1 | Python tool configuration +[pytz](https://pypi.org/project/pytz) | 2025.2 | World timezone definitions, modern and historical +[pyuca](https://pypi.org/project/pyuca) | 1.2 | a Python implementation of the Unicode Collation Algorithm +[pyusb](https://pypi.org/project/pyusb) | 1.3.1 | Easy USB access for Python +[pywavelets](https://pypi.org/project/pywavelets) | 1.8.0 | PyWavelets, wavelet transform module +[pywin32](https://pypi.org/project/pywin32) | 310 | Python for Window Extensions +[pywin32-ctypes](https://pypi.org/project/pywin32-ctypes) | 0.2.3 | A (partial) reimplementation of pywin32 using ctypes/cffi +[pywinpty](https://pypi.org/project/pywinpty) | 2.0.15 | Pseudo terminal support for Windows from Python. +[pyyaml](https://pypi.org/project/pyyaml) | 6.0.2 | YAML parser and emitter for Python +[pyzmq](https://pypi.org/project/pyzmq) | 26.4.0 | Python bindings for 0MQ +[qdarkstyle](https://pypi.org/project/qdarkstyle) | 3.2.3 | The most complete dark/light style sheet for C++/Python and Qt applications +[qdldl](https://pypi.org/project/qdldl) | 0.1.7.post5 | QDLDL, a free LDL factorization routine. +[qrcode](https://pypi.org/project/qrcode) | 8.0 | QR Code image generator +[qstylizer](https://pypi.org/project/qstylizer) | 0.2.4 | Stylesheet Generator for PyQt{4-5}/PySide{1-2} +[qtawesome](https://pypi.org/project/qtawesome) | 1.4.0 | FontAwesome icons in PyQt and PySide applications +[qtconsole](https://pypi.org/project/qtconsole) | 5.6.1 | Jupyter Qt console +[qtpy](https://pypi.org/project/qtpy) | 2.4.3 | Provides an abstraction layer on top of the various Qt bindings (PyQt5/6 and PySide2/6). +[quantecon](https://pypi.org/project/quantecon) | 0.7.2 | Import the main names to top level. +[quart](https://pypi.org/project/quart) | 0.20.0 | A Python ASGI web framework with the same API as Flask +[rapidfuzz](https://pypi.org/project/rapidfuzz) | 3.13.0 | rapid fuzzy string matching +[readme-renderer](https://pypi.org/project/readme-renderer) | 44.0 | readme_renderer is a library for rendering readme descriptions for Warehouse +[redis](https://pypi.org/project/redis) | 5.2.1 | Python client for Redis database and key-value store +[referencing](https://pypi.org/project/referencing) | 0.36.2 | JSON Referencing + Python +[regex](https://pypi.org/project/regex) | 2024.11.6 | Alternative regular expression module, to replace re. +[reportlab](https://pypi.org/project/reportlab) | 4.3.1 | The Reportlab Toolkit +[requests](https://pypi.org/project/requests) | 2.32.3 | Python HTTP for Humans. +[requests-ntlm](https://pypi.org/project/requests-ntlm) | 1.3.0 | This package allows for HTTP NTLM authentication using the requests library. +[requests-toolbelt](https://pypi.org/project/requests-toolbelt) | 1.0.0 | A utility belt for advanced users of python-requests +[rfc3339-validator](https://pypi.org/project/rfc3339-validator) | 0.1.4 | A pure python RFC3339 validator +[rfc3986](https://pypi.org/project/rfc3986) | 2.0.0 | Validating URI References per RFC 3986 +[rfc3986-validator](https://pypi.org/project/rfc3986-validator) | 0.1.1 | Pure python rfc3986 validator +[rich](https://pypi.org/project/rich) | 14.0.0 | Render rich text, tables, progress bars, syntax highlighting, markdown and more to the terminal +[rope](https://pypi.org/project/rope) | 1.13.0 | a python refactoring library... +[rpds-py](https://pypi.org/project/rpds-py) | 0.24.0 | Python bindings to Rust's persistent data structures (rpds) +[rsa](https://pypi.org/project/rsa) | 4.7.2 | Pure-Python RSA implementation +[rtree](https://pypi.org/project/rtree) | 1.4.0 | R-Tree spatial index for Python GIS +[rx](https://pypi.org/project/rx) | 3.2.0 | Reactive Extensions (Rx) for Python +[scikit-image](https://pypi.org/project/scikit-image) | 0.25.2 | Image processing in Python +[scikit-learn](https://pypi.org/project/scikit-learn) | 1.6.1 | A set of python modules for machine learning and data mining +[scipy](https://pypi.org/project/scipy) | 1.15.3 | Fundamental algorithms for scientific computing in Python +[scramp](https://pypi.org/project/scramp) | 1.4.5 | An implementation of the SCRAM protocol. +[scs](https://pypi.org/project/scs) | 3.2.7.post2 | Splitting conic solver +[seaborn](https://pypi.org/project/seaborn) | 0.13.2 | Statistical data visualization +[send2trash](https://pypi.org/project/send2trash) | 1.8.3 | Send file to trash natively under Mac OS X, Windows and Linux +[setuptools](https://pypi.org/project/setuptools) | 79.0.1 | Easily download, build, install, upgrade, and uninstall Python packages +[shapely](https://pypi.org/project/shapely) | 2.1.0 | Manipulation and analysis of geometric objects +[shellingham](https://pypi.org/project/shellingham) | 1.5.4 | Tool to Detect Surrounding Shell +[simplejson](https://pypi.org/project/simplejson) | 3.19.3 | Simple, fast, extensible JSON encoder/decoder for Python +[simpy](https://pypi.org/project/simpy) | 4.1.1 | Event discrete, process based simulation for Python. +[six](https://pypi.org/project/six) | 1.17.0 | Python 2 and 3 compatibility utilities +[sklearn-compat](https://pypi.org/project/sklearn-compat) | 0.1.3 | Ease support for compatible scikit-learn estimators across versions +[skrub](https://pypi.org/project/skrub) | 0.5.3 | Prepping tables for machine learning +[smmap](https://pypi.org/project/smmap) | 5.0.2 | A pure Python implementation of a sliding window memory map manager +[sniffio](https://pypi.org/project/sniffio) | 1.3.1 | Sniff out which async library your code is running under +[snowballstemmer](https://pypi.org/project/snowballstemmer) | 2.2.0 | This package provides 29 stemmers for 28 languages generated from Snowball algorithms. +[sortedcontainers](https://pypi.org/project/sortedcontainers) | 2.4.0 | Sorted Containers -- Sorted List, Sorted Dict, Sorted Set +[sounddevice](https://pypi.org/project/sounddevice) | 0.5.1 | Play and Record Sound with Python +[soupsieve](https://pypi.org/project/soupsieve) | 2.6 | A modern CSS selector implementation for Beautiful Soup. +[sphinx](https://pypi.org/project/sphinx) | 8.1.3 | Python documentation generator +[sphinx-rtd-theme](https://pypi.org/project/sphinx-rtd-theme) | 3.0.2 | Read the Docs theme for Sphinx +[sphinxcontrib-applehelp](https://pypi.org/project/sphinxcontrib-applehelp) | 2.0.0 | sphinxcontrib-applehelp is a Sphinx extension which outputs Apple help books +[sphinxcontrib-devhelp](https://pypi.org/project/sphinxcontrib-devhelp) | 2.0.0 | sphinxcontrib-devhelp is a sphinx extension which outputs Devhelp documents +[sphinxcontrib-htmlhelp](https://pypi.org/project/sphinxcontrib-htmlhelp) | 2.1.0 | sphinxcontrib-htmlhelp is a sphinx extension which renders HTML help files +[sphinxcontrib-jquery](https://pypi.org/project/sphinxcontrib-jquery) | 4.1 | Extension to include jQuery on newer Sphinx releases +[sphinxcontrib-jsmath](https://pypi.org/project/sphinxcontrib-jsmath) | 1.0.1 | A sphinx extension which renders display math in HTML via JavaScript +[sphinxcontrib-qthelp](https://pypi.org/project/sphinxcontrib-qthelp) | 2.0.0 | sphinxcontrib-qthelp is a sphinx extension which outputs QtHelp documents +[sphinxcontrib-serializinghtml](https://pypi.org/project/sphinxcontrib-serializinghtml) | 2.0.0 | sphinxcontrib-serializinghtml is a sphinx extension which outputs "serialized" HTML files (json and pickle) +[spyder](https://pypi.org/project/spyder) | 6.0.7 | The Scientific Python Development Environment +[spyder-kernels](https://pypi.org/project/spyder-kernels) | 3.0.5 | Jupyter kernels for Spyder's console +[sqlalchemy](https://pypi.org/project/sqlalchemy) | 2.0.40 | Database Abstraction Library +[sqlite-bro](https://pypi.org/project/sqlite-bro) | 0.13.1 | a graphic SQLite Client in 1 Python file +[sqlite-fts4](https://pypi.org/project/sqlite-fts4) | 1.0.3 | Python functions for working with SQLite FTS4 search +[sqlite-utils](https://pypi.org/project/sqlite-utils) | 3.38 | CLI tool and Python library for manipulating SQLite databases +[sqlparse](https://pypi.org/project/sqlparse) | 0.5.3 | A non-validating SQL parser. +[squarify](https://pypi.org/project/squarify) | 0.4.4 | Pure Python implementation of the squarify treemap layout algorithm +[sse-starlette](https://pypi.org/project/sse-starlette) | 2.2.1 | SSE plugin for Starlette +[sspilib](https://pypi.org/project/sspilib) | 0.2.0 | SSPI API bindings for Python +[stack-data](https://pypi.org/project/stack-data) | 0.6.3 | Extract data from python stack frames and tracebacks for informative displays +[starlette](https://pypi.org/project/starlette) | 0.46.2 | The little ASGI library that shines. +[statsmodels](https://pypi.org/project/statsmodels) | 0.14.4 | Statistical computations and models for Python +[streamlit](https://pypi.org/project/streamlit) | 1.46.0 | A faster way to build and share data apps +[superqt](https://pypi.org/project/superqt) | 0.7.3 | Missing widgets and components for PyQt/PySide +[sv-ttk](https://pypi.org/project/sv-ttk) | 2.6.0 | A gorgeous theme for Tkinter, based on Windows 11's UI +[sympy](https://pypi.org/project/sympy) | 1.14.0 | Computer algebra system (CAS) in Python +[tabulate](https://pypi.org/project/tabulate) | 0.9.0 | Pretty-print tabular data +[tblib](https://pypi.org/project/tblib) | 3.1.0 | Traceback serialization library. +[tenacity](https://pypi.org/project/tenacity) | 9.1.2 | Retry code until it succeeds +[termcolor](https://pypi.org/project/termcolor) | 3.1.0 | ANSI color formatting for output in terminal +[terminado](https://pypi.org/project/terminado) | 0.18.1 | Tornado websocket backend for the Xterm.js Javascript terminal emulator library. +[text-unidecode](https://pypi.org/project/text-unidecode) | 1.3 | The most basic Text::Unidecode port +[textdistance](https://pypi.org/project/textdistance) | 4.6.3 | Compute distance between the two texts. +[thefuzz](https://pypi.org/project/thefuzz) | 0.22.1 | Fuzzy string matching in python +[threadpoolctl](https://pypi.org/project/threadpoolctl) | 3.6.0 | threadpoolctl +[three-merge](https://pypi.org/project/three-merge) | 0.1.1 | Simple library for merging two strings with respect to a base one +[tifffile](https://pypi.org/project/tifffile) | 2025.3.30 | Read and write TIFF files +[tiktoken](https://pypi.org/project/tiktoken) | 0.9.0 | tiktoken is a fast BPE tokeniser for use with OpenAI's models +[tinycss2](https://pypi.org/project/tinycss2) | 1.4.0 | A tiny CSS parser +[tokenizers](https://pypi.org/project/tokenizers) | 0.21.1 | +[toml](https://pypi.org/project/toml) | 0.10.2 | Python Library for Tom's Obvious, Minimal Language +[tomli](https://pypi.org/project/tomli) | 2.2.1 | A lil' TOML parser +[tomli-w](https://pypi.org/project/tomli-w) | 1.2.0 | A lil' TOML writer +[tomlkit](https://pypi.org/project/tomlkit) | 0.13.2 | Style preserving TOML library +[toolz](https://pypi.org/project/toolz) | 1.0.0 | List processing tools and functional utilities +[tornado](https://pypi.org/project/tornado) | 6.5.1 | Tornado is a Python web framework and asynchronous networking library, originally developed at FriendFeed. +[tqdm](https://pypi.org/project/tqdm) | 4.67.1 | Fast, Extensible Progress Meter +[traitlets](https://pypi.org/project/traitlets) | 5.14.3 | Traitlets Python configuration system +[traittypes](https://pypi.org/project/traittypes) | 0.2.1 | Scipy trait types +[trio](https://pypi.org/project/trio) | 0.30.0 | A friendly Python library for async concurrency and I/O +[trove-classifiers](https://pypi.org/project/trove-classifiers) | 2025.5.9.12 | Canonical source for classifiers on PyPI (pypi.org). +[twine](https://pypi.org/project/twine) | 6.1.0 | Collection of utilities for publishing packages on PyPI +[typer](https://pypi.org/project/typer) | 0.15.2 | Typer, build great CLIs. Easy to code. Based on Python type hints. +[types-python-dateutil](https://pypi.org/project/types-python-dateutil) | 2.9.0.20240316 | Typing stubs for python-dateutil +[types-requests](https://pypi.org/project/types-requests) | 2.32.0.20250328 | Typing stubs for requests +[typing-extensions](https://pypi.org/project/typing-extensions) | 4.13.2 | Backported and Experimental Type Hints for Python 3.8+ +[typing-inspection](https://pypi.org/project/typing-inspection) | 0.4.0 | Runtime typing introspection tools +[tzdata](https://pypi.org/project/tzdata) | 2025.2 | Provider of IANA time zone data +[tzlocal](https://pypi.org/project/tzlocal) | 5.3.1 | tzinfo object for the local timezone +[ujson](https://pypi.org/project/ujson) | 5.10.0 | Ultra fast JSON encoder and decoder for Python +[umap-learn](https://pypi.org/project/umap-learn) | 0.5.7 | Uniform Manifold Approximation and Projection +[uncertainties](https://pypi.org/project/uncertainties) | 3.2.2 | calculations with values with uncertainties, error propagation +[uri-template](https://pypi.org/project/uri-template) | 1.3.0 | RFC 6570 URI Template Processor +[urllib3](https://pypi.org/project/urllib3) | 2.4.0 | HTTP library with thread-safe connection pooling, file post, and more. +[uvicorn](https://pypi.org/project/uvicorn) | 0.34.2 | The lightning-fast ASGI server. +[vega-datasets](https://pypi.org/project/vega-datasets) | 0.9.0 | A Python package for offline access to Vega datasets +[waitress](https://pypi.org/project/waitress) | 3.0.0 | Waitress WSGI server +[watchdog](https://pypi.org/project/watchdog) | 6.0.0 | Filesystem events monitoring +[wcwidth](https://pypi.org/project/wcwidth) | 0.2.13 | Measures the displayed width of unicode strings in a terminal +[webcolors](https://pypi.org/project/webcolors) | 24.11.1 | A library for working with the color formats defined by HTML and CSS. +[webencodings](https://pypi.org/project/webencodings) | 0.5.1 | Character encoding aliases for legacy web content +[websocket-client](https://pypi.org/project/websocket-client) | 1.8.0 | WebSocket client for Python with low level API options +[websockets](https://pypi.org/project/websockets) | 14.2 | An implementation of the WebSocket Protocol (RFC 6455 & 7692) +[werkzeug](https://pypi.org/project/werkzeug) | 3.1.3 | The comprehensive WSGI web application library. +[whatthepatch](https://pypi.org/project/whatthepatch) | 1.0.7 | A patch parsing and application library. +[wheel](https://pypi.org/project/wheel) | 0.45.1 | A built-package format for Python +[widgetsnbextension](https://pypi.org/project/widgetsnbextension) | 4.0.14 | Jupyter interactive widgets for Jupyter Notebook +[wordcloud](https://pypi.org/project/wordcloud) | 1.9.4 | A little word cloud generator +[wrapt](https://pypi.org/project/wrapt) | 1.16.0 | Module for decorators, wrappers and monkey patching. +[wsproto](https://pypi.org/project/wsproto) | 1.2.0 | WebSockets state-machine based protocol implementation +[xarray](https://pypi.org/project/xarray) | 2025.4.0 | N-D labeled arrays and datasets in Python +[xlsxwriter](https://pypi.org/project/xlsxwriter) | 3.2.3 | A Python module for creating Excel XLSX files. +[xyzservices](https://pypi.org/project/xyzservices) | 2023.10.1 | Source of XYZ tiles providers +[yapf](https://pypi.org/project/yapf) | 0.40.1 | A formatter for Python code. +[yarl](https://pypi.org/project/yarl) | 1.18.3 | Yet another URL library +[yt-dlp](https://pypi.org/project/yt-dlp) | 2025.2.19 | A feature-rich command-line audio/video downloader +[zict](https://pypi.org/project/zict) | 3.0.0 | Mutable mapping tools +[zipp](https://pypi.org/project/zipp) | 3.21.0 | Backport of pathlib-compatible object wrapper for zip files +[zstandard](https://pypi.org/project/zstandard) | 0.23.0 | Zstandard bindings for Python + + +
    diff --git a/changelogs/WinPythonwhl-64bit-3.12.10.1_History.md b/changelogs/WinPythonwhl-64bit-3.12.10.1_History.md new file mode 100644 index 00000000..49f45d21 --- /dev/null +++ b/changelogs/WinPythonwhl-64bit-3.12.10.1_History.md @@ -0,0 +1,26 @@ +## History of changes for WinPython-64bit 3.12.10.1whl + +The following changes were made to WinPython-64bit distribution since version 3.12.10.1whl. + + +
    + +### Tools + + +No differences found. + +### Python packages + + +No differences found. + +### WheelHouse packages + + +No differences found. + + +
    + +* * * diff --git a/changelogs/WinPythonwhl-64bit-3.13.5.0.md b/changelogs/WinPythonwhl-64bit-3.13.5.0.md new file mode 100644 index 00000000..c50ede47 --- /dev/null +++ b/changelogs/WinPythonwhl-64bit-3.13.5.0.md @@ -0,0 +1,522 @@ +## WinPython 3.13.5.0whl + +The following packages are included in WinPython-64bit v3.13.5.0whl 3.10.11.1dot. + +
    + +### Tools + +Name | Version | Description +-----|---------|------------ +[Python](http://www.python.org/) | 3.13.5 | Python programming language with standard library + + +### Python packages + +Name | Version | Description +-----|---------|------------ +[build](https://pypi.org/project/build) | 1.2.2.post1 | A simple, correct Python build frontend +[colorama](https://pypi.org/project/colorama) | 0.4.6 | Cross-platform colored terminal text. +[packaging](https://pypi.org/project/packaging) | 25.0 | Core utilities for Python packages +[pip](https://pypi.org/project/pip) | 25.1.1 | The PyPA recommended tool for installing Python packages. +[pyproject-hooks](https://pypi.org/project/pyproject-hooks) | 1.2.0 | Wrappers to call pyproject.toml-based build backend hooks. +[setuptools](https://pypi.org/project/setuptools) | 79.0.1 | Easily download, build, install, upgrade, and uninstall Python packages +[sqlite-bro](https://pypi.org/project/sqlite-bro) | 0.13.1 | a graphic SQLite Client in 1 Python file +[sv-ttk](https://pypi.org/project/sv-ttk) | 2.6.0 | A gorgeous theme for Tkinter, based on Windows 11's UI +[wheel](https://pypi.org/project/wheel) | 0.45.1 | A built-package format for Python +[winpython](https://pypi.org/project/winpython) | 16.6.20250620 | WinPython distribution tools, including WPPM + + +### WheelHouse packages + +Name | Version | Description +-----|---------|------------ +[absl-py](https://pypi.org/project/absl-py) | 2.2.2 | Abseil Python Common Libraries, see https://github.com/abseil/abseil-py. +[adbc-driver-manager](https://pypi.org/project/adbc-driver-manager) | 1.3.0 | A generic entrypoint for ADBC drivers. +[aiofiles](https://pypi.org/project/aiofiles) | 23.2.1 | File support for asyncio. +[aiohappyeyeballs](https://pypi.org/project/aiohappyeyeballs) | 2.6.1 | Happy Eyeballs for asyncio +[aiohttp](https://pypi.org/project/aiohttp) | 3.11.18 | Async http client/server framework (asyncio) +[aiosignal](https://pypi.org/project/aiosignal) | 1.3.2 | aiosignal: a list of registered asynchronous callbacks +[aiosqlite](https://pypi.org/project/aiosqlite) | 0.20.0 | asyncio bridge to the standard sqlite3 module +[alabaster](https://pypi.org/project/alabaster) | 0.7.16 | A light, configurable Sphinx theme +[alembic](https://pypi.org/project/alembic) | 1.15.2 | A database migration tool for SQLAlchemy. +[altair](https://pypi.org/project/altair) | 5.5.0 | Vega-Altair: A declarative statistical visualization library for Python. +[annotated-types](https://pypi.org/project/annotated-types) | 0.7.0 | Reusable constraint types to use with typing.Annotated +[ansicolors](https://pypi.org/project/ansicolors) | 1.1.8 | ANSI colors for Python +[anthropic](https://pypi.org/project/anthropic) | 0.51.0 | The official Python library for the anthropic API +[anyio](https://pypi.org/project/anyio) | 4.9.0 | High level compatibility layer for multiple asynchronous event loop implementations +[anywidget](https://pypi.org/project/anywidget) | 0.9.18 | custom jupyter widgets made easy +[appdirs](https://pypi.org/project/appdirs) | 1.4.4 | A small Python module for determining appropriate platform-specific dirs, e.g. a "user data dir". +[argcomplete](https://pypi.org/project/argcomplete) | 3.6.2 | Bash tab completion for argparse +[argon2-cffi](https://pypi.org/project/argon2-cffi) | 23.1.0 | Argon2 for Python +[argon2-cffi-bindings](https://pypi.org/project/argon2-cffi-bindings) | 21.2.0 | Low-level CFFI bindings for Argon2 +[array-api-compat](https://pypi.org/project/array-api-compat) | 1.12.0 | A wrapper around NumPy and other array libraries to make them compatible with the Array API standard +[arrow](https://pypi.org/project/arrow) | 1.3.0 | Better dates & times for Python +[asgi-csrf](https://pypi.org/project/asgi-csrf) | 0.11 | ASGI middleware for protecting against CSRF attacks +[asgiref](https://pypi.org/project/asgiref) | 3.8.1 | ASGI specs, helper code, and adapters +[asn1crypto](https://pypi.org/project/asn1crypto) | 1.5.1 | Fast ASN.1 parser and serializer with definitions for private keys, public keys, certificates, CRL, OCSP, CMS, PKCS#3, PKCS#7, PKCS#8, PKCS#12, +[asteval](https://pypi.org/project/asteval) | 1.0.5 | Safe, minimalistic evaluator of python expression using ast module +[astroid](https://pypi.org/project/astroid) | 3.3.9 | An abstract syntax tree for Python with inference support. +[astropy](https://pypi.org/project/astropy) | 6.1.6 | Astronomy and astrophysics core library +[astropy-iers-data](https://pypi.org/project/astropy-iers-data) | 0.2024.12.23.0.33.24 | IERS Earth Rotation and Leap Second tables for the astropy core package +[asttokens](https://pypi.org/project/asttokens) | 3.0.0 | Annotate AST trees with source code positions +[async-lru](https://pypi.org/project/async-lru) | 2.0.5 | Simple LRU cache for asyncio +[asyncssh](https://pypi.org/project/asyncssh) | 2.20.0 | AsyncSSH: Asynchronous SSHv2 client and server library +[atomicwrites](https://pypi.org/project/atomicwrites) | 1.4.0 | Atomic file writes. +[attrs](https://pypi.org/project/attrs) | 25.3.0 | Classes Without Boilerplate +[autopep8](https://pypi.org/project/autopep8) | 2.0.4 | A tool that automatically formats Python code to conform to the PEP 8 style guide +[azure-core](https://pypi.org/project/azure-core) | 1.32.0 | Microsoft Azure Core Library for Python +[azure-cosmos](https://pypi.org/project/azure-cosmos) | 4.9.0 | Microsoft Azure Cosmos Client Library for Python +[azure-identity](https://pypi.org/project/azure-identity) | 1.21.0 | Microsoft Azure Identity Library for Python +[babel](https://pypi.org/project/babel) | 2.17.0 | Internationalization utilities +[baresql](https://pypi.org/project/baresql) | 1.0.0 | playing SQL directly on Python datas +[bcrypt](https://pypi.org/project/bcrypt) | 4.3.0 | Modern password hashing for your software and your servers +[beautifulsoup4](https://pypi.org/project/beautifulsoup4) | 4.13.3 | Screen-scraping library +[binaryornot](https://pypi.org/project/binaryornot) | 0.4.4 | Ultra-lightweight pure Python package to check if a file is binary or text. +[black](https://pypi.org/project/black) | 25.1.0 | The uncompromising code formatter. +[bleach](https://pypi.org/project/bleach) | 6.2.0 | An easy safelist-based HTML-sanitizing tool. +[blinker](https://pypi.org/project/blinker) | 1.9.0 | Fast, simple object-to-object and broadcast signaling +[bokeh](https://pypi.org/project/bokeh) | 3.7.3 | Interactive plots and applications in the browser from Python +[branca](https://pypi.org/project/branca) | 0.8.1 | Generate complex HTML+JS pages with Python +[brotli](https://pypi.org/project/brotli) | 1.1.0 | Python bindings for the Brotli compression library +[build](https://pypi.org/project/build) | 1.2.2.post1 | A simple, correct Python build frontend +[cachetools](https://pypi.org/project/cachetools) | 5.5.2 | Extensible memoizing collections and decorators +[certifi](https://pypi.org/project/certifi) | 2025.1.31 | Python package for providing Mozilla's CA Bundle. +[cffi](https://pypi.org/project/cffi) | 1.17.1 | Foreign Function Interface for Python calling C code. +[chardet](https://pypi.org/project/chardet) | 5.2.0 | Universal encoding detector for Python 3 +[charset-normalizer](https://pypi.org/project/charset-normalizer) | 3.4.2 | The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet. +[clarabel](https://pypi.org/project/clarabel) | 0.10.0 | Clarabel Conic Interior Point Solver for Rust / Python +[click](https://pypi.org/project/click) | 8.1.8 | Composable command line interface toolkit +[click-default-group](https://pypi.org/project/click-default-group) | 1.2.4 | click_default_group +[cloudpickle](https://pypi.org/project/cloudpickle) | 3.1.1 | Pickler class to extend the standard pickle.Pickler functionality +[cohere](https://pypi.org/project/cohere) | 5.15.0 | +[colorama](https://pypi.org/project/colorama) | 0.4.6 | Cross-platform colored terminal text. +[colorlog](https://pypi.org/project/colorlog) | 6.9.0 | Add colours to the output of Python's logging module. +[comm](https://pypi.org/project/comm) | 0.2.2 | Jupyter Python Comm implementation, for usage in ipykernel, xeus-python etc. +[contourpy](https://pypi.org/project/contourpy) | 1.3.2 | Python library for calculating contours of 2D quadrilateral grids +[cookiecutter](https://pypi.org/project/cookiecutter) | 2.6.0 | A command-line utility that creates projects from project templates, e.g. +[cryptography](https://pypi.org/project/cryptography) | 44.0.0 | cryptography is a package which provides cryptographic recipes and primitives to Python developers. +[cvxpy](https://pypi.org/project/cvxpy) | 1.6.4 | A domain-specific language for modeling convex optimization problems in Python. +[cycler](https://pypi.org/project/cycler) | 0.12.1 | Composable style cycles +[cython](https://pypi.org/project/cython) | 3.1.1 | The Cython compiler for writing C extensions in the Python language. +[cytoolz](https://pypi.org/project/cytoolz) | 1.0.1 | Cython implementation of Toolz: High performance functional utilities +[dask](https://pypi.org/project/dask) | 2025.4.1 | Parallel PyData with Task Scheduling +[datasette](https://pypi.org/project/datasette) | 0.65.1 | An open source multi-tool for exploring and publishing data +[datasette-graphql](https://pypi.org/project/datasette-graphql) | 2.2 | Datasette plugin providing an automatic GraphQL API for your SQLite databases +[deap](https://pypi.org/project/deap) | 1.4.2 | Distributed Evolutionary Algorithms in Python +[debugpy](https://pypi.org/project/debugpy) | 1.8.13 | An implementation of the Debug Adapter Protocol for Python +[decorator](https://pypi.org/project/decorator) | 5.2.1 | Decorators for Humans +[defusedxml](https://pypi.org/project/defusedxml) | 0.7.1 | XML bomb protection for Python stdlib modules +[deprecated](https://pypi.org/project/deprecated) | 1.2.14 | Python @deprecated decorator to deprecate old python classes, functions or methods. +[diff-match-patch](https://pypi.org/project/diff-match-patch) | 20241021 | Repackaging of Google's Diff Match and Patch libraries. +[dill](https://pypi.org/project/dill) | 0.4.0 | serialize all of Python +[distributed](https://pypi.org/project/distributed) | 2025.4.1 | Distributed scheduler for Dask +[distro](https://pypi.org/project/distro) | 1.9.0 | Distro - an OS platform information API +[django](https://pypi.org/project/django) | 5.2 | A high-level Python web framework that encourages rapid development and clean, pragmatic design. +[dnspython](https://pypi.org/project/dnspython) | 2.7.0 | DNS toolkit +[docstring-to-markdown](https://pypi.org/project/docstring-to-markdown) | 0.17 | On the fly conversion of Python docstrings to markdown +[docutils](https://pypi.org/project/docutils) | 0.21.2 | Docutils -- Python Documentation Utilities +[duckdb](https://pypi.org/project/duckdb) | 1.3.0 | DuckDB in-process database +[entrypoints](https://pypi.org/project/entrypoints) | 0.4 | Discover and load entry points from installed packages. +[et-xmlfile](https://pypi.org/project/et-xmlfile) | 1.1.0 | An implementation of lxml.xmlfile for the standard library +[eval-type-backport](https://pypi.org/project/eval-type-backport) | 0.2.2 | Like `typing._eval_type`, but lets older Python versions use newer typing features. +[executing](https://pypi.org/project/executing) | 2.2.0 | Get the currently executing AST node of a frame, and other information +[faker](https://pypi.org/project/faker) | 37.1.0 | Faker is a Python package that generates fake data for you. +[fasta2a](https://pypi.org/project/fasta2a) | 0.2.9 | Convert an AI Agent into a A2A server! ✨ +[fastapi](https://pypi.org/project/fastapi) | 0.115.12 | FastAPI framework, high performance, easy to learn, fast to code, ready for production +[fastavro](https://pypi.org/project/fastavro) | 1.10.0 | Fast read/write of AVRO files +[fastjsonschema](https://pypi.org/project/fastjsonschema) | 2.21.1 | Fastest Python implementation of JSON schema +[filelock](https://pypi.org/project/filelock) | 3.18.0 | A platform independent file lock. +[flake8](https://pypi.org/project/flake8) | 7.1.1 | the modular source code checker: pep8 pyflakes and co +[flask](https://pypi.org/project/flask) | 3.1.0 | A simple framework for building complex web applications. +[flexcache](https://pypi.org/project/flexcache) | 0.3 | Saves and loads to the cache a transformed versions of a source object. +[flexparser](https://pypi.org/project/flexparser) | 0.4 | Parsing made fun ... using typing. +[flit](https://pypi.org/project/flit) | 3.12.0 | A simple packaging tool for simple packages. +[flit-core](https://pypi.org/project/flit-core) | 3.12.0 | Distribution-building parts of Flit. See flit package for more information +[folium](https://pypi.org/project/folium) | 0.19.5 | Make beautiful maps with Leaflet.js & Python +[fonttools](https://pypi.org/project/fonttools) | 4.57.0 | Tools to manipulate font files +[fqdn](https://pypi.org/project/fqdn) | 1.5.1 | Validates fully-qualified domain names against RFC 1123, so that they are acceptable to modern bowsers +[frozenlist](https://pypi.org/project/frozenlist) | 1.5.0 | A list-like structure which implements collections.abc.MutableSequence +[fsspec](https://pypi.org/project/fsspec) | 2025.3.2 | File-system specification +[fuzzywuzzy](https://pypi.org/project/fuzzywuzzy) | 0.18.0 | Fuzzy string matching in python +[geographiclib](https://pypi.org/project/geographiclib) | 2.0 | The geodesic routines from GeographicLib +[geopandas](https://pypi.org/project/geopandas) | 1.0.1 | Geographic pandas extensions +[geopy](https://pypi.org/project/geopy) | 2.4.1 | Python Geocoding Toolbox +[gitdb](https://pypi.org/project/gitdb) | 4.0.12 | Git Object Database +[gitpython](https://pypi.org/project/gitpython) | 3.1.44 | GitPython is a Python library used to interact with Git repositories +[google-auth](https://pypi.org/project/google-auth) | 2.38.0 | Google Authentication Library +[google-genai](https://pypi.org/project/google-genai) | 1.16.1 | GenAI Python SDK +[graphene](https://pypi.org/project/graphene) | 3.4.3 | GraphQL Framework for Python +[graphql-core](https://pypi.org/project/graphql-core) | 3.2.6 | GraphQL implementation for Python, a port of GraphQL.js, the JavaScript reference implementation for GraphQL. +[graphql-relay](https://pypi.org/project/graphql-relay) | 3.2.0 | Relay library for graphql-core +[greenlet](https://pypi.org/project/greenlet) | 3.1.1 | Lightweight in-process concurrent programming +[griffe](https://pypi.org/project/griffe) | 1.7.2 | Signatures for entire Python programs. +[groq](https://pypi.org/project/groq) | 0.25.0 | The official Python library for the groq API +[guidata](https://pypi.org/project/guidata) | 3.9.0 | Automatic GUI generation for easy dataset editing and display +[h11](https://pypi.org/project/h11) | 0.14.0 | A pure-Python, bring-your-own-I/O implementation of HTTP/1.1 +[h2](https://pypi.org/project/h2) | 4.2.0 | Pure-Python HTTP/2 protocol implementation +[h5py](https://pypi.org/project/h5py) | 3.12.1 | Read and write HDF5 files from Python +[hatchling](https://pypi.org/project/hatchling) | 1.27.0 | Modern, extensible Python build backend +[hpack](https://pypi.org/project/hpack) | 4.1.0 | Pure-Python HPACK header encoding +[html5lib](https://pypi.org/project/html5lib) | 1.1 | HTML parser based on the WHATWG HTML specification +[httpcore](https://pypi.org/project/httpcore) | 1.0.7 | A minimal low-level HTTP client. +[httpie](https://pypi.org/project/httpie) | 3.2.4 | HTTPie: modern, user-friendly command-line HTTP client for the API era. +[httpx](https://pypi.org/project/httpx) | 0.28.1 | The next generation HTTP client. +[httpx-sse](https://pypi.org/project/httpx-sse) | 0.4.0 | Consume Server-Sent Event (SSE) messages with HTTPX. +[huggingface-hub](https://pypi.org/project/huggingface-hub) | 0.33.0 | Client library to download and publish models, datasets and other repos on the huggingface.co hub +[hupper](https://pypi.org/project/hupper) | 1.12.1 | Integrated process monitor for developing and reloading daemons. +[hypercorn](https://pypi.org/project/hypercorn) | 0.17.3 | A ASGI Server based on Hyper libraries and inspired by Gunicorn +[hyperframe](https://pypi.org/project/hyperframe) | 6.1.0 | Pure-Python HTTP/2 framing +[hypothesis](https://pypi.org/project/hypothesis) | 6.130.4 | A library for property-based testing +[id](https://pypi.org/project/id) | 1.5.0 | A tool for generating OIDC identities +[idna](https://pypi.org/project/idna) | 3.10 | Internationalized Domain Names in Applications (IDNA) +[imageio](https://pypi.org/project/imageio) | 2.37.0 | Library for reading and writing a wide range of image, video, scientific, and volumetric data formats. +[imagesize](https://pypi.org/project/imagesize) | 1.4.1 | Getting image size from png/jpeg/jpeg2000/gif file +[imbalanced-learn](https://pypi.org/project/imbalanced-learn) | 0.13.0 | Toolbox for imbalanced dataset in machine learning +[importlib-metadata](https://pypi.org/project/importlib-metadata) | 8.6.1 | Read metadata from Python packages +[inflection](https://pypi.org/project/inflection) | 0.5.1 | A port of Ruby on Rails inflector to Python +[iniconfig](https://pypi.org/project/iniconfig) | 2.1.0 | brain-dead simple config-ini parsing +[intervaltree](https://pypi.org/project/intervaltree) | 3.1.0 | Editable interval tree data structure for Python 2 and 3 +[ipycanvas](https://pypi.org/project/ipycanvas) | 0.13.3 | Interactive widgets library exposing the browser's Canvas API +[ipykernel](https://pypi.org/project/ipykernel) | 6.29.5 | IPython Kernel for Jupyter +[ipyleaflet](https://pypi.org/project/ipyleaflet) | 0.19.2 | A Jupyter widget for dynamic Leaflet maps +[ipympl](https://pypi.org/project/ipympl) | 0.9.7 | Matplotlib Jupyter Extension +[ipython](https://pypi.org/project/ipython) | 8.36.0 | IPython: Productive Interactive Computing +[ipython-genutils](https://pypi.org/project/ipython-genutils) | 0.2.0 | Vestigial utilities from IPython +[ipython-sql](https://pypi.org/project/ipython-sql) | 0.5.0 | RDBMS access via IPython +[ipywidgets](https://pypi.org/project/ipywidgets) | 8.1.6 | Jupyter interactive widgets +[isoduration](https://pypi.org/project/isoduration) | 20.11.0 | Operations with ISO 8601 durations +[isort](https://pypi.org/project/isort) | 5.13.2 | A Python utility / library to sort Python imports. +[itsdangerous](https://pypi.org/project/itsdangerous) | 2.2.0 | Safely pass data to untrusted environments and back. +[janus](https://pypi.org/project/janus) | 2.0.0 | Mixed sync-async queue to interoperate between asyncio tasks and classic threads +[jaraco-classes](https://pypi.org/project/jaraco-classes) | 3.4.0 | Utility functions for Python class constructs +[jaraco-context](https://pypi.org/project/jaraco-context) | 6.0.1 | Useful decorators and context managers +[jaraco-functools](https://pypi.org/project/jaraco-functools) | 4.1.0 | Functools like those found in stdlib +[jedi](https://pypi.org/project/jedi) | 0.19.2 | An autocompletion tool for Python that can be used for text editors. +[jellyfish](https://pypi.org/project/jellyfish) | 1.1.3 | Approximate and phonetic matching of strings. +[jinja2](https://pypi.org/project/jinja2) | 3.1.6 | A very fast and expressive template engine. +[jiter](https://pypi.org/project/jiter) | 0.9.0 | Fast iterable JSON parser. +[joblib](https://pypi.org/project/joblib) | 1.4.2 | Lightweight pipelining with Python functions +[json5](https://pypi.org/project/json5) | 0.10.0 | A Python implementation of the JSON5 data format. +[jsonpatch](https://pypi.org/project/jsonpatch) | 1.33 | Apply JSON-Patches (RFC 6902) +[jsonpointer](https://pypi.org/project/jsonpointer) | 3.0.0 | Identify specific nodes in a JSON document (RFC 6901) +[jsonschema](https://pypi.org/project/jsonschema) | 4.23.0 | An implementation of JSON Schema validation for Python +[jsonschema-specifications](https://pypi.org/project/jsonschema-specifications) | 2024.10.1 | The JSON Schema meta-schemas and vocabularies, exposed as a Registry +[julia](https://pypi.org/project/julia) | 0.6.2 | Julia/Python bridge with IPython support. +[jupyter](https://pypi.org/project/jupyter) | 1.1.1 | Jupyter metapackage. Install all the Jupyter components in one go. +[jupyter-bokeh](https://pypi.org/project/jupyter-bokeh) | 4.0.5 | A Jupyter extension for rendering Bokeh content. +[jupyter-client](https://pypi.org/project/jupyter-client) | 8.6.3 | Jupyter protocol implementation and client libraries +[jupyter-console](https://pypi.org/project/jupyter-console) | 6.6.3 | Jupyter terminal console +[jupyter-core](https://pypi.org/project/jupyter-core) | 5.7.2 | Jupyter core package. A base package on which Jupyter projects rely. +[jupyter-events](https://pypi.org/project/jupyter-events) | 0.12.0 | Jupyter Event System library +[jupyter-leaflet](https://pypi.org/project/jupyter-leaflet) | 0.19.2 | ipyleaflet extensions for JupyterLab and Jupyter Notebook +[jupyter-lsp](https://pypi.org/project/jupyter-lsp) | 2.2.5 | Multi-Language Server WebSocket proxy for Jupyter Notebook/Lab server +[jupyter-server](https://pypi.org/project/jupyter-server) | 2.15.0 | The backend—i.e. core services, APIs, and REST endpoints—to Jupyter web applications. +[jupyter-server-terminals](https://pypi.org/project/jupyter-server-terminals) | 0.5.3 | A Jupyter Server Extension Providing Terminals. +[jupyterlab](https://pypi.org/project/jupyterlab) | 4.4.2 | JupyterLab computational environment +[jupyterlab-pygments](https://pypi.org/project/jupyterlab-pygments) | 0.3.0 | Pygments theme using JupyterLab CSS variables +[jupyterlab-server](https://pypi.org/project/jupyterlab-server) | 2.27.3 | A set of server components for JupyterLab and JupyterLab like applications. +[jupyterlab-widgets](https://pypi.org/project/jupyterlab-widgets) | 3.0.14 | Jupyter interactive widgets for JupyterLab +[keras](https://pypi.org/project/keras) | 3.10.0 | Multi-backend Keras +[keyring](https://pypi.org/project/keyring) | 25.6.0 | Store and access your passwords safely. +[kiwisolver](https://pypi.org/project/kiwisolver) | 1.4.8 | A fast implementation of the Cassowary constraint solver +[langchain](https://pypi.org/project/langchain) | 0.3.25 | Building applications with LLMs through composability +[langchain-core](https://pypi.org/project/langchain-core) | 0.3.59 | Building applications with LLMs through composability +[langchain-text-splitters](https://pypi.org/project/langchain-text-splitters) | 0.3.8 | LangChain text splitting utilities +[langsmith](https://pypi.org/project/langsmith) | 0.3.42 | Client library to connect to the LangSmith LLM Tracing and Evaluation Platform. +[lazy-loader](https://pypi.org/project/lazy-loader) | 0.4 | Makes it easy to load subpackages and functions on demand. +[llvmlite](https://pypi.org/project/llvmlite) | 0.44.0 | lightweight wrapper around basic LLVM functionality +[lmfit](https://pypi.org/project/lmfit) | 1.3.3 | Least-Squares Minimization with Bounds and Constraints +[locket](https://pypi.org/project/locket) | 1.0.0 | File-based locks for Python on Linux and Windows +[logfire-api](https://pypi.org/project/logfire-api) | 3.12.0 | Shim for the Logfire SDK which does nothing unless Logfire is installed +[lxml](https://pypi.org/project/lxml) | 5.3.0 | Powerful and Pythonic XML processing library combining libxml2/libxslt with the ElementTree API. +[mako](https://pypi.org/project/mako) | 1.3.9 | A super-fast templating language that borrows the best ideas from the existing templating languages. +[markdown](https://pypi.org/project/markdown) | 3.7 | Python implementation of John Gruber's Markdown. +[markdown-it-py](https://pypi.org/project/markdown-it-py) | 3.0.0 | Python port of markdown-it. Markdown parsing, done right! +[markupsafe](https://pypi.org/project/markupsafe) | 3.0.2 | Safely add untrusted strings to HTML/XML markup. +[matplotlib](https://pypi.org/project/matplotlib) | 3.10.3 | Python plotting package +[matplotlib-inline](https://pypi.org/project/matplotlib-inline) | 0.1.7 | Inline Matplotlib backend for Jupyter +[maturin](https://pypi.org/project/maturin) | 1.8.3 | Build and publish crates with pyo3, cffi and uniffi bindings as well as rust binaries as python packages +[mccabe](https://pypi.org/project/mccabe) | 0.7.0 | McCabe checker, plugin for flake8 +[mcp](https://pypi.org/project/mcp) | 1.9.3 | Model Context Protocol SDK +[mdurl](https://pypi.org/project/mdurl) | 0.1.2 | Markdown URL utilities +[mercantile](https://pypi.org/project/mercantile) | 1.2.1 | Web mercator XYZ tile utilities +[mergedeep](https://pypi.org/project/mergedeep) | 1.3.4 | A deep merge function for 🐍. +[missingno](https://pypi.org/project/missingno) | 0.5.2 | Missing data visualization module for Python. +[mistralai](https://pypi.org/project/mistralai) | 1.8.1 | Python Client SDK for the Mistral AI API. +[mistune](https://pypi.org/project/mistune) | 3.1.3 | A sane and fast Markdown parser with useful plugins and renderers +[mizani](https://pypi.org/project/mizani) | 0.11.4 | Scales for Python +[ml-dtypes](https://pypi.org/project/ml-dtypes) | 0.5.1 | +[mlxtend](https://pypi.org/project/mlxtend) | 0.23.3 | Machine Learning Library Extensions +[more-itertools](https://pypi.org/project/more-itertools) | 10.6.0 | More routines for operating on iterables, beyond itertools +[mpld3](https://pypi.org/project/mpld3) | 0.5.10 | D3 Viewer for Matplotlib +[mpmath](https://pypi.org/project/mpmath) | 1.3.0 | Python library for arbitrary-precision floating-point arithmetic +[msal](https://pypi.org/project/msal) | 1.30.0 | The Microsoft Authentication Library (MSAL) for Python library enables your app to access the Microsoft Cloud by supporting authentication of us +[msal-extensions](https://pypi.org/project/msal-extensions) | 1.2.0 | Microsoft Authentication Library extensions (MSAL EX) provides a persistence API that can save your data on disk, encrypted on Windows, macOS an +[msgpack](https://pypi.org/project/msgpack) | 1.1.0 | MessagePack serializer +[multidict](https://pypi.org/project/multidict) | 6.4.3 | multidict implementation +[mypy](https://pypi.org/project/mypy) | 1.15.0 | Optional static typing for Python +[mypy-extensions](https://pypi.org/project/mypy-extensions) | 1.0.0 | Type system extensions for programs checked with the mypy type checker. +[namex](https://pypi.org/project/namex) | 0.0.8 | A simple utility to separate the implementation of your Python package and its public API surface. +[narwhals](https://pypi.org/project/narwhals) | 1.36.0 | Extremely lightweight compatibility layer between dataframe libraries +[nbclient](https://pypi.org/project/nbclient) | 0.10.2 | A client library for executing notebooks. Formerly nbconvert's ExecutePreprocessor. +[nbconvert](https://pypi.org/project/nbconvert) | 7.16.6 | Converting Jupyter Notebooks (.ipynb files) to other formats. Output formats include asciidoc, html, latex, markdown, pdf, py, rst, script. +[nbformat](https://pypi.org/project/nbformat) | 5.10.4 | The Jupyter Notebook format +[nest-asyncio](https://pypi.org/project/nest-asyncio) | 1.6.0 | Patch asyncio to allow nested event loops +[networkx](https://pypi.org/project/networkx) | 3.4.2 | Python package for creating and manipulating graphs and networks +[nh3](https://pypi.org/project/nh3) | 0.2.18 | Python bindings to the ammonia HTML sanitization library. +[nltk](https://pypi.org/project/nltk) | 3.9.1 | Natural Language Toolkit +[notebook](https://pypi.org/project/notebook) | 7.4.2 | Jupyter Notebook - A web-based notebook environment for interactive computing +[notebook-shim](https://pypi.org/project/notebook-shim) | 0.2.4 | A shim layer for notebook traits and config +[numba](https://pypi.org/project/numba) | 0.61.2 | compiling Python code using LLVM +[numpy](https://pypi.org/project/numpy) | 2.2.6 | Fundamental package for array computing in Python +[numpydoc](https://pypi.org/project/numpydoc) | 1.8.0 | Sphinx extension to support docstrings in Numpy format +[openai](https://pypi.org/project/openai) | 1.82.0 | The official Python library for the openai API +[opencv-python](https://pypi.org/project/opencv-python) | 4.11.0.86 | Wrapper package for OpenCV python bindings. +[openpyxl](https://pypi.org/project/openpyxl) | 3.1.5 | A Python library to read/write Excel 2010 xlsx/xlsm files +[opentelemetry-api](https://pypi.org/project/opentelemetry-api) | 1.32.1 | OpenTelemetry Python API +[optree](https://pypi.org/project/optree) | 0.14.1 | Optimized PyTree Utilities. +[optuna](https://pypi.org/project/optuna) | 4.2.1 | A hyperparameter optimization framework +[orjson](https://pypi.org/project/orjson) | 3.10.16 | Fast, correct Python JSON library supporting dataclasses, datetimes, and numpy +[osqp](https://pypi.org/project/osqp) | 0.6.7.post3 | OSQP: The Operator Splitting QP Solver +[outcome](https://pypi.org/project/outcome) | 1.3.0.post0 | Capture the outcome of Python function calls. +[overrides](https://pypi.org/project/overrides) | 7.7.0 | A decorator to automatically detect mismatch when overriding a method. +[packaging](https://pypi.org/project/packaging) | 24.2 | Core utilities for Python packages +[pandas](https://pypi.org/project/pandas) | 2.2.3 | Powerful data structures for data analysis, time series, and statistics +[pandocfilters](https://pypi.org/project/pandocfilters) | 1.5.1 | Utilities for writing pandoc filters in python +[papermill](https://pypi.org/project/papermill) | 2.6.0 | Parameterize and run Jupyter and nteract Notebooks +[parso](https://pypi.org/project/parso) | 0.8.4 | A Python Parser +[partd](https://pypi.org/project/partd) | 1.4.2 | Appendable key-value storage +[pathspec](https://pypi.org/project/pathspec) | 0.12.1 | Utility library for gitignore style pattern matching of file paths. +[patsy](https://pypi.org/project/patsy) | 1.0.1 | A Python package for describing statistical models and for building design matrices. +[pep8](https://pypi.org/project/pep8) | 1.7.1 | Python style guide checker +[pexpect](https://pypi.org/project/pexpect) | 4.9.0 | Pexpect allows easy control of interactive console applications. +[pg8000](https://pypi.org/project/pg8000) | 1.31.2 | PostgreSQL interface library +[pickleshare](https://pypi.org/project/pickleshare) | 0.7.5 | Tiny 'shelve'-like database with concurrency support +[pillow](https://pypi.org/project/pillow) | 11.1.0 | Python Imaging Library (Fork) +[pip](https://pypi.org/project/pip) | 25.1.1 | The PyPA recommended tool for installing Python packages. +[platformdirs](https://pypi.org/project/platformdirs) | 4.3.7 | A small Python package for determining appropriate platform-specific dirs, e.g. a `user data dir`. +[plotly](https://pypi.org/project/plotly) | 6.0.1 | An open-source interactive data visualization library for Python +[plotnine](https://pypi.org/project/plotnine) | 0.13.6 | A Grammar of Graphics for Python +[plotpy](https://pypi.org/project/plotpy) | 2.7.4 | Curve and image plotting tools for Python/Qt applications +[pluggy](https://pypi.org/project/pluggy) | 1.5.0 | plugin and hook calling mechanisms for python +[ply](https://pypi.org/project/ply) | 3.11 | Python Lex & Yacc +[polars](https://pypi.org/project/polars) | 1.31.0 | Blazingly fast DataFrame library +[portalocker](https://pypi.org/project/portalocker) | 2.7.0 | Wraps the portalocker recipe for easy usage +[prettytable](https://pypi.org/project/prettytable) | 3.16.0 | A simple Python library for easily displaying tabular data in a visually appealing ASCII table format +[prince](https://pypi.org/project/prince) | 0.16.0 | Factor analysis in Python: PCA, CA, MCA, MFA, FAMD, GPA +[priority](https://pypi.org/project/priority) | 2.0.0 | A pure-Python implementation of the HTTP/2 priority tree +[prometheus-client](https://pypi.org/project/prometheus-client) | 0.21.1 | Python client for the Prometheus monitoring system. +[prompt-toolkit](https://pypi.org/project/prompt-toolkit) | 3.0.51 | Library for building powerful interactive command lines in Python +[propcache](https://pypi.org/project/propcache) | 0.3.1 | Accelerated property cache +[protobuf](https://pypi.org/project/protobuf) | 6.30.2 | +[psutil](https://pypi.org/project/psutil) | 7.0.0 | Cross-platform lib for process and system monitoring in Python. NOTE: the syntax of this script MUST be kept compatible with Python 2.7. +[psygnal](https://pypi.org/project/psygnal) | 0.12.0 | Fast python callback/event system modeled after Qt Signals +[ptpython](https://pypi.org/project/ptpython) | 3.0.29 | Python REPL build on top of prompt_toolkit +[ptyprocess](https://pypi.org/project/ptyprocess) | 0.7.0 | Run a subprocess in a pseudo terminal +[pure-eval](https://pypi.org/project/pure-eval) | 0.2.3 | Safely evaluate AST nodes without side effects +[pyarrow](https://pypi.org/project/pyarrow) | 20.0.0 | Python library for Apache Arrow +[pyasn1](https://pypi.org/project/pyasn1) | 0.6.1 | Pure-Python implementation of ASN.1 types and DER/BER/CER codecs (X.208) +[pyasn1-modules](https://pypi.org/project/pyasn1-modules) | 0.4.1 | A collection of ASN.1-based protocols modules +[pybind11](https://pypi.org/project/pybind11) | 2.13.6 | Seamless operability between C++11 and Python +[pycodestyle](https://pypi.org/project/pycodestyle) | 2.12.0 | Python style guide checker +[pycparser](https://pypi.org/project/pycparser) | 2.22 | C parser in Python +[pydantic](https://pypi.org/project/pydantic) | 2.10.6 | Data validation using Python type hints +[pydantic-ai-slim](https://pypi.org/project/pydantic-ai-slim) | 0.2.9 | Agent Framework / shim to use Pydantic with LLMs, slim package +[pydantic-core](https://pypi.org/project/pydantic-core) | 2.27.2 | Core functionality for Pydantic validation and serialization +[pydantic-evals](https://pypi.org/project/pydantic-evals) | 0.2.9 | Framework for evaluating stochastic code execution, especially code making use of LLMs +[pydantic-graph](https://pypi.org/project/pydantic-graph) | 0.2.9 | Graph and state machine library +[pydantic-settings](https://pypi.org/project/pydantic-settings) | 2.8.1 | Settings management using Pydantic +[pydeck](https://pypi.org/project/pydeck) | 0.9.1 | Widget for deck.gl maps +[pydocstyle](https://pypi.org/project/pydocstyle) | 6.3.0 | Python docstring style checker +[pydub](https://pypi.org/project/pydub) | 0.25.1 | Manipulate audio with an simple and easy high level interface +[pyerfa](https://pypi.org/project/pyerfa) | 2.0.1.5 | Python bindings for ERFA +[pyflakes](https://pypi.org/project/pyflakes) | 3.2.0 | passive checker of Python programs +[pygithub](https://pypi.org/project/pygithub) | 2.6.1 | Use the full Github API v3 +[pygments](https://pypi.org/project/pygments) | 2.19.1 | Pygments is a syntax highlighting package written in Python. +[pyjwt](https://pypi.org/project/pyjwt) | 2.10.1 | JSON Web Token implementation in Python +[pylint](https://pypi.org/project/pylint) | 3.3.6 | python code static checker +[pylint-venv](https://pypi.org/project/pylint-venv) | 3.0.4 | pylint-venv provides a Pylint init-hook to use the same Pylint installation with different virtual environments. +[pyls-spyder](https://pypi.org/project/pyls-spyder) | 0.4.0 | Spyder extensions for the python-lsp-server +[pymongo](https://pypi.org/project/pymongo) | 4.10.1 | Python driver for MongoDB +[pympler](https://pypi.org/project/pympler) | 1.1 | A development tool to measure, monitor and analyze the memory behavior of Python objects. +[pynacl](https://pypi.org/project/pynacl) | 1.5.0 | Python binding to the Networking and Cryptography (NaCl) library +[pynndescent](https://pypi.org/project/pynndescent) | 0.5.13 | Nearest Neighbor Descent +[pyodbc](https://pypi.org/project/pyodbc) | 5.2.0 | DB API module for ODBC +[pyogrio](https://pypi.org/project/pyogrio) | 0.10.0 | Vectorized spatial vector file format I/O using GDAL/OGR +[pyomo](https://pypi.org/project/pyomo) | 6.9.2 | Pyomo: Python Optimization Modeling Objects +[pypandoc](https://pypi.org/project/pypandoc) | 1.15 | Thin wrapper for pandoc. +[pyparsing](https://pypi.org/project/pyparsing) | 3.2.3 | pyparsing module - Classes and methods to define and execute parsing grammars +[pypdf](https://pypi.org/project/pypdf) | 5.4.0 | A pure-python PDF library capable of splitting, merging, cropping, and transforming PDF files +[pyproj](https://pypi.org/project/pyproj) | 3.7.0 | Python interface to PROJ (cartographic projections and coordinate transformations library) +[pyproject-hooks](https://pypi.org/project/pyproject-hooks) | 1.2.0 | Wrappers to call pyproject.toml-based build backend hooks. +[pyqt5](https://pypi.org/project/pyqt5) | 5.15.11 | Python bindings for the Qt cross platform application toolkit +[pyqt5-qt5](https://pypi.org/project/pyqt5-qt5) | 5.15.2 | The subset of a Qt installation needed by PyQt5. +[pyqt5-sip](https://pypi.org/project/pyqt5-sip) | 12.17.0 | The sip module support for PyQt5 +[pyqtgraph](https://pypi.org/project/pyqtgraph) | 0.13.7 | Scientific Graphics and GUI Library for Python +[pyqtwebengine](https://pypi.org/project/pyqtwebengine) | 5.15.7 | Python bindings for the Qt WebEngine framework +[pyqtwebengine-qt5](https://pypi.org/project/pyqtwebengine-qt5) | 5.15.2 | The subset of a Qt installation needed by PyQtWebEngine. +[pyserial](https://pypi.org/project/pyserial) | 3.5 | Python Serial Port Extension +[pysocks](https://pypi.org/project/pysocks) | 1.7.1 | A Python SOCKS client module. See https://github.com/Anorov/PySocks for more information. +[pyspnego](https://pypi.org/project/pyspnego) | 0.11.2 | Windows Negotiate Authentication Client and Server +[pytest](https://pypi.org/project/pytest) | 8.3.5 | pytest: simple powerful testing with Python +[python-barcode](https://pypi.org/project/python-barcode) | 0.15.1 | Create standard barcodes with Python. No external modules needed. (optional Pillow support included). +[python-dateutil](https://pypi.org/project/python-dateutil) | 2.8.2 | Extensions to the standard Python datetime module +[python-dotenv](https://pypi.org/project/python-dotenv) | 1.1.0 | Read key-value pairs from a .env file and set them as environment variables +[python-json-logger](https://pypi.org/project/python-json-logger) | 3.3.0 | JSON Log Formatter for the Python Logging Package +[python-lsp-black](https://pypi.org/project/python-lsp-black) | 2.0.0 | Black plugin for the Python LSP Server +[python-lsp-jsonrpc](https://pypi.org/project/python-lsp-jsonrpc) | 1.1.2 | JSON RPC 2.0 server library +[python-lsp-server](https://pypi.org/project/python-lsp-server) | 1.12.2 | Python Language Server for the Language Server Protocol +[python-multipart](https://pypi.org/project/python-multipart) | 0.0.20 | A streaming multipart parser for Python +[python-slugify](https://pypi.org/project/python-slugify) | 8.0.4 | A Python slugify application that also handles Unicode +[pythonqwt](https://pypi.org/project/pythonqwt) | 0.14.5 | Qt plotting widgets for Python +[pytoolconfig](https://pypi.org/project/pytoolconfig) | 1.3.1 | Python tool configuration +[pytz](https://pypi.org/project/pytz) | 2025.2 | World timezone definitions, modern and historical +[pyuca](https://pypi.org/project/pyuca) | 1.2 | a Python implementation of the Unicode Collation Algorithm +[pyusb](https://pypi.org/project/pyusb) | 1.3.1 | Easy USB access for Python +[pywavelets](https://pypi.org/project/pywavelets) | 1.8.0 | PyWavelets, wavelet transform module +[pywin32](https://pypi.org/project/pywin32) | 310 | Python for Window Extensions +[pywin32-ctypes](https://pypi.org/project/pywin32-ctypes) | 0.2.3 | A (partial) reimplementation of pywin32 using ctypes/cffi +[pywinpty](https://pypi.org/project/pywinpty) | 2.0.15 | Pseudo terminal support for Windows from Python. +[pyyaml](https://pypi.org/project/pyyaml) | 6.0.2 | YAML parser and emitter for Python +[pyzmq](https://pypi.org/project/pyzmq) | 26.4.0 | Python bindings for 0MQ +[qdarkstyle](https://pypi.org/project/qdarkstyle) | 3.2.3 | The most complete dark/light style sheet for C++/Python and Qt applications +[qdldl](https://pypi.org/project/qdldl) | 0.1.7.post5 | QDLDL, a free LDL factorization routine. +[qrcode](https://pypi.org/project/qrcode) | 8.0 | QR Code image generator +[qstylizer](https://pypi.org/project/qstylizer) | 0.2.4 | Stylesheet Generator for PyQt{4-5}/PySide{1-2} +[qtawesome](https://pypi.org/project/qtawesome) | 1.4.0 | FontAwesome icons in PyQt and PySide applications +[qtconsole](https://pypi.org/project/qtconsole) | 5.6.1 | Jupyter Qt console +[qtpy](https://pypi.org/project/qtpy) | 2.4.3 | Provides an abstraction layer on top of the various Qt bindings (PyQt5/6 and PySide2/6). +[quantecon](https://pypi.org/project/quantecon) | 0.7.2 | Import the main names to top level. +[quart](https://pypi.org/project/quart) | 0.20.0 | A Python ASGI web framework with the same API as Flask +[rapidfuzz](https://pypi.org/project/rapidfuzz) | 3.13.0 | rapid fuzzy string matching +[readme-renderer](https://pypi.org/project/readme-renderer) | 44.0 | readme_renderer is a library for rendering readme descriptions for Warehouse +[redis](https://pypi.org/project/redis) | 5.2.1 | Python client for Redis database and key-value store +[referencing](https://pypi.org/project/referencing) | 0.36.2 | JSON Referencing + Python +[regex](https://pypi.org/project/regex) | 2024.11.6 | Alternative regular expression module, to replace re. +[reportlab](https://pypi.org/project/reportlab) | 4.3.1 | The Reportlab Toolkit +[requests](https://pypi.org/project/requests) | 2.32.3 | Python HTTP for Humans. +[requests-ntlm](https://pypi.org/project/requests-ntlm) | 1.3.0 | This package allows for HTTP NTLM authentication using the requests library. +[requests-toolbelt](https://pypi.org/project/requests-toolbelt) | 1.0.0 | A utility belt for advanced users of python-requests +[rfc3339-validator](https://pypi.org/project/rfc3339-validator) | 0.1.4 | A pure python RFC3339 validator +[rfc3986](https://pypi.org/project/rfc3986) | 2.0.0 | Validating URI References per RFC 3986 +[rfc3986-validator](https://pypi.org/project/rfc3986-validator) | 0.1.1 | Pure python rfc3986 validator +[rich](https://pypi.org/project/rich) | 14.0.0 | Render rich text, tables, progress bars, syntax highlighting, markdown and more to the terminal +[rope](https://pypi.org/project/rope) | 1.13.0 | a python refactoring library... +[rpds-py](https://pypi.org/project/rpds-py) | 0.24.0 | Python bindings to Rust's persistent data structures (rpds) +[rsa](https://pypi.org/project/rsa) | 4.7.2 | Pure-Python RSA implementation +[rtree](https://pypi.org/project/rtree) | 1.4.0 | R-Tree spatial index for Python GIS +[rx](https://pypi.org/project/rx) | 3.2.0 | Reactive Extensions (Rx) for Python +[scikit-image](https://pypi.org/project/scikit-image) | 0.25.2 | Image processing in Python +[scikit-learn](https://pypi.org/project/scikit-learn) | 1.6.1 | A set of python modules for machine learning and data mining +[scipy](https://pypi.org/project/scipy) | 1.15.3 | Fundamental algorithms for scientific computing in Python +[scramp](https://pypi.org/project/scramp) | 1.4.5 | An implementation of the SCRAM protocol. +[scs](https://pypi.org/project/scs) | 3.2.7.post2 | Splitting conic solver +[seaborn](https://pypi.org/project/seaborn) | 0.13.2 | Statistical data visualization +[send2trash](https://pypi.org/project/send2trash) | 1.8.3 | Send file to trash natively under Mac OS X, Windows and Linux +[setuptools](https://pypi.org/project/setuptools) | 79.0.1 | Easily download, build, install, upgrade, and uninstall Python packages +[shapely](https://pypi.org/project/shapely) | 2.1.0 | Manipulation and analysis of geometric objects +[shellingham](https://pypi.org/project/shellingham) | 1.5.4 | Tool to Detect Surrounding Shell +[simplejson](https://pypi.org/project/simplejson) | 3.19.3 | Simple, fast, extensible JSON encoder/decoder for Python +[simpy](https://pypi.org/project/simpy) | 4.1.1 | Event discrete, process based simulation for Python. +[six](https://pypi.org/project/six) | 1.17.0 | Python 2 and 3 compatibility utilities +[sklearn-compat](https://pypi.org/project/sklearn-compat) | 0.1.3 | Ease support for compatible scikit-learn estimators across versions +[skrub](https://pypi.org/project/skrub) | 0.5.3 | Prepping tables for machine learning +[smmap](https://pypi.org/project/smmap) | 5.0.2 | A pure Python implementation of a sliding window memory map manager +[sniffio](https://pypi.org/project/sniffio) | 1.3.1 | Sniff out which async library your code is running under +[snowballstemmer](https://pypi.org/project/snowballstemmer) | 2.2.0 | This package provides 29 stemmers for 28 languages generated from Snowball algorithms. +[sortedcontainers](https://pypi.org/project/sortedcontainers) | 2.4.0 | Sorted Containers -- Sorted List, Sorted Dict, Sorted Set +[sounddevice](https://pypi.org/project/sounddevice) | 0.5.1 | Play and Record Sound with Python +[soupsieve](https://pypi.org/project/soupsieve) | 2.6 | A modern CSS selector implementation for Beautiful Soup. +[sphinx](https://pypi.org/project/sphinx) | 8.1.3 | Python documentation generator +[sphinx-rtd-theme](https://pypi.org/project/sphinx-rtd-theme) | 3.0.2 | Read the Docs theme for Sphinx +[sphinxcontrib-applehelp](https://pypi.org/project/sphinxcontrib-applehelp) | 2.0.0 | sphinxcontrib-applehelp is a Sphinx extension which outputs Apple help books +[sphinxcontrib-devhelp](https://pypi.org/project/sphinxcontrib-devhelp) | 2.0.0 | sphinxcontrib-devhelp is a sphinx extension which outputs Devhelp documents +[sphinxcontrib-htmlhelp](https://pypi.org/project/sphinxcontrib-htmlhelp) | 2.1.0 | sphinxcontrib-htmlhelp is a sphinx extension which renders HTML help files +[sphinxcontrib-jquery](https://pypi.org/project/sphinxcontrib-jquery) | 4.1 | Extension to include jQuery on newer Sphinx releases +[sphinxcontrib-jsmath](https://pypi.org/project/sphinxcontrib-jsmath) | 1.0.1 | A sphinx extension which renders display math in HTML via JavaScript +[sphinxcontrib-qthelp](https://pypi.org/project/sphinxcontrib-qthelp) | 2.0.0 | sphinxcontrib-qthelp is a sphinx extension which outputs QtHelp documents +[sphinxcontrib-serializinghtml](https://pypi.org/project/sphinxcontrib-serializinghtml) | 2.0.0 | sphinxcontrib-serializinghtml is a sphinx extension which outputs "serialized" HTML files (json and pickle) +[spyder](https://pypi.org/project/spyder) | 6.0.7 | The Scientific Python Development Environment +[spyder-kernels](https://pypi.org/project/spyder-kernels) | 3.0.5 | Jupyter kernels for Spyder's console +[sqlalchemy](https://pypi.org/project/sqlalchemy) | 2.0.40 | Database Abstraction Library +[sqlite-bro](https://pypi.org/project/sqlite-bro) | 0.13.1 | a graphic SQLite Client in 1 Python file +[sqlite-fts4](https://pypi.org/project/sqlite-fts4) | 1.0.3 | Python functions for working with SQLite FTS4 search +[sqlite-utils](https://pypi.org/project/sqlite-utils) | 3.38 | CLI tool and Python library for manipulating SQLite databases +[sqlparse](https://pypi.org/project/sqlparse) | 0.5.3 | A non-validating SQL parser. +[squarify](https://pypi.org/project/squarify) | 0.4.4 | Pure Python implementation of the squarify treemap layout algorithm +[sse-starlette](https://pypi.org/project/sse-starlette) | 2.2.1 | SSE plugin for Starlette +[sspilib](https://pypi.org/project/sspilib) | 0.2.0 | SSPI API bindings for Python +[stack-data](https://pypi.org/project/stack-data) | 0.6.3 | Extract data from python stack frames and tracebacks for informative displays +[starlette](https://pypi.org/project/starlette) | 0.46.2 | The little ASGI library that shines. +[statsmodels](https://pypi.org/project/statsmodels) | 0.14.4 | Statistical computations and models for Python +[streamlit](https://pypi.org/project/streamlit) | 1.46.0 | A faster way to build and share data apps +[superqt](https://pypi.org/project/superqt) | 0.7.3 | Missing widgets and components for PyQt/PySide +[sv-ttk](https://pypi.org/project/sv-ttk) | 2.6.0 | A gorgeous theme for Tkinter, based on Windows 11's UI +[sympy](https://pypi.org/project/sympy) | 1.14.0 | Computer algebra system (CAS) in Python +[tabulate](https://pypi.org/project/tabulate) | 0.9.0 | Pretty-print tabular data +[tblib](https://pypi.org/project/tblib) | 3.1.0 | Traceback serialization library. +[tenacity](https://pypi.org/project/tenacity) | 9.1.2 | Retry code until it succeeds +[termcolor](https://pypi.org/project/termcolor) | 3.1.0 | ANSI color formatting for output in terminal +[terminado](https://pypi.org/project/terminado) | 0.18.1 | Tornado websocket backend for the Xterm.js Javascript terminal emulator library. +[text-unidecode](https://pypi.org/project/text-unidecode) | 1.3 | The most basic Text::Unidecode port +[textdistance](https://pypi.org/project/textdistance) | 4.6.3 | Compute distance between the two texts. +[thefuzz](https://pypi.org/project/thefuzz) | 0.22.1 | Fuzzy string matching in python +[threadpoolctl](https://pypi.org/project/threadpoolctl) | 3.6.0 | threadpoolctl +[three-merge](https://pypi.org/project/three-merge) | 0.1.1 | Simple library for merging two strings with respect to a base one +[tifffile](https://pypi.org/project/tifffile) | 2025.3.30 | Read and write TIFF files +[tiktoken](https://pypi.org/project/tiktoken) | 0.9.0 | tiktoken is a fast BPE tokeniser for use with OpenAI's models +[tinycss2](https://pypi.org/project/tinycss2) | 1.4.0 | A tiny CSS parser +[tokenizers](https://pypi.org/project/tokenizers) | 0.21.1 | +[toml](https://pypi.org/project/toml) | 0.10.2 | Python Library for Tom's Obvious, Minimal Language +[tomli](https://pypi.org/project/tomli) | 2.2.1 | A lil' TOML parser +[tomli-w](https://pypi.org/project/tomli-w) | 1.2.0 | A lil' TOML writer +[tomlkit](https://pypi.org/project/tomlkit) | 0.13.2 | Style preserving TOML library +[toolz](https://pypi.org/project/toolz) | 1.0.0 | List processing tools and functional utilities +[tornado](https://pypi.org/project/tornado) | 6.5.1 | Tornado is a Python web framework and asynchronous networking library, originally developed at FriendFeed. +[tqdm](https://pypi.org/project/tqdm) | 4.67.1 | Fast, Extensible Progress Meter +[traitlets](https://pypi.org/project/traitlets) | 5.14.3 | Traitlets Python configuration system +[traittypes](https://pypi.org/project/traittypes) | 0.2.1 | Scipy trait types +[trio](https://pypi.org/project/trio) | 0.30.0 | A friendly Python library for async concurrency and I/O +[trove-classifiers](https://pypi.org/project/trove-classifiers) | 2025.5.9.12 | Canonical source for classifiers on PyPI (pypi.org). +[twine](https://pypi.org/project/twine) | 6.1.0 | Collection of utilities for publishing packages on PyPI +[typer](https://pypi.org/project/typer) | 0.15.2 | Typer, build great CLIs. Easy to code. Based on Python type hints. +[types-python-dateutil](https://pypi.org/project/types-python-dateutil) | 2.9.0.20240316 | Typing stubs for python-dateutil +[types-requests](https://pypi.org/project/types-requests) | 2.32.0.20250328 | Typing stubs for requests +[typing-extensions](https://pypi.org/project/typing-extensions) | 4.13.2 | Backported and Experimental Type Hints for Python 3.8+ +[typing-inspection](https://pypi.org/project/typing-inspection) | 0.4.0 | Runtime typing introspection tools +[tzdata](https://pypi.org/project/tzdata) | 2025.2 | Provider of IANA time zone data +[tzlocal](https://pypi.org/project/tzlocal) | 5.3.1 | tzinfo object for the local timezone +[ujson](https://pypi.org/project/ujson) | 5.10.0 | Ultra fast JSON encoder and decoder for Python +[umap-learn](https://pypi.org/project/umap-learn) | 0.5.7 | Uniform Manifold Approximation and Projection +[uncertainties](https://pypi.org/project/uncertainties) | 3.2.2 | calculations with values with uncertainties, error propagation +[uri-template](https://pypi.org/project/uri-template) | 1.3.0 | RFC 6570 URI Template Processor +[urllib3](https://pypi.org/project/urllib3) | 2.4.0 | HTTP library with thread-safe connection pooling, file post, and more. +[uvicorn](https://pypi.org/project/uvicorn) | 0.34.2 | The lightning-fast ASGI server. +[vega-datasets](https://pypi.org/project/vega-datasets) | 0.9.0 | A Python package for offline access to Vega datasets +[waitress](https://pypi.org/project/waitress) | 3.0.0 | Waitress WSGI server +[watchdog](https://pypi.org/project/watchdog) | 6.0.0 | Filesystem events monitoring +[wcwidth](https://pypi.org/project/wcwidth) | 0.2.13 | Measures the displayed width of unicode strings in a terminal +[webcolors](https://pypi.org/project/webcolors) | 24.11.1 | A library for working with the color formats defined by HTML and CSS. +[webencodings](https://pypi.org/project/webencodings) | 0.5.1 | Character encoding aliases for legacy web content +[websocket-client](https://pypi.org/project/websocket-client) | 1.8.0 | WebSocket client for Python with low level API options +[websockets](https://pypi.org/project/websockets) | 14.2 | An implementation of the WebSocket Protocol (RFC 6455 & 7692) +[werkzeug](https://pypi.org/project/werkzeug) | 3.1.3 | The comprehensive WSGI web application library. +[whatthepatch](https://pypi.org/project/whatthepatch) | 1.0.7 | A patch parsing and application library. +[wheel](https://pypi.org/project/wheel) | 0.45.1 | A built-package format for Python +[widgetsnbextension](https://pypi.org/project/widgetsnbextension) | 4.0.14 | Jupyter interactive widgets for Jupyter Notebook +[wordcloud](https://pypi.org/project/wordcloud) | 1.9.4 | A little word cloud generator +[wrapt](https://pypi.org/project/wrapt) | 1.16.0 | Module for decorators, wrappers and monkey patching. +[wsproto](https://pypi.org/project/wsproto) | 1.2.0 | WebSockets state-machine based protocol implementation +[xarray](https://pypi.org/project/xarray) | 2025.4.0 | N-D labeled arrays and datasets in Python +[xlsxwriter](https://pypi.org/project/xlsxwriter) | 3.2.3 | A Python module for creating Excel XLSX files. +[xyzservices](https://pypi.org/project/xyzservices) | 2023.10.1 | Source of XYZ tiles providers +[yapf](https://pypi.org/project/yapf) | 0.40.1 | A formatter for Python code. +[yarl](https://pypi.org/project/yarl) | 1.18.3 | Yet another URL library +[yt-dlp](https://pypi.org/project/yt-dlp) | 2025.2.19 | A feature-rich command-line audio/video downloader +[zict](https://pypi.org/project/zict) | 3.0.0 | Mutable mapping tools +[zipp](https://pypi.org/project/zipp) | 3.21.0 | Backport of pathlib-compatible object wrapper for zip files +[zstandard](https://pypi.org/project/zstandard) | 0.23.0 | Zstandard bindings for Python + + +
    diff --git a/changelogs/WinPythonwhl-64bit-3.13.5.0_History.md b/changelogs/WinPythonwhl-64bit-3.13.5.0_History.md new file mode 100644 index 00000000..6c4b0699 --- /dev/null +++ b/changelogs/WinPythonwhl-64bit-3.13.5.0_History.md @@ -0,0 +1,26 @@ +## History of changes for WinPython-64bit 3.13.5.0whl + +The following changes were made to WinPython-64bit distribution since version 3.13.5.0whl. + + +
    + +### Tools + + +No differences found. + +### Python packages + + +No differences found. + +### WheelHouse packages + + +No differences found. + + +
    + +* * * diff --git a/changelogs/md5_sha1.txt b/changelogs/md5_sha1.txt index 2ab82bcb..6bc9f65a 100644 --- a/changelogs/md5_sha1.txt +++ b/changelogs/md5_sha1.txt @@ -1,3 +1,25 @@ +### WinPython 2025-03 release (June 28th, 2025) + +MD5 | SHA-1 | SHA-256 | Binary | Size | blake2b-256 +---------------------------------|------------------------------------------|------------------------------------------------------------------|-----------------------------------|----------------------|----------------------------------------------------------------- +6e986d2daa963800ad7deaa7b151c895 | ab9600442433d577f044d3c7604ba8193407bcd4 | 8ec81761447c1c9ff143f4faa7b86351787f8c0314ce249aac260a5972b9edf2 | Winpython64-3.12.10.1dot.exe | 23 422 054 Bytes | 58a57d858663de7ed45c5b53835e73102213c881784aab64635ecfb1fe03565d +97fba9cbd845601843fda825155caac1 | 9607229783d66c505894b4b2547af41891c4f669 | 7a1f004aec39615977b2b245423a50115530d16af3418df77977186a555d0a40 | Winpython64-3.12.10.1dot.zip | 38 519 826 Bytes | 543db8fd8cecba4bf6e72596f55d4cacbf2fe49fb9d397b26024088788cdbfba +b1df445794a2826a7355ae29cfc467d8 | 27a2807265bcd574f0338013311227a4c0b29001 | a320f799843712b0c3aa5bcb0fb472cd36dc74615a1436c976c4bf6e8a4ac29f | Winpython64-3.12.10.1slim.7z | 630 560 365 Bytes | 50a4da7c92586357f8730f3bc7174a409edd7ee4aebb9bc49440b2976d89bcca +0cc2ac82631562ec87d1c608eaab9ef1 | ba69116fc9bd2d728ff15a29f588275995fc94db | 62c935050f1bfe3165f2b0c60f8195bdcbee12e83d0a0f360e7a8f7dc60bf40a | Winpython64-3.12.10.1slim.exe | 630 775 751 Bytes | 62df47ca5c8e3d01ce620ff35d267cf118354380ce116f96d84674d189b01290 +2b97ec540e90243038319bbab4346885 | c2d7bb5d981ab38a621a97b95396bcc06f688f61 | 0c526a46fa72ed78cfa45b5332c491fa476bf41f11b2feab90fa7bd48e90724d | Winpython64-3.12.10.1whl.7z | 669 141 991 Bytes | a81cf5421045ba498e7f810c882d0bfd58f5885bc78a34623a2ed85d4529fe90 +12f60270841f87960ff6ce4e5f72d988 | b2f58a6def515cc63be9adf49071630da2edb1e6 | 9f9488eca6aba8fbe75cccde84457b6753cb100a66a4c6c9116107907c4df096 | Winpython64-3.13.5.0dot.exe | 25 108 248 Bytes | 9e649e6667b632bf4b9dd834d985fd1150aaa56e084f564e8d5fde7411b9b7b4 +7aa09c30d44f49abcb6df551fb604dad | 5cf05836d06c0146b7994003568e2b3187dc86c6 | 2727803b134290dcf8b06447b8c122a04ec4e0c592a481c1b6db1b9fa41a09fc | Winpython64-3.13.5.0dot.zip | 39 977 050 Bytes | 16debf3592081a2a7e03931278365b49b28134501d9faee0b252a0f7ebeee2e1 +cbb360471ca828b7753b0ee20e55a3ad | 8bd495def05b5187075e538be1eff957abcff24d | 12c22b0223fe59da9831ba42d44f042826bc8502e15801b9c26ecc3c77dac8aa | Winpython64-3.13.5.0slim.7z | 635 310 049 Bytes | 8e5dd9adf60dd0765743d98c1f13b0e579177a33975fb3df7e30c3290fe01373 +830ffba4935017c13fa2b36d169c08eb | fad23f5af5f5e5584ff21ba02b31c367762e4813 | 495364ef366806a08e649bcaaa32284252f2d317c0360380d467e4b9a01a5428 | Winpython64-3.13.5.0slim.exe | 635 525 645 Bytes | f410fae1fafe18ff07de184d697ed665dc55cf3ce6f073e26bada38110b1e1e1 +549c1e98f751d78e55b655ced2b37dfb | a17413cb2ebe292baa393a9c39b1445569fbac92 | 21422ba5ad05af2306e4fbea0cf95ed0df2df06ed301c6b6ffa6f8f289be61ff | Winpython64-3.13.5.0whl.7z | 670 983 739 Bytes | 5bfe915c4db5edfd7a5da3b34adb28df8eae2714ffb6835ca4349571bb95f7e9 +957f4ce2220f86f9a0dfd544c1059347 | ac6bff0f2a9d70761f51fccd541a3936a81f79ed | a54b5dc8a1d5dba697d52069349a5d3b4fdd1f78090c3bbd73c5a46ddbe4a536 | Winpython64-3.14.0.0freeb3.exe | 27 604 465 Bytes | 11179b50e8fe98fa5b515db33e66aa08ea84dc4ad05f164f010df11784af7e05 +aa72d902262d409f0d0dd66d1b22a1b5 | 6cf322bf92b8093e95bf64955b8caec7fddd9430 | 23230dad12ebac1dd58043782d8a534143711bbada51e6f0d1f827ba08eb987a | Winpython64-3.14.0.0freeb3.zip | 46 626 549 Bytes | a788f5daee00a97832087a90ac2baea1852f7640fa57f46f250552d09d874886 +49a26ef054a744792de6e50586feeb5f | 2c99b9b9ceafa8c634624a1d0fed3f52e716d770 | db37ea4a33b9dfe618d788776547f0657408fb6b75b5429433990d43be4ac712 | pylock.64-3_12_10_1slim.toml | 190 459 Bytes | da71bf8b4465fd4f2f138606cc9a7e2c5003ef2a0b53b2c1cf1cca3ec4863578 +6c9b240066e3aab4e0489cf60e76653e | 1669cfe258a50ac8bdd34776a2a38ef4489e44e1 | 543fb039c8e01f1d8e38473b0624ce75949d68d92b1fbf738aff18341f8a67d1 | pylock.64-3_13_5_0slim.toml | 190 441 Bytes | 26aac2e1c0a87b392aa203a7d51d6879612738f66b3b06b259fef45fff2f1521 +aa96bb795c6908f28692972f8a64ca13 | 40981f9fb851ac0f46cd39fbbbb1eac07d5154ff | 1b22a3b8e157cac0b8958dd46858130ab7d416b5f01d0664f53ca649c5f5f148 | requir.64-3_12_10_1slim.txt | 52 262 Bytes | 40fd3a79f147a9b3cf5ea65b5e0d8a314bc14bde3b242eadf04a447399c8556b +22dc7e0e65f98bcf03b5ce04f6ac8ebd | a2278e6a4289191eab32b9a94ba96311633a81eb | 8e297bc7c44a717be162877e57f41763ed414b2aa8e76c87077141158786705c | requir.64-3_13_5_0slim.txt | 52 262 Bytes | 986685832cb240e3728af2770c25b0dc07666f21c627453ada41cb201b56d8f4 + + ### WinPython 2025-02 release (May 4th, 2025) MD5 | SHA-1 | SHA-256 | Binary | Size | blake2b-256 From 16952765350f1cdc80af87bc95724097a53ec5ae Mon Sep 17 00:00:00 2001 From: stonebig Date: Sat, 28 Jun 2025 13:07:29 +0200 Subject: [PATCH 247/305] the lock files ! --- changelogs/pylock.64-3_12_10_1slim.toml | 5491 +++++++++++++++++++++++ changelogs/pylock.64-3_13_5_0slim.toml | 5491 +++++++++++++++++++++++ changelogs/requir.64-3_12_10_1slim.txt | 998 ++++ changelogs/requir.64-3_13_5_0slim.txt | 998 ++++ 4 files changed, 12978 insertions(+) create mode 100644 changelogs/pylock.64-3_12_10_1slim.toml create mode 100644 changelogs/pylock.64-3_13_5_0slim.toml create mode 100644 changelogs/requir.64-3_12_10_1slim.txt create mode 100644 changelogs/requir.64-3_13_5_0slim.txt diff --git a/changelogs/pylock.64-3_12_10_1slim.toml b/changelogs/pylock.64-3_12_10_1slim.toml new file mode 100644 index 00000000..83f31af9 --- /dev/null +++ b/changelogs/pylock.64-3_12_10_1slim.toml @@ -0,0 +1,5491 @@ +lock-version = "1.0" +created-by = "pip" + +[[packages]] +name = "absl-py" +version = "2.2.2" + +[[packages.wheels]] +name = "absl_py-2.2.2-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/f6/d4/349f7f4bd5ea92dab34f5bb0fe31775ef6c311427a14d5a5b31ecb442341/absl_py-2.2.2-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "e5797bc6abe45f64fd95dc06394ca3f2bedf3b5d895e9da691c9ee3397d70092" + +[[packages]] +name = "adbc-driver-manager" +version = "1.3.0" + +[[packages.wheels]] +name = "adbc_driver_manager-1.3.0-cp312-cp312-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/65/ef/c628399e3c386215e2f26c7bb0beafb7ee5a6866b3b3e26008d376decc3a/adbc_driver_manager-1.3.0-cp312-cp312-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "0646996a7bbd31b321a16810f7110e9155b08607c0a83fed97414ad1bd2cac9e" + +[[packages]] +name = "aiofiles" +version = "23.2.1" + +[[packages.wheels]] +name = "aiofiles-23.2.1-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/c5/19/5af6804c4cc0fed83f47bff6e413a98a36618e7d40185cd36e69737f3b0e/aiofiles-23.2.1-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "19297512c647d4b27a2cf7c34caa7e405c0d60b5560618a29a9fe027b18b0107" + +[[packages]] +name = "aiohappyeyeballs" +version = "2.6.1" + +[[packages.wheels]] +name = "aiohappyeyeballs-2.6.1-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/0f/15/5bf3b99495fb160b63f95972b81750f18f7f4e02ad051373b669d17d44f2/aiohappyeyeballs-2.6.1-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "f349ba8f4b75cb25c99c5c2d84e997e485204d2902a9597802b0371f09331fb8" + +[[packages]] +name = "aiohttp" +version = "3.11.18" + +[[packages.wheels]] +name = "aiohttp-3.11.18-cp312-cp312-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/33/9a/e34e65506e06427b111e19218a99abf627638a9703f4b8bcc3e3021277ed/aiohttp-3.11.18-cp312-cp312-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "364329f319c499128fd5cd2d1c31c44f234c58f9b96cc57f743d16ec4f3238c8" + +[[packages]] +name = "aiosignal" +version = "1.3.2" + +[[packages.wheels]] +name = "aiosignal-1.3.2-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/ec/6a/bc7e17a3e87a2985d3e8f4da4cd0f481060eb78fb08596c42be62c90a4d9/aiosignal-1.3.2-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "45cde58e409a301715980c2b01d0c28bdde3770d8290b5eb2173759d9acb31a5" + +[[packages]] +name = "aiosqlite" +version = "0.20.0" + +[[packages.wheels]] +name = "aiosqlite-0.20.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/00/c4/c93eb22025a2de6b83263dfe3d7df2e19138e345bca6f18dba7394120930/aiosqlite-0.20.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "36a1deaca0cac40ebe32aac9977a6e2bbc7f5189f23f4a54d5908986729e5bd6" + +[[packages]] +name = "alabaster" +version = "0.7.16" + +[[packages.wheels]] +name = "alabaster-0.7.16-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/32/34/d4e1c02d3bee589efb5dfa17f88ea08bdb3e3eac12bc475462aec52ed223/alabaster-0.7.16-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "b46733c07dce03ae4e150330b975c75737fa60f0a7c591b6c8bf4928a28e2c92" + +[[packages]] +name = "alembic" +version = "1.15.2" + +[[packages.wheels]] +name = "alembic-1.15.2-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/41/18/d89a443ed1ab9bcda16264716f809c663866d4ca8de218aa78fd50b38ead/alembic-1.15.2-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "2e76bd916d547f6900ec4bb5a90aeac1485d2c92536923d0b138c02b126edc53" + +[[packages]] +name = "altair" +version = "5.5.0" + +[[packages.wheels]] +name = "altair-5.5.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/aa/f3/0b6ced594e51cc95d8c1fc1640d3623770d01e4969d29c0bd09945fafefa/altair-5.5.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "91a310b926508d560fe0148d02a194f38b824122641ef528113d029fcd129f8c" + +[[packages]] +name = "annotated-types" +version = "0.7.0" + +[[packages.wheels]] +name = "annotated_types-0.7.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53" + +[[packages]] +name = "ansicolors" +version = "1.1.8" + +[[packages.wheels]] +name = "ansicolors-1.1.8-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/53/18/a56e2fe47b259bb52201093a3a9d4a32014f9d85071ad07e9d60600890ca/ansicolors-1.1.8-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "00d2dde5a675579325902536738dd27e4fac1fd68f773fe36c21044eb559e187" + +[[packages]] +name = "anthropic" +version = "0.51.0" + +[[packages.wheels]] +name = "anthropic-0.51.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/8c/6e/9637122c5f007103bd5a259f4250bd8f1533dd2473227670fd10a1457b62/anthropic-0.51.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "b8b47d482c9aa1f81b923555cebb687c2730309a20d01be554730c8302e0f62a" + +[[packages]] +name = "anyio" +version = "4.9.0" + +[[packages.wheels]] +name = "anyio-4.9.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/a1/ee/48ca1a7c89ffec8b6a0c5d02b89c305671d5ffd8d3c94acf8b8c408575bb/anyio-4.9.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "9f76d541cad6e36af7beb62e978876f3b41e3e04f2c1fbf0884604c0a9c4d93c" + +[[packages]] +name = "anywidget" +version = "0.9.18" + +[[packages.wheels]] +name = "anywidget-0.9.18-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/2b/f0/09a30ca0551af20c7cefa7464b7ccb6f5407a550b83c4dcb15c410814849/anywidget-0.9.18-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "944b82ef1dd17b8ff0fb6d1f199f613caf9111338e6e2857da478f6e73770cb8" + +[[packages]] +name = "appdirs" +version = "1.4.4" + +[[packages.wheels]] +name = "appdirs-1.4.4-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/3b/00/2344469e2084fb287c2e0b57b72910309874c3245463acd6cf5e3db69324/appdirs-1.4.4-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "a841dacd6b99318a741b166adb07e19ee71a274450e68237b4650ca1055ab128" + +[[packages]] +name = "argcomplete" +version = "3.6.2" + +[[packages.wheels]] +name = "argcomplete-3.6.2-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/31/da/e42d7a9d8dd33fa775f467e4028a47936da2f01e4b0e561f9ba0d74cb0ca/argcomplete-3.6.2-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "65b3133a29ad53fb42c48cf5114752c7ab66c1c38544fdf6460f450c09b42591" + +[[packages]] +name = "argon2-cffi" +version = "23.1.0" + +[[packages.wheels]] +name = "argon2_cffi-23.1.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/a4/6a/e8a041599e78b6b3752da48000b14c8d1e8a04ded09c88c714ba047f34f5/argon2_cffi-23.1.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "c670642b78ba29641818ab2e68bd4e6a78ba53b7eff7b4c3815ae16abf91c7ea" + +[[packages]] +name = "argon2-cffi-bindings" +version = "21.2.0" + +[[packages.wheels]] +name = "argon2_cffi_bindings-21.2.0-cp36-abi3-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/37/2c/e34e47c7dee97ba6f01a6203e0383e15b60fb85d78ac9a15cd066f6fe28b/argon2_cffi_bindings-21.2.0-cp36-abi3-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "b2ef1c30440dbbcba7a5dc3e319408b59676e2e039e2ae11a8775ecf482b192f" + +[[packages]] +name = "array-api-compat" +version = "1.12.0" + +[[packages.wheels]] +name = "array_api_compat-1.12.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/e0/b1/0542e0cab6f49f151a2d7a42400f84f706fc0b64e85dc1f56708b2e9fd37/array_api_compat-1.12.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "a0b4795b6944a9507fde54679f9350e2ad2b1e2acf4a2408a098cdc27f890a8b" + +[[packages]] +name = "arrow" +version = "1.3.0" + +[[packages.wheels]] +name = "arrow-1.3.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/f8/ed/e97229a566617f2ae958a6b13e7cc0f585470eac730a73e9e82c32a3cdd2/arrow-1.3.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "c728b120ebc00eb84e01882a6f5e7927a53960aa990ce7dd2b10f39005a67f80" + +[[packages]] +name = "asgi-csrf" +version = "0.11" + +[[packages.wheels]] +name = "asgi_csrf-0.11-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/82/1c/5d954baaf144852a4762368b37c06202b277378ea412acc5565f69acc9e9/asgi_csrf-0.11-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "03ac140115f39d4295288a9adf74fdc6ae607f6ef44abee8466520458207242b" + +[[packages]] +name = "asgiref" +version = "3.8.1" + +[[packages.wheels]] +name = "asgiref-3.8.1-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/39/e3/893e8757be2612e6c266d9bb58ad2e3651524b5b40cf56761e985a28b13e/asgiref-3.8.1-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "3e1e3ecc849832fe52ccf2cb6686b7a55f82bb1d6aee72a58826471390335e47" + +[[packages]] +name = "asn1crypto" +version = "1.5.1" + +[[packages.wheels]] +name = "asn1crypto-1.5.1-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/c9/7f/09065fd9e27da0eda08b4d6897f1c13535066174cc023af248fc2a8d5e5a/asn1crypto-1.5.1-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "db4e40728b728508912cbb3d44f19ce188f218e9eba635821bb4b68564f8fd67" + +[[packages]] +name = "asteval" +version = "1.0.5" + +[[packages.wheels]] +name = "asteval-1.0.5-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/0a/0d/2c6aaab67ac566d76322e87827d707214c5f6ffb5a4fcd456a8633da1788/asteval-1.0.5-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "082b95312578affc8a6d982f7d92b7ac5de05634985c87e7eedd3188d31149fa" + +[[packages]] +name = "astroid" +version = "3.3.9" + +[[packages.wheels]] +name = "astroid-3.3.9-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/de/80/c749efbd8eef5ea77c7d6f1956e8fbfb51963b7f93ef79647afd4d9886e3/astroid-3.3.9-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "d05bfd0acba96a7bd43e222828b7d9bc1e138aaeb0649707908d3702a9831248" + +[[packages]] +name = "astropy" +version = "6.1.6" + +[[packages.wheels]] +name = "astropy-6.1.6-cp312-cp312-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/06/25/a1c6245c15b8f74e97ee058632739023050a475f979f65056401441f00fd/astropy-6.1.6-cp312-cp312-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "344c6433b66c770917cb55f9f3754427774d7066bfa7ccf1ca638f45c7c00738" + +[[packages]] +name = "astropy-iers-data" +version = "0.2024.12.23.0.33.24" + +[[packages.wheels]] +name = "astropy_iers_data-0.2024.12.23.0.33.24-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/e8/4d/565740d9ac54640c09d2fdd22ef3583103438fb97305a9cfb66595a4b259/astropy_iers_data-0.2024.12.23.0.33.24-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "40d3c6b6a5cf4dc6ad91b92b7e0f949e5366234e3c4440302247429fc8294302" + +[[packages]] +name = "asttokens" +version = "3.0.0" + +[[packages.wheels]] +name = "asttokens-3.0.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/25/8a/c46dcc25341b5bce5472c718902eb3d38600a903b14fa6aeecef3f21a46f/asttokens-3.0.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "e3078351a059199dd5138cb1c706e6430c05eff2ff136af5eb4790f9d28932e2" + +[[packages]] +name = "async-lru" +version = "2.0.5" + +[[packages.wheels]] +name = "async_lru-2.0.5-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/03/49/d10027df9fce941cb8184e78a02857af36360d33e1721df81c5ed2179a1a/async_lru-2.0.5-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "ab95404d8d2605310d345932697371a5f40def0487c03d6d0ad9138de52c9943" + +[[packages]] +name = "asyncssh" +version = "2.20.0" + +[[packages.wheels]] +name = "asyncssh-2.20.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/f2/c5/7a9d42c065f272f74792663194966a68810e851a34c0dd080246bd7308f5/asyncssh-2.20.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "af6888d937c07a4bf31293335a6166b4d87608cdb5957b49547da6ad87ecf174" + +[[packages]] +name = "atomicwrites" +version = "1.4.0" + +[[packages.wheels]] +name = "atomicwrites-1.4.0-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/2c/a0/da5f49008ec6e9a658dbf5d7310a4debd397bce0b4db03cf8a410066bb87/atomicwrites-1.4.0-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "6d1784dea7c0c8d4a5172b6c620f40b6e4cbfdf96d783691f2e1302a7b88e197" + +[[packages]] +name = "attrs" +version = "25.3.0" + +[[packages.wheels]] +name = "attrs-25.3.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/77/06/bb80f5f86020c4551da315d78b3ab75e8228f89f0162f2c3a819e407941a/attrs-25.3.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "427318ce031701fea540783410126f03899a97ffc6f61596ad581ac2e40e3bc3" + +[[packages]] +name = "autopep8" +version = "2.0.4" + +[[packages.wheels]] +name = "autopep8-2.0.4-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/d8/f2/e63c9f9c485cd90df8e4e7ae90fa3be2469c9641888558c7b45fa98a76f8/autopep8-2.0.4-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "067959ca4a07b24dbd5345efa8325f5f58da4298dab0dde0443d5ed765de80cb" + +[[packages]] +name = "azure-core" +version = "1.32.0" + +[[packages.wheels]] +name = "azure_core-1.32.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/39/83/325bf5e02504dbd8b4faa98197a44cdf8a325ef259b48326a2b6f17f8383/azure_core-1.32.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "eac191a0efb23bfa83fddf321b27b122b4ec847befa3091fa736a5c32c50d7b4" + +[[packages]] +name = "azure-cosmos" +version = "4.9.0" + +[[packages.wheels]] +name = "azure_cosmos-4.9.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/61/dc/380f843744535497acd0b85aacb59565c84fc28bf938c8d6e897a858cd95/azure_cosmos-4.9.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "3b60eaa01a16a857d0faf0cec304bac6fa8620a81bc268ce760339032ef617fe" + +[[packages]] +name = "azure-identity" +version = "1.21.0" + +[[packages.wheels]] +name = "azure_identity-1.21.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/3d/9f/1f9f3ef4f49729ee207a712a5971a9ca747f2ca47d9cbf13cf6953e3478a/azure_identity-1.21.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "258ea6325537352440f71b35c3dffe9d240eae4a5126c1b7ce5efd5766bd9fd9" + +[[packages]] +name = "babel" +version = "2.17.0" + +[[packages.wheels]] +name = "babel-2.17.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/b7/b8/3fe70c75fe32afc4bb507f75563d39bc5642255d1d94f1f23604725780bf/babel-2.17.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "4d0b53093fdfb4b21c92b5213dba5a1b23885afa8383709427046b21c366e5f2" + +[[packages]] +name = "baresql" +version = "1.0.0" + +[[packages.wheels]] +name = "baresql-1.0.0-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/d6/d2/fe24bcd99d97bddbbccdf191edf4e84c0fdfe894dfff9f54b05f36096ebb/baresql-1.0.0-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "a24d17f46beb47c221f328f7e06710e3896c6203a8e1909788d7128f27b86f01" + +[[packages]] +name = "bcrypt" +version = "4.3.0" + +[[packages.wheels]] +name = "bcrypt-4.3.0-cp39-abi3-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/a9/cf/45fb5261ece3e6b9817d3d82b2f343a505fd58674a92577923bc500bd1aa/bcrypt-4.3.0-cp39-abi3-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "e53e074b120f2877a35cc6c736b8eb161377caae8925c17688bd46ba56daaa5b" + +[[packages]] +name = "beautifulsoup4" +version = "4.13.3" + +[[packages.wheels]] +name = "beautifulsoup4-4.13.3-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/f9/49/6abb616eb3cbab6a7cca303dc02fdf3836de2e0b834bf966a7f5271a34d8/beautifulsoup4-4.13.3-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "99045d7d3f08f91f0d656bc9b7efbae189426cd913d830294a15eefa0ea4df16" + +[[packages]] +name = "binaryornot" +version = "0.4.4" + +[[packages.wheels]] +name = "binaryornot-0.4.4-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/24/7e/f7b6f453e6481d1e233540262ccbfcf89adcd43606f44a028d7f5fae5eb2/binaryornot-0.4.4-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "b8b71173c917bddcd2c16070412e369c3ed7f0528926f70cac18a6c97fd563e4" + +[[packages]] +name = "black" +version = "25.1.0" + +[[packages.wheels]] +name = "black-25.1.0-cp312-cp312-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/18/7e/a27c3ad3822b6f2e0e00d63d58ff6299a99a5b3aee69fa77cd4b0076b261/black-25.1.0-cp312-cp312-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "ea0213189960bda9cf99be5b8c8ce66bb054af5e9e861249cd23471bd7b0b3ba" + +[[packages]] +name = "bleach" +version = "6.2.0" + +[[packages.wheels]] +name = "bleach-6.2.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/fc/55/96142937f66150805c25c4d0f31ee4132fd33497753400734f9dfdcbdc66/bleach-6.2.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "117d9c6097a7c3d22fd578fcd8d35ff1e125df6736f554da4e432fdd63f31e5e" + +[[packages]] +name = "blinker" +version = "1.9.0" + +[[packages.wheels]] +name = "blinker-1.9.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/10/cb/f2ad4230dc2eb1a74edf38f1a38b9b52277f75bef262d8908e60d957e13c/blinker-1.9.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "ba0efaa9080b619ff2f3459d1d500c57bddea4a6b424b60a91141db6fd2f08bc" + +[[packages]] +name = "bokeh" +version = "3.7.3" + +[[packages.wheels]] +name = "bokeh-3.7.3-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/91/48/08b2382e739236aa3360b7976360ba3e0c043b6234e25951c18c1eb6fa06/bokeh-3.7.3-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "b0e79dd737f088865212e4fdcb0f3b95d087f0f088bf8ca186a300ab1641e2c7" + +[[packages]] +name = "branca" +version = "0.8.1" + +[[packages.wheels]] +name = "branca-0.8.1-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/f8/9d/91cddd38bd00170aad1a4b198c47b4ed716be45c234e09b835af41f4e717/branca-0.8.1-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "d29c5fab31f7c21a92e34bf3f854234e29fecdcf5d2df306b616f20d816be425" + +[[packages]] +name = "brotli" +version = "1.1.0" + +[[packages.wheels]] +name = "Brotli-1.1.0-cp312-cp312-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/3d/d5/942051b45a9e883b5b6e98c041698b1eb2012d25e5948c58d6bf85b1bb43/Brotli-1.1.0-cp312-cp312-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "906bc3a79de8c4ae5b86d3d75a8b77e44404b0f4261714306e3ad248d8ab0951" + +[[packages]] +name = "build" +version = "1.2.2.post1" + +[[packages.wheels]] +name = "build-1.2.2.post1-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/84/c2/80633736cd183ee4a62107413def345f7e6e3c01563dbca1417363cf957e/build-1.2.2.post1-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "1d61c0887fa860c01971625baae8bdd338e517b836a2f70dd1f7aa3a6b2fc5b5" + +[[packages]] +name = "cachetools" +version = "5.5.2" + +[[packages.wheels]] +name = "cachetools-5.5.2-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/72/76/20fa66124dbe6be5cafeb312ece67de6b61dd91a0247d1ea13db4ebb33c2/cachetools-5.5.2-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "d26a22bcc62eb95c3beabd9f1ee5e820d3d2704fe2967cbe350e20c8ffcd3f0a" + +[[packages]] +name = "certifi" +version = "2025.1.31" + +[[packages.wheels]] +name = "certifi-2025.1.31-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/38/fc/bce832fd4fd99766c04d1ee0eead6b0ec6486fb100ae5e74c1d91292b982/certifi-2025.1.31-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "ca78db4565a652026a4db2bcdf68f2fb589ea80d0be70e03929ed730746b84fe" + +[[packages]] +name = "cffi" +version = "1.17.1" + +[[packages.wheels]] +name = "cffi-1.17.1-cp312-cp312-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/50/b9/db34c4755a7bd1cb2d1603ac3863f22bcecbd1ba29e5ee841a4bc510b294/cffi-1.17.1-cp312-cp312-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "51392eae71afec0d0c8fb1a53b204dbb3bcabcb3c9b807eedf3e1e6ccf2de903" + +[[packages]] +name = "chardet" +version = "5.2.0" + +[[packages.wheels]] +name = "chardet-5.2.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/38/6f/f5fbc992a329ee4e0f288c1fe0e2ad9485ed064cac731ed2fe47dcc38cbf/chardet-5.2.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "e1cf59446890a00105fe7b7912492ea04b6e6f06d4b742b2c788469e34c82970" + +[[packages]] +name = "charset-normalizer" +version = "3.4.2" + +[[packages.wheels]] +name = "charset_normalizer-3.4.2-cp312-cp312-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/6c/4f/c02d5c493967af3eda9c771ad4d2bbc8df6f99ddbeb37ceea6e8716a32bc/charset_normalizer-3.4.2-cp312-cp312-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "5a9979887252a82fefd3d3ed2a8e3b937a7a809f65dcb1e068b090e165bbe99e" + +[[packages]] +name = "clarabel" +version = "0.10.0" + +[[packages.wheels]] +name = "clarabel-0.10.0-cp39-abi3-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/e6/ba/67a0defb70ed910877049e915e6738fc0432edd5e46b97743ce78a1e5b95/clarabel-0.10.0-cp39-abi3-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "7871b6f499ad66f71d4e7fb40754c4d986d4316f242beb62ff4f63a69785a50c" + +[[packages]] +name = "click" +version = "8.1.8" + +[[packages.wheels]] +name = "click-8.1.8-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/7e/d4/7ebdbd03970677812aac39c869717059dbb71a4cfc033ca6e5221787892c/click-8.1.8-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "63c132bbbed01578a06712a2d1f497bb62d9c1c0d329b7903a866228027263b2" + +[[packages]] +name = "click-default-group" +version = "1.2.4" + +[[packages.wheels]] +name = "click_default_group-1.2.4-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/2c/1a/aff8bb287a4b1400f69e09a53bd65de96aa5cee5691925b38731c67fc695/click_default_group-1.2.4-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "9b60486923720e7fc61731bdb32b617039aba820e22e1c88766b1125592eaa5f" + +[[packages]] +name = "cloudpickle" +version = "3.1.1" + +[[packages.wheels]] +name = "cloudpickle-3.1.1-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/7e/e8/64c37fadfc2816a7701fa8a6ed8d87327c7d54eacfbfb6edab14a2f2be75/cloudpickle-3.1.1-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "c8c5a44295039331ee9dad40ba100a9c7297b6f988e50e87ccdf3765a668350e" + +[[packages]] +name = "cohere" +version = "5.15.0" + +[[packages.wheels]] +name = "cohere-5.15.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/c7/87/94694db7fe6df979fbc03286eaabdfa98f1c8fa532960e5afdf965e10960/cohere-5.15.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "22ff867c2a6f2fc2b585360c6072f584f11f275ef6d9242bac24e0fa2df1dfb5" + +[[packages]] +name = "colorama" +version = "0.4.6" + +[[packages.wheels]] +name = "colorama-0.4.6-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6" + +[[packages]] +name = "colorcet" +version = "3.1.0" + +[[packages.wheels]] +name = "colorcet-3.1.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/c6/c6/9963d588cc3d75d766c819e0377a168ef83cf3316a92769971527a1ad1de/colorcet-3.1.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "2a7d59cc8d0f7938eeedd08aad3152b5319b4ba3bcb7a612398cc17a384cb296" + +[[packages]] +name = "colorlog" +version = "6.9.0" + +[[packages.wheels]] +name = "colorlog-6.9.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/e3/51/9b208e85196941db2f0654ad0357ca6388ab3ed67efdbfc799f35d1f83aa/colorlog-6.9.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "5906e71acd67cb07a71e779c47c4bcb45fb8c2993eebe9e5adcd6a6f1b283eff" + +[[packages]] +name = "comm" +version = "0.2.2" + +[[packages.wheels]] +name = "comm-0.2.2-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/e6/75/49e5bfe642f71f272236b5b2d2691cf915a7283cc0ceda56357b61daa538/comm-0.2.2-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "e6fb86cb70ff661ee8c9c14e7d36d6de3b4066f1441be4063df9c5009f0a64d3" + +[[packages]] +name = "contourpy" +version = "1.3.2" + +[[packages.wheels]] +name = "contourpy-1.3.2-cp312-cp312-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/01/c8/fadd0b92ffa7b5eb5949bf340a63a4a496a6930a6c37a7ba0f12acb076d6/contourpy-1.3.2-cp312-cp312-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "8c942a01d9163e2e5cfb05cb66110121b8d07ad438a17f9e766317bcb62abf73" + +[[packages]] +name = "cookiecutter" +version = "2.6.0" + +[[packages.wheels]] +name = "cookiecutter-2.6.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/b6/d9/0137658a353168ffa9d0fc14b812d3834772040858ddd1cb6eeaf09f7a44/cookiecutter-2.6.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "a54a8e37995e4ed963b3e82831072d1ad4b005af736bb17b99c2cbd9d41b6e2d" + +[[packages]] +name = "cryptography" +version = "44.0.0" + +[[packages.wheels]] +name = "cryptography-44.0.0-cp39-abi3-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/97/9b/443270b9210f13f6ef240eff73fd32e02d381e7103969dc66ce8e89ee901/cryptography-44.0.0-cp39-abi3-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "708ee5f1bafe76d041b53a4f95eb28cdeb8d18da17e597d46d7833ee59b97ede" + +[[packages]] +name = "cvxopt" +version = "1.3.2" + +[[packages.wheels]] +name = "cvxopt-1.3.2-cp312-cp312-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/9f/ad/edce467c24529c536fc9de787546a1c8eca293009383a872b6f638d22eae/cvxopt-1.3.2-cp312-cp312-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "a92ebfc5df77fea57544f8ad2102bfc45af0e77ac4dfe98ed1b9628e8bba77c3" + +[[packages]] +name = "cvxpy" +version = "1.6.4" + +[[packages.wheels]] +name = "cvxpy-1.6.4-cp312-cp312-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/4e/1d/2c4070e13763c627f40be341a6760818e1e3a62c497c02e8fa09f21585f0/cvxpy-1.6.4-cp312-cp312-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "052a09716cfb630a48e911e7c9512015ae651100f64530d8eb973a195e105fa3" + +[[packages]] +name = "cycler" +version = "0.12.1" + +[[packages.wheels]] +name = "cycler-0.12.1-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "85cef7cff222d8644161529808465972e51340599459b8ac3ccbac5a854e0d30" + +[[packages]] +name = "cython" +version = "3.1.1" + +[[packages.wheels]] +name = "cython-3.1.1-cp312-cp312-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/45/0e/e1370ed3216e4e164232d1891c2a2932a3874d1a8681f8c3565cafd98579/cython-3.1.1-cp312-cp312-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "307f216ed319ea07644f2ef9974406c830f01bc8e677e2147e9bfcdf9e3ca8ad" + +[[packages]] +name = "cytoolz" +version = "1.0.1" + +[[packages.wheels]] +name = "cytoolz-1.0.1-cp312-cp312-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/62/1a/f3903197956055032f8cb297342e2dff07e50f83991aebfe5b4c4fcb55e4/cytoolz-1.0.1-cp312-cp312-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "8f89c48d8e5aec55ffd566a8ec858706d70ed0c6a50228eca30986bfa5b4da8b" + +[[packages]] +name = "dask" +version = "2025.4.1" + +[[packages.wheels]] +name = "dask-2025.4.1-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/b4/12/f9effea5fe2bebfdd8b0d9c857f798382afacd57dc1cd0e9ce21e66c1bc2/dask-2025.4.1-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "aacbb0a9667856fe58385015efd64aca22f0c0b2c5e1b5e633531060303bb4be" + +[[packages]] +name = "datasette" +version = "0.65.1" + +[[packages.wheels]] +name = "datasette-0.65.1-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/08/f7/fc15b9ddc7a2cafe546f0e2696d71940d7604a128e2f903e98238c3435f7/datasette-0.65.1-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "ba7adf717ddcc24a2a8ac57890fffd384a2ebb909b342e4f731ba09eba764305" + +[[packages]] +name = "datasette-graphql" +version = "2.2" + +[[packages.wheels]] +name = "datasette_graphql-2.2-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/f1/12/e8fb59d77c59ec47a2aa53a6d4ac57ad55fce2b48c8397c2866c3f2c66cd/datasette_graphql-2.2-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "cd9f61afdcaab1ce4ff6775296e6ece99305bf05cbfae4c1c938a6c9e60cd485" + +[[packages]] +name = "datashader" +version = "0.17.0" + +[[packages.wheels]] +name = "datashader-0.17.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/dc/52/755bbab06c4d10f693abb724e82271ccf8adc98e9305a5c559867ee40c98/datashader-0.17.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "39421ff999294913e63d41954af955a5dece5d0c55d8fce1426043d70b22d07a" + +[[packages]] +name = "deap" +version = "1.4.2" + +[[packages.wheels]] +name = "deap-1.4.2-cp312-cp312-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/61/c0/f1a383cbb852e4d486e3213cd6d4292f4f789ec32631da15646d3eb13165/deap-1.4.2-cp312-cp312-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "02b8b664cfa0b6c18ff3e36d0b982fb66f38fb98c5b4292515a305527d57294e" + +[[packages]] +name = "debugpy" +version = "1.8.13" + +[[packages.wheels]] +name = "debugpy-1.8.13-cp312-cp312-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/c9/f7/0df18a4f530ed3cc06f0060f548efe9e3316102101e311739d906f5650be/debugpy-1.8.13-cp312-cp312-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "63ca7670563c320503fea26ac688988d9d6b9c6a12abc8a8cf2e7dd8e5f6b6ea" + +[[packages]] +name = "decorator" +version = "5.2.1" + +[[packages.wheels]] +name = "decorator-5.2.1-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/4e/8c/f3147f5c4b73e7550fe5f9352eaa956ae838d5c51eb58e7a25b9f3e2643b/decorator-5.2.1-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "d316bb415a2d9e2d2b3abcc4084c6502fc09240e292cd76a76afc106a1c8e04a" + +[[packages]] +name = "defusedxml" +version = "0.7.1" + +[[packages.wheels]] +name = "defusedxml-0.7.1-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/07/6c/aa3f2f849e01cb6a001cd8554a88d4c77c5c1a31c95bdf1cf9301e6d9ef4/defusedxml-0.7.1-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "a352e7e428770286cc899e2542b6cdaedb2b4953ff269a210103ec58f6198a61" + +[[packages]] +name = "deprecated" +version = "1.2.14" + +[[packages.wheels]] +name = "Deprecated-1.2.14-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/20/8d/778b7d51b981a96554f29136cd59ca7880bf58094338085bcf2a979a0e6a/Deprecated-1.2.14-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "6fac8b097794a90302bdbb17b9b815e732d3c4720583ff1b198499d78470466c" + +[[packages]] +name = "diff-match-patch" +version = "20241021" + +[[packages.wheels]] +name = "diff_match_patch-20241021-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/f7/bb/2aa9b46a01197398b901e458974c20ed107935c26e44e37ad5b0e5511e44/diff_match_patch-20241021-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "93cea333fb8b2bc0d181b0de5e16df50dd344ce64828226bda07728818936782" + +[[packages]] +name = "dill" +version = "0.4.0" + +[[packages.wheels]] +name = "dill-0.4.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/50/3d/9373ad9c56321fdab5b41197068e1d8c25883b3fea29dd361f9b55116869/dill-0.4.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "44f54bf6412c2c8464c14e8243eb163690a9800dbe2c367330883b19c7561049" + +[[packages]] +name = "distributed" +version = "2025.4.1" + +[[packages.wheels]] +name = "distributed-2025.4.1-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/df/33/b956f0dc74b292ea3d206a45467fde838f005b64123a729898a6390a291a/distributed-2025.4.1-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "3a7834451b04ef059928045eab6ff6d88ad7bcfd48adc99403127d9a6818b5fa" + +[[packages]] +name = "distro" +version = "1.9.0" + +[[packages.wheels]] +name = "distro-1.9.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/12/b3/231ffd4ab1fc9d679809f356cebee130ac7daa00d6d6f3206dd4fd137e9e/distro-1.9.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "7bffd925d65168f85027d8da9af6bddab658135b840670a223589bc0c8ef02b2" + +[[packages]] +name = "django" +version = "5.2" + +[[packages.wheels]] +name = "Django-5.2-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/63/e0/6a5b5ea350c5bd63fe94b05e4c146c18facb51229d9dee42aa39f9fc2214/Django-5.2-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "91ceed4e3a6db5aedced65e3c8f963118ea9ba753fc620831c77074e620e7d83" + +[[packages]] +name = "dnspython" +version = "2.7.0" + +[[packages.wheels]] +name = "dnspython-2.7.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/68/1b/e0a87d256e40e8c888847551b20a017a6b98139178505dc7ffb96f04e954/dnspython-2.7.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "b4c34b7d10b51bcc3a5071e7b8dee77939f1e878477eeecc965e9835f63c6c86" + +[[packages]] +name = "docstring-to-markdown" +version = "0.17" + +[[packages.wheels]] +name = "docstring_to_markdown-0.17-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/56/7b/af3d0da15bed3a8665419bb3a630585756920f4ad67abfdfef26240ebcc0/docstring_to_markdown-0.17-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "fd7d5094aa83943bf5f9e1a13701866b7c452eac19765380dead666e36d3711c" + +[[packages]] +name = "docutils" +version = "0.21.2" + +[[packages.wheels]] +name = "docutils-0.21.2-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/8f/d7/9322c609343d929e75e7e5e6255e614fcc67572cfd083959cdef3b7aad79/docutils-0.21.2-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "dafca5b9e384f0e419294eb4d2ff9fa826435bf15f15b7bd45723e8ad76811b2" + +[[packages]] +name = "duckdb" +version = "1.3.0" + +[[packages.wheels]] +name = "duckdb-1.3.0-cp312-cp312-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/36/4f/f7ab120ecd827fdff59f14e1de9771335aa7656a29c3259fa7949de1f276/duckdb-1.3.0-cp312-cp312-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "8754c40dac0f26d9fb0363bbb5df02f7a61ce6a6728d5efc02c3bc925d7c89c3" + +[[packages]] +name = "entrypoints" +version = "0.4" + +[[packages.wheels]] +name = "entrypoints-0.4-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/35/a8/365059bbcd4572cbc41de17fd5b682be5868b218c3c5479071865cab9078/entrypoints-0.4-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "f174b5ff827504fd3cd97cc3f8649f3693f51538c7e4bdf3ef002c8429d42f9f" + +[[packages]] +name = "et-xmlfile" +version = "1.1.0" + +[[packages.wheels]] +name = "et_xmlfile-1.1.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/96/c2/3dd434b0108730014f1b96fd286040dc3bcb70066346f7e01ec2ac95865f/et_xmlfile-1.1.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "a2ba85d1d6a74ef63837eed693bcb89c3f752169b0e3e7ae5b16ca5e1b3deada" + +[[packages]] +name = "eval-type-backport" +version = "0.2.2" + +[[packages.wheels]] +name = "eval_type_backport-0.2.2-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/ce/31/55cd413eaccd39125368be33c46de24a1f639f2e12349b0361b4678f3915/eval_type_backport-0.2.2-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "cb6ad7c393517f476f96d456d0412ea80f0a8cf96f6892834cd9340149111b0a" + +[[packages]] +name = "executing" +version = "2.2.0" + +[[packages.wheels]] +name = "executing-2.2.0-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/7b/8f/c4d9bafc34ad7ad5d8dc16dd1347ee0e507a52c3adb6bfa8887e1c6a26ba/executing-2.2.0-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "11387150cad388d62750327a53d3339fad4888b39a6fe233c3afbb54ecffd3aa" + +[[packages]] +name = "faker" +version = "37.1.0" + +[[packages.wheels]] +name = "faker-37.1.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/d7/a1/8936bc8e79af80ca38288dd93ed44ed1f9d63beb25447a4c59e746e01f8d/faker-37.1.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "dc2f730be71cb770e9c715b13374d80dbcee879675121ab51f9683d262ae9a1c" + +[[packages]] +name = "fasta2a" +version = "0.2.9" + +[[packages.wheels]] +name = "fasta2a-0.2.9-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/7a/df/dd967535662ecc9e101a7d6c0c643a055aabc3de47411c31c1dd624356c8/fasta2a-0.2.9-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "8b855b36f29fde6dcb79ad55be337a8165381b679bec829913009c55581e284e" + +[[packages]] +name = "fastapi" +version = "0.115.12" + +[[packages.wheels]] +name = "fastapi-0.115.12-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/50/b3/b51f09c2ba432a576fe63758bddc81f78f0c6309d9e5c10d194313bf021e/fastapi-0.115.12-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "e94613d6c05e27be7ffebdd6ea5f388112e5e430c8f7d6494a9d1d88d43e814d" + +[[packages]] +name = "fastavro" +version = "1.10.0" + +[[packages.wheels]] +name = "fastavro-1.10.0-cp312-cp312-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/0c/ce/cfd16546c04ebbca1be80873b533c788cec76f7bfac231bfac6786047572/fastavro-1.10.0-cp312-cp312-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "567ff515f2a5d26d9674b31c95477f3e6022ec206124c62169bc2ffaf0889089" + +[[packages]] +name = "fastjsonschema" +version = "2.21.1" + +[[packages.wheels]] +name = "fastjsonschema-2.21.1-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/90/2b/0817a2b257fe88725c25589d89aec060581aabf668707a8d03b2e9e0cb2a/fastjsonschema-2.21.1-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "c9e5b7e908310918cf494a434eeb31384dd84a98b57a30bcb1f535015b554667" + +[[packages]] +name = "filelock" +version = "3.18.0" + +[[packages.wheels]] +name = "filelock-3.18.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/4d/36/2a115987e2d8c300a974597416d9de88f2444426de9571f4b59b2cca3acc/filelock-3.18.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "c401f4f8377c4464e6db25fff06205fd89bdd83b65eb0488ed1b160f780e21de" + +[[packages]] +name = "flake8" +version = "7.1.1" + +[[packages.wheels]] +name = "flake8-7.1.1-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/d9/42/65004373ac4617464f35ed15931b30d764f53cdd30cc78d5aea349c8c050/flake8-7.1.1-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "597477df7860daa5aa0fdd84bf5208a043ab96b8e96ab708770ae0364dd03213" + +[[packages]] +name = "flask" +version = "3.1.0" + +[[packages.wheels]] +name = "flask-3.1.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/af/47/93213ee66ef8fae3b93b3e29206f6b251e65c97bd91d8e1c5596ef15af0a/flask-3.1.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "d667207822eb83f1c4b50949b1623c8fc8d51f2341d65f72e1a1815397551136" + +[[packages]] +name = "flexcache" +version = "0.3" + +[[packages.wheels]] +name = "flexcache-0.3-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/27/cd/c883e1a7c447479d6e13985565080e3fea88ab5a107c21684c813dba1875/flexcache-0.3-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "d43c9fea82336af6e0115e308d9d33a185390b8346a017564611f1466dcd2e32" + +[[packages]] +name = "flexparser" +version = "0.4" + +[[packages.wheels]] +name = "flexparser-0.4-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/fe/5e/3be305568fe5f34448807976dc82fc151d76c3e0e03958f34770286278c1/flexparser-0.4-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "3738b456192dcb3e15620f324c447721023c0293f6af9955b481e91d00179846" + +[[packages]] +name = "flit" +version = "3.12.0" + +[[packages.wheels]] +name = "flit-3.12.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/f5/82/ce1d3bb380b227e26e517655d1de7b32a72aad61fa21ff9bd91a2e2db6ee/flit-3.12.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "2b4e7171dc22881fa6adc2dbf083e5ecc72520be3cd7587d2a803da94d6ef431" + +[[packages]] +name = "flit-core" +version = "3.12.0" + +[[packages.wheels]] +name = "flit_core-3.12.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/f2/65/b6ba90634c984a4fcc02c7e3afe523fef500c4980fec67cc27536ee50acf/flit_core-3.12.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "e7a0304069ea895172e3c7bb703292e992c5d1555dd1233ab7b5621b5b69e62c" + +[[packages]] +name = "folium" +version = "0.19.5" + +[[packages.wheels]] +name = "folium-0.19.5-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/81/4d/bcbee0676dc06f0b014a030cb928e158c96daafb872a01ddee7e60a8c998/folium-0.19.5-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "4333fb3e6f3e9eedb231615d22c6d7df20aea5829554bd6908675865a37803b3" + +[[packages]] +name = "fonttools" +version = "4.57.0" + +[[packages.wheels]] +name = "fonttools-4.57.0-cp312-cp312-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/06/5d/1be5424bb305880e1113631f49a55ea7c7da3a5fe02608ca7c16a03a21da/fonttools-4.57.0-cp312-cp312-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "57e30241524879ea10cdf79c737037221f77cc126a8cdc8ff2c94d4a522504b9" + +[[packages]] +name = "fqdn" +version = "1.5.1" + +[[packages.wheels]] +name = "fqdn-1.5.1-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/cf/58/8acf1b3e91c58313ce5cb67df61001fc9dcd21be4fadb76c1a2d540e09ed/fqdn-1.5.1-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "3a179af3761e4df6eb2e026ff9e1a3033d3587bf980a0b1b2e1e5d08d7358014" + +[[packages]] +name = "frozenlist" +version = "1.5.0" + +[[packages.wheels]] +name = "frozenlist-1.5.0-cp312-cp312-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/b1/56/4e45136ffc6bdbfa68c29ca56ef53783ef4c2fd395f7cbf99a2624aa9aaa/frozenlist-1.5.0-cp312-cp312-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "8969190d709e7c48ea386db202d708eb94bdb29207a1f269bab1196ce0dcca1f" + +[[packages]] +name = "fsspec" +version = "2025.3.2" + +[[packages.wheels]] +name = "fsspec-2025.3.2-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/44/4b/e0cfc1a6f17e990f3e64b7d941ddc4acdc7b19d6edd51abf495f32b1a9e4/fsspec-2025.3.2-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "2daf8dc3d1dfa65b6aa37748d112773a7a08416f6c70d96b264c96476ecaf711" + +[[packages]] +name = "fuzzywuzzy" +version = "0.18.0" + +[[packages.wheels]] +name = "fuzzywuzzy-0.18.0-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/43/ff/74f23998ad2f93b945c0309f825be92e04e0348e062026998b5eefef4c33/fuzzywuzzy-0.18.0-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "928244b28db720d1e0ee7587acf660ea49d7e4c632569cad4f1cd7e68a5f0993" + +[[packages]] +name = "geographiclib" +version = "2.0" + +[[packages.wheels]] +name = "geographiclib-2.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/9f/5a/a26132406f1f40cf51ea349a5f11b0a46cec02a2031ff82e391c2537247a/geographiclib-2.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "6b7225248e45ff7edcee32becc4e0a1504c606ac5ee163a5656d482e0cd38734" + +[[packages]] +name = "geopandas" +version = "1.0.1" + +[[packages.wheels]] +name = "geopandas-1.0.1-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/c4/64/7d344cfcef5efddf9cf32f59af7f855828e9d74b5f862eddf5bfd9f25323/geopandas-1.0.1-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "01e147d9420cc374d26f51fc23716ac307f32b49406e4bd8462c07e82ed1d3d6" + +[[packages]] +name = "geopy" +version = "2.4.1" + +[[packages.wheels]] +name = "geopy-2.4.1-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/e5/15/cf2a69ade4b194aa524ac75112d5caac37414b20a3a03e6865dfe0bd1539/geopy-2.4.1-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "ae8b4bc5c1131820f4d75fce9d4aaaca0c85189b3aa5d64c3dcaf5e3b7b882a7" + +[[packages]] +name = "gitdb" +version = "4.0.12" + +[[packages.wheels]] +name = "gitdb-4.0.12-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/a0/61/5c78b91c3143ed5c14207f463aecfc8f9dbb5092fb2869baf37c273b2705/gitdb-4.0.12-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "67073e15955400952c6565cc3e707c554a4eea2e428946f7a4c162fab9bd9bcf" + +[[packages]] +name = "gitpython" +version = "3.1.44" + +[[packages.wheels]] +name = "GitPython-3.1.44-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/1d/9a/4114a9057db2f1462d5c8f8390ab7383925fe1ac012eaa42402ad65c2963/GitPython-3.1.44-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "9e0e10cda9bed1ee64bc9a6de50e7e38a9c9943241cd7f585f6df3ed28011110" + +[[packages]] +name = "google-auth" +version = "2.38.0" + +[[packages.wheels]] +name = "google_auth-2.38.0-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/9d/47/603554949a37bca5b7f894d51896a9c534b9eab808e2520a748e081669d0/google_auth-2.38.0-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "e7dae6694313f434a2727bf2906f27ad259bae090d7aa896590d86feec3d9d4a" + +[[packages]] +name = "google-genai" +version = "1.16.1" + +[[packages.wheels]] +name = "google_genai-1.16.1-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/bc/31/30caa8d4ae987e47c5250fb6680588733863fd5b39cacb03ba1977c29bde/google_genai-1.16.1-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "6ae5d24282244f577ca4f0d95c09f75ab29e556602c9d3531b70161e34cd2a39" + +[[packages]] +name = "graphene" +version = "3.4.3" + +[[packages.wheels]] +name = "graphene-3.4.3-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/66/e0/61d8e98007182e6b2aca7cf65904721fb2e4bce0192272ab9cb6f69d8812/graphene-3.4.3-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "820db6289754c181007a150db1f7fff544b94142b556d12e3ebc777a7bf36c71" + +[[packages]] +name = "graphql-core" +version = "3.2.6" + +[[packages.wheels]] +name = "graphql_core-3.2.6-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/ae/4f/7297663840621022bc73c22d7d9d80dbc78b4db6297f764b545cd5dd462d/graphql_core-3.2.6-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "78b016718c161a6fb20a7d97bbf107f331cd1afe53e45566c59f776ed7f0b45f" + +[[packages]] +name = "graphql-relay" +version = "3.2.0" + +[[packages.wheels]] +name = "graphql_relay-3.2.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/74/16/a4cf06adbc711bd364a73ce043b0b08d8fa5aae3df11b6ee4248bcdad2e0/graphql_relay-3.2.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "c9b22bd28b170ba1fe674c74384a8ff30a76c8e26f88ac3aa1584dd3179953e5" + +[[packages]] +name = "greenlet" +version = "3.1.1" + +[[packages.wheels]] +name = "greenlet-3.1.1-cp312-cp312-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/43/21/a5d9df1d21514883333fc86584c07c2b49ba7c602e670b174bd73cfc9c7f/greenlet-3.1.1-cp312-cp312-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "7124e16b4c55d417577c2077be379514321916d5790fa287c9ed6f23bd2ffd01" + +[[packages]] +name = "griffe" +version = "1.7.2" + +[[packages.wheels]] +name = "griffe-1.7.2-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/b1/5e/38b408f41064c9fcdbb0ea27c1bd13a1c8657c4846e04dab9f5ea770602c/griffe-1.7.2-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "1ed9c2e338a75741fc82083fe5a1bc89cb6142efe126194cc313e34ee6af5423" + +[[packages]] +name = "groq" +version = "0.25.0" + +[[packages.wheels]] +name = "groq-0.25.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/4d/11/1019a6cfdb2e520cb461cf70d859216be8ca122ddf5ad301fc3b0ee45fd4/groq-0.25.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "aadc78b40b1809cdb196b1aa8c7f7293108767df1508cafa3e0d5045d9328e7a" + +[[packages]] +name = "guidata" +version = "3.9.0" + +[[packages.wheels]] +name = "guidata-3.9.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/5b/03/44afe4b4d634ea77ea7979be78bba4256607f92a6570241925e5b129966d/guidata-3.9.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "96a19dc92850bdb3e463fa06e8c22793e090db42d1e72c6dae9bda1a98b61210" + +[[packages]] +name = "h11" +version = "0.14.0" + +[[packages.wheels]] +name = "h11-0.14.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/95/04/ff642e65ad6b90db43e668d70ffb6736436c7ce41fcc549f4e9472234127/h11-0.14.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761" + +[[packages]] +name = "h2" +version = "4.2.0" + +[[packages.wheels]] +name = "h2-4.2.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/d0/9e/984486f2d0a0bd2b024bf4bc1c62688fcafa9e61991f041fb0e2def4a982/h2-4.2.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "479a53ad425bb29af087f3458a61d30780bc818e4ebcf01f0b536ba916462ed0" + +[[packages]] +name = "h5py" +version = "3.12.1" + +[[packages.wheels]] +name = "h5py-3.12.1-cp312-cp312-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/86/f7/bb465dcb92ca3521a15cbe1031f6d18234dbf1fb52a6796a00bfaa846ebf/h5py-3.12.1-cp312-cp312-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "e4d51919110a030913201422fb07987db4338eba5ec8c5a15d6fab8e03d443fc" + +[[packages]] +name = "hatchling" +version = "1.27.0" + +[[packages.wheels]] +name = "hatchling-1.27.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/08/e7/ae38d7a6dfba0533684e0b2136817d667588ae3ec984c1a4e5df5eb88482/hatchling-1.27.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "d3a2f3567c4f926ea39849cdf924c7e99e6686c9c8e288ae1037c8fa2a5d937b" + +[[packages]] +name = "holoviews" +version = "1.20.2" + +[[packages.wheels]] +name = "holoviews-1.20.2-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/df/67/066a1d984fa259ad7300084a70789579e104afd75fc58a1d44cda9c365d5/holoviews-1.20.2-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "1f892c04bc23e8a3a9cde082b606b9463c9ff78c3d0c00e2ddcc41fe6e738458" + +[[packages]] +name = "hpack" +version = "4.1.0" + +[[packages.wheels]] +name = "hpack-4.1.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/07/c6/80c95b1b2b94682a72cbdbfb85b81ae2daffa4291fbfa1b1464502ede10d/hpack-4.1.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "157ac792668d995c657d93111f46b4535ed114f0c9c8d672271bbec7eae1b496" + +[[packages]] +name = "html5lib" +version = "1.1" + +[[packages.wheels]] +name = "html5lib-1.1-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/6c/dd/a834df6482147d48e225a49515aabc28974ad5a4ca3215c18a882565b028/html5lib-1.1-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "0d78f8fde1c230e99fe37986a60526d7049ed4bf8a9fadbad5f00e22e58e041d" + +[[packages]] +name = "httpcore" +version = "1.0.7" + +[[packages.wheels]] +name = "httpcore-1.0.7-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/87/f5/72347bc88306acb359581ac4d52f23c0ef445b57157adedb9aee0cd689d2/httpcore-1.0.7-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "a3fff8f43dc260d5bd363d9f9cf1830fa3a458b332856f34282de498ed420edd" + +[[packages]] +name = "httpie" +version = "3.2.4" + +[[packages.wheels]] +name = "httpie-3.2.4-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/03/b6/39bcf01e1185882f34bc9fb77d1fb4a27911a55f60ab407de34abc8a2347/httpie-3.2.4-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "4bd0435cc4b9bca59501bc65089de96f3e93b393803f32a81951db62050ebf0b" + +[[packages]] +name = "httpx" +version = "0.28.1" + +[[packages.wheels]] +name = "httpx-0.28.1-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/2a/39/e50c7c3a983047577ee07d2a9e53faf5a69493943ec3f6a384bdc792deb2/httpx-0.28.1-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "d909fcccc110f8c7faf814ca82a9a4d816bc5a6dbfea25d6591d6985b8ba59ad" + +[[packages]] +name = "httpx-sse" +version = "0.4.0" + +[[packages.wheels]] +name = "httpx_sse-0.4.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/e1/9b/a181f281f65d776426002f330c31849b86b31fc9d848db62e16f03ff739f/httpx_sse-0.4.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "f329af6eae57eaa2bdfd962b42524764af68075ea87370a2de920af5341e318f" + +[[packages]] +name = "huggingface-hub" +version = "0.33.0" + +[[packages.wheels]] +name = "huggingface_hub-0.33.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/33/fb/53587a89fbc00799e4179796f51b3ad713c5de6bb680b2becb6d37c94649/huggingface_hub-0.33.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "e8668875b40c68f9929150d99727d39e5ebb8a05a98e4191b908dc7ded9074b3" + +[[packages]] +name = "hupper" +version = "1.12.1" + +[[packages.wheels]] +name = "hupper-1.12.1-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/86/7d/3888833e4f5ea56af4a9935066ec09a83228e533d7b8877f65889d706ee4/hupper-1.12.1-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "e872b959f09d90be5fb615bd2e62de89a0b57efc037bdf9637fb09cdf8552b19" + +[[packages]] +name = "hvplot" +version = "0.11.2" + +[[packages.wheels]] +name = "hvplot-0.11.2-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/ed/d9/466e22e60dd6b1eb09680d7155c47b58da17eda51bbaf4aad8392a45fe12/hvplot-0.11.2-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "9d576a0c2df0f1cf5041545f2a2eddcf962510162876991cae4d1779fad74556" + +[[packages]] +name = "hypercorn" +version = "0.17.3" + +[[packages.wheels]] +name = "hypercorn-0.17.3-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/0e/3b/dfa13a8d96aa24e40ea74a975a9906cfdc2ab2f4e3b498862a57052f04eb/hypercorn-0.17.3-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "059215dec34537f9d40a69258d323f56344805efb462959e727152b0aa504547" + +[[packages]] +name = "hyperframe" +version = "6.1.0" + +[[packages.wheels]] +name = "hyperframe-6.1.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/48/30/47d0bf6072f7252e6521f3447ccfa40b421b6824517f82854703d0f5a98b/hyperframe-6.1.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "b03380493a519fce58ea5af42e4a42317bf9bd425596f7a0835ffce80f1a42e5" + +[[packages]] +name = "hypothesis" +version = "6.130.4" + +[[packages.wheels]] +name = "hypothesis-6.130.4-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/5c/d4/5a0c46cc8d266626cdc8082f07f836fa4a96e8715002de69be46ed406d1d/hypothesis-6.130.4-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "cda4a57115d10ecbefe0a9cc8d69d20a13eb56ecbfe7c24eaee5d368c2b7c477" + +[[packages]] +name = "id" +version = "1.5.0" + +[[packages.wheels]] +name = "id-1.5.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/9f/cb/18326d2d89ad3b0dd143da971e77afd1e6ca6674f1b1c3df4b6bec6279fc/id-1.5.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "f1434e1cef91f2cbb8a4ec64663d5a23b9ed43ef44c4c957d02583d61714c658" + +[[packages]] +name = "idna" +version = "3.10" + +[[packages.wheels]] +name = "idna-3.10-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/76/c6/c88e154df9c4e1a2a66ccf0005a88dfb2650c1dffb6f5ce603dfbd452ce3/idna-3.10-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3" + +[[packages]] +name = "imageio" +version = "2.37.0" + +[[packages.wheels]] +name = "imageio-2.37.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/cb/bd/b394387b598ed84d8d0fa90611a90bee0adc2021820ad5729f7ced74a8e2/imageio-2.37.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "11efa15b87bc7871b61590326b2d635439acc321cf7f8ce996f812543ce10eed" + +[[packages]] +name = "imagesize" +version = "1.4.1" + +[[packages.wheels]] +name = "imagesize-1.4.1-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/ff/62/85c4c919272577931d407be5ba5d71c20f0b616d31a0befe0ae45bb79abd/imagesize-1.4.1-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "0d8d18d08f840c19d0ee7ca1fd82490fdc3729b7ac93f49870406ddde8ef8d8b" + +[[packages]] +name = "imbalanced-learn" +version = "0.13.0" + +[[packages.wheels]] +name = "imbalanced_learn-0.13.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/9d/41/721fec82606242a2072ee909086ff918dfad7d0199a9dfd4928df9c72494/imbalanced_learn-0.13.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "7eb5859f7827cb3babfa5789978c22fe36e56527d9c9768df2d864d98d9b40fe" + +[[packages]] +name = "importlib-metadata" +version = "8.6.1" + +[[packages.wheels]] +name = "importlib_metadata-8.6.1-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/79/9d/0fb148dc4d6fa4a7dd1d8378168d9b4cd8d4560a6fbf6f0121c5fc34eb68/importlib_metadata-8.6.1-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "02a89390c1e15fdfdc0d7c6b25cb3e62650d0494005c97d6f148bf5b9787525e" + +[[packages]] +name = "inflection" +version = "0.5.1" + +[[packages.wheels]] +name = "inflection-0.5.1-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/59/91/aa6bde563e0085a02a435aa99b49ef75b0a4b062635e606dab23ce18d720/inflection-0.5.1-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "f38b2b640938a4f35ade69ac3d053042959b62a0f1076a5bbaa1b9526605a8a2" + +[[packages]] +name = "iniconfig" +version = "2.1.0" + +[[packages.wheels]] +name = "iniconfig-2.1.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/2c/e1/e6716421ea10d38022b952c159d5161ca1193197fb744506875fbb87ea7b/iniconfig-2.1.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "9deba5723312380e77435581c6bf4935c94cbfab9b1ed33ef8d238ea168eb760" + +[[packages]] +name = "intervaltree" +version = "3.1.0" + +[packages.sdist] +name = "intervaltree-3.1.0.tar.gz" +url = "https://files.pythonhosted.org/packages/50/fb/396d568039d21344639db96d940d40eb62befe704ef849b27949ded5c3bb/intervaltree-3.1.0.tar.gz" + +[packages.sdist.hashes] +sha256 = "902b1b88936918f9b2a19e0e5eb7ccb430ae45cde4f39ea4b36932920d33952d" + +[[packages]] +name = "ipycanvas" +version = "0.13.3" + +[[packages.wheels]] +name = "ipycanvas-0.13.3-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/e2/fc/e3867e413adbfede3a9c372ec015416ccb0a6493659db5812eeec447a73b/ipycanvas-0.13.3-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "d37adb2f45d2fef1c3d33c69a0518055694d87827b2f577f3c426d7712f75daa" + +[[packages]] +name = "ipykernel" +version = "6.29.5" + +[[packages.wheels]] +name = "ipykernel-6.29.5-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/94/5c/368ae6c01c7628438358e6d337c19b05425727fbb221d2a3c4303c372f42/ipykernel-6.29.5-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "afdb66ba5aa354b09b91379bac28ae4afebbb30e8b39510c9690afb7a10421b5" + +[[packages]] +name = "ipyleaflet" +version = "0.19.2" + +[[packages.wheels]] +name = "ipyleaflet-0.19.2-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/56/6f/00d60e93a316a178ae04457ceea5bcbb4e2d7e7e469882ac59ec4cccfb8c/ipyleaflet-0.19.2-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "7cc9157848baca2e1793b96e79f8bdb1aa7340521d2b7d8a62aa8bc30eab5278" + +[[packages]] +name = "ipympl" +version = "0.9.7" + +[[packages.wheels]] +name = "ipympl-0.9.7-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/86/6b/21c62f1b2b5e18c6553f7364487dfdf7eb7952b1000a1b7863c1f97819e9/ipympl-0.9.7-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "3698ee7eaa0b047a7603517d7aa1b71b32118a5f51754cab45ec5d994f67208f" + +[[packages]] +name = "ipython" +version = "8.36.0" + +[[packages.wheels]] +name = "ipython-8.36.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/d6/d7/c1c9f371790b3a181e343c4815a361e5a0cc7d90ef6642d64ba5d05de289/ipython-8.36.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "12b913914d010dcffa2711505ec8be4bf0180742d97f1e5175e51f22086428c1" + +[[packages]] +name = "ipython-genutils" +version = "0.2.0" + +[[packages.wheels]] +name = "ipython_genutils-0.2.0-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/fa/bc/9bd3b5c2b4774d5f33b2d544f1460be9df7df2fe42f352135381c347c69a/ipython_genutils-0.2.0-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "72dd37233799e619666c9f639a9da83c34013a73e8bbc79a7a6348d93c61fab8" + +[[packages]] +name = "ipython-sql" +version = "0.5.0" + +[[packages.wheels]] +name = "ipython_sql-0.5.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/30/8f/9e50fa53ffc371483f9d1b90c1175b706d28a2e978e90a8894035af01905/ipython_sql-0.5.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "61b46ecffb956f62dbc17b5744cf70c649104c8db9afd821aa39b31f7cbb5d5b" + +[[packages]] +name = "ipywidgets" +version = "8.1.6" + +[[packages.wheels]] +name = "ipywidgets-8.1.6-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/53/b8/62952729573d983d9433faacf62a52ee2e8cf46504418061ad1739967abe/ipywidgets-8.1.6-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "446e7630a1d025bdc7635e1169fcc06f2ce33b5bd41c2003edeb4a47c8d4bbb1" + +[[packages]] +name = "isoduration" +version = "20.11.0" + +[[packages.wheels]] +name = "isoduration-20.11.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/7b/55/e5326141505c5d5e34c5e0935d2908a74e4561eca44108fbfb9c13d2911a/isoduration-20.11.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "b2904c2a4228c3d44f409c8ae8e2370eb21a26f7ac2ec5446df141dde3452042" + +[[packages]] +name = "isort" +version = "5.13.2" + +[[packages.wheels]] +name = "isort-5.13.2-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/d1/b3/8def84f539e7d2289a02f0524b944b15d7c75dab7628bedf1c4f0992029c/isort-5.13.2-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "8ca5e72a8d85860d5a3fa69b8745237f2939afe12dbf656afbcb47fe72d947a6" + +[[packages]] +name = "itsdangerous" +version = "2.2.0" + +[[packages.wheels]] +name = "itsdangerous-2.2.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/04/96/92447566d16df59b2a776c0fb82dbc4d9e07cd95062562af01e408583fc4/itsdangerous-2.2.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "c6242fc49e35958c8b15141343aa660db5fc54d4f13a1db01a3f5891b98700ef" + +[[packages]] +name = "janus" +version = "2.0.0" + +[[packages.wheels]] +name = "janus-2.0.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/68/34/65604740edcb20e1bda6a890348ed7d282e7dd23aa00401cbe36fd0edbd9/janus-2.0.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "7e6449d34eab04cd016befbd7d8c0d8acaaaab67cb59e076a69149f9031745f9" + +[[packages]] +name = "jaraco-classes" +version = "3.4.0" + +[[packages.wheels]] +name = "jaraco.classes-3.4.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/7f/66/b15ce62552d84bbfcec9a4873ab79d993a1dd4edb922cbfccae192bd5b5f/jaraco.classes-3.4.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "f662826b6bed8cace05e7ff873ce0f9283b5c924470fe664fff1c2f00f581790" + +[[packages]] +name = "jaraco-context" +version = "6.0.1" + +[[packages.wheels]] +name = "jaraco.context-6.0.1-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/ff/db/0c52c4cf5e4bd9f5d7135ec7669a3a767af21b3a308e1ed3674881e52b62/jaraco.context-6.0.1-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "f797fc481b490edb305122c9181830a3a5b76d84ef6d1aef2fb9b47ab956f9e4" + +[[packages]] +name = "jaraco-functools" +version = "4.1.0" + +[[packages.wheels]] +name = "jaraco.functools-4.1.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/9f/4f/24b319316142c44283d7540e76c7b5a6dbd5db623abd86bb7b3491c21018/jaraco.functools-4.1.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "ad159f13428bc4acbf5541ad6dec511f91573b90fba04df61dafa2a1231cf649" + +[[packages]] +name = "jedi" +version = "0.19.2" + +[[packages.wheels]] +name = "jedi-0.19.2-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/c0/5a/9cac0c82afec3d09ccd97c8b6502d48f165f9124db81b4bcb90b4af974ee/jedi-0.19.2-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "a8ef22bde8490f57fe5c7681a3c83cb58874daf72b4784de3cce5b6ef6edb5b9" + +[[packages]] +name = "jellyfish" +version = "1.1.3" + +[[packages.wheels]] +name = "jellyfish-1.1.3-cp312-cp312-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/ce/3c/5f007820356627332a6cf957ec1233a4845cb9ce9e9026fd62bbd037ceb0/jellyfish-1.1.3-cp312-cp312-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "c8c70b1cc92ee15031db16db0d2ca7d5841744f5f626a35c29c3dd7b4ea7002b" + +[[packages]] +name = "jinja2" +version = "3.1.6" + +[[packages.wheels]] +name = "jinja2-3.1.6-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67" + +[[packages]] +name = "jiter" +version = "0.9.0" + +[[packages.wheels]] +name = "jiter-0.9.0-cp312-cp312-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/cd/9d/742b289016d155f49028fe1bfbeb935c9bf0ffeefdf77daf4a63a42bb72b/jiter-0.9.0-cp312-cp312-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "099500d07b43f61d8bd780466d429c45a7b25411b334c60ca875fa775f68ccb0" + +[[packages]] +name = "joblib" +version = "1.4.2" + +[[packages.wheels]] +name = "joblib-1.4.2-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/91/29/df4b9b42f2be0b623cbd5e2140cafcaa2bef0759a00b7b70104dcfe2fb51/joblib-1.4.2-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "06d478d5674cbc267e7496a410ee875abd68e4340feff4490bcb7afb88060ae6" + +[[packages]] +name = "json5" +version = "0.10.0" + +[[packages.wheels]] +name = "json5-0.10.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/aa/42/797895b952b682c3dafe23b1834507ee7f02f4d6299b65aaa61425763278/json5-0.10.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "19b23410220a7271e8377f81ba8aacba2fdd56947fbb137ee5977cbe1f5e8dfa" + +[[packages]] +name = "jsonpatch" +version = "1.33" + +[[packages.wheels]] +name = "jsonpatch-1.33-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/73/07/02e16ed01e04a374e644b575638ec7987ae846d25ad97bcc9945a3ee4b0e/jsonpatch-1.33-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "0ae28c0cd062bbd8b8ecc26d7d164fbbea9652a1a3693f3b956c1eae5145dade" + +[[packages]] +name = "jsonpointer" +version = "3.0.0" + +[[packages.wheels]] +name = "jsonpointer-3.0.0-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/71/92/5e77f98553e9e75130c78900d000368476aed74276eb8ae8796f65f00918/jsonpointer-3.0.0-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "13e088adc14fca8b6aa8177c044e12701e6ad4b28ff10e65f2267a90109c9942" + +[[packages]] +name = "jsonschema" +version = "4.23.0" + +[[packages.wheels]] +name = "jsonschema-4.23.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/69/4a/4f9dbeb84e8850557c02365a0eee0649abe5eb1d84af92a25731c6c0f922/jsonschema-4.23.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "fbadb6f8b144a8f8cf9f0b89ba94501d143e50411a1278633f56a7acf7fd5566" + +[[packages]] +name = "jsonschema-specifications" +version = "2024.10.1" + +[[packages.wheels]] +name = "jsonschema_specifications-2024.10.1-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/d1/0f/8910b19ac0670a0f80ce1008e5e751c4a57e14d2c4c13a482aa6079fa9d6/jsonschema_specifications-2024.10.1-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "a09a0680616357d9a0ecf05c12ad234479f549239d0f5b55f3deea67475da9bf" + +[[packages]] +name = "julia" +version = "0.6.2" + +[[packages.wheels]] +name = "julia-0.6.2-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/82/af/2e9a1a996f32b34249582392bb419cf8983b627a1d31412acbe9d6dea5b0/julia-0.6.2-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "90752f71376fdb9919439d20496c2dab24486dfa4fe8a831d6dd14a1bcbc04d1" + +[[packages]] +name = "jupyter" +version = "1.1.1" + +[[packages.wheels]] +name = "jupyter-1.1.1-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/38/64/285f20a31679bf547b75602702f7800e74dbabae36ef324f716c02804753/jupyter-1.1.1-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "7a59533c22af65439b24bbe60373a4e95af8f16ac65a6c00820ad378e3f7cc83" + +[[packages]] +name = "jupyter-bokeh" +version = "4.0.5" + +[[packages.wheels]] +name = "jupyter_bokeh-4.0.5-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/47/78/33b2294aad62e5f95b89a89379c5995c2bd978018387ef8bec79f6dc272c/jupyter_bokeh-4.0.5-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "1110076c14c779071cf492646a1a871aefa8a477261e4721327a666e65df1a2c" + +[[packages]] +name = "jupyter-client" +version = "8.6.3" + +[[packages.wheels]] +name = "jupyter_client-8.6.3-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/11/85/b0394e0b6fcccd2c1eeefc230978a6f8cb0c5df1e4cd3e7625735a0d7d1e/jupyter_client-8.6.3-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "e8a19cc986cc45905ac3362915f410f3af85424b4c0905e94fa5f2cb08e8f23f" + +[[packages]] +name = "jupyter-console" +version = "6.6.3" + +[[packages.wheels]] +name = "jupyter_console-6.6.3-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/ca/77/71d78d58f15c22db16328a476426f7ac4a60d3a5a7ba3b9627ee2f7903d4/jupyter_console-6.6.3-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "309d33409fcc92ffdad25f0bcdf9a4a9daa61b6f341177570fdac03de5352485" + +[[packages]] +name = "jupyter-core" +version = "5.7.2" + +[[packages.wheels]] +name = "jupyter_core-5.7.2-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/c9/fb/108ecd1fe961941959ad0ee4e12ee7b8b1477247f30b1fdfd83ceaf017f0/jupyter_core-5.7.2-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "4f7315d2f6b4bcf2e3e7cb6e46772eba760ae459cd1f59d29eb57b0a01bd7409" + +[[packages]] +name = "jupyter-events" +version = "0.12.0" + +[[packages.wheels]] +name = "jupyter_events-0.12.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/e2/48/577993f1f99c552f18a0428731a755e06171f9902fa118c379eb7c04ea22/jupyter_events-0.12.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "6464b2fa5ad10451c3d35fabc75eab39556ae1e2853ad0c0cc31b656731a97fb" + +[[packages]] +name = "jupyter-leaflet" +version = "0.19.2" + +[[packages.wheels]] +name = "jupyter_leaflet-0.19.2-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/81/7c/3ade59500a358b9018a996d00c26eaede79f76ed362b7051bc5038d4a0d4/jupyter_leaflet-0.19.2-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "0d57e15e80c08a4360f0cde0b4c490beddc5d422bb0e9bc1c0b4479d3fb725a6" + +[[packages]] +name = "jupyter-lsp" +version = "2.2.5" + +[[packages.wheels]] +name = "jupyter_lsp-2.2.5-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/07/e0/7bd7cff65594fd9936e2f9385701e44574fc7d721331ff676ce440b14100/jupyter_lsp-2.2.5-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "45fbddbd505f3fbfb0b6cb2f1bc5e15e83ab7c79cd6e89416b248cb3c00c11da" + +[[packages]] +name = "jupyter-server" +version = "2.15.0" + +[[packages.wheels]] +name = "jupyter_server-2.15.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/e2/a2/89eeaf0bb954a123a909859fa507fa86f96eb61b62dc30667b60dbd5fdaf/jupyter_server-2.15.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "872d989becf83517012ee669f09604aa4a28097c0bd90b2f424310156c2cdae3" + +[[packages]] +name = "jupyter-server-terminals" +version = "0.5.3" + +[[packages.wheels]] +name = "jupyter_server_terminals-0.5.3-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/07/2d/2b32cdbe8d2a602f697a649798554e4f072115438e92249624e532e8aca6/jupyter_server_terminals-0.5.3-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "41ee0d7dc0ebf2809c668e0fc726dfaf258fcd3e769568996ca731b6194ae9aa" + +[[packages]] +name = "jupyterlab" +version = "4.4.2" + +[[packages.wheels]] +name = "jupyterlab-4.4.2-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/f6/ae/fbb93f4990b7648849b19112d8b3e7427bbfc9c5cc8fdc6bf14c0e86d104/jupyterlab-4.4.2-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "857111a50bed68542bf55dca784522fe728f9f88b4fe69e8c585db5c50900419" + +[[packages]] +name = "jupyterlab-pygments" +version = "0.3.0" + +[[packages.wheels]] +name = "jupyterlab_pygments-0.3.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/b1/dd/ead9d8ea85bf202d90cc513b533f9c363121c7792674f78e0d8a854b63b4/jupyterlab_pygments-0.3.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "841a89020971da1d8693f1a99997aefc5dc424bb1b251fd6322462a1b8842780" + +[[packages]] +name = "jupyterlab-server" +version = "2.27.3" + +[[packages.wheels]] +name = "jupyterlab_server-2.27.3-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/54/09/2032e7d15c544a0e3cd831c51d77a8ca57f7555b2e1b2922142eddb02a84/jupyterlab_server-2.27.3-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "e697488f66c3db49df675158a77b3b017520d772c6e1548c7d9bcc5df7944ee4" + +[[packages]] +name = "jupyterlab-widgets" +version = "3.0.14" + +[[packages.wheels]] +name = "jupyterlab_widgets-3.0.14-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/64/7a/f2479ba401e02f7fcbd3fc6af201eac888eaa188574b8e9df19452ab4972/jupyterlab_widgets-3.0.14-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "54c33e3306b7fca139d165d6190dc6c0627aafa5d14adfc974a4e9a3d26cb703" + +[[packages]] +name = "keras" +version = "3.10.0" + +[[packages.wheels]] +name = "keras-3.10.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/95/e6/4179c461a5fc43e3736880f64dbdc9b1a5349649f0ae32ded927c0e3a227/keras-3.10.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "c095a6bf90cd50defadf73d4859ff794fad76b775357ef7bd1dbf96388dae7d3" + +[[packages]] +name = "keyring" +version = "25.6.0" + +[[packages.wheels]] +name = "keyring-25.6.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/d3/32/da7f44bcb1105d3e88a0b74ebdca50c59121d2ddf71c9e34ba47df7f3a56/keyring-25.6.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "552a3f7af126ece7ed5c89753650eec89c7eaae8617d0aa4d9ad2b75111266bd" + +[[packages]] +name = "kiwisolver" +version = "1.4.8" + +[[packages.wheels]] +name = "kiwisolver-1.4.8-cp312-cp312-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/bd/72/dfff0cc97f2a0776e1c9eb5bef1ddfd45f46246c6533b0191887a427bca5/kiwisolver-1.4.8-cp312-cp312-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "01c3d31902c7db5fb6182832713d3b4122ad9317c2c5877d0539227d96bb2e50" + +[[packages]] +name = "langchain" +version = "0.3.25" + +[[packages.wheels]] +name = "langchain-0.3.25-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/ed/5c/5c0be747261e1f8129b875fa3bfea736bc5fe17652f9d5e15ca118571b6f/langchain-0.3.25-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "931f7d2d1eaf182f9f41c5e3272859cfe7f94fc1f7cef6b3e5a46024b4884c21" + +[[packages]] +name = "langchain-core" +version = "0.3.59" + +[[packages.wheels]] +name = "langchain_core-0.3.59-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/30/40/aa440a7cd05f1dab5d7c91a1284eb776c3cf3eb59fa18ed39927650cfa38/langchain_core-0.3.59-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "9686baaff43f2c8175535da13faf40e6866769015e93130c3c1e4243e7244d70" + +[[packages]] +name = "langchain-text-splitters" +version = "0.3.8" + +[[packages.wheels]] +name = "langchain_text_splitters-0.3.8-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/8b/a3/3696ff2444658053c01b6b7443e761f28bb71217d82bb89137a978c5f66f/langchain_text_splitters-0.3.8-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "e75cc0f4ae58dcf07d9f18776400cf8ade27fadd4ff6d264df6278bb302f6f02" + +[[packages]] +name = "langsmith" +version = "0.3.42" + +[[packages.wheels]] +name = "langsmith-0.3.42-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/89/8e/e8a58e0abaae3f3ac4702e9ca35d1fc6159711556b64ffd0e247771a3f12/langsmith-0.3.42-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "18114327f3364385dae4026ebfd57d1c1cb46d8f80931098f0f10abe533475ff" + +[[packages]] +name = "lazy-loader" +version = "0.4" + +[[packages.wheels]] +name = "lazy_loader-0.4-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/83/60/d497a310bde3f01cb805196ac61b7ad6dc5dcf8dce66634dc34364b20b4f/lazy_loader-0.4-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "342aa8e14d543a154047afb4ba8ef17f5563baad3fc610d7b15b213b0f119efc" + +[[packages]] +name = "linkify-it-py" +version = "2.0.3" + +[[packages.wheels]] +name = "linkify_it_py-2.0.3-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/04/1e/b832de447dee8b582cac175871d2f6c3d5077cc56d5575cadba1fd1cccfa/linkify_it_py-2.0.3-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "6bcbc417b0ac14323382aef5c5192c0075bf8a9d6b41820a2b66371eac6b6d79" + +[[packages]] +name = "llvmlite" +version = "0.44.0" + +[[packages.wheels]] +name = "llvmlite-0.44.0-cp312-cp312-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/e2/3b/a9a17366af80127bd09decbe2a54d8974b6d8b274b39bf47fbaedeec6307/llvmlite-0.44.0-cp312-cp312-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "eae7e2d4ca8f88f89d315b48c6b741dcb925d6a1042da694aa16ab3dd4cbd3a1" + +[[packages]] +name = "lmfit" +version = "1.3.3" + +[[packages.wheels]] +name = "lmfit-1.3.3-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/6a/e1/d5aeb89530550c7e797d3528225fa31012490e79c9df5cf72a0f07cc66d3/lmfit-1.3.3-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "a9e9ec7d0d0ec962cc6c078ad1ec6c8311d3ac0e5f0947a00a91f5509dacc2b2" + +[[packages]] +name = "locket" +version = "1.0.0" + +[[packages.wheels]] +name = "locket-1.0.0-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/db/bc/83e112abc66cd466c6b83f99118035867cecd41802f8d044638aa78a106e/locket-1.0.0-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "b6c819a722f7b6bd955b80781788e4a66a55628b858d347536b7e81325a3a5e3" + +[[packages]] +name = "logfire-api" +version = "3.12.0" + +[[packages.wheels]] +name = "logfire_api-3.12.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/97/c6/210bb1da7119af155276046c18ceff29867dfe9ea4bcb7d03397b28bd1cd/logfire_api-3.12.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "fc092c2dcb24c8462ba776f3b0c2183f82e1cd55f86e29b38cf21a048e66a17d" + +[[packages]] +name = "lxml" +version = "5.3.0" + +[[packages.wheels]] +name = "lxml-5.3.0-cp312-cp312-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/fc/82/ace5a5676051e60355bd8fb945df7b1ba4f4fb8447f2010fb816bfd57724/lxml-5.3.0-cp312-cp312-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "c1a69e58a6bb2de65902051d57fde951febad631a20a64572677a1052690482f" + +[[packages]] +name = "mako" +version = "1.3.9" + +[[packages.wheels]] +name = "Mako-1.3.9-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/cd/83/de0a49e7de540513f53ab5d2e105321dedeb08a8f5850f0208decf4390ec/Mako-1.3.9-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "95920acccb578427a9aa38e37a186b1e43156c87260d7ba18ca63aa4c7cbd3a1" + +[[packages]] +name = "markdown" +version = "3.7" + +[[packages.wheels]] +name = "Markdown-3.7-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/3f/08/83871f3c50fc983b88547c196d11cf8c3340e37c32d2e9d6152abe2c61f7/Markdown-3.7-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "7eb6df5690b81a1d7942992c97fad2938e956e79df20cbc6186e9c3a77b1c803" + +[[packages]] +name = "markdown-it-py" +version = "3.0.0" + +[[packages.wheels]] +name = "markdown_it_py-3.0.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/42/d7/1ec15b46af6af88f19b8e5ffea08fa375d433c998b8a7639e76935c14f1f/markdown_it_py-3.0.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1" + +[[packages]] +name = "markupsafe" +version = "3.0.2" + +[[packages.wheels]] +name = "MarkupSafe-3.0.2-cp312-cp312-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/c1/80/a61f99dc3a936413c3ee4e1eecac96c0da5ed07ad56fd975f1a9da5bc630/MarkupSafe-3.0.2-cp312-cp312-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "8e06879fc22a25ca47312fbe7c8264eb0b662f6db27cb2d3bbbc74b1df4b9b87" + +[[packages]] +name = "matplotlib" +version = "3.10.3" + +[[packages.wheels]] +name = "matplotlib-3.10.3-cp312-cp312-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/b1/79/0d1c165eac44405a86478082e225fce87874f7198300bbebc55faaf6d28d/matplotlib-3.10.3-cp312-cp312-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "cf37d8c6ef1a48829443e8ba5227b44236d7fcaf7647caa3178a4ff9f7a5be05" + +[[packages]] +name = "matplotlib-inline" +version = "0.1.7" + +[[packages.wheels]] +name = "matplotlib_inline-0.1.7-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/8f/8e/9ad090d3553c280a8060fbf6e24dc1c0c29704ee7d1c372f0c174aa59285/matplotlib_inline-0.1.7-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "df192d39a4ff8f21b1895d72e6a13f5fcc5099f00fa84384e0ea28c2cc0653ca" + +[[packages]] +name = "maturin" +version = "1.8.3" + +[[packages.wheels]] +name = "maturin-1.8.3-py3-none-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/d5/62/f92a130a370dd7aca13c316844b82853647f048cfe1594a81f628ab7101f/maturin-1.8.3-py3-none-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "85f2b882d8235c1c1cb0a38d382ccd5b3ba0674d99cb548d49df9342cc688e36" + +[[packages]] +name = "mccabe" +version = "0.7.0" + +[[packages.wheels]] +name = "mccabe-0.7.0-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/27/1a/1f68f9ba0c207934b35b86a8ca3aad8395a3d6dd7921c0686e23853ff5a9/mccabe-0.7.0-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e" + +[[packages]] +name = "mcp" +version = "1.9.3" + +[[packages.wheels]] +name = "mcp-1.9.3-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/79/45/823ad05504bea55cb0feb7470387f151252127ad5c72f8882e8fe6cf5c0e/mcp-1.9.3-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "69b0136d1ac9927402ed4cf221d4b8ff875e7132b0b06edd446448766f34f9b9" + +[[packages]] +name = "mdit-py-plugins" +version = "0.4.2" + +[[packages.wheels]] +name = "mdit_py_plugins-0.4.2-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/a7/f7/7782a043553ee469c1ff49cfa1cdace2d6bf99a1f333cf38676b3ddf30da/mdit_py_plugins-0.4.2-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "0c673c3f889399a33b95e88d2f0d111b4447bdfea7f237dab2d488f459835636" + +[[packages]] +name = "mdurl" +version = "0.1.2" + +[[packages.wheels]] +name = "mdurl-0.1.2-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8" + +[[packages]] +name = "mercantile" +version = "1.2.1" + +[[packages.wheels]] +name = "mercantile-1.2.1-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/b2/d6/de0cc74f8d36976aeca0dd2e9cbf711882ff8e177495115fd82459afdc4d/mercantile-1.2.1-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "30f457a73ee88261aab787b7069d85961a5703bb09dc57a170190bc042cd023f" + +[[packages]] +name = "mergedeep" +version = "1.3.4" + +[[packages.wheels]] +name = "mergedeep-1.3.4-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/2c/19/04f9b178c2d8a15b076c8b5140708fa6ffc5601fb6f1e975537072df5b2a/mergedeep-1.3.4-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "70775750742b25c0d8f36c55aed03d24c3384d17c951b3175d898bd778ef0307" + +[[packages]] +name = "missingno" +version = "0.5.2" + +[[packages.wheels]] +name = "missingno-0.5.2-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/87/22/cd5cf999af21c2f97486622c551ac3d07361ced8125121e907f588ff5f24/missingno-0.5.2-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "55782621ce09ba0f0a1d08e5bd6d6fe1946469fb03951fadf7d209911ca5b072" + +[[packages]] +name = "mistralai" +version = "1.8.1" + +[[packages.wheels]] +name = "mistralai-1.8.1-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/b0/14/e9ef675928768f508dfcedbb0e0ed601784a6911620a2bc25c9065921420/mistralai-1.8.1-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "badfc7e6832d894b3e9071d92ad621212b7cccd7df622c6cacdb525162ae338f" + +[[packages]] +name = "mistune" +version = "3.1.3" + +[[packages.wheels]] +name = "mistune-3.1.3-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/01/4d/23c4e4f09da849e127e9f123241946c23c1e30f45a88366879e064211815/mistune-3.1.3-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "1a32314113cff28aa6432e99e522677c8587fd83e3d51c29b82a52409c842bd9" + +[[packages]] +name = "mizani" +version = "0.11.4" + +[[packages.wheels]] +name = "mizani-0.11.4-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/2a/11/f3777ad46c5d92e3ead121c22ea45fafb6c3b2c1edca0c0c6494969c125c/mizani-0.11.4-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "5b6271dc3da2c88694dca2e0e0a7e1879f0e2fb046c789776f54d090a5243735" + +[[packages]] +name = "ml-dtypes" +version = "0.5.1" + +[[packages.wheels]] +name = "ml_dtypes-0.5.1-cp312-cp312-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/38/bc/c4260e4a6c6bf684d0313308de1c860467275221d5e7daf69b3fcddfdd0b/ml_dtypes-0.5.1-cp312-cp312-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "9626d0bca1fb387d5791ca36bacbba298c5ef554747b7ebeafefb4564fc83566" + +[[packages]] +name = "mlxtend" +version = "0.23.3" + +[[packages.wheels]] +name = "mlxtend-0.23.3-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/0f/92/5c322336a0991949a1e91f6acd7e04f7e05b0fb6252a3f00fcdc0cb5e97d/mlxtend-0.23.3-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "f9fec721c4121be87dac00e513456dde5bf56b7427750719c0a291cd58b6538e" + +[[packages]] +name = "more-itertools" +version = "10.6.0" + +[[packages.wheels]] +name = "more_itertools-10.6.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/23/62/0fe302c6d1be1c777cab0616e6302478251dfbf9055ad426f5d0def75c89/more_itertools-10.6.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "6eb054cb4b6db1473f6e15fcc676a08e4732548acd47c708f0e179c2c7c01e89" + +[[packages]] +name = "mpld3" +version = "0.5.10" + +[[packages.wheels]] +name = "mpld3-0.5.10-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/95/6a/e3691bcc47485f38b09853207c928130571821d187cf174eed5418d45e82/mpld3-0.5.10-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "80877acce87ea447380fad7374668737505c8c0684aab05238e7c5dc1fab38c1" + +[[packages]] +name = "mpmath" +version = "1.3.0" + +[[packages.wheels]] +name = "mpmath-1.3.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/43/e3/7d92a15f894aa0c9c4b49b8ee9ac9850d6e63b03c9c32c0367a13ae62209/mpmath-1.3.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "a0b2b9fe80bbcd81a6647ff13108738cfb482d481d826cc0e02f5b35e5c88d2c" + +[[packages]] +name = "msal" +version = "1.30.0" + +[[packages.wheels]] +name = "msal-1.30.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/ab/82/8f19334da43b7ef72d995587991a446f140346d76edb96a2c1a2689588e9/msal-1.30.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "423872177410cb61683566dc3932db7a76f661a5d2f6f52f02a047f101e1c1de" + +[[packages]] +name = "msal-extensions" +version = "1.2.0" + +[[packages.wheels]] +name = "msal_extensions-1.2.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/2c/69/314d887a01599669fb330da14e5c6ff5f138609e322812a942a74ef9b765/msal_extensions-1.2.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "cf5ba83a2113fa6dc011a254a72f1c223c88d7dfad74cc30617c4679a417704d" + +[[packages]] +name = "msgpack" +version = "1.1.0" + +[[packages.wheels]] +name = "msgpack-1.1.0-cp312-cp312-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/73/80/2708a4641f7d553a63bc934a3eb7214806b5b39d200133ca7f7afb0a53e8/msgpack-1.1.0-cp312-cp312-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "115a7af8ee9e8cddc10f87636767857e7e3717b7a2e97379dc2054712693e90f" + +[[packages]] +name = "multidict" +version = "6.4.3" + +[[packages.wheels]] +name = "multidict-6.4.3-cp312-cp312-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/06/24/c8fdff4f924d37225dc0c56a28b1dca10728fc2233065fafeb27b4b125be/multidict-6.4.3-cp312-cp312-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "11990b5c757d956cd1db7cb140be50a63216af32cd6506329c2c59d732d802db" + +[[packages]] +name = "multipledispatch" +version = "1.0.0" + +[[packages.wheels]] +name = "multipledispatch-1.0.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/51/c0/00c9809d8b9346eb238a6bbd5f83e846a4ce4503da94a4c08cb7284c325b/multipledispatch-1.0.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "0c53cd8b077546da4e48869f49b13164bebafd0c2a5afceb6bb6a316e7fb46e4" + +[[packages]] +name = "mypy" +version = "1.15.0" + +[[packages.wheels]] +name = "mypy-1.15.0-cp312-cp312-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/13/50/da5203fcf6c53044a0b699939f31075c45ae8a4cadf538a9069b165c1050/mypy-1.15.0-cp312-cp312-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "171a9ca9a40cd1843abeca0e405bc1940cd9b305eaeea2dda769ba096932bb22" + +[[packages]] +name = "mypy-extensions" +version = "1.0.0" + +[[packages.wheels]] +name = "mypy_extensions-1.0.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/2a/e2/5d3f6ada4297caebe1a2add3b126fe800c96f56dbe5d1988a2cbe0b267aa/mypy_extensions-1.0.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d" + +[[packages]] +name = "mysql-connector-python" +version = "9.2.0" + +[[packages.wheels]] +name = "mysql_connector_python-9.2.0-cp312-cp312-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/5c/48/aa1d3e1dd2fa0fece0581d49c6d10717e18fc86dde493114f3894a3371bd/mysql_connector_python-9.2.0-cp312-cp312-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "b7d149bcc455cf606a4aa604d45267fba16c8abf36056b804f8d16e8f5e753c1" + +[[packages]] +name = "namex" +version = "0.0.8" + +[[packages.wheels]] +name = "namex-0.0.8-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/73/59/7854fbfb59f8ae35483ce93493708be5942ebb6328cd85b3a609df629736/namex-0.0.8-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "7ddb6c2bb0e753a311b7590f84f6da659dd0c05e65cb89d519d54c0a250c0487" + +[[packages]] +name = "narwhals" +version = "1.36.0" + +[[packages.wheels]] +name = "narwhals-1.36.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/42/bf/fbcbd9f8676e06ed43d644a4ddbf31478a44056487578ce67f191da430cb/narwhals-1.36.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "e3c50dd1d769bc145f57ae17c1f0f0da6c3d397d62cdd0bb167e9b618e95c9d6" + +[[packages]] +name = "nbclient" +version = "0.10.2" + +[[packages.wheels]] +name = "nbclient-0.10.2-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/34/6d/e7fa07f03a4a7b221d94b4d586edb754a9b0dc3c9e2c93353e9fa4e0d117/nbclient-0.10.2-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "4ffee11e788b4a27fabeb7955547e4318a5298f34342a4bfd01f2e1faaeadc3d" + +[[packages]] +name = "nbconvert" +version = "7.16.6" + +[[packages.wheels]] +name = "nbconvert-7.16.6-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/cc/9a/cd673b2f773a12c992f41309ef81b99da1690426bd2f96957a7ade0d3ed7/nbconvert-7.16.6-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "1375a7b67e0c2883678c48e506dc320febb57685e5ee67faa51b18a90f3a712b" + +[[packages]] +name = "nbformat" +version = "5.10.4" + +[[packages.wheels]] +name = "nbformat-5.10.4-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/a9/82/0340caa499416c78e5d8f5f05947ae4bc3cba53c9f038ab6e9ed964e22f1/nbformat-5.10.4-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "3b48d6c8fbca4b299bf3982ea7db1af21580e4fec269ad087b9e81588891200b" + +[[packages]] +name = "nest-asyncio" +version = "1.6.0" + +[[packages.wheels]] +name = "nest_asyncio-1.6.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/a0/c4/c2971a3ba4c6103a3d10c4b0f24f461ddc027f0f09763220cf35ca1401b3/nest_asyncio-1.6.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "87af6efd6b5e897c81050477ef65c62e2b2f35d51703cae01aff2905b1852e1c" + +[[packages]] +name = "networkx" +version = "3.4.2" + +[[packages.wheels]] +name = "networkx-3.4.2-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/b9/54/dd730b32ea14ea797530a4479b2ed46a6fb250f682a9cfb997e968bf0261/networkx-3.4.2-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "df5d4365b724cf81b8c6a7312509d0c22386097011ad1abe274afd5e9d3bbc5f" + +[[packages]] +name = "nh3" +version = "0.2.18" + +[[packages.wheels]] +name = "nh3-0.2.18-cp37-abi3-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/26/8d/53c5b19c4999bdc6ba95f246f4ef35ca83d7d7423e5e38be43ad66544e5d/nh3-0.2.18-cp37-abi3-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "8ce0f819d2f1933953fca255db2471ad58184a60508f03e6285e5114b6254844" + +[[packages]] +name = "nltk" +version = "3.9.1" + +[[packages.wheels]] +name = "nltk-3.9.1-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/4d/66/7d9e26593edda06e8cb531874633f7c2372279c3b0f46235539fe546df8b/nltk-3.9.1-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "4fa26829c5b00715afe3061398a8989dc643b92ce7dd93fb4585a70930d168a1" + +[[packages]] +name = "notebook" +version = "7.4.2" + +[[packages.wheels]] +name = "notebook-7.4.2-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/1e/16/d3c36a0b1f6dfcf218add8eaf803bf0473ff50681ac4d51acb7ba02bce34/notebook-7.4.2-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "9ccef602721aaa5530852e3064710b8ae5415c4e2ce26f8896d0433222755259" + +[[packages]] +name = "notebook-shim" +version = "0.2.4" + +[[packages.wheels]] +name = "notebook_shim-0.2.4-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/f9/33/bd5b9137445ea4b680023eb0469b2bb969d61303dedb2aac6560ff3d14a1/notebook_shim-0.2.4-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "411a5be4e9dc882a074ccbcae671eda64cceb068767e9a3419096986560e1cef" + +[[packages]] +name = "numba" +version = "0.61.2" + +[[packages.wheels]] +name = "numba-0.61.2-cp312-cp312-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/68/1d/ddb3e704c5a8fb90142bf9dc195c27db02a08a99f037395503bfbc1d14b3/numba-0.61.2-cp312-cp312-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "97cf4f12c728cf77c9c1d7c23707e4d8fb4632b46275f8f3397de33e5877af18" + +[[packages]] +name = "numpy" +version = "2.2.6" + +[[packages.wheels]] +name = "numpy-2.2.6-cp312-cp312-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/36/fa/8c9210162ca1b88529ab76b41ba02d433fd54fecaf6feb70ef9f124683f1/numpy-2.2.6-cp312-cp312-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "c1f9540be57940698ed329904db803cf7a402f3fc200bfe599334c9bd84a40b2" + +[[packages]] +name = "numpydoc" +version = "1.8.0" + +[[packages.wheels]] +name = "numpydoc-1.8.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/6c/45/56d99ba9366476cd8548527667f01869279cedb9e66b28eb4dfb27701679/numpydoc-1.8.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "72024c7fd5e17375dec3608a27c03303e8ad00c81292667955c6fea7a3ccf541" + +[[packages]] +name = "openai" +version = "1.82.0" + +[[packages.wheels]] +name = "openai-1.82.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/51/4b/a59464ee5f77822a81ee069b4021163a0174940a92685efc3cf8b4c443a3/openai-1.82.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "8c40647fea1816516cb3de5189775b30b5f4812777e40b8768f361f232b61b30" + +[[packages]] +name = "opencv-python" +version = "4.11.0.86" + +[[packages.wheels]] +name = "opencv_python-4.11.0.86-cp37-abi3-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/a4/7d/f1c30a92854540bf789e9cd5dde7ef49bbe63f855b85a2e6b3db8135c591/opencv_python-4.11.0.86-cp37-abi3-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "085ad9b77c18853ea66283e98affefe2de8cc4c1f43eda4c100cf9b2721142ec" + +[[packages]] +name = "openpyxl" +version = "3.1.5" + +[[packages.wheels]] +name = "openpyxl-3.1.5-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/c0/da/977ded879c29cbd04de313843e76868e6e13408a94ed6b987245dc7c8506/openpyxl-3.1.5-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "5282c12b107bffeef825f4617dc029afaf41d0ea60823bbb665ef3079dc79de2" + +[[packages]] +name = "opentelemetry-api" +version = "1.32.1" + +[[packages.wheels]] +name = "opentelemetry_api-1.32.1-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/12/f2/89ea3361a305466bc6460a532188830351220b5f0851a5fa133155c16eca/opentelemetry_api-1.32.1-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "bbd19f14ab9f15f0e85e43e6a958aa4cb1f36870ee62b7fd205783a112012724" + +[[packages]] +name = "optree" +version = "0.14.1" + +[[packages.wheels]] +name = "optree-0.14.1-cp312-cp312-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/5d/fa/c1dc4f40a83f5df6c16cc3ff89890712dd95caf320641f635ddbe5a11102/optree-0.14.1-cp312-cp312-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "98f858daa588ccb70bb554087e87d4192852a11416e5b14f3ee70ae1861b92b0" + +[[packages]] +name = "optuna" +version = "4.2.1" + +[[packages.wheels]] +name = "optuna-4.2.1-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/28/09/c4d329f7969443cdd4d482048ca406b6f61cda3c8e99ace71feaec7c8734/optuna-4.2.1-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "6d38199013441d3f70fac27136e05c0188c5f4ec3848db708ac311cbdeb30dbf" + +[[packages]] +name = "orjson" +version = "3.10.16" + +[[packages.wheels]] +name = "orjson-3.10.16-cp312-cp312-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/35/ce/81a27e7b439b807bd393585271364cdddf50dc281fc57c4feef7ccb186a6/orjson-3.10.16-cp312-cp312-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "86d127efdd3f9bf5f04809b70faca1e6836556ea3cc46e662b44dab3fe71f3d6" + +[[packages]] +name = "osqp" +version = "0.6.7.post3" + +[[packages.wheels]] +name = "osqp-0.6.7.post3-cp312-cp312-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/57/b5/958d4188cb9347e420d3de2d19d8cb1113f691b7a093cdef67f86b598f30/osqp-0.6.7.post3-cp312-cp312-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "468588cfb690becba4d1f460c2a53e75530584e3efcf2caed59f5219032e6888" + +[[packages]] +name = "outcome" +version = "1.3.0.post0" + +[[packages.wheels]] +name = "outcome-1.3.0.post0-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/55/8b/5ab7257531a5d830fc8000c476e63c935488d74609b50f9384a643ec0a62/outcome-1.3.0.post0-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "e771c5ce06d1415e356078d3bdd68523f284b4ce5419828922b6871e65eda82b" + +[[packages]] +name = "overrides" +version = "7.7.0" + +[[packages.wheels]] +name = "overrides-7.7.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/2c/ab/fc8290c6a4c722e5514d80f62b2dc4c4df1a68a41d1364e625c35990fcf3/overrides-7.7.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "c7ed9d062f78b8e4c1a7b70bd8796b35ead4d9f510227ef9c5dc7626c60d7e49" + +[[packages]] +name = "packaging" +version = "24.2" + +[[packages.wheels]] +name = "packaging-24.2-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/88/ef/eb23f262cca3c0c4eb7ab1933c3b1f03d021f2c48f54763065b6f0e321be/packaging-24.2-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "09abb1bccd265c01f4a3aa3f7a7db064b36514d2cba19a2f694fe6150451a759" + +[[packages]] +name = "pandas" +version = "2.2.3" + +[[packages.wheels]] +name = "pandas-2.2.3-cp312-cp312-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/29/d4/1244ab8edf173a10fd601f7e13b9566c1b525c4f365d6bee918e68381889/pandas-2.2.3-cp312-cp312-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "59ef3764d0fe818125a5097d2ae867ca3fa64df032331b7e0917cf5d7bf66b13" + +[[packages]] +name = "pandocfilters" +version = "1.5.1" + +[[packages.wheels]] +name = "pandocfilters-1.5.1-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/ef/af/4fbc8cab944db5d21b7e2a5b8e9211a03a79852b1157e2c102fcc61ac440/pandocfilters-1.5.1-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "93be382804a9cdb0a7267585f157e5d1731bbe5545a85b268d6f5fe6232de2bc" + +[[packages]] +name = "panel" +version = "1.6.3" + +[[packages.wheels]] +name = "panel-1.6.3-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/7a/fe/d01b6eae59933d56c345e57cdde5ffe379b7b1f56d192782ab8071249f73/panel-1.6.3-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "ccd2a0587ab382bd55b8ea099706f31b64aadac697b8a41923d3b18b9ed618d6" + +[[packages]] +name = "papermill" +version = "2.6.0" + +[[packages.wheels]] +name = "papermill-2.6.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/61/55/83ce641bc61a70cc0721af6f50154ecaaccedfbdbc27366c1755a2a34972/papermill-2.6.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "0f09da6ef709f3f14dde77cb1af052d05b14019189869affff374c9e612f2dd5" + +[[packages]] +name = "param" +version = "2.2.0" + +[[packages.wheels]] +name = "param-2.2.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/99/56/370a6636e072a037b52499edd8928942df7f887974fc54444ece5152d26a/param-2.2.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "777f8c7b66ab820b70ea5ad09faaa6818308220caae89da3b5c5f359faa72a5e" + +[[packages]] +name = "parso" +version = "0.8.4" + +[[packages.wheels]] +name = "parso-0.8.4-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/c6/ac/dac4a63f978e4dcb3c6d3a78c4d8e0192a113d288502a1216950c41b1027/parso-0.8.4-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "a418670a20291dacd2dddc80c377c5c3791378ee1e8d12bffc35420643d43f18" + +[[packages]] +name = "partd" +version = "1.4.2" + +[[packages.wheels]] +name = "partd-1.4.2-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/71/e7/40fb618334dcdf7c5a316c0e7343c5cd82d3d866edc100d98e29bc945ecd/partd-1.4.2-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "978e4ac767ec4ba5b86c6eaa52e5a2a3bc748a2ca839e8cc798f1cc6ce6efb0f" + +[[packages]] +name = "pathspec" +version = "0.12.1" + +[[packages.wheels]] +name = "pathspec-0.12.1-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/cc/20/ff623b09d963f88bfde16306a54e12ee5ea43e9b597108672ff3a408aad6/pathspec-0.12.1-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08" + +[[packages]] +name = "patsy" +version = "1.0.1" + +[[packages.wheels]] +name = "patsy-1.0.1-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/87/2b/b50d3d08ea0fc419c183a84210571eba005328efa62b6b98bc28e9ead32a/patsy-1.0.1-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "751fb38f9e97e62312e921a1954b81e1bb2bcda4f5eeabaf94db251ee791509c" + +[[packages]] +name = "pep8" +version = "1.7.1" + +[[packages.wheels]] +name = "pep8-1.7.1-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/42/3f/669429ce58de2c22d8d2c542752e137ec4b9885fff398d3eceb1a7f5acb4/pep8-1.7.1-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "b22cfae5db09833bb9bd7c8463b53e1a9c9b39f12e304a8d0bba729c501827ee" + +[[packages]] +name = "pexpect" +version = "4.9.0" + +[[packages.wheels]] +name = "pexpect-4.9.0-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/9e/c3/059298687310d527a58bb01f3b1965787ee3b40dce76752eda8b44e9a2c5/pexpect-4.9.0-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "7236d1e080e4936be2dc3e326cec0af72acf9212a7e1d060210e70a47e253523" + +[[packages]] +name = "pg8000" +version = "1.31.2" + +[[packages.wheels]] +name = "pg8000-1.31.2-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/09/a0/2b30d52017c4ced8fc107386666ea7573954eb708bf66121f0229df05d41/pg8000-1.31.2-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "436c771ede71af4d4c22ba867a30add0bc5c942d7ab27fadbb6934a487ecc8f6" + +[[packages]] +name = "pickleshare" +version = "0.7.5" + +[[packages.wheels]] +name = "pickleshare-0.7.5-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/9a/41/220f49aaea88bc6fa6cba8d05ecf24676326156c23b991e80b3f2fc24c77/pickleshare-0.7.5-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "9649af414d74d4df115d5d718f82acb59c9d418196b7b4290ed47a12ce62df56" + +[[packages]] +name = "pillow" +version = "11.1.0" + +[[packages.wheels]] +name = "pillow-11.1.0-cp312-cp312-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/08/5c/2104299949b9d504baf3f4d35f73dbd14ef31bbd1ddc2c1b66a5b7dfda44/pillow-11.1.0-cp312-cp312-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "a697cd8ba0383bba3d2d3ada02b34ed268cb548b369943cd349007730c92bddf" + +[[packages]] +name = "platformdirs" +version = "4.3.7" + +[[packages.wheels]] +name = "platformdirs-4.3.7-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/6d/45/59578566b3275b8fd9157885918fcd0c4d74162928a5310926887b856a51/platformdirs-4.3.7-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "a03875334331946f13c549dbd8f4bac7a13a50a895a0eb1e8c6a8ace80d40a94" + +[[packages]] +name = "plotly" +version = "6.0.1" + +[[packages.wheels]] +name = "plotly-6.0.1-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/02/65/ad2bc85f7377f5cfba5d4466d5474423a3fb7f6a97fd807c06f92dd3e721/plotly-6.0.1-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "4714db20fea57a435692c548a4eb4fae454f7daddf15f8d8ba7e1045681d7768" + +[[packages]] +name = "plotnine" +version = "0.13.6" + +[[packages.wheels]] +name = "plotnine-0.13.6-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/93/b1/e1c84e68cf24e83c4d251122e04c48840be203dafb4727e738381cdefa74/plotnine-0.13.6-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "4acc1af29fa4e91e726b67d49277e8368f62e1c817f01bf14ecd8ca5e83bfaea" + +[[packages]] +name = "plotpy" +version = "2.7.4" + +[[packages.wheels]] +name = "plotpy-2.7.4-cp312-cp312-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/a1/26/514cf02030400972fd95d42381e76690640eb3d3ceb14d86c22ebbb302ef/plotpy-2.7.4-cp312-cp312-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "716fee6b2c2a2156fd267e3941bcef28b3b169e6f95d2ab7f1417ef8c76f8a14" + +[[packages]] +name = "pluggy" +version = "1.5.0" + +[[packages.wheels]] +name = "pluggy-1.5.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/88/5f/e351af9a41f866ac3f1fac4ca0613908d9a41741cfcf2228f4ad853b697d/pluggy-1.5.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669" + +[[packages]] +name = "ply" +version = "3.11" + +[[packages.wheels]] +name = "ply-3.11-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/a3/58/35da89ee790598a0700ea49b2a66594140f44dec458c07e8e3d4979137fc/ply-3.11-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "096f9b8350b65ebd2fd1346b12452efe5b9607f7482813ffca50c22722a807ce" + +[[packages]] +name = "polars" +version = "1.31.0" + +[[packages.wheels]] +name = "polars-1.31.0-cp39-abi3-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/6e/f6/9d9ad9dc4480d66502497e90ce29efc063373e1598f4bd9b6a38af3e08e7/polars-1.31.0-cp39-abi3-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "3fd874d3432fc932863e8cceff2cff8a12a51976b053f2eb6326a0672134a632" + +[[packages]] +name = "portalocker" +version = "2.7.0" + +[[packages.wheels]] +name = "portalocker-2.7.0-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/8c/df/d4f711d168524f5aebd7fb30969eaa31e3048cf8979688cde3b08f6e5eb8/portalocker-2.7.0-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "a07c5b4f3985c3cf4798369631fb7011adb498e2a46d8440efc75a8f29a0f983" + +[[packages]] +name = "prettytable" +version = "3.16.0" + +[[packages.wheels]] +name = "prettytable-3.16.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/02/c7/5613524e606ea1688b3bdbf48aa64bafb6d0a4ac3750274c43b6158a390f/prettytable-3.16.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "b5eccfabb82222f5aa46b798ff02a8452cf530a352c31bddfa29be41242863aa" + +[[packages]] +name = "prince" +version = "0.16.0" + +[[packages.wheels]] +name = "prince-0.16.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/18/d5/b4480a0f381cbbcfad31f4d118732ab717216857508a730938ee615669a1/prince-0.16.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "7e21a78d4dd06ca3ec526ee714a50b349f26de3fca6b79664150a951b31688f3" + +[[packages]] +name = "priority" +version = "2.0.0" + +[[packages.wheels]] +name = "priority-2.0.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/5e/5f/82c8074f7e84978129347c2c6ec8b6c59f3584ff1a20bc3c940a3e061790/priority-2.0.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "6f8eefce5f3ad59baf2c080a664037bb4725cd0a790d53d59ab4059288faf6aa" + +[[packages]] +name = "prometheus-client" +version = "0.21.1" + +[[packages.wheels]] +name = "prometheus_client-0.21.1-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/ff/c2/ab7d37426c179ceb9aeb109a85cda8948bb269b7561a0be870cc656eefe4/prometheus_client-0.21.1-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "594b45c410d6f4f8888940fe80b5cc2521b305a1fafe1c58609ef715a001f301" + +[[packages]] +name = "prompt-toolkit" +version = "3.0.51" + +[[packages.wheels]] +name = "prompt_toolkit-3.0.51-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/ce/4f/5249960887b1fbe561d9ff265496d170b55a735b76724f10ef19f9e40716/prompt_toolkit-3.0.51-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "52742911fde84e2d423e2f9a4cf1de7d7ac4e51958f648d9540e0fb8db077b07" + +[[packages]] +name = "propcache" +version = "0.3.1" + +[[packages.wheels]] +name = "propcache-0.3.1-cp312-cp312-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/24/bb/3b1b01da5dd04c77a204c84e538ff11f624e31431cfde7201d9110b092b1/propcache-0.3.1-cp312-cp312-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "88c423efef9d7a59dae0614eaed718449c09a5ac79a5f224a8b9664d603f04a3" + +[[packages]] +name = "protobuf" +version = "6.30.2" + +[[packages.wheels]] +name = "protobuf-6.30.2-cp310-abi3-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/97/e9/7b9f1b259d509aef2b833c29a1f3c39185e2bf21c9c1be1cd11c22cb2149/protobuf-6.30.2-cp310-abi3-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "7653c99774f73fe6b9301b87da52af0e69783a2e371e8b599b3e9cb4da4b12b9" + +[[packages]] +name = "psutil" +version = "7.0.0" + +[[packages.wheels]] +name = "psutil-7.0.0-cp37-abi3-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/50/1b/6921afe68c74868b4c9fa424dad3be35b095e16687989ebbb50ce4fceb7c/psutil-7.0.0-cp37-abi3-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "4cf3d4eb1aa9b348dec30105c55cd9b7d4629285735a102beb4441e38db90553" + +[[packages]] +name = "psygnal" +version = "0.12.0" + +[[packages.wheels]] +name = "psygnal-0.12.0-cp312-cp312-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/84/09/f00841834b7ae543bd232c22e557914d63d0d0430d32980883421d5981bb/psygnal-0.12.0-cp312-cp312-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "25a9f2db710a6cd2566b3e0e03cf6e04d56276f36ac86b42fa22d81f9a4ac0f2" + +[[packages]] +name = "ptpython" +version = "3.0.29" + +[[packages.wheels]] +name = "ptpython-3.0.29-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/0f/39/c6fd4dd531e067b6a01624126cff0b3ddc6569e22f83e48d8418ffa9e3be/ptpython-3.0.29-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "65d75c4871859e4305a020c9b9e204366dceb4d08e0e2bd7b7511bd5e917a402" + +[[packages]] +name = "ptyprocess" +version = "0.7.0" + +[[packages.wheels]] +name = "ptyprocess-0.7.0-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/22/a6/858897256d0deac81a172289110f31629fc4cee19b6f01283303e18c8db3/ptyprocess-0.7.0-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35" + +[[packages]] +name = "pure-eval" +version = "0.2.3" + +[[packages.wheels]] +name = "pure_eval-0.2.3-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/8e/37/efad0257dc6e593a18957422533ff0f87ede7c9c6ea010a2177d738fb82f/pure_eval-0.2.3-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "1db8e35b67b3d218d818ae653e27f06c3aa420901fa7b081ca98cbedc874e0d0" + +[[packages]] +name = "pyarrow" +version = "20.0.0" + +[[packages.wheels]] +name = "pyarrow-20.0.0-cp312-cp312-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/a0/8e/9adee63dfa3911be2382fb4d92e4b2e7d82610f9d9f668493bebaa2af50f/pyarrow-20.0.0-cp312-cp312-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "96d6a0a37d9c98be08f5ed6a10831d88d52cac7b13f5287f1e0f625a0de8062b" + +[[packages]] +name = "pyasn1" +version = "0.6.1" + +[[packages.wheels]] +name = "pyasn1-0.6.1-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/c8/f1/d6a797abb14f6283c0ddff96bbdd46937f64122b8c925cab503dd37f8214/pyasn1-0.6.1-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "0d632f46f2ba09143da3a8afe9e33fb6f92fa2320ab7e886e2d0f7672af84629" + +[[packages]] +name = "pyasn1-modules" +version = "0.4.1" + +[[packages.wheels]] +name = "pyasn1_modules-0.4.1-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/77/89/bc88a6711935ba795a679ea6ebee07e128050d6382eaa35a0a47c8032bdc/pyasn1_modules-0.4.1-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "49bfa96b45a292b711e986f222502c1c9a5e1f4e568fc30e2574a6c7d07838fd" + +[[packages]] +name = "pybind11" +version = "2.13.6" + +[[packages.wheels]] +name = "pybind11-2.13.6-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/13/2f/0f24b288e2ce56f51c920137620b4434a38fd80583dbbe24fc2a1656c388/pybind11-2.13.6-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "237c41e29157b962835d356b370ededd57594a26d5894a795960f0047cb5caf5" + +[[packages]] +name = "pycodestyle" +version = "2.12.0" + +[[packages.wheels]] +name = "pycodestyle-2.12.0-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/55/c4/bf8ede2d1641e0a2e027c6d0c7060e00332851ea772cc5cee42a4a207707/pycodestyle-2.12.0-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "949a39f6b86c3e1515ba1787c2022131d165a8ad271b11370a8819aa070269e4" + +[[packages]] +name = "pycparser" +version = "2.22" + +[[packages.wheels]] +name = "pycparser-2.22-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/13/a3/a812df4e2dd5696d1f351d58b8fe16a405b234ad2886a0dab9183fb78109/pycparser-2.22-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc" + +[[packages]] +name = "pyct" +version = "0.5.0" + +[[packages.wheels]] +name = "pyct-0.5.0-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/75/e7/c7c1e9e1b6b23ca1db7af3c6826d57d8da883021f751edcc9c82143b127a/pyct-0.5.0-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "a4038a8885059ab8cac6f946ea30e0b5e6bdbe0b92b6723f06737035f9d65e8c" + +[[packages]] +name = "pydantic" +version = "2.10.6" + +[[packages.wheels]] +name = "pydantic-2.10.6-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/f4/3c/8cc1cc84deffa6e25d2d0c688ebb80635dfdbf1dbea3e30c541c8cf4d860/pydantic-2.10.6-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "427d664bf0b8a2b34ff5dd0f5a18df00591adcee7198fbd71981054cef37b584" + +[[packages]] +name = "pydantic-ai-slim" +version = "0.2.9" + +[[packages.wheels]] +name = "pydantic_ai_slim-0.2.9-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/d8/23/b4d52d83c302859e1e251a8c8a360b993cf8b4818c8b633adaa98b043556/pydantic_ai_slim-0.2.9-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "d954ff84cb250d7150a7ed694e4f1f92f820205d036ee006d02fce3e62a3bc4e" + +[[packages]] +name = "pydantic-core" +version = "2.27.2" + +[[packages.wheels]] +name = "pydantic_core-2.27.2-cp312-cp312-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/1f/ea/cd7209a889163b8dcca139fe32b9687dd05249161a3edda62860430457a5/pydantic_core-2.27.2-cp312-cp312-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "cc3f1a99a4f4f9dd1de4fe0312c114e740b5ddead65bb4102884b384c15d8bc9" + +[[packages]] +name = "pydantic-evals" +version = "0.2.9" + +[[packages.wheels]] +name = "pydantic_evals-0.2.9-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/b6/6e/8d88e00f624a8348b286b219a292fe3e077ee973660dcff6b4ddd5a04e85/pydantic_evals-0.2.9-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "62035ae3a5321e4d892c7372ef91af0f46b675863e827f011d5cb8550dede400" + +[[packages]] +name = "pydantic-graph" +version = "0.2.9" + +[[packages.wheels]] +name = "pydantic_graph-0.2.9-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/a4/cc/e609261763a76f4d23a545afb462847592bc6b4d8eb412990b9b913c073e/pydantic_graph-0.2.9-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "38ad929a0ec205bd7d5875b0b408d4f13448276aa89b6ce2a1143a7552b070ce" + +[[packages]] +name = "pydantic-settings" +version = "2.8.1" + +[[packages.wheels]] +name = "pydantic_settings-2.8.1-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/0b/53/a64f03044927dc47aafe029c42a5b7aabc38dfb813475e0e1bf71c4a59d0/pydantic_settings-2.8.1-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "81942d5ac3d905f7f3ee1a70df5dfb62d5569c12f51a5a647defc1c3d9ee2e9c" + +[[packages]] +name = "pydeck" +version = "0.9.1" + +[[packages.wheels]] +name = "pydeck-0.9.1-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/ab/4c/b888e6cf58bd9db9c93f40d1c6be8283ff49d88919231afe93a6bcf61626/pydeck-0.9.1-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "b3f75ba0d273fc917094fa61224f3f6076ca8752b93d46faf3bcfd9f9d59b038" + +[[packages]] +name = "pydocstyle" +version = "6.3.0" + +[[packages.wheels]] +name = "pydocstyle-6.3.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/36/ea/99ddefac41971acad68f14114f38261c1f27dac0b3ec529824ebc739bdaa/pydocstyle-6.3.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "118762d452a49d6b05e194ef344a55822987a462831ade91ec5c06fd2169d019" + +[[packages]] +name = "pydub" +version = "0.25.1" + +[[packages.wheels]] +name = "pydub-0.25.1-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/a6/53/d78dc063216e62fc55f6b2eebb447f6a4b0a59f55c8406376f76bf959b08/pydub-0.25.1-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "65617e33033874b59d87db603aa1ed450633288aefead953b30bded59cb599a6" + +[[packages]] +name = "pyerfa" +version = "2.0.1.5" + +[[packages.wheels]] +name = "pyerfa-2.0.1.5-cp39-abi3-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/b4/11/97233cf23ad5411ac6f13b1d6ee3888f90ace4f974d9bf9db887aa428912/pyerfa-2.0.1.5-cp39-abi3-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "66292d437dcf75925b694977aa06eb697126e7b86553e620371ed3e48b5e0ad0" + +[[packages]] +name = "pyflakes" +version = "3.2.0" + +[[packages.wheels]] +name = "pyflakes-3.2.0-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/d4/d7/f1b7db88d8e4417c5d47adad627a93547f44bdc9028372dbd2313f34a855/pyflakes-3.2.0-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "84b5be138a2dfbb40689ca07e2152deb896a65c3a3e24c251c5c62489568074a" + +[[packages]] +name = "pygithub" +version = "2.6.1" + +[[packages.wheels]] +name = "PyGithub-2.6.1-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/ac/fc/a444cd19ccc8c4946a512f3827ed0b3565c88488719d800d54a75d541c0b/PyGithub-2.6.1-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "6f2fa6d076ccae475f9fc392cc6cdbd54db985d4f69b8833a28397de75ed6ca3" + +[[packages]] +name = "pygments" +version = "2.19.1" + +[[packages.wheels]] +name = "pygments-2.19.1-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/8a/0b/9fcc47d19c48b59121088dd6da2488a49d5f72dacf8262e2790a1d2c7d15/pygments-2.19.1-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "9ea1544ad55cecf4b8242fab6dd35a93bbce657034b0611ee383099054ab6d8c" + +[[packages]] +name = "pyjwt" +version = "2.10.1" + +[[packages.wheels]] +name = "PyJWT-2.10.1-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/61/ad/689f02752eeec26aed679477e80e632ef1b682313be70793d798c1d5fc8f/PyJWT-2.10.1-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "dcdd193e30abefd5debf142f9adfcdd2b58004e644f25406ffaebd50bd98dacb" + +[[packages]] +name = "pylint" +version = "3.3.6" + +[[packages.wheels]] +name = "pylint-3.3.6-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/31/21/9537fc94aee9ec7316a230a49895266cf02d78aa29b0a2efbc39566e0935/pylint-3.3.6-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "8b7c2d3e86ae3f94fb27703d521dd0b9b6b378775991f504d7c3a6275aa0a6a6" + +[[packages]] +name = "pylint-venv" +version = "3.0.4" + +[[packages.wheels]] +name = "pylint_venv-3.0.4-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/a6/10/040e1928236e3d34b26639e3427df88c7249a85aadc621cea2158589b4f8/pylint_venv-3.0.4-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "31006a3df398f58f962c9e5620e756b284e8b2bc490594ce5ee5da41920cb32c" + +[[packages]] +name = "pyls-spyder" +version = "0.4.0" + +[[packages.wheels]] +name = "pyls_spyder-0.4.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/d0/26/d0975972af1f18c3bb02ec5889191cc09ebb982bcbe45438d90ca763f4ec/pyls_spyder-0.4.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "1505d975f866a343d0554b6dab41b53717f4b4bc6df450dfd7d48f889fe450b9" + +[[packages]] +name = "pymongo" +version = "4.10.1" + +[[packages.wheels]] +name = "pymongo-4.10.1-cp312-cp312-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/76/8b/5afce891d78159912c43726fab32641e3f9718f14be40f978c148ea8db48/pymongo-4.10.1-cp312-cp312-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "dcc07b1277e8b4bf4d7382ca133850e323b7ab048b8353af496d050671c7ac52" + +[[packages]] +name = "pympler" +version = "1.1" + +[[packages.wheels]] +name = "Pympler-1.1-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/79/4f/a6a2e2b202d7fd97eadfe90979845b8706676b41cbd3b42ba75adf329d1f/Pympler-1.1-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "5b223d6027d0619584116a0cbc28e8d2e378f7a79c1e5e024f9ff3b673c58506" + +[[packages]] +name = "pynacl" +version = "1.5.0" + +[[packages.wheels]] +name = "PyNaCl-1.5.0-cp36-abi3-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/5e/22/d3db169895faaf3e2eda892f005f433a62db2decbcfbc2f61e6517adfa87/PyNaCl-1.5.0-cp36-abi3-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "20f42270d27e1b6a29f54032090b972d97f0a1b0948cc52392041ef7831fee93" + +[[packages]] +name = "pynndescent" +version = "0.5.13" + +[[packages.wheels]] +name = "pynndescent-0.5.13-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/d2/53/d23a97e0a2c690d40b165d1062e2c4ccc796be458a1ce59f6ba030434663/pynndescent-0.5.13-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "69aabb8f394bc631b6ac475a1c7f3994c54adf3f51cd63b2730fefba5771b949" + +[[packages]] +name = "pyodbc" +version = "5.2.0" + +[[packages.wheels]] +name = "pyodbc-5.2.0-cp312-cp312-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/21/7f/3a47e022a97b017ffb73351a1061e4401bcb5aa4fc0162d04f4e5452e4fc/pyodbc-5.2.0-cp312-cp312-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "b1f5686b142759c5b2bdbeaa0692622c2ebb1f10780eb3c174b85f5607fbcf55" + +[[packages]] +name = "pyogrio" +version = "0.10.0" + +[[packages.wheels]] +name = "pyogrio-0.10.0-cp312-cp312-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/43/97/34605480f06b0ad9611bf58a174eccc6f3673275f3d519cf763391892881/pyogrio-0.10.0-cp312-cp312-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "2a3e09839590d71ff832aa95c4f23fa00a2c63c3de82c1fbd4fb8d265792acfc" + +[[packages]] +name = "pyomo" +version = "6.9.2" + +[[packages.wheels]] +name = "pyomo-6.9.2-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/7f/88/0a07233e39357d3d620186485b927074d6d0ae0f64ad72cc5222ae05844e/pyomo-6.9.2-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "13ebb2f974f97afa626c2712d4f27e09a1c3d18ca11755676b743504a76e5161" + +[[packages]] +name = "pypandoc" +version = "1.15" + +[[packages.wheels]] +name = "pypandoc-1.15-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/61/06/0763e0ccc81754d3eadb21b2cb86cf21bdedc9b52698c2ad6785db7f0a4e/pypandoc-1.15-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "4ededcc76c8770f27aaca6dff47724578428eca84212a31479403a9731fc2b16" + +[[packages]] +name = "pyparsing" +version = "3.2.3" + +[[packages.wheels]] +name = "pyparsing-3.2.3-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/05/e7/df2285f3d08fee213f2d041540fa4fc9ca6c2d44cf36d3a035bf2a8d2bcc/pyparsing-3.2.3-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "a749938e02d6fd0b59b356ca504a24982314bb090c383e3cf201c95ef7e2bfcf" + +[[packages]] +name = "pypdf" +version = "5.4.0" + +[[packages.wheels]] +name = "pypdf-5.4.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/0b/27/d83f8f2a03ca5408dc2cc84b49c0bf3fbf059398a6a2ea7c10acfe28859f/pypdf-5.4.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "db994ab47cadc81057ea1591b90e5b543e2b7ef2d0e31ef41a9bfe763c119dab" + +[[packages]] +name = "pyproj" +version = "3.7.0" + +[[packages.wheels]] +name = "pyproj-3.7.0-cp312-cp312-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/a1/8b/96bc8c8f3eca4eb7fa3758fde0b755d1df30a19f494376e3ee8de1ef4e79/pyproj-3.7.0-cp312-cp312-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "0692f806224e8ed82fe4acfa57268ff444fdaf9f330689f24c0d96e59480cce1" + +[[packages]] +name = "pyproject-hooks" +version = "1.2.0" + +[[packages.wheels]] +name = "pyproject_hooks-1.2.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/bd/24/12818598c362d7f300f18e74db45963dbcb85150324092410c8b49405e42/pyproject_hooks-1.2.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "9e5c6bfa8dcc30091c74b0cf803c81fdd29d94f01992a7707bc97babb1141913" + +[[packages]] +name = "pyqt5" +version = "5.15.11" + +[[packages.wheels]] +name = "PyQt5-5.15.11-cp38-abi3-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/56/d5/68eb9f3d19ce65df01b6c7b7a577ad3bbc9ab3a5dd3491a4756e71838ec9/PyQt5-5.15.11-cp38-abi3-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "bdde598a3bb95022131a5c9ea62e0a96bd6fb28932cc1619fd7ba211531b7517" + +[[packages]] +name = "pyqt5-qt5" +version = "5.15.2" + +[[packages.wheels]] +name = "PyQt5_Qt5-5.15.2-py3-none-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/37/97/5d3b222b924fa2ed4c2488925155cd0b03fd5d09ee1cfcf7c553c11c9f66/PyQt5_Qt5-5.15.2-py3-none-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "750b78e4dba6bdf1607febedc08738e318ea09e9b10aea9ff0d73073f11f6962" + +[[packages]] +name = "pyqt5-sip" +version = "12.17.0" + +[[packages.wheels]] +name = "PyQt5_sip-12.17.0-cp312-cp312-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/fe/c5/1174988d52c732d07033cf9a5067142b01d76be7731c6394a64d5c3ef65c/PyQt5_sip-12.17.0-cp312-cp312-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "54c31de7706d8a9a8c0fc3ea2c70468aba54b027d4974803f8eace9c22aad41c" + +[[packages]] +name = "pyqtgraph" +version = "0.13.7" + +[[packages.wheels]] +name = "pyqtgraph-0.13.7-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/7b/34/5702b3b7cafe99be1d94b42f100e8cc5e6957b761fcb1cf5f72d492851da/pyqtgraph-0.13.7-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "7754edbefb6c367fa0dfb176e2d0610da3ada20aa7a5318516c74af5fb72bf7a" + +[[packages]] +name = "pyqtwebengine" +version = "5.15.7" + +[[packages.wheels]] +name = "PyQtWebEngine-5.15.7-cp38-abi3-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/39/67/0dead50889d905fc99f40e61e5ab7f73746605ce8f74c4fa7fb3fc1d6c5e/PyQtWebEngine-5.15.7-cp38-abi3-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "bd5e8c426d6f6b352cd15800d64a89b2a4a11e098460b818c7bdcf5e5612e44f" + +[[packages]] +name = "pyqtwebengine-qt5" +version = "5.15.2" + +[[packages.wheels]] +name = "PyQtWebEngine_Qt5-5.15.2-py3-none-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/e0/db/0f29bd882aee8b5754f3e1ab104d2d09cdd9138a889558b43badcd81ce11/PyQtWebEngine_Qt5-5.15.2-py3-none-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "24231f19e1595018779977de6722b5c69f3d03f34a5f7574ff21cd1e764ef76d" + +[[packages]] +name = "pyserial" +version = "3.5" + +[[packages.wheels]] +name = "pyserial-3.5-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/07/bc/587a445451b253b285629263eb51c2d8e9bcea4fc97826266d186f96f558/pyserial-3.5-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "c4451db6ba391ca6ca299fb3ec7bae67a5c55dde170964c7a14ceefec02f2cf0" + +[[packages]] +name = "pysocks" +version = "1.7.1" + +[[packages.wheels]] +name = "PySocks-1.7.1-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/8d/59/b4572118e098ac8e46e399a1dd0f2d85403ce8bbaad9ec79373ed6badaf9/PySocks-1.7.1-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "2725bd0a9925919b9b51739eea5f9e2bae91e83288108a9ad338b2e3a4435ee5" + +[[packages]] +name = "pyspnego" +version = "0.11.2" + +[[packages.wheels]] +name = "pyspnego-0.11.2-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/57/ea/b3c1438839d8724beff7b31ec42b9d041265dc9ca27ccb54477d442bfbcf/pyspnego-0.11.2-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "74abc1fb51e59360eb5c5c9086e5962174f1072c7a50cf6da0bda9a4bcfdfbd4" + +[[packages]] +name = "pytest" +version = "8.3.5" + +[[packages.wheels]] +name = "pytest-8.3.5-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/30/3d/64ad57c803f1fa1e963a7946b6e0fea4a70df53c1a7fed304586539c2bac/pytest-8.3.5-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "c69214aa47deac29fad6c2a4f590b9c4a9fdb16a403176fe154b79c0b4d4d820" + +[[packages]] +name = "python-barcode" +version = "0.15.1" + +[[packages.wheels]] +name = "python_barcode-0.15.1-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/10/27/9b5c5bb1938d4e6b12f4c95f40ea905c11df3cd58e128e9305397b9a2697/python_barcode-0.15.1-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "057636fba37369c22852410c8535b36adfbeb965ddfd4e5b6924455d692e0886" + +[[packages]] +name = "python-dateutil" +version = "2.8.2" + +[[packages.wheels]] +name = "python_dateutil-2.8.2-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/36/7a/87837f39d0296e723bb9b62bbb257d0355c7f6128853c78955f57342a56d/python_dateutil-2.8.2-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9" + +[[packages]] +name = "python-dotenv" +version = "1.1.0" + +[[packages.wheels]] +name = "python_dotenv-1.1.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/1e/18/98a99ad95133c6a6e2005fe89faedf294a748bd5dc803008059409ac9b1e/python_dotenv-1.1.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "d7c01d9e2293916c18baf562d95698754b0dbbb5e74d457c45d4f6561fb9d55d" + +[[packages]] +name = "python-json-logger" +version = "3.3.0" + +[[packages.wheels]] +name = "python_json_logger-3.3.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/08/20/0f2523b9e50a8052bc6a8b732dfc8568abbdc42010aef03a2d750bdab3b2/python_json_logger-3.3.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "dd980fae8cffb24c13caf6e158d3d61c0d6d22342f932cb6e9deedab3d35eec7" + +[[packages]] +name = "python-lsp-black" +version = "2.0.0" + +[[packages.wheels]] +name = "python_lsp_black-2.0.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/78/44/fef9b4d027b3d6321e6f30b6b5946bef18cd84a96e1d81012ac0f69ea53c/python_lsp_black-2.0.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "d5efdee45f5fa9e5241f5d4d396cd46127f45c85817916b1fd92c2986652bf7e" + +[[packages]] +name = "python-lsp-jsonrpc" +version = "1.1.2" + +[[packages.wheels]] +name = "python_lsp_jsonrpc-1.1.2-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/cb/d9/656659d5b5d5f402b2b174cd0ba9bc827e07ce3c0bf88da65424baf64af8/python_lsp_jsonrpc-1.1.2-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "7339c2e9630ae98903fdaea1ace8c47fba0484983794d6aafd0bd8989be2b03c" + +[[packages]] +name = "python-lsp-server" +version = "1.12.2" + +[[packages.wheels]] +name = "python_lsp_server-1.12.2-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/cb/e7/28010a326ef591e1409daf9d57a47de94156c147ad1befe74d8196d82729/python_lsp_server-1.12.2-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "750116459449184ba20811167cdf96f91296ae12f1f65ebd975c5c159388111b" + +[[packages]] +name = "python-multipart" +version = "0.0.20" + +[[packages.wheels]] +name = "python_multipart-0.0.20-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/45/58/38b5afbc1a800eeea951b9285d3912613f2603bdf897a4ab0f4bd7f405fc/python_multipart-0.0.20-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "8a62d3a8335e06589fe01f2a3e178cdcc632f3fbe0d492ad9ee0ec35aab1f104" + +[[packages]] +name = "python-slugify" +version = "8.0.4" + +[[packages.wheels]] +name = "python_slugify-8.0.4-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/a4/62/02da182e544a51a5c3ccf4b03ab79df279f9c60c5e82d5e8bec7ca26ac11/python_slugify-8.0.4-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "276540b79961052b66b7d116620b36518847f52d5fd9e3a70164fc8c50faa6b8" + +[[packages]] +name = "pythonqwt" +version = "0.14.5" + +[[packages.wheels]] +name = "pythonqwt-0.14.5-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/28/e9/1e6e93e1aaaec57d6ef427291e8fb3d9f18ebd91147c24f2b241b01e2def/pythonqwt-0.14.5-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "be5a9d2e1ba22aaa02eb397c5b3b5e4e1d9ed2c08f45554d8b920d8fc3be6dc7" + +[[packages]] +name = "pytoolconfig" +version = "1.3.1" + +[[packages.wheels]] +name = "pytoolconfig-1.3.1-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/92/44/da239917f5711ca7105f7d7f9e2765716dd883b241529beafc0f28504725/pytoolconfig-1.3.1-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "5d8cea8ae1996938ec3eaf44567bbc5ef1bc900742190c439a44a704d6e1b62b" + +[[packages]] +name = "pytz" +version = "2025.2" + +[[packages.wheels]] +name = "pytz-2025.2-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/81/c4/34e93fe5f5429d7570ec1fa436f1986fb1f00c3e0f43a589fe2bbcd22c3f/pytz-2025.2-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "5ddf76296dd8c44c26eb8f4b6f35488f3ccbf6fbbd7adee0b7262d43f0ec2f00" + +[[packages]] +name = "pyuca" +version = "1.2" + +[[packages.wheels]] +name = "pyuca-1.2-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/98/88/aeeee34d88f841aca712a8c18fbd62a33eaad8f2dbe535e87f3c829b02f9/pyuca-1.2-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "abaa12e1bd2c7c68ca8396ff8383bc0654a739cef3ae68fd7af58bf29af0a91e" + +[[packages]] +name = "pyusb" +version = "1.3.1" + +[[packages.wheels]] +name = "pyusb-1.3.1-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/28/b8/27e6312e86408a44fe16bd28ee12dd98608b39f7e7e57884a24e8f29b573/pyusb-1.3.1-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "bf9b754557af4717fe80c2b07cc2b923a9151f5c08d17bdb5345dac09d6a0430" + +[[packages]] +name = "pyviz-comms" +version = "3.0.4" + +[[packages.wheels]] +name = "pyviz_comms-3.0.4-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/98/cc/ba051cfaef2525054e3367f2d5ff4df38f8f775125b3eebb82af4060026b/pyviz_comms-3.0.4-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "a40d17db26ec13cf975809633804e712bd24b473e77388c193c44043f85d0b25" + +[[packages]] +name = "pywavelets" +version = "1.8.0" + +[[packages.wheels]] +name = "pywavelets-1.8.0-cp312-cp312-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/1c/88/9e2aa9d5fde08bfc0fb18ffb1b5307c1ed49c24930b4147e5f48571a7251/pywavelets-1.8.0-cp312-cp312-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "810a23a631da596fef7196ddec49b345b1aab13525bb58547eeebe1769edbbc1" + +[[packages]] +name = "pywin32" +version = "310" + +[[packages.wheels]] +name = "pywin32-310-cp312-cp312-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/e3/e5/b0627f8bb84e06991bea89ad8153a9e50ace40b2e1195d68e9dff6b03d0f/pywin32-310-cp312-cp312-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "bf5c397c9a9a19a6f62f3fb821fbf36cac08f03770056711f765ec1503972060" + +[[packages]] +name = "pywin32-ctypes" +version = "0.2.3" + +[[packages.wheels]] +name = "pywin32_ctypes-0.2.3-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/de/3d/8161f7711c017e01ac9f008dfddd9410dff3674334c233bde66e7ba65bbf/pywin32_ctypes-0.2.3-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "8a1513379d709975552d202d942d9837758905c8d01eb82b8bcc30918929e7b8" + +[[packages]] +name = "pywinpty" +version = "2.0.15" + +[[packages.wheels]] +name = "pywinpty-2.0.15-cp312-cp312-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/88/e5/9714def18c3a411809771a3fbcec70bffa764b9675afb00048a620fca604/pywinpty-2.0.15-cp312-cp312-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "83a8f20b430bbc5d8957249f875341a60219a4e971580f2ba694fbfb54a45ebc" + +[[packages]] +name = "pyyaml" +version = "6.0.2" + +[[packages.wheels]] +name = "PyYAML-6.0.2-cp312-cp312-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/0c/e8/4f648c598b17c3d06e8753d7d13d57542b30d56e6c2dedf9c331ae56312e/PyYAML-6.0.2-cp312-cp312-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "7e7401d0de89a9a855c839bc697c079a4af81cf878373abd7dc625847d25cbd8" + +[[packages]] +name = "pyzmq" +version = "26.4.0" + +[[packages.wheels]] +name = "pyzmq-26.4.0-cp312-cp312-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/30/0f/55f8c02c182856743b82dde46b2dc3e314edda7f1098c12a8227eeda0833/pyzmq-26.4.0-cp312-cp312-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "056a97aab4064f526ecb32f4343917a4022a5d9efb6b9df990ff72e1879e40be" + +[[packages]] +name = "qdarkstyle" +version = "3.2.3" + +[[packages.wheels]] +name = "QDarkStyle-3.2.3-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/93/7d/c3c10498430dadcea4def5faddf71cd199e577d20a125e7ef1e9d7bdbbfa/QDarkStyle-3.2.3-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "ea980ee426d594909cf1058306832af71ff6cbad6f69237b036d1550635aefbc" + +[[packages]] +name = "qdldl" +version = "0.1.7.post5" + +[[packages.wheels]] +name = "qdldl-0.1.7.post5-cp312-cp312-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/c1/82/730d0d2c6093c4dc574947eea94e0cddeea836f43823a80fc8b064a82ddf/qdldl-0.1.7.post5-cp312-cp312-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "13dfc0b225a5c180512488fa51f1771e8fa3c06d7fce9fd3c1d018bc03ba0eec" + +[[packages]] +name = "qrcode" +version = "8.0" + +[[packages.wheels]] +name = "qrcode-8.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/74/ab/df8d889fd01139db68ae9e5cb5c8f0ea016823559a6ecb427582d52b07dc/qrcode-8.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "9fc05f03305ad27a709eb742cf3097fa19e6f6f93bb9e2f039c0979190f6f1b1" + +[[packages]] +name = "qstylizer" +version = "0.2.4" + +[[packages.wheels]] +name = "qstylizer-0.2.4-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/2d/ba/2a4e51861942c2bc3be60400c69f6713359c3e307aee4696f2ea47f35811/qstylizer-0.2.4-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "8f384dfe86f9edb0bb596b93663a51f124f0794b94fd54057cc7cf9cea59fb6f" + +[[packages]] +name = "qtawesome" +version = "1.4.0" + +[[packages.wheels]] +name = "qtawesome-1.4.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/a5/ee/6e6c6715129c929af2d95ddb2e9decf54c1beffe58f336911197aacc0448/qtawesome-1.4.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "a4d689fa071c595aa6184171ce1f0f847677cb8d2db45382c43129f1d72a3d93" + +[[packages]] +name = "qtconsole" +version = "5.6.1" + +[[packages.wheels]] +name = "qtconsole-5.6.1-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/c6/8a/635610fb6131bc702229e2780d7b042416866ab78f8ed1ff24c4b23a2f4c/qtconsole-5.6.1-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "3d22490d9589bace566ad4f3455b61fa2209156f40e87e19e2c3cb64e9264950" + +[[packages]] +name = "qtpy" +version = "2.4.3" + +[[packages.wheels]] +name = "QtPy-2.4.3-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/69/76/37c0ccd5ab968a6a438f9c623aeecc84c202ab2fabc6a8fd927580c15b5a/QtPy-2.4.3-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "72095afe13673e017946cc258b8d5da43314197b741ed2890e563cf384b51aa1" + +[[packages]] +name = "quantecon" +version = "0.7.2" + +[[packages.wheels]] +name = "quantecon-0.7.2-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/77/1b/75e44bd482abe2e87dcbead8cfd99b8fa6582fdc0906967c34f64abfdf13/quantecon-0.7.2-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "d1333ca7bc3046efe3655d9eeeefb299051b00870b8608cb5bc0b88e3bdb8b67" + +[[packages]] +name = "quart" +version = "0.20.0" + +[[packages.wheels]] +name = "quart-0.20.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/7e/e9/cc28f21f52913adf333f653b9e0a3bf9cb223f5083a26422968ba73edd8d/quart-0.20.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "003c08f551746710acb757de49d9b768986fd431517d0eb127380b656b98b8f1" + +[[packages]] +name = "rapidfuzz" +version = "3.13.0" + +[[packages.wheels]] +name = "rapidfuzz-3.13.0-cp312-cp312-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/03/25/5ee7ab6841ca668567d0897905eebc79c76f6297b73bf05957be887e9c74/rapidfuzz-3.13.0-cp312-cp312-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "6e2065f68fb1d0bf65adc289c1bdc45ba7e464e406b319d67bb54441a1b9da9e" + +[[packages]] +name = "readme-renderer" +version = "44.0" + +[[packages.wheels]] +name = "readme_renderer-44.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/e1/67/921ec3024056483db83953ae8e48079ad62b92db7880013ca77632921dd0/readme_renderer-44.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "2fbca89b81a08526aadf1357a8c2ae889ec05fb03f5da67f9769c9a592166151" + +[[packages]] +name = "redis" +version = "5.2.1" + +[[packages.wheels]] +name = "redis-5.2.1-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/3c/5f/fa26b9b2672cbe30e07d9a5bdf39cf16e3b80b42916757c5f92bca88e4ba/redis-5.2.1-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "ee7e1056b9aea0f04c6c2ed59452947f34c4940ee025f5dd83e6a6418b6989e4" + +[[packages]] +name = "referencing" +version = "0.36.2" + +[[packages.wheels]] +name = "referencing-0.36.2-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/c1/b1/3baf80dc6d2b7bc27a95a67752d0208e410351e3feb4eb78de5f77454d8d/referencing-0.36.2-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "e8699adbbf8b5c7de96d8ffa0eb5c158b3beafce084968e2ea8bb08c6794dcd0" + +[[packages]] +name = "regex" +version = "2024.11.6" + +[[packages.wheels]] +name = "regex-2024.11.6-cp312-cp312-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/38/ec/ad2d7de49a600cdb8dd78434a1aeffe28b9d6fc42eb36afab4a27ad23384/regex-2024.11.6-cp312-cp312-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "a93c194e2df18f7d264092dc8539b8ffb86b45b899ab976aa15d48214138e81b" + +[[packages]] +name = "reportlab" +version = "4.3.1" + +[[packages.wheels]] +name = "reportlab-4.3.1-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/ce/6b/42805895ed08a314a01be6110584b5d059328386988ddbc4f8f10014d30e/reportlab-4.3.1-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "0f37dd16652db3ef84363cf744632a28c38bd480d5bf94683466852d7bb678dd" + +[[packages]] +name = "requests" +version = "2.32.3" + +[[packages.wheels]] +name = "requests-2.32.3-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/f9/9b/335f9764261e915ed497fcdeb11df5dfd6f7bf257d4a6a2a686d80da4d54/requests-2.32.3-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6" + +[[packages]] +name = "requests-ntlm" +version = "1.3.0" + +[[packages.wheels]] +name = "requests_ntlm-1.3.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/9e/5d/836b97537a390cf811b0488490c389c5a614f0a93acb23f347bd37a2d914/requests_ntlm-1.3.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "4c7534a7d0e482bb0928531d621be4b2c74ace437e88c5a357ceb7452d25a510" + +[[packages]] +name = "requests-toolbelt" +version = "1.0.0" + +[[packages.wheels]] +name = "requests_toolbelt-1.0.0-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/3f/51/d4db610ef29373b879047326cbf6fa98b6c1969d6f6dc423279de2b1be2c/requests_toolbelt-1.0.0-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "cccfdd665f0a24fcf4726e690f65639d272bb0637b9b92dfd91a5568ccf6bd06" + +[[packages]] +name = "rfc3339-validator" +version = "0.1.4" + +[[packages.wheels]] +name = "rfc3339_validator-0.1.4-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/7b/44/4e421b96b67b2daff264473f7465db72fbdf36a07e05494f50300cc7b0c6/rfc3339_validator-0.1.4-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "24f6ec1eda14ef823da9e36ec7113124b39c04d50a4d3d3a3c2859577e7791fa" + +[[packages]] +name = "rfc3986" +version = "2.0.0" + +[[packages.wheels]] +name = "rfc3986-2.0.0-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/ff/9a/9afaade874b2fa6c752c36f1548f718b5b83af81ed9b76628329dab81c1b/rfc3986-2.0.0-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "50b1502b60e289cb37883f3dfd34532b8873c7de9f49bb546641ce9cbd256ebd" + +[[packages]] +name = "rfc3986-validator" +version = "0.1.1" + +[[packages.wheels]] +name = "rfc3986_validator-0.1.1-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/9e/51/17023c0f8f1869d8806b979a2bffa3f861f26a3f1a66b094288323fba52f/rfc3986_validator-0.1.1-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "2f235c432ef459970b4306369336b9d5dbdda31b510ca1e327636e01f528bfa9" + +[[packages]] +name = "rich" +version = "14.0.0" + +[[packages.wheels]] +name = "rich-14.0.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/0d/9b/63f4c7ebc259242c89b3acafdb37b41d1185c07ff0011164674e9076b491/rich-14.0.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "1c9491e1951aac09caffd42f448ee3d04e58923ffe14993f6e83068dc395d7e0" + +[[packages]] +name = "rope" +version = "1.13.0" + +[[packages.wheels]] +name = "rope-1.13.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/a0/d0/e213e5adfa162e437dff3669131dc476043fc3a22fe99ef891516100610d/rope-1.13.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "b435a0c0971244fdcd8741676a9fae697ae614c20cc36003678a7782f25c0d6c" + +[[packages]] +name = "rpds-py" +version = "0.24.0" + +[[packages.wheels]] +name = "rpds_py-0.24.0-cp312-cp312-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/bb/46/b8b5424d1d21f2f2f3f2d468660085318d4f74a8df8289e3dd6ad224d488/rpds_py-0.24.0-cp312-cp312-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "998c01b8e71cf051c28f5d6f1187abbdf5cf45fc0efce5da6c06447cba997034" + +[[packages]] +name = "rsa" +version = "4.7.2" + +[[packages.wheels]] +name = "rsa-4.7.2-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/e9/93/0c0f002031f18b53af7a6166103c02b9c0667be528944137cc954ec921b3/rsa-4.7.2-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "78f9a9bf4e7be0c5ded4583326e7461e3a3c5aae24073648b4bdfa797d78c9d2" + +[[packages]] +name = "rtree" +version = "1.4.0" + +[[packages.wheels]] +name = "rtree-1.4.0-py3-none-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/ce/c2/362f2cc36a7a57b47380061c23fc109c7222c1a544ffd24cda289ba19673/rtree-1.4.0-py3-none-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "ba83efc7b7563905b1bfdfc14490c4bfb59e92e5e6156bdeb6ec5df5117252f4" + +[[packages]] +name = "rx" +version = "3.2.0" + +[[packages.wheels]] +name = "Rx-3.2.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/e2/a9/efeaeca4928a9a56d04d609b5730994d610c82cf4d9dd7aa173e6ef4233e/Rx-3.2.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "922c5f4edb3aa1beaa47bf61d65d5380011ff6adcd527f26377d05cb73ed8ec8" + +[[packages]] +name = "scikit-image" +version = "0.25.2" + +[[packages.wheels]] +name = "scikit_image-0.25.2-cp312-cp312-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/34/e3/49beb08ebccda3c21e871b607c1cb2f258c3fa0d2f609fed0a5ba741b92d/scikit_image-0.25.2-cp312-cp312-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "bdd2b8c1de0849964dbc54037f36b4e9420157e67e45a8709a80d727f52c7da2" + +[[packages]] +name = "scikit-learn" +version = "1.6.1" + +[[packages.wheels]] +name = "scikit_learn-1.6.1-cp312-cp312-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/62/27/585859e72e117fe861c2079bcba35591a84f801e21bc1ab85bce6ce60305/scikit_learn-1.6.1-cp312-cp312-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "70b1d7e85b1c96383f872a519b3375f92f14731e279a7b4c6cfd650cf5dffc52" + +[[packages]] +name = "scipy" +version = "1.15.3" + +[[packages.wheels]] +name = "scipy-1.15.3-cp312-cp312-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/e6/eb/3bf6ea8ab7f1503dca3a10df2e4b9c3f6b3316df07f6c0ded94b281c7101/scipy-1.15.3-cp312-cp312-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "52092bc0472cfd17df49ff17e70624345efece4e1a12b23783a1ac59a1b728ed" + +[[packages]] +name = "scramp" +version = "1.4.5" + +[[packages.wheels]] +name = "scramp-1.4.5-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/d9/9f/8b2f2749ccfbe4fcef08650896ac47ed919ff25b7ac57b7a1ae7da16c8c3/scramp-1.4.5-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "50e37c464fc67f37994e35bee4151e3d8f9320e9c204fca83a5d313c121bbbe7" + +[[packages]] +name = "scs" +version = "3.2.7.post2" + +[[packages.wheels]] +name = "scs-3.2.7.post2-cp312-cp312-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/30/49/1645fa1219493ac94475ab8f48a2520d2fc27f486327f2b0f167440a8188/scs-3.2.7.post2-cp312-cp312-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "2995d4099943c3fd754b3e39fe178a9c03dcb9c7d84b40f64ac5eb26d8d6085a" + +[[packages]] +name = "seaborn" +version = "0.13.2" + +[[packages.wheels]] +name = "seaborn-0.13.2-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/83/11/00d3c3dfc25ad54e731d91449895a79e4bf2384dc3ac01809010ba88f6d5/seaborn-0.13.2-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "636f8336facf092165e27924f223d3c62ca560b1f2bb5dff7ab7fad265361987" + +[[packages]] +name = "send2trash" +version = "1.8.3" + +[[packages.wheels]] +name = "Send2Trash-1.8.3-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/40/b0/4562db6223154aa4e22f939003cb92514c79f3d4dccca3444253fd17f902/Send2Trash-1.8.3-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "0c31227e0bd08961c7665474a3d1ef7193929fedda4233843689baa056be46c9" + +[[packages]] +name = "setuptools" +version = "79.0.1" + +[[packages.wheels]] +name = "setuptools-79.0.1-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/0d/6d/b4752b044bf94cb802d88a888dc7d288baaf77d7910b7dedda74b5ceea0c/setuptools-79.0.1-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "e147c0549f27767ba362f9da434eab9c5dc0045d5304feb602a0af001089fc51" + +[[packages]] +name = "shapely" +version = "2.1.0" + +[[packages.wheels]] +name = "shapely-2.1.0-cp312-cp312-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/b8/bd/9249bd6dda948441e25e4fb14cbbb5205146b0fff12c66b19331f1ff2141/shapely-2.1.0-cp312-cp312-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "f4f47e631aa4f9ec5576eac546eb3f38802e2f82aeb0552f9612cb9a14ece1db" + +[[packages]] +name = "shellingham" +version = "1.5.4" + +[[packages.wheels]] +name = "shellingham-1.5.4-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/e0/f9/0595336914c5619e5f28a1fb793285925a8cd4b432c9da0a987836c7f822/shellingham-1.5.4-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "7ecfff8f2fd72616f7481040475a65b2bf8af90a56c89140852d1120324e8686" + +[[packages]] +name = "simplejson" +version = "3.19.3" + +[[packages.wheels]] +name = "simplejson-3.19.3-cp312-cp312-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/fe/68/9f0e5df0651cb79ef83cba1378765a00ee8038e6201cc82b8e7178a7778e/simplejson-3.19.3-cp312-cp312-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "1e662336db50ad665777e6548b5076329a94a0c3d4a0472971c588b3ef27de3a" + +[[packages]] +name = "simpy" +version = "4.1.1" + +[[packages.wheels]] +name = "simpy-4.1.1-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/48/72/920ed1224c94a8a5a69e6c1275ac7fe4eb911ba8feffddf469f1629d47f3/simpy-4.1.1-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "7c5ae380240fd2238671160e4830956f8055830a8317edf5c05e495b3823cd88" + +[[packages]] +name = "six" +version = "1.17.0" + +[[packages.wheels]] +name = "six-1.17.0-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274" + +[[packages]] +name = "sklearn-compat" +version = "0.1.3" + +[[packages.wheels]] +name = "sklearn_compat-0.1.3-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/f0/a8/ad69cf130fbd017660cdd64abbef3f28135d9e2e15fe3002e03c5be0ca38/sklearn_compat-0.1.3-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "a8aaf8ef711988cbd63f187c5560b5f16b25df663aaa1d2d0e1291341d339f80" + +[[packages]] +name = "skrub" +version = "0.5.3" + +[[packages.wheels]] +name = "skrub-0.5.3-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/80/cf/5a1e0dabfa3cad1ab9b09e690fede4aa8fdc0c04d9d7ec8aa9338d56e1e4/skrub-0.5.3-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "b6ba417fa83d1f7e9a69656e0860b061381b9bd19808692a2b5bef8588c72775" + +[[packages]] +name = "smmap" +version = "5.0.2" + +[[packages.wheels]] +name = "smmap-5.0.2-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/04/be/d09147ad1ec7934636ad912901c5fd7667e1c858e19d355237db0d0cd5e4/smmap-5.0.2-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "b30115f0def7d7531d22a0fb6502488d879e75b260a9db4d0819cfb25403af5e" + +[[packages]] +name = "sniffio" +version = "1.3.1" + +[[packages.wheels]] +name = "sniffio-1.3.1-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/e9/44/75a9c9421471a6c4805dbf2356f7c181a29c1879239abab1ea2cc8f38b40/sniffio-1.3.1-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2" + +[[packages]] +name = "snowballstemmer" +version = "2.2.0" + +[[packages.wheels]] +name = "snowballstemmer-2.2.0-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/ed/dc/c02e01294f7265e63a7315fe086dd1df7dacb9f840a804da846b96d01b96/snowballstemmer-2.2.0-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "c8e1716e83cc398ae16824e5572ae04e0d9fc2c6b985fb0f900f5f0c96ecba1a" + +[[packages]] +name = "sortedcontainers" +version = "2.4.0" + +[[packages.wheels]] +name = "sortedcontainers-2.4.0-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/32/46/9cb0e58b2deb7f82b84065f37f3bffeb12413f947f9388e4cac22c4621ce/sortedcontainers-2.4.0-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "a163dcaede0f1c021485e957a39245190e74249897e2ae4b2aa38595db237ee0" + +[[packages]] +name = "sounddevice" +version = "0.5.1" + +[[packages.wheels]] +name = "sounddevice-0.5.1-py3-none-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/af/9b/15217b04f3b36d30de55fef542389d722de63f1ad81f9c72d8afc98cb6ab/sounddevice-0.5.1-py3-none-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "4313b63f2076552b23ac3e0abd3bcfc0c1c6a696fc356759a13bd113c9df90f1" + +[[packages]] +name = "soupsieve" +version = "2.6" + +[[packages.wheels]] +name = "soupsieve-2.6-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/d1/c2/fe97d779f3ef3b15f05c94a2f1e3d21732574ed441687474db9d342a7315/soupsieve-2.6-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "e72c4ff06e4fb6e4b5a9f0f55fe6e81514581fca1515028625d0f299c602ccc9" + +[[packages]] +name = "sphinx" +version = "8.1.3" + +[[packages.wheels]] +name = "sphinx-8.1.3-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/26/60/1ddff83a56d33aaf6f10ec8ce84b4c007d9368b21008876fceda7e7381ef/sphinx-8.1.3-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "09719015511837b76bf6e03e42eb7595ac8c2e41eeb9c29c5b755c6b677992a2" + +[[packages]] +name = "sphinx-rtd-theme" +version = "3.0.2" + +[[packages.wheels]] +name = "sphinx_rtd_theme-3.0.2-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/85/77/46e3bac77b82b4df5bb5b61f2de98637724f246b4966cfc34bc5895d852a/sphinx_rtd_theme-3.0.2-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "422ccc750c3a3a311de4ae327e82affdaf59eb695ba4936538552f3b00f4ee13" + +[[packages]] +name = "sphinxcontrib-applehelp" +version = "2.0.0" + +[[packages.wheels]] +name = "sphinxcontrib_applehelp-2.0.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/5d/85/9ebeae2f76e9e77b952f4b274c27238156eae7979c5421fba91a28f4970d/sphinxcontrib_applehelp-2.0.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "4cd3f0ec4ac5dd9c17ec65e9ab272c9b867ea77425228e68ecf08d6b28ddbdb5" + +[[packages]] +name = "sphinxcontrib-devhelp" +version = "2.0.0" + +[[packages.wheels]] +name = "sphinxcontrib_devhelp-2.0.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/35/7a/987e583882f985fe4d7323774889ec58049171828b58c2217e7f79cdf44e/sphinxcontrib_devhelp-2.0.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "aefb8b83854e4b0998877524d1029fd3e6879210422ee3780459e28a1f03a8a2" + +[[packages]] +name = "sphinxcontrib-htmlhelp" +version = "2.1.0" + +[[packages.wheels]] +name = "sphinxcontrib_htmlhelp-2.1.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/0a/7b/18a8c0bcec9182c05a0b3ec2a776bba4ead82750a55ff798e8d406dae604/sphinxcontrib_htmlhelp-2.1.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "166759820b47002d22914d64a075ce08f4c46818e17cfc9470a9786b759b19f8" + +[[packages]] +name = "sphinxcontrib-jquery" +version = "4.1" + +[[packages.wheels]] +name = "sphinxcontrib_jquery-4.1-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/76/85/749bd22d1a68db7291c89e2ebca53f4306c3f205853cf31e9de279034c3c/sphinxcontrib_jquery-4.1-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "f936030d7d0147dd026a4f2b5a57343d233f1fc7b363f68b3d4f1cb0993878ae" + +[[packages]] +name = "sphinxcontrib-jsmath" +version = "1.0.1" + +[[packages.wheels]] +name = "sphinxcontrib_jsmath-1.0.1-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/c2/42/4c8646762ee83602e3fb3fbe774c2fac12f317deb0b5dbeeedd2d3ba4b77/sphinxcontrib_jsmath-1.0.1-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "2ec2eaebfb78f3f2078e73666b1415417a116cc848b72e5172e596c871103178" + +[[packages]] +name = "sphinxcontrib-qthelp" +version = "2.0.0" + +[[packages.wheels]] +name = "sphinxcontrib_qthelp-2.0.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/27/83/859ecdd180cacc13b1f7e857abf8582a64552ea7a061057a6c716e790fce/sphinxcontrib_qthelp-2.0.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "b18a828cdba941ccd6ee8445dbe72ffa3ef8cbe7505d8cd1fa0d42d3f2d5f3eb" + +[[packages]] +name = "sphinxcontrib-serializinghtml" +version = "2.0.0" + +[[packages.wheels]] +name = "sphinxcontrib_serializinghtml-2.0.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/52/a7/d2782e4e3f77c8450f727ba74a8f12756d5ba823d81b941f1b04da9d033a/sphinxcontrib_serializinghtml-2.0.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "6e2cb0eef194e10c27ec0023bfeb25badbbb5868244cf5bc5bdc04e4464bf331" + +[[packages]] +name = "spyder" +version = "6.0.7" + +[[packages.wheels]] +name = "spyder-6.0.7-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/ee/c8/1568fa96351ddad878d42e7487d9637604c7f34030171acf810f47914d9d/spyder-6.0.7-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "b725569bb8ddc7b0aab73d747d85312dc0456978370cc0f9b1a101c0fe4f076b" + +[[packages]] +name = "spyder-kernels" +version = "3.0.5" + +[[packages.wheels]] +name = "spyder_kernels-3.0.5-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/10/2d/b1c88e914ebdec2a9cf066b2c283ee234f4052c31922017407fa8adb89f3/spyder_kernels-3.0.5-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "9cc808e0ec4426b9ba911128e221fa2234e6c8d6e08526132e90112ff9c2bb7c" + +[[packages]] +name = "sqlalchemy" +version = "2.0.40" + +[[packages.wheels]] +name = "sqlalchemy-2.0.40-cp312-cp312-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/2a/9f/14c511cda174aa1ad9b0e42b64ff5a71db35d08b0d80dc044dae958921e5/sqlalchemy-2.0.40-cp312-cp312-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "2be94d75ee06548d2fc591a3513422b873490efb124048f50556369a834853b0" + +[[packages]] +name = "sqlite-bro" +version = "0.13.1" + +[[packages.wheels]] +name = "sqlite_bro-0.13.1-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/2a/b3/81b91f5b26fff329c59dbf826a87637bd51d1903120427912322f86e7d33/sqlite_bro-0.13.1-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "c26033b0af133049ca578b5fd30b2372f002e7ff934b39774aa4d2da7638c23d" + +[[packages]] +name = "sqlite-fts4" +version = "1.0.3" + +[[packages.wheels]] +name = "sqlite_fts4-1.0.3-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/51/29/0096e8b1811aaa78cfb296996f621f41120c21c2f5cd448ae1d54979d9fc/sqlite_fts4-1.0.3-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "0359edd8dea6fd73c848989e1e2b1f31a50fe5f9d7272299ff0e8dbaa62d035f" + +[[packages]] +name = "sqlite-utils" +version = "3.38" + +[[packages.wheels]] +name = "sqlite_utils-3.38-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/4d/eb/f8e8e827805f810838efff3311cccd2601238c5fa3fc35c1f878709e161b/sqlite_utils-3.38-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "8a27441015c3b2ef475f555861f7a2592f73bc60d247af9803a11b65fc605bf9" + +[[packages]] +name = "sqlparse" +version = "0.5.3" + +[[packages.wheels]] +name = "sqlparse-0.5.3-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/a9/5c/bfd6bd0bf979426d405cc6e71eceb8701b148b16c21d2dc3c261efc61c7b/sqlparse-0.5.3-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "cf2196ed3418f3ba5de6af7e82c694a9fbdbfecccdfc72e281548517081f16ca" + +[[packages]] +name = "squarify" +version = "0.4.4" + +[[packages.wheels]] +name = "squarify-0.4.4-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/b7/3c/eedbe9fb07cc20fd9a8423da14b03bc270d0570b3ba9174a4497156a2152/squarify-0.4.4-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "d7597724e29d48aa14fd2f551060d6b09e1f0a67e4cd3ea329fe03b4c9a56f11" + +[[packages]] +name = "sse-starlette" +version = "2.2.1" + +[[packages.wheels]] +name = "sse_starlette-2.2.1-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/d9/e0/5b8bd393f27f4a62461c5cf2479c75a2cc2ffa330976f9f00f5f6e4f50eb/sse_starlette-2.2.1-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "6410a3d3ba0c89e7675d4c273a301d64649c03a5ef1ca101f10b47f895fd0e99" + +[[packages]] +name = "sspilib" +version = "0.2.0" + +[[packages.wheels]] +name = "sspilib-0.2.0-cp312-cp312-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/38/54/949a9e9c07cd6efead79a7f78cc951cb5fa4f9f1fcb25b8520fd2adcdbe0/sspilib-0.2.0-cp312-cp312-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "40a97ca83e503a175d1dc9461836994e47e8b9bcf56cab81a2c22e27f1993079" + +[[packages]] +name = "stack-data" +version = "0.6.3" + +[[packages.wheels]] +name = "stack_data-0.6.3-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/f1/7b/ce1eafaf1a76852e2ec9b22edecf1daa58175c090266e9f6c64afcd81d91/stack_data-0.6.3-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "d5558e0c25a4cb0853cddad3d77da9891a08cb85dd9f9f91b9f8cd66e511e695" + +[[packages]] +name = "starlette" +version = "0.46.2" + +[[packages.wheels]] +name = "starlette-0.46.2-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/8b/0c/9d30a4ebeb6db2b25a841afbb80f6ef9a854fc3b41be131d249a977b4959/starlette-0.46.2-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "595633ce89f8ffa71a015caed34a5b2dc1c0cdb3f0f1fbd1e69339cf2abeec35" + +[[packages]] +name = "statsmodels" +version = "0.14.4" + +[[packages.wheels]] +name = "statsmodels-0.14.4-cp312-cp312-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/59/9a/e466a1b887a1441141e52dbcc98152f013d85076576da6eed2357f2016ae/statsmodels-0.14.4-cp312-cp312-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "7f7917a51766b4e074da283c507a25048ad29a18e527207883d73535e0dc6184" + +[[packages]] +name = "streamlit" +version = "1.46.0" + +[[packages.wheels]] +name = "streamlit-1.46.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/be/26/79bbb77bec3d605f7de7a4b45c806b44d112e8c9bce77fb620e03d9f2b88/streamlit-1.46.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "f8624acabafcf18611a0fac2635cf181a7ba922b45bd131ae15fc8f80e1a5482" + +[[packages]] +name = "superqt" +version = "0.7.3" + +[[packages.wheels]] +name = "superqt-0.7.3-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/4f/53/ce8e705a0fca9ff08406d0232409c6dacd09a04cdc5124e33aa3ad97c117/superqt-0.7.3-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "8f7d141665b31baa484747f324fc9fc2d14223f2fefc92ffed6ea35c92221304" + +[[packages]] +name = "sv-ttk" +version = "2.6.0" + +[[packages.wheels]] +name = "sv_ttk-2.6.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/0f/3d/be0abc3202e90f282ad465f4e7c6e41bc8dce810ce5d1611566a1e7dfba8/sv_ttk-2.6.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "4319c52edf2e14732fe84bdc9788e26f9e9a1ad79451ec0f89f0120ffc8105d9" + +[[packages]] +name = "sympy" +version = "1.14.0" + +[[packages.wheels]] +name = "sympy-1.14.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/a2/09/77d55d46fd61b4a135c444fc97158ef34a095e5681d0a6c10b75bf356191/sympy-1.14.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "e091cc3e99d2141a0ba2847328f5479b05d94a6635cb96148ccb3f34671bd8f5" + +[[packages]] +name = "tabulate" +version = "0.9.0" + +[[packages.wheels]] +name = "tabulate-0.9.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/40/44/4a5f08c96eb108af5cb50b41f76142f0afa346dfa99d5296fe7202a11854/tabulate-0.9.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "024ca478df22e9340661486f85298cff5f6dcdba14f3813e8830015b9ed1948f" + +[[packages]] +name = "tblib" +version = "3.1.0" + +[[packages.wheels]] +name = "tblib-3.1.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/27/44/aa5c8b10b2cce7a053018e0d132bd58e27527a0243c4985383d5b6fd93e9/tblib-3.1.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "670bb4582578134b3d81a84afa1b016128b429f3d48e6cbbaecc9d15675e984e" + +[[packages]] +name = "tenacity" +version = "9.1.2" + +[[packages.wheels]] +name = "tenacity-9.1.2-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/e5/30/643397144bfbfec6f6ef821f36f33e57d35946c44a2352d3c9f0ae847619/tenacity-9.1.2-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "f77bf36710d8b73a50b2dd155c97b870017ad21afe6ab300326b0371b3b05138" + +[[packages]] +name = "termcolor" +version = "3.1.0" + +[[packages.wheels]] +name = "termcolor-3.1.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/4f/bd/de8d508070629b6d84a30d01d57e4a65c69aa7f5abe7560b8fad3b50ea59/termcolor-3.1.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "591dd26b5c2ce03b9e43f391264626557873ce1d379019786f99b0c2bee140aa" + +[[packages]] +name = "terminado" +version = "0.18.1" + +[[packages.wheels]] +name = "terminado-0.18.1-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/6a/9e/2064975477fdc887e47ad42157e214526dcad8f317a948dee17e1659a62f/terminado-0.18.1-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "a4468e1b37bb318f8a86514f65814e1afc977cf29b3992a4500d9dd305dcceb0" + +[[packages]] +name = "text-unidecode" +version = "1.3" + +[[packages.wheels]] +name = "text_unidecode-1.3-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/a6/a5/c0b6468d3824fe3fde30dbb5e1f687b291608f9473681bbf7dabbf5a87d7/text_unidecode-1.3-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "1311f10e8b895935241623731c2ba64f4c455287888b18189350b67134a822e8" + +[[packages]] +name = "textdistance" +version = "4.6.3" + +[[packages.wheels]] +name = "textdistance-4.6.3-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/c6/c2/c62601c858010b0513a6434b9be19bd740533a6e861eddfd30b7258d92a0/textdistance-4.6.3-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "0cb1b2cc8e3339ddc3e0f8c870e49fb49de6ecc42a718917308b3c971f34aa56" + +[[packages]] +name = "thefuzz" +version = "0.22.1" + +[[packages.wheels]] +name = "thefuzz-0.22.1-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/82/4f/1695e70ceb3604f19eda9908e289c687ea81c4fecef4d90a9d1d0f2f7ae9/thefuzz-0.22.1-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "59729b33556850b90e1093c4cf9e618af6f2e4c985df193fdf3c5b5cf02ca481" + +[[packages]] +name = "threadpoolctl" +version = "3.6.0" + +[[packages.wheels]] +name = "threadpoolctl-3.6.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/32/d5/f9a850d79b0851d1d4ef6456097579a9005b31fea68726a4ae5f2d82ddd9/threadpoolctl-3.6.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "43a0b8fd5a2928500110039e43a5eed8480b918967083ea48dc3ab9f13c4a7fb" + +[[packages]] +name = "three-merge" +version = "0.1.1" + +[[packages.wheels]] +name = "three_merge-0.1.1-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/23/be/a52588102605ec52b4e88340d65a290b6465c1dbcd2d943ab149b012908b/three_merge-0.1.1-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "dd219f4696aa0bbec6099ac3528b4de0450ff9bde862dd8f6d6f52e745f83464" + +[[packages]] +name = "tifffile" +version = "2025.3.30" + +[[packages.wheels]] +name = "tifffile-2025.3.30-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/6e/be/10d23cfd4078fbec6aba768a357eff9e70c0b6d2a07398425985c524ad2a/tifffile-2025.3.30-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "0ed6eee7b66771db2d1bfc42262a51b01887505d35539daef118f4ff8c0f629c" + +[[packages]] +name = "tiktoken" +version = "0.9.0" + +[[packages.wheels]] +name = "tiktoken-0.9.0-cp312-cp312-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/5b/64/b16003419a1d7728d0d8c0d56a4c24325e7b10a21a9dd1fc0f7115c02f0a/tiktoken-0.9.0-cp312-cp312-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "5a62d7a25225bafed786a524c1b9f0910a1128f4232615bf3f8257a73aaa3b16" + +[[packages]] +name = "tinycss2" +version = "1.4.0" + +[[packages.wheels]] +name = "tinycss2-1.4.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/e6/34/ebdc18bae6aa14fbee1a08b63c015c72b64868ff7dae68808ab500c492e2/tinycss2-1.4.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "3a49cf47b7675da0b15d0c6e1df8df4ebd96e9394bb905a5775adb0d884c5289" + +[[packages]] +name = "tokenizers" +version = "0.21.1" + +[[packages.wheels]] +name = "tokenizers-0.21.1-cp39-abi3-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/e6/b6/072a8e053ae600dcc2ac0da81a23548e3b523301a442a6ca900e92ac35be/tokenizers-0.21.1-cp39-abi3-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "0f0dcbcc9f6e13e675a66d7a5f2f225a736745ce484c1a4e07476a89ccdad382" + +[[packages]] +name = "toml" +version = "0.10.2" + +[[packages.wheels]] +name = "toml-0.10.2-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/44/6f/7120676b6d73228c96e17f1f794d8ab046fc910d781c8d151120c3f1569e/toml-0.10.2-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b" + +[[packages]] +name = "tomli" +version = "2.2.1" + +[[packages.wheels]] +name = "tomli-2.2.1-cp312-cp312-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/ef/60/9b9638f081c6f1261e2688bd487625cd1e660d0a85bd469e91d8db969734/tomli-2.2.1-cp312-cp312-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "7fc04e92e1d624a4a63c76474610238576942d6b8950a2d7f908a340494e67e4" + +[[packages]] +name = "tomli-w" +version = "1.2.0" + +[[packages.wheels]] +name = "tomli_w-1.2.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/c7/18/c86eb8e0202e32dd3df50d43d7ff9854f8e0603945ff398974c1d91ac1ef/tomli_w-1.2.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "188306098d013b691fcadc011abd66727d3c414c571bb01b1a174ba8c983cf90" + +[[packages]] +name = "tomlkit" +version = "0.13.2" + +[[packages.wheels]] +name = "tomlkit-0.13.2-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/f9/b6/a447b5e4ec71e13871be01ba81f5dfc9d0af7e473da256ff46bc0e24026f/tomlkit-0.13.2-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "7a974427f6e119197f670fbbbeae7bef749a6c14e793db934baefc1b5f03efde" + +[[packages]] +name = "toolz" +version = "1.0.0" + +[[packages.wheels]] +name = "toolz-1.0.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/03/98/eb27cc78ad3af8e302c9d8ff4977f5026676e130d28dd7578132a457170c/toolz-1.0.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "292c8f1c4e7516bf9086f8850935c799a874039c8bcf959d47b600e4c44a6236" + +[[packages]] +name = "tornado" +version = "6.5.1" + +[[packages.wheels]] +name = "tornado-6.5.1-cp39-abi3-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/7b/09/6526e32bf1049ee7de3bebba81572673b19a2a8541f795d887e92af1a8bc/tornado-6.5.1-cp39-abi3-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "908e7d64567cecd4c2b458075589a775063453aeb1d2a1853eedb806922f568b" + +[[packages]] +name = "tqdm" +version = "4.67.1" + +[[packages.wheels]] +name = "tqdm-4.67.1-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/d0/30/dc54f88dd4a2b5dc8a0279bdd7270e735851848b762aeb1c1184ed1f6b14/tqdm-4.67.1-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "26445eca388f82e72884e0d580d5464cd801a3ea01e63e5601bdff9ba6a48de2" + +[[packages]] +name = "traitlets" +version = "5.14.3" + +[[packages.wheels]] +name = "traitlets-5.14.3-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.3-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "b74e89e397b1ed28cc831db7aea759ba6640cb3de13090ca145426688ff1ac4f" + +[[packages]] +name = "traittypes" +version = "0.2.1" + +[[packages.wheels]] +name = "traittypes-0.2.1-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/9c/d1/8d5bd662703cc1764d986f6908a608777305946fa634d34c470cd4a1e729/traittypes-0.2.1-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "1340af133810b6eee1a2eb2e988f862b0d12b6c2d16f282aaf3207b782134c2e" + +[[packages]] +name = "trio" +version = "0.30.0" + +[[packages.wheels]] +name = "trio-0.30.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/69/8e/3f6dfda475ecd940e786defe6df6c500734e686c9cd0a0f8ef6821e9b2f2/trio-0.30.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "3bf4f06b8decf8d3cf00af85f40a89824669e2d033bb32469d34840edcfc22a5" + +[[packages]] +name = "trove-classifiers" +version = "2025.5.9.12" + +[[packages.wheels]] +name = "trove_classifiers-2025.5.9.12-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/92/ef/c6deb083748be3bcad6f471b6ae983950c161890bf5ae1b2af80cc56c530/trove_classifiers-2025.5.9.12-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "e381c05537adac78881c8fa345fd0e9970159f4e4a04fcc42cfd3129cca640ce" + +[[packages]] +name = "twine" +version = "6.1.0" + +[[packages.wheels]] +name = "twine-6.1.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/7c/b6/74e927715a285743351233f33ea3c684528a0d374d2e43ff9ce9585b73fe/twine-6.1.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "a47f973caf122930bf0fbbf17f80b83bc1602c9ce393c7845f289a3001dc5384" + +[[packages]] +name = "typer" +version = "0.15.2" + +[[packages.wheels]] +name = "typer-0.15.2-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/7f/fc/5b29fea8cee020515ca82cc68e3b8e1e34bb19a3535ad854cac9257b414c/typer-0.15.2-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "46a499c6107d645a9c13f7ee46c5d5096cae6f5fc57dd11eccbbb9ae3e44ddfc" + +[[packages]] +name = "types-python-dateutil" +version = "2.9.0.20240316" + +[[packages.wheels]] +name = "types_python_dateutil-2.9.0.20240316-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/c7/1b/af4f4c4f3f7339a4b7eb3c0ab13416db98f8ac09de3399129ee5fdfa282b/types_python_dateutil-2.9.0.20240316-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "6b8cb66d960771ce5ff974e9dd45e38facb81718cc1e208b10b1baccbfdbee3b" + +[[packages]] +name = "types-requests" +version = "2.32.0.20250328" + +[[packages.wheels]] +name = "types_requests-2.32.0.20250328-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/cc/15/3700282a9d4ea3b37044264d3e4d1b1f0095a4ebf860a99914fd544e3be3/types_requests-2.32.0.20250328-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "72ff80f84b15eb3aa7a8e2625fffb6a93f2ad5a0c20215fc1dcfa61117bcb2a2" + +[[packages]] +name = "typing-extensions" +version = "4.13.2" + +[[packages.wheels]] +name = "typing_extensions-4.13.2-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/8b/54/b1ae86c0973cc6f0210b53d508ca3641fb6d0c56823f288d108bc7ab3cc8/typing_extensions-4.13.2-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "a439e7c04b49fec3e5d3e2beaa21755cadbbdc391694e28ccdd36ca4a1408f8c" + +[[packages]] +name = "typing-inspection" +version = "0.4.0" + +[[packages.wheels]] +name = "typing_inspection-0.4.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/31/08/aa4fdfb71f7de5176385bd9e90852eaf6b5d622735020ad600f2bab54385/typing_inspection-0.4.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "50e72559fcd2a6367a19f7a7e610e6afcb9fac940c650290eed893d61386832f" + +[[packages]] +name = "tzdata" +version = "2025.2" + +[[packages.wheels]] +name = "tzdata-2025.2-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/5c/23/c7abc0ca0a1526a0774eca151daeb8de62ec457e77262b66b359c3c7679e/tzdata-2025.2-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "1a403fada01ff9221ca8044d701868fa132215d84beb92242d9acd2147f667a8" + +[[packages]] +name = "tzlocal" +version = "5.3.1" + +[[packages.wheels]] +name = "tzlocal-5.3.1-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/c2/14/e2a54fabd4f08cd7af1c07030603c3356b74da07f7cc056e600436edfa17/tzlocal-5.3.1-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "eb1a66c3ef5847adf7a834f1be0800581b683b5608e74f86ecbcef8ab91bb85d" + +[[packages]] +name = "uc-micro-py" +version = "1.0.3" + +[[packages.wheels]] +name = "uc_micro_py-1.0.3-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/37/87/1f677586e8ac487e29672e4b17455758fce261de06a0d086167bb760361a/uc_micro_py-1.0.3-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "db1dffff340817673d7b466ec86114a9dc0e9d4d9b5ba229d9d60e5c12600cd5" + +[[packages]] +name = "ujson" +version = "5.10.0" + +[[packages.wheels]] +name = "ujson-5.10.0-cp312-cp312-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/59/2d/691f741ffd72b6c84438a93749ac57bf1a3f217ac4b0ea4fd0e96119e118/ujson-5.10.0-cp312-cp312-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "38665e7d8290188b1e0d57d584eb8110951a9591363316dd41cf8686ab1d0abc" + +[[packages]] +name = "umap-learn" +version = "0.5.7" + +[[packages.wheels]] +name = "umap_learn-0.5.7-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/3c/8f/671c0e1f2572ba625cbcc1faeba9435e00330c3d6962858711445cf1e817/umap_learn-0.5.7-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "6a7e0be2facfa365a5ed6588447102bdbef32a0ef449535c25c97ea7e680073c" + +[[packages]] +name = "uncertainties" +version = "3.2.2" + +[[packages.wheels]] +name = "uncertainties-3.2.2-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/fa/fc/97711d2a502881d871e3cf2d2645e21e7f8e4d4fd9a56937557790cade6a/uncertainties-3.2.2-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "fd8543355952f4052786ed4150acaf12e23117bd0f5bd03ea07de466bce646e7" + +[[packages]] +name = "uri-template" +version = "1.3.0" + +[[packages.wheels]] +name = "uri_template-1.3.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/e7/00/3fca040d7cf8a32776d3d81a00c8ee7457e00f80c649f1e4a863c8321ae9/uri_template-1.3.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "a44a133ea12d44a0c0f06d7d42a52d71282e77e2f937d8abd5655b8d56fc1363" + +[[packages]] +name = "urllib3" +version = "2.4.0" + +[[packages.wheels]] +name = "urllib3-2.4.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/6b/11/cc635220681e93a0183390e26485430ca2c7b5f9d33b15c74c2861cb8091/urllib3-2.4.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "4e16665048960a0900c702d4a66415956a584919c03361cac9f1df5c5dd7e813" + +[[packages]] +name = "uvicorn" +version = "0.34.2" + +[[packages.wheels]] +name = "uvicorn-0.34.2-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/b1/4b/4cef6ce21a2aaca9d852a6e84ef4f135d99fcd74fa75105e2fc0c8308acd/uvicorn-0.34.2-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "deb49af569084536d269fe0a6d67e3754f104cf03aba7c11c40f01aadf33c403" + +[[packages]] +name = "vega-datasets" +version = "0.9.0" + +[[packages.wheels]] +name = "vega_datasets-0.9.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/e6/9f/ca52771fe972e0dcc5167fedb609940e01516066938ff2ee28b273ae4f29/vega_datasets-0.9.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "3d7c63917be6ca9b154b565f4779a31fedce57b01b5b9d99d8a34a7608062a1d" + +[[packages]] +name = "waitress" +version = "3.0.0" + +[[packages.wheels]] +name = "waitress-3.0.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/5b/a9/485c953a1ac4cb98c28e41fd2c7184072df36bbf99734a51d44d04176878/waitress-3.0.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "2a06f242f4ba0cc563444ca3d1998959447477363a2d7e9b8b4d75d35cfd1669" + +[[packages]] +name = "watchdog" +version = "6.0.0" + +[[packages.wheels]] +name = "watchdog-6.0.0-py3-none-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/db/d9/c495884c6e548fce18a8f40568ff120bc3a4b7b99813081c8ac0c936fa64/watchdog-6.0.0-py3-none-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "cbafb470cf848d93b5d013e2ecb245d4aa1c8fd0504e863ccefa32445359d680" + +[[packages]] +name = "wcwidth" +version = "0.2.13" + +[[packages.wheels]] +name = "wcwidth-0.2.13-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/fd/84/fd2ba7aafacbad3c4201d395674fc6348826569da3c0937e75505ead3528/wcwidth-0.2.13-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "3da69048e4540d84af32131829ff948f1e022c1c6bdb8d6102117aac784f6859" + +[[packages]] +name = "webcolors" +version = "24.11.1" + +[[packages.wheels]] +name = "webcolors-24.11.1-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/60/e8/c0e05e4684d13459f93d312077a9a2efbe04d59c393bc2b8802248c908d4/webcolors-24.11.1-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "515291393b4cdf0eb19c155749a096f779f7d909f7cceea072791cb9095b92e9" + +[[packages]] +name = "webencodings" +version = "0.5.1" + +[[packages.wheels]] +name = "webencodings-0.5.1-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/f4/24/2a3e3df732393fed8b3ebf2ec078f05546de641fe1b667ee316ec1dcf3b7/webencodings-0.5.1-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78" + +[[packages]] +name = "websocket-client" +version = "1.8.0" + +[[packages.wheels]] +name = "websocket_client-1.8.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/5a/84/44687a29792a70e111c5c477230a72c4b957d88d16141199bf9acb7537a3/websocket_client-1.8.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "17b44cc997f5c498e809b22cdf2d9c7a9e71c02c8cc2b6c56e7c2d1239bfa526" + +[[packages]] +name = "websockets" +version = "14.2" + +[[packages.wheels]] +name = "websockets-14.2-cp312-cp312-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/b3/7d/32cdb77990b3bdc34a306e0a0f73a1275221e9a66d869f6ff833c95b56ef/websockets-14.2-cp312-cp312-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "44bba1a956c2c9d268bdcdf234d5e5ff4c9b6dc3e300545cbe99af59dda9dcce" + +[[packages]] +name = "werkzeug" +version = "3.1.3" + +[[packages.wheels]] +name = "werkzeug-3.1.3-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/52/24/ab44c871b0f07f491e5d2ad12c9bd7358e527510618cb1b803a88e986db1/werkzeug-3.1.3-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "54b78bf3716d19a65be4fceccc0d1d7b89e608834989dfae50ea87564639213e" + +[[packages]] +name = "whatthepatch" +version = "1.0.7" + +[[packages.wheels]] +name = "whatthepatch-1.0.7-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/8e/93/af1d6ccb69ab6b5a00e03fa0cefa563f9862412667776ea15dd4eece3a90/whatthepatch-1.0.7-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "1b6f655fd31091c001c209529dfaabbabdbad438f5de14e3951266ea0fc6e7ed" + +[[packages]] +name = "wheel" +version = "0.45.1" + +[[packages.wheels]] +name = "wheel-0.45.1-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/0b/2c/87f3254fd8ffd29e4c02732eee68a83a1d3c346ae39bc6822dcbcb697f2b/wheel-0.45.1-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "708e7481cc80179af0e556bbf0cc00b8444c7321e2700b8d8580231d13017248" + +[[packages]] +name = "widgetsnbextension" +version = "4.0.14" + +[[packages.wheels]] +name = "widgetsnbextension-4.0.14-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/ca/51/5447876806d1088a0f8f71e16542bf350918128d0a69437df26047c8e46f/widgetsnbextension-4.0.14-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "4875a9eaf72fbf5079dc372a51a9f268fc38d46f767cbf85c43a36da5cb9b575" + +[[packages]] +name = "wordcloud" +version = "1.9.4" + +[[packages.wheels]] +name = "wordcloud-1.9.4-cp312-cp312-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/b9/74/6a15f68f59bc90032bfcf62eca796a5675be95e1aaf84f7861e1bfcfa8e5/wordcloud-1.9.4-cp312-cp312-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "360977705d0808a1795fcbe98afb5dc4833cb4bb8e421cbb10e93ef0bce816ff" + +[[packages]] +name = "wrapt" +version = "1.16.0" + +[[packages.wheels]] +name = "wrapt-1.16.0-cp312-cp312-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/5c/cc/8297f9658506b224aa4bd71906447dea6bb0ba629861a758c28f67428b91/wrapt-1.16.0-cp312-cp312-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "dcdba5c86e368442528f7060039eda390cc4091bfd1dca41e8046af7c910dda8" + +[[packages]] +name = "wsproto" +version = "1.2.0" + +[[packages.wheels]] +name = "wsproto-1.2.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/78/58/e860788190eba3bcce367f74d29c4675466ce8dddfba85f7827588416f01/wsproto-1.2.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "b9acddd652b585d75b20477888c56642fdade28bdfd3579aa24a4d2c037dd736" + +[[packages]] +name = "xarray" +version = "2025.4.0" + +[[packages.wheels]] +name = "xarray-2025.4.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/a4/1e/96fd96419fec1a37da998a1ca3d558f2cae2f6f3cd5015170371b05a2b6b/xarray-2025.4.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "b27defd082c5cb85d32c695708de6bb05c2838fb7caaf3f952982e602a35b9b8" + +[[packages]] +name = "xlsxwriter" +version = "3.2.3" + +[[packages.wheels]] +name = "XlsxWriter-3.2.3-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/37/b1/a252d499f2760b314fcf264d2b36fcc4343a1ecdb25492b210cb0db70a68/XlsxWriter-3.2.3-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "593f8296e8a91790c6d0378ab08b064f34a642b3feb787cf6738236bd0a4860d" + +[[packages]] +name = "xyzservices" +version = "2023.10.1" + +[[packages.wheels]] +name = "xyzservices-2023.10.1-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/82/c3/e06dfa46464cce3eda4b86df8847cab99d9bc545c76807ee689545187a4c/xyzservices-2023.10.1-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "6a4c38d3a9f89d3e77153eff9414b36a8ee0850c9e8b85796fd1b2a85b8dfd68" + +[[packages]] +name = "yapf" +version = "0.40.1" + +[[packages.wheels]] +name = "yapf-0.40.1-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/23/75/c374517c09e31bf22d3b3f156d73e0f38d08e29b2afdd607cef5f1e10aa9/yapf-0.40.1-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "b8bfc1f280949153e795181768ca14ef43d7312629a06c43e7abd279323af313" + +[[packages]] +name = "yarl" +version = "1.18.3" + +[[packages.wheels]] +name = "yarl-1.18.3-cp312-cp312-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/34/45/0e055320daaabfc169b21ff6174567b2c910c45617b0d79c68d7ab349b02/yarl-1.18.3-cp312-cp312-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "7e2ee16578af3b52ac2f334c3b1f92262f47e02cc6193c598502bd46f5cd1477" + +[[packages]] +name = "yt-dlp" +version = "2025.2.19" + +[[packages.wheels]] +name = "yt_dlp-2025.2.19-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/9e/45/6d1b759e68f5363b919828fb0e0c167a1cd5003b5b7c74cc0f0c2096be4f/yt_dlp-2025.2.19-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "3ed218eaeece55e9d715afd41abc450dc406ee63bf79355169dfde312d38fdb8" + +[[packages]] +name = "zict" +version = "3.0.0" + +[[packages.wheels]] +name = "zict-3.0.0-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/80/ab/11a76c1e2126084fde2639514f24e6111b789b0bfa4fc6264a8975c7e1f1/zict-3.0.0-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "5796e36bd0e0cc8cf0fbc1ace6a68912611c1dbd74750a3f3026b9b9d6a327ae" + +[[packages]] +name = "zipp" +version = "3.21.0" + +[[packages.wheels]] +name = "zipp-3.21.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/b7/1a/7e4798e9339adc931158c9d69ecc34f5e6791489d469f5e50ec15e35f458/zipp-3.21.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "ac1bbe05fd2991f160ebce24ffbac5f6d11d83dc90891255885223d42b3cd931" + +[[packages]] +name = "zstandard" +version = "0.23.0" + +[[packages.wheels]] +name = "zstandard-0.23.0-cp312-cp312-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/75/37/872d74bd7739639c4553bf94c84af7d54d8211b626b352bc57f0fd8d1e3f/zstandard-0.23.0-cp312-cp312-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "64585e1dba664dc67c7cdabd56c1e5685233fbb1fc1966cfba2a340ec0dfff7b" diff --git a/changelogs/pylock.64-3_13_5_0slim.toml b/changelogs/pylock.64-3_13_5_0slim.toml new file mode 100644 index 00000000..c8739b74 --- /dev/null +++ b/changelogs/pylock.64-3_13_5_0slim.toml @@ -0,0 +1,5491 @@ +lock-version = "1.0" +created-by = "pip" + +[[packages]] +name = "absl-py" +version = "2.2.2" + +[[packages.wheels]] +name = "absl_py-2.2.2-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/f6/d4/349f7f4bd5ea92dab34f5bb0fe31775ef6c311427a14d5a5b31ecb442341/absl_py-2.2.2-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "e5797bc6abe45f64fd95dc06394ca3f2bedf3b5d895e9da691c9ee3397d70092" + +[[packages]] +name = "adbc-driver-manager" +version = "1.3.0" + +[[packages.wheels]] +name = "adbc_driver_manager-1.3.0-cp313-cp313-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/2a/a7/a97c778466e0fca5ebb8566794f07334689a086f3564d1250608bb943494/adbc_driver_manager-1.3.0-cp313-cp313-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "0d327006f5993385b3625e3524a851ea7050aa3b1716bddd52c8892ac9c42145" + +[[packages]] +name = "aiofiles" +version = "23.2.1" + +[[packages.wheels]] +name = "aiofiles-23.2.1-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/c5/19/5af6804c4cc0fed83f47bff6e413a98a36618e7d40185cd36e69737f3b0e/aiofiles-23.2.1-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "19297512c647d4b27a2cf7c34caa7e405c0d60b5560618a29a9fe027b18b0107" + +[[packages]] +name = "aiohappyeyeballs" +version = "2.6.1" + +[[packages.wheels]] +name = "aiohappyeyeballs-2.6.1-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/0f/15/5bf3b99495fb160b63f95972b81750f18f7f4e02ad051373b669d17d44f2/aiohappyeyeballs-2.6.1-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "f349ba8f4b75cb25c99c5c2d84e997e485204d2902a9597802b0371f09331fb8" + +[[packages]] +name = "aiohttp" +version = "3.11.18" + +[[packages.wheels]] +name = "aiohttp-3.11.18-cp313-cp313-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/1e/3c/143831b32cd23b5263a995b2a1794e10aa42f8a895aae5074c20fda36c07/aiohttp-3.11.18-cp313-cp313-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "bdd619c27e44382cf642223f11cfd4d795161362a5a1fc1fa3940397bc89db01" + +[[packages]] +name = "aiosignal" +version = "1.3.2" + +[[packages.wheels]] +name = "aiosignal-1.3.2-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/ec/6a/bc7e17a3e87a2985d3e8f4da4cd0f481060eb78fb08596c42be62c90a4d9/aiosignal-1.3.2-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "45cde58e409a301715980c2b01d0c28bdde3770d8290b5eb2173759d9acb31a5" + +[[packages]] +name = "aiosqlite" +version = "0.20.0" + +[[packages.wheels]] +name = "aiosqlite-0.20.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/00/c4/c93eb22025a2de6b83263dfe3d7df2e19138e345bca6f18dba7394120930/aiosqlite-0.20.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "36a1deaca0cac40ebe32aac9977a6e2bbc7f5189f23f4a54d5908986729e5bd6" + +[[packages]] +name = "alabaster" +version = "0.7.16" + +[[packages.wheels]] +name = "alabaster-0.7.16-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/32/34/d4e1c02d3bee589efb5dfa17f88ea08bdb3e3eac12bc475462aec52ed223/alabaster-0.7.16-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "b46733c07dce03ae4e150330b975c75737fa60f0a7c591b6c8bf4928a28e2c92" + +[[packages]] +name = "alembic" +version = "1.15.2" + +[[packages.wheels]] +name = "alembic-1.15.2-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/41/18/d89a443ed1ab9bcda16264716f809c663866d4ca8de218aa78fd50b38ead/alembic-1.15.2-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "2e76bd916d547f6900ec4bb5a90aeac1485d2c92536923d0b138c02b126edc53" + +[[packages]] +name = "altair" +version = "5.5.0" + +[[packages.wheels]] +name = "altair-5.5.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/aa/f3/0b6ced594e51cc95d8c1fc1640d3623770d01e4969d29c0bd09945fafefa/altair-5.5.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "91a310b926508d560fe0148d02a194f38b824122641ef528113d029fcd129f8c" + +[[packages]] +name = "annotated-types" +version = "0.7.0" + +[[packages.wheels]] +name = "annotated_types-0.7.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53" + +[[packages]] +name = "ansicolors" +version = "1.1.8" + +[[packages.wheels]] +name = "ansicolors-1.1.8-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/53/18/a56e2fe47b259bb52201093a3a9d4a32014f9d85071ad07e9d60600890ca/ansicolors-1.1.8-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "00d2dde5a675579325902536738dd27e4fac1fd68f773fe36c21044eb559e187" + +[[packages]] +name = "anthropic" +version = "0.51.0" + +[[packages.wheels]] +name = "anthropic-0.51.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/8c/6e/9637122c5f007103bd5a259f4250bd8f1533dd2473227670fd10a1457b62/anthropic-0.51.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "b8b47d482c9aa1f81b923555cebb687c2730309a20d01be554730c8302e0f62a" + +[[packages]] +name = "anyio" +version = "4.9.0" + +[[packages.wheels]] +name = "anyio-4.9.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/a1/ee/48ca1a7c89ffec8b6a0c5d02b89c305671d5ffd8d3c94acf8b8c408575bb/anyio-4.9.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "9f76d541cad6e36af7beb62e978876f3b41e3e04f2c1fbf0884604c0a9c4d93c" + +[[packages]] +name = "anywidget" +version = "0.9.18" + +[[packages.wheels]] +name = "anywidget-0.9.18-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/2b/f0/09a30ca0551af20c7cefa7464b7ccb6f5407a550b83c4dcb15c410814849/anywidget-0.9.18-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "944b82ef1dd17b8ff0fb6d1f199f613caf9111338e6e2857da478f6e73770cb8" + +[[packages]] +name = "appdirs" +version = "1.4.4" + +[[packages.wheels]] +name = "appdirs-1.4.4-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/3b/00/2344469e2084fb287c2e0b57b72910309874c3245463acd6cf5e3db69324/appdirs-1.4.4-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "a841dacd6b99318a741b166adb07e19ee71a274450e68237b4650ca1055ab128" + +[[packages]] +name = "argcomplete" +version = "3.6.2" + +[[packages.wheels]] +name = "argcomplete-3.6.2-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/31/da/e42d7a9d8dd33fa775f467e4028a47936da2f01e4b0e561f9ba0d74cb0ca/argcomplete-3.6.2-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "65b3133a29ad53fb42c48cf5114752c7ab66c1c38544fdf6460f450c09b42591" + +[[packages]] +name = "argon2-cffi" +version = "23.1.0" + +[[packages.wheels]] +name = "argon2_cffi-23.1.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/a4/6a/e8a041599e78b6b3752da48000b14c8d1e8a04ded09c88c714ba047f34f5/argon2_cffi-23.1.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "c670642b78ba29641818ab2e68bd4e6a78ba53b7eff7b4c3815ae16abf91c7ea" + +[[packages]] +name = "argon2-cffi-bindings" +version = "21.2.0" + +[[packages.wheels]] +name = "argon2_cffi_bindings-21.2.0-cp36-abi3-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/37/2c/e34e47c7dee97ba6f01a6203e0383e15b60fb85d78ac9a15cd066f6fe28b/argon2_cffi_bindings-21.2.0-cp36-abi3-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "b2ef1c30440dbbcba7a5dc3e319408b59676e2e039e2ae11a8775ecf482b192f" + +[[packages]] +name = "array-api-compat" +version = "1.12.0" + +[[packages.wheels]] +name = "array_api_compat-1.12.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/e0/b1/0542e0cab6f49f151a2d7a42400f84f706fc0b64e85dc1f56708b2e9fd37/array_api_compat-1.12.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "a0b4795b6944a9507fde54679f9350e2ad2b1e2acf4a2408a098cdc27f890a8b" + +[[packages]] +name = "arrow" +version = "1.3.0" + +[[packages.wheels]] +name = "arrow-1.3.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/f8/ed/e97229a566617f2ae958a6b13e7cc0f585470eac730a73e9e82c32a3cdd2/arrow-1.3.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "c728b120ebc00eb84e01882a6f5e7927a53960aa990ce7dd2b10f39005a67f80" + +[[packages]] +name = "asgi-csrf" +version = "0.11" + +[[packages.wheels]] +name = "asgi_csrf-0.11-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/82/1c/5d954baaf144852a4762368b37c06202b277378ea412acc5565f69acc9e9/asgi_csrf-0.11-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "03ac140115f39d4295288a9adf74fdc6ae607f6ef44abee8466520458207242b" + +[[packages]] +name = "asgiref" +version = "3.8.1" + +[[packages.wheels]] +name = "asgiref-3.8.1-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/39/e3/893e8757be2612e6c266d9bb58ad2e3651524b5b40cf56761e985a28b13e/asgiref-3.8.1-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "3e1e3ecc849832fe52ccf2cb6686b7a55f82bb1d6aee72a58826471390335e47" + +[[packages]] +name = "asn1crypto" +version = "1.5.1" + +[[packages.wheels]] +name = "asn1crypto-1.5.1-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/c9/7f/09065fd9e27da0eda08b4d6897f1c13535066174cc023af248fc2a8d5e5a/asn1crypto-1.5.1-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "db4e40728b728508912cbb3d44f19ce188f218e9eba635821bb4b68564f8fd67" + +[[packages]] +name = "asteval" +version = "1.0.5" + +[[packages.wheels]] +name = "asteval-1.0.5-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/0a/0d/2c6aaab67ac566d76322e87827d707214c5f6ffb5a4fcd456a8633da1788/asteval-1.0.5-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "082b95312578affc8a6d982f7d92b7ac5de05634985c87e7eedd3188d31149fa" + +[[packages]] +name = "astroid" +version = "3.3.9" + +[[packages.wheels]] +name = "astroid-3.3.9-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/de/80/c749efbd8eef5ea77c7d6f1956e8fbfb51963b7f93ef79647afd4d9886e3/astroid-3.3.9-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "d05bfd0acba96a7bd43e222828b7d9bc1e138aaeb0649707908d3702a9831248" + +[[packages]] +name = "astropy" +version = "6.1.6" + +[[packages.wheels]] +name = "astropy-6.1.6-cp313-cp313-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/cc/6b/3a25746d94111c8523ac02b810451987128ab61ac05847e24dd1b2093e18/astropy-6.1.6-cp313-cp313-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "fafc65f47dedcc4a8112bce8b67f215a8076af214be34a2c34abc96d078f2b37" + +[[packages]] +name = "astropy-iers-data" +version = "0.2024.12.23.0.33.24" + +[[packages.wheels]] +name = "astropy_iers_data-0.2024.12.23.0.33.24-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/e8/4d/565740d9ac54640c09d2fdd22ef3583103438fb97305a9cfb66595a4b259/astropy_iers_data-0.2024.12.23.0.33.24-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "40d3c6b6a5cf4dc6ad91b92b7e0f949e5366234e3c4440302247429fc8294302" + +[[packages]] +name = "asttokens" +version = "3.0.0" + +[[packages.wheels]] +name = "asttokens-3.0.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/25/8a/c46dcc25341b5bce5472c718902eb3d38600a903b14fa6aeecef3f21a46f/asttokens-3.0.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "e3078351a059199dd5138cb1c706e6430c05eff2ff136af5eb4790f9d28932e2" + +[[packages]] +name = "async-lru" +version = "2.0.5" + +[[packages.wheels]] +name = "async_lru-2.0.5-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/03/49/d10027df9fce941cb8184e78a02857af36360d33e1721df81c5ed2179a1a/async_lru-2.0.5-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "ab95404d8d2605310d345932697371a5f40def0487c03d6d0ad9138de52c9943" + +[[packages]] +name = "asyncssh" +version = "2.20.0" + +[[packages.wheels]] +name = "asyncssh-2.20.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/f2/c5/7a9d42c065f272f74792663194966a68810e851a34c0dd080246bd7308f5/asyncssh-2.20.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "af6888d937c07a4bf31293335a6166b4d87608cdb5957b49547da6ad87ecf174" + +[[packages]] +name = "atomicwrites" +version = "1.4.0" + +[[packages.wheels]] +name = "atomicwrites-1.4.0-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/2c/a0/da5f49008ec6e9a658dbf5d7310a4debd397bce0b4db03cf8a410066bb87/atomicwrites-1.4.0-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "6d1784dea7c0c8d4a5172b6c620f40b6e4cbfdf96d783691f2e1302a7b88e197" + +[[packages]] +name = "attrs" +version = "25.3.0" + +[[packages.wheels]] +name = "attrs-25.3.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/77/06/bb80f5f86020c4551da315d78b3ab75e8228f89f0162f2c3a819e407941a/attrs-25.3.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "427318ce031701fea540783410126f03899a97ffc6f61596ad581ac2e40e3bc3" + +[[packages]] +name = "autopep8" +version = "2.0.4" + +[[packages.wheels]] +name = "autopep8-2.0.4-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/d8/f2/e63c9f9c485cd90df8e4e7ae90fa3be2469c9641888558c7b45fa98a76f8/autopep8-2.0.4-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "067959ca4a07b24dbd5345efa8325f5f58da4298dab0dde0443d5ed765de80cb" + +[[packages]] +name = "azure-core" +version = "1.32.0" + +[[packages.wheels]] +name = "azure_core-1.32.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/39/83/325bf5e02504dbd8b4faa98197a44cdf8a325ef259b48326a2b6f17f8383/azure_core-1.32.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "eac191a0efb23bfa83fddf321b27b122b4ec847befa3091fa736a5c32c50d7b4" + +[[packages]] +name = "azure-cosmos" +version = "4.9.0" + +[[packages.wheels]] +name = "azure_cosmos-4.9.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/61/dc/380f843744535497acd0b85aacb59565c84fc28bf938c8d6e897a858cd95/azure_cosmos-4.9.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "3b60eaa01a16a857d0faf0cec304bac6fa8620a81bc268ce760339032ef617fe" + +[[packages]] +name = "azure-identity" +version = "1.21.0" + +[[packages.wheels]] +name = "azure_identity-1.21.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/3d/9f/1f9f3ef4f49729ee207a712a5971a9ca747f2ca47d9cbf13cf6953e3478a/azure_identity-1.21.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "258ea6325537352440f71b35c3dffe9d240eae4a5126c1b7ce5efd5766bd9fd9" + +[[packages]] +name = "babel" +version = "2.17.0" + +[[packages.wheels]] +name = "babel-2.17.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/b7/b8/3fe70c75fe32afc4bb507f75563d39bc5642255d1d94f1f23604725780bf/babel-2.17.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "4d0b53093fdfb4b21c92b5213dba5a1b23885afa8383709427046b21c366e5f2" + +[[packages]] +name = "baresql" +version = "1.0.0" + +[[packages.wheels]] +name = "baresql-1.0.0-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/d6/d2/fe24bcd99d97bddbbccdf191edf4e84c0fdfe894dfff9f54b05f36096ebb/baresql-1.0.0-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "a24d17f46beb47c221f328f7e06710e3896c6203a8e1909788d7128f27b86f01" + +[[packages]] +name = "bcrypt" +version = "4.3.0" + +[[packages.wheels]] +name = "bcrypt-4.3.0-cp39-abi3-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/a9/cf/45fb5261ece3e6b9817d3d82b2f343a505fd58674a92577923bc500bd1aa/bcrypt-4.3.0-cp39-abi3-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "e53e074b120f2877a35cc6c736b8eb161377caae8925c17688bd46ba56daaa5b" + +[[packages]] +name = "beautifulsoup4" +version = "4.13.3" + +[[packages.wheels]] +name = "beautifulsoup4-4.13.3-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/f9/49/6abb616eb3cbab6a7cca303dc02fdf3836de2e0b834bf966a7f5271a34d8/beautifulsoup4-4.13.3-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "99045d7d3f08f91f0d656bc9b7efbae189426cd913d830294a15eefa0ea4df16" + +[[packages]] +name = "binaryornot" +version = "0.4.4" + +[[packages.wheels]] +name = "binaryornot-0.4.4-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/24/7e/f7b6f453e6481d1e233540262ccbfcf89adcd43606f44a028d7f5fae5eb2/binaryornot-0.4.4-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "b8b71173c917bddcd2c16070412e369c3ed7f0528926f70cac18a6c97fd563e4" + +[[packages]] +name = "black" +version = "25.1.0" + +[[packages.wheels]] +name = "black-25.1.0-cp313-cp313-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/cc/64/94eb5f45dcb997d2082f097a3944cfc7fe87e071907f677e80788a2d7b7a/black-25.1.0-cp313-cp313-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "a22f402b410566e2d1c950708c77ebf5ebd5d0d88a6a2e87c86d9fb48afa0d18" + +[[packages]] +name = "bleach" +version = "6.2.0" + +[[packages.wheels]] +name = "bleach-6.2.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/fc/55/96142937f66150805c25c4d0f31ee4132fd33497753400734f9dfdcbdc66/bleach-6.2.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "117d9c6097a7c3d22fd578fcd8d35ff1e125df6736f554da4e432fdd63f31e5e" + +[[packages]] +name = "blinker" +version = "1.9.0" + +[[packages.wheels]] +name = "blinker-1.9.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/10/cb/f2ad4230dc2eb1a74edf38f1a38b9b52277f75bef262d8908e60d957e13c/blinker-1.9.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "ba0efaa9080b619ff2f3459d1d500c57bddea4a6b424b60a91141db6fd2f08bc" + +[[packages]] +name = "bokeh" +version = "3.7.3" + +[[packages.wheels]] +name = "bokeh-3.7.3-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/91/48/08b2382e739236aa3360b7976360ba3e0c043b6234e25951c18c1eb6fa06/bokeh-3.7.3-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "b0e79dd737f088865212e4fdcb0f3b95d087f0f088bf8ca186a300ab1641e2c7" + +[[packages]] +name = "branca" +version = "0.8.1" + +[[packages.wheels]] +name = "branca-0.8.1-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/f8/9d/91cddd38bd00170aad1a4b198c47b4ed716be45c234e09b835af41f4e717/branca-0.8.1-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "d29c5fab31f7c21a92e34bf3f854234e29fecdcf5d2df306b616f20d816be425" + +[[packages]] +name = "brotli" +version = "1.1.0" + +[[packages.wheels]] +name = "Brotli-1.1.0-cp313-cp313-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/7e/c1/ec214e9c94000d1c1974ec67ced1c970c148aa6b8d8373066123fc3dbf06/Brotli-1.1.0-cp313-cp313-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "9011560a466d2eb3f5a6e4929cf4a09be405c64154e12df0dd72713f6500e32b" + +[[packages]] +name = "build" +version = "1.2.2.post1" + +[[packages.wheels]] +name = "build-1.2.2.post1-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/84/c2/80633736cd183ee4a62107413def345f7e6e3c01563dbca1417363cf957e/build-1.2.2.post1-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "1d61c0887fa860c01971625baae8bdd338e517b836a2f70dd1f7aa3a6b2fc5b5" + +[[packages]] +name = "cachetools" +version = "5.5.2" + +[[packages.wheels]] +name = "cachetools-5.5.2-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/72/76/20fa66124dbe6be5cafeb312ece67de6b61dd91a0247d1ea13db4ebb33c2/cachetools-5.5.2-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "d26a22bcc62eb95c3beabd9f1ee5e820d3d2704fe2967cbe350e20c8ffcd3f0a" + +[[packages]] +name = "certifi" +version = "2025.1.31" + +[[packages.wheels]] +name = "certifi-2025.1.31-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/38/fc/bce832fd4fd99766c04d1ee0eead6b0ec6486fb100ae5e74c1d91292b982/certifi-2025.1.31-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "ca78db4565a652026a4db2bcdf68f2fb589ea80d0be70e03929ed730746b84fe" + +[[packages]] +name = "cffi" +version = "1.17.1" + +[[packages.wheels]] +name = "cffi-1.17.1-cp313-cp313-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/7c/fc/6a8cb64e5f0324877d503c854da15d76c1e50eb722e320b15345c4d0c6de/cffi-1.17.1-cp313-cp313-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "f6a16c31041f09ead72d69f583767292f750d24913dadacf5756b966aacb3f1a" + +[[packages]] +name = "chardet" +version = "5.2.0" + +[[packages.wheels]] +name = "chardet-5.2.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/38/6f/f5fbc992a329ee4e0f288c1fe0e2ad9485ed064cac731ed2fe47dcc38cbf/chardet-5.2.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "e1cf59446890a00105fe7b7912492ea04b6e6f06d4b742b2c788469e34c82970" + +[[packages]] +name = "charset-normalizer" +version = "3.4.2" + +[[packages.wheels]] +name = "charset_normalizer-3.4.2-cp313-cp313-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/e9/b0/0200da600134e001d91851ddc797809e2fe0ea72de90e09bec5a2fbdaccb/charset_normalizer-3.4.2-cp313-cp313-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "aa6af9e7d59f9c12b33ae4e9450619cf2488e2bbe9b44030905877f0b2324980" + +[[packages]] +name = "clarabel" +version = "0.10.0" + +[[packages.wheels]] +name = "clarabel-0.10.0-cp39-abi3-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/e6/ba/67a0defb70ed910877049e915e6738fc0432edd5e46b97743ce78a1e5b95/clarabel-0.10.0-cp39-abi3-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "7871b6f499ad66f71d4e7fb40754c4d986d4316f242beb62ff4f63a69785a50c" + +[[packages]] +name = "click" +version = "8.1.8" + +[[packages.wheels]] +name = "click-8.1.8-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/7e/d4/7ebdbd03970677812aac39c869717059dbb71a4cfc033ca6e5221787892c/click-8.1.8-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "63c132bbbed01578a06712a2d1f497bb62d9c1c0d329b7903a866228027263b2" + +[[packages]] +name = "click-default-group" +version = "1.2.4" + +[[packages.wheels]] +name = "click_default_group-1.2.4-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/2c/1a/aff8bb287a4b1400f69e09a53bd65de96aa5cee5691925b38731c67fc695/click_default_group-1.2.4-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "9b60486923720e7fc61731bdb32b617039aba820e22e1c88766b1125592eaa5f" + +[[packages]] +name = "cloudpickle" +version = "3.1.1" + +[[packages.wheels]] +name = "cloudpickle-3.1.1-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/7e/e8/64c37fadfc2816a7701fa8a6ed8d87327c7d54eacfbfb6edab14a2f2be75/cloudpickle-3.1.1-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "c8c5a44295039331ee9dad40ba100a9c7297b6f988e50e87ccdf3765a668350e" + +[[packages]] +name = "cohere" +version = "5.15.0" + +[[packages.wheels]] +name = "cohere-5.15.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/c7/87/94694db7fe6df979fbc03286eaabdfa98f1c8fa532960e5afdf965e10960/cohere-5.15.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "22ff867c2a6f2fc2b585360c6072f584f11f275ef6d9242bac24e0fa2df1dfb5" + +[[packages]] +name = "colorama" +version = "0.4.6" + +[[packages.wheels]] +name = "colorama-0.4.6-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6" + +[[packages]] +name = "colorcet" +version = "3.1.0" + +[[packages.wheels]] +name = "colorcet-3.1.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/c6/c6/9963d588cc3d75d766c819e0377a168ef83cf3316a92769971527a1ad1de/colorcet-3.1.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "2a7d59cc8d0f7938eeedd08aad3152b5319b4ba3bcb7a612398cc17a384cb296" + +[[packages]] +name = "colorlog" +version = "6.9.0" + +[[packages.wheels]] +name = "colorlog-6.9.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/e3/51/9b208e85196941db2f0654ad0357ca6388ab3ed67efdbfc799f35d1f83aa/colorlog-6.9.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "5906e71acd67cb07a71e779c47c4bcb45fb8c2993eebe9e5adcd6a6f1b283eff" + +[[packages]] +name = "comm" +version = "0.2.2" + +[[packages.wheels]] +name = "comm-0.2.2-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/e6/75/49e5bfe642f71f272236b5b2d2691cf915a7283cc0ceda56357b61daa538/comm-0.2.2-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "e6fb86cb70ff661ee8c9c14e7d36d6de3b4066f1441be4063df9c5009f0a64d3" + +[[packages]] +name = "contourpy" +version = "1.3.2" + +[[packages.wheels]] +name = "contourpy-1.3.2-cp313-cp313-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/12/6e/2fed56cd47ca739b43e892707ae9a13790a486a3173be063681ca67d2262/contourpy-1.3.2-cp313-cp313-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "e1578f7eafce927b168752ed7e22646dad6cd9bca673c60bff55889fa236ebf9" + +[[packages]] +name = "cookiecutter" +version = "2.6.0" + +[[packages.wheels]] +name = "cookiecutter-2.6.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/b6/d9/0137658a353168ffa9d0fc14b812d3834772040858ddd1cb6eeaf09f7a44/cookiecutter-2.6.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "a54a8e37995e4ed963b3e82831072d1ad4b005af736bb17b99c2cbd9d41b6e2d" + +[[packages]] +name = "cryptography" +version = "44.0.0" + +[[packages.wheels]] +name = "cryptography-44.0.0-cp39-abi3-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/97/9b/443270b9210f13f6ef240eff73fd32e02d381e7103969dc66ce8e89ee901/cryptography-44.0.0-cp39-abi3-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "708ee5f1bafe76d041b53a4f95eb28cdeb8d18da17e597d46d7833ee59b97ede" + +[[packages]] +name = "cvxopt" +version = "1.3.2" + +[[packages.wheels]] +name = "cvxopt-1.3.2-cp313-cp313-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/b9/55/90b40b489a235a9f35a532eb77cec81782e466779d9a531ffda6b2f99410/cvxopt-1.3.2-cp313-cp313-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "0a0987966009ad383de0918e61255d34ed9ebc783565bcb15470d4155010b6bf" + +[[packages]] +name = "cvxpy" +version = "1.6.4" + +[[packages.wheels]] +name = "cvxpy-1.6.4-cp313-cp313-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/56/a2/625f99661e43bd3fac3926b64cd6e8ab60d75ddd2451d9c6aba17a908c22/cvxpy-1.6.4-cp313-cp313-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "1eed0ac8d8c0141abc73535d652f7b133acfbab2149f5d9d6fa348353c90b442" + +[[packages]] +name = "cycler" +version = "0.12.1" + +[[packages.wheels]] +name = "cycler-0.12.1-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "85cef7cff222d8644161529808465972e51340599459b8ac3ccbac5a854e0d30" + +[[packages]] +name = "cython" +version = "3.1.1" + +[[packages.wheels]] +name = "cython-3.1.1-cp313-cp313-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/79/5e/c469f7b42e145a06af79a3f7b599454c028a823c6a83adc867ddfd02f941/cython-3.1.1-cp313-cp313-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "e000f0533eedf3d6dfbe30bb3c58a054c58f0a7778390342fa577a0dc47adab3" + +[[packages]] +name = "cytoolz" +version = "1.0.1" + +[[packages.wheels]] +name = "cytoolz-1.0.1-cp313-cp313-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/40/eb/dde173cf2357084ca9423950be1f2f11ab11d65d8bd30165bfb8fd4213e9/cytoolz-1.0.1-cp313-cp313-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "90e577e08d3a4308186d9e1ec06876d4756b1e8164b92971c69739ea17e15297" + +[[packages]] +name = "dask" +version = "2025.4.1" + +[[packages.wheels]] +name = "dask-2025.4.1-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/b4/12/f9effea5fe2bebfdd8b0d9c857f798382afacd57dc1cd0e9ce21e66c1bc2/dask-2025.4.1-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "aacbb0a9667856fe58385015efd64aca22f0c0b2c5e1b5e633531060303bb4be" + +[[packages]] +name = "datasette" +version = "0.65.1" + +[[packages.wheels]] +name = "datasette-0.65.1-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/08/f7/fc15b9ddc7a2cafe546f0e2696d71940d7604a128e2f903e98238c3435f7/datasette-0.65.1-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "ba7adf717ddcc24a2a8ac57890fffd384a2ebb909b342e4f731ba09eba764305" + +[[packages]] +name = "datasette-graphql" +version = "2.2" + +[[packages.wheels]] +name = "datasette_graphql-2.2-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/f1/12/e8fb59d77c59ec47a2aa53a6d4ac57ad55fce2b48c8397c2866c3f2c66cd/datasette_graphql-2.2-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "cd9f61afdcaab1ce4ff6775296e6ece99305bf05cbfae4c1c938a6c9e60cd485" + +[[packages]] +name = "datashader" +version = "0.17.0" + +[[packages.wheels]] +name = "datashader-0.17.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/dc/52/755bbab06c4d10f693abb724e82271ccf8adc98e9305a5c559867ee40c98/datashader-0.17.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "39421ff999294913e63d41954af955a5dece5d0c55d8fce1426043d70b22d07a" + +[[packages]] +name = "deap" +version = "1.4.2" + +[[packages.wheels]] +name = "deap-1.4.2-cp313-cp313-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/6e/22/614264336b00b1a01447e31c941fd4576478b5d32184dbb552db27b1c2a1/deap-1.4.2-cp313-cp313-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "1abab976c75b0f18c36e81f968fcc77fac69fc9bedbab8be3323ca376f6fcfa4" + +[[packages]] +name = "debugpy" +version = "1.8.13" + +[[packages.wheels]] +name = "debugpy-1.8.13-cp313-cp313-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/15/63/aa92fb341a78ec40f1c414ec7a7885c2ee17032eee00d12cee0cdc502af4/debugpy-1.8.13-cp313-cp313-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "79ce4ed40966c4c1631d0131606b055a5a2f8e430e3f7bf8fd3744b09943e8e8" + +[[packages]] +name = "decorator" +version = "5.2.1" + +[[packages.wheels]] +name = "decorator-5.2.1-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/4e/8c/f3147f5c4b73e7550fe5f9352eaa956ae838d5c51eb58e7a25b9f3e2643b/decorator-5.2.1-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "d316bb415a2d9e2d2b3abcc4084c6502fc09240e292cd76a76afc106a1c8e04a" + +[[packages]] +name = "defusedxml" +version = "0.7.1" + +[[packages.wheels]] +name = "defusedxml-0.7.1-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/07/6c/aa3f2f849e01cb6a001cd8554a88d4c77c5c1a31c95bdf1cf9301e6d9ef4/defusedxml-0.7.1-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "a352e7e428770286cc899e2542b6cdaedb2b4953ff269a210103ec58f6198a61" + +[[packages]] +name = "deprecated" +version = "1.2.14" + +[[packages.wheels]] +name = "Deprecated-1.2.14-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/20/8d/778b7d51b981a96554f29136cd59ca7880bf58094338085bcf2a979a0e6a/Deprecated-1.2.14-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "6fac8b097794a90302bdbb17b9b815e732d3c4720583ff1b198499d78470466c" + +[[packages]] +name = "diff-match-patch" +version = "20241021" + +[[packages.wheels]] +name = "diff_match_patch-20241021-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/f7/bb/2aa9b46a01197398b901e458974c20ed107935c26e44e37ad5b0e5511e44/diff_match_patch-20241021-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "93cea333fb8b2bc0d181b0de5e16df50dd344ce64828226bda07728818936782" + +[[packages]] +name = "dill" +version = "0.4.0" + +[[packages.wheels]] +name = "dill-0.4.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/50/3d/9373ad9c56321fdab5b41197068e1d8c25883b3fea29dd361f9b55116869/dill-0.4.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "44f54bf6412c2c8464c14e8243eb163690a9800dbe2c367330883b19c7561049" + +[[packages]] +name = "distributed" +version = "2025.4.1" + +[[packages.wheels]] +name = "distributed-2025.4.1-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/df/33/b956f0dc74b292ea3d206a45467fde838f005b64123a729898a6390a291a/distributed-2025.4.1-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "3a7834451b04ef059928045eab6ff6d88ad7bcfd48adc99403127d9a6818b5fa" + +[[packages]] +name = "distro" +version = "1.9.0" + +[[packages.wheels]] +name = "distro-1.9.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/12/b3/231ffd4ab1fc9d679809f356cebee130ac7daa00d6d6f3206dd4fd137e9e/distro-1.9.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "7bffd925d65168f85027d8da9af6bddab658135b840670a223589bc0c8ef02b2" + +[[packages]] +name = "django" +version = "5.2" + +[[packages.wheels]] +name = "Django-5.2-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/63/e0/6a5b5ea350c5bd63fe94b05e4c146c18facb51229d9dee42aa39f9fc2214/Django-5.2-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "91ceed4e3a6db5aedced65e3c8f963118ea9ba753fc620831c77074e620e7d83" + +[[packages]] +name = "dnspython" +version = "2.7.0" + +[[packages.wheels]] +name = "dnspython-2.7.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/68/1b/e0a87d256e40e8c888847551b20a017a6b98139178505dc7ffb96f04e954/dnspython-2.7.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "b4c34b7d10b51bcc3a5071e7b8dee77939f1e878477eeecc965e9835f63c6c86" + +[[packages]] +name = "docstring-to-markdown" +version = "0.17" + +[[packages.wheels]] +name = "docstring_to_markdown-0.17-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/56/7b/af3d0da15bed3a8665419bb3a630585756920f4ad67abfdfef26240ebcc0/docstring_to_markdown-0.17-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "fd7d5094aa83943bf5f9e1a13701866b7c452eac19765380dead666e36d3711c" + +[[packages]] +name = "docutils" +version = "0.21.2" + +[[packages.wheels]] +name = "docutils-0.21.2-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/8f/d7/9322c609343d929e75e7e5e6255e614fcc67572cfd083959cdef3b7aad79/docutils-0.21.2-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "dafca5b9e384f0e419294eb4d2ff9fa826435bf15f15b7bd45723e8ad76811b2" + +[[packages]] +name = "duckdb" +version = "1.3.0" + +[[packages.wheels]] +name = "duckdb-1.3.0-cp313-cp313-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/ab/e9/f83285b0cb3729f24321a038f272490dfb76ca531b7cef832037b7bd077c/duckdb-1.3.0-cp313-cp313-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "fbdfc1c0b83b90f780ae74038187ee696bb56ab727a289752372d7ec42dda65b" + +[[packages]] +name = "entrypoints" +version = "0.4" + +[[packages.wheels]] +name = "entrypoints-0.4-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/35/a8/365059bbcd4572cbc41de17fd5b682be5868b218c3c5479071865cab9078/entrypoints-0.4-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "f174b5ff827504fd3cd97cc3f8649f3693f51538c7e4bdf3ef002c8429d42f9f" + +[[packages]] +name = "et-xmlfile" +version = "1.1.0" + +[[packages.wheels]] +name = "et_xmlfile-1.1.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/96/c2/3dd434b0108730014f1b96fd286040dc3bcb70066346f7e01ec2ac95865f/et_xmlfile-1.1.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "a2ba85d1d6a74ef63837eed693bcb89c3f752169b0e3e7ae5b16ca5e1b3deada" + +[[packages]] +name = "eval-type-backport" +version = "0.2.2" + +[[packages.wheels]] +name = "eval_type_backport-0.2.2-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/ce/31/55cd413eaccd39125368be33c46de24a1f639f2e12349b0361b4678f3915/eval_type_backport-0.2.2-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "cb6ad7c393517f476f96d456d0412ea80f0a8cf96f6892834cd9340149111b0a" + +[[packages]] +name = "executing" +version = "2.2.0" + +[[packages.wheels]] +name = "executing-2.2.0-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/7b/8f/c4d9bafc34ad7ad5d8dc16dd1347ee0e507a52c3adb6bfa8887e1c6a26ba/executing-2.2.0-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "11387150cad388d62750327a53d3339fad4888b39a6fe233c3afbb54ecffd3aa" + +[[packages]] +name = "faker" +version = "37.1.0" + +[[packages.wheels]] +name = "faker-37.1.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/d7/a1/8936bc8e79af80ca38288dd93ed44ed1f9d63beb25447a4c59e746e01f8d/faker-37.1.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "dc2f730be71cb770e9c715b13374d80dbcee879675121ab51f9683d262ae9a1c" + +[[packages]] +name = "fasta2a" +version = "0.2.9" + +[[packages.wheels]] +name = "fasta2a-0.2.9-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/7a/df/dd967535662ecc9e101a7d6c0c643a055aabc3de47411c31c1dd624356c8/fasta2a-0.2.9-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "8b855b36f29fde6dcb79ad55be337a8165381b679bec829913009c55581e284e" + +[[packages]] +name = "fastapi" +version = "0.115.12" + +[[packages.wheels]] +name = "fastapi-0.115.12-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/50/b3/b51f09c2ba432a576fe63758bddc81f78f0c6309d9e5c10d194313bf021e/fastapi-0.115.12-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "e94613d6c05e27be7ffebdd6ea5f388112e5e430c8f7d6494a9d1d88d43e814d" + +[[packages]] +name = "fastavro" +version = "1.10.0" + +[[packages.wheels]] +name = "fastavro-1.10.0-cp313-cp313-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/1f/2c/43927e22a2d57587b3aa09765098a6d833246b672d34c10c5f135414745a/fastavro-1.10.0-cp313-cp313-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "86baf8c9740ab570d0d4d18517da71626fe9be4d1142bea684db52bd5adb078f" + +[[packages]] +name = "fastjsonschema" +version = "2.21.1" + +[[packages.wheels]] +name = "fastjsonschema-2.21.1-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/90/2b/0817a2b257fe88725c25589d89aec060581aabf668707a8d03b2e9e0cb2a/fastjsonschema-2.21.1-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "c9e5b7e908310918cf494a434eeb31384dd84a98b57a30bcb1f535015b554667" + +[[packages]] +name = "filelock" +version = "3.18.0" + +[[packages.wheels]] +name = "filelock-3.18.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/4d/36/2a115987e2d8c300a974597416d9de88f2444426de9571f4b59b2cca3acc/filelock-3.18.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "c401f4f8377c4464e6db25fff06205fd89bdd83b65eb0488ed1b160f780e21de" + +[[packages]] +name = "flake8" +version = "7.1.1" + +[[packages.wheels]] +name = "flake8-7.1.1-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/d9/42/65004373ac4617464f35ed15931b30d764f53cdd30cc78d5aea349c8c050/flake8-7.1.1-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "597477df7860daa5aa0fdd84bf5208a043ab96b8e96ab708770ae0364dd03213" + +[[packages]] +name = "flask" +version = "3.1.0" + +[[packages.wheels]] +name = "flask-3.1.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/af/47/93213ee66ef8fae3b93b3e29206f6b251e65c97bd91d8e1c5596ef15af0a/flask-3.1.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "d667207822eb83f1c4b50949b1623c8fc8d51f2341d65f72e1a1815397551136" + +[[packages]] +name = "flexcache" +version = "0.3" + +[[packages.wheels]] +name = "flexcache-0.3-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/27/cd/c883e1a7c447479d6e13985565080e3fea88ab5a107c21684c813dba1875/flexcache-0.3-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "d43c9fea82336af6e0115e308d9d33a185390b8346a017564611f1466dcd2e32" + +[[packages]] +name = "flexparser" +version = "0.4" + +[[packages.wheels]] +name = "flexparser-0.4-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/fe/5e/3be305568fe5f34448807976dc82fc151d76c3e0e03958f34770286278c1/flexparser-0.4-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "3738b456192dcb3e15620f324c447721023c0293f6af9955b481e91d00179846" + +[[packages]] +name = "flit" +version = "3.12.0" + +[[packages.wheels]] +name = "flit-3.12.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/f5/82/ce1d3bb380b227e26e517655d1de7b32a72aad61fa21ff9bd91a2e2db6ee/flit-3.12.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "2b4e7171dc22881fa6adc2dbf083e5ecc72520be3cd7587d2a803da94d6ef431" + +[[packages]] +name = "flit-core" +version = "3.12.0" + +[[packages.wheels]] +name = "flit_core-3.12.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/f2/65/b6ba90634c984a4fcc02c7e3afe523fef500c4980fec67cc27536ee50acf/flit_core-3.12.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "e7a0304069ea895172e3c7bb703292e992c5d1555dd1233ab7b5621b5b69e62c" + +[[packages]] +name = "folium" +version = "0.19.5" + +[[packages.wheels]] +name = "folium-0.19.5-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/81/4d/bcbee0676dc06f0b014a030cb928e158c96daafb872a01ddee7e60a8c998/folium-0.19.5-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "4333fb3e6f3e9eedb231615d22c6d7df20aea5829554bd6908675865a37803b3" + +[[packages]] +name = "fonttools" +version = "4.57.0" + +[[packages.wheels]] +name = "fonttools-4.57.0-cp313-cp313-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/c4/0d/2177b7fdd23d017bcfb702fd41e47d4573766b9114da2fddbac20dcc4957/fonttools-4.57.0-cp313-cp313-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "f1d6bc9c23356908db712d282acb3eebd4ae5ec6d8b696aa40342b1d84f8e9e3" + +[[packages]] +name = "fqdn" +version = "1.5.1" + +[[packages.wheels]] +name = "fqdn-1.5.1-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/cf/58/8acf1b3e91c58313ce5cb67df61001fc9dcd21be4fadb76c1a2d540e09ed/fqdn-1.5.1-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "3a179af3761e4df6eb2e026ff9e1a3033d3587bf980a0b1b2e1e5d08d7358014" + +[[packages]] +name = "frozenlist" +version = "1.5.0" + +[[packages.wheels]] +name = "frozenlist-1.5.0-cp313-cp313-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/17/c4/b7db1206a3fea44bf3b838ca61deb6f74424a8a5db1dd53ecb21da669be6/frozenlist-1.5.0-cp313-cp313-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "11aabdd62b8b9c4b84081a3c246506d1cddd2dd93ff0ad53ede5defec7886b28" + +[[packages]] +name = "fsspec" +version = "2025.3.2" + +[[packages.wheels]] +name = "fsspec-2025.3.2-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/44/4b/e0cfc1a6f17e990f3e64b7d941ddc4acdc7b19d6edd51abf495f32b1a9e4/fsspec-2025.3.2-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "2daf8dc3d1dfa65b6aa37748d112773a7a08416f6c70d96b264c96476ecaf711" + +[[packages]] +name = "fuzzywuzzy" +version = "0.18.0" + +[[packages.wheels]] +name = "fuzzywuzzy-0.18.0-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/43/ff/74f23998ad2f93b945c0309f825be92e04e0348e062026998b5eefef4c33/fuzzywuzzy-0.18.0-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "928244b28db720d1e0ee7587acf660ea49d7e4c632569cad4f1cd7e68a5f0993" + +[[packages]] +name = "geographiclib" +version = "2.0" + +[[packages.wheels]] +name = "geographiclib-2.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/9f/5a/a26132406f1f40cf51ea349a5f11b0a46cec02a2031ff82e391c2537247a/geographiclib-2.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "6b7225248e45ff7edcee32becc4e0a1504c606ac5ee163a5656d482e0cd38734" + +[[packages]] +name = "geopandas" +version = "1.0.1" + +[[packages.wheels]] +name = "geopandas-1.0.1-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/c4/64/7d344cfcef5efddf9cf32f59af7f855828e9d74b5f862eddf5bfd9f25323/geopandas-1.0.1-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "01e147d9420cc374d26f51fc23716ac307f32b49406e4bd8462c07e82ed1d3d6" + +[[packages]] +name = "geopy" +version = "2.4.1" + +[[packages.wheels]] +name = "geopy-2.4.1-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/e5/15/cf2a69ade4b194aa524ac75112d5caac37414b20a3a03e6865dfe0bd1539/geopy-2.4.1-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "ae8b4bc5c1131820f4d75fce9d4aaaca0c85189b3aa5d64c3dcaf5e3b7b882a7" + +[[packages]] +name = "gitdb" +version = "4.0.12" + +[[packages.wheels]] +name = "gitdb-4.0.12-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/a0/61/5c78b91c3143ed5c14207f463aecfc8f9dbb5092fb2869baf37c273b2705/gitdb-4.0.12-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "67073e15955400952c6565cc3e707c554a4eea2e428946f7a4c162fab9bd9bcf" + +[[packages]] +name = "gitpython" +version = "3.1.44" + +[[packages.wheels]] +name = "GitPython-3.1.44-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/1d/9a/4114a9057db2f1462d5c8f8390ab7383925fe1ac012eaa42402ad65c2963/GitPython-3.1.44-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "9e0e10cda9bed1ee64bc9a6de50e7e38a9c9943241cd7f585f6df3ed28011110" + +[[packages]] +name = "google-auth" +version = "2.38.0" + +[[packages.wheels]] +name = "google_auth-2.38.0-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/9d/47/603554949a37bca5b7f894d51896a9c534b9eab808e2520a748e081669d0/google_auth-2.38.0-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "e7dae6694313f434a2727bf2906f27ad259bae090d7aa896590d86feec3d9d4a" + +[[packages]] +name = "google-genai" +version = "1.16.1" + +[[packages.wheels]] +name = "google_genai-1.16.1-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/bc/31/30caa8d4ae987e47c5250fb6680588733863fd5b39cacb03ba1977c29bde/google_genai-1.16.1-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "6ae5d24282244f577ca4f0d95c09f75ab29e556602c9d3531b70161e34cd2a39" + +[[packages]] +name = "graphene" +version = "3.4.3" + +[[packages.wheels]] +name = "graphene-3.4.3-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/66/e0/61d8e98007182e6b2aca7cf65904721fb2e4bce0192272ab9cb6f69d8812/graphene-3.4.3-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "820db6289754c181007a150db1f7fff544b94142b556d12e3ebc777a7bf36c71" + +[[packages]] +name = "graphql-core" +version = "3.2.6" + +[[packages.wheels]] +name = "graphql_core-3.2.6-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/ae/4f/7297663840621022bc73c22d7d9d80dbc78b4db6297f764b545cd5dd462d/graphql_core-3.2.6-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "78b016718c161a6fb20a7d97bbf107f331cd1afe53e45566c59f776ed7f0b45f" + +[[packages]] +name = "graphql-relay" +version = "3.2.0" + +[[packages.wheels]] +name = "graphql_relay-3.2.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/74/16/a4cf06adbc711bd364a73ce043b0b08d8fa5aae3df11b6ee4248bcdad2e0/graphql_relay-3.2.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "c9b22bd28b170ba1fe674c74384a8ff30a76c8e26f88ac3aa1584dd3179953e5" + +[[packages]] +name = "greenlet" +version = "3.1.1" + +[[packages.wheels]] +name = "greenlet-3.1.1-cp313-cp313-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/1f/1b/54336d876186920e185066d8c3024ad55f21d7cc3683c856127ddb7b13ce/greenlet-3.1.1-cp313-cp313-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "b42703b1cf69f2aa1df7d1030b9d77d3e584a70755674d60e710f0af570f3761" + +[[packages]] +name = "griffe" +version = "1.7.2" + +[[packages.wheels]] +name = "griffe-1.7.2-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/b1/5e/38b408f41064c9fcdbb0ea27c1bd13a1c8657c4846e04dab9f5ea770602c/griffe-1.7.2-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "1ed9c2e338a75741fc82083fe5a1bc89cb6142efe126194cc313e34ee6af5423" + +[[packages]] +name = "groq" +version = "0.25.0" + +[[packages.wheels]] +name = "groq-0.25.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/4d/11/1019a6cfdb2e520cb461cf70d859216be8ca122ddf5ad301fc3b0ee45fd4/groq-0.25.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "aadc78b40b1809cdb196b1aa8c7f7293108767df1508cafa3e0d5045d9328e7a" + +[[packages]] +name = "guidata" +version = "3.9.0" + +[[packages.wheels]] +name = "guidata-3.9.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/5b/03/44afe4b4d634ea77ea7979be78bba4256607f92a6570241925e5b129966d/guidata-3.9.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "96a19dc92850bdb3e463fa06e8c22793e090db42d1e72c6dae9bda1a98b61210" + +[[packages]] +name = "h11" +version = "0.14.0" + +[[packages.wheels]] +name = "h11-0.14.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/95/04/ff642e65ad6b90db43e668d70ffb6736436c7ce41fcc549f4e9472234127/h11-0.14.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761" + +[[packages]] +name = "h2" +version = "4.2.0" + +[[packages.wheels]] +name = "h2-4.2.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/d0/9e/984486f2d0a0bd2b024bf4bc1c62688fcafa9e61991f041fb0e2def4a982/h2-4.2.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "479a53ad425bb29af087f3458a61d30780bc818e4ebcf01f0b536ba916462ed0" + +[[packages]] +name = "h5py" +version = "3.12.1" + +[[packages.wheels]] +name = "h5py-3.12.1-cp313-cp313-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/50/51/0bbf3663062b2eeee78aa51da71e065f8a0a6e3cb950cc7020b4444999e6/h5py-3.12.1-cp313-cp313-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "52ab036c6c97055b85b2a242cb540ff9590bacfda0c03dd0cf0661b311f522f8" + +[[packages]] +name = "hatchling" +version = "1.27.0" + +[[packages.wheels]] +name = "hatchling-1.27.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/08/e7/ae38d7a6dfba0533684e0b2136817d667588ae3ec984c1a4e5df5eb88482/hatchling-1.27.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "d3a2f3567c4f926ea39849cdf924c7e99e6686c9c8e288ae1037c8fa2a5d937b" + +[[packages]] +name = "holoviews" +version = "1.20.2" + +[[packages.wheels]] +name = "holoviews-1.20.2-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/df/67/066a1d984fa259ad7300084a70789579e104afd75fc58a1d44cda9c365d5/holoviews-1.20.2-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "1f892c04bc23e8a3a9cde082b606b9463c9ff78c3d0c00e2ddcc41fe6e738458" + +[[packages]] +name = "hpack" +version = "4.1.0" + +[[packages.wheels]] +name = "hpack-4.1.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/07/c6/80c95b1b2b94682a72cbdbfb85b81ae2daffa4291fbfa1b1464502ede10d/hpack-4.1.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "157ac792668d995c657d93111f46b4535ed114f0c9c8d672271bbec7eae1b496" + +[[packages]] +name = "html5lib" +version = "1.1" + +[[packages.wheels]] +name = "html5lib-1.1-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/6c/dd/a834df6482147d48e225a49515aabc28974ad5a4ca3215c18a882565b028/html5lib-1.1-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "0d78f8fde1c230e99fe37986a60526d7049ed4bf8a9fadbad5f00e22e58e041d" + +[[packages]] +name = "httpcore" +version = "1.0.7" + +[[packages.wheels]] +name = "httpcore-1.0.7-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/87/f5/72347bc88306acb359581ac4d52f23c0ef445b57157adedb9aee0cd689d2/httpcore-1.0.7-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "a3fff8f43dc260d5bd363d9f9cf1830fa3a458b332856f34282de498ed420edd" + +[[packages]] +name = "httpie" +version = "3.2.4" + +[[packages.wheels]] +name = "httpie-3.2.4-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/03/b6/39bcf01e1185882f34bc9fb77d1fb4a27911a55f60ab407de34abc8a2347/httpie-3.2.4-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "4bd0435cc4b9bca59501bc65089de96f3e93b393803f32a81951db62050ebf0b" + +[[packages]] +name = "httpx" +version = "0.28.1" + +[[packages.wheels]] +name = "httpx-0.28.1-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/2a/39/e50c7c3a983047577ee07d2a9e53faf5a69493943ec3f6a384bdc792deb2/httpx-0.28.1-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "d909fcccc110f8c7faf814ca82a9a4d816bc5a6dbfea25d6591d6985b8ba59ad" + +[[packages]] +name = "httpx-sse" +version = "0.4.0" + +[[packages.wheels]] +name = "httpx_sse-0.4.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/e1/9b/a181f281f65d776426002f330c31849b86b31fc9d848db62e16f03ff739f/httpx_sse-0.4.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "f329af6eae57eaa2bdfd962b42524764af68075ea87370a2de920af5341e318f" + +[[packages]] +name = "huggingface-hub" +version = "0.33.0" + +[[packages.wheels]] +name = "huggingface_hub-0.33.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/33/fb/53587a89fbc00799e4179796f51b3ad713c5de6bb680b2becb6d37c94649/huggingface_hub-0.33.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "e8668875b40c68f9929150d99727d39e5ebb8a05a98e4191b908dc7ded9074b3" + +[[packages]] +name = "hupper" +version = "1.12.1" + +[[packages.wheels]] +name = "hupper-1.12.1-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/86/7d/3888833e4f5ea56af4a9935066ec09a83228e533d7b8877f65889d706ee4/hupper-1.12.1-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "e872b959f09d90be5fb615bd2e62de89a0b57efc037bdf9637fb09cdf8552b19" + +[[packages]] +name = "hvplot" +version = "0.11.2" + +[[packages.wheels]] +name = "hvplot-0.11.2-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/ed/d9/466e22e60dd6b1eb09680d7155c47b58da17eda51bbaf4aad8392a45fe12/hvplot-0.11.2-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "9d576a0c2df0f1cf5041545f2a2eddcf962510162876991cae4d1779fad74556" + +[[packages]] +name = "hypercorn" +version = "0.17.3" + +[[packages.wheels]] +name = "hypercorn-0.17.3-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/0e/3b/dfa13a8d96aa24e40ea74a975a9906cfdc2ab2f4e3b498862a57052f04eb/hypercorn-0.17.3-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "059215dec34537f9d40a69258d323f56344805efb462959e727152b0aa504547" + +[[packages]] +name = "hyperframe" +version = "6.1.0" + +[[packages.wheels]] +name = "hyperframe-6.1.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/48/30/47d0bf6072f7252e6521f3447ccfa40b421b6824517f82854703d0f5a98b/hyperframe-6.1.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "b03380493a519fce58ea5af42e4a42317bf9bd425596f7a0835ffce80f1a42e5" + +[[packages]] +name = "hypothesis" +version = "6.130.4" + +[[packages.wheels]] +name = "hypothesis-6.130.4-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/5c/d4/5a0c46cc8d266626cdc8082f07f836fa4a96e8715002de69be46ed406d1d/hypothesis-6.130.4-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "cda4a57115d10ecbefe0a9cc8d69d20a13eb56ecbfe7c24eaee5d368c2b7c477" + +[[packages]] +name = "id" +version = "1.5.0" + +[[packages.wheels]] +name = "id-1.5.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/9f/cb/18326d2d89ad3b0dd143da971e77afd1e6ca6674f1b1c3df4b6bec6279fc/id-1.5.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "f1434e1cef91f2cbb8a4ec64663d5a23b9ed43ef44c4c957d02583d61714c658" + +[[packages]] +name = "idna" +version = "3.10" + +[[packages.wheels]] +name = "idna-3.10-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/76/c6/c88e154df9c4e1a2a66ccf0005a88dfb2650c1dffb6f5ce603dfbd452ce3/idna-3.10-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3" + +[[packages]] +name = "imageio" +version = "2.37.0" + +[[packages.wheels]] +name = "imageio-2.37.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/cb/bd/b394387b598ed84d8d0fa90611a90bee0adc2021820ad5729f7ced74a8e2/imageio-2.37.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "11efa15b87bc7871b61590326b2d635439acc321cf7f8ce996f812543ce10eed" + +[[packages]] +name = "imagesize" +version = "1.4.1" + +[[packages.wheels]] +name = "imagesize-1.4.1-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/ff/62/85c4c919272577931d407be5ba5d71c20f0b616d31a0befe0ae45bb79abd/imagesize-1.4.1-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "0d8d18d08f840c19d0ee7ca1fd82490fdc3729b7ac93f49870406ddde8ef8d8b" + +[[packages]] +name = "imbalanced-learn" +version = "0.13.0" + +[[packages.wheels]] +name = "imbalanced_learn-0.13.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/9d/41/721fec82606242a2072ee909086ff918dfad7d0199a9dfd4928df9c72494/imbalanced_learn-0.13.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "7eb5859f7827cb3babfa5789978c22fe36e56527d9c9768df2d864d98d9b40fe" + +[[packages]] +name = "importlib-metadata" +version = "8.6.1" + +[[packages.wheels]] +name = "importlib_metadata-8.6.1-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/79/9d/0fb148dc4d6fa4a7dd1d8378168d9b4cd8d4560a6fbf6f0121c5fc34eb68/importlib_metadata-8.6.1-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "02a89390c1e15fdfdc0d7c6b25cb3e62650d0494005c97d6f148bf5b9787525e" + +[[packages]] +name = "inflection" +version = "0.5.1" + +[[packages.wheels]] +name = "inflection-0.5.1-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/59/91/aa6bde563e0085a02a435aa99b49ef75b0a4b062635e606dab23ce18d720/inflection-0.5.1-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "f38b2b640938a4f35ade69ac3d053042959b62a0f1076a5bbaa1b9526605a8a2" + +[[packages]] +name = "iniconfig" +version = "2.1.0" + +[[packages.wheels]] +name = "iniconfig-2.1.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/2c/e1/e6716421ea10d38022b952c159d5161ca1193197fb744506875fbb87ea7b/iniconfig-2.1.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "9deba5723312380e77435581c6bf4935c94cbfab9b1ed33ef8d238ea168eb760" + +[[packages]] +name = "intervaltree" +version = "3.1.0" + +[packages.sdist] +name = "intervaltree-3.1.0.tar.gz" +url = "https://files.pythonhosted.org/packages/50/fb/396d568039d21344639db96d940d40eb62befe704ef849b27949ded5c3bb/intervaltree-3.1.0.tar.gz" + +[packages.sdist.hashes] +sha256 = "902b1b88936918f9b2a19e0e5eb7ccb430ae45cde4f39ea4b36932920d33952d" + +[[packages]] +name = "ipycanvas" +version = "0.13.3" + +[[packages.wheels]] +name = "ipycanvas-0.13.3-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/e2/fc/e3867e413adbfede3a9c372ec015416ccb0a6493659db5812eeec447a73b/ipycanvas-0.13.3-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "d37adb2f45d2fef1c3d33c69a0518055694d87827b2f577f3c426d7712f75daa" + +[[packages]] +name = "ipykernel" +version = "6.29.5" + +[[packages.wheels]] +name = "ipykernel-6.29.5-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/94/5c/368ae6c01c7628438358e6d337c19b05425727fbb221d2a3c4303c372f42/ipykernel-6.29.5-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "afdb66ba5aa354b09b91379bac28ae4afebbb30e8b39510c9690afb7a10421b5" + +[[packages]] +name = "ipyleaflet" +version = "0.19.2" + +[[packages.wheels]] +name = "ipyleaflet-0.19.2-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/56/6f/00d60e93a316a178ae04457ceea5bcbb4e2d7e7e469882ac59ec4cccfb8c/ipyleaflet-0.19.2-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "7cc9157848baca2e1793b96e79f8bdb1aa7340521d2b7d8a62aa8bc30eab5278" + +[[packages]] +name = "ipympl" +version = "0.9.7" + +[[packages.wheels]] +name = "ipympl-0.9.7-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/86/6b/21c62f1b2b5e18c6553f7364487dfdf7eb7952b1000a1b7863c1f97819e9/ipympl-0.9.7-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "3698ee7eaa0b047a7603517d7aa1b71b32118a5f51754cab45ec5d994f67208f" + +[[packages]] +name = "ipython" +version = "8.36.0" + +[[packages.wheels]] +name = "ipython-8.36.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/d6/d7/c1c9f371790b3a181e343c4815a361e5a0cc7d90ef6642d64ba5d05de289/ipython-8.36.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "12b913914d010dcffa2711505ec8be4bf0180742d97f1e5175e51f22086428c1" + +[[packages]] +name = "ipython-genutils" +version = "0.2.0" + +[[packages.wheels]] +name = "ipython_genutils-0.2.0-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/fa/bc/9bd3b5c2b4774d5f33b2d544f1460be9df7df2fe42f352135381c347c69a/ipython_genutils-0.2.0-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "72dd37233799e619666c9f639a9da83c34013a73e8bbc79a7a6348d93c61fab8" + +[[packages]] +name = "ipython-sql" +version = "0.5.0" + +[[packages.wheels]] +name = "ipython_sql-0.5.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/30/8f/9e50fa53ffc371483f9d1b90c1175b706d28a2e978e90a8894035af01905/ipython_sql-0.5.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "61b46ecffb956f62dbc17b5744cf70c649104c8db9afd821aa39b31f7cbb5d5b" + +[[packages]] +name = "ipywidgets" +version = "8.1.6" + +[[packages.wheels]] +name = "ipywidgets-8.1.6-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/53/b8/62952729573d983d9433faacf62a52ee2e8cf46504418061ad1739967abe/ipywidgets-8.1.6-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "446e7630a1d025bdc7635e1169fcc06f2ce33b5bd41c2003edeb4a47c8d4bbb1" + +[[packages]] +name = "isoduration" +version = "20.11.0" + +[[packages.wheels]] +name = "isoduration-20.11.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/7b/55/e5326141505c5d5e34c5e0935d2908a74e4561eca44108fbfb9c13d2911a/isoduration-20.11.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "b2904c2a4228c3d44f409c8ae8e2370eb21a26f7ac2ec5446df141dde3452042" + +[[packages]] +name = "isort" +version = "5.13.2" + +[[packages.wheels]] +name = "isort-5.13.2-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/d1/b3/8def84f539e7d2289a02f0524b944b15d7c75dab7628bedf1c4f0992029c/isort-5.13.2-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "8ca5e72a8d85860d5a3fa69b8745237f2939afe12dbf656afbcb47fe72d947a6" + +[[packages]] +name = "itsdangerous" +version = "2.2.0" + +[[packages.wheels]] +name = "itsdangerous-2.2.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/04/96/92447566d16df59b2a776c0fb82dbc4d9e07cd95062562af01e408583fc4/itsdangerous-2.2.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "c6242fc49e35958c8b15141343aa660db5fc54d4f13a1db01a3f5891b98700ef" + +[[packages]] +name = "janus" +version = "2.0.0" + +[[packages.wheels]] +name = "janus-2.0.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/68/34/65604740edcb20e1bda6a890348ed7d282e7dd23aa00401cbe36fd0edbd9/janus-2.0.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "7e6449d34eab04cd016befbd7d8c0d8acaaaab67cb59e076a69149f9031745f9" + +[[packages]] +name = "jaraco-classes" +version = "3.4.0" + +[[packages.wheels]] +name = "jaraco.classes-3.4.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/7f/66/b15ce62552d84bbfcec9a4873ab79d993a1dd4edb922cbfccae192bd5b5f/jaraco.classes-3.4.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "f662826b6bed8cace05e7ff873ce0f9283b5c924470fe664fff1c2f00f581790" + +[[packages]] +name = "jaraco-context" +version = "6.0.1" + +[[packages.wheels]] +name = "jaraco.context-6.0.1-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/ff/db/0c52c4cf5e4bd9f5d7135ec7669a3a767af21b3a308e1ed3674881e52b62/jaraco.context-6.0.1-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "f797fc481b490edb305122c9181830a3a5b76d84ef6d1aef2fb9b47ab956f9e4" + +[[packages]] +name = "jaraco-functools" +version = "4.1.0" + +[[packages.wheels]] +name = "jaraco.functools-4.1.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/9f/4f/24b319316142c44283d7540e76c7b5a6dbd5db623abd86bb7b3491c21018/jaraco.functools-4.1.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "ad159f13428bc4acbf5541ad6dec511f91573b90fba04df61dafa2a1231cf649" + +[[packages]] +name = "jedi" +version = "0.19.2" + +[[packages.wheels]] +name = "jedi-0.19.2-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/c0/5a/9cac0c82afec3d09ccd97c8b6502d48f165f9124db81b4bcb90b4af974ee/jedi-0.19.2-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "a8ef22bde8490f57fe5c7681a3c83cb58874daf72b4784de3cce5b6ef6edb5b9" + +[[packages]] +name = "jellyfish" +version = "1.1.3" + +[[packages.wheels]] +name = "jellyfish-1.1.3-cp313-cp313-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/0c/c2/73b67a1a9444c5804ed4e2e4d55df3e94035efc279fe7426d2dbd2bca5c5/jellyfish-1.1.3-cp313-cp313-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "2113195a48ce8cb99d2bb2c6d9b119f58025dde1d727101518e7150c093a66da" + +[[packages]] +name = "jinja2" +version = "3.1.6" + +[[packages.wheels]] +name = "jinja2-3.1.6-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67" + +[[packages]] +name = "jiter" +version = "0.9.0" + +[[packages.wheels]] +name = "jiter-0.9.0-cp313-cp313-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/f4/1c/0c996fd90639acda75ed7fa698ee5fd7d80243057185dc2f63d4c1c9f6b9/jiter-0.9.0-cp313-cp313-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "c8ae3bf27cd1ac5e6e8b7a27487bf3ab5f82318211ec2e1346a5b058756361f7" + +[[packages]] +name = "joblib" +version = "1.4.2" + +[[packages.wheels]] +name = "joblib-1.4.2-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/91/29/df4b9b42f2be0b623cbd5e2140cafcaa2bef0759a00b7b70104dcfe2fb51/joblib-1.4.2-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "06d478d5674cbc267e7496a410ee875abd68e4340feff4490bcb7afb88060ae6" + +[[packages]] +name = "json5" +version = "0.10.0" + +[[packages.wheels]] +name = "json5-0.10.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/aa/42/797895b952b682c3dafe23b1834507ee7f02f4d6299b65aaa61425763278/json5-0.10.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "19b23410220a7271e8377f81ba8aacba2fdd56947fbb137ee5977cbe1f5e8dfa" + +[[packages]] +name = "jsonpatch" +version = "1.33" + +[[packages.wheels]] +name = "jsonpatch-1.33-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/73/07/02e16ed01e04a374e644b575638ec7987ae846d25ad97bcc9945a3ee4b0e/jsonpatch-1.33-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "0ae28c0cd062bbd8b8ecc26d7d164fbbea9652a1a3693f3b956c1eae5145dade" + +[[packages]] +name = "jsonpointer" +version = "3.0.0" + +[[packages.wheels]] +name = "jsonpointer-3.0.0-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/71/92/5e77f98553e9e75130c78900d000368476aed74276eb8ae8796f65f00918/jsonpointer-3.0.0-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "13e088adc14fca8b6aa8177c044e12701e6ad4b28ff10e65f2267a90109c9942" + +[[packages]] +name = "jsonschema" +version = "4.23.0" + +[[packages.wheels]] +name = "jsonschema-4.23.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/69/4a/4f9dbeb84e8850557c02365a0eee0649abe5eb1d84af92a25731c6c0f922/jsonschema-4.23.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "fbadb6f8b144a8f8cf9f0b89ba94501d143e50411a1278633f56a7acf7fd5566" + +[[packages]] +name = "jsonschema-specifications" +version = "2024.10.1" + +[[packages.wheels]] +name = "jsonschema_specifications-2024.10.1-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/d1/0f/8910b19ac0670a0f80ce1008e5e751c4a57e14d2c4c13a482aa6079fa9d6/jsonschema_specifications-2024.10.1-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "a09a0680616357d9a0ecf05c12ad234479f549239d0f5b55f3deea67475da9bf" + +[[packages]] +name = "julia" +version = "0.6.2" + +[[packages.wheels]] +name = "julia-0.6.2-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/82/af/2e9a1a996f32b34249582392bb419cf8983b627a1d31412acbe9d6dea5b0/julia-0.6.2-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "90752f71376fdb9919439d20496c2dab24486dfa4fe8a831d6dd14a1bcbc04d1" + +[[packages]] +name = "jupyter" +version = "1.1.1" + +[[packages.wheels]] +name = "jupyter-1.1.1-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/38/64/285f20a31679bf547b75602702f7800e74dbabae36ef324f716c02804753/jupyter-1.1.1-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "7a59533c22af65439b24bbe60373a4e95af8f16ac65a6c00820ad378e3f7cc83" + +[[packages]] +name = "jupyter-bokeh" +version = "4.0.5" + +[[packages.wheels]] +name = "jupyter_bokeh-4.0.5-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/47/78/33b2294aad62e5f95b89a89379c5995c2bd978018387ef8bec79f6dc272c/jupyter_bokeh-4.0.5-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "1110076c14c779071cf492646a1a871aefa8a477261e4721327a666e65df1a2c" + +[[packages]] +name = "jupyter-client" +version = "8.6.3" + +[[packages.wheels]] +name = "jupyter_client-8.6.3-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/11/85/b0394e0b6fcccd2c1eeefc230978a6f8cb0c5df1e4cd3e7625735a0d7d1e/jupyter_client-8.6.3-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "e8a19cc986cc45905ac3362915f410f3af85424b4c0905e94fa5f2cb08e8f23f" + +[[packages]] +name = "jupyter-console" +version = "6.6.3" + +[[packages.wheels]] +name = "jupyter_console-6.6.3-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/ca/77/71d78d58f15c22db16328a476426f7ac4a60d3a5a7ba3b9627ee2f7903d4/jupyter_console-6.6.3-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "309d33409fcc92ffdad25f0bcdf9a4a9daa61b6f341177570fdac03de5352485" + +[[packages]] +name = "jupyter-core" +version = "5.7.2" + +[[packages.wheels]] +name = "jupyter_core-5.7.2-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/c9/fb/108ecd1fe961941959ad0ee4e12ee7b8b1477247f30b1fdfd83ceaf017f0/jupyter_core-5.7.2-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "4f7315d2f6b4bcf2e3e7cb6e46772eba760ae459cd1f59d29eb57b0a01bd7409" + +[[packages]] +name = "jupyter-events" +version = "0.12.0" + +[[packages.wheels]] +name = "jupyter_events-0.12.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/e2/48/577993f1f99c552f18a0428731a755e06171f9902fa118c379eb7c04ea22/jupyter_events-0.12.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "6464b2fa5ad10451c3d35fabc75eab39556ae1e2853ad0c0cc31b656731a97fb" + +[[packages]] +name = "jupyter-leaflet" +version = "0.19.2" + +[[packages.wheels]] +name = "jupyter_leaflet-0.19.2-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/81/7c/3ade59500a358b9018a996d00c26eaede79f76ed362b7051bc5038d4a0d4/jupyter_leaflet-0.19.2-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "0d57e15e80c08a4360f0cde0b4c490beddc5d422bb0e9bc1c0b4479d3fb725a6" + +[[packages]] +name = "jupyter-lsp" +version = "2.2.5" + +[[packages.wheels]] +name = "jupyter_lsp-2.2.5-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/07/e0/7bd7cff65594fd9936e2f9385701e44574fc7d721331ff676ce440b14100/jupyter_lsp-2.2.5-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "45fbddbd505f3fbfb0b6cb2f1bc5e15e83ab7c79cd6e89416b248cb3c00c11da" + +[[packages]] +name = "jupyter-server" +version = "2.15.0" + +[[packages.wheels]] +name = "jupyter_server-2.15.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/e2/a2/89eeaf0bb954a123a909859fa507fa86f96eb61b62dc30667b60dbd5fdaf/jupyter_server-2.15.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "872d989becf83517012ee669f09604aa4a28097c0bd90b2f424310156c2cdae3" + +[[packages]] +name = "jupyter-server-terminals" +version = "0.5.3" + +[[packages.wheels]] +name = "jupyter_server_terminals-0.5.3-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/07/2d/2b32cdbe8d2a602f697a649798554e4f072115438e92249624e532e8aca6/jupyter_server_terminals-0.5.3-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "41ee0d7dc0ebf2809c668e0fc726dfaf258fcd3e769568996ca731b6194ae9aa" + +[[packages]] +name = "jupyterlab" +version = "4.4.2" + +[[packages.wheels]] +name = "jupyterlab-4.4.2-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/f6/ae/fbb93f4990b7648849b19112d8b3e7427bbfc9c5cc8fdc6bf14c0e86d104/jupyterlab-4.4.2-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "857111a50bed68542bf55dca784522fe728f9f88b4fe69e8c585db5c50900419" + +[[packages]] +name = "jupyterlab-pygments" +version = "0.3.0" + +[[packages.wheels]] +name = "jupyterlab_pygments-0.3.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/b1/dd/ead9d8ea85bf202d90cc513b533f9c363121c7792674f78e0d8a854b63b4/jupyterlab_pygments-0.3.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "841a89020971da1d8693f1a99997aefc5dc424bb1b251fd6322462a1b8842780" + +[[packages]] +name = "jupyterlab-server" +version = "2.27.3" + +[[packages.wheels]] +name = "jupyterlab_server-2.27.3-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/54/09/2032e7d15c544a0e3cd831c51d77a8ca57f7555b2e1b2922142eddb02a84/jupyterlab_server-2.27.3-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "e697488f66c3db49df675158a77b3b017520d772c6e1548c7d9bcc5df7944ee4" + +[[packages]] +name = "jupyterlab-widgets" +version = "3.0.14" + +[[packages.wheels]] +name = "jupyterlab_widgets-3.0.14-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/64/7a/f2479ba401e02f7fcbd3fc6af201eac888eaa188574b8e9df19452ab4972/jupyterlab_widgets-3.0.14-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "54c33e3306b7fca139d165d6190dc6c0627aafa5d14adfc974a4e9a3d26cb703" + +[[packages]] +name = "keras" +version = "3.10.0" + +[[packages.wheels]] +name = "keras-3.10.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/95/e6/4179c461a5fc43e3736880f64dbdc9b1a5349649f0ae32ded927c0e3a227/keras-3.10.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "c095a6bf90cd50defadf73d4859ff794fad76b775357ef7bd1dbf96388dae7d3" + +[[packages]] +name = "keyring" +version = "25.6.0" + +[[packages.wheels]] +name = "keyring-25.6.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/d3/32/da7f44bcb1105d3e88a0b74ebdca50c59121d2ddf71c9e34ba47df7f3a56/keyring-25.6.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "552a3f7af126ece7ed5c89753650eec89c7eaae8617d0aa4d9ad2b75111266bd" + +[[packages]] +name = "kiwisolver" +version = "1.4.8" + +[[packages.wheels]] +name = "kiwisolver-1.4.8-cp313-cp313-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/d0/dc/c1abe38c37c071d0fc71c9a474fd0b9ede05d42f5a458d584619cfd2371a/kiwisolver-1.4.8-cp313-cp313-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "a17b7c4f5b2c51bb68ed379defd608a03954a1845dfed7cc0117f1cc8a9b7fd2" + +[[packages]] +name = "langchain" +version = "0.3.25" + +[[packages.wheels]] +name = "langchain-0.3.25-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/ed/5c/5c0be747261e1f8129b875fa3bfea736bc5fe17652f9d5e15ca118571b6f/langchain-0.3.25-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "931f7d2d1eaf182f9f41c5e3272859cfe7f94fc1f7cef6b3e5a46024b4884c21" + +[[packages]] +name = "langchain-core" +version = "0.3.59" + +[[packages.wheels]] +name = "langchain_core-0.3.59-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/30/40/aa440a7cd05f1dab5d7c91a1284eb776c3cf3eb59fa18ed39927650cfa38/langchain_core-0.3.59-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "9686baaff43f2c8175535da13faf40e6866769015e93130c3c1e4243e7244d70" + +[[packages]] +name = "langchain-text-splitters" +version = "0.3.8" + +[[packages.wheels]] +name = "langchain_text_splitters-0.3.8-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/8b/a3/3696ff2444658053c01b6b7443e761f28bb71217d82bb89137a978c5f66f/langchain_text_splitters-0.3.8-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "e75cc0f4ae58dcf07d9f18776400cf8ade27fadd4ff6d264df6278bb302f6f02" + +[[packages]] +name = "langsmith" +version = "0.3.42" + +[[packages.wheels]] +name = "langsmith-0.3.42-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/89/8e/e8a58e0abaae3f3ac4702e9ca35d1fc6159711556b64ffd0e247771a3f12/langsmith-0.3.42-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "18114327f3364385dae4026ebfd57d1c1cb46d8f80931098f0f10abe533475ff" + +[[packages]] +name = "lazy-loader" +version = "0.4" + +[[packages.wheels]] +name = "lazy_loader-0.4-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/83/60/d497a310bde3f01cb805196ac61b7ad6dc5dcf8dce66634dc34364b20b4f/lazy_loader-0.4-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "342aa8e14d543a154047afb4ba8ef17f5563baad3fc610d7b15b213b0f119efc" + +[[packages]] +name = "linkify-it-py" +version = "2.0.3" + +[[packages.wheels]] +name = "linkify_it_py-2.0.3-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/04/1e/b832de447dee8b582cac175871d2f6c3d5077cc56d5575cadba1fd1cccfa/linkify_it_py-2.0.3-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "6bcbc417b0ac14323382aef5c5192c0075bf8a9d6b41820a2b66371eac6b6d79" + +[[packages]] +name = "llvmlite" +version = "0.44.0" + +[[packages.wheels]] +name = "llvmlite-0.44.0-cp313-cp313-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/d0/81/e66fc86539293282fd9cb7c9417438e897f369e79ffb62e1ae5e5154d4dd/llvmlite-0.44.0-cp313-cp313-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "2fb7c4f2fb86cbae6dca3db9ab203eeea0e22d73b99bc2341cdf9de93612e930" + +[[packages]] +name = "lmfit" +version = "1.3.3" + +[[packages.wheels]] +name = "lmfit-1.3.3-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/6a/e1/d5aeb89530550c7e797d3528225fa31012490e79c9df5cf72a0f07cc66d3/lmfit-1.3.3-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "a9e9ec7d0d0ec962cc6c078ad1ec6c8311d3ac0e5f0947a00a91f5509dacc2b2" + +[[packages]] +name = "locket" +version = "1.0.0" + +[[packages.wheels]] +name = "locket-1.0.0-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/db/bc/83e112abc66cd466c6b83f99118035867cecd41802f8d044638aa78a106e/locket-1.0.0-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "b6c819a722f7b6bd955b80781788e4a66a55628b858d347536b7e81325a3a5e3" + +[[packages]] +name = "logfire-api" +version = "3.12.0" + +[[packages.wheels]] +name = "logfire_api-3.12.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/97/c6/210bb1da7119af155276046c18ceff29867dfe9ea4bcb7d03397b28bd1cd/logfire_api-3.12.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "fc092c2dcb24c8462ba776f3b0c2183f82e1cd55f86e29b38cf21a048e66a17d" + +[[packages]] +name = "lxml" +version = "5.3.0" + +[[packages.wheels]] +name = "lxml-5.3.0-cp313-cp313-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/7d/db/214290d58ad68c587bd5d6af3d34e56830438733d0d0856c0275fde43652/lxml-5.3.0-cp313-cp313-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "406246b96d552e0503e17a1006fd27edac678b3fcc9f1be71a2f94b4ff61528d" + +[[packages]] +name = "mako" +version = "1.3.9" + +[[packages.wheels]] +name = "Mako-1.3.9-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/cd/83/de0a49e7de540513f53ab5d2e105321dedeb08a8f5850f0208decf4390ec/Mako-1.3.9-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "95920acccb578427a9aa38e37a186b1e43156c87260d7ba18ca63aa4c7cbd3a1" + +[[packages]] +name = "markdown" +version = "3.7" + +[[packages.wheels]] +name = "Markdown-3.7-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/3f/08/83871f3c50fc983b88547c196d11cf8c3340e37c32d2e9d6152abe2c61f7/Markdown-3.7-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "7eb6df5690b81a1d7942992c97fad2938e956e79df20cbc6186e9c3a77b1c803" + +[[packages]] +name = "markdown-it-py" +version = "3.0.0" + +[[packages.wheels]] +name = "markdown_it_py-3.0.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/42/d7/1ec15b46af6af88f19b8e5ffea08fa375d433c998b8a7639e76935c14f1f/markdown_it_py-3.0.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1" + +[[packages]] +name = "markupsafe" +version = "3.0.2" + +[[packages.wheels]] +name = "MarkupSafe-3.0.2-cp313-cp313-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/29/88/07df22d2dd4df40aba9f3e402e6dc1b8ee86297dddbad4872bd5e7b0094f/MarkupSafe-3.0.2-cp313-cp313-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "e6a2a455bd412959b57a172ce6328d2dd1f01cb2135efda2e4576e8a23fa3b0f" + +[[packages]] +name = "matplotlib" +version = "3.10.3" + +[[packages.wheels]] +name = "matplotlib-3.10.3-cp313-cp313-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/b1/0f/eed564407bd4d935ffabf561ed31099ed609e19287409a27b6d336848653/matplotlib-3.10.3-cp313-cp313-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "151d89cb8d33cb23345cd12490c76fd5d18a56581a16d950b48c6ff19bb2ab93" + +[[packages]] +name = "matplotlib-inline" +version = "0.1.7" + +[[packages.wheels]] +name = "matplotlib_inline-0.1.7-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/8f/8e/9ad090d3553c280a8060fbf6e24dc1c0c29704ee7d1c372f0c174aa59285/matplotlib_inline-0.1.7-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "df192d39a4ff8f21b1895d72e6a13f5fcc5099f00fa84384e0ea28c2cc0653ca" + +[[packages]] +name = "maturin" +version = "1.8.3" + +[[packages.wheels]] +name = "maturin-1.8.3-py3-none-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/d5/62/f92a130a370dd7aca13c316844b82853647f048cfe1594a81f628ab7101f/maturin-1.8.3-py3-none-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "85f2b882d8235c1c1cb0a38d382ccd5b3ba0674d99cb548d49df9342cc688e36" + +[[packages]] +name = "mccabe" +version = "0.7.0" + +[[packages.wheels]] +name = "mccabe-0.7.0-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/27/1a/1f68f9ba0c207934b35b86a8ca3aad8395a3d6dd7921c0686e23853ff5a9/mccabe-0.7.0-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e" + +[[packages]] +name = "mcp" +version = "1.9.3" + +[[packages.wheels]] +name = "mcp-1.9.3-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/79/45/823ad05504bea55cb0feb7470387f151252127ad5c72f8882e8fe6cf5c0e/mcp-1.9.3-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "69b0136d1ac9927402ed4cf221d4b8ff875e7132b0b06edd446448766f34f9b9" + +[[packages]] +name = "mdit-py-plugins" +version = "0.4.2" + +[[packages.wheels]] +name = "mdit_py_plugins-0.4.2-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/a7/f7/7782a043553ee469c1ff49cfa1cdace2d6bf99a1f333cf38676b3ddf30da/mdit_py_plugins-0.4.2-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "0c673c3f889399a33b95e88d2f0d111b4447bdfea7f237dab2d488f459835636" + +[[packages]] +name = "mdurl" +version = "0.1.2" + +[[packages.wheels]] +name = "mdurl-0.1.2-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8" + +[[packages]] +name = "mercantile" +version = "1.2.1" + +[[packages.wheels]] +name = "mercantile-1.2.1-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/b2/d6/de0cc74f8d36976aeca0dd2e9cbf711882ff8e177495115fd82459afdc4d/mercantile-1.2.1-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "30f457a73ee88261aab787b7069d85961a5703bb09dc57a170190bc042cd023f" + +[[packages]] +name = "mergedeep" +version = "1.3.4" + +[[packages.wheels]] +name = "mergedeep-1.3.4-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/2c/19/04f9b178c2d8a15b076c8b5140708fa6ffc5601fb6f1e975537072df5b2a/mergedeep-1.3.4-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "70775750742b25c0d8f36c55aed03d24c3384d17c951b3175d898bd778ef0307" + +[[packages]] +name = "missingno" +version = "0.5.2" + +[[packages.wheels]] +name = "missingno-0.5.2-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/87/22/cd5cf999af21c2f97486622c551ac3d07361ced8125121e907f588ff5f24/missingno-0.5.2-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "55782621ce09ba0f0a1d08e5bd6d6fe1946469fb03951fadf7d209911ca5b072" + +[[packages]] +name = "mistralai" +version = "1.8.1" + +[[packages.wheels]] +name = "mistralai-1.8.1-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/b0/14/e9ef675928768f508dfcedbb0e0ed601784a6911620a2bc25c9065921420/mistralai-1.8.1-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "badfc7e6832d894b3e9071d92ad621212b7cccd7df622c6cacdb525162ae338f" + +[[packages]] +name = "mistune" +version = "3.1.3" + +[[packages.wheels]] +name = "mistune-3.1.3-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/01/4d/23c4e4f09da849e127e9f123241946c23c1e30f45a88366879e064211815/mistune-3.1.3-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "1a32314113cff28aa6432e99e522677c8587fd83e3d51c29b82a52409c842bd9" + +[[packages]] +name = "mizani" +version = "0.11.4" + +[[packages.wheels]] +name = "mizani-0.11.4-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/2a/11/f3777ad46c5d92e3ead121c22ea45fafb6c3b2c1edca0c0c6494969c125c/mizani-0.11.4-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "5b6271dc3da2c88694dca2e0e0a7e1879f0e2fb046c789776f54d090a5243735" + +[[packages]] +name = "ml-dtypes" +version = "0.5.1" + +[[packages.wheels]] +name = "ml_dtypes-0.5.1-cp313-cp313-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/da/8a/a2b9375c94077e5a488a624a195621407846f504068ce22ccf805c674156/ml_dtypes-0.5.1-cp313-cp313-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "fd918d4e6a4e0c110e2e05be7a7814d10dc1b95872accbf6512b80a109b71ae1" + +[[packages]] +name = "mlxtend" +version = "0.23.3" + +[[packages.wheels]] +name = "mlxtend-0.23.3-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/0f/92/5c322336a0991949a1e91f6acd7e04f7e05b0fb6252a3f00fcdc0cb5e97d/mlxtend-0.23.3-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "f9fec721c4121be87dac00e513456dde5bf56b7427750719c0a291cd58b6538e" + +[[packages]] +name = "more-itertools" +version = "10.6.0" + +[[packages.wheels]] +name = "more_itertools-10.6.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/23/62/0fe302c6d1be1c777cab0616e6302478251dfbf9055ad426f5d0def75c89/more_itertools-10.6.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "6eb054cb4b6db1473f6e15fcc676a08e4732548acd47c708f0e179c2c7c01e89" + +[[packages]] +name = "mpld3" +version = "0.5.10" + +[[packages.wheels]] +name = "mpld3-0.5.10-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/95/6a/e3691bcc47485f38b09853207c928130571821d187cf174eed5418d45e82/mpld3-0.5.10-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "80877acce87ea447380fad7374668737505c8c0684aab05238e7c5dc1fab38c1" + +[[packages]] +name = "mpmath" +version = "1.3.0" + +[[packages.wheels]] +name = "mpmath-1.3.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/43/e3/7d92a15f894aa0c9c4b49b8ee9ac9850d6e63b03c9c32c0367a13ae62209/mpmath-1.3.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "a0b2b9fe80bbcd81a6647ff13108738cfb482d481d826cc0e02f5b35e5c88d2c" + +[[packages]] +name = "msal" +version = "1.30.0" + +[[packages.wheels]] +name = "msal-1.30.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/ab/82/8f19334da43b7ef72d995587991a446f140346d76edb96a2c1a2689588e9/msal-1.30.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "423872177410cb61683566dc3932db7a76f661a5d2f6f52f02a047f101e1c1de" + +[[packages]] +name = "msal-extensions" +version = "1.2.0" + +[[packages.wheels]] +name = "msal_extensions-1.2.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/2c/69/314d887a01599669fb330da14e5c6ff5f138609e322812a942a74ef9b765/msal_extensions-1.2.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "cf5ba83a2113fa6dc011a254a72f1c223c88d7dfad74cc30617c4679a417704d" + +[[packages]] +name = "msgpack" +version = "1.1.0" + +[[packages.wheels]] +name = "msgpack-1.1.0-cp313-cp313-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/b6/bc/8bd826dd03e022153bfa1766dcdec4976d6c818865ed54223d71f07862b3/msgpack-1.1.0-cp313-cp313-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "bce7d9e614a04d0883af0b3d4d501171fbfca038f12c77fa838d9f198147a23f" + +[[packages]] +name = "multidict" +version = "6.4.3" + +[[packages.wheels]] +name = "multidict-6.4.3-cp313-cp313-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/23/57/2c0167a1bffa30d9a1383c3dab99d8caae985defc8636934b5668830d2ef/multidict-6.4.3-cp313-cp313-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "1c152c49e42277bc9a2f7b78bd5fa10b13e88d1b0328221e7aef89d5c60a99a5" + +[[packages]] +name = "multipledispatch" +version = "1.0.0" + +[[packages.wheels]] +name = "multipledispatch-1.0.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/51/c0/00c9809d8b9346eb238a6bbd5f83e846a4ce4503da94a4c08cb7284c325b/multipledispatch-1.0.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "0c53cd8b077546da4e48869f49b13164bebafd0c2a5afceb6bb6a316e7fb46e4" + +[[packages]] +name = "mypy" +version = "1.15.0" + +[[packages.wheels]] +name = "mypy-1.15.0-cp313-cp313-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/83/3e/57bb447f7bbbfaabf1712d96f9df142624a386d98fb026a761532526057e/mypy-1.15.0-cp313-cp313-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "b9378e2c00146c44793c98b8d5a61039a048e31f429fb0eb546d93f4b000bedf" + +[[packages]] +name = "mypy-extensions" +version = "1.0.0" + +[[packages.wheels]] +name = "mypy_extensions-1.0.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/2a/e2/5d3f6ada4297caebe1a2add3b126fe800c96f56dbe5d1988a2cbe0b267aa/mypy_extensions-1.0.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d" + +[[packages]] +name = "mysql-connector-python" +version = "9.2.0" + +[[packages.wheels]] +name = "mysql_connector_python-9.2.0-cp313-cp313-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/22/4b/4f5462a81d046bb54bbb62ffbcea654e78f3ae2a64eb24a14c2872c4d75e/mysql_connector_python-9.2.0-cp313-cp313-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "6557942f6c6be3b41d2965456b53a244a7ce3e6fb81cb195c243549be72a6a24" + +[[packages]] +name = "namex" +version = "0.0.8" + +[[packages.wheels]] +name = "namex-0.0.8-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/73/59/7854fbfb59f8ae35483ce93493708be5942ebb6328cd85b3a609df629736/namex-0.0.8-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "7ddb6c2bb0e753a311b7590f84f6da659dd0c05e65cb89d519d54c0a250c0487" + +[[packages]] +name = "narwhals" +version = "1.36.0" + +[[packages.wheels]] +name = "narwhals-1.36.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/42/bf/fbcbd9f8676e06ed43d644a4ddbf31478a44056487578ce67f191da430cb/narwhals-1.36.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "e3c50dd1d769bc145f57ae17c1f0f0da6c3d397d62cdd0bb167e9b618e95c9d6" + +[[packages]] +name = "nbclient" +version = "0.10.2" + +[[packages.wheels]] +name = "nbclient-0.10.2-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/34/6d/e7fa07f03a4a7b221d94b4d586edb754a9b0dc3c9e2c93353e9fa4e0d117/nbclient-0.10.2-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "4ffee11e788b4a27fabeb7955547e4318a5298f34342a4bfd01f2e1faaeadc3d" + +[[packages]] +name = "nbconvert" +version = "7.16.6" + +[[packages.wheels]] +name = "nbconvert-7.16.6-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/cc/9a/cd673b2f773a12c992f41309ef81b99da1690426bd2f96957a7ade0d3ed7/nbconvert-7.16.6-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "1375a7b67e0c2883678c48e506dc320febb57685e5ee67faa51b18a90f3a712b" + +[[packages]] +name = "nbformat" +version = "5.10.4" + +[[packages.wheels]] +name = "nbformat-5.10.4-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/a9/82/0340caa499416c78e5d8f5f05947ae4bc3cba53c9f038ab6e9ed964e22f1/nbformat-5.10.4-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "3b48d6c8fbca4b299bf3982ea7db1af21580e4fec269ad087b9e81588891200b" + +[[packages]] +name = "nest-asyncio" +version = "1.6.0" + +[[packages.wheels]] +name = "nest_asyncio-1.6.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/a0/c4/c2971a3ba4c6103a3d10c4b0f24f461ddc027f0f09763220cf35ca1401b3/nest_asyncio-1.6.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "87af6efd6b5e897c81050477ef65c62e2b2f35d51703cae01aff2905b1852e1c" + +[[packages]] +name = "networkx" +version = "3.4.2" + +[[packages.wheels]] +name = "networkx-3.4.2-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/b9/54/dd730b32ea14ea797530a4479b2ed46a6fb250f682a9cfb997e968bf0261/networkx-3.4.2-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "df5d4365b724cf81b8c6a7312509d0c22386097011ad1abe274afd5e9d3bbc5f" + +[[packages]] +name = "nh3" +version = "0.2.18" + +[[packages.wheels]] +name = "nh3-0.2.18-cp37-abi3-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/26/8d/53c5b19c4999bdc6ba95f246f4ef35ca83d7d7423e5e38be43ad66544e5d/nh3-0.2.18-cp37-abi3-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "8ce0f819d2f1933953fca255db2471ad58184a60508f03e6285e5114b6254844" + +[[packages]] +name = "nltk" +version = "3.9.1" + +[[packages.wheels]] +name = "nltk-3.9.1-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/4d/66/7d9e26593edda06e8cb531874633f7c2372279c3b0f46235539fe546df8b/nltk-3.9.1-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "4fa26829c5b00715afe3061398a8989dc643b92ce7dd93fb4585a70930d168a1" + +[[packages]] +name = "notebook" +version = "7.4.2" + +[[packages.wheels]] +name = "notebook-7.4.2-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/1e/16/d3c36a0b1f6dfcf218add8eaf803bf0473ff50681ac4d51acb7ba02bce34/notebook-7.4.2-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "9ccef602721aaa5530852e3064710b8ae5415c4e2ce26f8896d0433222755259" + +[[packages]] +name = "notebook-shim" +version = "0.2.4" + +[[packages.wheels]] +name = "notebook_shim-0.2.4-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/f9/33/bd5b9137445ea4b680023eb0469b2bb969d61303dedb2aac6560ff3d14a1/notebook_shim-0.2.4-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "411a5be4e9dc882a074ccbcae671eda64cceb068767e9a3419096986560e1cef" + +[[packages]] +name = "numba" +version = "0.61.2" + +[[packages.wheels]] +name = "numba-0.61.2-cp313-cp313-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/af/a4/6d3a0f2d3989e62a18749e1e9913d5fa4910bbb3e3311a035baea6caf26d/numba-0.61.2-cp313-cp313-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "59321215e2e0ac5fa928a8020ab00b8e57cda8a97384963ac0dfa4d4e6aa54e7" + +[[packages]] +name = "numpy" +version = "2.2.6" + +[[packages.wheels]] +name = "numpy-2.2.6-cp313-cp313-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/cb/3b/d58c12eafcb298d4e6d0d40216866ab15f59e55d148a5658bb3132311fcf/numpy-2.2.6-cp313-cp313-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "b0544343a702fa80c95ad5d3d608ea3599dd54d4632df855e4c8d24eb6ecfa1c" + +[[packages]] +name = "numpydoc" +version = "1.8.0" + +[[packages.wheels]] +name = "numpydoc-1.8.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/6c/45/56d99ba9366476cd8548527667f01869279cedb9e66b28eb4dfb27701679/numpydoc-1.8.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "72024c7fd5e17375dec3608a27c03303e8ad00c81292667955c6fea7a3ccf541" + +[[packages]] +name = "openai" +version = "1.82.0" + +[[packages.wheels]] +name = "openai-1.82.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/51/4b/a59464ee5f77822a81ee069b4021163a0174940a92685efc3cf8b4c443a3/openai-1.82.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "8c40647fea1816516cb3de5189775b30b5f4812777e40b8768f361f232b61b30" + +[[packages]] +name = "opencv-python" +version = "4.11.0.86" + +[[packages.wheels]] +name = "opencv_python-4.11.0.86-cp37-abi3-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/a4/7d/f1c30a92854540bf789e9cd5dde7ef49bbe63f855b85a2e6b3db8135c591/opencv_python-4.11.0.86-cp37-abi3-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "085ad9b77c18853ea66283e98affefe2de8cc4c1f43eda4c100cf9b2721142ec" + +[[packages]] +name = "openpyxl" +version = "3.1.5" + +[[packages.wheels]] +name = "openpyxl-3.1.5-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/c0/da/977ded879c29cbd04de313843e76868e6e13408a94ed6b987245dc7c8506/openpyxl-3.1.5-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "5282c12b107bffeef825f4617dc029afaf41d0ea60823bbb665ef3079dc79de2" + +[[packages]] +name = "opentelemetry-api" +version = "1.32.1" + +[[packages.wheels]] +name = "opentelemetry_api-1.32.1-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/12/f2/89ea3361a305466bc6460a532188830351220b5f0851a5fa133155c16eca/opentelemetry_api-1.32.1-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "bbd19f14ab9f15f0e85e43e6a958aa4cb1f36870ee62b7fd205783a112012724" + +[[packages]] +name = "optree" +version = "0.14.1" + +[[packages.wheels]] +name = "optree-0.14.1-cp313-cp313-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/90/43/93aa65f56b857b8364e76d76eb188a4a6912ed305374b90f9ba30dcf0de9/optree-0.14.1-cp313-cp313-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "25ea23fc6d6c0fa7dcf85afcfe10b43ed4fdf0e9d958a3677cd27fcdf0ca17d6" + +[[packages]] +name = "optuna" +version = "4.2.1" + +[[packages.wheels]] +name = "optuna-4.2.1-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/28/09/c4d329f7969443cdd4d482048ca406b6f61cda3c8e99ace71feaec7c8734/optuna-4.2.1-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "6d38199013441d3f70fac27136e05c0188c5f4ec3848db708ac311cbdeb30dbf" + +[[packages]] +name = "orjson" +version = "3.10.16" + +[[packages.wheels]] +name = "orjson-3.10.16-cp313-cp313-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/81/9c/b66ce9245ff319df2c3278acd351a3f6145ef34b4a2d7f4b0f739368370f/orjson-3.10.16-cp313-cp313-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "fe0a145e96d51971407cb8ba947e63ead2aa915db59d6631a355f5f2150b56b7" + +[[packages]] +name = "osqp" +version = "0.6.7.post3" + +[[packages.wheels]] +name = "osqp-0.6.7.post3-cp313-cp313-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/4b/0a/acd48ad432ccf2538972805095108801a3b29a2433b48bd3a34e640df1e4/osqp-0.6.7.post3-cp313-cp313-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "acb219e941f5248da5de3ee9b70e6a5aaddf5f3989dffd1d4c03b0f7b1dfa17b" + +[[packages]] +name = "outcome" +version = "1.3.0.post0" + +[[packages.wheels]] +name = "outcome-1.3.0.post0-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/55/8b/5ab7257531a5d830fc8000c476e63c935488d74609b50f9384a643ec0a62/outcome-1.3.0.post0-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "e771c5ce06d1415e356078d3bdd68523f284b4ce5419828922b6871e65eda82b" + +[[packages]] +name = "overrides" +version = "7.7.0" + +[[packages.wheels]] +name = "overrides-7.7.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/2c/ab/fc8290c6a4c722e5514d80f62b2dc4c4df1a68a41d1364e625c35990fcf3/overrides-7.7.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "c7ed9d062f78b8e4c1a7b70bd8796b35ead4d9f510227ef9c5dc7626c60d7e49" + +[[packages]] +name = "packaging" +version = "24.2" + +[[packages.wheels]] +name = "packaging-24.2-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/88/ef/eb23f262cca3c0c4eb7ab1933c3b1f03d021f2c48f54763065b6f0e321be/packaging-24.2-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "09abb1bccd265c01f4a3aa3f7a7db064b36514d2cba19a2f694fe6150451a759" + +[[packages]] +name = "pandas" +version = "2.2.3" + +[[packages.wheels]] +name = "pandas-2.2.3-cp313-cp313-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/3b/bc/4b18e2b8c002572c5a441a64826252ce5da2aa738855747247a971988043/pandas-2.2.3-cp313-cp313-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "61c5ad4043f791b61dd4752191d9f07f0ae412515d59ba8f005832a532f8736d" + +[[packages]] +name = "pandocfilters" +version = "1.5.1" + +[[packages.wheels]] +name = "pandocfilters-1.5.1-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/ef/af/4fbc8cab944db5d21b7e2a5b8e9211a03a79852b1157e2c102fcc61ac440/pandocfilters-1.5.1-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "93be382804a9cdb0a7267585f157e5d1731bbe5545a85b268d6f5fe6232de2bc" + +[[packages]] +name = "panel" +version = "1.6.3" + +[[packages.wheels]] +name = "panel-1.6.3-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/7a/fe/d01b6eae59933d56c345e57cdde5ffe379b7b1f56d192782ab8071249f73/panel-1.6.3-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "ccd2a0587ab382bd55b8ea099706f31b64aadac697b8a41923d3b18b9ed618d6" + +[[packages]] +name = "papermill" +version = "2.6.0" + +[[packages.wheels]] +name = "papermill-2.6.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/61/55/83ce641bc61a70cc0721af6f50154ecaaccedfbdbc27366c1755a2a34972/papermill-2.6.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "0f09da6ef709f3f14dde77cb1af052d05b14019189869affff374c9e612f2dd5" + +[[packages]] +name = "param" +version = "2.2.0" + +[[packages.wheels]] +name = "param-2.2.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/99/56/370a6636e072a037b52499edd8928942df7f887974fc54444ece5152d26a/param-2.2.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "777f8c7b66ab820b70ea5ad09faaa6818308220caae89da3b5c5f359faa72a5e" + +[[packages]] +name = "parso" +version = "0.8.4" + +[[packages.wheels]] +name = "parso-0.8.4-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/c6/ac/dac4a63f978e4dcb3c6d3a78c4d8e0192a113d288502a1216950c41b1027/parso-0.8.4-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "a418670a20291dacd2dddc80c377c5c3791378ee1e8d12bffc35420643d43f18" + +[[packages]] +name = "partd" +version = "1.4.2" + +[[packages.wheels]] +name = "partd-1.4.2-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/71/e7/40fb618334dcdf7c5a316c0e7343c5cd82d3d866edc100d98e29bc945ecd/partd-1.4.2-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "978e4ac767ec4ba5b86c6eaa52e5a2a3bc748a2ca839e8cc798f1cc6ce6efb0f" + +[[packages]] +name = "pathspec" +version = "0.12.1" + +[[packages.wheels]] +name = "pathspec-0.12.1-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/cc/20/ff623b09d963f88bfde16306a54e12ee5ea43e9b597108672ff3a408aad6/pathspec-0.12.1-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08" + +[[packages]] +name = "patsy" +version = "1.0.1" + +[[packages.wheels]] +name = "patsy-1.0.1-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/87/2b/b50d3d08ea0fc419c183a84210571eba005328efa62b6b98bc28e9ead32a/patsy-1.0.1-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "751fb38f9e97e62312e921a1954b81e1bb2bcda4f5eeabaf94db251ee791509c" + +[[packages]] +name = "pep8" +version = "1.7.1" + +[[packages.wheels]] +name = "pep8-1.7.1-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/42/3f/669429ce58de2c22d8d2c542752e137ec4b9885fff398d3eceb1a7f5acb4/pep8-1.7.1-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "b22cfae5db09833bb9bd7c8463b53e1a9c9b39f12e304a8d0bba729c501827ee" + +[[packages]] +name = "pexpect" +version = "4.9.0" + +[[packages.wheels]] +name = "pexpect-4.9.0-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/9e/c3/059298687310d527a58bb01f3b1965787ee3b40dce76752eda8b44e9a2c5/pexpect-4.9.0-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "7236d1e080e4936be2dc3e326cec0af72acf9212a7e1d060210e70a47e253523" + +[[packages]] +name = "pg8000" +version = "1.31.2" + +[[packages.wheels]] +name = "pg8000-1.31.2-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/09/a0/2b30d52017c4ced8fc107386666ea7573954eb708bf66121f0229df05d41/pg8000-1.31.2-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "436c771ede71af4d4c22ba867a30add0bc5c942d7ab27fadbb6934a487ecc8f6" + +[[packages]] +name = "pickleshare" +version = "0.7.5" + +[[packages.wheels]] +name = "pickleshare-0.7.5-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/9a/41/220f49aaea88bc6fa6cba8d05ecf24676326156c23b991e80b3f2fc24c77/pickleshare-0.7.5-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "9649af414d74d4df115d5d718f82acb59c9d418196b7b4290ed47a12ce62df56" + +[[packages]] +name = "pillow" +version = "11.1.0" + +[[packages.wheels]] +name = "pillow-11.1.0-cp313-cp313-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/3b/ad/285c556747d34c399f332ba7c1a595ba245796ef3e22eae190f5364bb62b/pillow-11.1.0-cp313-cp313-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "593c5fd6be85da83656b93ffcccc2312d2d149d251e98588b14fbc288fd8909c" + +[[packages]] +name = "platformdirs" +version = "4.3.7" + +[[packages.wheels]] +name = "platformdirs-4.3.7-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/6d/45/59578566b3275b8fd9157885918fcd0c4d74162928a5310926887b856a51/platformdirs-4.3.7-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "a03875334331946f13c549dbd8f4bac7a13a50a895a0eb1e8c6a8ace80d40a94" + +[[packages]] +name = "plotly" +version = "6.0.1" + +[[packages.wheels]] +name = "plotly-6.0.1-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/02/65/ad2bc85f7377f5cfba5d4466d5474423a3fb7f6a97fd807c06f92dd3e721/plotly-6.0.1-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "4714db20fea57a435692c548a4eb4fae454f7daddf15f8d8ba7e1045681d7768" + +[[packages]] +name = "plotnine" +version = "0.13.6" + +[[packages.wheels]] +name = "plotnine-0.13.6-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/93/b1/e1c84e68cf24e83c4d251122e04c48840be203dafb4727e738381cdefa74/plotnine-0.13.6-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "4acc1af29fa4e91e726b67d49277e8368f62e1c817f01bf14ecd8ca5e83bfaea" + +[[packages]] +name = "plotpy" +version = "2.7.4" + +[[packages.wheels]] +name = "plotpy-2.7.4-cp313-cp313-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/61/98/9bc8f5a00dd45b53c37292c08ebcf9f94e895838ab2ad295d1c0eec88332/plotpy-2.7.4-cp313-cp313-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "8dff5fd388048a8d3b4251329a9fe4027920386e0ebcc3c3642f59c432118c29" + +[[packages]] +name = "pluggy" +version = "1.5.0" + +[[packages.wheels]] +name = "pluggy-1.5.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/88/5f/e351af9a41f866ac3f1fac4ca0613908d9a41741cfcf2228f4ad853b697d/pluggy-1.5.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669" + +[[packages]] +name = "ply" +version = "3.11" + +[[packages.wheels]] +name = "ply-3.11-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/a3/58/35da89ee790598a0700ea49b2a66594140f44dec458c07e8e3d4979137fc/ply-3.11-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "096f9b8350b65ebd2fd1346b12452efe5b9607f7482813ffca50c22722a807ce" + +[[packages]] +name = "polars" +version = "1.31.0" + +[[packages.wheels]] +name = "polars-1.31.0-cp39-abi3-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/6e/f6/9d9ad9dc4480d66502497e90ce29efc063373e1598f4bd9b6a38af3e08e7/polars-1.31.0-cp39-abi3-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "3fd874d3432fc932863e8cceff2cff8a12a51976b053f2eb6326a0672134a632" + +[[packages]] +name = "portalocker" +version = "2.7.0" + +[[packages.wheels]] +name = "portalocker-2.7.0-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/8c/df/d4f711d168524f5aebd7fb30969eaa31e3048cf8979688cde3b08f6e5eb8/portalocker-2.7.0-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "a07c5b4f3985c3cf4798369631fb7011adb498e2a46d8440efc75a8f29a0f983" + +[[packages]] +name = "prettytable" +version = "3.16.0" + +[[packages.wheels]] +name = "prettytable-3.16.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/02/c7/5613524e606ea1688b3bdbf48aa64bafb6d0a4ac3750274c43b6158a390f/prettytable-3.16.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "b5eccfabb82222f5aa46b798ff02a8452cf530a352c31bddfa29be41242863aa" + +[[packages]] +name = "prince" +version = "0.16.0" + +[[packages.wheels]] +name = "prince-0.16.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/18/d5/b4480a0f381cbbcfad31f4d118732ab717216857508a730938ee615669a1/prince-0.16.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "7e21a78d4dd06ca3ec526ee714a50b349f26de3fca6b79664150a951b31688f3" + +[[packages]] +name = "priority" +version = "2.0.0" + +[[packages.wheels]] +name = "priority-2.0.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/5e/5f/82c8074f7e84978129347c2c6ec8b6c59f3584ff1a20bc3c940a3e061790/priority-2.0.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "6f8eefce5f3ad59baf2c080a664037bb4725cd0a790d53d59ab4059288faf6aa" + +[[packages]] +name = "prometheus-client" +version = "0.21.1" + +[[packages.wheels]] +name = "prometheus_client-0.21.1-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/ff/c2/ab7d37426c179ceb9aeb109a85cda8948bb269b7561a0be870cc656eefe4/prometheus_client-0.21.1-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "594b45c410d6f4f8888940fe80b5cc2521b305a1fafe1c58609ef715a001f301" + +[[packages]] +name = "prompt-toolkit" +version = "3.0.51" + +[[packages.wheels]] +name = "prompt_toolkit-3.0.51-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/ce/4f/5249960887b1fbe561d9ff265496d170b55a735b76724f10ef19f9e40716/prompt_toolkit-3.0.51-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "52742911fde84e2d423e2f9a4cf1de7d7ac4e51958f648d9540e0fb8db077b07" + +[[packages]] +name = "propcache" +version = "0.3.1" + +[[packages.wheels]] +name = "propcache-0.3.1-cp313-cp313-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/a6/2c/a54614d61895ba6dd7ac8f107e2b2a0347259ab29cbf2ecc7b94fa38c4dc/propcache-0.3.1-cp313-cp313-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "813fbb8b6aea2fc9659815e585e548fe706d6f663fa73dff59a1677d4595a037" + +[[packages]] +name = "protobuf" +version = "6.30.2" + +[[packages.wheels]] +name = "protobuf-6.30.2-cp310-abi3-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/97/e9/7b9f1b259d509aef2b833c29a1f3c39185e2bf21c9c1be1cd11c22cb2149/protobuf-6.30.2-cp310-abi3-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "7653c99774f73fe6b9301b87da52af0e69783a2e371e8b599b3e9cb4da4b12b9" + +[[packages]] +name = "psutil" +version = "7.0.0" + +[[packages.wheels]] +name = "psutil-7.0.0-cp37-abi3-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/50/1b/6921afe68c74868b4c9fa424dad3be35b095e16687989ebbb50ce4fceb7c/psutil-7.0.0-cp37-abi3-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "4cf3d4eb1aa9b348dec30105c55cd9b7d4629285735a102beb4441e38db90553" + +[[packages]] +name = "psygnal" +version = "0.12.0" + +[[packages.wheels]] +name = "psygnal-0.12.0-cp313-cp313-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/5e/ae/a3d6815db583b6d05878b3647ea0e2aa21ce6941d03c9d2c6caad1afbcf6/psygnal-0.12.0-cp313-cp313-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "d779f20c6977ec9d5b9fece23b4b28bbcf0a7773539a4a176b5527aea5da27c7" + +[[packages]] +name = "ptpython" +version = "3.0.29" + +[[packages.wheels]] +name = "ptpython-3.0.29-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/0f/39/c6fd4dd531e067b6a01624126cff0b3ddc6569e22f83e48d8418ffa9e3be/ptpython-3.0.29-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "65d75c4871859e4305a020c9b9e204366dceb4d08e0e2bd7b7511bd5e917a402" + +[[packages]] +name = "ptyprocess" +version = "0.7.0" + +[[packages.wheels]] +name = "ptyprocess-0.7.0-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/22/a6/858897256d0deac81a172289110f31629fc4cee19b6f01283303e18c8db3/ptyprocess-0.7.0-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35" + +[[packages]] +name = "pure-eval" +version = "0.2.3" + +[[packages.wheels]] +name = "pure_eval-0.2.3-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/8e/37/efad0257dc6e593a18957422533ff0f87ede7c9c6ea010a2177d738fb82f/pure_eval-0.2.3-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "1db8e35b67b3d218d818ae653e27f06c3aa420901fa7b081ca98cbedc874e0d0" + +[[packages]] +name = "pyarrow" +version = "20.0.0" + +[[packages.wheels]] +name = "pyarrow-20.0.0-cp313-cp313-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/9d/07/290f4abf9ca702c5df7b47739c1b2c83588641ddfa2cc75e34a301d42e55/pyarrow-20.0.0-cp313-cp313-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "30b3051b7975801c1e1d387e17c588d8ab05ced9b1e14eec57915f79869b5031" + +[[packages]] +name = "pyasn1" +version = "0.6.1" + +[[packages.wheels]] +name = "pyasn1-0.6.1-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/c8/f1/d6a797abb14f6283c0ddff96bbdd46937f64122b8c925cab503dd37f8214/pyasn1-0.6.1-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "0d632f46f2ba09143da3a8afe9e33fb6f92fa2320ab7e886e2d0f7672af84629" + +[[packages]] +name = "pyasn1-modules" +version = "0.4.1" + +[[packages.wheels]] +name = "pyasn1_modules-0.4.1-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/77/89/bc88a6711935ba795a679ea6ebee07e128050d6382eaa35a0a47c8032bdc/pyasn1_modules-0.4.1-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "49bfa96b45a292b711e986f222502c1c9a5e1f4e568fc30e2574a6c7d07838fd" + +[[packages]] +name = "pybind11" +version = "2.13.6" + +[[packages.wheels]] +name = "pybind11-2.13.6-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/13/2f/0f24b288e2ce56f51c920137620b4434a38fd80583dbbe24fc2a1656c388/pybind11-2.13.6-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "237c41e29157b962835d356b370ededd57594a26d5894a795960f0047cb5caf5" + +[[packages]] +name = "pycodestyle" +version = "2.12.0" + +[[packages.wheels]] +name = "pycodestyle-2.12.0-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/55/c4/bf8ede2d1641e0a2e027c6d0c7060e00332851ea772cc5cee42a4a207707/pycodestyle-2.12.0-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "949a39f6b86c3e1515ba1787c2022131d165a8ad271b11370a8819aa070269e4" + +[[packages]] +name = "pycparser" +version = "2.22" + +[[packages.wheels]] +name = "pycparser-2.22-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/13/a3/a812df4e2dd5696d1f351d58b8fe16a405b234ad2886a0dab9183fb78109/pycparser-2.22-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc" + +[[packages]] +name = "pyct" +version = "0.5.0" + +[[packages.wheels]] +name = "pyct-0.5.0-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/75/e7/c7c1e9e1b6b23ca1db7af3c6826d57d8da883021f751edcc9c82143b127a/pyct-0.5.0-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "a4038a8885059ab8cac6f946ea30e0b5e6bdbe0b92b6723f06737035f9d65e8c" + +[[packages]] +name = "pydantic" +version = "2.10.6" + +[[packages.wheels]] +name = "pydantic-2.10.6-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/f4/3c/8cc1cc84deffa6e25d2d0c688ebb80635dfdbf1dbea3e30c541c8cf4d860/pydantic-2.10.6-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "427d664bf0b8a2b34ff5dd0f5a18df00591adcee7198fbd71981054cef37b584" + +[[packages]] +name = "pydantic-ai-slim" +version = "0.2.9" + +[[packages.wheels]] +name = "pydantic_ai_slim-0.2.9-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/d8/23/b4d52d83c302859e1e251a8c8a360b993cf8b4818c8b633adaa98b043556/pydantic_ai_slim-0.2.9-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "d954ff84cb250d7150a7ed694e4f1f92f820205d036ee006d02fce3e62a3bc4e" + +[[packages]] +name = "pydantic-core" +version = "2.27.2" + +[[packages.wheels]] +name = "pydantic_core-2.27.2-cp313-cp313-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/71/47/82b5e846e01b26ac6f1893d3c5f9f3a2eb6ba79be26eef0b759b4fe72946/pydantic_core-2.27.2-cp313-cp313-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "953101387ecf2f5652883208769a79e48db18c6df442568a0b5ccd8c2723abee" + +[[packages]] +name = "pydantic-evals" +version = "0.2.9" + +[[packages.wheels]] +name = "pydantic_evals-0.2.9-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/b6/6e/8d88e00f624a8348b286b219a292fe3e077ee973660dcff6b4ddd5a04e85/pydantic_evals-0.2.9-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "62035ae3a5321e4d892c7372ef91af0f46b675863e827f011d5cb8550dede400" + +[[packages]] +name = "pydantic-graph" +version = "0.2.9" + +[[packages.wheels]] +name = "pydantic_graph-0.2.9-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/a4/cc/e609261763a76f4d23a545afb462847592bc6b4d8eb412990b9b913c073e/pydantic_graph-0.2.9-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "38ad929a0ec205bd7d5875b0b408d4f13448276aa89b6ce2a1143a7552b070ce" + +[[packages]] +name = "pydantic-settings" +version = "2.8.1" + +[[packages.wheels]] +name = "pydantic_settings-2.8.1-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/0b/53/a64f03044927dc47aafe029c42a5b7aabc38dfb813475e0e1bf71c4a59d0/pydantic_settings-2.8.1-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "81942d5ac3d905f7f3ee1a70df5dfb62d5569c12f51a5a647defc1c3d9ee2e9c" + +[[packages]] +name = "pydeck" +version = "0.9.1" + +[[packages.wheels]] +name = "pydeck-0.9.1-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/ab/4c/b888e6cf58bd9db9c93f40d1c6be8283ff49d88919231afe93a6bcf61626/pydeck-0.9.1-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "b3f75ba0d273fc917094fa61224f3f6076ca8752b93d46faf3bcfd9f9d59b038" + +[[packages]] +name = "pydocstyle" +version = "6.3.0" + +[[packages.wheels]] +name = "pydocstyle-6.3.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/36/ea/99ddefac41971acad68f14114f38261c1f27dac0b3ec529824ebc739bdaa/pydocstyle-6.3.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "118762d452a49d6b05e194ef344a55822987a462831ade91ec5c06fd2169d019" + +[[packages]] +name = "pydub" +version = "0.25.1" + +[[packages.wheels]] +name = "pydub-0.25.1-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/a6/53/d78dc063216e62fc55f6b2eebb447f6a4b0a59f55c8406376f76bf959b08/pydub-0.25.1-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "65617e33033874b59d87db603aa1ed450633288aefead953b30bded59cb599a6" + +[[packages]] +name = "pyerfa" +version = "2.0.1.5" + +[[packages.wheels]] +name = "pyerfa-2.0.1.5-cp39-abi3-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/b4/11/97233cf23ad5411ac6f13b1d6ee3888f90ace4f974d9bf9db887aa428912/pyerfa-2.0.1.5-cp39-abi3-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "66292d437dcf75925b694977aa06eb697126e7b86553e620371ed3e48b5e0ad0" + +[[packages]] +name = "pyflakes" +version = "3.2.0" + +[[packages.wheels]] +name = "pyflakes-3.2.0-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/d4/d7/f1b7db88d8e4417c5d47adad627a93547f44bdc9028372dbd2313f34a855/pyflakes-3.2.0-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "84b5be138a2dfbb40689ca07e2152deb896a65c3a3e24c251c5c62489568074a" + +[[packages]] +name = "pygithub" +version = "2.6.1" + +[[packages.wheels]] +name = "PyGithub-2.6.1-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/ac/fc/a444cd19ccc8c4946a512f3827ed0b3565c88488719d800d54a75d541c0b/PyGithub-2.6.1-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "6f2fa6d076ccae475f9fc392cc6cdbd54db985d4f69b8833a28397de75ed6ca3" + +[[packages]] +name = "pygments" +version = "2.19.1" + +[[packages.wheels]] +name = "pygments-2.19.1-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/8a/0b/9fcc47d19c48b59121088dd6da2488a49d5f72dacf8262e2790a1d2c7d15/pygments-2.19.1-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "9ea1544ad55cecf4b8242fab6dd35a93bbce657034b0611ee383099054ab6d8c" + +[[packages]] +name = "pyjwt" +version = "2.10.1" + +[[packages.wheels]] +name = "PyJWT-2.10.1-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/61/ad/689f02752eeec26aed679477e80e632ef1b682313be70793d798c1d5fc8f/PyJWT-2.10.1-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "dcdd193e30abefd5debf142f9adfcdd2b58004e644f25406ffaebd50bd98dacb" + +[[packages]] +name = "pylint" +version = "3.3.6" + +[[packages.wheels]] +name = "pylint-3.3.6-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/31/21/9537fc94aee9ec7316a230a49895266cf02d78aa29b0a2efbc39566e0935/pylint-3.3.6-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "8b7c2d3e86ae3f94fb27703d521dd0b9b6b378775991f504d7c3a6275aa0a6a6" + +[[packages]] +name = "pylint-venv" +version = "3.0.4" + +[[packages.wheels]] +name = "pylint_venv-3.0.4-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/a6/10/040e1928236e3d34b26639e3427df88c7249a85aadc621cea2158589b4f8/pylint_venv-3.0.4-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "31006a3df398f58f962c9e5620e756b284e8b2bc490594ce5ee5da41920cb32c" + +[[packages]] +name = "pyls-spyder" +version = "0.4.0" + +[[packages.wheels]] +name = "pyls_spyder-0.4.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/d0/26/d0975972af1f18c3bb02ec5889191cc09ebb982bcbe45438d90ca763f4ec/pyls_spyder-0.4.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "1505d975f866a343d0554b6dab41b53717f4b4bc6df450dfd7d48f889fe450b9" + +[[packages]] +name = "pymongo" +version = "4.10.1" + +[[packages.wheels]] +name = "pymongo-4.10.1-cp313-cp313-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/0d/2a/7c24a6144eaa06d18ed52822ea2b0f119fd9267cd1abbb75dae4d89a3803/pymongo-4.10.1-cp313-cp313-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "45ee87a4e12337353242bc758accc7fb47a2f2d9ecc0382a61e64c8f01e86708" + +[[packages]] +name = "pympler" +version = "1.1" + +[[packages.wheels]] +name = "Pympler-1.1-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/79/4f/a6a2e2b202d7fd97eadfe90979845b8706676b41cbd3b42ba75adf329d1f/Pympler-1.1-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "5b223d6027d0619584116a0cbc28e8d2e378f7a79c1e5e024f9ff3b673c58506" + +[[packages]] +name = "pynacl" +version = "1.5.0" + +[[packages.wheels]] +name = "PyNaCl-1.5.0-cp36-abi3-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/5e/22/d3db169895faaf3e2eda892f005f433a62db2decbcfbc2f61e6517adfa87/PyNaCl-1.5.0-cp36-abi3-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "20f42270d27e1b6a29f54032090b972d97f0a1b0948cc52392041ef7831fee93" + +[[packages]] +name = "pynndescent" +version = "0.5.13" + +[[packages.wheels]] +name = "pynndescent-0.5.13-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/d2/53/d23a97e0a2c690d40b165d1062e2c4ccc796be458a1ce59f6ba030434663/pynndescent-0.5.13-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "69aabb8f394bc631b6ac475a1c7f3994c54adf3f51cd63b2730fefba5771b949" + +[[packages]] +name = "pyodbc" +version = "5.2.0" + +[[packages.wheels]] +name = "pyodbc-5.2.0-cp313-cp313-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/73/2a/3219c8b7fa3788fc9f27b5fc2244017223cf070e5ab370f71c519adf9120/pyodbc-5.2.0-cp313-cp313-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "96d3127f28c0dacf18da7ae009cd48eac532d3dcc718a334b86a3c65f6a5ef5c" + +[[packages]] +name = "pyogrio" +version = "0.10.0" + +[[packages.wheels]] +name = "pyogrio-0.10.0-cp313-cp313-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/27/5d/0deb16d228362a097ee3258d0a887c9c0add4b9678bb4847b08a241e124d/pyogrio-0.10.0-cp313-cp313-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "02e54bcfb305af75f829044b0045f74de31b77c2d6546f7aaf96822066147848" + +[[packages]] +name = "pyomo" +version = "6.9.2" + +[[packages.wheels]] +name = "pyomo-6.9.2-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/7f/88/0a07233e39357d3d620186485b927074d6d0ae0f64ad72cc5222ae05844e/pyomo-6.9.2-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "13ebb2f974f97afa626c2712d4f27e09a1c3d18ca11755676b743504a76e5161" + +[[packages]] +name = "pypandoc" +version = "1.15" + +[[packages.wheels]] +name = "pypandoc-1.15-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/61/06/0763e0ccc81754d3eadb21b2cb86cf21bdedc9b52698c2ad6785db7f0a4e/pypandoc-1.15-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "4ededcc76c8770f27aaca6dff47724578428eca84212a31479403a9731fc2b16" + +[[packages]] +name = "pyparsing" +version = "3.2.3" + +[[packages.wheels]] +name = "pyparsing-3.2.3-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/05/e7/df2285f3d08fee213f2d041540fa4fc9ca6c2d44cf36d3a035bf2a8d2bcc/pyparsing-3.2.3-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "a749938e02d6fd0b59b356ca504a24982314bb090c383e3cf201c95ef7e2bfcf" + +[[packages]] +name = "pypdf" +version = "5.4.0" + +[[packages.wheels]] +name = "pypdf-5.4.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/0b/27/d83f8f2a03ca5408dc2cc84b49c0bf3fbf059398a6a2ea7c10acfe28859f/pypdf-5.4.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "db994ab47cadc81057ea1591b90e5b543e2b7ef2d0e31ef41a9bfe763c119dab" + +[[packages]] +name = "pyproj" +version = "3.7.0" + +[[packages.wheels]] +name = "pyproj-3.7.0-cp313-cp313-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/f8/33/3c8c6302717096b54aa14ccbb271045ba04629e21cbf348f2f2dc94f69b4/pyproj-3.7.0-cp313-cp313-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "10a8dc6ec61af97c89ff032647d743f8dc023645773da42ef43f7ae1125b3509" + +[[packages]] +name = "pyproject-hooks" +version = "1.2.0" + +[[packages.wheels]] +name = "pyproject_hooks-1.2.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/bd/24/12818598c362d7f300f18e74db45963dbcb85150324092410c8b49405e42/pyproject_hooks-1.2.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "9e5c6bfa8dcc30091c74b0cf803c81fdd29d94f01992a7707bc97babb1141913" + +[[packages]] +name = "pyqt5" +version = "5.15.11" + +[[packages.wheels]] +name = "PyQt5-5.15.11-cp38-abi3-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/56/d5/68eb9f3d19ce65df01b6c7b7a577ad3bbc9ab3a5dd3491a4756e71838ec9/PyQt5-5.15.11-cp38-abi3-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "bdde598a3bb95022131a5c9ea62e0a96bd6fb28932cc1619fd7ba211531b7517" + +[[packages]] +name = "pyqt5-qt5" +version = "5.15.2" + +[[packages.wheels]] +name = "PyQt5_Qt5-5.15.2-py3-none-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/37/97/5d3b222b924fa2ed4c2488925155cd0b03fd5d09ee1cfcf7c553c11c9f66/PyQt5_Qt5-5.15.2-py3-none-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "750b78e4dba6bdf1607febedc08738e318ea09e9b10aea9ff0d73073f11f6962" + +[[packages]] +name = "pyqt5-sip" +version = "12.17.0" + +[[packages.wheels]] +name = "PyQt5_sip-12.17.0-cp313-cp313-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/15/ed/ff94d6b2910e7627380cb1fc9a518ff966e6d78285c8e54c9422b68305db/PyQt5_sip-12.17.0-cp313-cp313-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "672c209d05661fab8e17607c193bf43991d268a1eefbc2c4551fbf30fd8bb2ca" + +[[packages]] +name = "pyqtgraph" +version = "0.13.7" + +[[packages.wheels]] +name = "pyqtgraph-0.13.7-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/7b/34/5702b3b7cafe99be1d94b42f100e8cc5e6957b761fcb1cf5f72d492851da/pyqtgraph-0.13.7-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "7754edbefb6c367fa0dfb176e2d0610da3ada20aa7a5318516c74af5fb72bf7a" + +[[packages]] +name = "pyqtwebengine" +version = "5.15.7" + +[[packages.wheels]] +name = "PyQtWebEngine-5.15.7-cp38-abi3-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/39/67/0dead50889d905fc99f40e61e5ab7f73746605ce8f74c4fa7fb3fc1d6c5e/PyQtWebEngine-5.15.7-cp38-abi3-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "bd5e8c426d6f6b352cd15800d64a89b2a4a11e098460b818c7bdcf5e5612e44f" + +[[packages]] +name = "pyqtwebengine-qt5" +version = "5.15.2" + +[[packages.wheels]] +name = "PyQtWebEngine_Qt5-5.15.2-py3-none-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/e0/db/0f29bd882aee8b5754f3e1ab104d2d09cdd9138a889558b43badcd81ce11/PyQtWebEngine_Qt5-5.15.2-py3-none-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "24231f19e1595018779977de6722b5c69f3d03f34a5f7574ff21cd1e764ef76d" + +[[packages]] +name = "pyserial" +version = "3.5" + +[[packages.wheels]] +name = "pyserial-3.5-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/07/bc/587a445451b253b285629263eb51c2d8e9bcea4fc97826266d186f96f558/pyserial-3.5-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "c4451db6ba391ca6ca299fb3ec7bae67a5c55dde170964c7a14ceefec02f2cf0" + +[[packages]] +name = "pysocks" +version = "1.7.1" + +[[packages.wheels]] +name = "PySocks-1.7.1-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/8d/59/b4572118e098ac8e46e399a1dd0f2d85403ce8bbaad9ec79373ed6badaf9/PySocks-1.7.1-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "2725bd0a9925919b9b51739eea5f9e2bae91e83288108a9ad338b2e3a4435ee5" + +[[packages]] +name = "pyspnego" +version = "0.11.2" + +[[packages.wheels]] +name = "pyspnego-0.11.2-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/57/ea/b3c1438839d8724beff7b31ec42b9d041265dc9ca27ccb54477d442bfbcf/pyspnego-0.11.2-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "74abc1fb51e59360eb5c5c9086e5962174f1072c7a50cf6da0bda9a4bcfdfbd4" + +[[packages]] +name = "pytest" +version = "8.3.5" + +[[packages.wheels]] +name = "pytest-8.3.5-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/30/3d/64ad57c803f1fa1e963a7946b6e0fea4a70df53c1a7fed304586539c2bac/pytest-8.3.5-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "c69214aa47deac29fad6c2a4f590b9c4a9fdb16a403176fe154b79c0b4d4d820" + +[[packages]] +name = "python-barcode" +version = "0.15.1" + +[[packages.wheels]] +name = "python_barcode-0.15.1-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/10/27/9b5c5bb1938d4e6b12f4c95f40ea905c11df3cd58e128e9305397b9a2697/python_barcode-0.15.1-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "057636fba37369c22852410c8535b36adfbeb965ddfd4e5b6924455d692e0886" + +[[packages]] +name = "python-dateutil" +version = "2.8.2" + +[[packages.wheels]] +name = "python_dateutil-2.8.2-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/36/7a/87837f39d0296e723bb9b62bbb257d0355c7f6128853c78955f57342a56d/python_dateutil-2.8.2-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9" + +[[packages]] +name = "python-dotenv" +version = "1.1.0" + +[[packages.wheels]] +name = "python_dotenv-1.1.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/1e/18/98a99ad95133c6a6e2005fe89faedf294a748bd5dc803008059409ac9b1e/python_dotenv-1.1.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "d7c01d9e2293916c18baf562d95698754b0dbbb5e74d457c45d4f6561fb9d55d" + +[[packages]] +name = "python-json-logger" +version = "3.3.0" + +[[packages.wheels]] +name = "python_json_logger-3.3.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/08/20/0f2523b9e50a8052bc6a8b732dfc8568abbdc42010aef03a2d750bdab3b2/python_json_logger-3.3.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "dd980fae8cffb24c13caf6e158d3d61c0d6d22342f932cb6e9deedab3d35eec7" + +[[packages]] +name = "python-lsp-black" +version = "2.0.0" + +[[packages.wheels]] +name = "python_lsp_black-2.0.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/78/44/fef9b4d027b3d6321e6f30b6b5946bef18cd84a96e1d81012ac0f69ea53c/python_lsp_black-2.0.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "d5efdee45f5fa9e5241f5d4d396cd46127f45c85817916b1fd92c2986652bf7e" + +[[packages]] +name = "python-lsp-jsonrpc" +version = "1.1.2" + +[[packages.wheels]] +name = "python_lsp_jsonrpc-1.1.2-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/cb/d9/656659d5b5d5f402b2b174cd0ba9bc827e07ce3c0bf88da65424baf64af8/python_lsp_jsonrpc-1.1.2-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "7339c2e9630ae98903fdaea1ace8c47fba0484983794d6aafd0bd8989be2b03c" + +[[packages]] +name = "python-lsp-server" +version = "1.12.2" + +[[packages.wheels]] +name = "python_lsp_server-1.12.2-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/cb/e7/28010a326ef591e1409daf9d57a47de94156c147ad1befe74d8196d82729/python_lsp_server-1.12.2-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "750116459449184ba20811167cdf96f91296ae12f1f65ebd975c5c159388111b" + +[[packages]] +name = "python-multipart" +version = "0.0.20" + +[[packages.wheels]] +name = "python_multipart-0.0.20-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/45/58/38b5afbc1a800eeea951b9285d3912613f2603bdf897a4ab0f4bd7f405fc/python_multipart-0.0.20-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "8a62d3a8335e06589fe01f2a3e178cdcc632f3fbe0d492ad9ee0ec35aab1f104" + +[[packages]] +name = "python-slugify" +version = "8.0.4" + +[[packages.wheels]] +name = "python_slugify-8.0.4-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/a4/62/02da182e544a51a5c3ccf4b03ab79df279f9c60c5e82d5e8bec7ca26ac11/python_slugify-8.0.4-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "276540b79961052b66b7d116620b36518847f52d5fd9e3a70164fc8c50faa6b8" + +[[packages]] +name = "pythonqwt" +version = "0.14.5" + +[[packages.wheels]] +name = "pythonqwt-0.14.5-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/28/e9/1e6e93e1aaaec57d6ef427291e8fb3d9f18ebd91147c24f2b241b01e2def/pythonqwt-0.14.5-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "be5a9d2e1ba22aaa02eb397c5b3b5e4e1d9ed2c08f45554d8b920d8fc3be6dc7" + +[[packages]] +name = "pytoolconfig" +version = "1.3.1" + +[[packages.wheels]] +name = "pytoolconfig-1.3.1-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/92/44/da239917f5711ca7105f7d7f9e2765716dd883b241529beafc0f28504725/pytoolconfig-1.3.1-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "5d8cea8ae1996938ec3eaf44567bbc5ef1bc900742190c439a44a704d6e1b62b" + +[[packages]] +name = "pytz" +version = "2025.2" + +[[packages.wheels]] +name = "pytz-2025.2-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/81/c4/34e93fe5f5429d7570ec1fa436f1986fb1f00c3e0f43a589fe2bbcd22c3f/pytz-2025.2-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "5ddf76296dd8c44c26eb8f4b6f35488f3ccbf6fbbd7adee0b7262d43f0ec2f00" + +[[packages]] +name = "pyuca" +version = "1.2" + +[[packages.wheels]] +name = "pyuca-1.2-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/98/88/aeeee34d88f841aca712a8c18fbd62a33eaad8f2dbe535e87f3c829b02f9/pyuca-1.2-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "abaa12e1bd2c7c68ca8396ff8383bc0654a739cef3ae68fd7af58bf29af0a91e" + +[[packages]] +name = "pyusb" +version = "1.3.1" + +[[packages.wheels]] +name = "pyusb-1.3.1-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/28/b8/27e6312e86408a44fe16bd28ee12dd98608b39f7e7e57884a24e8f29b573/pyusb-1.3.1-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "bf9b754557af4717fe80c2b07cc2b923a9151f5c08d17bdb5345dac09d6a0430" + +[[packages]] +name = "pyviz-comms" +version = "3.0.4" + +[[packages.wheels]] +name = "pyviz_comms-3.0.4-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/98/cc/ba051cfaef2525054e3367f2d5ff4df38f8f775125b3eebb82af4060026b/pyviz_comms-3.0.4-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "a40d17db26ec13cf975809633804e712bd24b473e77388c193c44043f85d0b25" + +[[packages]] +name = "pywavelets" +version = "1.8.0" + +[[packages.wheels]] +name = "pywavelets-1.8.0-cp313-cp313-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/c9/4f/0a709a5732e6cf9297fc87bf545cb879997cde204115f8c0cbc296c5bdd3/pywavelets-1.8.0-cp313-cp313-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "4dbebcfd55ea8a85b7fc8802d411e75337170422abf6e96019d7e46c394e80e5" + +[[packages]] +name = "pywin32" +version = "310" + +[[packages.wheels]] +name = "pywin32-310-cp313-cp313-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/45/3c/b4640f740ffebadd5d34df35fecba0e1cfef8fde9f3e594df91c28ad9b50/pywin32-310-cp313-cp313-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "667827eb3a90208ddbdcc9e860c81bde63a135710e21e4cb3348968e4bd5249e" + +[[packages]] +name = "pywin32-ctypes" +version = "0.2.3" + +[[packages.wheels]] +name = "pywin32_ctypes-0.2.3-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/de/3d/8161f7711c017e01ac9f008dfddd9410dff3674334c233bde66e7ba65bbf/pywin32_ctypes-0.2.3-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "8a1513379d709975552d202d942d9837758905c8d01eb82b8bcc30918929e7b8" + +[[packages]] +name = "pywinpty" +version = "2.0.15" + +[[packages.wheels]] +name = "pywinpty-2.0.15-cp313-cp313-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/fb/16/2ab7b3b7f55f3c6929e5f629e1a68362981e4e5fed592a2ed1cb4b4914a5/pywinpty-2.0.15-cp313-cp313-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "ab5920877dd632c124b4ed17bc6dd6ef3b9f86cd492b963ffdb1a67b85b0f408" + +[[packages]] +name = "pyyaml" +version = "6.0.2" + +[[packages.wheels]] +name = "PyYAML-6.0.2-cp313-cp313-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/fa/de/02b54f42487e3d3c6efb3f89428677074ca7bf43aae402517bc7cca949f3/PyYAML-6.0.2-cp313-cp313-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "8388ee1976c416731879ac16da0aff3f63b286ffdd57cdeb95f3f2e085687563" + +[[packages]] +name = "pyzmq" +version = "26.4.0" + +[[packages.wheels]] +name = "pyzmq-26.4.0-cp313-cp313-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/c6/6c/f289c1789d7bb6e5a3b3bef7b2a55089b8561d17132be7d960d3ff33b14e/pyzmq-26.4.0-cp313-cp313-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "23ecc9d241004c10e8b4f49d12ac064cd7000e1643343944a10df98e57bc544b" + +[[packages]] +name = "qdarkstyle" +version = "3.2.3" + +[[packages.wheels]] +name = "QDarkStyle-3.2.3-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/93/7d/c3c10498430dadcea4def5faddf71cd199e577d20a125e7ef1e9d7bdbbfa/QDarkStyle-3.2.3-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "ea980ee426d594909cf1058306832af71ff6cbad6f69237b036d1550635aefbc" + +[[packages]] +name = "qdldl" +version = "0.1.7.post5" + +[[packages.wheels]] +name = "qdldl-0.1.7.post5-cp313-cp313-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/08/f7/abac03a09f6848cee6d5dd7a7a8bd1dfed68766ee77f9cbf3e9de596ad68/qdldl-0.1.7.post5-cp313-cp313-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "cc9be378e7bec67d4c62b7fa27cafb4f77d3e5e059d753c3dce0a5ae1ef5fea0" + +[[packages]] +name = "qrcode" +version = "8.0" + +[[packages.wheels]] +name = "qrcode-8.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/74/ab/df8d889fd01139db68ae9e5cb5c8f0ea016823559a6ecb427582d52b07dc/qrcode-8.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "9fc05f03305ad27a709eb742cf3097fa19e6f6f93bb9e2f039c0979190f6f1b1" + +[[packages]] +name = "qstylizer" +version = "0.2.4" + +[[packages.wheels]] +name = "qstylizer-0.2.4-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/2d/ba/2a4e51861942c2bc3be60400c69f6713359c3e307aee4696f2ea47f35811/qstylizer-0.2.4-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "8f384dfe86f9edb0bb596b93663a51f124f0794b94fd54057cc7cf9cea59fb6f" + +[[packages]] +name = "qtawesome" +version = "1.4.0" + +[[packages.wheels]] +name = "qtawesome-1.4.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/a5/ee/6e6c6715129c929af2d95ddb2e9decf54c1beffe58f336911197aacc0448/qtawesome-1.4.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "a4d689fa071c595aa6184171ce1f0f847677cb8d2db45382c43129f1d72a3d93" + +[[packages]] +name = "qtconsole" +version = "5.6.1" + +[[packages.wheels]] +name = "qtconsole-5.6.1-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/c6/8a/635610fb6131bc702229e2780d7b042416866ab78f8ed1ff24c4b23a2f4c/qtconsole-5.6.1-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "3d22490d9589bace566ad4f3455b61fa2209156f40e87e19e2c3cb64e9264950" + +[[packages]] +name = "qtpy" +version = "2.4.3" + +[[packages.wheels]] +name = "QtPy-2.4.3-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/69/76/37c0ccd5ab968a6a438f9c623aeecc84c202ab2fabc6a8fd927580c15b5a/QtPy-2.4.3-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "72095afe13673e017946cc258b8d5da43314197b741ed2890e563cf384b51aa1" + +[[packages]] +name = "quantecon" +version = "0.7.2" + +[[packages.wheels]] +name = "quantecon-0.7.2-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/77/1b/75e44bd482abe2e87dcbead8cfd99b8fa6582fdc0906967c34f64abfdf13/quantecon-0.7.2-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "d1333ca7bc3046efe3655d9eeeefb299051b00870b8608cb5bc0b88e3bdb8b67" + +[[packages]] +name = "quart" +version = "0.20.0" + +[[packages.wheels]] +name = "quart-0.20.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/7e/e9/cc28f21f52913adf333f653b9e0a3bf9cb223f5083a26422968ba73edd8d/quart-0.20.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "003c08f551746710acb757de49d9b768986fd431517d0eb127380b656b98b8f1" + +[[packages]] +name = "rapidfuzz" +version = "3.13.0" + +[[packages.wheels]] +name = "rapidfuzz-3.13.0-cp313-cp313-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/96/e3/a98c25c4f74051df4dcf2f393176b8663bfd93c7afc6692c84e96de147a2/rapidfuzz-3.13.0-cp313-cp313-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "9a7c6232be5f809cd39da30ee5d24e6cadd919831e6020ec6c2391f4c3bc9264" + +[[packages]] +name = "readme-renderer" +version = "44.0" + +[[packages.wheels]] +name = "readme_renderer-44.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/e1/67/921ec3024056483db83953ae8e48079ad62b92db7880013ca77632921dd0/readme_renderer-44.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "2fbca89b81a08526aadf1357a8c2ae889ec05fb03f5da67f9769c9a592166151" + +[[packages]] +name = "redis" +version = "5.2.1" + +[[packages.wheels]] +name = "redis-5.2.1-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/3c/5f/fa26b9b2672cbe30e07d9a5bdf39cf16e3b80b42916757c5f92bca88e4ba/redis-5.2.1-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "ee7e1056b9aea0f04c6c2ed59452947f34c4940ee025f5dd83e6a6418b6989e4" + +[[packages]] +name = "referencing" +version = "0.36.2" + +[[packages.wheels]] +name = "referencing-0.36.2-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/c1/b1/3baf80dc6d2b7bc27a95a67752d0208e410351e3feb4eb78de5f77454d8d/referencing-0.36.2-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "e8699adbbf8b5c7de96d8ffa0eb5c158b3beafce084968e2ea8bb08c6794dcd0" + +[[packages]] +name = "regex" +version = "2024.11.6" + +[[packages.wheels]] +name = "regex-2024.11.6-cp313-cp313-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/45/94/bc295babb3062a731f52621cdc992d123111282e291abaf23faa413443ea/regex-2024.11.6-cp313-cp313-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "2b3361af3198667e99927da8b84c1b010752fa4b1115ee30beaa332cabc3ef1a" + +[[packages]] +name = "reportlab" +version = "4.3.1" + +[[packages.wheels]] +name = "reportlab-4.3.1-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/ce/6b/42805895ed08a314a01be6110584b5d059328386988ddbc4f8f10014d30e/reportlab-4.3.1-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "0f37dd16652db3ef84363cf744632a28c38bd480d5bf94683466852d7bb678dd" + +[[packages]] +name = "requests" +version = "2.32.3" + +[[packages.wheels]] +name = "requests-2.32.3-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/f9/9b/335f9764261e915ed497fcdeb11df5dfd6f7bf257d4a6a2a686d80da4d54/requests-2.32.3-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6" + +[[packages]] +name = "requests-ntlm" +version = "1.3.0" + +[[packages.wheels]] +name = "requests_ntlm-1.3.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/9e/5d/836b97537a390cf811b0488490c389c5a614f0a93acb23f347bd37a2d914/requests_ntlm-1.3.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "4c7534a7d0e482bb0928531d621be4b2c74ace437e88c5a357ceb7452d25a510" + +[[packages]] +name = "requests-toolbelt" +version = "1.0.0" + +[[packages.wheels]] +name = "requests_toolbelt-1.0.0-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/3f/51/d4db610ef29373b879047326cbf6fa98b6c1969d6f6dc423279de2b1be2c/requests_toolbelt-1.0.0-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "cccfdd665f0a24fcf4726e690f65639d272bb0637b9b92dfd91a5568ccf6bd06" + +[[packages]] +name = "rfc3339-validator" +version = "0.1.4" + +[[packages.wheels]] +name = "rfc3339_validator-0.1.4-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/7b/44/4e421b96b67b2daff264473f7465db72fbdf36a07e05494f50300cc7b0c6/rfc3339_validator-0.1.4-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "24f6ec1eda14ef823da9e36ec7113124b39c04d50a4d3d3a3c2859577e7791fa" + +[[packages]] +name = "rfc3986" +version = "2.0.0" + +[[packages.wheels]] +name = "rfc3986-2.0.0-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/ff/9a/9afaade874b2fa6c752c36f1548f718b5b83af81ed9b76628329dab81c1b/rfc3986-2.0.0-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "50b1502b60e289cb37883f3dfd34532b8873c7de9f49bb546641ce9cbd256ebd" + +[[packages]] +name = "rfc3986-validator" +version = "0.1.1" + +[[packages.wheels]] +name = "rfc3986_validator-0.1.1-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/9e/51/17023c0f8f1869d8806b979a2bffa3f861f26a3f1a66b094288323fba52f/rfc3986_validator-0.1.1-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "2f235c432ef459970b4306369336b9d5dbdda31b510ca1e327636e01f528bfa9" + +[[packages]] +name = "rich" +version = "14.0.0" + +[[packages.wheels]] +name = "rich-14.0.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/0d/9b/63f4c7ebc259242c89b3acafdb37b41d1185c07ff0011164674e9076b491/rich-14.0.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "1c9491e1951aac09caffd42f448ee3d04e58923ffe14993f6e83068dc395d7e0" + +[[packages]] +name = "rope" +version = "1.13.0" + +[[packages.wheels]] +name = "rope-1.13.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/a0/d0/e213e5adfa162e437dff3669131dc476043fc3a22fe99ef891516100610d/rope-1.13.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "b435a0c0971244fdcd8741676a9fae697ae614c20cc36003678a7782f25c0d6c" + +[[packages]] +name = "rpds-py" +version = "0.24.0" + +[[packages.wheels]] +name = "rpds_py-0.24.0-cp313-cp313-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/f9/12/09e048d1814195e01f354155fb772fb0854bd3450b5f5a82224b3a319f0e/rpds_py-0.24.0-cp313-cp313-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "6eea559077d29486c68218178ea946263b87f1c41ae7f996b1f30a983c476a5a" + +[[packages]] +name = "rsa" +version = "4.7.2" + +[[packages.wheels]] +name = "rsa-4.7.2-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/e9/93/0c0f002031f18b53af7a6166103c02b9c0667be528944137cc954ec921b3/rsa-4.7.2-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "78f9a9bf4e7be0c5ded4583326e7461e3a3c5aae24073648b4bdfa797d78c9d2" + +[[packages]] +name = "rtree" +version = "1.4.0" + +[[packages.wheels]] +name = "rtree-1.4.0-py3-none-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/ce/c2/362f2cc36a7a57b47380061c23fc109c7222c1a544ffd24cda289ba19673/rtree-1.4.0-py3-none-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "ba83efc7b7563905b1bfdfc14490c4bfb59e92e5e6156bdeb6ec5df5117252f4" + +[[packages]] +name = "rx" +version = "3.2.0" + +[[packages.wheels]] +name = "Rx-3.2.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/e2/a9/efeaeca4928a9a56d04d609b5730994d610c82cf4d9dd7aa173e6ef4233e/Rx-3.2.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "922c5f4edb3aa1beaa47bf61d65d5380011ff6adcd527f26377d05cb73ed8ec8" + +[[packages]] +name = "scikit-image" +version = "0.25.2" + +[[packages.wheels]] +name = "scikit_image-0.25.2-cp313-cp313-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/8a/97/5fcf332e1753831abb99a2525180d3fb0d70918d461ebda9873f66dcc12f/scikit_image-0.25.2-cp313-cp313-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "64785a8acefee460ec49a354706db0b09d1f325674107d7fa3eadb663fb56d6f" + +[[packages]] +name = "scikit-learn" +version = "1.6.1" + +[[packages.wheels]] +name = "scikit_learn-1.6.1-cp313-cp313-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/34/b0/ca92b90859070a1487827dbc672f998da95ce83edce1270fc23f96f1f61a/scikit_learn-1.6.1-cp313-cp313-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "7a1c43c8ec9fde528d664d947dc4c0789be4077a3647f232869f41d9bf50e0fb" + +[[packages]] +name = "scipy" +version = "1.15.3" + +[[packages.wheels]] +name = "scipy-1.15.3-cp313-cp313-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/87/2e/892ad2862ba54f084ffe8cc4a22667eaf9c2bcec6d2bff1d15713c6c0703/scipy-1.15.3-cp313-cp313-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "b90ab29d0c37ec9bf55424c064312930ca5f4bde15ee8619ee44e69319aab163" + +[[packages]] +name = "scramp" +version = "1.4.5" + +[[packages.wheels]] +name = "scramp-1.4.5-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/d9/9f/8b2f2749ccfbe4fcef08650896ac47ed919ff25b7ac57b7a1ae7da16c8c3/scramp-1.4.5-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "50e37c464fc67f37994e35bee4151e3d8f9320e9c204fca83a5d313c121bbbe7" + +[[packages]] +name = "scs" +version = "3.2.7.post2" + +[[packages.wheels]] +name = "scs-3.2.7.post2-cp313-cp313-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/9d/f9/840ef19a298ef7099f4a692772001f2f552b0917a3fb230f872a1c40ba11/scs-3.2.7.post2-cp313-cp313-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "a2c48cd19e39bf87dae0b20a289fff44930458fc2ca2afa0f899058dc41e5545" + +[[packages]] +name = "seaborn" +version = "0.13.2" + +[[packages.wheels]] +name = "seaborn-0.13.2-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/83/11/00d3c3dfc25ad54e731d91449895a79e4bf2384dc3ac01809010ba88f6d5/seaborn-0.13.2-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "636f8336facf092165e27924f223d3c62ca560b1f2bb5dff7ab7fad265361987" + +[[packages]] +name = "send2trash" +version = "1.8.3" + +[[packages.wheels]] +name = "Send2Trash-1.8.3-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/40/b0/4562db6223154aa4e22f939003cb92514c79f3d4dccca3444253fd17f902/Send2Trash-1.8.3-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "0c31227e0bd08961c7665474a3d1ef7193929fedda4233843689baa056be46c9" + +[[packages]] +name = "setuptools" +version = "79.0.1" + +[[packages.wheels]] +name = "setuptools-79.0.1-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/0d/6d/b4752b044bf94cb802d88a888dc7d288baaf77d7910b7dedda74b5ceea0c/setuptools-79.0.1-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "e147c0549f27767ba362f9da434eab9c5dc0045d5304feb602a0af001089fc51" + +[[packages]] +name = "shapely" +version = "2.1.0" + +[[packages.wheels]] +name = "shapely-2.1.0-cp313-cp313-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/e3/f0/9f8cdf2258d7aed742459cea51c70d184de92f5d2d6f5f7f1ded90a18c31/shapely-2.1.0-cp313-cp313-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "1dc8d4364483a14aba4c844b7bd16a6fa3728887e2c33dfa1afa34a3cf4d08a5" + +[[packages]] +name = "shellingham" +version = "1.5.4" + +[[packages.wheels]] +name = "shellingham-1.5.4-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/e0/f9/0595336914c5619e5f28a1fb793285925a8cd4b432c9da0a987836c7f822/shellingham-1.5.4-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "7ecfff8f2fd72616f7481040475a65b2bf8af90a56c89140852d1120324e8686" + +[[packages]] +name = "simplejson" +version = "3.19.3" + +[[packages.wheels]] +name = "simplejson-3.19.3-cp313-cp313-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/e2/58/b06226e6b0612f2b1fa13d5273551da259f894566b1eef32249ddfdcce44/simplejson-3.19.3-cp313-cp313-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "3bbcdc438dc1683b35f7a8dc100960c721f922f9ede8127f63bed7dfded4c64c" + +[[packages]] +name = "simpy" +version = "4.1.1" + +[[packages.wheels]] +name = "simpy-4.1.1-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/48/72/920ed1224c94a8a5a69e6c1275ac7fe4eb911ba8feffddf469f1629d47f3/simpy-4.1.1-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "7c5ae380240fd2238671160e4830956f8055830a8317edf5c05e495b3823cd88" + +[[packages]] +name = "six" +version = "1.17.0" + +[[packages.wheels]] +name = "six-1.17.0-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274" + +[[packages]] +name = "sklearn-compat" +version = "0.1.3" + +[[packages.wheels]] +name = "sklearn_compat-0.1.3-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/f0/a8/ad69cf130fbd017660cdd64abbef3f28135d9e2e15fe3002e03c5be0ca38/sklearn_compat-0.1.3-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "a8aaf8ef711988cbd63f187c5560b5f16b25df663aaa1d2d0e1291341d339f80" + +[[packages]] +name = "skrub" +version = "0.5.3" + +[[packages.wheels]] +name = "skrub-0.5.3-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/80/cf/5a1e0dabfa3cad1ab9b09e690fede4aa8fdc0c04d9d7ec8aa9338d56e1e4/skrub-0.5.3-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "b6ba417fa83d1f7e9a69656e0860b061381b9bd19808692a2b5bef8588c72775" + +[[packages]] +name = "smmap" +version = "5.0.2" + +[[packages.wheels]] +name = "smmap-5.0.2-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/04/be/d09147ad1ec7934636ad912901c5fd7667e1c858e19d355237db0d0cd5e4/smmap-5.0.2-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "b30115f0def7d7531d22a0fb6502488d879e75b260a9db4d0819cfb25403af5e" + +[[packages]] +name = "sniffio" +version = "1.3.1" + +[[packages.wheels]] +name = "sniffio-1.3.1-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/e9/44/75a9c9421471a6c4805dbf2356f7c181a29c1879239abab1ea2cc8f38b40/sniffio-1.3.1-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2" + +[[packages]] +name = "snowballstemmer" +version = "2.2.0" + +[[packages.wheels]] +name = "snowballstemmer-2.2.0-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/ed/dc/c02e01294f7265e63a7315fe086dd1df7dacb9f840a804da846b96d01b96/snowballstemmer-2.2.0-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "c8e1716e83cc398ae16824e5572ae04e0d9fc2c6b985fb0f900f5f0c96ecba1a" + +[[packages]] +name = "sortedcontainers" +version = "2.4.0" + +[[packages.wheels]] +name = "sortedcontainers-2.4.0-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/32/46/9cb0e58b2deb7f82b84065f37f3bffeb12413f947f9388e4cac22c4621ce/sortedcontainers-2.4.0-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "a163dcaede0f1c021485e957a39245190e74249897e2ae4b2aa38595db237ee0" + +[[packages]] +name = "sounddevice" +version = "0.5.1" + +[[packages.wheels]] +name = "sounddevice-0.5.1-py3-none-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/af/9b/15217b04f3b36d30de55fef542389d722de63f1ad81f9c72d8afc98cb6ab/sounddevice-0.5.1-py3-none-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "4313b63f2076552b23ac3e0abd3bcfc0c1c6a696fc356759a13bd113c9df90f1" + +[[packages]] +name = "soupsieve" +version = "2.6" + +[[packages.wheels]] +name = "soupsieve-2.6-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/d1/c2/fe97d779f3ef3b15f05c94a2f1e3d21732574ed441687474db9d342a7315/soupsieve-2.6-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "e72c4ff06e4fb6e4b5a9f0f55fe6e81514581fca1515028625d0f299c602ccc9" + +[[packages]] +name = "sphinx" +version = "8.1.3" + +[[packages.wheels]] +name = "sphinx-8.1.3-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/26/60/1ddff83a56d33aaf6f10ec8ce84b4c007d9368b21008876fceda7e7381ef/sphinx-8.1.3-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "09719015511837b76bf6e03e42eb7595ac8c2e41eeb9c29c5b755c6b677992a2" + +[[packages]] +name = "sphinx-rtd-theme" +version = "3.0.2" + +[[packages.wheels]] +name = "sphinx_rtd_theme-3.0.2-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/85/77/46e3bac77b82b4df5bb5b61f2de98637724f246b4966cfc34bc5895d852a/sphinx_rtd_theme-3.0.2-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "422ccc750c3a3a311de4ae327e82affdaf59eb695ba4936538552f3b00f4ee13" + +[[packages]] +name = "sphinxcontrib-applehelp" +version = "2.0.0" + +[[packages.wheels]] +name = "sphinxcontrib_applehelp-2.0.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/5d/85/9ebeae2f76e9e77b952f4b274c27238156eae7979c5421fba91a28f4970d/sphinxcontrib_applehelp-2.0.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "4cd3f0ec4ac5dd9c17ec65e9ab272c9b867ea77425228e68ecf08d6b28ddbdb5" + +[[packages]] +name = "sphinxcontrib-devhelp" +version = "2.0.0" + +[[packages.wheels]] +name = "sphinxcontrib_devhelp-2.0.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/35/7a/987e583882f985fe4d7323774889ec58049171828b58c2217e7f79cdf44e/sphinxcontrib_devhelp-2.0.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "aefb8b83854e4b0998877524d1029fd3e6879210422ee3780459e28a1f03a8a2" + +[[packages]] +name = "sphinxcontrib-htmlhelp" +version = "2.1.0" + +[[packages.wheels]] +name = "sphinxcontrib_htmlhelp-2.1.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/0a/7b/18a8c0bcec9182c05a0b3ec2a776bba4ead82750a55ff798e8d406dae604/sphinxcontrib_htmlhelp-2.1.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "166759820b47002d22914d64a075ce08f4c46818e17cfc9470a9786b759b19f8" + +[[packages]] +name = "sphinxcontrib-jquery" +version = "4.1" + +[[packages.wheels]] +name = "sphinxcontrib_jquery-4.1-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/76/85/749bd22d1a68db7291c89e2ebca53f4306c3f205853cf31e9de279034c3c/sphinxcontrib_jquery-4.1-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "f936030d7d0147dd026a4f2b5a57343d233f1fc7b363f68b3d4f1cb0993878ae" + +[[packages]] +name = "sphinxcontrib-jsmath" +version = "1.0.1" + +[[packages.wheels]] +name = "sphinxcontrib_jsmath-1.0.1-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/c2/42/4c8646762ee83602e3fb3fbe774c2fac12f317deb0b5dbeeedd2d3ba4b77/sphinxcontrib_jsmath-1.0.1-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "2ec2eaebfb78f3f2078e73666b1415417a116cc848b72e5172e596c871103178" + +[[packages]] +name = "sphinxcontrib-qthelp" +version = "2.0.0" + +[[packages.wheels]] +name = "sphinxcontrib_qthelp-2.0.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/27/83/859ecdd180cacc13b1f7e857abf8582a64552ea7a061057a6c716e790fce/sphinxcontrib_qthelp-2.0.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "b18a828cdba941ccd6ee8445dbe72ffa3ef8cbe7505d8cd1fa0d42d3f2d5f3eb" + +[[packages]] +name = "sphinxcontrib-serializinghtml" +version = "2.0.0" + +[[packages.wheels]] +name = "sphinxcontrib_serializinghtml-2.0.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/52/a7/d2782e4e3f77c8450f727ba74a8f12756d5ba823d81b941f1b04da9d033a/sphinxcontrib_serializinghtml-2.0.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "6e2cb0eef194e10c27ec0023bfeb25badbbb5868244cf5bc5bdc04e4464bf331" + +[[packages]] +name = "spyder" +version = "6.0.7" + +[[packages.wheels]] +name = "spyder-6.0.7-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/ee/c8/1568fa96351ddad878d42e7487d9637604c7f34030171acf810f47914d9d/spyder-6.0.7-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "b725569bb8ddc7b0aab73d747d85312dc0456978370cc0f9b1a101c0fe4f076b" + +[[packages]] +name = "spyder-kernels" +version = "3.0.5" + +[[packages.wheels]] +name = "spyder_kernels-3.0.5-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/10/2d/b1c88e914ebdec2a9cf066b2c283ee234f4052c31922017407fa8adb89f3/spyder_kernels-3.0.5-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "9cc808e0ec4426b9ba911128e221fa2234e6c8d6e08526132e90112ff9c2bb7c" + +[[packages]] +name = "sqlalchemy" +version = "2.0.40" + +[[packages.wheels]] +name = "sqlalchemy-2.0.40-cp313-cp313-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/1c/cb/f38c61f7f2fd4d10494c1c135ff6a6ddb63508d0b47bccccd93670637309/sqlalchemy-2.0.40-cp313-cp313-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "641ee2e0834812d657862f3a7de95e0048bdcb6c55496f39c6fa3d435f6ac6ad" + +[[packages]] +name = "sqlite-bro" +version = "0.13.1" + +[[packages.wheels]] +name = "sqlite_bro-0.13.1-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/2a/b3/81b91f5b26fff329c59dbf826a87637bd51d1903120427912322f86e7d33/sqlite_bro-0.13.1-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "c26033b0af133049ca578b5fd30b2372f002e7ff934b39774aa4d2da7638c23d" + +[[packages]] +name = "sqlite-fts4" +version = "1.0.3" + +[[packages.wheels]] +name = "sqlite_fts4-1.0.3-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/51/29/0096e8b1811aaa78cfb296996f621f41120c21c2f5cd448ae1d54979d9fc/sqlite_fts4-1.0.3-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "0359edd8dea6fd73c848989e1e2b1f31a50fe5f9d7272299ff0e8dbaa62d035f" + +[[packages]] +name = "sqlite-utils" +version = "3.38" + +[[packages.wheels]] +name = "sqlite_utils-3.38-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/4d/eb/f8e8e827805f810838efff3311cccd2601238c5fa3fc35c1f878709e161b/sqlite_utils-3.38-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "8a27441015c3b2ef475f555861f7a2592f73bc60d247af9803a11b65fc605bf9" + +[[packages]] +name = "sqlparse" +version = "0.5.3" + +[[packages.wheels]] +name = "sqlparse-0.5.3-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/a9/5c/bfd6bd0bf979426d405cc6e71eceb8701b148b16c21d2dc3c261efc61c7b/sqlparse-0.5.3-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "cf2196ed3418f3ba5de6af7e82c694a9fbdbfecccdfc72e281548517081f16ca" + +[[packages]] +name = "squarify" +version = "0.4.4" + +[[packages.wheels]] +name = "squarify-0.4.4-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/b7/3c/eedbe9fb07cc20fd9a8423da14b03bc270d0570b3ba9174a4497156a2152/squarify-0.4.4-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "d7597724e29d48aa14fd2f551060d6b09e1f0a67e4cd3ea329fe03b4c9a56f11" + +[[packages]] +name = "sse-starlette" +version = "2.2.1" + +[[packages.wheels]] +name = "sse_starlette-2.2.1-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/d9/e0/5b8bd393f27f4a62461c5cf2479c75a2cc2ffa330976f9f00f5f6e4f50eb/sse_starlette-2.2.1-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "6410a3d3ba0c89e7675d4c273a301d64649c03a5ef1ca101f10b47f895fd0e99" + +[[packages]] +name = "sspilib" +version = "0.2.0" + +[[packages.wheels]] +name = "sspilib-0.2.0-cp313-cp313-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/49/ad/40f898075c913c75060c17c9cc6d6b86e8f83b6f5e1e017627b07ff53fcd/sspilib-0.2.0-cp313-cp313-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "c39a698491f43618efca8776a40fb7201d08c415c507f899f0df5ada15abefaa" + +[[packages]] +name = "stack-data" +version = "0.6.3" + +[[packages.wheels]] +name = "stack_data-0.6.3-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/f1/7b/ce1eafaf1a76852e2ec9b22edecf1daa58175c090266e9f6c64afcd81d91/stack_data-0.6.3-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "d5558e0c25a4cb0853cddad3d77da9891a08cb85dd9f9f91b9f8cd66e511e695" + +[[packages]] +name = "starlette" +version = "0.46.2" + +[[packages.wheels]] +name = "starlette-0.46.2-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/8b/0c/9d30a4ebeb6db2b25a841afbb80f6ef9a854fc3b41be131d249a977b4959/starlette-0.46.2-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "595633ce89f8ffa71a015caed34a5b2dc1c0cdb3f0f1fbd1e69339cf2abeec35" + +[[packages]] +name = "statsmodels" +version = "0.14.4" + +[[packages.wheels]] +name = "statsmodels-0.14.4-cp313-cp313-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/1d/eb/cb8b01f5edf8f135eb3d0553d159db113a35b2948d0e51eeb735e7ae09ea/statsmodels-0.14.4-cp313-cp313-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "81030108d27aecc7995cac05aa280cf8c6025f6a6119894eef648997936c2dd0" + +[[packages]] +name = "streamlit" +version = "1.46.0" + +[[packages.wheels]] +name = "streamlit-1.46.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/be/26/79bbb77bec3d605f7de7a4b45c806b44d112e8c9bce77fb620e03d9f2b88/streamlit-1.46.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "f8624acabafcf18611a0fac2635cf181a7ba922b45bd131ae15fc8f80e1a5482" + +[[packages]] +name = "superqt" +version = "0.7.3" + +[[packages.wheels]] +name = "superqt-0.7.3-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/4f/53/ce8e705a0fca9ff08406d0232409c6dacd09a04cdc5124e33aa3ad97c117/superqt-0.7.3-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "8f7d141665b31baa484747f324fc9fc2d14223f2fefc92ffed6ea35c92221304" + +[[packages]] +name = "sv-ttk" +version = "2.6.0" + +[[packages.wheels]] +name = "sv_ttk-2.6.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/0f/3d/be0abc3202e90f282ad465f4e7c6e41bc8dce810ce5d1611566a1e7dfba8/sv_ttk-2.6.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "4319c52edf2e14732fe84bdc9788e26f9e9a1ad79451ec0f89f0120ffc8105d9" + +[[packages]] +name = "sympy" +version = "1.14.0" + +[[packages.wheels]] +name = "sympy-1.14.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/a2/09/77d55d46fd61b4a135c444fc97158ef34a095e5681d0a6c10b75bf356191/sympy-1.14.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "e091cc3e99d2141a0ba2847328f5479b05d94a6635cb96148ccb3f34671bd8f5" + +[[packages]] +name = "tabulate" +version = "0.9.0" + +[[packages.wheels]] +name = "tabulate-0.9.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/40/44/4a5f08c96eb108af5cb50b41f76142f0afa346dfa99d5296fe7202a11854/tabulate-0.9.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "024ca478df22e9340661486f85298cff5f6dcdba14f3813e8830015b9ed1948f" + +[[packages]] +name = "tblib" +version = "3.1.0" + +[[packages.wheels]] +name = "tblib-3.1.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/27/44/aa5c8b10b2cce7a053018e0d132bd58e27527a0243c4985383d5b6fd93e9/tblib-3.1.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "670bb4582578134b3d81a84afa1b016128b429f3d48e6cbbaecc9d15675e984e" + +[[packages]] +name = "tenacity" +version = "9.1.2" + +[[packages.wheels]] +name = "tenacity-9.1.2-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/e5/30/643397144bfbfec6f6ef821f36f33e57d35946c44a2352d3c9f0ae847619/tenacity-9.1.2-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "f77bf36710d8b73a50b2dd155c97b870017ad21afe6ab300326b0371b3b05138" + +[[packages]] +name = "termcolor" +version = "3.1.0" + +[[packages.wheels]] +name = "termcolor-3.1.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/4f/bd/de8d508070629b6d84a30d01d57e4a65c69aa7f5abe7560b8fad3b50ea59/termcolor-3.1.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "591dd26b5c2ce03b9e43f391264626557873ce1d379019786f99b0c2bee140aa" + +[[packages]] +name = "terminado" +version = "0.18.1" + +[[packages.wheels]] +name = "terminado-0.18.1-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/6a/9e/2064975477fdc887e47ad42157e214526dcad8f317a948dee17e1659a62f/terminado-0.18.1-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "a4468e1b37bb318f8a86514f65814e1afc977cf29b3992a4500d9dd305dcceb0" + +[[packages]] +name = "text-unidecode" +version = "1.3" + +[[packages.wheels]] +name = "text_unidecode-1.3-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/a6/a5/c0b6468d3824fe3fde30dbb5e1f687b291608f9473681bbf7dabbf5a87d7/text_unidecode-1.3-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "1311f10e8b895935241623731c2ba64f4c455287888b18189350b67134a822e8" + +[[packages]] +name = "textdistance" +version = "4.6.3" + +[[packages.wheels]] +name = "textdistance-4.6.3-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/c6/c2/c62601c858010b0513a6434b9be19bd740533a6e861eddfd30b7258d92a0/textdistance-4.6.3-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "0cb1b2cc8e3339ddc3e0f8c870e49fb49de6ecc42a718917308b3c971f34aa56" + +[[packages]] +name = "thefuzz" +version = "0.22.1" + +[[packages.wheels]] +name = "thefuzz-0.22.1-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/82/4f/1695e70ceb3604f19eda9908e289c687ea81c4fecef4d90a9d1d0f2f7ae9/thefuzz-0.22.1-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "59729b33556850b90e1093c4cf9e618af6f2e4c985df193fdf3c5b5cf02ca481" + +[[packages]] +name = "threadpoolctl" +version = "3.6.0" + +[[packages.wheels]] +name = "threadpoolctl-3.6.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/32/d5/f9a850d79b0851d1d4ef6456097579a9005b31fea68726a4ae5f2d82ddd9/threadpoolctl-3.6.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "43a0b8fd5a2928500110039e43a5eed8480b918967083ea48dc3ab9f13c4a7fb" + +[[packages]] +name = "three-merge" +version = "0.1.1" + +[[packages.wheels]] +name = "three_merge-0.1.1-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/23/be/a52588102605ec52b4e88340d65a290b6465c1dbcd2d943ab149b012908b/three_merge-0.1.1-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "dd219f4696aa0bbec6099ac3528b4de0450ff9bde862dd8f6d6f52e745f83464" + +[[packages]] +name = "tifffile" +version = "2025.3.30" + +[[packages.wheels]] +name = "tifffile-2025.3.30-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/6e/be/10d23cfd4078fbec6aba768a357eff9e70c0b6d2a07398425985c524ad2a/tifffile-2025.3.30-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "0ed6eee7b66771db2d1bfc42262a51b01887505d35539daef118f4ff8c0f629c" + +[[packages]] +name = "tiktoken" +version = "0.9.0" + +[[packages.wheels]] +name = "tiktoken-0.9.0-cp313-cp313-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/de/a8/8f499c179ec900783ffe133e9aab10044481679bb9aad78436d239eee716/tiktoken-0.9.0-cp313-cp313-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "5ea0edb6f83dc56d794723286215918c1cde03712cbbafa0348b33448faf5b95" + +[[packages]] +name = "tinycss2" +version = "1.4.0" + +[[packages.wheels]] +name = "tinycss2-1.4.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/e6/34/ebdc18bae6aa14fbee1a08b63c015c72b64868ff7dae68808ab500c492e2/tinycss2-1.4.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "3a49cf47b7675da0b15d0c6e1df8df4ebd96e9394bb905a5775adb0d884c5289" + +[[packages]] +name = "tokenizers" +version = "0.21.1" + +[[packages.wheels]] +name = "tokenizers-0.21.1-cp39-abi3-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/e6/b6/072a8e053ae600dcc2ac0da81a23548e3b523301a442a6ca900e92ac35be/tokenizers-0.21.1-cp39-abi3-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "0f0dcbcc9f6e13e675a66d7a5f2f225a736745ce484c1a4e07476a89ccdad382" + +[[packages]] +name = "toml" +version = "0.10.2" + +[[packages.wheels]] +name = "toml-0.10.2-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/44/6f/7120676b6d73228c96e17f1f794d8ab046fc910d781c8d151120c3f1569e/toml-0.10.2-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b" + +[[packages]] +name = "tomli" +version = "2.2.1" + +[[packages.wheels]] +name = "tomli-2.2.1-cp313-cp313-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/c7/32/b0963458706accd9afcfeb867c0f9175a741bf7b19cd424230714d722198/tomli-2.2.1-cp313-cp313-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "a38aa0308e754b0e3c67e344754dff64999ff9b513e691d0e786265c93583c69" + +[[packages]] +name = "tomli-w" +version = "1.2.0" + +[[packages.wheels]] +name = "tomli_w-1.2.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/c7/18/c86eb8e0202e32dd3df50d43d7ff9854f8e0603945ff398974c1d91ac1ef/tomli_w-1.2.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "188306098d013b691fcadc011abd66727d3c414c571bb01b1a174ba8c983cf90" + +[[packages]] +name = "tomlkit" +version = "0.13.2" + +[[packages.wheels]] +name = "tomlkit-0.13.2-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/f9/b6/a447b5e4ec71e13871be01ba81f5dfc9d0af7e473da256ff46bc0e24026f/tomlkit-0.13.2-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "7a974427f6e119197f670fbbbeae7bef749a6c14e793db934baefc1b5f03efde" + +[[packages]] +name = "toolz" +version = "1.0.0" + +[[packages.wheels]] +name = "toolz-1.0.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/03/98/eb27cc78ad3af8e302c9d8ff4977f5026676e130d28dd7578132a457170c/toolz-1.0.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "292c8f1c4e7516bf9086f8850935c799a874039c8bcf959d47b600e4c44a6236" + +[[packages]] +name = "tornado" +version = "6.5.1" + +[[packages.wheels]] +name = "tornado-6.5.1-cp39-abi3-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/7b/09/6526e32bf1049ee7de3bebba81572673b19a2a8541f795d887e92af1a8bc/tornado-6.5.1-cp39-abi3-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "908e7d64567cecd4c2b458075589a775063453aeb1d2a1853eedb806922f568b" + +[[packages]] +name = "tqdm" +version = "4.67.1" + +[[packages.wheels]] +name = "tqdm-4.67.1-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/d0/30/dc54f88dd4a2b5dc8a0279bdd7270e735851848b762aeb1c1184ed1f6b14/tqdm-4.67.1-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "26445eca388f82e72884e0d580d5464cd801a3ea01e63e5601bdff9ba6a48de2" + +[[packages]] +name = "traitlets" +version = "5.14.3" + +[[packages.wheels]] +name = "traitlets-5.14.3-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.3-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "b74e89e397b1ed28cc831db7aea759ba6640cb3de13090ca145426688ff1ac4f" + +[[packages]] +name = "traittypes" +version = "0.2.1" + +[[packages.wheels]] +name = "traittypes-0.2.1-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/9c/d1/8d5bd662703cc1764d986f6908a608777305946fa634d34c470cd4a1e729/traittypes-0.2.1-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "1340af133810b6eee1a2eb2e988f862b0d12b6c2d16f282aaf3207b782134c2e" + +[[packages]] +name = "trio" +version = "0.30.0" + +[[packages.wheels]] +name = "trio-0.30.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/69/8e/3f6dfda475ecd940e786defe6df6c500734e686c9cd0a0f8ef6821e9b2f2/trio-0.30.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "3bf4f06b8decf8d3cf00af85f40a89824669e2d033bb32469d34840edcfc22a5" + +[[packages]] +name = "trove-classifiers" +version = "2025.5.9.12" + +[[packages.wheels]] +name = "trove_classifiers-2025.5.9.12-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/92/ef/c6deb083748be3bcad6f471b6ae983950c161890bf5ae1b2af80cc56c530/trove_classifiers-2025.5.9.12-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "e381c05537adac78881c8fa345fd0e9970159f4e4a04fcc42cfd3129cca640ce" + +[[packages]] +name = "twine" +version = "6.1.0" + +[[packages.wheels]] +name = "twine-6.1.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/7c/b6/74e927715a285743351233f33ea3c684528a0d374d2e43ff9ce9585b73fe/twine-6.1.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "a47f973caf122930bf0fbbf17f80b83bc1602c9ce393c7845f289a3001dc5384" + +[[packages]] +name = "typer" +version = "0.15.2" + +[[packages.wheels]] +name = "typer-0.15.2-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/7f/fc/5b29fea8cee020515ca82cc68e3b8e1e34bb19a3535ad854cac9257b414c/typer-0.15.2-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "46a499c6107d645a9c13f7ee46c5d5096cae6f5fc57dd11eccbbb9ae3e44ddfc" + +[[packages]] +name = "types-python-dateutil" +version = "2.9.0.20240316" + +[[packages.wheels]] +name = "types_python_dateutil-2.9.0.20240316-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/c7/1b/af4f4c4f3f7339a4b7eb3c0ab13416db98f8ac09de3399129ee5fdfa282b/types_python_dateutil-2.9.0.20240316-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "6b8cb66d960771ce5ff974e9dd45e38facb81718cc1e208b10b1baccbfdbee3b" + +[[packages]] +name = "types-requests" +version = "2.32.0.20250328" + +[[packages.wheels]] +name = "types_requests-2.32.0.20250328-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/cc/15/3700282a9d4ea3b37044264d3e4d1b1f0095a4ebf860a99914fd544e3be3/types_requests-2.32.0.20250328-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "72ff80f84b15eb3aa7a8e2625fffb6a93f2ad5a0c20215fc1dcfa61117bcb2a2" + +[[packages]] +name = "typing-extensions" +version = "4.13.2" + +[[packages.wheels]] +name = "typing_extensions-4.13.2-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/8b/54/b1ae86c0973cc6f0210b53d508ca3641fb6d0c56823f288d108bc7ab3cc8/typing_extensions-4.13.2-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "a439e7c04b49fec3e5d3e2beaa21755cadbbdc391694e28ccdd36ca4a1408f8c" + +[[packages]] +name = "typing-inspection" +version = "0.4.0" + +[[packages.wheels]] +name = "typing_inspection-0.4.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/31/08/aa4fdfb71f7de5176385bd9e90852eaf6b5d622735020ad600f2bab54385/typing_inspection-0.4.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "50e72559fcd2a6367a19f7a7e610e6afcb9fac940c650290eed893d61386832f" + +[[packages]] +name = "tzdata" +version = "2025.2" + +[[packages.wheels]] +name = "tzdata-2025.2-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/5c/23/c7abc0ca0a1526a0774eca151daeb8de62ec457e77262b66b359c3c7679e/tzdata-2025.2-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "1a403fada01ff9221ca8044d701868fa132215d84beb92242d9acd2147f667a8" + +[[packages]] +name = "tzlocal" +version = "5.3.1" + +[[packages.wheels]] +name = "tzlocal-5.3.1-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/c2/14/e2a54fabd4f08cd7af1c07030603c3356b74da07f7cc056e600436edfa17/tzlocal-5.3.1-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "eb1a66c3ef5847adf7a834f1be0800581b683b5608e74f86ecbcef8ab91bb85d" + +[[packages]] +name = "uc-micro-py" +version = "1.0.3" + +[[packages.wheels]] +name = "uc_micro_py-1.0.3-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/37/87/1f677586e8ac487e29672e4b17455758fce261de06a0d086167bb760361a/uc_micro_py-1.0.3-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "db1dffff340817673d7b466ec86114a9dc0e9d4d9b5ba229d9d60e5c12600cd5" + +[[packages]] +name = "ujson" +version = "5.10.0" + +[[packages.wheels]] +name = "ujson-5.10.0-cp313-cp313-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/d7/72/6cb6728e2738c05bbe9bd522d6fc79f86b9a28402f38663e85a28fddd4a0/ujson-5.10.0-cp313-cp313-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "4573fd1695932d4f619928fd09d5d03d917274381649ade4328091ceca175539" + +[[packages]] +name = "umap-learn" +version = "0.5.7" + +[[packages.wheels]] +name = "umap_learn-0.5.7-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/3c/8f/671c0e1f2572ba625cbcc1faeba9435e00330c3d6962858711445cf1e817/umap_learn-0.5.7-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "6a7e0be2facfa365a5ed6588447102bdbef32a0ef449535c25c97ea7e680073c" + +[[packages]] +name = "uncertainties" +version = "3.2.2" + +[[packages.wheels]] +name = "uncertainties-3.2.2-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/fa/fc/97711d2a502881d871e3cf2d2645e21e7f8e4d4fd9a56937557790cade6a/uncertainties-3.2.2-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "fd8543355952f4052786ed4150acaf12e23117bd0f5bd03ea07de466bce646e7" + +[[packages]] +name = "uri-template" +version = "1.3.0" + +[[packages.wheels]] +name = "uri_template-1.3.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/e7/00/3fca040d7cf8a32776d3d81a00c8ee7457e00f80c649f1e4a863c8321ae9/uri_template-1.3.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "a44a133ea12d44a0c0f06d7d42a52d71282e77e2f937d8abd5655b8d56fc1363" + +[[packages]] +name = "urllib3" +version = "2.4.0" + +[[packages.wheels]] +name = "urllib3-2.4.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/6b/11/cc635220681e93a0183390e26485430ca2c7b5f9d33b15c74c2861cb8091/urllib3-2.4.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "4e16665048960a0900c702d4a66415956a584919c03361cac9f1df5c5dd7e813" + +[[packages]] +name = "uvicorn" +version = "0.34.2" + +[[packages.wheels]] +name = "uvicorn-0.34.2-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/b1/4b/4cef6ce21a2aaca9d852a6e84ef4f135d99fcd74fa75105e2fc0c8308acd/uvicorn-0.34.2-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "deb49af569084536d269fe0a6d67e3754f104cf03aba7c11c40f01aadf33c403" + +[[packages]] +name = "vega-datasets" +version = "0.9.0" + +[[packages.wheels]] +name = "vega_datasets-0.9.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/e6/9f/ca52771fe972e0dcc5167fedb609940e01516066938ff2ee28b273ae4f29/vega_datasets-0.9.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "3d7c63917be6ca9b154b565f4779a31fedce57b01b5b9d99d8a34a7608062a1d" + +[[packages]] +name = "waitress" +version = "3.0.0" + +[[packages.wheels]] +name = "waitress-3.0.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/5b/a9/485c953a1ac4cb98c28e41fd2c7184072df36bbf99734a51d44d04176878/waitress-3.0.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "2a06f242f4ba0cc563444ca3d1998959447477363a2d7e9b8b4d75d35cfd1669" + +[[packages]] +name = "watchdog" +version = "6.0.0" + +[[packages.wheels]] +name = "watchdog-6.0.0-py3-none-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/db/d9/c495884c6e548fce18a8f40568ff120bc3a4b7b99813081c8ac0c936fa64/watchdog-6.0.0-py3-none-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "cbafb470cf848d93b5d013e2ecb245d4aa1c8fd0504e863ccefa32445359d680" + +[[packages]] +name = "wcwidth" +version = "0.2.13" + +[[packages.wheels]] +name = "wcwidth-0.2.13-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/fd/84/fd2ba7aafacbad3c4201d395674fc6348826569da3c0937e75505ead3528/wcwidth-0.2.13-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "3da69048e4540d84af32131829ff948f1e022c1c6bdb8d6102117aac784f6859" + +[[packages]] +name = "webcolors" +version = "24.11.1" + +[[packages.wheels]] +name = "webcolors-24.11.1-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/60/e8/c0e05e4684d13459f93d312077a9a2efbe04d59c393bc2b8802248c908d4/webcolors-24.11.1-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "515291393b4cdf0eb19c155749a096f779f7d909f7cceea072791cb9095b92e9" + +[[packages]] +name = "webencodings" +version = "0.5.1" + +[[packages.wheels]] +name = "webencodings-0.5.1-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/f4/24/2a3e3df732393fed8b3ebf2ec078f05546de641fe1b667ee316ec1dcf3b7/webencodings-0.5.1-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78" + +[[packages]] +name = "websocket-client" +version = "1.8.0" + +[[packages.wheels]] +name = "websocket_client-1.8.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/5a/84/44687a29792a70e111c5c477230a72c4b957d88d16141199bf9acb7537a3/websocket_client-1.8.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "17b44cc997f5c498e809b22cdf2d9c7a9e71c02c8cc2b6c56e7c2d1239bfa526" + +[[packages]] +name = "websockets" +version = "14.2" + +[[packages.wheels]] +name = "websockets-14.2-cp313-cp313-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/14/13/8b7fc4cb551b9cfd9890f0fd66e53c18a06240319915533b033a56a3d520/websockets-14.2-cp313-cp313-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "b439ea828c4ba99bb3176dc8d9b933392a2413c0f6b149fdcba48393f573377f" + +[[packages]] +name = "werkzeug" +version = "3.1.3" + +[[packages.wheels]] +name = "werkzeug-3.1.3-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/52/24/ab44c871b0f07f491e5d2ad12c9bd7358e527510618cb1b803a88e986db1/werkzeug-3.1.3-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "54b78bf3716d19a65be4fceccc0d1d7b89e608834989dfae50ea87564639213e" + +[[packages]] +name = "whatthepatch" +version = "1.0.7" + +[[packages.wheels]] +name = "whatthepatch-1.0.7-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/8e/93/af1d6ccb69ab6b5a00e03fa0cefa563f9862412667776ea15dd4eece3a90/whatthepatch-1.0.7-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "1b6f655fd31091c001c209529dfaabbabdbad438f5de14e3951266ea0fc6e7ed" + +[[packages]] +name = "wheel" +version = "0.45.1" + +[[packages.wheels]] +name = "wheel-0.45.1-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/0b/2c/87f3254fd8ffd29e4c02732eee68a83a1d3c346ae39bc6822dcbcb697f2b/wheel-0.45.1-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "708e7481cc80179af0e556bbf0cc00b8444c7321e2700b8d8580231d13017248" + +[[packages]] +name = "widgetsnbextension" +version = "4.0.14" + +[[packages.wheels]] +name = "widgetsnbextension-4.0.14-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/ca/51/5447876806d1088a0f8f71e16542bf350918128d0a69437df26047c8e46f/widgetsnbextension-4.0.14-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "4875a9eaf72fbf5079dc372a51a9f268fc38d46f767cbf85c43a36da5cb9b575" + +[[packages]] +name = "wordcloud" +version = "1.9.4" + +[[packages.wheels]] +name = "wordcloud-1.9.4-cp313-cp313-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/84/47/d482f7d2decc6e59e69e105b12c53d6d2967f0d703e664484c5f2f87fca8/wordcloud-1.9.4-cp313-cp313-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "8c9a5af2fbcf029a19e827adbee58e86efe7536dca7a42380a8601113a86069b" + +[[packages]] +name = "wrapt" +version = "1.16.0" + +[[packages.wheels]] +name = "wrapt-1.16.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/ff/21/abdedb4cdf6ff41ebf01a74087740a709e2edb146490e4d9beea054b0b7a/wrapt-1.16.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "6906c4100a8fcbf2fa735f6059214bb13b97f75b1a61777fcf6432121ef12ef1" + +[[packages]] +name = "wsproto" +version = "1.2.0" + +[[packages.wheels]] +name = "wsproto-1.2.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/78/58/e860788190eba3bcce367f74d29c4675466ce8dddfba85f7827588416f01/wsproto-1.2.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "b9acddd652b585d75b20477888c56642fdade28bdfd3579aa24a4d2c037dd736" + +[[packages]] +name = "xarray" +version = "2025.4.0" + +[[packages.wheels]] +name = "xarray-2025.4.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/a4/1e/96fd96419fec1a37da998a1ca3d558f2cae2f6f3cd5015170371b05a2b6b/xarray-2025.4.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "b27defd082c5cb85d32c695708de6bb05c2838fb7caaf3f952982e602a35b9b8" + +[[packages]] +name = "xlsxwriter" +version = "3.2.3" + +[[packages.wheels]] +name = "XlsxWriter-3.2.3-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/37/b1/a252d499f2760b314fcf264d2b36fcc4343a1ecdb25492b210cb0db70a68/XlsxWriter-3.2.3-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "593f8296e8a91790c6d0378ab08b064f34a642b3feb787cf6738236bd0a4860d" + +[[packages]] +name = "xyzservices" +version = "2023.10.1" + +[[packages.wheels]] +name = "xyzservices-2023.10.1-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/82/c3/e06dfa46464cce3eda4b86df8847cab99d9bc545c76807ee689545187a4c/xyzservices-2023.10.1-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "6a4c38d3a9f89d3e77153eff9414b36a8ee0850c9e8b85796fd1b2a85b8dfd68" + +[[packages]] +name = "yapf" +version = "0.40.1" + +[[packages.wheels]] +name = "yapf-0.40.1-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/23/75/c374517c09e31bf22d3b3f156d73e0f38d08e29b2afdd607cef5f1e10aa9/yapf-0.40.1-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "b8bfc1f280949153e795181768ca14ef43d7312629a06c43e7abd279323af313" + +[[packages]] +name = "yarl" +version = "1.18.3" + +[[packages.wheels]] +name = "yarl-1.18.3-cp313-cp313-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/f5/d5/688db678e987c3e0fb17867970700b92603cadf36c56e5fb08f23e822a0c/yarl-1.18.3-cp313-cp313-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "578e281c393af575879990861823ef19d66e2b1d0098414855dd367e234f5b3c" + +[[packages]] +name = "yt-dlp" +version = "2025.2.19" + +[[packages.wheels]] +name = "yt_dlp-2025.2.19-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/9e/45/6d1b759e68f5363b919828fb0e0c167a1cd5003b5b7c74cc0f0c2096be4f/yt_dlp-2025.2.19-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "3ed218eaeece55e9d715afd41abc450dc406ee63bf79355169dfde312d38fdb8" + +[[packages]] +name = "zict" +version = "3.0.0" + +[[packages.wheels]] +name = "zict-3.0.0-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/80/ab/11a76c1e2126084fde2639514f24e6111b789b0bfa4fc6264a8975c7e1f1/zict-3.0.0-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "5796e36bd0e0cc8cf0fbc1ace6a68912611c1dbd74750a3f3026b9b9d6a327ae" + +[[packages]] +name = "zipp" +version = "3.21.0" + +[[packages.wheels]] +name = "zipp-3.21.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/b7/1a/7e4798e9339adc931158c9d69ecc34f5e6791489d469f5e50ec15e35f458/zipp-3.21.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "ac1bbe05fd2991f160ebce24ffbac5f6d11d83dc90891255885223d42b3cd931" + +[[packages]] +name = "zstandard" +version = "0.23.0" + +[[packages.wheels]] +name = "zstandard-0.23.0-cp313-cp313-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/a2/bf/c6aaba098e2d04781e8f4f7c0ba3c7aa73d00e4c436bcc0cf059a66691d1/zstandard-0.23.0-cp313-cp313-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "f3513916e8c645d0610815c257cbfd3242adfd5c4cfa78be514e5a3ebb42a41b" diff --git a/changelogs/requir.64-3_12_10_1slim.txt b/changelogs/requir.64-3_12_10_1slim.txt new file mode 100644 index 00000000..40ca03cb --- /dev/null +++ b/changelogs/requir.64-3_12_10_1slim.txt @@ -0,0 +1,998 @@ +absl-py==2.2.2 \ + --hash=sha256:e5797bc6abe45f64fd95dc06394ca3f2bedf3b5d895e9da691c9ee3397d70092 +adbc-driver-manager==1.3.0 \ + --hash=sha256:0646996a7bbd31b321a16810f7110e9155b08607c0a83fed97414ad1bd2cac9e +aiofiles==23.2.1 \ + --hash=sha256:19297512c647d4b27a2cf7c34caa7e405c0d60b5560618a29a9fe027b18b0107 +aiohappyeyeballs==2.6.1 \ + --hash=sha256:f349ba8f4b75cb25c99c5c2d84e997e485204d2902a9597802b0371f09331fb8 +aiohttp==3.11.18 \ + --hash=sha256:364329f319c499128fd5cd2d1c31c44f234c58f9b96cc57f743d16ec4f3238c8 +aiosignal==1.3.2 \ + --hash=sha256:45cde58e409a301715980c2b01d0c28bdde3770d8290b5eb2173759d9acb31a5 +aiosqlite==0.20.0 \ + --hash=sha256:36a1deaca0cac40ebe32aac9977a6e2bbc7f5189f23f4a54d5908986729e5bd6 +alabaster==0.7.16 \ + --hash=sha256:b46733c07dce03ae4e150330b975c75737fa60f0a7c591b6c8bf4928a28e2c92 +alembic==1.15.2 \ + --hash=sha256:2e76bd916d547f6900ec4bb5a90aeac1485d2c92536923d0b138c02b126edc53 +altair==5.5.0 \ + --hash=sha256:91a310b926508d560fe0148d02a194f38b824122641ef528113d029fcd129f8c +annotated-types==0.7.0 \ + --hash=sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53 +ansicolors==1.1.8 \ + --hash=sha256:00d2dde5a675579325902536738dd27e4fac1fd68f773fe36c21044eb559e187 +anthropic==0.51.0 \ + --hash=sha256:b8b47d482c9aa1f81b923555cebb687c2730309a20d01be554730c8302e0f62a +anyio==4.9.0 \ + --hash=sha256:9f76d541cad6e36af7beb62e978876f3b41e3e04f2c1fbf0884604c0a9c4d93c +anywidget==0.9.18 \ + --hash=sha256:944b82ef1dd17b8ff0fb6d1f199f613caf9111338e6e2857da478f6e73770cb8 +appdirs==1.4.4 \ + --hash=sha256:a841dacd6b99318a741b166adb07e19ee71a274450e68237b4650ca1055ab128 +argcomplete==3.6.2 \ + --hash=sha256:65b3133a29ad53fb42c48cf5114752c7ab66c1c38544fdf6460f450c09b42591 +argon2-cffi==23.1.0 \ + --hash=sha256:c670642b78ba29641818ab2e68bd4e6a78ba53b7eff7b4c3815ae16abf91c7ea +argon2-cffi-bindings==21.2.0 \ + --hash=sha256:b2ef1c30440dbbcba7a5dc3e319408b59676e2e039e2ae11a8775ecf482b192f +array-api-compat==1.12.0 \ + --hash=sha256:a0b4795b6944a9507fde54679f9350e2ad2b1e2acf4a2408a098cdc27f890a8b +arrow==1.3.0 \ + --hash=sha256:c728b120ebc00eb84e01882a6f5e7927a53960aa990ce7dd2b10f39005a67f80 +asgi-csrf==0.11 \ + --hash=sha256:03ac140115f39d4295288a9adf74fdc6ae607f6ef44abee8466520458207242b +asgiref==3.8.1 \ + --hash=sha256:3e1e3ecc849832fe52ccf2cb6686b7a55f82bb1d6aee72a58826471390335e47 +asn1crypto==1.5.1 \ + --hash=sha256:db4e40728b728508912cbb3d44f19ce188f218e9eba635821bb4b68564f8fd67 +asteval==1.0.5 \ + --hash=sha256:082b95312578affc8a6d982f7d92b7ac5de05634985c87e7eedd3188d31149fa +astroid==3.3.9 \ + --hash=sha256:d05bfd0acba96a7bd43e222828b7d9bc1e138aaeb0649707908d3702a9831248 +astropy==6.1.6 \ + --hash=sha256:344c6433b66c770917cb55f9f3754427774d7066bfa7ccf1ca638f45c7c00738 +astropy-iers-data==0.2024.12.23.0.33.24 \ + --hash=sha256:40d3c6b6a5cf4dc6ad91b92b7e0f949e5366234e3c4440302247429fc8294302 +asttokens==3.0.0 \ + --hash=sha256:e3078351a059199dd5138cb1c706e6430c05eff2ff136af5eb4790f9d28932e2 +async-lru==2.0.5 \ + --hash=sha256:ab95404d8d2605310d345932697371a5f40def0487c03d6d0ad9138de52c9943 +asyncssh==2.20.0 \ + --hash=sha256:af6888d937c07a4bf31293335a6166b4d87608cdb5957b49547da6ad87ecf174 +atomicwrites==1.4.0 \ + --hash=sha256:6d1784dea7c0c8d4a5172b6c620f40b6e4cbfdf96d783691f2e1302a7b88e197 +attrs==25.3.0 \ + --hash=sha256:427318ce031701fea540783410126f03899a97ffc6f61596ad581ac2e40e3bc3 +autopep8==2.0.4 \ + --hash=sha256:067959ca4a07b24dbd5345efa8325f5f58da4298dab0dde0443d5ed765de80cb +azure-core==1.32.0 \ + --hash=sha256:eac191a0efb23bfa83fddf321b27b122b4ec847befa3091fa736a5c32c50d7b4 +azure-cosmos==4.9.0 \ + --hash=sha256:3b60eaa01a16a857d0faf0cec304bac6fa8620a81bc268ce760339032ef617fe +azure-identity==1.21.0 \ + --hash=sha256:258ea6325537352440f71b35c3dffe9d240eae4a5126c1b7ce5efd5766bd9fd9 +babel==2.17.0 \ + --hash=sha256:4d0b53093fdfb4b21c92b5213dba5a1b23885afa8383709427046b21c366e5f2 +baresql==1.0.0 \ + --hash=sha256:a24d17f46beb47c221f328f7e06710e3896c6203a8e1909788d7128f27b86f01 +bcrypt==4.3.0 \ + --hash=sha256:e53e074b120f2877a35cc6c736b8eb161377caae8925c17688bd46ba56daaa5b +beautifulsoup4==4.13.3 \ + --hash=sha256:99045d7d3f08f91f0d656bc9b7efbae189426cd913d830294a15eefa0ea4df16 +binaryornot==0.4.4 \ + --hash=sha256:b8b71173c917bddcd2c16070412e369c3ed7f0528926f70cac18a6c97fd563e4 +black==25.1.0 \ + --hash=sha256:ea0213189960bda9cf99be5b8c8ce66bb054af5e9e861249cd23471bd7b0b3ba +bleach==6.2.0 \ + --hash=sha256:117d9c6097a7c3d22fd578fcd8d35ff1e125df6736f554da4e432fdd63f31e5e +blinker==1.9.0 \ + --hash=sha256:ba0efaa9080b619ff2f3459d1d500c57bddea4a6b424b60a91141db6fd2f08bc +bokeh==3.7.3 \ + --hash=sha256:b0e79dd737f088865212e4fdcb0f3b95d087f0f088bf8ca186a300ab1641e2c7 +branca==0.8.1 \ + --hash=sha256:d29c5fab31f7c21a92e34bf3f854234e29fecdcf5d2df306b616f20d816be425 +brotli==1.1.0 \ + --hash=sha256:906bc3a79de8c4ae5b86d3d75a8b77e44404b0f4261714306e3ad248d8ab0951 +build==1.2.2.post1 \ + --hash=sha256:1d61c0887fa860c01971625baae8bdd338e517b836a2f70dd1f7aa3a6b2fc5b5 +cachetools==5.5.2 \ + --hash=sha256:d26a22bcc62eb95c3beabd9f1ee5e820d3d2704fe2967cbe350e20c8ffcd3f0a +certifi==2025.1.31 \ + --hash=sha256:ca78db4565a652026a4db2bcdf68f2fb589ea80d0be70e03929ed730746b84fe +cffi==1.17.1 \ + --hash=sha256:51392eae71afec0d0c8fb1a53b204dbb3bcabcb3c9b807eedf3e1e6ccf2de903 +chardet==5.2.0 \ + --hash=sha256:e1cf59446890a00105fe7b7912492ea04b6e6f06d4b742b2c788469e34c82970 +charset-normalizer==3.4.2 \ + --hash=sha256:5a9979887252a82fefd3d3ed2a8e3b937a7a809f65dcb1e068b090e165bbe99e +clarabel==0.10.0 \ + --hash=sha256:7871b6f499ad66f71d4e7fb40754c4d986d4316f242beb62ff4f63a69785a50c +click==8.1.8 \ + --hash=sha256:63c132bbbed01578a06712a2d1f497bb62d9c1c0d329b7903a866228027263b2 +click-default-group==1.2.4 \ + --hash=sha256:9b60486923720e7fc61731bdb32b617039aba820e22e1c88766b1125592eaa5f +cloudpickle==3.1.1 \ + --hash=sha256:c8c5a44295039331ee9dad40ba100a9c7297b6f988e50e87ccdf3765a668350e +cohere==5.15.0 \ + --hash=sha256:22ff867c2a6f2fc2b585360c6072f584f11f275ef6d9242bac24e0fa2df1dfb5 +colorama==0.4.6 \ + --hash=sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6 +colorcet==3.1.0 \ + --hash=sha256:2a7d59cc8d0f7938eeedd08aad3152b5319b4ba3bcb7a612398cc17a384cb296 +colorlog==6.9.0 \ + --hash=sha256:5906e71acd67cb07a71e779c47c4bcb45fb8c2993eebe9e5adcd6a6f1b283eff +comm==0.2.2 \ + --hash=sha256:e6fb86cb70ff661ee8c9c14e7d36d6de3b4066f1441be4063df9c5009f0a64d3 +contourpy==1.3.2 \ + --hash=sha256:8c942a01d9163e2e5cfb05cb66110121b8d07ad438a17f9e766317bcb62abf73 +cookiecutter==2.6.0 \ + --hash=sha256:a54a8e37995e4ed963b3e82831072d1ad4b005af736bb17b99c2cbd9d41b6e2d +cryptography==44.0.0 \ + --hash=sha256:708ee5f1bafe76d041b53a4f95eb28cdeb8d18da17e597d46d7833ee59b97ede +cvxopt==1.3.2 \ + --hash=sha256:a92ebfc5df77fea57544f8ad2102bfc45af0e77ac4dfe98ed1b9628e8bba77c3 +cvxpy==1.6.4 \ + --hash=sha256:052a09716cfb630a48e911e7c9512015ae651100f64530d8eb973a195e105fa3 +cycler==0.12.1 \ + --hash=sha256:85cef7cff222d8644161529808465972e51340599459b8ac3ccbac5a854e0d30 +cython==3.1.1 \ + --hash=sha256:307f216ed319ea07644f2ef9974406c830f01bc8e677e2147e9bfcdf9e3ca8ad +cytoolz==1.0.1 \ + --hash=sha256:8f89c48d8e5aec55ffd566a8ec858706d70ed0c6a50228eca30986bfa5b4da8b +dask==2025.4.1 \ + --hash=sha256:aacbb0a9667856fe58385015efd64aca22f0c0b2c5e1b5e633531060303bb4be +datasette==0.65.1 \ + --hash=sha256:ba7adf717ddcc24a2a8ac57890fffd384a2ebb909b342e4f731ba09eba764305 +datasette-graphql==2.2 \ + --hash=sha256:cd9f61afdcaab1ce4ff6775296e6ece99305bf05cbfae4c1c938a6c9e60cd485 +datashader==0.17.0 \ + --hash=sha256:39421ff999294913e63d41954af955a5dece5d0c55d8fce1426043d70b22d07a +deap==1.4.2 \ + --hash=sha256:02b8b664cfa0b6c18ff3e36d0b982fb66f38fb98c5b4292515a305527d57294e +debugpy==1.8.13 \ + --hash=sha256:63ca7670563c320503fea26ac688988d9d6b9c6a12abc8a8cf2e7dd8e5f6b6ea +decorator==5.2.1 \ + --hash=sha256:d316bb415a2d9e2d2b3abcc4084c6502fc09240e292cd76a76afc106a1c8e04a +defusedxml==0.7.1 \ + --hash=sha256:a352e7e428770286cc899e2542b6cdaedb2b4953ff269a210103ec58f6198a61 +deprecated==1.2.14 \ + --hash=sha256:6fac8b097794a90302bdbb17b9b815e732d3c4720583ff1b198499d78470466c +diff-match-patch==20241021 \ + --hash=sha256:93cea333fb8b2bc0d181b0de5e16df50dd344ce64828226bda07728818936782 +dill==0.4.0 \ + --hash=sha256:44f54bf6412c2c8464c14e8243eb163690a9800dbe2c367330883b19c7561049 +distributed==2025.4.1 \ + --hash=sha256:3a7834451b04ef059928045eab6ff6d88ad7bcfd48adc99403127d9a6818b5fa +distro==1.9.0 \ + --hash=sha256:7bffd925d65168f85027d8da9af6bddab658135b840670a223589bc0c8ef02b2 +django==5.2 \ + --hash=sha256:91ceed4e3a6db5aedced65e3c8f963118ea9ba753fc620831c77074e620e7d83 +dnspython==2.7.0 \ + --hash=sha256:b4c34b7d10b51bcc3a5071e7b8dee77939f1e878477eeecc965e9835f63c6c86 +docstring-to-markdown==0.17 \ + --hash=sha256:fd7d5094aa83943bf5f9e1a13701866b7c452eac19765380dead666e36d3711c +docutils==0.21.2 \ + --hash=sha256:dafca5b9e384f0e419294eb4d2ff9fa826435bf15f15b7bd45723e8ad76811b2 +duckdb==1.3.0 \ + --hash=sha256:8754c40dac0f26d9fb0363bbb5df02f7a61ce6a6728d5efc02c3bc925d7c89c3 +entrypoints==0.4 \ + --hash=sha256:f174b5ff827504fd3cd97cc3f8649f3693f51538c7e4bdf3ef002c8429d42f9f +et-xmlfile==1.1.0 \ + --hash=sha256:a2ba85d1d6a74ef63837eed693bcb89c3f752169b0e3e7ae5b16ca5e1b3deada +eval-type-backport==0.2.2 \ + --hash=sha256:cb6ad7c393517f476f96d456d0412ea80f0a8cf96f6892834cd9340149111b0a +executing==2.2.0 \ + --hash=sha256:11387150cad388d62750327a53d3339fad4888b39a6fe233c3afbb54ecffd3aa +faker==37.1.0 \ + --hash=sha256:dc2f730be71cb770e9c715b13374d80dbcee879675121ab51f9683d262ae9a1c +fasta2a==0.2.9 \ + --hash=sha256:8b855b36f29fde6dcb79ad55be337a8165381b679bec829913009c55581e284e +fastapi==0.115.12 \ + --hash=sha256:e94613d6c05e27be7ffebdd6ea5f388112e5e430c8f7d6494a9d1d88d43e814d +fastavro==1.10.0 \ + --hash=sha256:567ff515f2a5d26d9674b31c95477f3e6022ec206124c62169bc2ffaf0889089 +fastjsonschema==2.21.1 \ + --hash=sha256:c9e5b7e908310918cf494a434eeb31384dd84a98b57a30bcb1f535015b554667 +filelock==3.18.0 \ + --hash=sha256:c401f4f8377c4464e6db25fff06205fd89bdd83b65eb0488ed1b160f780e21de +flake8==7.1.1 \ + --hash=sha256:597477df7860daa5aa0fdd84bf5208a043ab96b8e96ab708770ae0364dd03213 +flask==3.1.0 \ + --hash=sha256:d667207822eb83f1c4b50949b1623c8fc8d51f2341d65f72e1a1815397551136 +flexcache==0.3 \ + --hash=sha256:d43c9fea82336af6e0115e308d9d33a185390b8346a017564611f1466dcd2e32 +flexparser==0.4 \ + --hash=sha256:3738b456192dcb3e15620f324c447721023c0293f6af9955b481e91d00179846 +flit==3.12.0 \ + --hash=sha256:2b4e7171dc22881fa6adc2dbf083e5ecc72520be3cd7587d2a803da94d6ef431 +flit-core==3.12.0 \ + --hash=sha256:e7a0304069ea895172e3c7bb703292e992c5d1555dd1233ab7b5621b5b69e62c +folium==0.19.5 \ + --hash=sha256:4333fb3e6f3e9eedb231615d22c6d7df20aea5829554bd6908675865a37803b3 +fonttools==4.57.0 \ + --hash=sha256:57e30241524879ea10cdf79c737037221f77cc126a8cdc8ff2c94d4a522504b9 +fqdn==1.5.1 \ + --hash=sha256:3a179af3761e4df6eb2e026ff9e1a3033d3587bf980a0b1b2e1e5d08d7358014 +frozenlist==1.5.0 \ + --hash=sha256:8969190d709e7c48ea386db202d708eb94bdb29207a1f269bab1196ce0dcca1f +fsspec==2025.3.2 \ + --hash=sha256:2daf8dc3d1dfa65b6aa37748d112773a7a08416f6c70d96b264c96476ecaf711 +fuzzywuzzy==0.18.0 \ + --hash=sha256:928244b28db720d1e0ee7587acf660ea49d7e4c632569cad4f1cd7e68a5f0993 +geographiclib==2.0 \ + --hash=sha256:6b7225248e45ff7edcee32becc4e0a1504c606ac5ee163a5656d482e0cd38734 +geopandas==1.0.1 \ + --hash=sha256:01e147d9420cc374d26f51fc23716ac307f32b49406e4bd8462c07e82ed1d3d6 +geopy==2.4.1 \ + --hash=sha256:ae8b4bc5c1131820f4d75fce9d4aaaca0c85189b3aa5d64c3dcaf5e3b7b882a7 +gitdb==4.0.12 \ + --hash=sha256:67073e15955400952c6565cc3e707c554a4eea2e428946f7a4c162fab9bd9bcf +gitpython==3.1.44 \ + --hash=sha256:9e0e10cda9bed1ee64bc9a6de50e7e38a9c9943241cd7f585f6df3ed28011110 +google-auth==2.38.0 \ + --hash=sha256:e7dae6694313f434a2727bf2906f27ad259bae090d7aa896590d86feec3d9d4a +google-genai==1.16.1 \ + --hash=sha256:6ae5d24282244f577ca4f0d95c09f75ab29e556602c9d3531b70161e34cd2a39 +graphene==3.4.3 \ + --hash=sha256:820db6289754c181007a150db1f7fff544b94142b556d12e3ebc777a7bf36c71 +graphql-core==3.2.6 \ + --hash=sha256:78b016718c161a6fb20a7d97bbf107f331cd1afe53e45566c59f776ed7f0b45f +graphql-relay==3.2.0 \ + --hash=sha256:c9b22bd28b170ba1fe674c74384a8ff30a76c8e26f88ac3aa1584dd3179953e5 +greenlet==3.1.1 \ + --hash=sha256:7124e16b4c55d417577c2077be379514321916d5790fa287c9ed6f23bd2ffd01 +griffe==1.7.2 \ + --hash=sha256:1ed9c2e338a75741fc82083fe5a1bc89cb6142efe126194cc313e34ee6af5423 +groq==0.25.0 \ + --hash=sha256:aadc78b40b1809cdb196b1aa8c7f7293108767df1508cafa3e0d5045d9328e7a +guidata==3.9.0 \ + --hash=sha256:96a19dc92850bdb3e463fa06e8c22793e090db42d1e72c6dae9bda1a98b61210 +h11==0.14.0 \ + --hash=sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761 +h2==4.2.0 \ + --hash=sha256:479a53ad425bb29af087f3458a61d30780bc818e4ebcf01f0b536ba916462ed0 +h5py==3.12.1 \ + --hash=sha256:e4d51919110a030913201422fb07987db4338eba5ec8c5a15d6fab8e03d443fc +hatchling==1.27.0 \ + --hash=sha256:d3a2f3567c4f926ea39849cdf924c7e99e6686c9c8e288ae1037c8fa2a5d937b +holoviews==1.20.2 \ + --hash=sha256:1f892c04bc23e8a3a9cde082b606b9463c9ff78c3d0c00e2ddcc41fe6e738458 +hpack==4.1.0 \ + --hash=sha256:157ac792668d995c657d93111f46b4535ed114f0c9c8d672271bbec7eae1b496 +html5lib==1.1 \ + --hash=sha256:0d78f8fde1c230e99fe37986a60526d7049ed4bf8a9fadbad5f00e22e58e041d +httpcore==1.0.7 \ + --hash=sha256:a3fff8f43dc260d5bd363d9f9cf1830fa3a458b332856f34282de498ed420edd +httpie==3.2.4 \ + --hash=sha256:4bd0435cc4b9bca59501bc65089de96f3e93b393803f32a81951db62050ebf0b +httpx==0.28.1 \ + --hash=sha256:d909fcccc110f8c7faf814ca82a9a4d816bc5a6dbfea25d6591d6985b8ba59ad +httpx-sse==0.4.0 \ + --hash=sha256:f329af6eae57eaa2bdfd962b42524764af68075ea87370a2de920af5341e318f +huggingface-hub==0.33.0 \ + --hash=sha256:e8668875b40c68f9929150d99727d39e5ebb8a05a98e4191b908dc7ded9074b3 +hupper==1.12.1 \ + --hash=sha256:e872b959f09d90be5fb615bd2e62de89a0b57efc037bdf9637fb09cdf8552b19 +hvplot==0.11.2 \ + --hash=sha256:9d576a0c2df0f1cf5041545f2a2eddcf962510162876991cae4d1779fad74556 +hypercorn==0.17.3 \ + --hash=sha256:059215dec34537f9d40a69258d323f56344805efb462959e727152b0aa504547 +hyperframe==6.1.0 \ + --hash=sha256:b03380493a519fce58ea5af42e4a42317bf9bd425596f7a0835ffce80f1a42e5 +hypothesis==6.130.4 \ + --hash=sha256:cda4a57115d10ecbefe0a9cc8d69d20a13eb56ecbfe7c24eaee5d368c2b7c477 +id==1.5.0 \ + --hash=sha256:f1434e1cef91f2cbb8a4ec64663d5a23b9ed43ef44c4c957d02583d61714c658 +idna==3.10 \ + --hash=sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3 +imageio==2.37.0 \ + --hash=sha256:11efa15b87bc7871b61590326b2d635439acc321cf7f8ce996f812543ce10eed +imagesize==1.4.1 \ + --hash=sha256:0d8d18d08f840c19d0ee7ca1fd82490fdc3729b7ac93f49870406ddde8ef8d8b +imbalanced-learn==0.13.0 \ + --hash=sha256:7eb5859f7827cb3babfa5789978c22fe36e56527d9c9768df2d864d98d9b40fe +importlib-metadata==8.6.1 \ + --hash=sha256:02a89390c1e15fdfdc0d7c6b25cb3e62650d0494005c97d6f148bf5b9787525e +inflection==0.5.1 \ + --hash=sha256:f38b2b640938a4f35ade69ac3d053042959b62a0f1076a5bbaa1b9526605a8a2 +iniconfig==2.1.0 \ + --hash=sha256:9deba5723312380e77435581c6bf4935c94cbfab9b1ed33ef8d238ea168eb760 +intervaltree==3.1.0 \ + --hash=sha256:902b1b88936918f9b2a19e0e5eb7ccb430ae45cde4f39ea4b36932920d33952d +ipycanvas==0.13.3 \ + --hash=sha256:d37adb2f45d2fef1c3d33c69a0518055694d87827b2f577f3c426d7712f75daa +ipykernel==6.29.5 \ + --hash=sha256:afdb66ba5aa354b09b91379bac28ae4afebbb30e8b39510c9690afb7a10421b5 +ipyleaflet==0.19.2 \ + --hash=sha256:7cc9157848baca2e1793b96e79f8bdb1aa7340521d2b7d8a62aa8bc30eab5278 +ipympl==0.9.7 \ + --hash=sha256:3698ee7eaa0b047a7603517d7aa1b71b32118a5f51754cab45ec5d994f67208f +ipython==8.36.0 \ + --hash=sha256:12b913914d010dcffa2711505ec8be4bf0180742d97f1e5175e51f22086428c1 +ipython-genutils==0.2.0 \ + --hash=sha256:72dd37233799e619666c9f639a9da83c34013a73e8bbc79a7a6348d93c61fab8 +ipython-sql==0.5.0 \ + --hash=sha256:61b46ecffb956f62dbc17b5744cf70c649104c8db9afd821aa39b31f7cbb5d5b +ipywidgets==8.1.6 \ + --hash=sha256:446e7630a1d025bdc7635e1169fcc06f2ce33b5bd41c2003edeb4a47c8d4bbb1 +isoduration==20.11.0 \ + --hash=sha256:b2904c2a4228c3d44f409c8ae8e2370eb21a26f7ac2ec5446df141dde3452042 +isort==5.13.2 \ + --hash=sha256:8ca5e72a8d85860d5a3fa69b8745237f2939afe12dbf656afbcb47fe72d947a6 +itsdangerous==2.2.0 \ + --hash=sha256:c6242fc49e35958c8b15141343aa660db5fc54d4f13a1db01a3f5891b98700ef +janus==2.0.0 \ + --hash=sha256:7e6449d34eab04cd016befbd7d8c0d8acaaaab67cb59e076a69149f9031745f9 +jaraco-classes==3.4.0 \ + --hash=sha256:f662826b6bed8cace05e7ff873ce0f9283b5c924470fe664fff1c2f00f581790 +jaraco-context==6.0.1 \ + --hash=sha256:f797fc481b490edb305122c9181830a3a5b76d84ef6d1aef2fb9b47ab956f9e4 +jaraco-functools==4.1.0 \ + --hash=sha256:ad159f13428bc4acbf5541ad6dec511f91573b90fba04df61dafa2a1231cf649 +jedi==0.19.2 \ + --hash=sha256:a8ef22bde8490f57fe5c7681a3c83cb58874daf72b4784de3cce5b6ef6edb5b9 +jellyfish==1.1.3 \ + --hash=sha256:c8c70b1cc92ee15031db16db0d2ca7d5841744f5f626a35c29c3dd7b4ea7002b +jinja2==3.1.6 \ + --hash=sha256:85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67 +jiter==0.9.0 \ + --hash=sha256:099500d07b43f61d8bd780466d429c45a7b25411b334c60ca875fa775f68ccb0 +joblib==1.4.2 \ + --hash=sha256:06d478d5674cbc267e7496a410ee875abd68e4340feff4490bcb7afb88060ae6 +json5==0.10.0 \ + --hash=sha256:19b23410220a7271e8377f81ba8aacba2fdd56947fbb137ee5977cbe1f5e8dfa +jsonpatch==1.33 \ + --hash=sha256:0ae28c0cd062bbd8b8ecc26d7d164fbbea9652a1a3693f3b956c1eae5145dade +jsonpointer==3.0.0 \ + --hash=sha256:13e088adc14fca8b6aa8177c044e12701e6ad4b28ff10e65f2267a90109c9942 +jsonschema==4.23.0 \ + --hash=sha256:fbadb6f8b144a8f8cf9f0b89ba94501d143e50411a1278633f56a7acf7fd5566 +jsonschema-specifications==2024.10.1 \ + --hash=sha256:a09a0680616357d9a0ecf05c12ad234479f549239d0f5b55f3deea67475da9bf +julia==0.6.2 \ + --hash=sha256:90752f71376fdb9919439d20496c2dab24486dfa4fe8a831d6dd14a1bcbc04d1 +jupyter==1.1.1 \ + --hash=sha256:7a59533c22af65439b24bbe60373a4e95af8f16ac65a6c00820ad378e3f7cc83 +jupyter-bokeh==4.0.5 \ + --hash=sha256:1110076c14c779071cf492646a1a871aefa8a477261e4721327a666e65df1a2c +jupyter-client==8.6.3 \ + --hash=sha256:e8a19cc986cc45905ac3362915f410f3af85424b4c0905e94fa5f2cb08e8f23f +jupyter-console==6.6.3 \ + --hash=sha256:309d33409fcc92ffdad25f0bcdf9a4a9daa61b6f341177570fdac03de5352485 +jupyter-core==5.7.2 \ + --hash=sha256:4f7315d2f6b4bcf2e3e7cb6e46772eba760ae459cd1f59d29eb57b0a01bd7409 +jupyter-events==0.12.0 \ + --hash=sha256:6464b2fa5ad10451c3d35fabc75eab39556ae1e2853ad0c0cc31b656731a97fb +jupyter-leaflet==0.19.2 \ + --hash=sha256:0d57e15e80c08a4360f0cde0b4c490beddc5d422bb0e9bc1c0b4479d3fb725a6 +jupyter-lsp==2.2.5 \ + --hash=sha256:45fbddbd505f3fbfb0b6cb2f1bc5e15e83ab7c79cd6e89416b248cb3c00c11da +jupyter-server==2.15.0 \ + --hash=sha256:872d989becf83517012ee669f09604aa4a28097c0bd90b2f424310156c2cdae3 +jupyter-server-terminals==0.5.3 \ + --hash=sha256:41ee0d7dc0ebf2809c668e0fc726dfaf258fcd3e769568996ca731b6194ae9aa +jupyterlab==4.4.2 \ + --hash=sha256:857111a50bed68542bf55dca784522fe728f9f88b4fe69e8c585db5c50900419 +jupyterlab-pygments==0.3.0 \ + --hash=sha256:841a89020971da1d8693f1a99997aefc5dc424bb1b251fd6322462a1b8842780 +jupyterlab-server==2.27.3 \ + --hash=sha256:e697488f66c3db49df675158a77b3b017520d772c6e1548c7d9bcc5df7944ee4 +jupyterlab-widgets==3.0.14 \ + --hash=sha256:54c33e3306b7fca139d165d6190dc6c0627aafa5d14adfc974a4e9a3d26cb703 +keras==3.10.0 \ + --hash=sha256:c095a6bf90cd50defadf73d4859ff794fad76b775357ef7bd1dbf96388dae7d3 +keyring==25.6.0 \ + --hash=sha256:552a3f7af126ece7ed5c89753650eec89c7eaae8617d0aa4d9ad2b75111266bd +kiwisolver==1.4.8 \ + --hash=sha256:01c3d31902c7db5fb6182832713d3b4122ad9317c2c5877d0539227d96bb2e50 +langchain==0.3.25 \ + --hash=sha256:931f7d2d1eaf182f9f41c5e3272859cfe7f94fc1f7cef6b3e5a46024b4884c21 +langchain-core==0.3.59 \ + --hash=sha256:9686baaff43f2c8175535da13faf40e6866769015e93130c3c1e4243e7244d70 +langchain-text-splitters==0.3.8 \ + --hash=sha256:e75cc0f4ae58dcf07d9f18776400cf8ade27fadd4ff6d264df6278bb302f6f02 +langsmith==0.3.42 \ + --hash=sha256:18114327f3364385dae4026ebfd57d1c1cb46d8f80931098f0f10abe533475ff +lazy-loader==0.4 \ + --hash=sha256:342aa8e14d543a154047afb4ba8ef17f5563baad3fc610d7b15b213b0f119efc +linkify-it-py==2.0.3 \ + --hash=sha256:6bcbc417b0ac14323382aef5c5192c0075bf8a9d6b41820a2b66371eac6b6d79 +llvmlite==0.44.0 \ + --hash=sha256:eae7e2d4ca8f88f89d315b48c6b741dcb925d6a1042da694aa16ab3dd4cbd3a1 +lmfit==1.3.3 \ + --hash=sha256:a9e9ec7d0d0ec962cc6c078ad1ec6c8311d3ac0e5f0947a00a91f5509dacc2b2 +locket==1.0.0 \ + --hash=sha256:b6c819a722f7b6bd955b80781788e4a66a55628b858d347536b7e81325a3a5e3 +logfire-api==3.12.0 \ + --hash=sha256:fc092c2dcb24c8462ba776f3b0c2183f82e1cd55f86e29b38cf21a048e66a17d +lxml==5.3.0 \ + --hash=sha256:c1a69e58a6bb2de65902051d57fde951febad631a20a64572677a1052690482f +mako==1.3.9 \ + --hash=sha256:95920acccb578427a9aa38e37a186b1e43156c87260d7ba18ca63aa4c7cbd3a1 +markdown==3.7 \ + --hash=sha256:7eb6df5690b81a1d7942992c97fad2938e956e79df20cbc6186e9c3a77b1c803 +markdown-it-py==3.0.0 \ + --hash=sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1 +markupsafe==3.0.2 \ + --hash=sha256:8e06879fc22a25ca47312fbe7c8264eb0b662f6db27cb2d3bbbc74b1df4b9b87 +matplotlib==3.10.3 \ + --hash=sha256:cf37d8c6ef1a48829443e8ba5227b44236d7fcaf7647caa3178a4ff9f7a5be05 +matplotlib-inline==0.1.7 \ + --hash=sha256:df192d39a4ff8f21b1895d72e6a13f5fcc5099f00fa84384e0ea28c2cc0653ca +maturin==1.8.3 \ + --hash=sha256:85f2b882d8235c1c1cb0a38d382ccd5b3ba0674d99cb548d49df9342cc688e36 +mccabe==0.7.0 \ + --hash=sha256:6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e +mcp==1.9.3 \ + --hash=sha256:69b0136d1ac9927402ed4cf221d4b8ff875e7132b0b06edd446448766f34f9b9 +mdit-py-plugins==0.4.2 \ + --hash=sha256:0c673c3f889399a33b95e88d2f0d111b4447bdfea7f237dab2d488f459835636 +mdurl==0.1.2 \ + --hash=sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8 +mercantile==1.2.1 \ + --hash=sha256:30f457a73ee88261aab787b7069d85961a5703bb09dc57a170190bc042cd023f +mergedeep==1.3.4 \ + --hash=sha256:70775750742b25c0d8f36c55aed03d24c3384d17c951b3175d898bd778ef0307 +missingno==0.5.2 \ + --hash=sha256:55782621ce09ba0f0a1d08e5bd6d6fe1946469fb03951fadf7d209911ca5b072 +mistralai==1.8.1 \ + --hash=sha256:badfc7e6832d894b3e9071d92ad621212b7cccd7df622c6cacdb525162ae338f +mistune==3.1.3 \ + --hash=sha256:1a32314113cff28aa6432e99e522677c8587fd83e3d51c29b82a52409c842bd9 +mizani==0.11.4 \ + --hash=sha256:5b6271dc3da2c88694dca2e0e0a7e1879f0e2fb046c789776f54d090a5243735 +ml-dtypes==0.5.1 \ + --hash=sha256:9626d0bca1fb387d5791ca36bacbba298c5ef554747b7ebeafefb4564fc83566 +mlxtend==0.23.3 \ + --hash=sha256:f9fec721c4121be87dac00e513456dde5bf56b7427750719c0a291cd58b6538e +more-itertools==10.6.0 \ + --hash=sha256:6eb054cb4b6db1473f6e15fcc676a08e4732548acd47c708f0e179c2c7c01e89 +mpld3==0.5.10 \ + --hash=sha256:80877acce87ea447380fad7374668737505c8c0684aab05238e7c5dc1fab38c1 +mpmath==1.3.0 \ + --hash=sha256:a0b2b9fe80bbcd81a6647ff13108738cfb482d481d826cc0e02f5b35e5c88d2c +msal==1.30.0 \ + --hash=sha256:423872177410cb61683566dc3932db7a76f661a5d2f6f52f02a047f101e1c1de +msal-extensions==1.2.0 \ + --hash=sha256:cf5ba83a2113fa6dc011a254a72f1c223c88d7dfad74cc30617c4679a417704d +msgpack==1.1.0 \ + --hash=sha256:115a7af8ee9e8cddc10f87636767857e7e3717b7a2e97379dc2054712693e90f +multidict==6.4.3 \ + --hash=sha256:11990b5c757d956cd1db7cb140be50a63216af32cd6506329c2c59d732d802db +multipledispatch==1.0.0 \ + --hash=sha256:0c53cd8b077546da4e48869f49b13164bebafd0c2a5afceb6bb6a316e7fb46e4 +mypy==1.15.0 \ + --hash=sha256:171a9ca9a40cd1843abeca0e405bc1940cd9b305eaeea2dda769ba096932bb22 +mypy-extensions==1.0.0 \ + --hash=sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d +mysql-connector-python==9.2.0 \ + --hash=sha256:b7d149bcc455cf606a4aa604d45267fba16c8abf36056b804f8d16e8f5e753c1 +namex==0.0.8 \ + --hash=sha256:7ddb6c2bb0e753a311b7590f84f6da659dd0c05e65cb89d519d54c0a250c0487 +narwhals==1.36.0 \ + --hash=sha256:e3c50dd1d769bc145f57ae17c1f0f0da6c3d397d62cdd0bb167e9b618e95c9d6 +nbclient==0.10.2 \ + --hash=sha256:4ffee11e788b4a27fabeb7955547e4318a5298f34342a4bfd01f2e1faaeadc3d +nbconvert==7.16.6 \ + --hash=sha256:1375a7b67e0c2883678c48e506dc320febb57685e5ee67faa51b18a90f3a712b +nbformat==5.10.4 \ + --hash=sha256:3b48d6c8fbca4b299bf3982ea7db1af21580e4fec269ad087b9e81588891200b +nest-asyncio==1.6.0 \ + --hash=sha256:87af6efd6b5e897c81050477ef65c62e2b2f35d51703cae01aff2905b1852e1c +networkx==3.4.2 \ + --hash=sha256:df5d4365b724cf81b8c6a7312509d0c22386097011ad1abe274afd5e9d3bbc5f +nh3==0.2.18 \ + --hash=sha256:8ce0f819d2f1933953fca255db2471ad58184a60508f03e6285e5114b6254844 +nltk==3.9.1 \ + --hash=sha256:4fa26829c5b00715afe3061398a8989dc643b92ce7dd93fb4585a70930d168a1 +notebook==7.4.2 \ + --hash=sha256:9ccef602721aaa5530852e3064710b8ae5415c4e2ce26f8896d0433222755259 +notebook-shim==0.2.4 \ + --hash=sha256:411a5be4e9dc882a074ccbcae671eda64cceb068767e9a3419096986560e1cef +numba==0.61.2 \ + --hash=sha256:97cf4f12c728cf77c9c1d7c23707e4d8fb4632b46275f8f3397de33e5877af18 +numpy==2.2.6 \ + --hash=sha256:c1f9540be57940698ed329904db803cf7a402f3fc200bfe599334c9bd84a40b2 +numpydoc==1.8.0 \ + --hash=sha256:72024c7fd5e17375dec3608a27c03303e8ad00c81292667955c6fea7a3ccf541 +openai==1.82.0 \ + --hash=sha256:8c40647fea1816516cb3de5189775b30b5f4812777e40b8768f361f232b61b30 +opencv-python==4.11.0.86 \ + --hash=sha256:085ad9b77c18853ea66283e98affefe2de8cc4c1f43eda4c100cf9b2721142ec +openpyxl==3.1.5 \ + --hash=sha256:5282c12b107bffeef825f4617dc029afaf41d0ea60823bbb665ef3079dc79de2 +opentelemetry-api==1.32.1 \ + --hash=sha256:bbd19f14ab9f15f0e85e43e6a958aa4cb1f36870ee62b7fd205783a112012724 +optree==0.14.1 \ + --hash=sha256:98f858daa588ccb70bb554087e87d4192852a11416e5b14f3ee70ae1861b92b0 +optuna==4.2.1 \ + --hash=sha256:6d38199013441d3f70fac27136e05c0188c5f4ec3848db708ac311cbdeb30dbf +orjson==3.10.16 \ + --hash=sha256:86d127efdd3f9bf5f04809b70faca1e6836556ea3cc46e662b44dab3fe71f3d6 +osqp==0.6.7.post3 \ + --hash=sha256:468588cfb690becba4d1f460c2a53e75530584e3efcf2caed59f5219032e6888 +outcome==1.3.0.post0 \ + --hash=sha256:e771c5ce06d1415e356078d3bdd68523f284b4ce5419828922b6871e65eda82b +overrides==7.7.0 \ + --hash=sha256:c7ed9d062f78b8e4c1a7b70bd8796b35ead4d9f510227ef9c5dc7626c60d7e49 +packaging==24.2 \ + --hash=sha256:09abb1bccd265c01f4a3aa3f7a7db064b36514d2cba19a2f694fe6150451a759 +pandas==2.2.3 \ + --hash=sha256:59ef3764d0fe818125a5097d2ae867ca3fa64df032331b7e0917cf5d7bf66b13 +pandocfilters==1.5.1 \ + --hash=sha256:93be382804a9cdb0a7267585f157e5d1731bbe5545a85b268d6f5fe6232de2bc +panel==1.6.3 \ + --hash=sha256:ccd2a0587ab382bd55b8ea099706f31b64aadac697b8a41923d3b18b9ed618d6 +papermill==2.6.0 \ + --hash=sha256:0f09da6ef709f3f14dde77cb1af052d05b14019189869affff374c9e612f2dd5 +param==2.2.0 \ + --hash=sha256:777f8c7b66ab820b70ea5ad09faaa6818308220caae89da3b5c5f359faa72a5e +parso==0.8.4 \ + --hash=sha256:a418670a20291dacd2dddc80c377c5c3791378ee1e8d12bffc35420643d43f18 +partd==1.4.2 \ + --hash=sha256:978e4ac767ec4ba5b86c6eaa52e5a2a3bc748a2ca839e8cc798f1cc6ce6efb0f +pathspec==0.12.1 \ + --hash=sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08 +patsy==1.0.1 \ + --hash=sha256:751fb38f9e97e62312e921a1954b81e1bb2bcda4f5eeabaf94db251ee791509c +pep8==1.7.1 \ + --hash=sha256:b22cfae5db09833bb9bd7c8463b53e1a9c9b39f12e304a8d0bba729c501827ee +pexpect==4.9.0 \ + --hash=sha256:7236d1e080e4936be2dc3e326cec0af72acf9212a7e1d060210e70a47e253523 +pg8000==1.31.2 \ + --hash=sha256:436c771ede71af4d4c22ba867a30add0bc5c942d7ab27fadbb6934a487ecc8f6 +pickleshare==0.7.5 \ + --hash=sha256:9649af414d74d4df115d5d718f82acb59c9d418196b7b4290ed47a12ce62df56 +pillow==11.1.0 \ + --hash=sha256:a697cd8ba0383bba3d2d3ada02b34ed268cb548b369943cd349007730c92bddf +platformdirs==4.3.7 \ + --hash=sha256:a03875334331946f13c549dbd8f4bac7a13a50a895a0eb1e8c6a8ace80d40a94 +plotly==6.0.1 \ + --hash=sha256:4714db20fea57a435692c548a4eb4fae454f7daddf15f8d8ba7e1045681d7768 +plotnine==0.13.6 \ + --hash=sha256:4acc1af29fa4e91e726b67d49277e8368f62e1c817f01bf14ecd8ca5e83bfaea +plotpy==2.7.4 \ + --hash=sha256:716fee6b2c2a2156fd267e3941bcef28b3b169e6f95d2ab7f1417ef8c76f8a14 +pluggy==1.5.0 \ + --hash=sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669 +ply==3.11 \ + --hash=sha256:096f9b8350b65ebd2fd1346b12452efe5b9607f7482813ffca50c22722a807ce +polars==1.31.0 \ + --hash=sha256:3fd874d3432fc932863e8cceff2cff8a12a51976b053f2eb6326a0672134a632 +portalocker==2.7.0 \ + --hash=sha256:a07c5b4f3985c3cf4798369631fb7011adb498e2a46d8440efc75a8f29a0f983 +prettytable==3.16.0 \ + --hash=sha256:b5eccfabb82222f5aa46b798ff02a8452cf530a352c31bddfa29be41242863aa +prince==0.16.0 \ + --hash=sha256:7e21a78d4dd06ca3ec526ee714a50b349f26de3fca6b79664150a951b31688f3 +priority==2.0.0 \ + --hash=sha256:6f8eefce5f3ad59baf2c080a664037bb4725cd0a790d53d59ab4059288faf6aa +prometheus-client==0.21.1 \ + --hash=sha256:594b45c410d6f4f8888940fe80b5cc2521b305a1fafe1c58609ef715a001f301 +prompt-toolkit==3.0.51 \ + --hash=sha256:52742911fde84e2d423e2f9a4cf1de7d7ac4e51958f648d9540e0fb8db077b07 +propcache==0.3.1 \ + --hash=sha256:88c423efef9d7a59dae0614eaed718449c09a5ac79a5f224a8b9664d603f04a3 +protobuf==6.30.2 \ + --hash=sha256:7653c99774f73fe6b9301b87da52af0e69783a2e371e8b599b3e9cb4da4b12b9 +psutil==7.0.0 \ + --hash=sha256:4cf3d4eb1aa9b348dec30105c55cd9b7d4629285735a102beb4441e38db90553 +psygnal==0.12.0 \ + --hash=sha256:25a9f2db710a6cd2566b3e0e03cf6e04d56276f36ac86b42fa22d81f9a4ac0f2 +ptpython==3.0.29 \ + --hash=sha256:65d75c4871859e4305a020c9b9e204366dceb4d08e0e2bd7b7511bd5e917a402 +ptyprocess==0.7.0 \ + --hash=sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35 +pure-eval==0.2.3 \ + --hash=sha256:1db8e35b67b3d218d818ae653e27f06c3aa420901fa7b081ca98cbedc874e0d0 +pyarrow==20.0.0 \ + --hash=sha256:96d6a0a37d9c98be08f5ed6a10831d88d52cac7b13f5287f1e0f625a0de8062b +pyasn1==0.6.1 \ + --hash=sha256:0d632f46f2ba09143da3a8afe9e33fb6f92fa2320ab7e886e2d0f7672af84629 +pyasn1-modules==0.4.1 \ + --hash=sha256:49bfa96b45a292b711e986f222502c1c9a5e1f4e568fc30e2574a6c7d07838fd +pybind11==2.13.6 \ + --hash=sha256:237c41e29157b962835d356b370ededd57594a26d5894a795960f0047cb5caf5 +pycodestyle==2.12.0 \ + --hash=sha256:949a39f6b86c3e1515ba1787c2022131d165a8ad271b11370a8819aa070269e4 +pycparser==2.22 \ + --hash=sha256:c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc +pyct==0.5.0 \ + --hash=sha256:a4038a8885059ab8cac6f946ea30e0b5e6bdbe0b92b6723f06737035f9d65e8c +pydantic==2.10.6 \ + --hash=sha256:427d664bf0b8a2b34ff5dd0f5a18df00591adcee7198fbd71981054cef37b584 +pydantic-ai-slim==0.2.9 \ + --hash=sha256:d954ff84cb250d7150a7ed694e4f1f92f820205d036ee006d02fce3e62a3bc4e +pydantic-core==2.27.2 \ + --hash=sha256:cc3f1a99a4f4f9dd1de4fe0312c114e740b5ddead65bb4102884b384c15d8bc9 +pydantic-evals==0.2.9 \ + --hash=sha256:62035ae3a5321e4d892c7372ef91af0f46b675863e827f011d5cb8550dede400 +pydantic-graph==0.2.9 \ + --hash=sha256:38ad929a0ec205bd7d5875b0b408d4f13448276aa89b6ce2a1143a7552b070ce +pydantic-settings==2.8.1 \ + --hash=sha256:81942d5ac3d905f7f3ee1a70df5dfb62d5569c12f51a5a647defc1c3d9ee2e9c +pydeck==0.9.1 \ + --hash=sha256:b3f75ba0d273fc917094fa61224f3f6076ca8752b93d46faf3bcfd9f9d59b038 +pydocstyle==6.3.0 \ + --hash=sha256:118762d452a49d6b05e194ef344a55822987a462831ade91ec5c06fd2169d019 +pydub==0.25.1 \ + --hash=sha256:65617e33033874b59d87db603aa1ed450633288aefead953b30bded59cb599a6 +pyerfa==2.0.1.5 \ + --hash=sha256:66292d437dcf75925b694977aa06eb697126e7b86553e620371ed3e48b5e0ad0 +pyflakes==3.2.0 \ + --hash=sha256:84b5be138a2dfbb40689ca07e2152deb896a65c3a3e24c251c5c62489568074a +pygithub==2.6.1 \ + --hash=sha256:6f2fa6d076ccae475f9fc392cc6cdbd54db985d4f69b8833a28397de75ed6ca3 +pygments==2.19.1 \ + --hash=sha256:9ea1544ad55cecf4b8242fab6dd35a93bbce657034b0611ee383099054ab6d8c +pyjwt==2.10.1 \ + --hash=sha256:dcdd193e30abefd5debf142f9adfcdd2b58004e644f25406ffaebd50bd98dacb +pylint==3.3.6 \ + --hash=sha256:8b7c2d3e86ae3f94fb27703d521dd0b9b6b378775991f504d7c3a6275aa0a6a6 +pylint-venv==3.0.4 \ + --hash=sha256:31006a3df398f58f962c9e5620e756b284e8b2bc490594ce5ee5da41920cb32c +pyls-spyder==0.4.0 \ + --hash=sha256:1505d975f866a343d0554b6dab41b53717f4b4bc6df450dfd7d48f889fe450b9 +pymongo==4.10.1 \ + --hash=sha256:dcc07b1277e8b4bf4d7382ca133850e323b7ab048b8353af496d050671c7ac52 +pympler==1.1 \ + --hash=sha256:5b223d6027d0619584116a0cbc28e8d2e378f7a79c1e5e024f9ff3b673c58506 +pynacl==1.5.0 \ + --hash=sha256:20f42270d27e1b6a29f54032090b972d97f0a1b0948cc52392041ef7831fee93 +pynndescent==0.5.13 \ + --hash=sha256:69aabb8f394bc631b6ac475a1c7f3994c54adf3f51cd63b2730fefba5771b949 +pyodbc==5.2.0 \ + --hash=sha256:b1f5686b142759c5b2bdbeaa0692622c2ebb1f10780eb3c174b85f5607fbcf55 +pyogrio==0.10.0 \ + --hash=sha256:2a3e09839590d71ff832aa95c4f23fa00a2c63c3de82c1fbd4fb8d265792acfc +pyomo==6.9.2 \ + --hash=sha256:13ebb2f974f97afa626c2712d4f27e09a1c3d18ca11755676b743504a76e5161 +pypandoc==1.15 \ + --hash=sha256:4ededcc76c8770f27aaca6dff47724578428eca84212a31479403a9731fc2b16 +pyparsing==3.2.3 \ + --hash=sha256:a749938e02d6fd0b59b356ca504a24982314bb090c383e3cf201c95ef7e2bfcf +pypdf==5.4.0 \ + --hash=sha256:db994ab47cadc81057ea1591b90e5b543e2b7ef2d0e31ef41a9bfe763c119dab +pyproj==3.7.0 \ + --hash=sha256:0692f806224e8ed82fe4acfa57268ff444fdaf9f330689f24c0d96e59480cce1 +pyproject-hooks==1.2.0 \ + --hash=sha256:9e5c6bfa8dcc30091c74b0cf803c81fdd29d94f01992a7707bc97babb1141913 +pyqt5==5.15.11 \ + --hash=sha256:bdde598a3bb95022131a5c9ea62e0a96bd6fb28932cc1619fd7ba211531b7517 +pyqt5-qt5==5.15.2 \ + --hash=sha256:750b78e4dba6bdf1607febedc08738e318ea09e9b10aea9ff0d73073f11f6962 +pyqt5-sip==12.17.0 \ + --hash=sha256:54c31de7706d8a9a8c0fc3ea2c70468aba54b027d4974803f8eace9c22aad41c +pyqtgraph==0.13.7 \ + --hash=sha256:7754edbefb6c367fa0dfb176e2d0610da3ada20aa7a5318516c74af5fb72bf7a +pyqtwebengine==5.15.7 \ + --hash=sha256:bd5e8c426d6f6b352cd15800d64a89b2a4a11e098460b818c7bdcf5e5612e44f +pyqtwebengine-qt5==5.15.2 \ + --hash=sha256:24231f19e1595018779977de6722b5c69f3d03f34a5f7574ff21cd1e764ef76d +pyserial==3.5 \ + --hash=sha256:c4451db6ba391ca6ca299fb3ec7bae67a5c55dde170964c7a14ceefec02f2cf0 +pysocks==1.7.1 \ + --hash=sha256:2725bd0a9925919b9b51739eea5f9e2bae91e83288108a9ad338b2e3a4435ee5 +pyspnego==0.11.2 \ + --hash=sha256:74abc1fb51e59360eb5c5c9086e5962174f1072c7a50cf6da0bda9a4bcfdfbd4 +pytest==8.3.5 \ + --hash=sha256:c69214aa47deac29fad6c2a4f590b9c4a9fdb16a403176fe154b79c0b4d4d820 +python-barcode==0.15.1 \ + --hash=sha256:057636fba37369c22852410c8535b36adfbeb965ddfd4e5b6924455d692e0886 +python-dateutil==2.8.2 \ + --hash=sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9 +python-dotenv==1.1.0 \ + --hash=sha256:d7c01d9e2293916c18baf562d95698754b0dbbb5e74d457c45d4f6561fb9d55d +python-json-logger==3.3.0 \ + --hash=sha256:dd980fae8cffb24c13caf6e158d3d61c0d6d22342f932cb6e9deedab3d35eec7 +python-lsp-black==2.0.0 \ + --hash=sha256:d5efdee45f5fa9e5241f5d4d396cd46127f45c85817916b1fd92c2986652bf7e +python-lsp-jsonrpc==1.1.2 \ + --hash=sha256:7339c2e9630ae98903fdaea1ace8c47fba0484983794d6aafd0bd8989be2b03c +python-lsp-server==1.12.2 \ + --hash=sha256:750116459449184ba20811167cdf96f91296ae12f1f65ebd975c5c159388111b +python-multipart==0.0.20 \ + --hash=sha256:8a62d3a8335e06589fe01f2a3e178cdcc632f3fbe0d492ad9ee0ec35aab1f104 +python-slugify==8.0.4 \ + --hash=sha256:276540b79961052b66b7d116620b36518847f52d5fd9e3a70164fc8c50faa6b8 +pythonqwt==0.14.5 \ + --hash=sha256:be5a9d2e1ba22aaa02eb397c5b3b5e4e1d9ed2c08f45554d8b920d8fc3be6dc7 +pytoolconfig==1.3.1 \ + --hash=sha256:5d8cea8ae1996938ec3eaf44567bbc5ef1bc900742190c439a44a704d6e1b62b +pytz==2025.2 \ + --hash=sha256:5ddf76296dd8c44c26eb8f4b6f35488f3ccbf6fbbd7adee0b7262d43f0ec2f00 +pyuca==1.2 \ + --hash=sha256:abaa12e1bd2c7c68ca8396ff8383bc0654a739cef3ae68fd7af58bf29af0a91e +pyusb==1.3.1 \ + --hash=sha256:bf9b754557af4717fe80c2b07cc2b923a9151f5c08d17bdb5345dac09d6a0430 +pyviz-comms==3.0.4 \ + --hash=sha256:a40d17db26ec13cf975809633804e712bd24b473e77388c193c44043f85d0b25 +pywavelets==1.8.0 \ + --hash=sha256:810a23a631da596fef7196ddec49b345b1aab13525bb58547eeebe1769edbbc1 +pywin32==310 \ + --hash=sha256:bf5c397c9a9a19a6f62f3fb821fbf36cac08f03770056711f765ec1503972060 +pywin32-ctypes==0.2.3 \ + --hash=sha256:8a1513379d709975552d202d942d9837758905c8d01eb82b8bcc30918929e7b8 +pywinpty==2.0.15 \ + --hash=sha256:83a8f20b430bbc5d8957249f875341a60219a4e971580f2ba694fbfb54a45ebc +pyyaml==6.0.2 \ + --hash=sha256:7e7401d0de89a9a855c839bc697c079a4af81cf878373abd7dc625847d25cbd8 +pyzmq==26.4.0 \ + --hash=sha256:056a97aab4064f526ecb32f4343917a4022a5d9efb6b9df990ff72e1879e40be +qdarkstyle==3.2.3 \ + --hash=sha256:ea980ee426d594909cf1058306832af71ff6cbad6f69237b036d1550635aefbc +qdldl==0.1.7.post5 \ + --hash=sha256:13dfc0b225a5c180512488fa51f1771e8fa3c06d7fce9fd3c1d018bc03ba0eec +qrcode==8.0 \ + --hash=sha256:9fc05f03305ad27a709eb742cf3097fa19e6f6f93bb9e2f039c0979190f6f1b1 +qstylizer==0.2.4 \ + --hash=sha256:8f384dfe86f9edb0bb596b93663a51f124f0794b94fd54057cc7cf9cea59fb6f +qtawesome==1.4.0 \ + --hash=sha256:a4d689fa071c595aa6184171ce1f0f847677cb8d2db45382c43129f1d72a3d93 +qtconsole==5.6.1 \ + --hash=sha256:3d22490d9589bace566ad4f3455b61fa2209156f40e87e19e2c3cb64e9264950 +qtpy==2.4.3 \ + --hash=sha256:72095afe13673e017946cc258b8d5da43314197b741ed2890e563cf384b51aa1 +quantecon==0.7.2 \ + --hash=sha256:d1333ca7bc3046efe3655d9eeeefb299051b00870b8608cb5bc0b88e3bdb8b67 +quart==0.20.0 \ + --hash=sha256:003c08f551746710acb757de49d9b768986fd431517d0eb127380b656b98b8f1 +rapidfuzz==3.13.0 \ + --hash=sha256:6e2065f68fb1d0bf65adc289c1bdc45ba7e464e406b319d67bb54441a1b9da9e +readme-renderer==44.0 \ + --hash=sha256:2fbca89b81a08526aadf1357a8c2ae889ec05fb03f5da67f9769c9a592166151 +redis==5.2.1 \ + --hash=sha256:ee7e1056b9aea0f04c6c2ed59452947f34c4940ee025f5dd83e6a6418b6989e4 +referencing==0.36.2 \ + --hash=sha256:e8699adbbf8b5c7de96d8ffa0eb5c158b3beafce084968e2ea8bb08c6794dcd0 +regex==2024.11.6 \ + --hash=sha256:a93c194e2df18f7d264092dc8539b8ffb86b45b899ab976aa15d48214138e81b +reportlab==4.3.1 \ + --hash=sha256:0f37dd16652db3ef84363cf744632a28c38bd480d5bf94683466852d7bb678dd +requests==2.32.3 \ + --hash=sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6 +requests-ntlm==1.3.0 \ + --hash=sha256:4c7534a7d0e482bb0928531d621be4b2c74ace437e88c5a357ceb7452d25a510 +requests-toolbelt==1.0.0 \ + --hash=sha256:cccfdd665f0a24fcf4726e690f65639d272bb0637b9b92dfd91a5568ccf6bd06 +rfc3339-validator==0.1.4 \ + --hash=sha256:24f6ec1eda14ef823da9e36ec7113124b39c04d50a4d3d3a3c2859577e7791fa +rfc3986==2.0.0 \ + --hash=sha256:50b1502b60e289cb37883f3dfd34532b8873c7de9f49bb546641ce9cbd256ebd +rfc3986-validator==0.1.1 \ + --hash=sha256:2f235c432ef459970b4306369336b9d5dbdda31b510ca1e327636e01f528bfa9 +rich==14.0.0 \ + --hash=sha256:1c9491e1951aac09caffd42f448ee3d04e58923ffe14993f6e83068dc395d7e0 +rope==1.13.0 \ + --hash=sha256:b435a0c0971244fdcd8741676a9fae697ae614c20cc36003678a7782f25c0d6c +rpds-py==0.24.0 \ + --hash=sha256:998c01b8e71cf051c28f5d6f1187abbdf5cf45fc0efce5da6c06447cba997034 +rsa==4.7.2 \ + --hash=sha256:78f9a9bf4e7be0c5ded4583326e7461e3a3c5aae24073648b4bdfa797d78c9d2 +rtree==1.4.0 \ + --hash=sha256:ba83efc7b7563905b1bfdfc14490c4bfb59e92e5e6156bdeb6ec5df5117252f4 +rx==3.2.0 \ + --hash=sha256:922c5f4edb3aa1beaa47bf61d65d5380011ff6adcd527f26377d05cb73ed8ec8 +scikit-image==0.25.2 \ + --hash=sha256:bdd2b8c1de0849964dbc54037f36b4e9420157e67e45a8709a80d727f52c7da2 +scikit-learn==1.6.1 \ + --hash=sha256:70b1d7e85b1c96383f872a519b3375f92f14731e279a7b4c6cfd650cf5dffc52 +scipy==1.15.3 \ + --hash=sha256:52092bc0472cfd17df49ff17e70624345efece4e1a12b23783a1ac59a1b728ed +scramp==1.4.5 \ + --hash=sha256:50e37c464fc67f37994e35bee4151e3d8f9320e9c204fca83a5d313c121bbbe7 +scs==3.2.7.post2 \ + --hash=sha256:2995d4099943c3fd754b3e39fe178a9c03dcb9c7d84b40f64ac5eb26d8d6085a +seaborn==0.13.2 \ + --hash=sha256:636f8336facf092165e27924f223d3c62ca560b1f2bb5dff7ab7fad265361987 +send2trash==1.8.3 \ + --hash=sha256:0c31227e0bd08961c7665474a3d1ef7193929fedda4233843689baa056be46c9 +setuptools==79.0.1 \ + --hash=sha256:e147c0549f27767ba362f9da434eab9c5dc0045d5304feb602a0af001089fc51 +shapely==2.1.0 \ + --hash=sha256:f4f47e631aa4f9ec5576eac546eb3f38802e2f82aeb0552f9612cb9a14ece1db +shellingham==1.5.4 \ + --hash=sha256:7ecfff8f2fd72616f7481040475a65b2bf8af90a56c89140852d1120324e8686 +simplejson==3.19.3 \ + --hash=sha256:1e662336db50ad665777e6548b5076329a94a0c3d4a0472971c588b3ef27de3a +simpy==4.1.1 \ + --hash=sha256:7c5ae380240fd2238671160e4830956f8055830a8317edf5c05e495b3823cd88 +six==1.17.0 \ + --hash=sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274 +sklearn-compat==0.1.3 \ + --hash=sha256:a8aaf8ef711988cbd63f187c5560b5f16b25df663aaa1d2d0e1291341d339f80 +skrub==0.5.3 \ + --hash=sha256:b6ba417fa83d1f7e9a69656e0860b061381b9bd19808692a2b5bef8588c72775 +smmap==5.0.2 \ + --hash=sha256:b30115f0def7d7531d22a0fb6502488d879e75b260a9db4d0819cfb25403af5e +sniffio==1.3.1 \ + --hash=sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2 +snowballstemmer==2.2.0 \ + --hash=sha256:c8e1716e83cc398ae16824e5572ae04e0d9fc2c6b985fb0f900f5f0c96ecba1a +sortedcontainers==2.4.0 \ + --hash=sha256:a163dcaede0f1c021485e957a39245190e74249897e2ae4b2aa38595db237ee0 +sounddevice==0.5.1 \ + --hash=sha256:4313b63f2076552b23ac3e0abd3bcfc0c1c6a696fc356759a13bd113c9df90f1 +soupsieve==2.6 \ + --hash=sha256:e72c4ff06e4fb6e4b5a9f0f55fe6e81514581fca1515028625d0f299c602ccc9 +sphinx==8.1.3 \ + --hash=sha256:09719015511837b76bf6e03e42eb7595ac8c2e41eeb9c29c5b755c6b677992a2 +sphinx-rtd-theme==3.0.2 \ + --hash=sha256:422ccc750c3a3a311de4ae327e82affdaf59eb695ba4936538552f3b00f4ee13 +sphinxcontrib-applehelp==2.0.0 \ + --hash=sha256:4cd3f0ec4ac5dd9c17ec65e9ab272c9b867ea77425228e68ecf08d6b28ddbdb5 +sphinxcontrib-devhelp==2.0.0 \ + --hash=sha256:aefb8b83854e4b0998877524d1029fd3e6879210422ee3780459e28a1f03a8a2 +sphinxcontrib-htmlhelp==2.1.0 \ + --hash=sha256:166759820b47002d22914d64a075ce08f4c46818e17cfc9470a9786b759b19f8 +sphinxcontrib-jquery==4.1 \ + --hash=sha256:f936030d7d0147dd026a4f2b5a57343d233f1fc7b363f68b3d4f1cb0993878ae +sphinxcontrib-jsmath==1.0.1 \ + --hash=sha256:2ec2eaebfb78f3f2078e73666b1415417a116cc848b72e5172e596c871103178 +sphinxcontrib-qthelp==2.0.0 \ + --hash=sha256:b18a828cdba941ccd6ee8445dbe72ffa3ef8cbe7505d8cd1fa0d42d3f2d5f3eb +sphinxcontrib-serializinghtml==2.0.0 \ + --hash=sha256:6e2cb0eef194e10c27ec0023bfeb25badbbb5868244cf5bc5bdc04e4464bf331 +spyder==6.0.7 \ + --hash=sha256:b725569bb8ddc7b0aab73d747d85312dc0456978370cc0f9b1a101c0fe4f076b +spyder-kernels==3.0.5 \ + --hash=sha256:9cc808e0ec4426b9ba911128e221fa2234e6c8d6e08526132e90112ff9c2bb7c +sqlalchemy==2.0.40 \ + --hash=sha256:2be94d75ee06548d2fc591a3513422b873490efb124048f50556369a834853b0 +sqlite-bro==0.13.1 \ + --hash=sha256:c26033b0af133049ca578b5fd30b2372f002e7ff934b39774aa4d2da7638c23d +sqlite-fts4==1.0.3 \ + --hash=sha256:0359edd8dea6fd73c848989e1e2b1f31a50fe5f9d7272299ff0e8dbaa62d035f +sqlite-utils==3.38 \ + --hash=sha256:8a27441015c3b2ef475f555861f7a2592f73bc60d247af9803a11b65fc605bf9 +sqlparse==0.5.3 \ + --hash=sha256:cf2196ed3418f3ba5de6af7e82c694a9fbdbfecccdfc72e281548517081f16ca +squarify==0.4.4 \ + --hash=sha256:d7597724e29d48aa14fd2f551060d6b09e1f0a67e4cd3ea329fe03b4c9a56f11 +sse-starlette==2.2.1 \ + --hash=sha256:6410a3d3ba0c89e7675d4c273a301d64649c03a5ef1ca101f10b47f895fd0e99 +sspilib==0.2.0 \ + --hash=sha256:40a97ca83e503a175d1dc9461836994e47e8b9bcf56cab81a2c22e27f1993079 +stack-data==0.6.3 \ + --hash=sha256:d5558e0c25a4cb0853cddad3d77da9891a08cb85dd9f9f91b9f8cd66e511e695 +starlette==0.46.2 \ + --hash=sha256:595633ce89f8ffa71a015caed34a5b2dc1c0cdb3f0f1fbd1e69339cf2abeec35 +statsmodels==0.14.4 \ + --hash=sha256:7f7917a51766b4e074da283c507a25048ad29a18e527207883d73535e0dc6184 +streamlit==1.46.0 \ + --hash=sha256:f8624acabafcf18611a0fac2635cf181a7ba922b45bd131ae15fc8f80e1a5482 +superqt==0.7.3 \ + --hash=sha256:8f7d141665b31baa484747f324fc9fc2d14223f2fefc92ffed6ea35c92221304 +sv-ttk==2.6.0 \ + --hash=sha256:4319c52edf2e14732fe84bdc9788e26f9e9a1ad79451ec0f89f0120ffc8105d9 +sympy==1.14.0 \ + --hash=sha256:e091cc3e99d2141a0ba2847328f5479b05d94a6635cb96148ccb3f34671bd8f5 +tabulate==0.9.0 \ + --hash=sha256:024ca478df22e9340661486f85298cff5f6dcdba14f3813e8830015b9ed1948f +tblib==3.1.0 \ + --hash=sha256:670bb4582578134b3d81a84afa1b016128b429f3d48e6cbbaecc9d15675e984e +tenacity==9.1.2 \ + --hash=sha256:f77bf36710d8b73a50b2dd155c97b870017ad21afe6ab300326b0371b3b05138 +termcolor==3.1.0 \ + --hash=sha256:591dd26b5c2ce03b9e43f391264626557873ce1d379019786f99b0c2bee140aa +terminado==0.18.1 \ + --hash=sha256:a4468e1b37bb318f8a86514f65814e1afc977cf29b3992a4500d9dd305dcceb0 +text-unidecode==1.3 \ + --hash=sha256:1311f10e8b895935241623731c2ba64f4c455287888b18189350b67134a822e8 +textdistance==4.6.3 \ + --hash=sha256:0cb1b2cc8e3339ddc3e0f8c870e49fb49de6ecc42a718917308b3c971f34aa56 +thefuzz==0.22.1 \ + --hash=sha256:59729b33556850b90e1093c4cf9e618af6f2e4c985df193fdf3c5b5cf02ca481 +threadpoolctl==3.6.0 \ + --hash=sha256:43a0b8fd5a2928500110039e43a5eed8480b918967083ea48dc3ab9f13c4a7fb +three-merge==0.1.1 \ + --hash=sha256:dd219f4696aa0bbec6099ac3528b4de0450ff9bde862dd8f6d6f52e745f83464 +tifffile==2025.3.30 \ + --hash=sha256:0ed6eee7b66771db2d1bfc42262a51b01887505d35539daef118f4ff8c0f629c +tiktoken==0.9.0 \ + --hash=sha256:5a62d7a25225bafed786a524c1b9f0910a1128f4232615bf3f8257a73aaa3b16 +tinycss2==1.4.0 \ + --hash=sha256:3a49cf47b7675da0b15d0c6e1df8df4ebd96e9394bb905a5775adb0d884c5289 +tokenizers==0.21.1 \ + --hash=sha256:0f0dcbcc9f6e13e675a66d7a5f2f225a736745ce484c1a4e07476a89ccdad382 +toml==0.10.2 \ + --hash=sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b +tomli==2.2.1 \ + --hash=sha256:7fc04e92e1d624a4a63c76474610238576942d6b8950a2d7f908a340494e67e4 +tomli-w==1.2.0 \ + --hash=sha256:188306098d013b691fcadc011abd66727d3c414c571bb01b1a174ba8c983cf90 +tomlkit==0.13.2 \ + --hash=sha256:7a974427f6e119197f670fbbbeae7bef749a6c14e793db934baefc1b5f03efde +toolz==1.0.0 \ + --hash=sha256:292c8f1c4e7516bf9086f8850935c799a874039c8bcf959d47b600e4c44a6236 +tornado==6.5.1 \ + --hash=sha256:908e7d64567cecd4c2b458075589a775063453aeb1d2a1853eedb806922f568b +tqdm==4.67.1 \ + --hash=sha256:26445eca388f82e72884e0d580d5464cd801a3ea01e63e5601bdff9ba6a48de2 +traitlets==5.14.3 \ + --hash=sha256:b74e89e397b1ed28cc831db7aea759ba6640cb3de13090ca145426688ff1ac4f +traittypes==0.2.1 \ + --hash=sha256:1340af133810b6eee1a2eb2e988f862b0d12b6c2d16f282aaf3207b782134c2e +trio==0.30.0 \ + --hash=sha256:3bf4f06b8decf8d3cf00af85f40a89824669e2d033bb32469d34840edcfc22a5 +trove-classifiers==2025.5.9.12 \ + --hash=sha256:e381c05537adac78881c8fa345fd0e9970159f4e4a04fcc42cfd3129cca640ce +twine==6.1.0 \ + --hash=sha256:a47f973caf122930bf0fbbf17f80b83bc1602c9ce393c7845f289a3001dc5384 +typer==0.15.2 \ + --hash=sha256:46a499c6107d645a9c13f7ee46c5d5096cae6f5fc57dd11eccbbb9ae3e44ddfc +types-python-dateutil==2.9.0.20240316 \ + --hash=sha256:6b8cb66d960771ce5ff974e9dd45e38facb81718cc1e208b10b1baccbfdbee3b +types-requests==2.32.0.20250328 \ + --hash=sha256:72ff80f84b15eb3aa7a8e2625fffb6a93f2ad5a0c20215fc1dcfa61117bcb2a2 +typing-extensions==4.13.2 \ + --hash=sha256:a439e7c04b49fec3e5d3e2beaa21755cadbbdc391694e28ccdd36ca4a1408f8c +typing-inspection==0.4.0 \ + --hash=sha256:50e72559fcd2a6367a19f7a7e610e6afcb9fac940c650290eed893d61386832f +tzdata==2025.2 \ + --hash=sha256:1a403fada01ff9221ca8044d701868fa132215d84beb92242d9acd2147f667a8 +tzlocal==5.3.1 \ + --hash=sha256:eb1a66c3ef5847adf7a834f1be0800581b683b5608e74f86ecbcef8ab91bb85d +uc-micro-py==1.0.3 \ + --hash=sha256:db1dffff340817673d7b466ec86114a9dc0e9d4d9b5ba229d9d60e5c12600cd5 +ujson==5.10.0 \ + --hash=sha256:38665e7d8290188b1e0d57d584eb8110951a9591363316dd41cf8686ab1d0abc +umap-learn==0.5.7 \ + --hash=sha256:6a7e0be2facfa365a5ed6588447102bdbef32a0ef449535c25c97ea7e680073c +uncertainties==3.2.2 \ + --hash=sha256:fd8543355952f4052786ed4150acaf12e23117bd0f5bd03ea07de466bce646e7 +uri-template==1.3.0 \ + --hash=sha256:a44a133ea12d44a0c0f06d7d42a52d71282e77e2f937d8abd5655b8d56fc1363 +urllib3==2.4.0 \ + --hash=sha256:4e16665048960a0900c702d4a66415956a584919c03361cac9f1df5c5dd7e813 +uvicorn==0.34.2 \ + --hash=sha256:deb49af569084536d269fe0a6d67e3754f104cf03aba7c11c40f01aadf33c403 +vega-datasets==0.9.0 \ + --hash=sha256:3d7c63917be6ca9b154b565f4779a31fedce57b01b5b9d99d8a34a7608062a1d +waitress==3.0.0 \ + --hash=sha256:2a06f242f4ba0cc563444ca3d1998959447477363a2d7e9b8b4d75d35cfd1669 +watchdog==6.0.0 \ + --hash=sha256:cbafb470cf848d93b5d013e2ecb245d4aa1c8fd0504e863ccefa32445359d680 +wcwidth==0.2.13 \ + --hash=sha256:3da69048e4540d84af32131829ff948f1e022c1c6bdb8d6102117aac784f6859 +webcolors==24.11.1 \ + --hash=sha256:515291393b4cdf0eb19c155749a096f779f7d909f7cceea072791cb9095b92e9 +webencodings==0.5.1 \ + --hash=sha256:a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78 +websocket-client==1.8.0 \ + --hash=sha256:17b44cc997f5c498e809b22cdf2d9c7a9e71c02c8cc2b6c56e7c2d1239bfa526 +websockets==14.2 \ + --hash=sha256:44bba1a956c2c9d268bdcdf234d5e5ff4c9b6dc3e300545cbe99af59dda9dcce +werkzeug==3.1.3 \ + --hash=sha256:54b78bf3716d19a65be4fceccc0d1d7b89e608834989dfae50ea87564639213e +whatthepatch==1.0.7 \ + --hash=sha256:1b6f655fd31091c001c209529dfaabbabdbad438f5de14e3951266ea0fc6e7ed +wheel==0.45.1 \ + --hash=sha256:708e7481cc80179af0e556bbf0cc00b8444c7321e2700b8d8580231d13017248 +widgetsnbextension==4.0.14 \ + --hash=sha256:4875a9eaf72fbf5079dc372a51a9f268fc38d46f767cbf85c43a36da5cb9b575 +wordcloud==1.9.4 \ + --hash=sha256:360977705d0808a1795fcbe98afb5dc4833cb4bb8e421cbb10e93ef0bce816ff +wrapt==1.16.0 \ + --hash=sha256:dcdba5c86e368442528f7060039eda390cc4091bfd1dca41e8046af7c910dda8 +wsproto==1.2.0 \ + --hash=sha256:b9acddd652b585d75b20477888c56642fdade28bdfd3579aa24a4d2c037dd736 +xarray==2025.4.0 \ + --hash=sha256:b27defd082c5cb85d32c695708de6bb05c2838fb7caaf3f952982e602a35b9b8 +xlsxwriter==3.2.3 \ + --hash=sha256:593f8296e8a91790c6d0378ab08b064f34a642b3feb787cf6738236bd0a4860d +xyzservices==2023.10.1 \ + --hash=sha256:6a4c38d3a9f89d3e77153eff9414b36a8ee0850c9e8b85796fd1b2a85b8dfd68 +yapf==0.40.1 \ + --hash=sha256:b8bfc1f280949153e795181768ca14ef43d7312629a06c43e7abd279323af313 +yarl==1.18.3 \ + --hash=sha256:7e2ee16578af3b52ac2f334c3b1f92262f47e02cc6193c598502bd46f5cd1477 +yt-dlp==2025.2.19 \ + --hash=sha256:3ed218eaeece55e9d715afd41abc450dc406ee63bf79355169dfde312d38fdb8 +zict==3.0.0 \ + --hash=sha256:5796e36bd0e0cc8cf0fbc1ace6a68912611c1dbd74750a3f3026b9b9d6a327ae +zipp==3.21.0 \ + --hash=sha256:ac1bbe05fd2991f160ebce24ffbac5f6d11d83dc90891255885223d42b3cd931 +zstandard==0.23.0 \ + --hash=sha256:64585e1dba664dc67c7cdabd56c1e5685233fbb1fc1966cfba2a340ec0dfff7b diff --git a/changelogs/requir.64-3_13_5_0slim.txt b/changelogs/requir.64-3_13_5_0slim.txt new file mode 100644 index 00000000..d01e834e --- /dev/null +++ b/changelogs/requir.64-3_13_5_0slim.txt @@ -0,0 +1,998 @@ +absl-py==2.2.2 \ + --hash=sha256:e5797bc6abe45f64fd95dc06394ca3f2bedf3b5d895e9da691c9ee3397d70092 +adbc-driver-manager==1.3.0 \ + --hash=sha256:0d327006f5993385b3625e3524a851ea7050aa3b1716bddd52c8892ac9c42145 +aiofiles==23.2.1 \ + --hash=sha256:19297512c647d4b27a2cf7c34caa7e405c0d60b5560618a29a9fe027b18b0107 +aiohappyeyeballs==2.6.1 \ + --hash=sha256:f349ba8f4b75cb25c99c5c2d84e997e485204d2902a9597802b0371f09331fb8 +aiohttp==3.11.18 \ + --hash=sha256:bdd619c27e44382cf642223f11cfd4d795161362a5a1fc1fa3940397bc89db01 +aiosignal==1.3.2 \ + --hash=sha256:45cde58e409a301715980c2b01d0c28bdde3770d8290b5eb2173759d9acb31a5 +aiosqlite==0.20.0 \ + --hash=sha256:36a1deaca0cac40ebe32aac9977a6e2bbc7f5189f23f4a54d5908986729e5bd6 +alabaster==0.7.16 \ + --hash=sha256:b46733c07dce03ae4e150330b975c75737fa60f0a7c591b6c8bf4928a28e2c92 +alembic==1.15.2 \ + --hash=sha256:2e76bd916d547f6900ec4bb5a90aeac1485d2c92536923d0b138c02b126edc53 +altair==5.5.0 \ + --hash=sha256:91a310b926508d560fe0148d02a194f38b824122641ef528113d029fcd129f8c +annotated-types==0.7.0 \ + --hash=sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53 +ansicolors==1.1.8 \ + --hash=sha256:00d2dde5a675579325902536738dd27e4fac1fd68f773fe36c21044eb559e187 +anthropic==0.51.0 \ + --hash=sha256:b8b47d482c9aa1f81b923555cebb687c2730309a20d01be554730c8302e0f62a +anyio==4.9.0 \ + --hash=sha256:9f76d541cad6e36af7beb62e978876f3b41e3e04f2c1fbf0884604c0a9c4d93c +anywidget==0.9.18 \ + --hash=sha256:944b82ef1dd17b8ff0fb6d1f199f613caf9111338e6e2857da478f6e73770cb8 +appdirs==1.4.4 \ + --hash=sha256:a841dacd6b99318a741b166adb07e19ee71a274450e68237b4650ca1055ab128 +argcomplete==3.6.2 \ + --hash=sha256:65b3133a29ad53fb42c48cf5114752c7ab66c1c38544fdf6460f450c09b42591 +argon2-cffi==23.1.0 \ + --hash=sha256:c670642b78ba29641818ab2e68bd4e6a78ba53b7eff7b4c3815ae16abf91c7ea +argon2-cffi-bindings==21.2.0 \ + --hash=sha256:b2ef1c30440dbbcba7a5dc3e319408b59676e2e039e2ae11a8775ecf482b192f +array-api-compat==1.12.0 \ + --hash=sha256:a0b4795b6944a9507fde54679f9350e2ad2b1e2acf4a2408a098cdc27f890a8b +arrow==1.3.0 \ + --hash=sha256:c728b120ebc00eb84e01882a6f5e7927a53960aa990ce7dd2b10f39005a67f80 +asgi-csrf==0.11 \ + --hash=sha256:03ac140115f39d4295288a9adf74fdc6ae607f6ef44abee8466520458207242b +asgiref==3.8.1 \ + --hash=sha256:3e1e3ecc849832fe52ccf2cb6686b7a55f82bb1d6aee72a58826471390335e47 +asn1crypto==1.5.1 \ + --hash=sha256:db4e40728b728508912cbb3d44f19ce188f218e9eba635821bb4b68564f8fd67 +asteval==1.0.5 \ + --hash=sha256:082b95312578affc8a6d982f7d92b7ac5de05634985c87e7eedd3188d31149fa +astroid==3.3.9 \ + --hash=sha256:d05bfd0acba96a7bd43e222828b7d9bc1e138aaeb0649707908d3702a9831248 +astropy==6.1.6 \ + --hash=sha256:fafc65f47dedcc4a8112bce8b67f215a8076af214be34a2c34abc96d078f2b37 +astropy-iers-data==0.2024.12.23.0.33.24 \ + --hash=sha256:40d3c6b6a5cf4dc6ad91b92b7e0f949e5366234e3c4440302247429fc8294302 +asttokens==3.0.0 \ + --hash=sha256:e3078351a059199dd5138cb1c706e6430c05eff2ff136af5eb4790f9d28932e2 +async-lru==2.0.5 \ + --hash=sha256:ab95404d8d2605310d345932697371a5f40def0487c03d6d0ad9138de52c9943 +asyncssh==2.20.0 \ + --hash=sha256:af6888d937c07a4bf31293335a6166b4d87608cdb5957b49547da6ad87ecf174 +atomicwrites==1.4.0 \ + --hash=sha256:6d1784dea7c0c8d4a5172b6c620f40b6e4cbfdf96d783691f2e1302a7b88e197 +attrs==25.3.0 \ + --hash=sha256:427318ce031701fea540783410126f03899a97ffc6f61596ad581ac2e40e3bc3 +autopep8==2.0.4 \ + --hash=sha256:067959ca4a07b24dbd5345efa8325f5f58da4298dab0dde0443d5ed765de80cb +azure-core==1.32.0 \ + --hash=sha256:eac191a0efb23bfa83fddf321b27b122b4ec847befa3091fa736a5c32c50d7b4 +azure-cosmos==4.9.0 \ + --hash=sha256:3b60eaa01a16a857d0faf0cec304bac6fa8620a81bc268ce760339032ef617fe +azure-identity==1.21.0 \ + --hash=sha256:258ea6325537352440f71b35c3dffe9d240eae4a5126c1b7ce5efd5766bd9fd9 +babel==2.17.0 \ + --hash=sha256:4d0b53093fdfb4b21c92b5213dba5a1b23885afa8383709427046b21c366e5f2 +baresql==1.0.0 \ + --hash=sha256:a24d17f46beb47c221f328f7e06710e3896c6203a8e1909788d7128f27b86f01 +bcrypt==4.3.0 \ + --hash=sha256:e53e074b120f2877a35cc6c736b8eb161377caae8925c17688bd46ba56daaa5b +beautifulsoup4==4.13.3 \ + --hash=sha256:99045d7d3f08f91f0d656bc9b7efbae189426cd913d830294a15eefa0ea4df16 +binaryornot==0.4.4 \ + --hash=sha256:b8b71173c917bddcd2c16070412e369c3ed7f0528926f70cac18a6c97fd563e4 +black==25.1.0 \ + --hash=sha256:a22f402b410566e2d1c950708c77ebf5ebd5d0d88a6a2e87c86d9fb48afa0d18 +bleach==6.2.0 \ + --hash=sha256:117d9c6097a7c3d22fd578fcd8d35ff1e125df6736f554da4e432fdd63f31e5e +blinker==1.9.0 \ + --hash=sha256:ba0efaa9080b619ff2f3459d1d500c57bddea4a6b424b60a91141db6fd2f08bc +bokeh==3.7.3 \ + --hash=sha256:b0e79dd737f088865212e4fdcb0f3b95d087f0f088bf8ca186a300ab1641e2c7 +branca==0.8.1 \ + --hash=sha256:d29c5fab31f7c21a92e34bf3f854234e29fecdcf5d2df306b616f20d816be425 +brotli==1.1.0 \ + --hash=sha256:9011560a466d2eb3f5a6e4929cf4a09be405c64154e12df0dd72713f6500e32b +build==1.2.2.post1 \ + --hash=sha256:1d61c0887fa860c01971625baae8bdd338e517b836a2f70dd1f7aa3a6b2fc5b5 +cachetools==5.5.2 \ + --hash=sha256:d26a22bcc62eb95c3beabd9f1ee5e820d3d2704fe2967cbe350e20c8ffcd3f0a +certifi==2025.1.31 \ + --hash=sha256:ca78db4565a652026a4db2bcdf68f2fb589ea80d0be70e03929ed730746b84fe +cffi==1.17.1 \ + --hash=sha256:f6a16c31041f09ead72d69f583767292f750d24913dadacf5756b966aacb3f1a +chardet==5.2.0 \ + --hash=sha256:e1cf59446890a00105fe7b7912492ea04b6e6f06d4b742b2c788469e34c82970 +charset-normalizer==3.4.2 \ + --hash=sha256:aa6af9e7d59f9c12b33ae4e9450619cf2488e2bbe9b44030905877f0b2324980 +clarabel==0.10.0 \ + --hash=sha256:7871b6f499ad66f71d4e7fb40754c4d986d4316f242beb62ff4f63a69785a50c +click==8.1.8 \ + --hash=sha256:63c132bbbed01578a06712a2d1f497bb62d9c1c0d329b7903a866228027263b2 +click-default-group==1.2.4 \ + --hash=sha256:9b60486923720e7fc61731bdb32b617039aba820e22e1c88766b1125592eaa5f +cloudpickle==3.1.1 \ + --hash=sha256:c8c5a44295039331ee9dad40ba100a9c7297b6f988e50e87ccdf3765a668350e +cohere==5.15.0 \ + --hash=sha256:22ff867c2a6f2fc2b585360c6072f584f11f275ef6d9242bac24e0fa2df1dfb5 +colorama==0.4.6 \ + --hash=sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6 +colorcet==3.1.0 \ + --hash=sha256:2a7d59cc8d0f7938eeedd08aad3152b5319b4ba3bcb7a612398cc17a384cb296 +colorlog==6.9.0 \ + --hash=sha256:5906e71acd67cb07a71e779c47c4bcb45fb8c2993eebe9e5adcd6a6f1b283eff +comm==0.2.2 \ + --hash=sha256:e6fb86cb70ff661ee8c9c14e7d36d6de3b4066f1441be4063df9c5009f0a64d3 +contourpy==1.3.2 \ + --hash=sha256:e1578f7eafce927b168752ed7e22646dad6cd9bca673c60bff55889fa236ebf9 +cookiecutter==2.6.0 \ + --hash=sha256:a54a8e37995e4ed963b3e82831072d1ad4b005af736bb17b99c2cbd9d41b6e2d +cryptography==44.0.0 \ + --hash=sha256:708ee5f1bafe76d041b53a4f95eb28cdeb8d18da17e597d46d7833ee59b97ede +cvxopt==1.3.2 \ + --hash=sha256:0a0987966009ad383de0918e61255d34ed9ebc783565bcb15470d4155010b6bf +cvxpy==1.6.4 \ + --hash=sha256:1eed0ac8d8c0141abc73535d652f7b133acfbab2149f5d9d6fa348353c90b442 +cycler==0.12.1 \ + --hash=sha256:85cef7cff222d8644161529808465972e51340599459b8ac3ccbac5a854e0d30 +cython==3.1.1 \ + --hash=sha256:e000f0533eedf3d6dfbe30bb3c58a054c58f0a7778390342fa577a0dc47adab3 +cytoolz==1.0.1 \ + --hash=sha256:90e577e08d3a4308186d9e1ec06876d4756b1e8164b92971c69739ea17e15297 +dask==2025.4.1 \ + --hash=sha256:aacbb0a9667856fe58385015efd64aca22f0c0b2c5e1b5e633531060303bb4be +datasette==0.65.1 \ + --hash=sha256:ba7adf717ddcc24a2a8ac57890fffd384a2ebb909b342e4f731ba09eba764305 +datasette-graphql==2.2 \ + --hash=sha256:cd9f61afdcaab1ce4ff6775296e6ece99305bf05cbfae4c1c938a6c9e60cd485 +datashader==0.17.0 \ + --hash=sha256:39421ff999294913e63d41954af955a5dece5d0c55d8fce1426043d70b22d07a +deap==1.4.2 \ + --hash=sha256:1abab976c75b0f18c36e81f968fcc77fac69fc9bedbab8be3323ca376f6fcfa4 +debugpy==1.8.13 \ + --hash=sha256:79ce4ed40966c4c1631d0131606b055a5a2f8e430e3f7bf8fd3744b09943e8e8 +decorator==5.2.1 \ + --hash=sha256:d316bb415a2d9e2d2b3abcc4084c6502fc09240e292cd76a76afc106a1c8e04a +defusedxml==0.7.1 \ + --hash=sha256:a352e7e428770286cc899e2542b6cdaedb2b4953ff269a210103ec58f6198a61 +deprecated==1.2.14 \ + --hash=sha256:6fac8b097794a90302bdbb17b9b815e732d3c4720583ff1b198499d78470466c +diff-match-patch==20241021 \ + --hash=sha256:93cea333fb8b2bc0d181b0de5e16df50dd344ce64828226bda07728818936782 +dill==0.4.0 \ + --hash=sha256:44f54bf6412c2c8464c14e8243eb163690a9800dbe2c367330883b19c7561049 +distributed==2025.4.1 \ + --hash=sha256:3a7834451b04ef059928045eab6ff6d88ad7bcfd48adc99403127d9a6818b5fa +distro==1.9.0 \ + --hash=sha256:7bffd925d65168f85027d8da9af6bddab658135b840670a223589bc0c8ef02b2 +django==5.2 \ + --hash=sha256:91ceed4e3a6db5aedced65e3c8f963118ea9ba753fc620831c77074e620e7d83 +dnspython==2.7.0 \ + --hash=sha256:b4c34b7d10b51bcc3a5071e7b8dee77939f1e878477eeecc965e9835f63c6c86 +docstring-to-markdown==0.17 \ + --hash=sha256:fd7d5094aa83943bf5f9e1a13701866b7c452eac19765380dead666e36d3711c +docutils==0.21.2 \ + --hash=sha256:dafca5b9e384f0e419294eb4d2ff9fa826435bf15f15b7bd45723e8ad76811b2 +duckdb==1.3.0 \ + --hash=sha256:fbdfc1c0b83b90f780ae74038187ee696bb56ab727a289752372d7ec42dda65b +entrypoints==0.4 \ + --hash=sha256:f174b5ff827504fd3cd97cc3f8649f3693f51538c7e4bdf3ef002c8429d42f9f +et-xmlfile==1.1.0 \ + --hash=sha256:a2ba85d1d6a74ef63837eed693bcb89c3f752169b0e3e7ae5b16ca5e1b3deada +eval-type-backport==0.2.2 \ + --hash=sha256:cb6ad7c393517f476f96d456d0412ea80f0a8cf96f6892834cd9340149111b0a +executing==2.2.0 \ + --hash=sha256:11387150cad388d62750327a53d3339fad4888b39a6fe233c3afbb54ecffd3aa +faker==37.1.0 \ + --hash=sha256:dc2f730be71cb770e9c715b13374d80dbcee879675121ab51f9683d262ae9a1c +fasta2a==0.2.9 \ + --hash=sha256:8b855b36f29fde6dcb79ad55be337a8165381b679bec829913009c55581e284e +fastapi==0.115.12 \ + --hash=sha256:e94613d6c05e27be7ffebdd6ea5f388112e5e430c8f7d6494a9d1d88d43e814d +fastavro==1.10.0 \ + --hash=sha256:86baf8c9740ab570d0d4d18517da71626fe9be4d1142bea684db52bd5adb078f +fastjsonschema==2.21.1 \ + --hash=sha256:c9e5b7e908310918cf494a434eeb31384dd84a98b57a30bcb1f535015b554667 +filelock==3.18.0 \ + --hash=sha256:c401f4f8377c4464e6db25fff06205fd89bdd83b65eb0488ed1b160f780e21de +flake8==7.1.1 \ + --hash=sha256:597477df7860daa5aa0fdd84bf5208a043ab96b8e96ab708770ae0364dd03213 +flask==3.1.0 \ + --hash=sha256:d667207822eb83f1c4b50949b1623c8fc8d51f2341d65f72e1a1815397551136 +flexcache==0.3 \ + --hash=sha256:d43c9fea82336af6e0115e308d9d33a185390b8346a017564611f1466dcd2e32 +flexparser==0.4 \ + --hash=sha256:3738b456192dcb3e15620f324c447721023c0293f6af9955b481e91d00179846 +flit==3.12.0 \ + --hash=sha256:2b4e7171dc22881fa6adc2dbf083e5ecc72520be3cd7587d2a803da94d6ef431 +flit-core==3.12.0 \ + --hash=sha256:e7a0304069ea895172e3c7bb703292e992c5d1555dd1233ab7b5621b5b69e62c +folium==0.19.5 \ + --hash=sha256:4333fb3e6f3e9eedb231615d22c6d7df20aea5829554bd6908675865a37803b3 +fonttools==4.57.0 \ + --hash=sha256:f1d6bc9c23356908db712d282acb3eebd4ae5ec6d8b696aa40342b1d84f8e9e3 +fqdn==1.5.1 \ + --hash=sha256:3a179af3761e4df6eb2e026ff9e1a3033d3587bf980a0b1b2e1e5d08d7358014 +frozenlist==1.5.0 \ + --hash=sha256:11aabdd62b8b9c4b84081a3c246506d1cddd2dd93ff0ad53ede5defec7886b28 +fsspec==2025.3.2 \ + --hash=sha256:2daf8dc3d1dfa65b6aa37748d112773a7a08416f6c70d96b264c96476ecaf711 +fuzzywuzzy==0.18.0 \ + --hash=sha256:928244b28db720d1e0ee7587acf660ea49d7e4c632569cad4f1cd7e68a5f0993 +geographiclib==2.0 \ + --hash=sha256:6b7225248e45ff7edcee32becc4e0a1504c606ac5ee163a5656d482e0cd38734 +geopandas==1.0.1 \ + --hash=sha256:01e147d9420cc374d26f51fc23716ac307f32b49406e4bd8462c07e82ed1d3d6 +geopy==2.4.1 \ + --hash=sha256:ae8b4bc5c1131820f4d75fce9d4aaaca0c85189b3aa5d64c3dcaf5e3b7b882a7 +gitdb==4.0.12 \ + --hash=sha256:67073e15955400952c6565cc3e707c554a4eea2e428946f7a4c162fab9bd9bcf +gitpython==3.1.44 \ + --hash=sha256:9e0e10cda9bed1ee64bc9a6de50e7e38a9c9943241cd7f585f6df3ed28011110 +google-auth==2.38.0 \ + --hash=sha256:e7dae6694313f434a2727bf2906f27ad259bae090d7aa896590d86feec3d9d4a +google-genai==1.16.1 \ + --hash=sha256:6ae5d24282244f577ca4f0d95c09f75ab29e556602c9d3531b70161e34cd2a39 +graphene==3.4.3 \ + --hash=sha256:820db6289754c181007a150db1f7fff544b94142b556d12e3ebc777a7bf36c71 +graphql-core==3.2.6 \ + --hash=sha256:78b016718c161a6fb20a7d97bbf107f331cd1afe53e45566c59f776ed7f0b45f +graphql-relay==3.2.0 \ + --hash=sha256:c9b22bd28b170ba1fe674c74384a8ff30a76c8e26f88ac3aa1584dd3179953e5 +greenlet==3.1.1 \ + --hash=sha256:b42703b1cf69f2aa1df7d1030b9d77d3e584a70755674d60e710f0af570f3761 +griffe==1.7.2 \ + --hash=sha256:1ed9c2e338a75741fc82083fe5a1bc89cb6142efe126194cc313e34ee6af5423 +groq==0.25.0 \ + --hash=sha256:aadc78b40b1809cdb196b1aa8c7f7293108767df1508cafa3e0d5045d9328e7a +guidata==3.9.0 \ + --hash=sha256:96a19dc92850bdb3e463fa06e8c22793e090db42d1e72c6dae9bda1a98b61210 +h11==0.14.0 \ + --hash=sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761 +h2==4.2.0 \ + --hash=sha256:479a53ad425bb29af087f3458a61d30780bc818e4ebcf01f0b536ba916462ed0 +h5py==3.12.1 \ + --hash=sha256:52ab036c6c97055b85b2a242cb540ff9590bacfda0c03dd0cf0661b311f522f8 +hatchling==1.27.0 \ + --hash=sha256:d3a2f3567c4f926ea39849cdf924c7e99e6686c9c8e288ae1037c8fa2a5d937b +holoviews==1.20.2 \ + --hash=sha256:1f892c04bc23e8a3a9cde082b606b9463c9ff78c3d0c00e2ddcc41fe6e738458 +hpack==4.1.0 \ + --hash=sha256:157ac792668d995c657d93111f46b4535ed114f0c9c8d672271bbec7eae1b496 +html5lib==1.1 \ + --hash=sha256:0d78f8fde1c230e99fe37986a60526d7049ed4bf8a9fadbad5f00e22e58e041d +httpcore==1.0.7 \ + --hash=sha256:a3fff8f43dc260d5bd363d9f9cf1830fa3a458b332856f34282de498ed420edd +httpie==3.2.4 \ + --hash=sha256:4bd0435cc4b9bca59501bc65089de96f3e93b393803f32a81951db62050ebf0b +httpx==0.28.1 \ + --hash=sha256:d909fcccc110f8c7faf814ca82a9a4d816bc5a6dbfea25d6591d6985b8ba59ad +httpx-sse==0.4.0 \ + --hash=sha256:f329af6eae57eaa2bdfd962b42524764af68075ea87370a2de920af5341e318f +huggingface-hub==0.33.0 \ + --hash=sha256:e8668875b40c68f9929150d99727d39e5ebb8a05a98e4191b908dc7ded9074b3 +hupper==1.12.1 \ + --hash=sha256:e872b959f09d90be5fb615bd2e62de89a0b57efc037bdf9637fb09cdf8552b19 +hvplot==0.11.2 \ + --hash=sha256:9d576a0c2df0f1cf5041545f2a2eddcf962510162876991cae4d1779fad74556 +hypercorn==0.17.3 \ + --hash=sha256:059215dec34537f9d40a69258d323f56344805efb462959e727152b0aa504547 +hyperframe==6.1.0 \ + --hash=sha256:b03380493a519fce58ea5af42e4a42317bf9bd425596f7a0835ffce80f1a42e5 +hypothesis==6.130.4 \ + --hash=sha256:cda4a57115d10ecbefe0a9cc8d69d20a13eb56ecbfe7c24eaee5d368c2b7c477 +id==1.5.0 \ + --hash=sha256:f1434e1cef91f2cbb8a4ec64663d5a23b9ed43ef44c4c957d02583d61714c658 +idna==3.10 \ + --hash=sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3 +imageio==2.37.0 \ + --hash=sha256:11efa15b87bc7871b61590326b2d635439acc321cf7f8ce996f812543ce10eed +imagesize==1.4.1 \ + --hash=sha256:0d8d18d08f840c19d0ee7ca1fd82490fdc3729b7ac93f49870406ddde8ef8d8b +imbalanced-learn==0.13.0 \ + --hash=sha256:7eb5859f7827cb3babfa5789978c22fe36e56527d9c9768df2d864d98d9b40fe +importlib-metadata==8.6.1 \ + --hash=sha256:02a89390c1e15fdfdc0d7c6b25cb3e62650d0494005c97d6f148bf5b9787525e +inflection==0.5.1 \ + --hash=sha256:f38b2b640938a4f35ade69ac3d053042959b62a0f1076a5bbaa1b9526605a8a2 +iniconfig==2.1.0 \ + --hash=sha256:9deba5723312380e77435581c6bf4935c94cbfab9b1ed33ef8d238ea168eb760 +intervaltree==3.1.0 \ + --hash=sha256:902b1b88936918f9b2a19e0e5eb7ccb430ae45cde4f39ea4b36932920d33952d +ipycanvas==0.13.3 \ + --hash=sha256:d37adb2f45d2fef1c3d33c69a0518055694d87827b2f577f3c426d7712f75daa +ipykernel==6.29.5 \ + --hash=sha256:afdb66ba5aa354b09b91379bac28ae4afebbb30e8b39510c9690afb7a10421b5 +ipyleaflet==0.19.2 \ + --hash=sha256:7cc9157848baca2e1793b96e79f8bdb1aa7340521d2b7d8a62aa8bc30eab5278 +ipympl==0.9.7 \ + --hash=sha256:3698ee7eaa0b047a7603517d7aa1b71b32118a5f51754cab45ec5d994f67208f +ipython==8.36.0 \ + --hash=sha256:12b913914d010dcffa2711505ec8be4bf0180742d97f1e5175e51f22086428c1 +ipython-genutils==0.2.0 \ + --hash=sha256:72dd37233799e619666c9f639a9da83c34013a73e8bbc79a7a6348d93c61fab8 +ipython-sql==0.5.0 \ + --hash=sha256:61b46ecffb956f62dbc17b5744cf70c649104c8db9afd821aa39b31f7cbb5d5b +ipywidgets==8.1.6 \ + --hash=sha256:446e7630a1d025bdc7635e1169fcc06f2ce33b5bd41c2003edeb4a47c8d4bbb1 +isoduration==20.11.0 \ + --hash=sha256:b2904c2a4228c3d44f409c8ae8e2370eb21a26f7ac2ec5446df141dde3452042 +isort==5.13.2 \ + --hash=sha256:8ca5e72a8d85860d5a3fa69b8745237f2939afe12dbf656afbcb47fe72d947a6 +itsdangerous==2.2.0 \ + --hash=sha256:c6242fc49e35958c8b15141343aa660db5fc54d4f13a1db01a3f5891b98700ef +janus==2.0.0 \ + --hash=sha256:7e6449d34eab04cd016befbd7d8c0d8acaaaab67cb59e076a69149f9031745f9 +jaraco-classes==3.4.0 \ + --hash=sha256:f662826b6bed8cace05e7ff873ce0f9283b5c924470fe664fff1c2f00f581790 +jaraco-context==6.0.1 \ + --hash=sha256:f797fc481b490edb305122c9181830a3a5b76d84ef6d1aef2fb9b47ab956f9e4 +jaraco-functools==4.1.0 \ + --hash=sha256:ad159f13428bc4acbf5541ad6dec511f91573b90fba04df61dafa2a1231cf649 +jedi==0.19.2 \ + --hash=sha256:a8ef22bde8490f57fe5c7681a3c83cb58874daf72b4784de3cce5b6ef6edb5b9 +jellyfish==1.1.3 \ + --hash=sha256:2113195a48ce8cb99d2bb2c6d9b119f58025dde1d727101518e7150c093a66da +jinja2==3.1.6 \ + --hash=sha256:85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67 +jiter==0.9.0 \ + --hash=sha256:c8ae3bf27cd1ac5e6e8b7a27487bf3ab5f82318211ec2e1346a5b058756361f7 +joblib==1.4.2 \ + --hash=sha256:06d478d5674cbc267e7496a410ee875abd68e4340feff4490bcb7afb88060ae6 +json5==0.10.0 \ + --hash=sha256:19b23410220a7271e8377f81ba8aacba2fdd56947fbb137ee5977cbe1f5e8dfa +jsonpatch==1.33 \ + --hash=sha256:0ae28c0cd062bbd8b8ecc26d7d164fbbea9652a1a3693f3b956c1eae5145dade +jsonpointer==3.0.0 \ + --hash=sha256:13e088adc14fca8b6aa8177c044e12701e6ad4b28ff10e65f2267a90109c9942 +jsonschema==4.23.0 \ + --hash=sha256:fbadb6f8b144a8f8cf9f0b89ba94501d143e50411a1278633f56a7acf7fd5566 +jsonschema-specifications==2024.10.1 \ + --hash=sha256:a09a0680616357d9a0ecf05c12ad234479f549239d0f5b55f3deea67475da9bf +julia==0.6.2 \ + --hash=sha256:90752f71376fdb9919439d20496c2dab24486dfa4fe8a831d6dd14a1bcbc04d1 +jupyter==1.1.1 \ + --hash=sha256:7a59533c22af65439b24bbe60373a4e95af8f16ac65a6c00820ad378e3f7cc83 +jupyter-bokeh==4.0.5 \ + --hash=sha256:1110076c14c779071cf492646a1a871aefa8a477261e4721327a666e65df1a2c +jupyter-client==8.6.3 \ + --hash=sha256:e8a19cc986cc45905ac3362915f410f3af85424b4c0905e94fa5f2cb08e8f23f +jupyter-console==6.6.3 \ + --hash=sha256:309d33409fcc92ffdad25f0bcdf9a4a9daa61b6f341177570fdac03de5352485 +jupyter-core==5.7.2 \ + --hash=sha256:4f7315d2f6b4bcf2e3e7cb6e46772eba760ae459cd1f59d29eb57b0a01bd7409 +jupyter-events==0.12.0 \ + --hash=sha256:6464b2fa5ad10451c3d35fabc75eab39556ae1e2853ad0c0cc31b656731a97fb +jupyter-leaflet==0.19.2 \ + --hash=sha256:0d57e15e80c08a4360f0cde0b4c490beddc5d422bb0e9bc1c0b4479d3fb725a6 +jupyter-lsp==2.2.5 \ + --hash=sha256:45fbddbd505f3fbfb0b6cb2f1bc5e15e83ab7c79cd6e89416b248cb3c00c11da +jupyter-server==2.15.0 \ + --hash=sha256:872d989becf83517012ee669f09604aa4a28097c0bd90b2f424310156c2cdae3 +jupyter-server-terminals==0.5.3 \ + --hash=sha256:41ee0d7dc0ebf2809c668e0fc726dfaf258fcd3e769568996ca731b6194ae9aa +jupyterlab==4.4.2 \ + --hash=sha256:857111a50bed68542bf55dca784522fe728f9f88b4fe69e8c585db5c50900419 +jupyterlab-pygments==0.3.0 \ + --hash=sha256:841a89020971da1d8693f1a99997aefc5dc424bb1b251fd6322462a1b8842780 +jupyterlab-server==2.27.3 \ + --hash=sha256:e697488f66c3db49df675158a77b3b017520d772c6e1548c7d9bcc5df7944ee4 +jupyterlab-widgets==3.0.14 \ + --hash=sha256:54c33e3306b7fca139d165d6190dc6c0627aafa5d14adfc974a4e9a3d26cb703 +keras==3.10.0 \ + --hash=sha256:c095a6bf90cd50defadf73d4859ff794fad76b775357ef7bd1dbf96388dae7d3 +keyring==25.6.0 \ + --hash=sha256:552a3f7af126ece7ed5c89753650eec89c7eaae8617d0aa4d9ad2b75111266bd +kiwisolver==1.4.8 \ + --hash=sha256:a17b7c4f5b2c51bb68ed379defd608a03954a1845dfed7cc0117f1cc8a9b7fd2 +langchain==0.3.25 \ + --hash=sha256:931f7d2d1eaf182f9f41c5e3272859cfe7f94fc1f7cef6b3e5a46024b4884c21 +langchain-core==0.3.59 \ + --hash=sha256:9686baaff43f2c8175535da13faf40e6866769015e93130c3c1e4243e7244d70 +langchain-text-splitters==0.3.8 \ + --hash=sha256:e75cc0f4ae58dcf07d9f18776400cf8ade27fadd4ff6d264df6278bb302f6f02 +langsmith==0.3.42 \ + --hash=sha256:18114327f3364385dae4026ebfd57d1c1cb46d8f80931098f0f10abe533475ff +lazy-loader==0.4 \ + --hash=sha256:342aa8e14d543a154047afb4ba8ef17f5563baad3fc610d7b15b213b0f119efc +linkify-it-py==2.0.3 \ + --hash=sha256:6bcbc417b0ac14323382aef5c5192c0075bf8a9d6b41820a2b66371eac6b6d79 +llvmlite==0.44.0 \ + --hash=sha256:2fb7c4f2fb86cbae6dca3db9ab203eeea0e22d73b99bc2341cdf9de93612e930 +lmfit==1.3.3 \ + --hash=sha256:a9e9ec7d0d0ec962cc6c078ad1ec6c8311d3ac0e5f0947a00a91f5509dacc2b2 +locket==1.0.0 \ + --hash=sha256:b6c819a722f7b6bd955b80781788e4a66a55628b858d347536b7e81325a3a5e3 +logfire-api==3.12.0 \ + --hash=sha256:fc092c2dcb24c8462ba776f3b0c2183f82e1cd55f86e29b38cf21a048e66a17d +lxml==5.3.0 \ + --hash=sha256:406246b96d552e0503e17a1006fd27edac678b3fcc9f1be71a2f94b4ff61528d +mako==1.3.9 \ + --hash=sha256:95920acccb578427a9aa38e37a186b1e43156c87260d7ba18ca63aa4c7cbd3a1 +markdown==3.7 \ + --hash=sha256:7eb6df5690b81a1d7942992c97fad2938e956e79df20cbc6186e9c3a77b1c803 +markdown-it-py==3.0.0 \ + --hash=sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1 +markupsafe==3.0.2 \ + --hash=sha256:e6a2a455bd412959b57a172ce6328d2dd1f01cb2135efda2e4576e8a23fa3b0f +matplotlib==3.10.3 \ + --hash=sha256:151d89cb8d33cb23345cd12490c76fd5d18a56581a16d950b48c6ff19bb2ab93 +matplotlib-inline==0.1.7 \ + --hash=sha256:df192d39a4ff8f21b1895d72e6a13f5fcc5099f00fa84384e0ea28c2cc0653ca +maturin==1.8.3 \ + --hash=sha256:85f2b882d8235c1c1cb0a38d382ccd5b3ba0674d99cb548d49df9342cc688e36 +mccabe==0.7.0 \ + --hash=sha256:6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e +mcp==1.9.3 \ + --hash=sha256:69b0136d1ac9927402ed4cf221d4b8ff875e7132b0b06edd446448766f34f9b9 +mdit-py-plugins==0.4.2 \ + --hash=sha256:0c673c3f889399a33b95e88d2f0d111b4447bdfea7f237dab2d488f459835636 +mdurl==0.1.2 \ + --hash=sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8 +mercantile==1.2.1 \ + --hash=sha256:30f457a73ee88261aab787b7069d85961a5703bb09dc57a170190bc042cd023f +mergedeep==1.3.4 \ + --hash=sha256:70775750742b25c0d8f36c55aed03d24c3384d17c951b3175d898bd778ef0307 +missingno==0.5.2 \ + --hash=sha256:55782621ce09ba0f0a1d08e5bd6d6fe1946469fb03951fadf7d209911ca5b072 +mistralai==1.8.1 \ + --hash=sha256:badfc7e6832d894b3e9071d92ad621212b7cccd7df622c6cacdb525162ae338f +mistune==3.1.3 \ + --hash=sha256:1a32314113cff28aa6432e99e522677c8587fd83e3d51c29b82a52409c842bd9 +mizani==0.11.4 \ + --hash=sha256:5b6271dc3da2c88694dca2e0e0a7e1879f0e2fb046c789776f54d090a5243735 +ml-dtypes==0.5.1 \ + --hash=sha256:fd918d4e6a4e0c110e2e05be7a7814d10dc1b95872accbf6512b80a109b71ae1 +mlxtend==0.23.3 \ + --hash=sha256:f9fec721c4121be87dac00e513456dde5bf56b7427750719c0a291cd58b6538e +more-itertools==10.6.0 \ + --hash=sha256:6eb054cb4b6db1473f6e15fcc676a08e4732548acd47c708f0e179c2c7c01e89 +mpld3==0.5.10 \ + --hash=sha256:80877acce87ea447380fad7374668737505c8c0684aab05238e7c5dc1fab38c1 +mpmath==1.3.0 \ + --hash=sha256:a0b2b9fe80bbcd81a6647ff13108738cfb482d481d826cc0e02f5b35e5c88d2c +msal==1.30.0 \ + --hash=sha256:423872177410cb61683566dc3932db7a76f661a5d2f6f52f02a047f101e1c1de +msal-extensions==1.2.0 \ + --hash=sha256:cf5ba83a2113fa6dc011a254a72f1c223c88d7dfad74cc30617c4679a417704d +msgpack==1.1.0 \ + --hash=sha256:bce7d9e614a04d0883af0b3d4d501171fbfca038f12c77fa838d9f198147a23f +multidict==6.4.3 \ + --hash=sha256:1c152c49e42277bc9a2f7b78bd5fa10b13e88d1b0328221e7aef89d5c60a99a5 +multipledispatch==1.0.0 \ + --hash=sha256:0c53cd8b077546da4e48869f49b13164bebafd0c2a5afceb6bb6a316e7fb46e4 +mypy==1.15.0 \ + --hash=sha256:b9378e2c00146c44793c98b8d5a61039a048e31f429fb0eb546d93f4b000bedf +mypy-extensions==1.0.0 \ + --hash=sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d +mysql-connector-python==9.2.0 \ + --hash=sha256:6557942f6c6be3b41d2965456b53a244a7ce3e6fb81cb195c243549be72a6a24 +namex==0.0.8 \ + --hash=sha256:7ddb6c2bb0e753a311b7590f84f6da659dd0c05e65cb89d519d54c0a250c0487 +narwhals==1.36.0 \ + --hash=sha256:e3c50dd1d769bc145f57ae17c1f0f0da6c3d397d62cdd0bb167e9b618e95c9d6 +nbclient==0.10.2 \ + --hash=sha256:4ffee11e788b4a27fabeb7955547e4318a5298f34342a4bfd01f2e1faaeadc3d +nbconvert==7.16.6 \ + --hash=sha256:1375a7b67e0c2883678c48e506dc320febb57685e5ee67faa51b18a90f3a712b +nbformat==5.10.4 \ + --hash=sha256:3b48d6c8fbca4b299bf3982ea7db1af21580e4fec269ad087b9e81588891200b +nest-asyncio==1.6.0 \ + --hash=sha256:87af6efd6b5e897c81050477ef65c62e2b2f35d51703cae01aff2905b1852e1c +networkx==3.4.2 \ + --hash=sha256:df5d4365b724cf81b8c6a7312509d0c22386097011ad1abe274afd5e9d3bbc5f +nh3==0.2.18 \ + --hash=sha256:8ce0f819d2f1933953fca255db2471ad58184a60508f03e6285e5114b6254844 +nltk==3.9.1 \ + --hash=sha256:4fa26829c5b00715afe3061398a8989dc643b92ce7dd93fb4585a70930d168a1 +notebook==7.4.2 \ + --hash=sha256:9ccef602721aaa5530852e3064710b8ae5415c4e2ce26f8896d0433222755259 +notebook-shim==0.2.4 \ + --hash=sha256:411a5be4e9dc882a074ccbcae671eda64cceb068767e9a3419096986560e1cef +numba==0.61.2 \ + --hash=sha256:59321215e2e0ac5fa928a8020ab00b8e57cda8a97384963ac0dfa4d4e6aa54e7 +numpy==2.2.6 \ + --hash=sha256:b0544343a702fa80c95ad5d3d608ea3599dd54d4632df855e4c8d24eb6ecfa1c +numpydoc==1.8.0 \ + --hash=sha256:72024c7fd5e17375dec3608a27c03303e8ad00c81292667955c6fea7a3ccf541 +openai==1.82.0 \ + --hash=sha256:8c40647fea1816516cb3de5189775b30b5f4812777e40b8768f361f232b61b30 +opencv-python==4.11.0.86 \ + --hash=sha256:085ad9b77c18853ea66283e98affefe2de8cc4c1f43eda4c100cf9b2721142ec +openpyxl==3.1.5 \ + --hash=sha256:5282c12b107bffeef825f4617dc029afaf41d0ea60823bbb665ef3079dc79de2 +opentelemetry-api==1.32.1 \ + --hash=sha256:bbd19f14ab9f15f0e85e43e6a958aa4cb1f36870ee62b7fd205783a112012724 +optree==0.14.1 \ + --hash=sha256:25ea23fc6d6c0fa7dcf85afcfe10b43ed4fdf0e9d958a3677cd27fcdf0ca17d6 +optuna==4.2.1 \ + --hash=sha256:6d38199013441d3f70fac27136e05c0188c5f4ec3848db708ac311cbdeb30dbf +orjson==3.10.16 \ + --hash=sha256:fe0a145e96d51971407cb8ba947e63ead2aa915db59d6631a355f5f2150b56b7 +osqp==0.6.7.post3 \ + --hash=sha256:acb219e941f5248da5de3ee9b70e6a5aaddf5f3989dffd1d4c03b0f7b1dfa17b +outcome==1.3.0.post0 \ + --hash=sha256:e771c5ce06d1415e356078d3bdd68523f284b4ce5419828922b6871e65eda82b +overrides==7.7.0 \ + --hash=sha256:c7ed9d062f78b8e4c1a7b70bd8796b35ead4d9f510227ef9c5dc7626c60d7e49 +packaging==24.2 \ + --hash=sha256:09abb1bccd265c01f4a3aa3f7a7db064b36514d2cba19a2f694fe6150451a759 +pandas==2.2.3 \ + --hash=sha256:61c5ad4043f791b61dd4752191d9f07f0ae412515d59ba8f005832a532f8736d +pandocfilters==1.5.1 \ + --hash=sha256:93be382804a9cdb0a7267585f157e5d1731bbe5545a85b268d6f5fe6232de2bc +panel==1.6.3 \ + --hash=sha256:ccd2a0587ab382bd55b8ea099706f31b64aadac697b8a41923d3b18b9ed618d6 +papermill==2.6.0 \ + --hash=sha256:0f09da6ef709f3f14dde77cb1af052d05b14019189869affff374c9e612f2dd5 +param==2.2.0 \ + --hash=sha256:777f8c7b66ab820b70ea5ad09faaa6818308220caae89da3b5c5f359faa72a5e +parso==0.8.4 \ + --hash=sha256:a418670a20291dacd2dddc80c377c5c3791378ee1e8d12bffc35420643d43f18 +partd==1.4.2 \ + --hash=sha256:978e4ac767ec4ba5b86c6eaa52e5a2a3bc748a2ca839e8cc798f1cc6ce6efb0f +pathspec==0.12.1 \ + --hash=sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08 +patsy==1.0.1 \ + --hash=sha256:751fb38f9e97e62312e921a1954b81e1bb2bcda4f5eeabaf94db251ee791509c +pep8==1.7.1 \ + --hash=sha256:b22cfae5db09833bb9bd7c8463b53e1a9c9b39f12e304a8d0bba729c501827ee +pexpect==4.9.0 \ + --hash=sha256:7236d1e080e4936be2dc3e326cec0af72acf9212a7e1d060210e70a47e253523 +pg8000==1.31.2 \ + --hash=sha256:436c771ede71af4d4c22ba867a30add0bc5c942d7ab27fadbb6934a487ecc8f6 +pickleshare==0.7.5 \ + --hash=sha256:9649af414d74d4df115d5d718f82acb59c9d418196b7b4290ed47a12ce62df56 +pillow==11.1.0 \ + --hash=sha256:593c5fd6be85da83656b93ffcccc2312d2d149d251e98588b14fbc288fd8909c +platformdirs==4.3.7 \ + --hash=sha256:a03875334331946f13c549dbd8f4bac7a13a50a895a0eb1e8c6a8ace80d40a94 +plotly==6.0.1 \ + --hash=sha256:4714db20fea57a435692c548a4eb4fae454f7daddf15f8d8ba7e1045681d7768 +plotnine==0.13.6 \ + --hash=sha256:4acc1af29fa4e91e726b67d49277e8368f62e1c817f01bf14ecd8ca5e83bfaea +plotpy==2.7.4 \ + --hash=sha256:8dff5fd388048a8d3b4251329a9fe4027920386e0ebcc3c3642f59c432118c29 +pluggy==1.5.0 \ + --hash=sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669 +ply==3.11 \ + --hash=sha256:096f9b8350b65ebd2fd1346b12452efe5b9607f7482813ffca50c22722a807ce +polars==1.31.0 \ + --hash=sha256:3fd874d3432fc932863e8cceff2cff8a12a51976b053f2eb6326a0672134a632 +portalocker==2.7.0 \ + --hash=sha256:a07c5b4f3985c3cf4798369631fb7011adb498e2a46d8440efc75a8f29a0f983 +prettytable==3.16.0 \ + --hash=sha256:b5eccfabb82222f5aa46b798ff02a8452cf530a352c31bddfa29be41242863aa +prince==0.16.0 \ + --hash=sha256:7e21a78d4dd06ca3ec526ee714a50b349f26de3fca6b79664150a951b31688f3 +priority==2.0.0 \ + --hash=sha256:6f8eefce5f3ad59baf2c080a664037bb4725cd0a790d53d59ab4059288faf6aa +prometheus-client==0.21.1 \ + --hash=sha256:594b45c410d6f4f8888940fe80b5cc2521b305a1fafe1c58609ef715a001f301 +prompt-toolkit==3.0.51 \ + --hash=sha256:52742911fde84e2d423e2f9a4cf1de7d7ac4e51958f648d9540e0fb8db077b07 +propcache==0.3.1 \ + --hash=sha256:813fbb8b6aea2fc9659815e585e548fe706d6f663fa73dff59a1677d4595a037 +protobuf==6.30.2 \ + --hash=sha256:7653c99774f73fe6b9301b87da52af0e69783a2e371e8b599b3e9cb4da4b12b9 +psutil==7.0.0 \ + --hash=sha256:4cf3d4eb1aa9b348dec30105c55cd9b7d4629285735a102beb4441e38db90553 +psygnal==0.12.0 \ + --hash=sha256:d779f20c6977ec9d5b9fece23b4b28bbcf0a7773539a4a176b5527aea5da27c7 +ptpython==3.0.29 \ + --hash=sha256:65d75c4871859e4305a020c9b9e204366dceb4d08e0e2bd7b7511bd5e917a402 +ptyprocess==0.7.0 \ + --hash=sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35 +pure-eval==0.2.3 \ + --hash=sha256:1db8e35b67b3d218d818ae653e27f06c3aa420901fa7b081ca98cbedc874e0d0 +pyarrow==20.0.0 \ + --hash=sha256:30b3051b7975801c1e1d387e17c588d8ab05ced9b1e14eec57915f79869b5031 +pyasn1==0.6.1 \ + --hash=sha256:0d632f46f2ba09143da3a8afe9e33fb6f92fa2320ab7e886e2d0f7672af84629 +pyasn1-modules==0.4.1 \ + --hash=sha256:49bfa96b45a292b711e986f222502c1c9a5e1f4e568fc30e2574a6c7d07838fd +pybind11==2.13.6 \ + --hash=sha256:237c41e29157b962835d356b370ededd57594a26d5894a795960f0047cb5caf5 +pycodestyle==2.12.0 \ + --hash=sha256:949a39f6b86c3e1515ba1787c2022131d165a8ad271b11370a8819aa070269e4 +pycparser==2.22 \ + --hash=sha256:c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc +pyct==0.5.0 \ + --hash=sha256:a4038a8885059ab8cac6f946ea30e0b5e6bdbe0b92b6723f06737035f9d65e8c +pydantic==2.10.6 \ + --hash=sha256:427d664bf0b8a2b34ff5dd0f5a18df00591adcee7198fbd71981054cef37b584 +pydantic-ai-slim==0.2.9 \ + --hash=sha256:d954ff84cb250d7150a7ed694e4f1f92f820205d036ee006d02fce3e62a3bc4e +pydantic-core==2.27.2 \ + --hash=sha256:953101387ecf2f5652883208769a79e48db18c6df442568a0b5ccd8c2723abee +pydantic-evals==0.2.9 \ + --hash=sha256:62035ae3a5321e4d892c7372ef91af0f46b675863e827f011d5cb8550dede400 +pydantic-graph==0.2.9 \ + --hash=sha256:38ad929a0ec205bd7d5875b0b408d4f13448276aa89b6ce2a1143a7552b070ce +pydantic-settings==2.8.1 \ + --hash=sha256:81942d5ac3d905f7f3ee1a70df5dfb62d5569c12f51a5a647defc1c3d9ee2e9c +pydeck==0.9.1 \ + --hash=sha256:b3f75ba0d273fc917094fa61224f3f6076ca8752b93d46faf3bcfd9f9d59b038 +pydocstyle==6.3.0 \ + --hash=sha256:118762d452a49d6b05e194ef344a55822987a462831ade91ec5c06fd2169d019 +pydub==0.25.1 \ + --hash=sha256:65617e33033874b59d87db603aa1ed450633288aefead953b30bded59cb599a6 +pyerfa==2.0.1.5 \ + --hash=sha256:66292d437dcf75925b694977aa06eb697126e7b86553e620371ed3e48b5e0ad0 +pyflakes==3.2.0 \ + --hash=sha256:84b5be138a2dfbb40689ca07e2152deb896a65c3a3e24c251c5c62489568074a +pygithub==2.6.1 \ + --hash=sha256:6f2fa6d076ccae475f9fc392cc6cdbd54db985d4f69b8833a28397de75ed6ca3 +pygments==2.19.1 \ + --hash=sha256:9ea1544ad55cecf4b8242fab6dd35a93bbce657034b0611ee383099054ab6d8c +pyjwt==2.10.1 \ + --hash=sha256:dcdd193e30abefd5debf142f9adfcdd2b58004e644f25406ffaebd50bd98dacb +pylint==3.3.6 \ + --hash=sha256:8b7c2d3e86ae3f94fb27703d521dd0b9b6b378775991f504d7c3a6275aa0a6a6 +pylint-venv==3.0.4 \ + --hash=sha256:31006a3df398f58f962c9e5620e756b284e8b2bc490594ce5ee5da41920cb32c +pyls-spyder==0.4.0 \ + --hash=sha256:1505d975f866a343d0554b6dab41b53717f4b4bc6df450dfd7d48f889fe450b9 +pymongo==4.10.1 \ + --hash=sha256:45ee87a4e12337353242bc758accc7fb47a2f2d9ecc0382a61e64c8f01e86708 +pympler==1.1 \ + --hash=sha256:5b223d6027d0619584116a0cbc28e8d2e378f7a79c1e5e024f9ff3b673c58506 +pynacl==1.5.0 \ + --hash=sha256:20f42270d27e1b6a29f54032090b972d97f0a1b0948cc52392041ef7831fee93 +pynndescent==0.5.13 \ + --hash=sha256:69aabb8f394bc631b6ac475a1c7f3994c54adf3f51cd63b2730fefba5771b949 +pyodbc==5.2.0 \ + --hash=sha256:96d3127f28c0dacf18da7ae009cd48eac532d3dcc718a334b86a3c65f6a5ef5c +pyogrio==0.10.0 \ + --hash=sha256:02e54bcfb305af75f829044b0045f74de31b77c2d6546f7aaf96822066147848 +pyomo==6.9.2 \ + --hash=sha256:13ebb2f974f97afa626c2712d4f27e09a1c3d18ca11755676b743504a76e5161 +pypandoc==1.15 \ + --hash=sha256:4ededcc76c8770f27aaca6dff47724578428eca84212a31479403a9731fc2b16 +pyparsing==3.2.3 \ + --hash=sha256:a749938e02d6fd0b59b356ca504a24982314bb090c383e3cf201c95ef7e2bfcf +pypdf==5.4.0 \ + --hash=sha256:db994ab47cadc81057ea1591b90e5b543e2b7ef2d0e31ef41a9bfe763c119dab +pyproj==3.7.0 \ + --hash=sha256:10a8dc6ec61af97c89ff032647d743f8dc023645773da42ef43f7ae1125b3509 +pyproject-hooks==1.2.0 \ + --hash=sha256:9e5c6bfa8dcc30091c74b0cf803c81fdd29d94f01992a7707bc97babb1141913 +pyqt5==5.15.11 \ + --hash=sha256:bdde598a3bb95022131a5c9ea62e0a96bd6fb28932cc1619fd7ba211531b7517 +pyqt5-qt5==5.15.2 \ + --hash=sha256:750b78e4dba6bdf1607febedc08738e318ea09e9b10aea9ff0d73073f11f6962 +pyqt5-sip==12.17.0 \ + --hash=sha256:672c209d05661fab8e17607c193bf43991d268a1eefbc2c4551fbf30fd8bb2ca +pyqtgraph==0.13.7 \ + --hash=sha256:7754edbefb6c367fa0dfb176e2d0610da3ada20aa7a5318516c74af5fb72bf7a +pyqtwebengine==5.15.7 \ + --hash=sha256:bd5e8c426d6f6b352cd15800d64a89b2a4a11e098460b818c7bdcf5e5612e44f +pyqtwebengine-qt5==5.15.2 \ + --hash=sha256:24231f19e1595018779977de6722b5c69f3d03f34a5f7574ff21cd1e764ef76d +pyserial==3.5 \ + --hash=sha256:c4451db6ba391ca6ca299fb3ec7bae67a5c55dde170964c7a14ceefec02f2cf0 +pysocks==1.7.1 \ + --hash=sha256:2725bd0a9925919b9b51739eea5f9e2bae91e83288108a9ad338b2e3a4435ee5 +pyspnego==0.11.2 \ + --hash=sha256:74abc1fb51e59360eb5c5c9086e5962174f1072c7a50cf6da0bda9a4bcfdfbd4 +pytest==8.3.5 \ + --hash=sha256:c69214aa47deac29fad6c2a4f590b9c4a9fdb16a403176fe154b79c0b4d4d820 +python-barcode==0.15.1 \ + --hash=sha256:057636fba37369c22852410c8535b36adfbeb965ddfd4e5b6924455d692e0886 +python-dateutil==2.8.2 \ + --hash=sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9 +python-dotenv==1.1.0 \ + --hash=sha256:d7c01d9e2293916c18baf562d95698754b0dbbb5e74d457c45d4f6561fb9d55d +python-json-logger==3.3.0 \ + --hash=sha256:dd980fae8cffb24c13caf6e158d3d61c0d6d22342f932cb6e9deedab3d35eec7 +python-lsp-black==2.0.0 \ + --hash=sha256:d5efdee45f5fa9e5241f5d4d396cd46127f45c85817916b1fd92c2986652bf7e +python-lsp-jsonrpc==1.1.2 \ + --hash=sha256:7339c2e9630ae98903fdaea1ace8c47fba0484983794d6aafd0bd8989be2b03c +python-lsp-server==1.12.2 \ + --hash=sha256:750116459449184ba20811167cdf96f91296ae12f1f65ebd975c5c159388111b +python-multipart==0.0.20 \ + --hash=sha256:8a62d3a8335e06589fe01f2a3e178cdcc632f3fbe0d492ad9ee0ec35aab1f104 +python-slugify==8.0.4 \ + --hash=sha256:276540b79961052b66b7d116620b36518847f52d5fd9e3a70164fc8c50faa6b8 +pythonqwt==0.14.5 \ + --hash=sha256:be5a9d2e1ba22aaa02eb397c5b3b5e4e1d9ed2c08f45554d8b920d8fc3be6dc7 +pytoolconfig==1.3.1 \ + --hash=sha256:5d8cea8ae1996938ec3eaf44567bbc5ef1bc900742190c439a44a704d6e1b62b +pytz==2025.2 \ + --hash=sha256:5ddf76296dd8c44c26eb8f4b6f35488f3ccbf6fbbd7adee0b7262d43f0ec2f00 +pyuca==1.2 \ + --hash=sha256:abaa12e1bd2c7c68ca8396ff8383bc0654a739cef3ae68fd7af58bf29af0a91e +pyusb==1.3.1 \ + --hash=sha256:bf9b754557af4717fe80c2b07cc2b923a9151f5c08d17bdb5345dac09d6a0430 +pyviz-comms==3.0.4 \ + --hash=sha256:a40d17db26ec13cf975809633804e712bd24b473e77388c193c44043f85d0b25 +pywavelets==1.8.0 \ + --hash=sha256:4dbebcfd55ea8a85b7fc8802d411e75337170422abf6e96019d7e46c394e80e5 +pywin32==310 \ + --hash=sha256:667827eb3a90208ddbdcc9e860c81bde63a135710e21e4cb3348968e4bd5249e +pywin32-ctypes==0.2.3 \ + --hash=sha256:8a1513379d709975552d202d942d9837758905c8d01eb82b8bcc30918929e7b8 +pywinpty==2.0.15 \ + --hash=sha256:ab5920877dd632c124b4ed17bc6dd6ef3b9f86cd492b963ffdb1a67b85b0f408 +pyyaml==6.0.2 \ + --hash=sha256:8388ee1976c416731879ac16da0aff3f63b286ffdd57cdeb95f3f2e085687563 +pyzmq==26.4.0 \ + --hash=sha256:23ecc9d241004c10e8b4f49d12ac064cd7000e1643343944a10df98e57bc544b +qdarkstyle==3.2.3 \ + --hash=sha256:ea980ee426d594909cf1058306832af71ff6cbad6f69237b036d1550635aefbc +qdldl==0.1.7.post5 \ + --hash=sha256:cc9be378e7bec67d4c62b7fa27cafb4f77d3e5e059d753c3dce0a5ae1ef5fea0 +qrcode==8.0 \ + --hash=sha256:9fc05f03305ad27a709eb742cf3097fa19e6f6f93bb9e2f039c0979190f6f1b1 +qstylizer==0.2.4 \ + --hash=sha256:8f384dfe86f9edb0bb596b93663a51f124f0794b94fd54057cc7cf9cea59fb6f +qtawesome==1.4.0 \ + --hash=sha256:a4d689fa071c595aa6184171ce1f0f847677cb8d2db45382c43129f1d72a3d93 +qtconsole==5.6.1 \ + --hash=sha256:3d22490d9589bace566ad4f3455b61fa2209156f40e87e19e2c3cb64e9264950 +qtpy==2.4.3 \ + --hash=sha256:72095afe13673e017946cc258b8d5da43314197b741ed2890e563cf384b51aa1 +quantecon==0.7.2 \ + --hash=sha256:d1333ca7bc3046efe3655d9eeeefb299051b00870b8608cb5bc0b88e3bdb8b67 +quart==0.20.0 \ + --hash=sha256:003c08f551746710acb757de49d9b768986fd431517d0eb127380b656b98b8f1 +rapidfuzz==3.13.0 \ + --hash=sha256:9a7c6232be5f809cd39da30ee5d24e6cadd919831e6020ec6c2391f4c3bc9264 +readme-renderer==44.0 \ + --hash=sha256:2fbca89b81a08526aadf1357a8c2ae889ec05fb03f5da67f9769c9a592166151 +redis==5.2.1 \ + --hash=sha256:ee7e1056b9aea0f04c6c2ed59452947f34c4940ee025f5dd83e6a6418b6989e4 +referencing==0.36.2 \ + --hash=sha256:e8699adbbf8b5c7de96d8ffa0eb5c158b3beafce084968e2ea8bb08c6794dcd0 +regex==2024.11.6 \ + --hash=sha256:2b3361af3198667e99927da8b84c1b010752fa4b1115ee30beaa332cabc3ef1a +reportlab==4.3.1 \ + --hash=sha256:0f37dd16652db3ef84363cf744632a28c38bd480d5bf94683466852d7bb678dd +requests==2.32.3 \ + --hash=sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6 +requests-ntlm==1.3.0 \ + --hash=sha256:4c7534a7d0e482bb0928531d621be4b2c74ace437e88c5a357ceb7452d25a510 +requests-toolbelt==1.0.0 \ + --hash=sha256:cccfdd665f0a24fcf4726e690f65639d272bb0637b9b92dfd91a5568ccf6bd06 +rfc3339-validator==0.1.4 \ + --hash=sha256:24f6ec1eda14ef823da9e36ec7113124b39c04d50a4d3d3a3c2859577e7791fa +rfc3986==2.0.0 \ + --hash=sha256:50b1502b60e289cb37883f3dfd34532b8873c7de9f49bb546641ce9cbd256ebd +rfc3986-validator==0.1.1 \ + --hash=sha256:2f235c432ef459970b4306369336b9d5dbdda31b510ca1e327636e01f528bfa9 +rich==14.0.0 \ + --hash=sha256:1c9491e1951aac09caffd42f448ee3d04e58923ffe14993f6e83068dc395d7e0 +rope==1.13.0 \ + --hash=sha256:b435a0c0971244fdcd8741676a9fae697ae614c20cc36003678a7782f25c0d6c +rpds-py==0.24.0 \ + --hash=sha256:6eea559077d29486c68218178ea946263b87f1c41ae7f996b1f30a983c476a5a +rsa==4.7.2 \ + --hash=sha256:78f9a9bf4e7be0c5ded4583326e7461e3a3c5aae24073648b4bdfa797d78c9d2 +rtree==1.4.0 \ + --hash=sha256:ba83efc7b7563905b1bfdfc14490c4bfb59e92e5e6156bdeb6ec5df5117252f4 +rx==3.2.0 \ + --hash=sha256:922c5f4edb3aa1beaa47bf61d65d5380011ff6adcd527f26377d05cb73ed8ec8 +scikit-image==0.25.2 \ + --hash=sha256:64785a8acefee460ec49a354706db0b09d1f325674107d7fa3eadb663fb56d6f +scikit-learn==1.6.1 \ + --hash=sha256:7a1c43c8ec9fde528d664d947dc4c0789be4077a3647f232869f41d9bf50e0fb +scipy==1.15.3 \ + --hash=sha256:b90ab29d0c37ec9bf55424c064312930ca5f4bde15ee8619ee44e69319aab163 +scramp==1.4.5 \ + --hash=sha256:50e37c464fc67f37994e35bee4151e3d8f9320e9c204fca83a5d313c121bbbe7 +scs==3.2.7.post2 \ + --hash=sha256:a2c48cd19e39bf87dae0b20a289fff44930458fc2ca2afa0f899058dc41e5545 +seaborn==0.13.2 \ + --hash=sha256:636f8336facf092165e27924f223d3c62ca560b1f2bb5dff7ab7fad265361987 +send2trash==1.8.3 \ + --hash=sha256:0c31227e0bd08961c7665474a3d1ef7193929fedda4233843689baa056be46c9 +setuptools==79.0.1 \ + --hash=sha256:e147c0549f27767ba362f9da434eab9c5dc0045d5304feb602a0af001089fc51 +shapely==2.1.0 \ + --hash=sha256:1dc8d4364483a14aba4c844b7bd16a6fa3728887e2c33dfa1afa34a3cf4d08a5 +shellingham==1.5.4 \ + --hash=sha256:7ecfff8f2fd72616f7481040475a65b2bf8af90a56c89140852d1120324e8686 +simplejson==3.19.3 \ + --hash=sha256:3bbcdc438dc1683b35f7a8dc100960c721f922f9ede8127f63bed7dfded4c64c +simpy==4.1.1 \ + --hash=sha256:7c5ae380240fd2238671160e4830956f8055830a8317edf5c05e495b3823cd88 +six==1.17.0 \ + --hash=sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274 +sklearn-compat==0.1.3 \ + --hash=sha256:a8aaf8ef711988cbd63f187c5560b5f16b25df663aaa1d2d0e1291341d339f80 +skrub==0.5.3 \ + --hash=sha256:b6ba417fa83d1f7e9a69656e0860b061381b9bd19808692a2b5bef8588c72775 +smmap==5.0.2 \ + --hash=sha256:b30115f0def7d7531d22a0fb6502488d879e75b260a9db4d0819cfb25403af5e +sniffio==1.3.1 \ + --hash=sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2 +snowballstemmer==2.2.0 \ + --hash=sha256:c8e1716e83cc398ae16824e5572ae04e0d9fc2c6b985fb0f900f5f0c96ecba1a +sortedcontainers==2.4.0 \ + --hash=sha256:a163dcaede0f1c021485e957a39245190e74249897e2ae4b2aa38595db237ee0 +sounddevice==0.5.1 \ + --hash=sha256:4313b63f2076552b23ac3e0abd3bcfc0c1c6a696fc356759a13bd113c9df90f1 +soupsieve==2.6 \ + --hash=sha256:e72c4ff06e4fb6e4b5a9f0f55fe6e81514581fca1515028625d0f299c602ccc9 +sphinx==8.1.3 \ + --hash=sha256:09719015511837b76bf6e03e42eb7595ac8c2e41eeb9c29c5b755c6b677992a2 +sphinx-rtd-theme==3.0.2 \ + --hash=sha256:422ccc750c3a3a311de4ae327e82affdaf59eb695ba4936538552f3b00f4ee13 +sphinxcontrib-applehelp==2.0.0 \ + --hash=sha256:4cd3f0ec4ac5dd9c17ec65e9ab272c9b867ea77425228e68ecf08d6b28ddbdb5 +sphinxcontrib-devhelp==2.0.0 \ + --hash=sha256:aefb8b83854e4b0998877524d1029fd3e6879210422ee3780459e28a1f03a8a2 +sphinxcontrib-htmlhelp==2.1.0 \ + --hash=sha256:166759820b47002d22914d64a075ce08f4c46818e17cfc9470a9786b759b19f8 +sphinxcontrib-jquery==4.1 \ + --hash=sha256:f936030d7d0147dd026a4f2b5a57343d233f1fc7b363f68b3d4f1cb0993878ae +sphinxcontrib-jsmath==1.0.1 \ + --hash=sha256:2ec2eaebfb78f3f2078e73666b1415417a116cc848b72e5172e596c871103178 +sphinxcontrib-qthelp==2.0.0 \ + --hash=sha256:b18a828cdba941ccd6ee8445dbe72ffa3ef8cbe7505d8cd1fa0d42d3f2d5f3eb +sphinxcontrib-serializinghtml==2.0.0 \ + --hash=sha256:6e2cb0eef194e10c27ec0023bfeb25badbbb5868244cf5bc5bdc04e4464bf331 +spyder==6.0.7 \ + --hash=sha256:b725569bb8ddc7b0aab73d747d85312dc0456978370cc0f9b1a101c0fe4f076b +spyder-kernels==3.0.5 \ + --hash=sha256:9cc808e0ec4426b9ba911128e221fa2234e6c8d6e08526132e90112ff9c2bb7c +sqlalchemy==2.0.40 \ + --hash=sha256:641ee2e0834812d657862f3a7de95e0048bdcb6c55496f39c6fa3d435f6ac6ad +sqlite-bro==0.13.1 \ + --hash=sha256:c26033b0af133049ca578b5fd30b2372f002e7ff934b39774aa4d2da7638c23d +sqlite-fts4==1.0.3 \ + --hash=sha256:0359edd8dea6fd73c848989e1e2b1f31a50fe5f9d7272299ff0e8dbaa62d035f +sqlite-utils==3.38 \ + --hash=sha256:8a27441015c3b2ef475f555861f7a2592f73bc60d247af9803a11b65fc605bf9 +sqlparse==0.5.3 \ + --hash=sha256:cf2196ed3418f3ba5de6af7e82c694a9fbdbfecccdfc72e281548517081f16ca +squarify==0.4.4 \ + --hash=sha256:d7597724e29d48aa14fd2f551060d6b09e1f0a67e4cd3ea329fe03b4c9a56f11 +sse-starlette==2.2.1 \ + --hash=sha256:6410a3d3ba0c89e7675d4c273a301d64649c03a5ef1ca101f10b47f895fd0e99 +sspilib==0.2.0 \ + --hash=sha256:c39a698491f43618efca8776a40fb7201d08c415c507f899f0df5ada15abefaa +stack-data==0.6.3 \ + --hash=sha256:d5558e0c25a4cb0853cddad3d77da9891a08cb85dd9f9f91b9f8cd66e511e695 +starlette==0.46.2 \ + --hash=sha256:595633ce89f8ffa71a015caed34a5b2dc1c0cdb3f0f1fbd1e69339cf2abeec35 +statsmodels==0.14.4 \ + --hash=sha256:81030108d27aecc7995cac05aa280cf8c6025f6a6119894eef648997936c2dd0 +streamlit==1.46.0 \ + --hash=sha256:f8624acabafcf18611a0fac2635cf181a7ba922b45bd131ae15fc8f80e1a5482 +superqt==0.7.3 \ + --hash=sha256:8f7d141665b31baa484747f324fc9fc2d14223f2fefc92ffed6ea35c92221304 +sv-ttk==2.6.0 \ + --hash=sha256:4319c52edf2e14732fe84bdc9788e26f9e9a1ad79451ec0f89f0120ffc8105d9 +sympy==1.14.0 \ + --hash=sha256:e091cc3e99d2141a0ba2847328f5479b05d94a6635cb96148ccb3f34671bd8f5 +tabulate==0.9.0 \ + --hash=sha256:024ca478df22e9340661486f85298cff5f6dcdba14f3813e8830015b9ed1948f +tblib==3.1.0 \ + --hash=sha256:670bb4582578134b3d81a84afa1b016128b429f3d48e6cbbaecc9d15675e984e +tenacity==9.1.2 \ + --hash=sha256:f77bf36710d8b73a50b2dd155c97b870017ad21afe6ab300326b0371b3b05138 +termcolor==3.1.0 \ + --hash=sha256:591dd26b5c2ce03b9e43f391264626557873ce1d379019786f99b0c2bee140aa +terminado==0.18.1 \ + --hash=sha256:a4468e1b37bb318f8a86514f65814e1afc977cf29b3992a4500d9dd305dcceb0 +text-unidecode==1.3 \ + --hash=sha256:1311f10e8b895935241623731c2ba64f4c455287888b18189350b67134a822e8 +textdistance==4.6.3 \ + --hash=sha256:0cb1b2cc8e3339ddc3e0f8c870e49fb49de6ecc42a718917308b3c971f34aa56 +thefuzz==0.22.1 \ + --hash=sha256:59729b33556850b90e1093c4cf9e618af6f2e4c985df193fdf3c5b5cf02ca481 +threadpoolctl==3.6.0 \ + --hash=sha256:43a0b8fd5a2928500110039e43a5eed8480b918967083ea48dc3ab9f13c4a7fb +three-merge==0.1.1 \ + --hash=sha256:dd219f4696aa0bbec6099ac3528b4de0450ff9bde862dd8f6d6f52e745f83464 +tifffile==2025.3.30 \ + --hash=sha256:0ed6eee7b66771db2d1bfc42262a51b01887505d35539daef118f4ff8c0f629c +tiktoken==0.9.0 \ + --hash=sha256:5ea0edb6f83dc56d794723286215918c1cde03712cbbafa0348b33448faf5b95 +tinycss2==1.4.0 \ + --hash=sha256:3a49cf47b7675da0b15d0c6e1df8df4ebd96e9394bb905a5775adb0d884c5289 +tokenizers==0.21.1 \ + --hash=sha256:0f0dcbcc9f6e13e675a66d7a5f2f225a736745ce484c1a4e07476a89ccdad382 +toml==0.10.2 \ + --hash=sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b +tomli==2.2.1 \ + --hash=sha256:a38aa0308e754b0e3c67e344754dff64999ff9b513e691d0e786265c93583c69 +tomli-w==1.2.0 \ + --hash=sha256:188306098d013b691fcadc011abd66727d3c414c571bb01b1a174ba8c983cf90 +tomlkit==0.13.2 \ + --hash=sha256:7a974427f6e119197f670fbbbeae7bef749a6c14e793db934baefc1b5f03efde +toolz==1.0.0 \ + --hash=sha256:292c8f1c4e7516bf9086f8850935c799a874039c8bcf959d47b600e4c44a6236 +tornado==6.5.1 \ + --hash=sha256:908e7d64567cecd4c2b458075589a775063453aeb1d2a1853eedb806922f568b +tqdm==4.67.1 \ + --hash=sha256:26445eca388f82e72884e0d580d5464cd801a3ea01e63e5601bdff9ba6a48de2 +traitlets==5.14.3 \ + --hash=sha256:b74e89e397b1ed28cc831db7aea759ba6640cb3de13090ca145426688ff1ac4f +traittypes==0.2.1 \ + --hash=sha256:1340af133810b6eee1a2eb2e988f862b0d12b6c2d16f282aaf3207b782134c2e +trio==0.30.0 \ + --hash=sha256:3bf4f06b8decf8d3cf00af85f40a89824669e2d033bb32469d34840edcfc22a5 +trove-classifiers==2025.5.9.12 \ + --hash=sha256:e381c05537adac78881c8fa345fd0e9970159f4e4a04fcc42cfd3129cca640ce +twine==6.1.0 \ + --hash=sha256:a47f973caf122930bf0fbbf17f80b83bc1602c9ce393c7845f289a3001dc5384 +typer==0.15.2 \ + --hash=sha256:46a499c6107d645a9c13f7ee46c5d5096cae6f5fc57dd11eccbbb9ae3e44ddfc +types-python-dateutil==2.9.0.20240316 \ + --hash=sha256:6b8cb66d960771ce5ff974e9dd45e38facb81718cc1e208b10b1baccbfdbee3b +types-requests==2.32.0.20250328 \ + --hash=sha256:72ff80f84b15eb3aa7a8e2625fffb6a93f2ad5a0c20215fc1dcfa61117bcb2a2 +typing-extensions==4.13.2 \ + --hash=sha256:a439e7c04b49fec3e5d3e2beaa21755cadbbdc391694e28ccdd36ca4a1408f8c +typing-inspection==0.4.0 \ + --hash=sha256:50e72559fcd2a6367a19f7a7e610e6afcb9fac940c650290eed893d61386832f +tzdata==2025.2 \ + --hash=sha256:1a403fada01ff9221ca8044d701868fa132215d84beb92242d9acd2147f667a8 +tzlocal==5.3.1 \ + --hash=sha256:eb1a66c3ef5847adf7a834f1be0800581b683b5608e74f86ecbcef8ab91bb85d +uc-micro-py==1.0.3 \ + --hash=sha256:db1dffff340817673d7b466ec86114a9dc0e9d4d9b5ba229d9d60e5c12600cd5 +ujson==5.10.0 \ + --hash=sha256:4573fd1695932d4f619928fd09d5d03d917274381649ade4328091ceca175539 +umap-learn==0.5.7 \ + --hash=sha256:6a7e0be2facfa365a5ed6588447102bdbef32a0ef449535c25c97ea7e680073c +uncertainties==3.2.2 \ + --hash=sha256:fd8543355952f4052786ed4150acaf12e23117bd0f5bd03ea07de466bce646e7 +uri-template==1.3.0 \ + --hash=sha256:a44a133ea12d44a0c0f06d7d42a52d71282e77e2f937d8abd5655b8d56fc1363 +urllib3==2.4.0 \ + --hash=sha256:4e16665048960a0900c702d4a66415956a584919c03361cac9f1df5c5dd7e813 +uvicorn==0.34.2 \ + --hash=sha256:deb49af569084536d269fe0a6d67e3754f104cf03aba7c11c40f01aadf33c403 +vega-datasets==0.9.0 \ + --hash=sha256:3d7c63917be6ca9b154b565f4779a31fedce57b01b5b9d99d8a34a7608062a1d +waitress==3.0.0 \ + --hash=sha256:2a06f242f4ba0cc563444ca3d1998959447477363a2d7e9b8b4d75d35cfd1669 +watchdog==6.0.0 \ + --hash=sha256:cbafb470cf848d93b5d013e2ecb245d4aa1c8fd0504e863ccefa32445359d680 +wcwidth==0.2.13 \ + --hash=sha256:3da69048e4540d84af32131829ff948f1e022c1c6bdb8d6102117aac784f6859 +webcolors==24.11.1 \ + --hash=sha256:515291393b4cdf0eb19c155749a096f779f7d909f7cceea072791cb9095b92e9 +webencodings==0.5.1 \ + --hash=sha256:a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78 +websocket-client==1.8.0 \ + --hash=sha256:17b44cc997f5c498e809b22cdf2d9c7a9e71c02c8cc2b6c56e7c2d1239bfa526 +websockets==14.2 \ + --hash=sha256:b439ea828c4ba99bb3176dc8d9b933392a2413c0f6b149fdcba48393f573377f +werkzeug==3.1.3 \ + --hash=sha256:54b78bf3716d19a65be4fceccc0d1d7b89e608834989dfae50ea87564639213e +whatthepatch==1.0.7 \ + --hash=sha256:1b6f655fd31091c001c209529dfaabbabdbad438f5de14e3951266ea0fc6e7ed +wheel==0.45.1 \ + --hash=sha256:708e7481cc80179af0e556bbf0cc00b8444c7321e2700b8d8580231d13017248 +widgetsnbextension==4.0.14 \ + --hash=sha256:4875a9eaf72fbf5079dc372a51a9f268fc38d46f767cbf85c43a36da5cb9b575 +wordcloud==1.9.4 \ + --hash=sha256:8c9a5af2fbcf029a19e827adbee58e86efe7536dca7a42380a8601113a86069b +wrapt==1.16.0 \ + --hash=sha256:6906c4100a8fcbf2fa735f6059214bb13b97f75b1a61777fcf6432121ef12ef1 +wsproto==1.2.0 \ + --hash=sha256:b9acddd652b585d75b20477888c56642fdade28bdfd3579aa24a4d2c037dd736 +xarray==2025.4.0 \ + --hash=sha256:b27defd082c5cb85d32c695708de6bb05c2838fb7caaf3f952982e602a35b9b8 +xlsxwriter==3.2.3 \ + --hash=sha256:593f8296e8a91790c6d0378ab08b064f34a642b3feb787cf6738236bd0a4860d +xyzservices==2023.10.1 \ + --hash=sha256:6a4c38d3a9f89d3e77153eff9414b36a8ee0850c9e8b85796fd1b2a85b8dfd68 +yapf==0.40.1 \ + --hash=sha256:b8bfc1f280949153e795181768ca14ef43d7312629a06c43e7abd279323af313 +yarl==1.18.3 \ + --hash=sha256:578e281c393af575879990861823ef19d66e2b1d0098414855dd367e234f5b3c +yt-dlp==2025.2.19 \ + --hash=sha256:3ed218eaeece55e9d715afd41abc450dc406ee63bf79355169dfde312d38fdb8 +zict==3.0.0 \ + --hash=sha256:5796e36bd0e0cc8cf0fbc1ace6a68912611c1dbd74750a3f3026b9b9d6a327ae +zipp==3.21.0 \ + --hash=sha256:ac1bbe05fd2991f160ebce24ffbac5f6d11d83dc90891255885223d42b3cd931 +zstandard==0.23.0 \ + --hash=sha256:f3513916e8c645d0610815c257cbfd3242adfd5c4cfa78be514e5a3ebb42a41b From 9f94cda3aa00e86f2643a073215a1e8e30d33e31 Mon Sep 17 00:00:00 2001 From: stonebig Date: Sat, 28 Jun 2025 17:19:44 +0200 Subject: [PATCH 248/305] make pseudo-wheel part of winpython a true wheel 'wppm' looks the needed direction towards pure pylock.toml --- make.py | 10 +- ...directory_and_userprofile_be_winpython.bat | 4 +- ...ake_working_directory_be_not_winpython.bat | 4 +- .../make_working_directory_be_winpython.bat | 2 +- portable/scripts/upgrade_pip.bat | 2 +- pyproject.toml | 8 +- {winpython => wppm}/__init__.py | 66 +- {winpython => wppm}/associate.py | 600 ++++++------- {winpython => wppm}/diff.py | 0 {winpython => wppm}/hash.py | 0 {winpython => wppm}/packagemetadata.py | 0 {winpython => wppm}/piptree.py | 0 {winpython => wppm}/utils.py | 626 +++++++------- {winpython => wppm}/wheelhouse.py | 0 {winpython => wppm}/wppm.py | 810 +++++++++--------- 15 files changed, 1066 insertions(+), 1066 deletions(-) rename {winpython => wppm}/__init__.py (95%) rename {winpython => wppm}/associate.py (97%) rename {winpython => wppm}/diff.py (100%) rename {winpython => wppm}/hash.py (100%) rename {winpython => wppm}/packagemetadata.py (100%) rename {winpython => wppm}/piptree.py (100%) rename {winpython => wppm}/utils.py (97%) rename {winpython => wppm}/wheelhouse.py (100%) rename {winpython => wppm}/wppm.py (98%) diff --git a/make.py b/make.py index ec75c078..651cb458 100644 --- a/make.py +++ b/make.py @@ -12,7 +12,7 @@ import subprocess import sys from pathlib import Path -from winpython import wppm, utils, diff +from wppm import wppm, utils, diff # Define constant paths for clarity CHANGELOGS_DIRECTORY = Path(__file__).parent / "changelogs" @@ -222,7 +222,7 @@ def build(self, rebuild: bool = True, requirements_files_list=None, winpy_dirnam utils.python_execmodule("ensurepip", self.distribution.target) self.distribution.patch_standard_packages("pip") - essential_packages = ["pip", "setuptools", "wheel", "winpython"] + essential_packages = ["pip", "setuptools", "wheel", "wppm"] for package_name in essential_packages: actions = ["install", "--upgrade", "--pre", package_name] + self.install_options self._print_action(f"Piping: {' '.join(actions)}") @@ -247,8 +247,8 @@ def build(self, rebuild: bool = True, requirements_files_list=None, winpy_dirnam diff.write_changelog(self.winpyver2, None, CHANGELOGS_DIRECTORY, self.flavor, self.distribution.architecture, basedir=self.winpython_directory.parent) def rebuild_winpython_package(source_directory: Path, target_directory: Path, architecture: int = 64, verbose: bool = False): - """Rebuilds the winpython package from source using flit.""" - for file in target_directory.glob("winpython-*"): + """Rebuilds the winpython or wppm package from source using flit.""" + for file in target_directory.glob("w*p*-*.*"): if file.suffix in (".exe", ".whl", ".gz"): file.unlink() utils.buildflit_wininst(source_directory, copy_to=target_directory, verbose=True) @@ -295,7 +295,7 @@ def make_all(build_number: int, release_level: str, pyver: str, architecture: in os.makedirs(build_directory, exist_ok=True) # use source_dirs as the directory to re-build Winpython wheel winpython_source_dir = Path(__file__).resolve().parent - rebuild_winpython_package(winpython_source_dir, Path(source_dirs), architecture, verbose) + # 2025-06-28 no more: rebuild_winpython_package(winpython_source_dir, Path(source_dirs), architecture, verbose) builder = WinPythonDistributionBuilder( build_number, release_level, build_directory, wheels_directory=source_dirs, diff --git a/portable/scripts/make_working_directory_and_userprofile_be_winpython.bat b/portable/scripts/make_working_directory_and_userprofile_be_winpython.bat index 2806dc14..489aef0b 100644 --- a/portable/scripts/make_working_directory_and_userprofile_be_winpython.bat +++ b/portable/scripts/make_working_directory_and_userprofile_be_winpython.bat @@ -1,3 +1,3 @@ call "%~dp0env_for_icons.bat" -"%PYTHON%" -c "from winpython.utils import patch_sourcefile;patch_sourcefile(r'%~dp0..\settings\winpython.ini', '[active_environment', '[inactive_environment' )" -"%PYTHON%" -c "from winpython.utils import patch_sourcefile;patch_sourcefile(r'%~dp0..\settings\winpython.ini', '[inactive_environment_common]', '[active_environment_common]' )" \ No newline at end of file +"%PYTHON%" -c "from wppm.utils import patch_sourcefile;patch_sourcefile(r'%~dp0..\settings\winpython.ini', '[active_environment', '[inactive_environment' )" +"%PYTHON%" -c "from wppm.utils import patch_sourcefile;patch_sourcefile(r'%~dp0..\settings\winpython.ini', '[inactive_environment_common]', '[active_environment_common]' )" \ No newline at end of file diff --git a/portable/scripts/make_working_directory_be_not_winpython.bat b/portable/scripts/make_working_directory_be_not_winpython.bat index 759de71d..7a726169 100644 --- a/portable/scripts/make_working_directory_be_not_winpython.bat +++ b/portable/scripts/make_working_directory_be_not_winpython.bat @@ -1,3 +1,3 @@ call "%~dp0env_for_icons.bat" -"%PYTHON%" -c "from winpython.utils import patch_sourcefile;patch_sourcefile(r'%~dp0..\settings\winpython.ini', '[active_environment', '[inactive_environment' )" -"%PYTHON%" -c "from winpython.utils import patch_sourcefile;patch_sourcefile(r'%~dp0..\settings\winpython.ini', '[inactive_environment_per_user]', '[active_environment_per_user]' )" \ No newline at end of file +"%PYTHON%" -c "from wppm.utils import patch_sourcefile;patch_sourcefile(r'%~dp0..\settings\winpython.ini', '[active_environment', '[inactive_environment' )" +"%PYTHON%" -c "from wppm.utils import patch_sourcefile;patch_sourcefile(r'%~dp0..\settings\winpython.ini', '[inactive_environment_per_user]', '[active_environment_per_user]' )" \ No newline at end of file diff --git a/portable/scripts/make_working_directory_be_winpython.bat b/portable/scripts/make_working_directory_be_winpython.bat index bcdd3c45..0f422a4e 100644 --- a/portable/scripts/make_working_directory_be_winpython.bat +++ b/portable/scripts/make_working_directory_be_winpython.bat @@ -1,2 +1,2 @@ call "%~dp0env_for_icons.bat" -"%PYTHON%" -c "from winpython.utils import patch_sourcefile;patch_sourcefile(r'%~dp0..\settings\winpython.ini', '[active_environment', '[inactive_environment' )" +"%PYTHON%" -c "from wppm.utils import patch_sourcefile;patch_sourcefile(r'%~dp0..\settings\winpython.ini', '[active_environment', '[inactive_environment' )" diff --git a/portable/scripts/upgrade_pip.bat b/portable/scripts/upgrade_pip.bat index da212592..4443ed16 100644 --- a/portable/scripts/upgrade_pip.bat +++ b/portable/scripts/upgrade_pip.bat @@ -3,5 +3,5 @@ call "%~dp0env.bat" echo this will upgrade pip with latest version, then patch it for WinPython portability ok ? pause "%WINPYDIR%\python.exe" -m pip install --upgrade pip -"%WINPYDIR%\python.exe" -c "from winpython import wppm;dist=wppm.Distribution(r'%WINPYDIR%');dist.patch_standard_packages('pip', to_movable=True) +"%WINPYDIR%\python.exe" -c "from wppm import wppm;dist=wppm.Distribution(r'%WINPYDIR%');dist.patch_standard_packages('pip', to_movable=True) pause \ No newline at end of file diff --git a/pyproject.toml b/pyproject.toml index 2e96abec..4460ae5a 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -3,13 +3,13 @@ requires = ["flit_core"] build-backend = "flit_core.buildapi" [project] -name = "winpython" +name = "wppm" authors = [ {name = "Pierre Raybaut"}, {name = "stonebig"}, ] dependencies = [] -requires-python = ">=3.8" +requires-python = ">=3.10" readme = "README.rst" license = {file = "LICENSE"} classifiers=[ @@ -25,7 +25,7 @@ classifiers=[ 'Topic :: Software Development :: Widget Sets', ] dynamic = ["version",] -description="WinPython distribution tools, including WPPM" +description="WinPython Package Management" keywords = ["Portable","Windows"] [project.urls] @@ -33,4 +33,4 @@ Documentation = "https://winpython.github.io/" Source = "https://github.com/winpython/winpython" [project.scripts] -wppm = "winpython.wppm:main" +wppm = "wppm.wppm:main" diff --git a/winpython/__init__.py b/wppm/__init__.py similarity index 95% rename from winpython/__init__.py rename to wppm/__init__.py index b6c1d768..16dcd6d5 100644 --- a/winpython/__init__.py +++ b/wppm/__init__.py @@ -1,33 +1,33 @@ -# -*- coding: utf-8 -*- -""" -WinPython License Agreement (MIT License) ------------------------------------------ - -Copyright (c) 2012-2013 Pierre Raybaut -Copyright (c) 2014-2025+ The Winpython development team https://github.com/winpython/ - -Permission is hereby granted, free of charge, to any person -obtaining a copy of this software and associated documentation -files (the "Software"), to deal in the Software without -restriction, including without limitation the rights to use, -copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the -Software is furnished to do so, subject to the following -conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES -OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT -HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, -WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR -OTHER DEALINGS IN THE SOFTWARE. -""" - -__version__ = '16.6.20250620' -__license__ = __doc__ -__project_url__ = 'http://winpython.github.io/' +# -*- coding: utf-8 -*- +""" +WinPython License Agreement (MIT License) +----------------------------------------- + +Copyright (c) 2012-2013 Pierre Raybaut +Copyright (c) 2014-2025+ The Winpython development team https://github.com/winpython/ + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. +""" + +__version__ = '17.0.20250628' +__license__ = __doc__ +__project_url__ = 'http://winpython.github.io/' diff --git a/winpython/associate.py b/wppm/associate.py similarity index 97% rename from winpython/associate.py rename to wppm/associate.py index 894d8bda..9e02182b 100644 --- a/winpython/associate.py +++ b/wppm/associate.py @@ -1,300 +1,300 @@ -# -*- coding: utf-8 -*- -# -# associate.py = Register a Python distribution -# Copyright © 2012 Pierre Raybaut -# Licensed under the terms of the MIT License -# (see winpython/__init__.py for details) - -import sys -import os -from pathlib import Path -import importlib.util -import winreg -from . import utils -from argparse import ArgumentParser - -def get_special_folder_path(path_name): - """Return special folder path.""" - from win32com.shell import shell, shellcon - try: - csidl = getattr(shellcon, path_name) - return shell.SHGetSpecialFolderPath(0, csidl, False) - except OSError: - print(f"{path_name} is an unknown path ID") - -def get_winpython_start_menu_folder(current=True): - """Return WinPython Start menu shortcuts folder.""" - folder = get_special_folder_path("CSIDL_PROGRAMS") - if not current: - try: - folder = get_special_folder_path("CSIDL_COMMON_PROGRAMS") - except OSError: - pass - return str(Path(folder) / 'WinPython') - -def remove_winpython_start_menu_folder(current=True): - """Remove WinPython Start menu folder -- remove it if it already exists""" - path = get_winpython_start_menu_folder(current=current) - if Path(path).is_dir(): - try: - shutil.rmtree(path, onexc=onerror) - except WindowsError: - print(f"Directory {path} could not be removed", file=sys.stderr) - -def create_winpython_start_menu_folder(current=True): - """Create WinPython Start menu folder.""" - path = get_winpython_start_menu_folder(current=current) - if Path(path).is_dir(): - try: - shutil.rmtree(path, onexc=onerror) - except WindowsError: - print(f"Directory {path} could not be removed", file=sys.stderr) - Path(path).mkdir(parents=True, exist_ok=True) - return path - -def create_shortcut(path, description, filename, arguments="", workdir="", iconpath="", iconindex=0, verbose=True): - """Create Windows shortcut (.lnk file).""" - import pythoncom - from win32com.shell import shell - ilink = pythoncom.CoCreateInstance(shell.CLSID_ShellLink, None, pythoncom.CLSCTX_INPROC_SERVER, shell.IID_IShellLink) - ilink.SetPath(path) - ilink.SetDescription(description) - if arguments: - ilink.SetArguments(arguments) - if workdir: - ilink.SetWorkingDirectory(workdir) - if iconpath or iconindex: - ilink.SetIconLocation(iconpath, iconindex) - # now save it. - ipf = ilink.QueryInterface(pythoncom.IID_IPersistFile) - if not filename.endswith('.lnk'): - filename += '.lnk' - if verbose: - print(f'create menu *{filename}*') - try: - ipf.Save(filename, 0) - except: - print("a fail !") - -# --- Helper functions for Registry --- - -def _set_reg_value(root, key_path, name, value, reg_type=winreg.REG_SZ, verbose=False): - """Helper to create key and set a registry value using CreateKeyEx.""" - rootkey_name = "HKEY_CURRENT_USER" if root == winreg.HKEY_CURRENT_USER else "HKEY_LOCAL_MACHINE" - if verbose: - print(f"{rootkey_name}\\{key_path}\\{name if name else ''}:{value}") - try: - # Use CreateKeyEx with context manager for automatic closing - with winreg.CreateKeyEx(root, key_path, 0, winreg.KEY_WRITE) as key: - winreg.SetValueEx(key, name, 0, reg_type, value) - except OSError as e: - print(f"Error creating/setting registry value {rootkey_name}\\{key_path}\\{name}: {e}", file=sys.stderr) - -def _delete_reg_key(root, key_path, verbose=False): - """Helper to delete a registry key, ignoring if not found.""" - rootkey_name = "HKEY_CURRENT_USER" if root == winreg.HKEY_CURRENT_USER else "HKEY_LOCAL_MACHINE" - if verbose: - print(f"{rootkey_name}\\{key_path}") - try: - # DeleteKey can only delete keys with no subkeys. - # For keys with (still) subkeys, use DeleteKeyEx on the parent key if available - winreg.DeleteKey(root, key_path) - except FileNotFoundError: - if verbose: - print(f"Registry key not found (skipping deletion): {rootkey_name}\\{key_path}") - except OSError as e: # Catch other potential errors like key not empty - print(f"Error deleting registry key {rootkey_name}\\{key_path}: {e}", file=sys.stderr) - - -# --- Helper functions for Start Menu Shortcuts --- - -def _has_pywin32(): - """Check if pywin32 (pythoncom) is installed.""" - return importlib.util.find_spec('pythoncom') is not None - -def _remove_start_menu_folder(target, current=True, has_pywin32=False): - "remove menu Folder for target WinPython if pywin32 exists" - if has_pywin32: - remove_winpython_start_menu_folder(current=current) - else: - print("Skipping start menu removal as pywin32 package is not installed.") - -def _get_shortcut_data(target, current=True, has_pywin32=False): - "get windows menu access data if pywin32 exists, otherwise empty list" - if not has_pywin32: - return [] - - wpdir = str(Path(target).parent) - data = [] - for name in os.listdir(wpdir): - bname, ext = Path(name).stem, Path(name).suffix - if ext.lower() == ".exe": - # Path for the shortcut file in the start menu folder - shortcut_name = str(Path(create_winpython_start_menu_folder(current=current)) / bname) + '.lnk' - data.append( - ( - str(Path(wpdir) / name), # Target executable path - bname, # Description/Name - shortcut_name, # Shortcut file path - ) - ) - return data - -# --- PythonCore entries (PEP-0514 and WinPython specific) --- - - -def register_in_registery(target, current=True, reg_type=winreg.REG_SZ, verbose=True) -> tuple[list[any], ...]: - """Register in Windows (like regedit)""" - - # --- Constants --- - DROP_HANDLER_CLSID = "{60254CA5-953B-11CF-8C96-00AA00B8708C}" - - # --- CONFIG --- - target_path = Path(target).resolve() - python_exe = str(target_path / "python.exe") - pythonw_exe = str(target_path / "pythonw.exe") - spyder_exe = str(target_path.parent / "Spyder.exe") - icon_py = str(target_path / "DLLs" / "py.ico") - icon_pyc = str(target_path / "DLLs" / "pyc.ico") - idle_path = str(target_path / "Lib" / "idlelib" / "idle.pyw") - doc_path = str(target_path / "Doc" / "html" / "index.html") - python_infos = utils.get_python_infos(target) # ('3.11', 64) - short_version = python_infos[0] # e.g., '3.11' - version = utils.get_python_long_version(target) # e.g., '3.11.5' - arch = f'{python_infos[1]}bit' # e.g., '64bit' - display = f"Python {version} ({arch})" - - permanent_entries = [] # key_path, name, value - dynamic_entries = [] # key_path, name, value - core_entries = [] # key_path, name, value - lost_entries = [] # intermediate keys to remove later - # --- File associations --- - ext_map = {".py": "Python.File", ".pyw": "Python.NoConFile", ".pyc": "Python.CompiledFile"} - ext_label = {".py": "Python File", ".pyw": "Python File (no console)", ".pyc": "Compiled Python File"} - for ext, ftype in ext_map.items(): - permanent_entries.append((f"Software\\Classes\\{ext}", None, ftype)) - if ext in (".py", ".pyw"): - permanent_entries.append((f"Software\\Classes\\{ext}", "Content Type", "text/plain")) - - # --- Descriptions, Icons, DropHandlers --- - for ext, ftype in ext_map.items(): - dynamic_entries.append((f"Software\\Classes\\{ftype}", None, ext_label[ext])) - dynamic_entries.append((f"Software\\Classes\\{ftype}\\DefaultIcon", None, icon_py if "Compiled" not in ftype else icon_pyc)) - dynamic_entries.append((f"Software\\Classes\\{ftype}\\shellex\\DropHandler", None, DROP_HANDLER_CLSID)) - lost_entries.append((f"Software\\Classes\\{ftype}\\shellex", None, None)) - - # --- Shell commands --- - for ext, ftype in ext_map.items(): - dynamic_entries.append((f"Software\\Classes\\{ftype}\\shell\\open\\command", None, f'''"{pythonw_exe if ftype=='Python.NoConFile' else python_exe}" "%1" %*''')) - lost_entries.append((f"Software\\Classes\\{ftype}\\shell\\open", None, None)) - lost_entries.append((f"Software\\Classes\\{ftype}\\shell", None, None)) - - dynamic_entries.append((rf"Software\Classes\Python.File\shell\Edit with IDLE\command", None, f'"{pythonw_exe}" "{idle_path}" -n -e "%1"')) - dynamic_entries.append((rf"Software\Classes\Python.NoConFile\shell\Edit with IDLE\command", None, f'"{pythonw_exe}" "{idle_path}" -n -e "%1"')) - lost_entries.append((rf"Software\Classes\Python.File\shell\Edit with IDLE", None, None)) - lost_entries.append((rf"Software\Classes\Python.NoConFile\shell\Edit with IDLE", None, None)) - - if Path(spyder_exe).exists(): - dynamic_entries.append((rf"Software\Classes\Python.File\shell\Edit with Spyder\command", None, f'"{spyder_exe}" "%1" -w "%w"')) - dynamic_entries.append((rf"Software\Classes\Python.NoConFile\shell\Edit with Spyder\command", None, f'"{spyder_exe}" "%1" -w "%w"')) - lost_entries.append((rf"Software\Classes\Python.File\shell\Edit with Spyder", None, None)) - lost_entries.append((rf"Software\Classes\Python.NoConFile\shell\Edit with Spyder", None, None)) - - # --- WinPython Core registry entries (PEP 514 style) --- - base = f"Software\\Python\\WinPython\\{short_version}" - core_entries.append((base, "DisplayName", display)) - core_entries.append((base, "SupportUrl", "https://winpython.github.io")) - core_entries.append((base, "SysVersion", short_version)) - core_entries.append((base, "SysArchitecture", arch)) - core_entries.append((base, "Version", version)) - - core_entries.append((f"{base}\\InstallPath", None, str(target))) - core_entries.append((f"{base}\\InstallPath", "ExecutablePath", python_exe)) - core_entries.append((f"{base}\\InstallPath", "WindowedExecutablePath", pythonw_exe)) - core_entries.append((f"{base}\\InstallPath\\InstallGroup", None, f"Python {short_version}")) - - core_entries.append((f"{base}\\Modules", None, "")) - core_entries.append((f"{base}\\PythonPath", None, f"{target}\\Lib;{target}\\DLLs")) - core_entries.append((f"{base}\\Help\\Main Python Documentation", None, doc_path)) - lost_entries.append((f"{base}\\Help", None, None)) - lost_entries.append((f"Software\\Python\\WinPython", None, None)) - - return permanent_entries, dynamic_entries, core_entries, lost_entries - -# --- Main Register/Unregister Functions --- - -def register(target, current=True, reg_type=winreg.REG_SZ, verbose=True): - """Register a Python distribution in Windows registry and create Start Menu shortcuts""" - root = winreg.HKEY_CURRENT_USER if current else winreg.HKEY_LOCAL_MACHINE - has_pywin32 = _has_pywin32() - - if verbose: - print(f'Creating WinPython registry entries for {target}') - - permanent_entries, dynamic_entries, core_entries, lost_entries = register_in_registery(target) - # Set registry entries for given target - for key_path, name, value in permanent_entries + dynamic_entries + core_entries: - _set_reg_value(root, key_path, name, value, verbose=verbose) - - # Create start menu entries - if has_pywin32: - if verbose: - print(f'Creating WinPython menu for all icons in {target.parent}') - for path, desc, fname in _get_shortcut_data(target, current=current, has_pywin32=True): - try: - create_shortcut(path, desc, fname, verbose=verbose) - except Exception as e: - print(f"Error creating shortcut for {desc} at {fname}: {e}", file=sys.stderr) - else: - print("Skipping start menu shortcut creation as pywin32 package is needed.") - -def unregister(target, current=True, verbose=True): - """Unregister a Python distribution from Windows registry and remove Start Menu shortcuts""" - root = winreg.HKEY_CURRENT_USER if current else winreg.HKEY_LOCAL_MACHINE - has_pywin32 = _has_pywin32() - - if verbose: - print(f'Removing WinPython registry entries for {target}') - - permanent_entries, dynamic_entries, core_entries , lost_entries = register_in_registery(target) - - # List of keys to attempt to delete, ordered from most specific to general - keys_to_delete = sorted(list(set(key_path for key_path , name, value in (dynamic_entries + core_entries + lost_entries))), key=len, reverse=True) - - rootkey_name = "HKEY_CURRENT_USER" if root == winreg.HKEY_CURRENT_USER else "HKEY_LOCAL_MACHINE" - for key_path in keys_to_delete: - _delete_reg_key(root, key_path, verbose=verbose) - - # Remove start menu shortcuts - if has_pywin32: - if verbose: - print(f'Removing WinPython menu for all icons in {target.parent}') - _remove_start_menu_folder(target, current=current, has_pywin32=True) - # The original code had commented out code to delete .lnk files individually. - else: - print("Skipping start menu removal as pywin32 package is needed.") - - -if __name__ == "__main__": - # Ensure we are running from the target WinPython environment - parser = ArgumentParser(description="Register or Un-register Python file extensions, icons "\ - "and Windows explorer context menu to this "\ - "Python distribution.") - parser.add_argument('--unregister', action="store_true", - help='register to all users, requiring administrative '\ - 'privileges (default: register to current user only)') - parser.add_argument('--all', action="store_true", - help='action is to all users, requiring administrative '\ - 'privileges (default: to current user only)') - args = parser.parse_args() - expected_target = Path(sys.prefix) - command = "unregister" if args.unregister else "register" - users = "all" if args.all else "user" - print(f"Attempting to {command} the Python environment for {users} at: {expected_target}") - - target_dir = sys.prefix # Or get from arguments - is_current_user = True # Or get from arguments - if command == "register": - register(expected_target, current=not args.all) - else: - unregister(expected_target, current=not args.all) +# -*- coding: utf-8 -*- +# +# associate.py = Register a Python distribution +# Copyright © 2012 Pierre Raybaut +# Licensed under the terms of the MIT License +# (see winpython/__init__.py for details) + +import sys +import os +from pathlib import Path +import importlib.util +import winreg +from . import utils +from argparse import ArgumentParser + +def get_special_folder_path(path_name): + """Return special folder path.""" + from win32com.shell import shell, shellcon + try: + csidl = getattr(shellcon, path_name) + return shell.SHGetSpecialFolderPath(0, csidl, False) + except OSError: + print(f"{path_name} is an unknown path ID") + +def get_winpython_start_menu_folder(current=True): + """Return WinPython Start menu shortcuts folder.""" + folder = get_special_folder_path("CSIDL_PROGRAMS") + if not current: + try: + folder = get_special_folder_path("CSIDL_COMMON_PROGRAMS") + except OSError: + pass + return str(Path(folder) / 'WinPython') + +def remove_winpython_start_menu_folder(current=True): + """Remove WinPython Start menu folder -- remove it if it already exists""" + path = get_winpython_start_menu_folder(current=current) + if Path(path).is_dir(): + try: + shutil.rmtree(path, onexc=onerror) + except WindowsError: + print(f"Directory {path} could not be removed", file=sys.stderr) + +def create_winpython_start_menu_folder(current=True): + """Create WinPython Start menu folder.""" + path = get_winpython_start_menu_folder(current=current) + if Path(path).is_dir(): + try: + shutil.rmtree(path, onexc=onerror) + except WindowsError: + print(f"Directory {path} could not be removed", file=sys.stderr) + Path(path).mkdir(parents=True, exist_ok=True) + return path + +def create_shortcut(path, description, filename, arguments="", workdir="", iconpath="", iconindex=0, verbose=True): + """Create Windows shortcut (.lnk file).""" + import pythoncom + from win32com.shell import shell + ilink = pythoncom.CoCreateInstance(shell.CLSID_ShellLink, None, pythoncom.CLSCTX_INPROC_SERVER, shell.IID_IShellLink) + ilink.SetPath(path) + ilink.SetDescription(description) + if arguments: + ilink.SetArguments(arguments) + if workdir: + ilink.SetWorkingDirectory(workdir) + if iconpath or iconindex: + ilink.SetIconLocation(iconpath, iconindex) + # now save it. + ipf = ilink.QueryInterface(pythoncom.IID_IPersistFile) + if not filename.endswith('.lnk'): + filename += '.lnk' + if verbose: + print(f'create menu *{filename}*') + try: + ipf.Save(filename, 0) + except: + print("a fail !") + +# --- Helper functions for Registry --- + +def _set_reg_value(root, key_path, name, value, reg_type=winreg.REG_SZ, verbose=False): + """Helper to create key and set a registry value using CreateKeyEx.""" + rootkey_name = "HKEY_CURRENT_USER" if root == winreg.HKEY_CURRENT_USER else "HKEY_LOCAL_MACHINE" + if verbose: + print(f"{rootkey_name}\\{key_path}\\{name if name else ''}:{value}") + try: + # Use CreateKeyEx with context manager for automatic closing + with winreg.CreateKeyEx(root, key_path, 0, winreg.KEY_WRITE) as key: + winreg.SetValueEx(key, name, 0, reg_type, value) + except OSError as e: + print(f"Error creating/setting registry value {rootkey_name}\\{key_path}\\{name}: {e}", file=sys.stderr) + +def _delete_reg_key(root, key_path, verbose=False): + """Helper to delete a registry key, ignoring if not found.""" + rootkey_name = "HKEY_CURRENT_USER" if root == winreg.HKEY_CURRENT_USER else "HKEY_LOCAL_MACHINE" + if verbose: + print(f"{rootkey_name}\\{key_path}") + try: + # DeleteKey can only delete keys with no subkeys. + # For keys with (still) subkeys, use DeleteKeyEx on the parent key if available + winreg.DeleteKey(root, key_path) + except FileNotFoundError: + if verbose: + print(f"Registry key not found (skipping deletion): {rootkey_name}\\{key_path}") + except OSError as e: # Catch other potential errors like key not empty + print(f"Error deleting registry key {rootkey_name}\\{key_path}: {e}", file=sys.stderr) + + +# --- Helper functions for Start Menu Shortcuts --- + +def _has_pywin32(): + """Check if pywin32 (pythoncom) is installed.""" + return importlib.util.find_spec('pythoncom') is not None + +def _remove_start_menu_folder(target, current=True, has_pywin32=False): + "remove menu Folder for target WinPython if pywin32 exists" + if has_pywin32: + remove_winpython_start_menu_folder(current=current) + else: + print("Skipping start menu removal as pywin32 package is not installed.") + +def _get_shortcut_data(target, current=True, has_pywin32=False): + "get windows menu access data if pywin32 exists, otherwise empty list" + if not has_pywin32: + return [] + + wpdir = str(Path(target).parent) + data = [] + for name in os.listdir(wpdir): + bname, ext = Path(name).stem, Path(name).suffix + if ext.lower() == ".exe": + # Path for the shortcut file in the start menu folder + shortcut_name = str(Path(create_winpython_start_menu_folder(current=current)) / bname) + '.lnk' + data.append( + ( + str(Path(wpdir) / name), # Target executable path + bname, # Description/Name + shortcut_name, # Shortcut file path + ) + ) + return data + +# --- PythonCore entries (PEP-0514 and WinPython specific) --- + + +def register_in_registery(target, current=True, reg_type=winreg.REG_SZ, verbose=True) -> tuple[list[any], ...]: + """Register in Windows (like regedit)""" + + # --- Constants --- + DROP_HANDLER_CLSID = "{60254CA5-953B-11CF-8C96-00AA00B8708C}" + + # --- CONFIG --- + target_path = Path(target).resolve() + python_exe = str(target_path / "python.exe") + pythonw_exe = str(target_path / "pythonw.exe") + spyder_exe = str(target_path.parent / "Spyder.exe") + icon_py = str(target_path / "DLLs" / "py.ico") + icon_pyc = str(target_path / "DLLs" / "pyc.ico") + idle_path = str(target_path / "Lib" / "idlelib" / "idle.pyw") + doc_path = str(target_path / "Doc" / "html" / "index.html") + python_infos = utils.get_python_infos(target) # ('3.11', 64) + short_version = python_infos[0] # e.g., '3.11' + version = utils.get_python_long_version(target) # e.g., '3.11.5' + arch = f'{python_infos[1]}bit' # e.g., '64bit' + display = f"Python {version} ({arch})" + + permanent_entries = [] # key_path, name, value + dynamic_entries = [] # key_path, name, value + core_entries = [] # key_path, name, value + lost_entries = [] # intermediate keys to remove later + # --- File associations --- + ext_map = {".py": "Python.File", ".pyw": "Python.NoConFile", ".pyc": "Python.CompiledFile"} + ext_label = {".py": "Python File", ".pyw": "Python File (no console)", ".pyc": "Compiled Python File"} + for ext, ftype in ext_map.items(): + permanent_entries.append((f"Software\\Classes\\{ext}", None, ftype)) + if ext in (".py", ".pyw"): + permanent_entries.append((f"Software\\Classes\\{ext}", "Content Type", "text/plain")) + + # --- Descriptions, Icons, DropHandlers --- + for ext, ftype in ext_map.items(): + dynamic_entries.append((f"Software\\Classes\\{ftype}", None, ext_label[ext])) + dynamic_entries.append((f"Software\\Classes\\{ftype}\\DefaultIcon", None, icon_py if "Compiled" not in ftype else icon_pyc)) + dynamic_entries.append((f"Software\\Classes\\{ftype}\\shellex\\DropHandler", None, DROP_HANDLER_CLSID)) + lost_entries.append((f"Software\\Classes\\{ftype}\\shellex", None, None)) + + # --- Shell commands --- + for ext, ftype in ext_map.items(): + dynamic_entries.append((f"Software\\Classes\\{ftype}\\shell\\open\\command", None, f'''"{pythonw_exe if ftype=='Python.NoConFile' else python_exe}" "%1" %*''')) + lost_entries.append((f"Software\\Classes\\{ftype}\\shell\\open", None, None)) + lost_entries.append((f"Software\\Classes\\{ftype}\\shell", None, None)) + + dynamic_entries.append((rf"Software\Classes\Python.File\shell\Edit with IDLE\command", None, f'"{pythonw_exe}" "{idle_path}" -n -e "%1"')) + dynamic_entries.append((rf"Software\Classes\Python.NoConFile\shell\Edit with IDLE\command", None, f'"{pythonw_exe}" "{idle_path}" -n -e "%1"')) + lost_entries.append((rf"Software\Classes\Python.File\shell\Edit with IDLE", None, None)) + lost_entries.append((rf"Software\Classes\Python.NoConFile\shell\Edit with IDLE", None, None)) + + if Path(spyder_exe).exists(): + dynamic_entries.append((rf"Software\Classes\Python.File\shell\Edit with Spyder\command", None, f'"{spyder_exe}" "%1" -w "%w"')) + dynamic_entries.append((rf"Software\Classes\Python.NoConFile\shell\Edit with Spyder\command", None, f'"{spyder_exe}" "%1" -w "%w"')) + lost_entries.append((rf"Software\Classes\Python.File\shell\Edit with Spyder", None, None)) + lost_entries.append((rf"Software\Classes\Python.NoConFile\shell\Edit with Spyder", None, None)) + + # --- WinPython Core registry entries (PEP 514 style) --- + base = f"Software\\Python\\WinPython\\{short_version}" + core_entries.append((base, "DisplayName", display)) + core_entries.append((base, "SupportUrl", "https://winpython.github.io")) + core_entries.append((base, "SysVersion", short_version)) + core_entries.append((base, "SysArchitecture", arch)) + core_entries.append((base, "Version", version)) + + core_entries.append((f"{base}\\InstallPath", None, str(target))) + core_entries.append((f"{base}\\InstallPath", "ExecutablePath", python_exe)) + core_entries.append((f"{base}\\InstallPath", "WindowedExecutablePath", pythonw_exe)) + core_entries.append((f"{base}\\InstallPath\\InstallGroup", None, f"Python {short_version}")) + + core_entries.append((f"{base}\\Modules", None, "")) + core_entries.append((f"{base}\\PythonPath", None, f"{target}\\Lib;{target}\\DLLs")) + core_entries.append((f"{base}\\Help\\Main Python Documentation", None, doc_path)) + lost_entries.append((f"{base}\\Help", None, None)) + lost_entries.append((f"Software\\Python\\WinPython", None, None)) + + return permanent_entries, dynamic_entries, core_entries, lost_entries + +# --- Main Register/Unregister Functions --- + +def register(target, current=True, reg_type=winreg.REG_SZ, verbose=True): + """Register a Python distribution in Windows registry and create Start Menu shortcuts""" + root = winreg.HKEY_CURRENT_USER if current else winreg.HKEY_LOCAL_MACHINE + has_pywin32 = _has_pywin32() + + if verbose: + print(f'Creating WinPython registry entries for {target}') + + permanent_entries, dynamic_entries, core_entries, lost_entries = register_in_registery(target) + # Set registry entries for given target + for key_path, name, value in permanent_entries + dynamic_entries + core_entries: + _set_reg_value(root, key_path, name, value, verbose=verbose) + + # Create start menu entries + if has_pywin32: + if verbose: + print(f'Creating WinPython menu for all icons in {target.parent}') + for path, desc, fname in _get_shortcut_data(target, current=current, has_pywin32=True): + try: + create_shortcut(path, desc, fname, verbose=verbose) + except Exception as e: + print(f"Error creating shortcut for {desc} at {fname}: {e}", file=sys.stderr) + else: + print("Skipping start menu shortcut creation as pywin32 package is needed.") + +def unregister(target, current=True, verbose=True): + """Unregister a Python distribution from Windows registry and remove Start Menu shortcuts""" + root = winreg.HKEY_CURRENT_USER if current else winreg.HKEY_LOCAL_MACHINE + has_pywin32 = _has_pywin32() + + if verbose: + print(f'Removing WinPython registry entries for {target}') + + permanent_entries, dynamic_entries, core_entries , lost_entries = register_in_registery(target) + + # List of keys to attempt to delete, ordered from most specific to general + keys_to_delete = sorted(list(set(key_path for key_path , name, value in (dynamic_entries + core_entries + lost_entries))), key=len, reverse=True) + + rootkey_name = "HKEY_CURRENT_USER" if root == winreg.HKEY_CURRENT_USER else "HKEY_LOCAL_MACHINE" + for key_path in keys_to_delete: + _delete_reg_key(root, key_path, verbose=verbose) + + # Remove start menu shortcuts + if has_pywin32: + if verbose: + print(f'Removing WinPython menu for all icons in {target.parent}') + _remove_start_menu_folder(target, current=current, has_pywin32=True) + # The original code had commented out code to delete .lnk files individually. + else: + print("Skipping start menu removal as pywin32 package is needed.") + + +if __name__ == "__main__": + # Ensure we are running from the target WinPython environment + parser = ArgumentParser(description="Register or Un-register Python file extensions, icons "\ + "and Windows explorer context menu to this "\ + "Python distribution.") + parser.add_argument('--unregister', action="store_true", + help='register to all users, requiring administrative '\ + 'privileges (default: register to current user only)') + parser.add_argument('--all', action="store_true", + help='action is to all users, requiring administrative '\ + 'privileges (default: to current user only)') + args = parser.parse_args() + expected_target = Path(sys.prefix) + command = "unregister" if args.unregister else "register" + users = "all" if args.all else "user" + print(f"Attempting to {command} the Python environment for {users} at: {expected_target}") + + target_dir = sys.prefix # Or get from arguments + is_current_user = True # Or get from arguments + if command == "register": + register(expected_target, current=not args.all) + else: + unregister(expected_target, current=not args.all) diff --git a/winpython/diff.py b/wppm/diff.py similarity index 100% rename from winpython/diff.py rename to wppm/diff.py diff --git a/winpython/hash.py b/wppm/hash.py similarity index 100% rename from winpython/hash.py rename to wppm/hash.py diff --git a/winpython/packagemetadata.py b/wppm/packagemetadata.py similarity index 100% rename from winpython/packagemetadata.py rename to wppm/packagemetadata.py diff --git a/winpython/piptree.py b/wppm/piptree.py similarity index 100% rename from winpython/piptree.py rename to wppm/piptree.py diff --git a/winpython/utils.py b/wppm/utils.py similarity index 97% rename from winpython/utils.py rename to wppm/utils.py index 0c83cb80..dcec0207 100644 --- a/winpython/utils.py +++ b/wppm/utils.py @@ -1,313 +1,313 @@ -# -*- coding: utf-8 -*- -# -# WinPython utilities -# Copyright © 2012 Pierre Raybaut -# Copyright © 2014-2025+ The Winpython development team https://github.com/winpython/ -# Licensed under the terms of the MIT License -# (see winpython/__init__.py for details) - -import os -import sys -import stat -import shutil -import locale -import subprocess -from pathlib import Path -import re -import tarfile -import zipfile - -# SOURCE_PATTERN defines what an acceptable source package name is -SOURCE_PATTERN = r'([a-zA-Z0-9\-\_\.]*)-([0-9\.\_]*[a-z]*[\-]?[0-9]*)(\.zip|\.tar\.gz|\-(py[2-7]*|py[2-7]*\.py[2-7]*)\-none\-any\.whl)' - -# WHEELBIN_PATTERN defines what an acceptable binary wheel package is -WHEELBIN_PATTERN = r'([a-zA-Z0-9\-\_\.]*)-([0-9\.\_]*[a-z0-9\+]*[0-9]?)-cp([0-9]*)\-[0-9|c|o|n|e|p|m]*\-(win32|win\_amd64)\.whl' - -def get_python_executable(path=None): - """Return the path to the Python executable.""" - python_path = Path(path) if path else Path(sys.executable) - base_dir = python_path if python_path.is_dir() else python_path.parent - python_exe = base_dir / 'python.exe' - pypy_exe = base_dir / 'pypy3.exe' # For PyPy - return str(python_exe if python_exe.is_file() else pypy_exe) - -def get_site_packages_path(path=None): - """Return the path to the Python site-packages directory.""" - python_path = Path(path) if path else Path(sys.executable) - base_dir = python_path if python_path.is_dir() else python_path.parent - site_packages = base_dir / 'Lib' / 'site-packages' - pypy_site_packages = base_dir / 'site-packages' # For PyPy - return str(pypy_site_packages if pypy_site_packages.is_dir() else site_packages) - -def get_installed_tools(path=None)-> str: - """Generates Markdown for installed tools section in package index.""" - tool_lines = [] - python_exe = Path(get_python_executable(path)) - version = exec_shell_cmd(f'powershell (Get-Item {python_exe}).VersionInfo.FileVersion', python_exe.parent).splitlines()[0] - tool_lines.append(("Python" ,f"http://www.python.org/", version, "Python programming language with standard library")) - if (node_exe := python_exe.parent.parent / "n" / "node.exe").exists(): - version = exec_shell_cmd(f'powershell (Get-Item {node_exe}).VersionInfo.FileVersion', node_exe.parent).splitlines()[0] - tool_lines.append(("Nodejs", "https://nodejs.org", version, "a JavaScript runtime built on Chrome's V8 JavaScript engine")) - - if (pandoc_exe := python_exe.parent.parent / "t" / "pandoc.exe").exists(): - version = exec_shell_cmd("pandoc -v", pandoc_exe.parent).splitlines()[0].split(" ")[-1] - tool_lines.append(("Pandoc", "https://pandoc.org", version, "an universal document converter")) - - if (vscode_exe := python_exe.parent.parent / "t" / "VSCode" / "Code.exe").exists(): - version = exec_shell_cmd(f'powershell (Get-Item {vscode_exe}).VersionInfo.FileVersion', vscode_exe.parent).splitlines()[0] - tool_lines.append(("VSCode","https://code.visualstudio.com", version, "a source-code editor developed by Microsoft")) - return tool_lines - -def onerror(function, path, excinfo): - """Error handler for `shutil.rmtree`.""" - if not os.access(path, os.W_OK): - os.chmod(path, stat.S_IWUSR) - function(path) - else: - raise - -def sum_up(text: str, max_length: int = 144, stop_at: str = ". ") -> str: - """Summarize text to fit within max_length, ending at last complete sentence.""" - summary = (text + os.linesep).splitlines()[0].strip() - if len(summary) <= max_length: - return summary - if stop_at and stop_at in summary[:max_length]: - return summary[:summary.rfind(stop_at, 0, max_length)] + stop_at.strip() - return summary[:max_length].strip() - -def print_box(text): - """Print text in a box""" - line0 = "+" + ("-" * (len(text) + 2)) + "+" - line1 = "| " + text + " |" - print("\n\n" + "\n".join([line0, line1, line0]) + "\n") - -def is_python_distribution(path): - """Return True if path is a Python distribution.""" - has_exec = Path(get_python_executable(path)).is_file() - has_site = Path(get_site_packages_path(path)).is_dir() - return has_exec and has_site - -def decode_fs_string(string): - """Convert string from file system charset to unicode.""" - charset = sys.getfilesystemencoding() or locale.getpreferredencoding() - return string.decode(charset) - -def exec_shell_cmd(args, path): - """Execute shell command (*args* is a list of arguments) in *path*.""" - process = subprocess.Popen(args, stdout=subprocess.PIPE, stderr=subprocess.PIPE, cwd=path, shell=True) - return decode_fs_string(process.stdout.read()) - -def exec_run_cmd(args, path=None): - """Run a single command (*args* is a list of arguments) in optional *path*.""" - process = subprocess.run(args, capture_output=True, cwd=path, text=True) - return process.stdout - -def python_query(cmd, path): - """Execute Python command using the Python interpreter located in *path*.""" - the_exe = get_python_executable(path) - return exec_shell_cmd(f'"{the_exe}" -c "{cmd}"', path).splitlines()[0] - -def python_execmodule(cmd, path): - """Execute Python command using the Python interpreter located in *path*.""" - the_exe = get_python_executable(path) - exec_shell_cmd(f'{the_exe} -m {cmd}', path) - -def get_python_infos(path): - """Return (version, architecture) for the Python distribution located in *path*.""" - is_64 = python_query("import sys; print(sys.maxsize > 2**32)", path) - arch = {"True": 64, "False": 32}.get(is_64, None) - ver = python_query("import sys;print(f'{sys.version_info.major}.{sys.version_info.minor}')", path) - return ver, arch - -def get_python_long_version(path): - """Return long version (X.Y.Z) for the Python distribution located in *path*.""" - ver = python_query("import sys; print(f'{sys.version_info.major}.{sys.version_info.minor}.{sys.version_info.micro}')", path) - return ver if re.match(r"([0-9]*)\.([0-9]*)\.([0-9]*)", ver) else None - -def patch_shebang_line(fname, pad=b" ", to_movable=True, targetdir=""): - """Remove absolute path to python.exe in shebang lines in binary files, or re-add it.""" - target_dir = targetdir if to_movable else os.path.abspath(os.path.join(os.path.dirname(fname), r"..")) + "\\" - executable = sys.executable - shebang_line = re.compile(rb"""(#!.*pythonw?\.exe)"?""") # Python3+ - if "pypy3" in sys.executable: - shebang_line = re.compile(rb"""(#!.*pypy3w?\.exe)"?""") # Pypy3+ - target_dir = target_dir.encode("utf-8") - - with open(fname, "rb") as fh: - initial_content = fh.read() - content = shebang_line.split(initial_content, maxsplit=1) - if len(content) != 3: - return - exe = os.path.basename(content[1][2:]) - content[1] = b"#!" + target_dir + exe # + (pad * (len(content[1]) - len(exe) - 2)) - final_content = b"".join(content) - if initial_content == final_content: - return - try: - with open(fname, "wb") as fo: - fo.write(final_content) - print("patched", fname) - except Exception: - print("failed to patch", fname) - -def patch_shebang_line_py(fname, to_movable=True, targetdir=""): - """Changes shebang line in '.py' file to relative or absolue path""" - import fileinput - exec_path = r'#!.\python.exe' if to_movable else '#!' + sys.executable - if 'pypy3' in sys.executable: - exec_path = r'#!.\pypy3.exe' if to_movable else exec_path - for line in fileinput.input(fname, inplace=True): - if re.match(r'^#\!.*python\.exe$', line) or re.match(r'^#\!.*pypy3\.exe$', line): - print(exec_path) - else: - print(line, end='') - -def guess_encoding(csv_file): - """guess the encoding of the given file""" - with open(csv_file, "rb") as f: - data = f.read(5) - if data.startswith(b"\xEF\xBB\xBF"): # UTF-8 with a "BOM" (normally no BOM in utf-8) - return ["utf-8-sig"] - try: - with open(csv_file, encoding="utf-8") as f: - preview = f.read(222222) - return ["utf-8"] - except: - return [locale.getdefaultlocale()[1], "utf-8"] - -def replace_in_file(filepath: Path, replacements: list[tuple[str, str]], filedest: Path = None, verbose=False): - """ - Replaces strings in a file - Args: - filepath: Path to the file to modify. - replacements: A list of tuples of ('old string 'new string') - filedest: optional output file, otherwise will be filepath - """ - the_encoding = guess_encoding(filepath)[0] - with open(filepath, "r", encoding=the_encoding) as f: - content = f.read() - new_content = content - for old_text, new_text in replacements: - new_content = new_content.replace(old_text, new_text) - outfile = filedest if filedest else filepath - if new_content != content or str(outfile) != str(filepath): - with open(outfile, "w", encoding=the_encoding) as f: - f.write(new_content) - if verbose: - print(f"patched from {Path(filepath).name} into {outfile} !") - -def patch_sourcefile(fname, in_text, out_text, silent_mode=False): - """Replace a string in a source file.""" - if not silent_mode: - print(f"patching {fname} from {in_text} to {out_text}") - if Path(fname).is_file() and in_text != out_text: - replace_in_file(Path(fname), [(in_text, out_text)]) - -def extract_archive(fname, targetdir=None, verbose=False): - """Extract .zip, .exe or .tar.gz archive to a temporary directory. - Return the temporary directory path""" - targetdir = targetdir or create_temp_dir() - Path(targetdir).mkdir(parents=True, exist_ok=True) - if Path(fname).suffix in ('.zip', '.exe'): - obj = zipfile.ZipFile(fname, mode="r") - elif fname.endswith('.tar.gz'): - obj = tarfile.open(fname, mode='r:gz') - else: - raise RuntimeError(f"Unsupported archive filename {fname}") - obj.extractall(path=targetdir) - return targetdir - -def get_source_package_infos(fname): - """Return a tuple (name, version) of the Python source package.""" - if fname.endswith('.whl'): - return Path(fname).name.split("-")[:2] - match = re.match(SOURCE_PATTERN, Path(fname).name) - return match.groups()[:2] if match else None - -def buildflit_wininst(root, python_exe=None, copy_to=None, verbose=False): - """Build Wheel from Python package located in *root* with flit.""" - python_exe = python_exe or sys.executable - cmd = [python_exe, '-m', 'flit', 'build'] - if verbose: - subprocess.call(cmd, cwd=root) - else: - subprocess.Popen(cmd, cwd=root, stdout=subprocess.PIPE, stderr=subprocess.PIPE).communicate() - distdir = Path(root) / 'dist' - if not distdir.is_dir(): - raise RuntimeError( - "Build failed: see package README file for further details regarding installation requirements.\n\n" - "For more concrete debugging infos, please try to build the package from the command line:\n" - "1. Open a WinPython command prompt\n" - "2. Change working directory to the appropriate folder\n" - "3. Type `python -m flit build`" - ) - for distname in os.listdir(distdir): - if re.match(SOURCE_PATTERN, distname) or re.match(WHEELBIN_PATTERN, distname): - break - else: - raise RuntimeError(f"Build failed: not a pure Python package? {distdir}") - - src_fname = distdir / distname - if copy_to: - dst_fname = Path(copy_to) / distname - shutil.move(src_fname, dst_fname) - if verbose: - print(f"Move: {src_fname} --> {dst_fname}") - -def direct_pip_install(fname, python_exe=None, verbose=False, install_options=None): - """Direct install via python -m pip !""" - python_exe = python_exe or sys.executable - myroot = Path(python_exe).parent - cmd = [python_exe, "-m", "pip", "install"] + (install_options or []) + [fname] - if not verbose: - process = subprocess.Popen(cmd, cwd=myroot, stdout=subprocess.PIPE, stderr=subprocess.PIPE) - stdout, stderr = process.communicate() - the_log = f"{stdout}\n {stderr}" - if " not find " in the_log or " not found " in the_log: - print(f"Failed to Install: \n {fname} \n msg: {the_log}") - raise RuntimeError - process.stdout.close() - process.stderr.close() - else: - subprocess.call(cmd, cwd=myroot) - print(f"Installed {fname} via {' '.join(cmd)}") - return fname - -def do_script(this_script, python_exe=None, copy_to=None, verbose=False, install_options=None): - """Execute a script (get-pip typically).""" - python_exe = python_exe or sys.executable - myroot = Path(python_exe).parent - # cmd = [python_exe, myroot + r'\Scripts\pip-script.py', 'install'] - cmd = [python_exe] + (install_options or []) + ([this_script] if this_script else []) - print("Executing ", cmd) - if not verbose: - subprocess.Popen(cmd, cwd=myroot, stdout=subprocess.PIPE, stderr=subprocess.PIPE).communicate() - else: - subprocess.call(cmd, cwd=myroot) - print("Executed ", cmd) - return 'ok' - -def columns_width(list_of_lists): - """Return the maximum string length of each column of a list of lists.""" - if not isinstance(list_of_lists, list): - return [0] - return [max(len(str(item)) for item in sublist) for sublist in zip(*list_of_lists)] - -def formatted_list(list_of_list, full=False, max_width=70): - """Format a list_of_list to fixed length columns.""" - columns_size = columns_width(list_of_list) - columns = range(len(columns_size)) - return [list(line[col].ljust(columns_size[col])[:max_width] for col in columns) for line in list_of_list] - -def normalize(this): - """Apply PEP 503 normalization to the string.""" - return re.sub(r"[-_.]+", "-", this).lower() - -if __name__ == '__main__': - print_box("Test") - dname = sys.prefix - print((dname + ':', '\n', get_python_infos(dname))) - - tmpdir = r'D:\Tests\winpython_tests' - Path(tmpdir).mkdir(parents=True, exist_ok=True) - print(extract_archive(str(Path(r'D:\WinP\bd37') / 'packages.win-amd64' / 'python-3.7.3.amd64.zip'), tmpdir)) +# -*- coding: utf-8 -*- +# +# WinPython utilities +# Copyright © 2012 Pierre Raybaut +# Copyright © 2014-2025+ The Winpython development team https://github.com/winpython/ +# Licensed under the terms of the MIT License +# (see winpython/__init__.py for details) + +import os +import sys +import stat +import shutil +import locale +import subprocess +from pathlib import Path +import re +import tarfile +import zipfile + +# SOURCE_PATTERN defines what an acceptable source package name is +SOURCE_PATTERN = r'([a-zA-Z0-9\-\_\.]*)-([0-9\.\_]*[a-z]*[\-]?[0-9]*)(\.zip|\.tar\.gz|\-(py[2-7]*|py[2-7]*\.py[2-7]*)\-none\-any\.whl)' + +# WHEELBIN_PATTERN defines what an acceptable binary wheel package is +WHEELBIN_PATTERN = r'([a-zA-Z0-9\-\_\.]*)-([0-9\.\_]*[a-z0-9\+]*[0-9]?)-cp([0-9]*)\-[0-9|c|o|n|e|p|m]*\-(win32|win\_amd64)\.whl' + +def get_python_executable(path=None): + """Return the path to the Python executable.""" + python_path = Path(path) if path else Path(sys.executable) + base_dir = python_path if python_path.is_dir() else python_path.parent + python_exe = base_dir / 'python.exe' + pypy_exe = base_dir / 'pypy3.exe' # For PyPy + return str(python_exe if python_exe.is_file() else pypy_exe) + +def get_site_packages_path(path=None): + """Return the path to the Python site-packages directory.""" + python_path = Path(path) if path else Path(sys.executable) + base_dir = python_path if python_path.is_dir() else python_path.parent + site_packages = base_dir / 'Lib' / 'site-packages' + pypy_site_packages = base_dir / 'site-packages' # For PyPy + return str(pypy_site_packages if pypy_site_packages.is_dir() else site_packages) + +def get_installed_tools(path=None)-> str: + """Generates Markdown for installed tools section in package index.""" + tool_lines = [] + python_exe = Path(get_python_executable(path)) + version = exec_shell_cmd(f'powershell (Get-Item {python_exe}).VersionInfo.FileVersion', python_exe.parent).splitlines()[0] + tool_lines.append(("Python" ,f"http://www.python.org/", version, "Python programming language with standard library")) + if (node_exe := python_exe.parent.parent / "n" / "node.exe").exists(): + version = exec_shell_cmd(f'powershell (Get-Item {node_exe}).VersionInfo.FileVersion', node_exe.parent).splitlines()[0] + tool_lines.append(("Nodejs", "https://nodejs.org", version, "a JavaScript runtime built on Chrome's V8 JavaScript engine")) + + if (pandoc_exe := python_exe.parent.parent / "t" / "pandoc.exe").exists(): + version = exec_shell_cmd("pandoc -v", pandoc_exe.parent).splitlines()[0].split(" ")[-1] + tool_lines.append(("Pandoc", "https://pandoc.org", version, "an universal document converter")) + + if (vscode_exe := python_exe.parent.parent / "t" / "VSCode" / "Code.exe").exists(): + version = exec_shell_cmd(f'powershell (Get-Item {vscode_exe}).VersionInfo.FileVersion', vscode_exe.parent).splitlines()[0] + tool_lines.append(("VSCode","https://code.visualstudio.com", version, "a source-code editor developed by Microsoft")) + return tool_lines + +def onerror(function, path, excinfo): + """Error handler for `shutil.rmtree`.""" + if not os.access(path, os.W_OK): + os.chmod(path, stat.S_IWUSR) + function(path) + else: + raise + +def sum_up(text: str, max_length: int = 144, stop_at: str = ". ") -> str: + """Summarize text to fit within max_length, ending at last complete sentence.""" + summary = (text + os.linesep).splitlines()[0].strip() + if len(summary) <= max_length: + return summary + if stop_at and stop_at in summary[:max_length]: + return summary[:summary.rfind(stop_at, 0, max_length)] + stop_at.strip() + return summary[:max_length].strip() + +def print_box(text): + """Print text in a box""" + line0 = "+" + ("-" * (len(text) + 2)) + "+" + line1 = "| " + text + " |" + print("\n\n" + "\n".join([line0, line1, line0]) + "\n") + +def is_python_distribution(path): + """Return True if path is a Python distribution.""" + has_exec = Path(get_python_executable(path)).is_file() + has_site = Path(get_site_packages_path(path)).is_dir() + return has_exec and has_site + +def decode_fs_string(string): + """Convert string from file system charset to unicode.""" + charset = sys.getfilesystemencoding() or locale.getpreferredencoding() + return string.decode(charset) + +def exec_shell_cmd(args, path): + """Execute shell command (*args* is a list of arguments) in *path*.""" + process = subprocess.Popen(args, stdout=subprocess.PIPE, stderr=subprocess.PIPE, cwd=path, shell=True) + return decode_fs_string(process.stdout.read()) + +def exec_run_cmd(args, path=None): + """Run a single command (*args* is a list of arguments) in optional *path*.""" + process = subprocess.run(args, capture_output=True, cwd=path, text=True) + return process.stdout + +def python_query(cmd, path): + """Execute Python command using the Python interpreter located in *path*.""" + the_exe = get_python_executable(path) + return exec_shell_cmd(f'"{the_exe}" -c "{cmd}"', path).splitlines()[0] + +def python_execmodule(cmd, path): + """Execute Python command using the Python interpreter located in *path*.""" + the_exe = get_python_executable(path) + exec_shell_cmd(f'{the_exe} -m {cmd}', path) + +def get_python_infos(path): + """Return (version, architecture) for the Python distribution located in *path*.""" + is_64 = python_query("import sys; print(sys.maxsize > 2**32)", path) + arch = {"True": 64, "False": 32}.get(is_64, None) + ver = python_query("import sys;print(f'{sys.version_info.major}.{sys.version_info.minor}')", path) + return ver, arch + +def get_python_long_version(path): + """Return long version (X.Y.Z) for the Python distribution located in *path*.""" + ver = python_query("import sys; print(f'{sys.version_info.major}.{sys.version_info.minor}.{sys.version_info.micro}')", path) + return ver if re.match(r"([0-9]*)\.([0-9]*)\.([0-9]*)", ver) else None + +def patch_shebang_line(fname, pad=b" ", to_movable=True, targetdir=""): + """Remove absolute path to python.exe in shebang lines in binary files, or re-add it.""" + target_dir = targetdir if to_movable else os.path.abspath(os.path.join(os.path.dirname(fname), r"..")) + "\\" + executable = sys.executable + shebang_line = re.compile(rb"""(#!.*pythonw?\.exe)"?""") # Python3+ + if "pypy3" in sys.executable: + shebang_line = re.compile(rb"""(#!.*pypy3w?\.exe)"?""") # Pypy3+ + target_dir = target_dir.encode("utf-8") + + with open(fname, "rb") as fh: + initial_content = fh.read() + content = shebang_line.split(initial_content, maxsplit=1) + if len(content) != 3: + return + exe = os.path.basename(content[1][2:]) + content[1] = b"#!" + target_dir + exe # + (pad * (len(content[1]) - len(exe) - 2)) + final_content = b"".join(content) + if initial_content == final_content: + return + try: + with open(fname, "wb") as fo: + fo.write(final_content) + print("patched", fname) + except Exception: + print("failed to patch", fname) + +def patch_shebang_line_py(fname, to_movable=True, targetdir=""): + """Changes shebang line in '.py' file to relative or absolue path""" + import fileinput + exec_path = r'#!.\python.exe' if to_movable else '#!' + sys.executable + if 'pypy3' in sys.executable: + exec_path = r'#!.\pypy3.exe' if to_movable else exec_path + for line in fileinput.input(fname, inplace=True): + if re.match(r'^#\!.*python\.exe$', line) or re.match(r'^#\!.*pypy3\.exe$', line): + print(exec_path) + else: + print(line, end='') + +def guess_encoding(csv_file): + """guess the encoding of the given file""" + with open(csv_file, "rb") as f: + data = f.read(5) + if data.startswith(b"\xEF\xBB\xBF"): # UTF-8 with a "BOM" (normally no BOM in utf-8) + return ["utf-8-sig"] + try: + with open(csv_file, encoding="utf-8") as f: + preview = f.read(222222) + return ["utf-8"] + except: + return [locale.getdefaultlocale()[1], "utf-8"] + +def replace_in_file(filepath: Path, replacements: list[tuple[str, str]], filedest: Path = None, verbose=False): + """ + Replaces strings in a file + Args: + filepath: Path to the file to modify. + replacements: A list of tuples of ('old string 'new string') + filedest: optional output file, otherwise will be filepath + """ + the_encoding = guess_encoding(filepath)[0] + with open(filepath, "r", encoding=the_encoding) as f: + content = f.read() + new_content = content + for old_text, new_text in replacements: + new_content = new_content.replace(old_text, new_text) + outfile = filedest if filedest else filepath + if new_content != content or str(outfile) != str(filepath): + with open(outfile, "w", encoding=the_encoding) as f: + f.write(new_content) + if verbose: + print(f"patched from {Path(filepath).name} into {outfile} !") + +def patch_sourcefile(fname, in_text, out_text, silent_mode=False): + """Replace a string in a source file.""" + if not silent_mode: + print(f"patching {fname} from {in_text} to {out_text}") + if Path(fname).is_file() and in_text != out_text: + replace_in_file(Path(fname), [(in_text, out_text)]) + +def extract_archive(fname, targetdir=None, verbose=False): + """Extract .zip, .exe or .tar.gz archive to a temporary directory. + Return the temporary directory path""" + targetdir = targetdir or create_temp_dir() + Path(targetdir).mkdir(parents=True, exist_ok=True) + if Path(fname).suffix in ('.zip', '.exe'): + obj = zipfile.ZipFile(fname, mode="r") + elif fname.endswith('.tar.gz'): + obj = tarfile.open(fname, mode='r:gz') + else: + raise RuntimeError(f"Unsupported archive filename {fname}") + obj.extractall(path=targetdir) + return targetdir + +def get_source_package_infos(fname): + """Return a tuple (name, version) of the Python source package.""" + if fname.endswith('.whl'): + return Path(fname).name.split("-")[:2] + match = re.match(SOURCE_PATTERN, Path(fname).name) + return match.groups()[:2] if match else None + +def buildflit_wininst(root, python_exe=None, copy_to=None, verbose=False): + """Build Wheel from Python package located in *root* with flit.""" + python_exe = python_exe or sys.executable + cmd = [python_exe, '-m', 'flit', 'build'] + if verbose: + subprocess.call(cmd, cwd=root) + else: + subprocess.Popen(cmd, cwd=root, stdout=subprocess.PIPE, stderr=subprocess.PIPE).communicate() + distdir = Path(root) / 'dist' + if not distdir.is_dir(): + raise RuntimeError( + "Build failed: see package README file for further details regarding installation requirements.\n\n" + "For more concrete debugging infos, please try to build the package from the command line:\n" + "1. Open a WinPython command prompt\n" + "2. Change working directory to the appropriate folder\n" + "3. Type `python -m flit build`" + ) + for distname in os.listdir(distdir): + if re.match(SOURCE_PATTERN, distname) or re.match(WHEELBIN_PATTERN, distname): + break + else: + raise RuntimeError(f"Build failed: not a pure Python package? {distdir}") + + src_fname = distdir / distname + if copy_to: + dst_fname = Path(copy_to) / distname + shutil.move(src_fname, dst_fname) + if verbose: + print(f"Move: {src_fname} --> {dst_fname}") + +def direct_pip_install(fname, python_exe=None, verbose=False, install_options=None): + """Direct install via python -m pip !""" + python_exe = python_exe or sys.executable + myroot = Path(python_exe).parent + cmd = [python_exe, "-m", "pip", "install"] + (install_options or []) + [fname] + if not verbose: + process = subprocess.Popen(cmd, cwd=myroot, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + stdout, stderr = process.communicate() + the_log = f"{stdout}\n {stderr}" + if " not find " in the_log or " not found " in the_log: + print(f"Failed to Install: \n {fname} \n msg: {the_log}") + raise RuntimeError + process.stdout.close() + process.stderr.close() + else: + subprocess.call(cmd, cwd=myroot) + print(f"Installed {fname} via {' '.join(cmd)}") + return fname + +def do_script(this_script, python_exe=None, copy_to=None, verbose=False, install_options=None): + """Execute a script (get-pip typically).""" + python_exe = python_exe or sys.executable + myroot = Path(python_exe).parent + # cmd = [python_exe, myroot + r'\Scripts\pip-script.py', 'install'] + cmd = [python_exe] + (install_options or []) + ([this_script] if this_script else []) + print("Executing ", cmd) + if not verbose: + subprocess.Popen(cmd, cwd=myroot, stdout=subprocess.PIPE, stderr=subprocess.PIPE).communicate() + else: + subprocess.call(cmd, cwd=myroot) + print("Executed ", cmd) + return 'ok' + +def columns_width(list_of_lists): + """Return the maximum string length of each column of a list of lists.""" + if not isinstance(list_of_lists, list): + return [0] + return [max(len(str(item)) for item in sublist) for sublist in zip(*list_of_lists)] + +def formatted_list(list_of_list, full=False, max_width=70): + """Format a list_of_list to fixed length columns.""" + columns_size = columns_width(list_of_list) + columns = range(len(columns_size)) + return [list(line[col].ljust(columns_size[col])[:max_width] for col in columns) for line in list_of_list] + +def normalize(this): + """Apply PEP 503 normalization to the string.""" + return re.sub(r"[-_.]+", "-", this).lower() + +if __name__ == '__main__': + print_box("Test") + dname = sys.prefix + print((dname + ':', '\n', get_python_infos(dname))) + + tmpdir = r'D:\Tests\winpython_tests' + Path(tmpdir).mkdir(parents=True, exist_ok=True) + print(extract_archive(str(Path(r'D:\WinP\bd37') / 'packages.win-amd64' / 'python-3.7.3.amd64.zip'), tmpdir)) diff --git a/winpython/wheelhouse.py b/wppm/wheelhouse.py similarity index 100% rename from winpython/wheelhouse.py rename to wppm/wheelhouse.py diff --git a/winpython/wppm.py b/wppm/wppm.py similarity index 98% rename from winpython/wppm.py rename to wppm/wppm.py index 77a937ac..1f852236 100644 --- a/winpython/wppm.py +++ b/wppm/wppm.py @@ -1,406 +1,406 @@ -# -*- coding: utf-8 -*- -# -# WinPython Package Manager -# Copyright © 2012 Pierre Raybaut -# Copyright © 2014-2025+ The Winpython development team https://github.com/winpython/ -# Licensed under the terms of the MIT License -# (see winpython/__init__.py for details) - -import os -import re -import sys -import shutil -import subprocess -import json -from pathlib import Path -from argparse import ArgumentParser, RawTextHelpFormatter -from . import utils, piptree, associate, diff -from . import wheelhouse as wh -from operator import itemgetter -# Workaround for installing PyVISA on Windows from source: -os.environ["HOME"] = os.environ["USERPROFILE"] - -class Package: - """Standardize a Package from filename or pip list.""" - def __init__(self, fname: str, suggested_summary: str = None): - self.fname = fname - self.description = (utils.sum_up(suggested_summary) if suggested_summary else "").strip() - self.name, self.version = fname, '?.?.?' - if fname.lower().endswith((".zip", ".tar.gz", ".whl")): - bname = Path(self.fname).name # e.g., "sqlite_bro-1.0.0..." - infos = utils.get_source_package_infos(bname) # get name, version - if infos: - self.name, self.version = utils.normalize(infos[0]), infos[1] - self.url = f"https://pypi.org/project/{self.name}" - self.files = [] - - def __str__(self): - return f"{self.name} {self.version}\r\n{self.description}\r\nWebsite: {self.url}" - - -class Distribution: - """Handles operations on a WinPython distribution.""" - def __init__(self, target: str = None, verbose: bool = False): - self.target = target or str(Path(sys.executable).parent) # Default target more explicit - self.verbose = verbose - self.pip = None - self.to_be_removed = [] - self.version, self.architecture = utils.get_python_infos(self.target) - self.python_exe = utils.get_python_executable(self.target) - self.short_exe = Path(self.python_exe).name - self.wheelhouse = Path(self.target).parent / "wheelhouse" - - def create_file(self, package, name, dstdir, contents): - """Generate data file -- path is relative to distribution root dir""" - dst = Path(dstdir) / name - if self.verbose: - print(f"create: {dst}") - full_dst = Path(self.target) / dst - with open(full_dst, "w") as fd: - fd.write(contents) - package.files.append(str(dst)) - - def get_installed_packages(self, update: bool = False) -> list[Package]: - """Return installed packages.""" - if str(Path(sys.executable).parent) == self.target: - self.pip = piptree.PipData() - else: - self.pip = piptree.PipData(utils.get_python_executable(self.target)) - pip_list = self.pip.pip_list(full=True) - return [Package(f"{i[0].replace('-', '_').lower()}-{i[1]}-py3-none-any.whl", suggested_summary=i[2]) for i in pip_list] - - def render_markdown_for_list(self, title, items): - """Generates a Markdown section; name, url, version, summary""" - md = f"### {title}\n\n" - md += "Name | Version | Description\n" - md += "-----|---------|------------\n" - for name, url, version, summary in sorted(items, key=lambda p: (p[0].lower(), p[2])): - md += f"[{name}]({url}) | {version} | {summary}\n" - md += "\n" - return md - - def generate_package_index_markdown(self, python_executable_directory: str|None = None, winpyver2: str|None = None, - flavor: str|None = None, architecture_bits: int|None = None - , release_level: str|None = None, wheeldir: str|None = None) -> str: - """Generates a Markdown formatted package index page.""" - my_ver , my_arch = utils.get_python_infos(python_executable_directory or self.target) - my_winpyver2 = winpyver2 or os.getenv("WINPYVER2","") - my_winpyver2 = my_winpyver2 if my_winpyver2 != "" else my_ver - my_flavor = flavor or os.getenv("WINPYFLAVOR", "") - my_release_level = release_level or os.getenv("WINPYVER", "").replace(my_winpyver2+my_flavor, "") - - tools_list = utils.get_installed_tools(utils.get_python_executable(python_executable_directory)) - package_list = [(pkg.name, pkg.url, pkg.version, pkg.description) for pkg in self.get_installed_packages()] - wheelhouse_list = [] - my_wheeldir = Path(wheeldir) if wheeldir else self.wheelhouse / 'included.wheels' - if my_wheeldir.is_dir(): - wheelhouse_list = [(name, f"https://pypi.org/project/{name}", version, utils.sum_up(summary)) - for name, version, summary in wh.list_packages_with_metadata(str(my_wheeldir)) ] - - return f"""## WinPython {my_winpyver2 + my_flavor} - -The following packages are included in WinPython-{my_arch}bit v{my_winpyver2 + my_flavor} {my_release_level}. - -
    - -{self.render_markdown_for_list("Tools", tools_list)} -{self.render_markdown_for_list("Python packages", package_list)} -{self.render_markdown_for_list("WheelHouse packages", wheelhouse_list)} -
    -""" - - def find_package(self, name: str) -> Package | None: - """Find installed package by name.""" - for pack in self.get_installed_packages(): - if utils.normalize(pack.name) == utils.normalize(name): - return pack - - def patch_all_shebang(self, to_movable: bool = True, max_exe_size: int = 999999, targetdir: str = ""): - """Make all python launchers relative.""" - for ffname in Path(self.target).glob("Scripts/*.exe"): - if ffname.stat().st_size <= max_exe_size: - utils.patch_shebang_line(ffname, to_movable=to_movable, targetdir=targetdir) - for ffname in Path(self.target).glob("Scripts/*.py"): - utils.patch_shebang_line_py(ffname, to_movable=to_movable, targetdir=targetdir) - - def install(self, package: Package, install_options: list[str] = None): - """Install package in distribution.""" - if package.fname.endswith((".whl", ".tar.gz", ".zip")) or ( - ' ' not in package.fname and ';' not in package.fname and len(package.fname) >1): # Check extension with tuple - self.install_bdist_direct(package, install_options=install_options) - self.handle_specific_packages(package) - # minimal post-install actions - self.patch_standard_packages(package.name) - - def do_pip_action(self, actions: list[str] = None, install_options: list[str] = None): - """Execute pip action in the distribution.""" - my_list = install_options or [] - my_actions = actions or [] - executing = str(Path(self.target).parent / "scripts" / "env.bat") - if Path(executing).is_file(): - complement = [r"&&", "cd", "/D", self.target, r"&&", utils.get_python_executable(self.target), "-m", "pip"] - else: - executing = utils.get_python_executable(self.target) - complement = ["-m", "pip"] - try: - fname = utils.do_script(this_script=None, python_exe=executing, verbose=self.verbose, install_options=complement + my_actions + my_list) - except RuntimeError as e: - if not self.verbose: - print("Failed!") - raise - else: - print(f"Pip action failed with error: {e}") # Print error if verbose - - def patch_standard_packages(self, package_name="", to_movable=True): - """patch Winpython packages in need""" - import filecmp - - # 'pywin32' minimal post-install (pywin32_postinstall.py do too much) - if package_name.lower() in ("", "pywin32"): - origin = Path(self.target) / "site-packages" / "pywin32_system32" - destin = Path(self.target) - if origin.is_dir(): - for name in os.listdir(origin): - here, there = origin / name, destin / name - if not there.exists() or not filecmp.cmp(here, there): - shutil.copyfile(here, there) - # 'pip' to do movable launchers (around line 100) !!!! - # rational: https://github.com/pypa/pip/issues/2328 - if package_name.lower() == "pip" or package_name == "": - # ensure pip will create movable launchers - # sheb_mov1 = classic way up to WinPython 2016-01 - # sheb_mov2 = tried way, but doesn't work for pip (at least) - the_place = Path(self.target) / "lib" / "site-packages" / "pip" / "_vendor" / "distlib" / "scripts.py" - sheb_fix = " executable = get_executable()" - sheb_mov1 = " executable = os.path.join(os.path.basename(get_executable()))" - sheb_mov2 = " executable = os.path.join('..',os.path.basename(get_executable()))" - if to_movable: - utils.patch_sourcefile(the_place, sheb_fix, sheb_mov1) - utils.patch_sourcefile(the_place, sheb_mov2, sheb_mov1) - else: - utils.patch_sourcefile(the_place, sheb_mov1, sheb_fix) - utils.patch_sourcefile(the_place, sheb_mov2, sheb_fix) - - # create movable launchers for previous package installations - self.patch_all_shebang(to_movable=to_movable) - if package_name.lower() in ("", "spyder"): - # spyder don't goes on internet without you ask - utils.patch_sourcefile( - Path(self.target) / "lib" / "site-packages" / "spyder" / "config" / "main.py", - "'check_updates_on_startup': True,", - "'check_updates_on_startup': False,", - ) - - - def handle_specific_packages(self, package): - """Packages requiring additional configuration""" - if package.name.lower() in ("pyqt4", "pyqt5", "pyside2"): - # Qt configuration file (where to find Qt) - name = "qt.conf" - contents = """[Paths]\nPrefix = .\nBinaries = .""" - self.create_file(package, name, str(Path("Lib") / "site-packages" / package.name), contents) - self.create_file(package, name, ".", contents.replace(".", f"./Lib/site-packages/{package.name}")) - # pyuic script - if package.name.lower() == "pyqt5": - # see http://code.activestate.com/lists/python-list/666469/ - tmp_string = r"""@echo off -if "%WINPYDIR%"=="" call "%~dp0..\..\scripts\env.bat" -"%WINPYDIR%\python.exe" -m PyQt5.uic.pyuic %1 %2 %3 %4 %5 %6 %7 %8 %9""" - else: - tmp_string = r"""@echo off -if "%WINPYDIR%"=="" call "%~dp0..\..\scripts\env.bat" -"%WINPYDIR%\python.exe" "%WINPYDIR%\Lib\site-packages\package.name\uic\pyuic.py" %1 %2 %3 %4 %5 %6 %7 %8 %9""" - # PyPy adaption: python.exe or pypy3.exe - my_exec = Path(utils.get_python_executable(self.target)).name - tmp_string = tmp_string.replace("python.exe", my_exec).replace("package.name", package.name) - self.create_file(package, f"pyuic{package.name[-1]}.bat", "Scripts", tmp_string) - # Adding missing __init__.py files (fixes Issue 8) - uic_path = str(Path("Lib") / "site-packages" / package.name / "uic") - for dirname in ("Loader", "port_v2", "port_v3"): - self.create_file(package, "__init__.py", str(Path(uic_path) / dirname), "") - - def _print(self, package: Package, action: str): - """Print package-related action text.""" - text = f"{action} {package.name} {package.version}" - if self.verbose: - utils.print_box(text) - else: - print(f" {text}...", end=" ") - - def _print_done(self): - """Print OK at the end of a process""" - if not self.verbose: - print("OK") - - def uninstall(self, package): - """Uninstall package from distribution""" - self._print(package, "Uninstalling") - if package.name != "pip": - # trick to get true target (if not current) - this_exec = utils.get_python_executable(self.target) # PyPy ! - subprocess.call([this_exec, "-m", "pip", "uninstall", package.name, "-y"], cwd=self.target) - self._print_done() - - def install_bdist_direct(self, package, install_options=None): - """Install a package directly !""" - self._print(package,f"Installing {package.fname.split('.')[-1]}") - try: - fname = utils.direct_pip_install( - package.fname, - python_exe=utils.get_python_executable(self.target), # PyPy ! - verbose=self.verbose, - install_options=install_options, - ) - except RuntimeError: - if not self.verbose: - print("Failed!") - raise - package = Package(fname) - self._print_done() - -def main(test=False): - - registerWinPythonHelp = f"Register WinPython: associate file extensions, icons and context menu with this WinPython" - unregisterWinPythonHelp = f"Unregister WinPython: de-associate file extensions, icons and context menu from this WinPython" - parser = ArgumentParser( - description="WinPython Package Manager: handle a WinPython Distribution and its packages", - formatter_class=RawTextHelpFormatter, - ) - parser.add_argument("fname", metavar="package(s) or lockfile", nargs="*", default=[""], type=str, help="optional package names, wheels, or lockfile") - parser.add_argument("-v", "--verbose", action="store_true", help="show more details on packages and actions") - parser.add_argument( "--register", dest="registerWinPython", action="store_true", help=registerWinPythonHelp) - parser.add_argument("--unregister", dest="unregisterWinPython", action="store_true", help=unregisterWinPythonHelp) - parser.add_argument("--fix", action="store_true", help="make WinPython fix") - parser.add_argument("--movable", action="store_true", help="make WinPython movable") - parser.add_argument("-ws", dest="wheelsource", default=None, type=str, help="wheels location, '.' = WheelHouse): wppm pylock.toml -ws source_of_wheels, wppm -ls -ws .") - parser.add_argument("-wd", dest="wheeldrain" , default=None, type=str, help="wheels destination: wppm pylock.toml -wd destination_of_wheels") - parser.add_argument("-ls", "--list", action="store_true", help="list installed packages matching [optional] expression: wppm -ls, wppm -ls pand") - parser.add_argument("-lsa", dest="all", action="store_true",help=f"list details of packages matching [optional] expression: wppm -lsa pandas -l1") - parser.add_argument("-md", dest="markdown", action="store_true",help=f"markdown summary of the installation") - parser.add_argument("-p",dest="pipdown",action="store_true",help="show Package dependencies of the given package[option], [.]=all: wppm -p pandas[.]") - parser.add_argument("-r", dest="pipup", action="store_true", help=f"show Reverse (!= constraining) dependancies of the given package[option]: wppm -r pytest![test]") - parser.add_argument("-l", dest="levels", type=int, default=-1, help="show 'LEVELS' levels of dependencies (with -p, -r): wppm -p pandas -l1") - parser.add_argument("-t", dest="target", default=sys.prefix, help=f'path to target Python distribution (default: "{sys.prefix}")') - parser.add_argument("-i", "--install", action="store_true", help="install a given package wheel or pylock file (use pip for more features)") - parser.add_argument("-u", "--uninstall", action="store_true", help="uninstall package (use pip for more features)") - - args = parser.parse_args() - targetpython = None - if args.target and args.target != sys.prefix: - targetpython = args.target if args.target.lower().endswith('.exe') else str(Path(args.target) / 'python.exe') - if args.wheelsource == ".": # play in default WheelHouse - if utils.is_python_distribution(args.target): - dist = Distribution(args.target) - args.wheelsource = dist.wheelhouse / 'included.wheels' - if args.install and args.uninstall: - raise RuntimeError("Incompatible arguments: --install and --uninstall") - if args.registerWinPython and args.unregisterWinPython: - raise RuntimeError("Incompatible arguments: --install and --uninstall") - if args.pipdown: - pip = piptree.PipData(targetpython, args.wheelsource) - for args_fname in args.fname: - pack, extra, *other = (args_fname + "[").replace("]", "[").split("[") - print(pip.down(pack, extra, args.levels if args.levels>0 else 2, verbose=args.verbose)) - sys.exit() - elif args.pipup: - pip = piptree.PipData(targetpython, args.wheelsource) - for args_fname in args.fname: - pack, extra, *other = (args_fname + "[").replace("]", "[").split("[") - print(pip.up(pack, extra, args.levels if args.levels>=0 else 1, verbose=args.verbose)) - sys.exit() - elif args.list: - pip = piptree.PipData(targetpython, args.wheelsource) - todo= [] - for args_fname in args.fname: - todo += [l for l in pip.pip_list(full=True) if bool(re.search(args_fname, l[0]))] - todo = sorted(set(todo)) #, key=lambda p: (p[0].lower(), p[2]) - titles = [['Package', 'Version', 'Summary'], ['_' * max(x, 6) for x in utils.columns_width(todo)]] - listed = utils.formatted_list(titles + todo, max_width=70) - for p in listed: - print(*p) - sys.exit() - elif args.all: - pip = piptree.PipData(targetpython, args.wheelsource) - for args_fname in args.fname: - todo = [l for l in pip.pip_list(full=True) if bool(re.search(args_fname, l[0]))] - for l in sorted(set(todo)): - title = f"** Package: {l[0]} **" - print("\n" + "*" * len(title), f"\n{title}", "\n" + "*" * len(title)) - for key, value in pip.raw[l[0]].items(): - rawtext = json.dumps(value, indent=2, ensure_ascii=False) - lines = [l for l in rawtext.split(r"\n") if len(l.strip()) > 2] - if key.lower() != 'description' or args.verbose: - print(f"{key}: ", "\n".join(lines).replace('"', "")) - sys.exit() - if args.registerWinPython: - print(registerWinPythonHelp) - if utils.is_python_distribution(args.target): - dist = Distribution(args.target) - else: - raise OSError(f"Invalid Python distribution {args.target}") - print(f"registering {args.target}") - print("continue ? Y/N") - theAnswer = input() - if theAnswer == "Y": - associate.register(dist.target, verbose=args.verbose) - sys.exit() - if args.unregisterWinPython: - print(unregisterWinPythonHelp) - if utils.is_python_distribution(args.target): - dist = Distribution(args.target) - else: - raise OSError(f"Invalid Python distribution {args.target}") - print(f"unregistering {args.target}") - print("continue ? Y/N") - theAnswer = input() - if theAnswer == "Y": - associate.unregister(dist.target, verbose=args.verbose) - sys.exit() - if utils.is_python_distribution(args.target): - dist = Distribution(args.target, verbose=True) - cmd_fix = rf"from winpython import wppm;dist=wppm.Distribution(r'{dist.target}');dist.patch_standard_packages('pip', to_movable=False)" - cmd_mov = rf"from winpython import wppm;dist=wppm.Distribution(r'{dist.target}');dist.patch_standard_packages('pip', to_movable=True)" - if args.fix: - # dist.patch_standard_packages('pip', to_movable=False) # would fail on wppm.exe - p = subprocess.Popen(["start", "cmd", "/k",dist.python_exe, "-c" , cmd_fix], shell = True, cwd=dist.target) - sys.exit() - if args.movable: - p = subprocess.Popen(["start", "cmd", "/k",dist.python_exe, "-c" , cmd_mov], shell = True, cwd=dist.target) - sys.exit() - if args.markdown: - default = dist.generate_package_index_markdown() - if args.wheelsource: - compare = dist.generate_package_index_markdown(wheeldir = args.wheelsource) - print(diff.compare_markdown_sections(default, compare,'python', 'wheelhouse', 'installed', 'wheelhouse')) - else: - print(default) - sys.exit() - if not args.install and not args.uninstall and args.fname[0].endswith(".toml"): - args.install = True # for Drag & Drop of .toml (and not wheel) - if args.fname[0] == "" or (not args.install and not args.uninstall): - parser.print_help() - sys.exit() - else: - try: - for args_fname in args.fname: - filename = Path(args_fname).name - install_from_wheelhouse = ["--no-index", "--trusted-host=None", f"--find-links={dist.wheelhouse / 'included.wheels'}"] - if filename.split('.')[0] == "pylock" and filename.split('.')[-1] == 'toml': - print(' a lock file !', args_fname, dist.target) - wh.get_pylock_wheels(dist.wheelhouse, Path(args_fname), args.wheelsource, args.wheeldrain) - sys.exit() - if args.uninstall: - package = dist.find_package(args_fname) - dist.uninstall(package) - elif args.install: - package = Package(args_fname) - if args.install: - dist.install(package, install_options=install_from_wheelhouse) - except NotImplementedError: - raise RuntimeError("Package is not (yet) supported by WPPM") - else: - raise OSError(f"Invalid Python distribution {args.target}") - - -if __name__ == "__main__": +# -*- coding: utf-8 -*- +# +# WinPython Package Manager +# Copyright © 2012 Pierre Raybaut +# Copyright © 2014-2025+ The Winpython development team https://github.com/winpython/ +# Licensed under the terms of the MIT License +# (see winpython/__init__.py for details) + +import os +import re +import sys +import shutil +import subprocess +import json +from pathlib import Path +from argparse import ArgumentParser, RawTextHelpFormatter +from . import utils, piptree, associate, diff +from . import wheelhouse as wh +from operator import itemgetter +# Workaround for installing PyVISA on Windows from source: +os.environ["HOME"] = os.environ["USERPROFILE"] + +class Package: + """Standardize a Package from filename or pip list.""" + def __init__(self, fname: str, suggested_summary: str = None): + self.fname = fname + self.description = (utils.sum_up(suggested_summary) if suggested_summary else "").strip() + self.name, self.version = fname, '?.?.?' + if fname.lower().endswith((".zip", ".tar.gz", ".whl")): + bname = Path(self.fname).name # e.g., "sqlite_bro-1.0.0..." + infos = utils.get_source_package_infos(bname) # get name, version + if infos: + self.name, self.version = utils.normalize(infos[0]), infos[1] + self.url = f"https://pypi.org/project/{self.name}" + self.files = [] + + def __str__(self): + return f"{self.name} {self.version}\r\n{self.description}\r\nWebsite: {self.url}" + + +class Distribution: + """Handles operations on a WinPython distribution.""" + def __init__(self, target: str = None, verbose: bool = False): + self.target = target or str(Path(sys.executable).parent) # Default target more explicit + self.verbose = verbose + self.pip = None + self.to_be_removed = [] + self.version, self.architecture = utils.get_python_infos(self.target) + self.python_exe = utils.get_python_executable(self.target) + self.short_exe = Path(self.python_exe).name + self.wheelhouse = Path(self.target).parent / "wheelhouse" + + def create_file(self, package, name, dstdir, contents): + """Generate data file -- path is relative to distribution root dir""" + dst = Path(dstdir) / name + if self.verbose: + print(f"create: {dst}") + full_dst = Path(self.target) / dst + with open(full_dst, "w") as fd: + fd.write(contents) + package.files.append(str(dst)) + + def get_installed_packages(self, update: bool = False) -> list[Package]: + """Return installed packages.""" + if str(Path(sys.executable).parent) == self.target: + self.pip = piptree.PipData() + else: + self.pip = piptree.PipData(utils.get_python_executable(self.target)) + pip_list = self.pip.pip_list(full=True) + return [Package(f"{i[0].replace('-', '_').lower()}-{i[1]}-py3-none-any.whl", suggested_summary=i[2]) for i in pip_list] + + def render_markdown_for_list(self, title, items): + """Generates a Markdown section; name, url, version, summary""" + md = f"### {title}\n\n" + md += "Name | Version | Description\n" + md += "-----|---------|------------\n" + for name, url, version, summary in sorted(items, key=lambda p: (p[0].lower(), p[2])): + md += f"[{name}]({url}) | {version} | {summary}\n" + md += "\n" + return md + + def generate_package_index_markdown(self, python_executable_directory: str|None = None, winpyver2: str|None = None, + flavor: str|None = None, architecture_bits: int|None = None + , release_level: str|None = None, wheeldir: str|None = None) -> str: + """Generates a Markdown formatted package index page.""" + my_ver , my_arch = utils.get_python_infos(python_executable_directory or self.target) + my_winpyver2 = winpyver2 or os.getenv("WINPYVER2","") + my_winpyver2 = my_winpyver2 if my_winpyver2 != "" else my_ver + my_flavor = flavor or os.getenv("WINPYFLAVOR", "") + my_release_level = release_level or os.getenv("WINPYVER", "").replace(my_winpyver2+my_flavor, "") + + tools_list = utils.get_installed_tools(utils.get_python_executable(python_executable_directory)) + package_list = [(pkg.name, pkg.url, pkg.version, pkg.description) for pkg in self.get_installed_packages()] + wheelhouse_list = [] + my_wheeldir = Path(wheeldir) if wheeldir else self.wheelhouse / 'included.wheels' + if my_wheeldir.is_dir(): + wheelhouse_list = [(name, f"https://pypi.org/project/{name}", version, utils.sum_up(summary)) + for name, version, summary in wh.list_packages_with_metadata(str(my_wheeldir)) ] + + return f"""## WinPython {my_winpyver2 + my_flavor} + +The following packages are included in WinPython-{my_arch}bit v{my_winpyver2 + my_flavor} {my_release_level}. + +
    + +{self.render_markdown_for_list("Tools", tools_list)} +{self.render_markdown_for_list("Python packages", package_list)} +{self.render_markdown_for_list("WheelHouse packages", wheelhouse_list)} +
    +""" + + def find_package(self, name: str) -> Package | None: + """Find installed package by name.""" + for pack in self.get_installed_packages(): + if utils.normalize(pack.name) == utils.normalize(name): + return pack + + def patch_all_shebang(self, to_movable: bool = True, max_exe_size: int = 999999, targetdir: str = ""): + """Make all python launchers relative.""" + for ffname in Path(self.target).glob("Scripts/*.exe"): + if ffname.stat().st_size <= max_exe_size: + utils.patch_shebang_line(ffname, to_movable=to_movable, targetdir=targetdir) + for ffname in Path(self.target).glob("Scripts/*.py"): + utils.patch_shebang_line_py(ffname, to_movable=to_movable, targetdir=targetdir) + + def install(self, package: Package, install_options: list[str] = None): + """Install package in distribution.""" + if package.fname.endswith((".whl", ".tar.gz", ".zip")) or ( + ' ' not in package.fname and ';' not in package.fname and len(package.fname) >1): # Check extension with tuple + self.install_bdist_direct(package, install_options=install_options) + self.handle_specific_packages(package) + # minimal post-install actions + self.patch_standard_packages(package.name) + + def do_pip_action(self, actions: list[str] = None, install_options: list[str] = None): + """Execute pip action in the distribution.""" + my_list = install_options or [] + my_actions = actions or [] + executing = str(Path(self.target).parent / "scripts" / "env.bat") + if Path(executing).is_file(): + complement = [r"&&", "cd", "/D", self.target, r"&&", utils.get_python_executable(self.target), "-m", "pip"] + else: + executing = utils.get_python_executable(self.target) + complement = ["-m", "pip"] + try: + fname = utils.do_script(this_script=None, python_exe=executing, verbose=self.verbose, install_options=complement + my_actions + my_list) + except RuntimeError as e: + if not self.verbose: + print("Failed!") + raise + else: + print(f"Pip action failed with error: {e}") # Print error if verbose + + def patch_standard_packages(self, package_name="", to_movable=True): + """patch Winpython packages in need""" + import filecmp + + # 'pywin32' minimal post-install (pywin32_postinstall.py do too much) + if package_name.lower() in ("", "pywin32"): + origin = Path(self.target) / "site-packages" / "pywin32_system32" + destin = Path(self.target) + if origin.is_dir(): + for name in os.listdir(origin): + here, there = origin / name, destin / name + if not there.exists() or not filecmp.cmp(here, there): + shutil.copyfile(here, there) + # 'pip' to do movable launchers (around line 100) !!!! + # rational: https://github.com/pypa/pip/issues/2328 + if package_name.lower() == "pip" or package_name == "": + # ensure pip will create movable launchers + # sheb_mov1 = classic way up to WinPython 2016-01 + # sheb_mov2 = tried way, but doesn't work for pip (at least) + the_place = Path(self.target) / "lib" / "site-packages" / "pip" / "_vendor" / "distlib" / "scripts.py" + sheb_fix = " executable = get_executable()" + sheb_mov1 = " executable = os.path.join(os.path.basename(get_executable()))" + sheb_mov2 = " executable = os.path.join('..',os.path.basename(get_executable()))" + if to_movable: + utils.patch_sourcefile(the_place, sheb_fix, sheb_mov1) + utils.patch_sourcefile(the_place, sheb_mov2, sheb_mov1) + else: + utils.patch_sourcefile(the_place, sheb_mov1, sheb_fix) + utils.patch_sourcefile(the_place, sheb_mov2, sheb_fix) + + # create movable launchers for previous package installations + self.patch_all_shebang(to_movable=to_movable) + if package_name.lower() in ("", "spyder"): + # spyder don't goes on internet without you ask + utils.patch_sourcefile( + Path(self.target) / "lib" / "site-packages" / "spyder" / "config" / "main.py", + "'check_updates_on_startup': True,", + "'check_updates_on_startup': False,", + ) + + + def handle_specific_packages(self, package): + """Packages requiring additional configuration""" + if package.name.lower() in ("pyqt4", "pyqt5", "pyside2"): + # Qt configuration file (where to find Qt) + name = "qt.conf" + contents = """[Paths]\nPrefix = .\nBinaries = .""" + self.create_file(package, name, str(Path("Lib") / "site-packages" / package.name), contents) + self.create_file(package, name, ".", contents.replace(".", f"./Lib/site-packages/{package.name}")) + # pyuic script + if package.name.lower() == "pyqt5": + # see http://code.activestate.com/lists/python-list/666469/ + tmp_string = r"""@echo off +if "%WINPYDIR%"=="" call "%~dp0..\..\scripts\env.bat" +"%WINPYDIR%\python.exe" -m PyQt5.uic.pyuic %1 %2 %3 %4 %5 %6 %7 %8 %9""" + else: + tmp_string = r"""@echo off +if "%WINPYDIR%"=="" call "%~dp0..\..\scripts\env.bat" +"%WINPYDIR%\python.exe" "%WINPYDIR%\Lib\site-packages\package.name\uic\pyuic.py" %1 %2 %3 %4 %5 %6 %7 %8 %9""" + # PyPy adaption: python.exe or pypy3.exe + my_exec = Path(utils.get_python_executable(self.target)).name + tmp_string = tmp_string.replace("python.exe", my_exec).replace("package.name", package.name) + self.create_file(package, f"pyuic{package.name[-1]}.bat", "Scripts", tmp_string) + # Adding missing __init__.py files (fixes Issue 8) + uic_path = str(Path("Lib") / "site-packages" / package.name / "uic") + for dirname in ("Loader", "port_v2", "port_v3"): + self.create_file(package, "__init__.py", str(Path(uic_path) / dirname), "") + + def _print(self, package: Package, action: str): + """Print package-related action text.""" + text = f"{action} {package.name} {package.version}" + if self.verbose: + utils.print_box(text) + else: + print(f" {text}...", end=" ") + + def _print_done(self): + """Print OK at the end of a process""" + if not self.verbose: + print("OK") + + def uninstall(self, package): + """Uninstall package from distribution""" + self._print(package, "Uninstalling") + if package.name != "pip": + # trick to get true target (if not current) + this_exec = utils.get_python_executable(self.target) # PyPy ! + subprocess.call([this_exec, "-m", "pip", "uninstall", package.name, "-y"], cwd=self.target) + self._print_done() + + def install_bdist_direct(self, package, install_options=None): + """Install a package directly !""" + self._print(package,f"Installing {package.fname.split('.')[-1]}") + try: + fname = utils.direct_pip_install( + package.fname, + python_exe=utils.get_python_executable(self.target), # PyPy ! + verbose=self.verbose, + install_options=install_options, + ) + except RuntimeError: + if not self.verbose: + print("Failed!") + raise + package = Package(fname) + self._print_done() + +def main(test=False): + + registerWinPythonHelp = f"Register WinPython: associate file extensions, icons and context menu with this WinPython" + unregisterWinPythonHelp = f"Unregister WinPython: de-associate file extensions, icons and context menu from this WinPython" + parser = ArgumentParser(prog="wppm", + description="WinPython Package Manager: handle a WinPython Distribution and its packages", + formatter_class=RawTextHelpFormatter, + ) + parser.add_argument("fname", metavar="package(s) or lockfile", nargs="*", default=[""], type=str, help="optional package names, wheels, or lockfile") + parser.add_argument("-v", "--verbose", action="store_true", help="show more details on packages and actions") + parser.add_argument( "--register", dest="registerWinPython", action="store_true", help=registerWinPythonHelp) + parser.add_argument("--unregister", dest="unregisterWinPython", action="store_true", help=unregisterWinPythonHelp) + parser.add_argument("--fix", action="store_true", help="make WinPython fix") + parser.add_argument("--movable", action="store_true", help="make WinPython movable") + parser.add_argument("-ws", dest="wheelsource", default=None, type=str, help="wheels location, '.' = WheelHouse): wppm pylock.toml -ws source_of_wheels, wppm -ls -ws .") + parser.add_argument("-wd", dest="wheeldrain" , default=None, type=str, help="wheels destination: wppm pylock.toml -wd destination_of_wheels") + parser.add_argument("-ls", "--list", action="store_true", help="list installed packages matching [optional] expression: wppm -ls, wppm -ls pand") + parser.add_argument("-lsa", dest="all", action="store_true",help=f"list details of packages matching [optional] expression: wppm -lsa pandas -l1") + parser.add_argument("-md", dest="markdown", action="store_true",help=f"markdown summary of the installation") + parser.add_argument("-p",dest="pipdown",action="store_true",help="show Package dependencies of the given package[option], [.]=all: wppm -p pandas[.]") + parser.add_argument("-r", dest="pipup", action="store_true", help=f"show Reverse (!= constraining) dependancies of the given package[option]: wppm -r pytest![test]") + parser.add_argument("-l", dest="levels", type=int, default=-1, help="show 'LEVELS' levels of dependencies (with -p, -r): wppm -p pandas -l1") + parser.add_argument("-t", dest="target", default=sys.prefix, help=f'path to target Python distribution (default: "{sys.prefix}")') + parser.add_argument("-i", "--install", action="store_true", help="install a given package wheel or pylock file (use pip for more features)") + parser.add_argument("-u", "--uninstall", action="store_true", help="uninstall package (use pip for more features)") + + args = parser.parse_args() + targetpython = None + if args.target and args.target != sys.prefix: + targetpython = args.target if args.target.lower().endswith('.exe') else str(Path(args.target) / 'python.exe') + if args.wheelsource == ".": # play in default WheelHouse + if utils.is_python_distribution(args.target): + dist = Distribution(args.target) + args.wheelsource = dist.wheelhouse / 'included.wheels' + if args.install and args.uninstall: + raise RuntimeError("Incompatible arguments: --install and --uninstall") + if args.registerWinPython and args.unregisterWinPython: + raise RuntimeError("Incompatible arguments: --install and --uninstall") + if args.pipdown: + pip = piptree.PipData(targetpython, args.wheelsource) + for args_fname in args.fname: + pack, extra, *other = (args_fname + "[").replace("]", "[").split("[") + print(pip.down(pack, extra, args.levels if args.levels>0 else 2, verbose=args.verbose)) + sys.exit() + elif args.pipup: + pip = piptree.PipData(targetpython, args.wheelsource) + for args_fname in args.fname: + pack, extra, *other = (args_fname + "[").replace("]", "[").split("[") + print(pip.up(pack, extra, args.levels if args.levels>=0 else 1, verbose=args.verbose)) + sys.exit() + elif args.list: + pip = piptree.PipData(targetpython, args.wheelsource) + todo= [] + for args_fname in args.fname: + todo += [l for l in pip.pip_list(full=True) if bool(re.search(args_fname, l[0]))] + todo = sorted(set(todo)) #, key=lambda p: (p[0].lower(), p[2]) + titles = [['Package', 'Version', 'Summary'], ['_' * max(x, 6) for x in utils.columns_width(todo)]] + listed = utils.formatted_list(titles + todo, max_width=70) + for p in listed: + print(*p) + sys.exit() + elif args.all: + pip = piptree.PipData(targetpython, args.wheelsource) + for args_fname in args.fname: + todo = [l for l in pip.pip_list(full=True) if bool(re.search(args_fname, l[0]))] + for l in sorted(set(todo)): + title = f"** Package: {l[0]} **" + print("\n" + "*" * len(title), f"\n{title}", "\n" + "*" * len(title)) + for key, value in pip.raw[l[0]].items(): + rawtext = json.dumps(value, indent=2, ensure_ascii=False) + lines = [l for l in rawtext.split(r"\n") if len(l.strip()) > 2] + if key.lower() != 'description' or args.verbose: + print(f"{key}: ", "\n".join(lines).replace('"', "")) + sys.exit() + if args.registerWinPython: + print(registerWinPythonHelp) + if utils.is_python_distribution(args.target): + dist = Distribution(args.target) + else: + raise OSError(f"Invalid Python distribution {args.target}") + print(f"registering {args.target}") + print("continue ? Y/N") + theAnswer = input() + if theAnswer == "Y": + associate.register(dist.target, verbose=args.verbose) + sys.exit() + if args.unregisterWinPython: + print(unregisterWinPythonHelp) + if utils.is_python_distribution(args.target): + dist = Distribution(args.target) + else: + raise OSError(f"Invalid Python distribution {args.target}") + print(f"unregistering {args.target}") + print("continue ? Y/N") + theAnswer = input() + if theAnswer == "Y": + associate.unregister(dist.target, verbose=args.verbose) + sys.exit() + if utils.is_python_distribution(args.target): + dist = Distribution(args.target, verbose=True) + cmd_fix = rf"from winpython import wppm;dist=wppm.Distribution(r'{dist.target}');dist.patch_standard_packages('pip', to_movable=False)" + cmd_mov = rf"from winpython import wppm;dist=wppm.Distribution(r'{dist.target}');dist.patch_standard_packages('pip', to_movable=True)" + if args.fix: + # dist.patch_standard_packages('pip', to_movable=False) # would fail on wppm.exe + p = subprocess.Popen(["start", "cmd", "/k",dist.python_exe, "-c" , cmd_fix], shell = True, cwd=dist.target) + sys.exit() + if args.movable: + p = subprocess.Popen(["start", "cmd", "/k",dist.python_exe, "-c" , cmd_mov], shell = True, cwd=dist.target) + sys.exit() + if args.markdown: + default = dist.generate_package_index_markdown() + if args.wheelsource: + compare = dist.generate_package_index_markdown(wheeldir = args.wheelsource) + print(diff.compare_markdown_sections(default, compare,'python', 'wheelhouse', 'installed', 'wheelhouse')) + else: + print(default) + sys.exit() + if not args.install and not args.uninstall and args.fname[0].endswith(".toml"): + args.install = True # for Drag & Drop of .toml (and not wheel) + if args.fname[0] == "" or (not args.install and not args.uninstall): + parser.print_help() + sys.exit() + else: + try: + for args_fname in args.fname: + filename = Path(args_fname).name + install_from_wheelhouse = ["--no-index", "--trusted-host=None", f"--find-links={dist.wheelhouse / 'included.wheels'}"] + if filename.split('.')[0] == "pylock" and filename.split('.')[-1] == 'toml': + print(' a lock file !', args_fname, dist.target) + wh.get_pylock_wheels(dist.wheelhouse, Path(args_fname), args.wheelsource, args.wheeldrain) + sys.exit() + if args.uninstall: + package = dist.find_package(args_fname) + dist.uninstall(package) + elif args.install: + package = Package(args_fname) + if args.install: + dist.install(package, install_options=install_from_wheelhouse) + except NotImplementedError: + raise RuntimeError("Package is not (yet) supported by WPPM") + else: + raise OSError(f"Invalid Python distribution {args.target}") + + +if __name__ == "__main__": main() \ No newline at end of file From a59044e47b91d6351468ac339413bbd4fbb86e1d Mon Sep 17 00:00:00 2001 From: stonebig Date: Sun, 29 Jun 2025 15:49:27 +0200 Subject: [PATCH 249/305] have the target structure more already made --- make.py | 15 --------------- .../launchers_final/notebooks/docs/README.txt | 1 + .../{ => launchers_final}/scripts/WinPythonIni.py | 0 .../scripts/WinPython_PS_Prompt.ps1 | 0 .../{ => launchers_final}/scripts/activate.bat | 0 portable/{ => launchers_final}/scripts/cmd.bat | 0 portable/{ => launchers_final}/scripts/cmd_ps.bat | 0 portable/{ => launchers_final}/scripts/env.bat | 0 .../scripts/env_for_icons.bat | 0 ...ing_directory_and_userprofile_be_winpython.bat | 0 .../make_working_directory_be_not_winpython.bat | 0 .../make_working_directory_be_winpython.bat | 0 portable/{ => launchers_final}/scripts/python.bat | 0 portable/{ => launchers_final}/scripts/readme.txt | 0 .../scripts/spyder_reset.bat | 0 .../{ => launchers_final}/scripts/upgrade_pip.bat | 0 .../{ => launchers_final}/scripts/winidle.bat | 0 .../scripts/winipython_notebook.bat | 0 .../scripts/winjupyter_lab.bat | 0 .../{ => launchers_final}/scripts/winpython.bat | 0 .../{ => launchers_final}/scripts/winspyder.bat | 0 .../{ => launchers_final}/scripts/winvscode.bat | 0 portable/{ => launchers_final}/scripts/wpcp.bat | 0 23 files changed, 1 insertion(+), 15 deletions(-) create mode 100644 portable/launchers_final/notebooks/docs/README.txt rename portable/{ => launchers_final}/scripts/WinPythonIni.py (100%) rename portable/{ => launchers_final}/scripts/WinPython_PS_Prompt.ps1 (100%) rename portable/{ => launchers_final}/scripts/activate.bat (100%) rename portable/{ => launchers_final}/scripts/cmd.bat (100%) rename portable/{ => launchers_final}/scripts/cmd_ps.bat (100%) rename portable/{ => launchers_final}/scripts/env.bat (100%) rename portable/{ => launchers_final}/scripts/env_for_icons.bat (100%) rename portable/{ => launchers_final}/scripts/make_working_directory_and_userprofile_be_winpython.bat (100%) rename portable/{ => launchers_final}/scripts/make_working_directory_be_not_winpython.bat (100%) rename portable/{ => launchers_final}/scripts/make_working_directory_be_winpython.bat (100%) rename portable/{ => launchers_final}/scripts/python.bat (100%) rename portable/{ => launchers_final}/scripts/readme.txt (100%) rename portable/{ => launchers_final}/scripts/spyder_reset.bat (100%) rename portable/{ => launchers_final}/scripts/upgrade_pip.bat (100%) rename portable/{ => launchers_final}/scripts/winidle.bat (100%) rename portable/{ => launchers_final}/scripts/winipython_notebook.bat (100%) rename portable/{ => launchers_final}/scripts/winjupyter_lab.bat (100%) rename portable/{ => launchers_final}/scripts/winpython.bat (100%) rename portable/{ => launchers_final}/scripts/winspyder.bat (100%) rename portable/{ => launchers_final}/scripts/winvscode.bat (100%) rename portable/{ => launchers_final}/scripts/wpcp.bat (100%) diff --git a/make.py b/make.py index 651cb458..5781ad67 100644 --- a/make.py +++ b/make.py @@ -167,27 +167,13 @@ def _extract_python_archive(self): def _copy_essential_files(self): """Copies pre-made objects""" - self._print_action("Copying default scripts") - copy_items([PORTABLE_DIRECTORY / "scripts"], self.winpython_directory / "scripts", self.verbose) - self._print_action("Copying launchers") copy_items([PORTABLE_DIRECTORY / "launchers_final"], self.winpython_directory, self.verbose) - docs_target_directory = self.winpython_directory / "notebooks" / "docs" - self._print_action(f"Copying documentation to {docs_target_directory}") - copy_items(self.documentation_directories, docs_target_directory, self.verbose) - tools_target_directory = self.winpython_directory / "t" self._print_action(f"Copying tools to {tools_target_directory}") copy_items(self.tools_directories, tools_target_directory, self.verbose) - if (nodejs_current_directory := tools_target_directory / "n").is_dir(): - self._print_action(f"Moving tools from {nodejs_current_directory} to {tools_target_directory.parent / NODEJS_RELATIVE_PATH}") - try: - shutil.move(nodejs_current_directory, tools_target_directory.parent / NODEJS_RELATIVE_PATH) - except Exception as e: - print(f"Error moving Node.js directory: {e}") - def _create_initial_batch_scripts(self): """Creates initial batch scripts, including environment setup.""" self._print_action("Creating initial batch scripts") @@ -295,7 +281,6 @@ def make_all(build_number: int, release_level: str, pyver: str, architecture: in os.makedirs(build_directory, exist_ok=True) # use source_dirs as the directory to re-build Winpython wheel winpython_source_dir = Path(__file__).resolve().parent - # 2025-06-28 no more: rebuild_winpython_package(winpython_source_dir, Path(source_dirs), architecture, verbose) builder = WinPythonDistributionBuilder( build_number, release_level, build_directory, wheels_directory=source_dirs, diff --git a/portable/launchers_final/notebooks/docs/README.txt b/portable/launchers_final/notebooks/docs/README.txt new file mode 100644 index 00000000..a0aab429 --- /dev/null +++ b/portable/launchers_final/notebooks/docs/README.txt @@ -0,0 +1 @@ +Examples are now to be found at github.com/winpython/winpython_afterdoc \ No newline at end of file diff --git a/portable/scripts/WinPythonIni.py b/portable/launchers_final/scripts/WinPythonIni.py similarity index 100% rename from portable/scripts/WinPythonIni.py rename to portable/launchers_final/scripts/WinPythonIni.py diff --git a/portable/scripts/WinPython_PS_Prompt.ps1 b/portable/launchers_final/scripts/WinPython_PS_Prompt.ps1 similarity index 100% rename from portable/scripts/WinPython_PS_Prompt.ps1 rename to portable/launchers_final/scripts/WinPython_PS_Prompt.ps1 diff --git a/portable/scripts/activate.bat b/portable/launchers_final/scripts/activate.bat similarity index 100% rename from portable/scripts/activate.bat rename to portable/launchers_final/scripts/activate.bat diff --git a/portable/scripts/cmd.bat b/portable/launchers_final/scripts/cmd.bat similarity index 100% rename from portable/scripts/cmd.bat rename to portable/launchers_final/scripts/cmd.bat diff --git a/portable/scripts/cmd_ps.bat b/portable/launchers_final/scripts/cmd_ps.bat similarity index 100% rename from portable/scripts/cmd_ps.bat rename to portable/launchers_final/scripts/cmd_ps.bat diff --git a/portable/scripts/env.bat b/portable/launchers_final/scripts/env.bat similarity index 100% rename from portable/scripts/env.bat rename to portable/launchers_final/scripts/env.bat diff --git a/portable/scripts/env_for_icons.bat b/portable/launchers_final/scripts/env_for_icons.bat similarity index 100% rename from portable/scripts/env_for_icons.bat rename to portable/launchers_final/scripts/env_for_icons.bat diff --git a/portable/scripts/make_working_directory_and_userprofile_be_winpython.bat b/portable/launchers_final/scripts/make_working_directory_and_userprofile_be_winpython.bat similarity index 100% rename from portable/scripts/make_working_directory_and_userprofile_be_winpython.bat rename to portable/launchers_final/scripts/make_working_directory_and_userprofile_be_winpython.bat diff --git a/portable/scripts/make_working_directory_be_not_winpython.bat b/portable/launchers_final/scripts/make_working_directory_be_not_winpython.bat similarity index 100% rename from portable/scripts/make_working_directory_be_not_winpython.bat rename to portable/launchers_final/scripts/make_working_directory_be_not_winpython.bat diff --git a/portable/scripts/make_working_directory_be_winpython.bat b/portable/launchers_final/scripts/make_working_directory_be_winpython.bat similarity index 100% rename from portable/scripts/make_working_directory_be_winpython.bat rename to portable/launchers_final/scripts/make_working_directory_be_winpython.bat diff --git a/portable/scripts/python.bat b/portable/launchers_final/scripts/python.bat similarity index 100% rename from portable/scripts/python.bat rename to portable/launchers_final/scripts/python.bat diff --git a/portable/scripts/readme.txt b/portable/launchers_final/scripts/readme.txt similarity index 100% rename from portable/scripts/readme.txt rename to portable/launchers_final/scripts/readme.txt diff --git a/portable/scripts/spyder_reset.bat b/portable/launchers_final/scripts/spyder_reset.bat similarity index 100% rename from portable/scripts/spyder_reset.bat rename to portable/launchers_final/scripts/spyder_reset.bat diff --git a/portable/scripts/upgrade_pip.bat b/portable/launchers_final/scripts/upgrade_pip.bat similarity index 100% rename from portable/scripts/upgrade_pip.bat rename to portable/launchers_final/scripts/upgrade_pip.bat diff --git a/portable/scripts/winidle.bat b/portable/launchers_final/scripts/winidle.bat similarity index 100% rename from portable/scripts/winidle.bat rename to portable/launchers_final/scripts/winidle.bat diff --git a/portable/scripts/winipython_notebook.bat b/portable/launchers_final/scripts/winipython_notebook.bat similarity index 100% rename from portable/scripts/winipython_notebook.bat rename to portable/launchers_final/scripts/winipython_notebook.bat diff --git a/portable/scripts/winjupyter_lab.bat b/portable/launchers_final/scripts/winjupyter_lab.bat similarity index 100% rename from portable/scripts/winjupyter_lab.bat rename to portable/launchers_final/scripts/winjupyter_lab.bat diff --git a/portable/scripts/winpython.bat b/portable/launchers_final/scripts/winpython.bat similarity index 100% rename from portable/scripts/winpython.bat rename to portable/launchers_final/scripts/winpython.bat diff --git a/portable/scripts/winspyder.bat b/portable/launchers_final/scripts/winspyder.bat similarity index 100% rename from portable/scripts/winspyder.bat rename to portable/launchers_final/scripts/winspyder.bat diff --git a/portable/scripts/winvscode.bat b/portable/launchers_final/scripts/winvscode.bat similarity index 100% rename from portable/scripts/winvscode.bat rename to portable/launchers_final/scripts/winvscode.bat diff --git a/portable/scripts/wpcp.bat b/portable/launchers_final/scripts/wpcp.bat similarity index 100% rename from portable/scripts/wpcp.bat rename to portable/launchers_final/scripts/wpcp.bat From cd74f6c9413ae269f577cb120d16eb982992ef21 Mon Sep 17 00:00:00 2001 From: stonebig Date: Sun, 29 Jun 2025 16:08:16 +0200 Subject: [PATCH 250/305] moves launchers building in a subdirectory for clarity --- .../build_my_launchers.bat | 0 .../{ => launchers_building}/icons/cmd.ico | Bin .../{ => launchers_building}/icons/code.ico | Bin .../{ => launchers_building}/icons/ijulia.ico | Bin .../icons/install.ico | Bin .../icons/ipython.ico | Bin .../{ => launchers_building}/icons/julia.ico | Bin .../icons/jupyter.ico | Bin .../icons/powershell.ico | Bin .../{ => launchers_building}/icons/python.ico | Bin .../{ => launchers_building}/icons/spyder.ico | Bin .../icons/spyder_reset.ico | Bin .../icons/terminal.ico | Bin .../icons/uninstall.ico | Bin .../icons/winpython.ico | Bin .../images/banner.bmp | Bin .../images/banner.pdn | Bin .../images/installer_logo.bmp | Bin .../images/splash.bmp | Bin .../images/splash.pdn | Bin .../{ => launchers_building}/images/win.bmp | Bin .../{ => launchers_building}/images/win.pdn | Bin .../images/winpython_title.svg | 0 .../images/winpython_title_portrait.svg | 0 .../IDLE (Python GUI).exe | Bin .../launchers_final_original/Jupyter Lab.exe | Bin .../Jupyter Notebook.exe | Bin .../launchers_final_original/Spyder reset.exe | Bin .../launchers_final_original/Spyder.exe | Bin .../launchers_final_original/VS Code.exe | Bin .../WinPython Command Prompt.exe | Bin .../WinPython Control Panel.exe | Bin .../WinPython Interpreter.exe | Bin .../WinPython Powershell Prompt.exe | Bin .../IDLE (Python GUI).exe | Bin .../IDLE (Python GUI)_2025-05-09_not_ok.exe | Bin .../IDLE (Python GUI)_20250401.exe | Bin .../launchers_final_proposed/Jupyter Lab.exe | Bin .../Jupyter Notebook.exe | Bin .../launchers_final_proposed/Spyder reset.exe | Bin .../launchers_final_proposed/Spyder.exe | Bin .../Spyder_2025-05-08_no_drag_and_drop.exe | Bin .../launchers_final_proposed/VS Code.exe | Bin .../WinPython Command Prompt.exe | Bin .../WinPython Control Panel.exe | Bin .../WinPython Control Panel_2025-05-09.exe | Bin .../WinPython Interpreter.exe | Bin .../WinPython Powershell Prompt.exe | Bin .../launchers_final_proposed/license.txt | 0 .../launchers_src/LICENSE | 0 .../launchers_src/build_one_launcher.bat | 0 .../launcher_template_CONSOLE.cpp | 0 .../launcher_template_WINDOWS.cpp | 0 .../launchers_src_original/LICENSE | 0 .../build_one_launcher.bat | 0 .../launcher_template_CONSOLE.cpp | 0 .../launcher_template_WINDOWS.cpp | 0 portable/{ => launchers_final}/license.txt | 72 +++++++++--------- 58 files changed, 36 insertions(+), 36 deletions(-) rename portable/{ => launchers_building}/build_my_launchers.bat (100%) rename portable/{ => launchers_building}/icons/cmd.ico (100%) rename portable/{ => launchers_building}/icons/code.ico (100%) rename portable/{ => launchers_building}/icons/ijulia.ico (100%) rename portable/{ => launchers_building}/icons/install.ico (100%) rename portable/{ => launchers_building}/icons/ipython.ico (100%) rename portable/{ => launchers_building}/icons/julia.ico (100%) rename portable/{ => launchers_building}/icons/jupyter.ico (100%) rename portable/{ => launchers_building}/icons/powershell.ico (100%) rename portable/{ => launchers_building}/icons/python.ico (100%) rename portable/{ => launchers_building}/icons/spyder.ico (100%) rename portable/{ => launchers_building}/icons/spyder_reset.ico (100%) rename portable/{ => launchers_building}/icons/terminal.ico (100%) rename portable/{ => launchers_building}/icons/uninstall.ico (100%) rename portable/{ => launchers_building}/icons/winpython.ico (100%) rename portable/{ => launchers_building}/images/banner.bmp (100%) rename portable/{ => launchers_building}/images/banner.pdn (100%) rename portable/{ => launchers_building}/images/installer_logo.bmp (100%) rename portable/{ => launchers_building}/images/splash.bmp (100%) rename portable/{ => launchers_building}/images/splash.pdn (100%) rename portable/{ => launchers_building}/images/win.bmp (100%) rename portable/{ => launchers_building}/images/win.pdn (100%) rename portable/{ => launchers_building}/images/winpython_title.svg (100%) rename portable/{ => launchers_building}/images/winpython_title_portrait.svg (100%) rename portable/{ => launchers_building}/launchers_final_original/IDLE (Python GUI).exe (100%) rename portable/{ => launchers_building}/launchers_final_original/Jupyter Lab.exe (100%) rename portable/{ => launchers_building}/launchers_final_original/Jupyter Notebook.exe (100%) rename portable/{ => launchers_building}/launchers_final_original/Spyder reset.exe (100%) rename portable/{ => launchers_building}/launchers_final_original/Spyder.exe (100%) rename portable/{ => launchers_building}/launchers_final_original/VS Code.exe (100%) rename portable/{ => launchers_building}/launchers_final_original/WinPython Command Prompt.exe (100%) rename portable/{ => launchers_building}/launchers_final_original/WinPython Control Panel.exe (100%) rename portable/{ => launchers_building}/launchers_final_original/WinPython Interpreter.exe (100%) rename portable/{ => launchers_building}/launchers_final_original/WinPython Powershell Prompt.exe (100%) rename portable/{ => launchers_building}/launchers_final_proposed/IDLE (Python GUI).exe (100%) rename portable/{ => launchers_building}/launchers_final_proposed/IDLE (Python GUI)_2025-05-09_not_ok.exe (100%) rename portable/{ => launchers_building}/launchers_final_proposed/IDLE (Python GUI)_20250401.exe (100%) rename portable/{ => launchers_building}/launchers_final_proposed/Jupyter Lab.exe (100%) rename portable/{ => launchers_building}/launchers_final_proposed/Jupyter Notebook.exe (100%) rename portable/{ => launchers_building}/launchers_final_proposed/Spyder reset.exe (100%) rename portable/{ => launchers_building}/launchers_final_proposed/Spyder.exe (100%) rename portable/{ => launchers_building}/launchers_final_proposed/Spyder_2025-05-08_no_drag_and_drop.exe (100%) rename portable/{ => launchers_building}/launchers_final_proposed/VS Code.exe (100%) rename portable/{ => launchers_building}/launchers_final_proposed/WinPython Command Prompt.exe (100%) rename portable/{ => launchers_building}/launchers_final_proposed/WinPython Control Panel.exe (100%) rename portable/{ => launchers_building}/launchers_final_proposed/WinPython Control Panel_2025-05-09.exe (100%) rename portable/{ => launchers_building}/launchers_final_proposed/WinPython Interpreter.exe (100%) rename portable/{ => launchers_building}/launchers_final_proposed/WinPython Powershell Prompt.exe (100%) rename portable/{ => launchers_building}/launchers_final_proposed/license.txt (100%) rename portable/{ => launchers_building}/launchers_src/LICENSE (100%) rename portable/{ => launchers_building}/launchers_src/build_one_launcher.bat (100%) rename portable/{ => launchers_building}/launchers_src/launcher_template_CONSOLE.cpp (100%) rename portable/{ => launchers_building}/launchers_src/launcher_template_WINDOWS.cpp (100%) rename portable/{ => launchers_building}/launchers_src_original/LICENSE (100%) rename portable/{ => launchers_building}/launchers_src_original/build_one_launcher.bat (100%) rename portable/{ => launchers_building}/launchers_src_original/launcher_template_CONSOLE.cpp (100%) rename portable/{ => launchers_building}/launchers_src_original/launcher_template_WINDOWS.cpp (100%) rename portable/{ => launchers_final}/license.txt (97%) diff --git a/portable/build_my_launchers.bat b/portable/launchers_building/build_my_launchers.bat similarity index 100% rename from portable/build_my_launchers.bat rename to portable/launchers_building/build_my_launchers.bat diff --git a/portable/icons/cmd.ico b/portable/launchers_building/icons/cmd.ico similarity index 100% rename from portable/icons/cmd.ico rename to portable/launchers_building/icons/cmd.ico diff --git a/portable/icons/code.ico b/portable/launchers_building/icons/code.ico similarity index 100% rename from portable/icons/code.ico rename to portable/launchers_building/icons/code.ico diff --git a/portable/icons/ijulia.ico b/portable/launchers_building/icons/ijulia.ico similarity index 100% rename from portable/icons/ijulia.ico rename to portable/launchers_building/icons/ijulia.ico diff --git a/portable/icons/install.ico b/portable/launchers_building/icons/install.ico similarity index 100% rename from portable/icons/install.ico rename to portable/launchers_building/icons/install.ico diff --git a/portable/icons/ipython.ico b/portable/launchers_building/icons/ipython.ico similarity index 100% rename from portable/icons/ipython.ico rename to portable/launchers_building/icons/ipython.ico diff --git a/portable/icons/julia.ico b/portable/launchers_building/icons/julia.ico similarity index 100% rename from portable/icons/julia.ico rename to portable/launchers_building/icons/julia.ico diff --git a/portable/icons/jupyter.ico b/portable/launchers_building/icons/jupyter.ico similarity index 100% rename from portable/icons/jupyter.ico rename to portable/launchers_building/icons/jupyter.ico diff --git a/portable/icons/powershell.ico b/portable/launchers_building/icons/powershell.ico similarity index 100% rename from portable/icons/powershell.ico rename to portable/launchers_building/icons/powershell.ico diff --git a/portable/icons/python.ico b/portable/launchers_building/icons/python.ico similarity index 100% rename from portable/icons/python.ico rename to portable/launchers_building/icons/python.ico diff --git a/portable/icons/spyder.ico b/portable/launchers_building/icons/spyder.ico similarity index 100% rename from portable/icons/spyder.ico rename to portable/launchers_building/icons/spyder.ico diff --git a/portable/icons/spyder_reset.ico b/portable/launchers_building/icons/spyder_reset.ico similarity index 100% rename from portable/icons/spyder_reset.ico rename to portable/launchers_building/icons/spyder_reset.ico diff --git a/portable/icons/terminal.ico b/portable/launchers_building/icons/terminal.ico similarity index 100% rename from portable/icons/terminal.ico rename to portable/launchers_building/icons/terminal.ico diff --git a/portable/icons/uninstall.ico b/portable/launchers_building/icons/uninstall.ico similarity index 100% rename from portable/icons/uninstall.ico rename to portable/launchers_building/icons/uninstall.ico diff --git a/portable/icons/winpython.ico b/portable/launchers_building/icons/winpython.ico similarity index 100% rename from portable/icons/winpython.ico rename to portable/launchers_building/icons/winpython.ico diff --git a/portable/images/banner.bmp b/portable/launchers_building/images/banner.bmp similarity index 100% rename from portable/images/banner.bmp rename to portable/launchers_building/images/banner.bmp diff --git a/portable/images/banner.pdn b/portable/launchers_building/images/banner.pdn similarity index 100% rename from portable/images/banner.pdn rename to portable/launchers_building/images/banner.pdn diff --git a/portable/images/installer_logo.bmp b/portable/launchers_building/images/installer_logo.bmp similarity index 100% rename from portable/images/installer_logo.bmp rename to portable/launchers_building/images/installer_logo.bmp diff --git a/portable/images/splash.bmp b/portable/launchers_building/images/splash.bmp similarity index 100% rename from portable/images/splash.bmp rename to portable/launchers_building/images/splash.bmp diff --git a/portable/images/splash.pdn b/portable/launchers_building/images/splash.pdn similarity index 100% rename from portable/images/splash.pdn rename to portable/launchers_building/images/splash.pdn diff --git a/portable/images/win.bmp b/portable/launchers_building/images/win.bmp similarity index 100% rename from portable/images/win.bmp rename to portable/launchers_building/images/win.bmp diff --git a/portable/images/win.pdn b/portable/launchers_building/images/win.pdn similarity index 100% rename from portable/images/win.pdn rename to portable/launchers_building/images/win.pdn diff --git a/portable/images/winpython_title.svg b/portable/launchers_building/images/winpython_title.svg similarity index 100% rename from portable/images/winpython_title.svg rename to portable/launchers_building/images/winpython_title.svg diff --git a/portable/images/winpython_title_portrait.svg b/portable/launchers_building/images/winpython_title_portrait.svg similarity index 100% rename from portable/images/winpython_title_portrait.svg rename to portable/launchers_building/images/winpython_title_portrait.svg diff --git a/portable/launchers_final_original/IDLE (Python GUI).exe b/portable/launchers_building/launchers_final_original/IDLE (Python GUI).exe similarity index 100% rename from portable/launchers_final_original/IDLE (Python GUI).exe rename to portable/launchers_building/launchers_final_original/IDLE (Python GUI).exe diff --git a/portable/launchers_final_original/Jupyter Lab.exe b/portable/launchers_building/launchers_final_original/Jupyter Lab.exe similarity index 100% rename from portable/launchers_final_original/Jupyter Lab.exe rename to portable/launchers_building/launchers_final_original/Jupyter Lab.exe diff --git a/portable/launchers_final_original/Jupyter Notebook.exe b/portable/launchers_building/launchers_final_original/Jupyter Notebook.exe similarity index 100% rename from portable/launchers_final_original/Jupyter Notebook.exe rename to portable/launchers_building/launchers_final_original/Jupyter Notebook.exe diff --git a/portable/launchers_final_original/Spyder reset.exe b/portable/launchers_building/launchers_final_original/Spyder reset.exe similarity index 100% rename from portable/launchers_final_original/Spyder reset.exe rename to portable/launchers_building/launchers_final_original/Spyder reset.exe diff --git a/portable/launchers_final_original/Spyder.exe b/portable/launchers_building/launchers_final_original/Spyder.exe similarity index 100% rename from portable/launchers_final_original/Spyder.exe rename to portable/launchers_building/launchers_final_original/Spyder.exe diff --git a/portable/launchers_final_original/VS Code.exe b/portable/launchers_building/launchers_final_original/VS Code.exe similarity index 100% rename from portable/launchers_final_original/VS Code.exe rename to portable/launchers_building/launchers_final_original/VS Code.exe diff --git a/portable/launchers_final_original/WinPython Command Prompt.exe b/portable/launchers_building/launchers_final_original/WinPython Command Prompt.exe similarity index 100% rename from portable/launchers_final_original/WinPython Command Prompt.exe rename to portable/launchers_building/launchers_final_original/WinPython Command Prompt.exe diff --git a/portable/launchers_final_original/WinPython Control Panel.exe b/portable/launchers_building/launchers_final_original/WinPython Control Panel.exe similarity index 100% rename from portable/launchers_final_original/WinPython Control Panel.exe rename to portable/launchers_building/launchers_final_original/WinPython Control Panel.exe diff --git a/portable/launchers_final_original/WinPython Interpreter.exe b/portable/launchers_building/launchers_final_original/WinPython Interpreter.exe similarity index 100% rename from portable/launchers_final_original/WinPython Interpreter.exe rename to portable/launchers_building/launchers_final_original/WinPython Interpreter.exe diff --git a/portable/launchers_final_original/WinPython Powershell Prompt.exe b/portable/launchers_building/launchers_final_original/WinPython Powershell Prompt.exe similarity index 100% rename from portable/launchers_final_original/WinPython Powershell Prompt.exe rename to portable/launchers_building/launchers_final_original/WinPython Powershell Prompt.exe diff --git a/portable/launchers_final_proposed/IDLE (Python GUI).exe b/portable/launchers_building/launchers_final_proposed/IDLE (Python GUI).exe similarity index 100% rename from portable/launchers_final_proposed/IDLE (Python GUI).exe rename to portable/launchers_building/launchers_final_proposed/IDLE (Python GUI).exe diff --git a/portable/launchers_final_proposed/IDLE (Python GUI)_2025-05-09_not_ok.exe b/portable/launchers_building/launchers_final_proposed/IDLE (Python GUI)_2025-05-09_not_ok.exe similarity index 100% rename from portable/launchers_final_proposed/IDLE (Python GUI)_2025-05-09_not_ok.exe rename to portable/launchers_building/launchers_final_proposed/IDLE (Python GUI)_2025-05-09_not_ok.exe diff --git a/portable/launchers_final_proposed/IDLE (Python GUI)_20250401.exe b/portable/launchers_building/launchers_final_proposed/IDLE (Python GUI)_20250401.exe similarity index 100% rename from portable/launchers_final_proposed/IDLE (Python GUI)_20250401.exe rename to portable/launchers_building/launchers_final_proposed/IDLE (Python GUI)_20250401.exe diff --git a/portable/launchers_final_proposed/Jupyter Lab.exe b/portable/launchers_building/launchers_final_proposed/Jupyter Lab.exe similarity index 100% rename from portable/launchers_final_proposed/Jupyter Lab.exe rename to portable/launchers_building/launchers_final_proposed/Jupyter Lab.exe diff --git a/portable/launchers_final_proposed/Jupyter Notebook.exe b/portable/launchers_building/launchers_final_proposed/Jupyter Notebook.exe similarity index 100% rename from portable/launchers_final_proposed/Jupyter Notebook.exe rename to portable/launchers_building/launchers_final_proposed/Jupyter Notebook.exe diff --git a/portable/launchers_final_proposed/Spyder reset.exe b/portable/launchers_building/launchers_final_proposed/Spyder reset.exe similarity index 100% rename from portable/launchers_final_proposed/Spyder reset.exe rename to portable/launchers_building/launchers_final_proposed/Spyder reset.exe diff --git a/portable/launchers_final_proposed/Spyder.exe b/portable/launchers_building/launchers_final_proposed/Spyder.exe similarity index 100% rename from portable/launchers_final_proposed/Spyder.exe rename to portable/launchers_building/launchers_final_proposed/Spyder.exe diff --git a/portable/launchers_final_proposed/Spyder_2025-05-08_no_drag_and_drop.exe b/portable/launchers_building/launchers_final_proposed/Spyder_2025-05-08_no_drag_and_drop.exe similarity index 100% rename from portable/launchers_final_proposed/Spyder_2025-05-08_no_drag_and_drop.exe rename to portable/launchers_building/launchers_final_proposed/Spyder_2025-05-08_no_drag_and_drop.exe diff --git a/portable/launchers_final_proposed/VS Code.exe b/portable/launchers_building/launchers_final_proposed/VS Code.exe similarity index 100% rename from portable/launchers_final_proposed/VS Code.exe rename to portable/launchers_building/launchers_final_proposed/VS Code.exe diff --git a/portable/launchers_final_proposed/WinPython Command Prompt.exe b/portable/launchers_building/launchers_final_proposed/WinPython Command Prompt.exe similarity index 100% rename from portable/launchers_final_proposed/WinPython Command Prompt.exe rename to portable/launchers_building/launchers_final_proposed/WinPython Command Prompt.exe diff --git a/portable/launchers_final_proposed/WinPython Control Panel.exe b/portable/launchers_building/launchers_final_proposed/WinPython Control Panel.exe similarity index 100% rename from portable/launchers_final_proposed/WinPython Control Panel.exe rename to portable/launchers_building/launchers_final_proposed/WinPython Control Panel.exe diff --git a/portable/launchers_final_proposed/WinPython Control Panel_2025-05-09.exe b/portable/launchers_building/launchers_final_proposed/WinPython Control Panel_2025-05-09.exe similarity index 100% rename from portable/launchers_final_proposed/WinPython Control Panel_2025-05-09.exe rename to portable/launchers_building/launchers_final_proposed/WinPython Control Panel_2025-05-09.exe diff --git a/portable/launchers_final_proposed/WinPython Interpreter.exe b/portable/launchers_building/launchers_final_proposed/WinPython Interpreter.exe similarity index 100% rename from portable/launchers_final_proposed/WinPython Interpreter.exe rename to portable/launchers_building/launchers_final_proposed/WinPython Interpreter.exe diff --git a/portable/launchers_final_proposed/WinPython Powershell Prompt.exe b/portable/launchers_building/launchers_final_proposed/WinPython Powershell Prompt.exe similarity index 100% rename from portable/launchers_final_proposed/WinPython Powershell Prompt.exe rename to portable/launchers_building/launchers_final_proposed/WinPython Powershell Prompt.exe diff --git a/portable/launchers_final_proposed/license.txt b/portable/launchers_building/launchers_final_proposed/license.txt similarity index 100% rename from portable/launchers_final_proposed/license.txt rename to portable/launchers_building/launchers_final_proposed/license.txt diff --git a/portable/launchers_src/LICENSE b/portable/launchers_building/launchers_src/LICENSE similarity index 100% rename from portable/launchers_src/LICENSE rename to portable/launchers_building/launchers_src/LICENSE diff --git a/portable/launchers_src/build_one_launcher.bat b/portable/launchers_building/launchers_src/build_one_launcher.bat similarity index 100% rename from portable/launchers_src/build_one_launcher.bat rename to portable/launchers_building/launchers_src/build_one_launcher.bat diff --git a/portable/launchers_src/launcher_template_CONSOLE.cpp b/portable/launchers_building/launchers_src/launcher_template_CONSOLE.cpp similarity index 100% rename from portable/launchers_src/launcher_template_CONSOLE.cpp rename to portable/launchers_building/launchers_src/launcher_template_CONSOLE.cpp diff --git a/portable/launchers_src/launcher_template_WINDOWS.cpp b/portable/launchers_building/launchers_src/launcher_template_WINDOWS.cpp similarity index 100% rename from portable/launchers_src/launcher_template_WINDOWS.cpp rename to portable/launchers_building/launchers_src/launcher_template_WINDOWS.cpp diff --git a/portable/launchers_src_original/LICENSE b/portable/launchers_building/launchers_src_original/LICENSE similarity index 100% rename from portable/launchers_src_original/LICENSE rename to portable/launchers_building/launchers_src_original/LICENSE diff --git a/portable/launchers_src_original/build_one_launcher.bat b/portable/launchers_building/launchers_src_original/build_one_launcher.bat similarity index 100% rename from portable/launchers_src_original/build_one_launcher.bat rename to portable/launchers_building/launchers_src_original/build_one_launcher.bat diff --git a/portable/launchers_src_original/launcher_template_CONSOLE.cpp b/portable/launchers_building/launchers_src_original/launcher_template_CONSOLE.cpp similarity index 100% rename from portable/launchers_src_original/launcher_template_CONSOLE.cpp rename to portable/launchers_building/launchers_src_original/launcher_template_CONSOLE.cpp diff --git a/portable/launchers_src_original/launcher_template_WINDOWS.cpp b/portable/launchers_building/launchers_src_original/launcher_template_WINDOWS.cpp similarity index 100% rename from portable/launchers_src_original/launcher_template_WINDOWS.cpp rename to portable/launchers_building/launchers_src_original/launcher_template_WINDOWS.cpp diff --git a/portable/license.txt b/portable/launchers_final/license.txt similarity index 97% rename from portable/license.txt rename to portable/launchers_final/license.txt index 75f3c134..da461f3b 100644 --- a/portable/license.txt +++ b/portable/launchers_final/license.txt @@ -1,37 +1,37 @@ -Note ----- - -WinPython components are distributed as they were received from -their copyright holder, under their own copyright and/or license, -and without any linking with each other. - -WinPython software collection (i.e. the collection of software, -libraries and documents) is licensed under the terms of the -following license agreement. - - -WinPython License Agreement (MIT License) ------------------------------------------ - -Copyright (c) 2012 Pierre Raybaut, 2016+ WinPython team - -Permission is hereby granted, free of charge, to any person -obtaining a copy of this software and associated documentation -files (the "Software"), to deal in the Software without -restriction, including without limitation the rights to use, -copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the -Software is furnished to do so, subject to the following -conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES -OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT -HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, -WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +Note +---- + +WinPython components are distributed as they were received from +their copyright holder, under their own copyright and/or license, +and without any linking with each other. + +WinPython software collection (i.e. the collection of software, +libraries and documents) is licensed under the terms of the +following license agreement. + + +WinPython License Agreement (MIT License) +----------------------------------------- + +Copyright (c) 2012 Pierre Raybaut, 2016+ WinPython team + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. \ No newline at end of file From 91513f3141aa91f0b20734e2c5624bbd2b045b23 Mon Sep 17 00:00:00 2001 From: stonebig Date: Sun, 29 Jun 2025 16:24:54 +0200 Subject: [PATCH 251/305] remove all docsdir reference --- generate_winpython_distros313_dot.bat | 3 +-- generate_winpython_distros313_slim.bat | 3 --- generate_winpython_distros313_wheel.bat | 5 ++--- make.py | 10 ++-------- 4 files changed, 5 insertions(+), 16 deletions(-) diff --git a/generate_winpython_distros313_dot.bat b/generate_winpython_distros313_dot.bat index b0ed9351..a1290cd3 100644 --- a/generate_winpython_distros313_dot.bat +++ b/generate_winpython_distros313_dot.bat @@ -15,6 +15,7 @@ set my_release_level= rem list of installers to create separated per dot: False=none, .zip=zip, .7z=.7z, 7zip=auto-extractible 7z set my_create_installer=7zip.7z.zip +set my_create_installer=7zip.zip set my_preclear_build_directory=Yes @@ -25,11 +26,9 @@ set my_source_dirs=C:\Winp\bd313\packages.win-amd64 set my_find_links=C:\Winp\packages.srcreq set my_toolsdirs=C:\Winp\bdTools\Tools.dot -set my_docsdirs=C:\WinP\bdDocs\docs.dot set my_install_options=--no-index --pre --trusted-host=None call %~dp0\generate_a_winpython_distro.bat - pause \ No newline at end of file diff --git a/generate_winpython_distros313_slim.bat b/generate_winpython_distros313_slim.bat index 7b7a1ffc..e8829c58 100644 --- a/generate_winpython_distros313_slim.bat +++ b/generate_winpython_distros313_slim.bat @@ -30,11 +30,8 @@ set my_toolsdirs=C:\Winp\bdTools\Tools.dot REM 2024-07-13:put back pandoc (so from 598Mo to 518Mo?) set my_toolsdirs=C:\WinP\bdTools\tools64_pandoc_alone -set my_docsdirs=C:\WinP\bdDocs\docs.dot - set my_install_options=--no-index --pre --trusted-host=None call %~dp0\generate_a_winpython_distro.bat - pause \ No newline at end of file diff --git a/generate_winpython_distros313_wheel.bat b/generate_winpython_distros313_wheel.bat index 02edeb99..317d7774 100644 --- a/generate_winpython_distros313_wheel.bat +++ b/generate_winpython_distros313_wheel.bat @@ -15,8 +15,7 @@ set my_release_level= rem list of installers to create separated per dot: False=none, .zip=zip, .7z=.7z, 7zip=auto-extractible 7z set my_create_installer=7zip-mx5.7z-mx7.zip -set my_create_installer=.7z-mx7 - +set my_create_installer=.7z-mx9 set my_preclear_build_directory=Yes set tmp_reqdir=%my_root_dir_for_builds%\bd%my_python_target% @@ -26,12 +25,12 @@ set my_source_dirs=C:\Winp\bd313\packages.win-amd64 set my_find_links=C:\Winp\packages.srcreq set my_toolsdirs=C:\Winp\bdTools\Tools.dot -set my_docsdirs=C:\WinP\bdDocs\docs.dot set my_install_options=--no-index --pre --trusted-host=None rem set addlockfile=dot +set wheelhousereq=C:\Winp\bd313\dot_requirements.txt set wheelhousereq=C:\Winp\bd313\requirements64_whl.txt diff --git a/make.py b/make.py index 5781ad67..22ad0b37 100644 --- a/make.py +++ b/make.py @@ -58,7 +58,7 @@ class WinPythonDistributionBuilder: """Builds a WinPython distribution.""" def __init__(self, build_number: int, release_level: str, target_directory: Path, wheels_directory: Path, - tools_directories: list[Path] = None, documentation_directories: list[Path] = None, verbose: bool = False, + tools_directories: list[Path] = None, verbose: bool = False, base_directory: Path = None, install_options: list[str] = None, flavor: str = ""): """ Initializes the WinPythonDistributionBuilder. @@ -68,7 +68,6 @@ def __init__(self, build_number: int, release_level: str, target_directory: Path target_directory: The base directory where WinPython will be created. wheels_directory: Directory containing wheel files for packages. tools_directories: List of directories containing development tools to include. - documentation_directories: List of directories containing documentation to include. verbose: Enable verbose output. base_directory: Base directory for building (optional, for relative paths). install_options: Additional pip install options. @@ -79,7 +78,6 @@ def __init__(self, build_number: int, release_level: str, target_directory: Path self.target_directory = Path(target_directory) self.wheels_directory = Path(wheels_directory) self.tools_directories = tools_directories or [] - self.documentation_directories = documentation_directories or [] self.verbose = verbose self.winpython_directory: Path | None = None self.distribution: wppm.Distribution | None = None @@ -242,7 +240,7 @@ def rebuild_winpython_package(source_directory: Path, target_directory: Path, ar def make_all(build_number: int, release_level: str, pyver: str, architecture: int, basedir: Path, verbose: bool = False, rebuild: bool = True, create_installer: str = "True", install_options=["--no-index"], flavor: str = "", requirements: str | list[Path] = None, find_links: str | list[Path] = None, - source_dirs: Path = None, toolsdirs: str | list[Path] = None, docsdirs: str | list[Path] = None, + source_dirs: Path = None, toolsdirs: str | list[Path] = None, python_target_release: str = None, # e.g. "37101" for 3.7.10 ): """ @@ -262,14 +260,12 @@ def make_all(build_number: int, release_level: str, pyver: str, architecture: in find_links: package directories (r'D:\Winpython\packages.srcreq') source_dirs: the python.zip + rebuilt winpython wheel package directory toolsdirs: Directory with development tools r'D:\WinPython\basedir34\t.Slim' - docsdirs: Directory with documentation r'D:\WinPython\basedir34\docs.Slim' python_target_release: Target Python release (str). """ assert basedir is not None, "The *basedir* directory must be specified" assert architecture in (32, 64) tools_dirs_list = parse_list_argument(toolsdirs, ",") - docs_dirs_list = parse_list_argument(docsdirs, ",") install_options_list = parse_list_argument(install_options, " ") find_links_dirs_list = parse_list_argument(find_links, ",") requirements_files_list = [Path(f) for f in parse_list_argument(requirements, ",") if f] @@ -285,7 +281,6 @@ def make_all(build_number: int, release_level: str, pyver: str, architecture: in builder = WinPythonDistributionBuilder( build_number, release_level, build_directory, wheels_directory=source_dirs, tools_directories=[Path(d) for d in tools_dirs_list], - documentation_directories=[Path(d) for d in docs_dirs_list], verbose=verbose, base_directory=basedir, install_options=install_options_list + find_links_options, flavor=flavor @@ -321,5 +316,4 @@ def make_all(build_number: int, release_level: str, pyver: str, architecture: in find_links=r"D:\Winpython\packages.srcreq", source_dirs=r"D:\WinPython\basedir34\packages.win-amd64", toolsdirs=r"D:\WinPython\basedir34\t.Slim", - docsdirs=r"D:\WinPython\basedir34\docs.Slim", ) From 2654b816427346a7fc85f23826c9daa5d0b63a90 Mon Sep 17 00:00:00 2001 From: stonebig Date: Sun, 29 Jun 2025 16:42:31 +0200 Subject: [PATCH 252/305] update broken toolchain --- generate_a_winpython_distro.bat | 38 ++++++++++++++++++--------------- 1 file changed, 21 insertions(+), 17 deletions(-) diff --git a/generate_a_winpython_distro.bat b/generate_a_winpython_distro.bat index cbb74682..474babc6 100644 --- a/generate_a_winpython_distro.bat +++ b/generate_a_winpython_distro.bat @@ -2,7 +2,7 @@ rem generate_a_winpython_distro.bat: to be launched from a winpython directory, @echo on REM Initialize variables -if "%my_release_level%"=="" set my_release_level=b4 +if "%my_release_level%"=="" set my_release_level= if "%my_create_installer%"=="" set my_create_installer=True rem Set archive directory and log file @@ -25,10 +25,10 @@ rem 2021-04-22 : path PyPy3 (as we don't try to copy PyPy3.exe to Python.exe) if "%target_python_exe%"=="" set target_python_exe=python.exe rem Set Python target release based on my_python_target -if %my_python_target%==311 set my_python_target_release=3119& set my_release=1 -if %my_python_target%==312 set my_python_target_release=31210& set my_release=1 -if %my_python_target%==313 set my_python_target_release=3133& set my_release=1 -if %my_python_target%==314 set my_python_target_release=3140& set my_release=0 +if %my_python_target%==311 set my_python_target_release=3119& set my_release=2 +if %my_python_target%==312 set my_python_target_release=31210& set my_release=2 +if %my_python_target%==313 set my_python_target_release=3135& set my_release=1 +if %my_python_target%==314 set my_python_target_release=3140& set my_release=1 echo -------------------------------------- >>%my_archive_log% echo (%date% %time%) preparing winPython for %my_pyver% (%my_python_target%)release %my_release%%my_flavor% (%my_release_level%) *** %my_arch% bit ***>>%my_archive_log% @@ -59,7 +59,7 @@ call %my_buildenv%\scripts\env.bat REM Create basic build infrastructure echo "(%date% %time%) Create basic build infrastructure">>%my_archive_log% -python.exe -c "from make import *;make_all(%my_release%, '%my_release_level%', pyver='%my_pyver%', basedir=r'%my_basedir%', verbose=True, architecture=%my_arch%, flavor='%my_flavor%', install_options=r'%my_install_options%', find_links=r'%my_find_links%', source_dirs=r'%my_source_dirs%', toolsdirs=r'%my_toolsdirs%', docsdirs=r'%my_docsdirs%', create_installer='False', python_target_release='%my_python_target_release%')">>%my_archive_log% +python.exe -c "from make import *;make_all(%my_release%, '%my_release_level%', pyver='%my_pyver%', basedir=r'%my_basedir%', verbose=True, architecture=%my_arch%, flavor='%my_flavor%', install_options=r'%my_install_options%', find_links=r'%my_find_links%', source_dirs=r'%my_source_dirs%', toolsdirs=r'%my_toolsdirs%', create_installer='False', python_target_release='%my_python_target_release%')">>%my_archive_log% REM Check infrastructure is in place echo "(%date% %time%) Check infrastructure">>%my_archive_log% @@ -99,7 +99,7 @@ echo -------------------------------------- >>%my_archive_log% echo "(%date% %time%) Add requirement packages">>%my_archive_log% echo -------------------------------------- >>%my_archive_log% python -m pip install -r %my_requirements% -c %my_constraints% --pre --no-index --trusted-host=None --find-links=%my_find_links% >>%my_archive_log% -python -c "from winpython import wppm;dist=wppm.Distribution(r'%WINPYDIR%');dist.patch_standard_packages('spyder', to_movable=True)" +python -c "from wppm import wppm;dist=wppm.Distribution(r'%WINPYDIR%');dist.patch_standard_packages('spyder', to_movable=True)" REM Add Wheelhouse (to replace per pip lock direct ? would allow paralellism) echo -------------------------------------- >>%my_archive_log% @@ -125,13 +125,19 @@ set pip_lock_includedweb=%LOCKDIR%pylock.%my_flavor%-%WINPYARCH%bit-%WINPYVERLOC set req_lock_includedlocal=%LOCKDIR%requirement.%my_flavor%-%WINPYARCH%bit-%WINPYVERLOCK%_includedwheelslocal.txt set req_lock_includedweb=%LOCKDIR%requirement.%my_flavor%-%WINPYARCH%bit-%WINPYVERLOCK%_includedwheels.txt +set pip_lock_includedlocal=%LOCKDIR%pylock.%WINPYARCH%-%WINPYVERLOCK%%my_flavor%%my_release_level%_wheelslocal.toml +set pip_lock_includedweb=%LOCKDIR%pylock.%WINPYARCH%-%WINPYVERLOCK%%my_flavor%%my_release_level%_wheels.toml +set req_lock_includedlocal=%LOCKDIR%requir.%WINPYARCH%-%WINPYVERLOCK%%my_flavor%%my_release_level%_wheelslocal.txt +set req_lock_includedweb=%LOCKDIR%requir.%WINPYARCH%-%WINPYVERLOCK%%my_flavor%%my_release_level%_wheels.txt + + if not "Z%wheelhousereq%Z"=="ZZ" if exist "%wheelhousereq%" ( echo JOYYYwheelhousereq=%wheelhousereq% echo z%pip_lock_includedlocal%z=%pip_lock_includedlocal% rem no winpython in it naturally, with deps python.exe -m pip lock --no-index --trusted-host=None --find-links=%my_find_links% -c C:\WinP\constraints.txt -r "%wheelhousereq%" -o %pip_lock_includedlocal% rem generating also classic requirement with hash-256, from obtained pylock.toml -python.exe -c "from winpython import wheelhouse as wh;wh.pylock_to_req(r'%pip_lock_includedlocal%', r'%req_lock_includedlocal%')" +python.exe -c "from wppm import wheelhouse as wh;wh.pylock_to_req(r'%pip_lock_includedlocal%', r'%req_lock_includedlocal%')" rem same with frozen web from local python.exe -m pip lock --no-deps --require-hashes -c C:\WinP\constraints.txt -r "%req_lock_includedlocal%" -o %pip_lock_includedweb% @@ -154,20 +160,17 @@ set LOCKDIR=%WINPYDIRBASE%\..\ set WINPYVERLOCK=%WINPYVER2:.=_% set req=%LOCKDIR%requirement.%my_flavor%-%WINPYARCH%bit-%WINPYVERLOCK%_raw.txt set wanted_req=%LOCKDIR%requirement.%my_flavor%-%WINPYARCH%bit-%WINPYVERLOCK%.txt -set pip_lock_web=%LOCKDIR%pylock.%my_flavor%-%WINPYARCH%bit-%WINPYVERLOCK%.toml -set pip_lock_local=%LOCKDIR%pylock.%my_flavor%-%WINPYARCH%bit-%WINPYVERLOCK%_local.toml -set req_lock_web=%LOCKDIR%requirement.%my_flavor%-%WINPYARCH%bit-%WINPYVERLOCK%.txt -set req_lock_local=%LOCKDIR%requirement.%my_flavor%-%WINPYARCH%bit-%WINPYVERLOCK%_local.txt set pip_lock_web=%LOCKDIR%pylock.%WINPYARCH%-%WINPYVERLOCK%%my_flavor%%my_release_level%.toml set pip_lock_local=%LOCKDIR%pylock.%WINPYARCH%-%WINPYVERLOCK%%my_flavor%%my_release_level%_local.toml -set req_lock_web=%LOCKDIR%requirement.%WINPYARCH%-%WINPYVERLOCK%%my_flavor%%my_release_level%.txt -set req_lock_local=%LOCKDIR%requirement.%WINPYARCH%-%WINPYVERLOCK%%my_flavor%%my_release_level%_local.txt +set req_lock_web=%LOCKDIR%requir.%WINPYARCH%-%WINPYVERLOCK%%my_flavor%%my_release_level%.txt +set req_lock_local=%LOCKDIR%requir.%WINPYARCH%-%WINPYVERLOCK%%my_flavor%%my_release_level%_local.txt set my_archive_lockfile=%my_archive_dir%\pylock.%my_flavor%-%WINPYARCH%bit-%WINPYVERLOCK%_%date:/=-%at_%my_time%.toml set my_archive_lockfile_local=%my_archive_dir%\pylock.%my_flavor%-%WINPYARCH%bit-%WINPYVERLOCK%_%date:/=-%at_%my_time%.local.toml -set my_changelog_lockfile=%~dp0changelogs\pylock.%my_flavor%-%WINPYARCH%bit-%WINPYVERLOCK%.toml +set my_changelog_lockfile=%~dp0changelogs\pylock.%WINPYARCH%-%WINPYVERLOCK%%my_flavor%%my_release_level%.toml +set my_changelog_reqfile=%~dp0changelogs\requir.%WINPYARCH%-%WINPYVERLOCK%%my_flavor%%my_release_level%.txt python.exe -m pip freeze>%req% findstr /v "winpython" %req% > %wanted_req% @@ -180,14 +183,15 @@ rem pip lock from local WheelHouse, from the frozen req python.exe -m pip lock --no-deps --no-index --trusted-host=None --find-links=C:\WinP\packages.srcreq -c C:\WinP\constraints.txt -r "%wanted_req%" -o %pip_lock_local% rem generating also classic requirement with hash-256, from obtained pylock.toml -python.exe -c "from winpython import wheelhouse as wh;wh.pylock_to_req(r'%pip_lock_web%', r'%req_lock_web%')" -python.exe -c "from winpython import wheelhouse as wh;wh.pylock_to_req(r'%pip_lock_local%', r'%req_lock_local%')" +python.exe -c "from wppm import wheelhouse as wh;wh.pylock_to_req(r'%pip_lock_web%', r'%req_lock_web%')" +python.exe -c "from wppm import wheelhouse as wh;wh.pylock_to_req(r'%pip_lock_local%', r'%req_lock_local%')" rem compare the two (result from pypi and local Wheelhouse must be equal) fc "%req_lock_web%" "%req_lock_local%" copy/Y %pip_lock_web% %my_archive_lockfile% copy/Y %pip_lock_web% %my_changelog_lockfile% +copy/Y %req_lock_web% %my_changelog_reqfile% REM Archive success From 7aa01fb338f4e22dbaf2e96d90b9f6d1c2e06734 Mon Sep 17 00:00:00 2001 From: stonebig Date: Sun, 29 Jun 2025 16:52:47 +0200 Subject: [PATCH 253/305] clean-up make.py --- make.py | 9 --------- 1 file changed, 9 deletions(-) diff --git a/make.py b/make.py index 22ad0b37..12b5d149 100644 --- a/make.py +++ b/make.py @@ -230,13 +230,6 @@ def build(self, rebuild: bool = True, requirements_files_list=None, winpy_dirnam shutil.copyfile(output_markdown_filename, str(Path(CHANGELOGS_DIRECTORY) / Path(output_markdown_filename).name)) diff.write_changelog(self.winpyver2, None, CHANGELOGS_DIRECTORY, self.flavor, self.distribution.architecture, basedir=self.winpython_directory.parent) -def rebuild_winpython_package(source_directory: Path, target_directory: Path, architecture: int = 64, verbose: bool = False): - """Rebuilds the winpython or wppm package from source using flit.""" - for file in target_directory.glob("w*p*-*.*"): - if file.suffix in (".exe", ".whl", ".gz"): - file.unlink() - utils.buildflit_wininst(source_directory, copy_to=target_directory, verbose=True) - def make_all(build_number: int, release_level: str, pyver: str, architecture: int, basedir: Path, verbose: bool = False, rebuild: bool = True, create_installer: str = "True", install_options=["--no-index"], flavor: str = "", requirements: str | list[Path] = None, find_links: str | list[Path] = None, @@ -275,8 +268,6 @@ def make_all(build_number: int, release_level: str, pyver: str, architecture: in if rebuild: utils.print_box(f"Making WinPython {architecture}bits at {Path(basedir) / ('bu' + flavor)}") os.makedirs(build_directory, exist_ok=True) - # use source_dirs as the directory to re-build Winpython wheel - winpython_source_dir = Path(__file__).resolve().parent builder = WinPythonDistributionBuilder( build_number, release_level, build_directory, wheels_directory=source_dirs, From d579fc060bb72889da4453fe3527069b8f92f82e Mon Sep 17 00:00:00 2001 From: stonebig Date: Sun, 29 Jun 2025 19:51:37 +0200 Subject: [PATCH 254/305] remove requirements handling in make.py --- make.py | 17 +++-------------- 1 file changed, 3 insertions(+), 14 deletions(-) diff --git a/make.py b/make.py index 12b5d149..e7b0fafb 100644 --- a/make.py +++ b/make.py @@ -182,7 +182,7 @@ def _create_initial_batch_scripts(self): with open(self.winpython_directory / "scripts" / "env.ini", "w") as f: f.writelines([f'{a}={b}\n' for a, b in init_variables]) - def build(self, rebuild: bool = True, requirements_files_list=None, winpy_dirname: str = None): + def build(self, rebuild: bool = True, winpy_dirname: str = None): """Make or finalise WinPython distribution in the target directory""" print(f"Building WinPython with Python archive: {self.python_zip_file.name}") if winpy_dirname is None: @@ -205,7 +205,6 @@ def build(self, rebuild: bool = True, requirements_files_list=None, winpy_dirnam self._create_initial_batch_scripts() utils.python_execmodule("ensurepip", self.distribution.target) self.distribution.patch_standard_packages("pip") - essential_packages = ["pip", "setuptools", "wheel", "wppm"] for package_name in essential_packages: actions = ["install", "--upgrade", "--pre", package_name] + self.install_options @@ -213,13 +212,6 @@ def build(self, rebuild: bool = True, requirements_files_list=None, winpy_dirnam self.distribution.do_pip_action(actions) self.distribution.patch_standard_packages(package_name) - if requirements_files_list: - for req in requirements_files_list: - actions = ["install", "-r", req] + (self.install_options or []) - self._print_action(f"Piping: {' '.join(actions)}") - self.distribution.do_pip_action(actions) - self.distribution.patch_standard_packages() - self._print_action("Writing package index") self.winpyver2 = f"{self.python_full_version}.{self.build_number}" output_markdown_filename = str(self.winpython_directory.parent / f"WinPython{self.flavor}-{self.distribution.architecture}bit-{self.winpyver2}.md") @@ -232,7 +224,7 @@ def build(self, rebuild: bool = True, requirements_files_list=None, winpy_dirnam def make_all(build_number: int, release_level: str, pyver: str, architecture: int, basedir: Path, verbose: bool = False, rebuild: bool = True, create_installer: str = "True", install_options=["--no-index"], - flavor: str = "", requirements: str | list[Path] = None, find_links: str | list[Path] = None, + flavor: str = "", find_links: str | list[Path] = None, source_dirs: Path = None, toolsdirs: str | list[Path] = None, python_target_release: str = None, # e.g. "37101" for 3.7.10 ): @@ -249,7 +241,6 @@ def make_all(build_number: int, release_level: str, pyver: str, architecture: in create_installer: Type of installer to create (str). install_options: pip options (r'--no-index --pre --trusted-host=None') flavor: WinPython flavor (str). - requirements: package lists for pip (r'D:\requirements.txt') find_links: package directories (r'D:\Winpython\packages.srcreq') source_dirs: the python.zip + rebuilt winpython wheel package directory toolsdirs: Directory with development tools r'D:\WinPython\basedir34\t.Slim' @@ -261,7 +252,6 @@ def make_all(build_number: int, release_level: str, pyver: str, architecture: in tools_dirs_list = parse_list_argument(toolsdirs, ",") install_options_list = parse_list_argument(install_options, " ") find_links_dirs_list = parse_list_argument(find_links, ",") - requirements_files_list = [Path(f) for f in parse_list_argument(requirements, ",") if f] find_links_options = [f"--find-links={link}" for link in find_links_dirs_list + [source_dirs]] build_directory = Path(basedir) / ("bu" + flavor) @@ -286,7 +276,7 @@ def make_all(build_number: int, release_level: str, pyver: str, architecture: in else: winpython_dirname = f"WPy{architecture}-{pyver.replace('.', '')}{python_minor_version_str}{build_number}{release_level}" - builder.build(rebuild=rebuild, requirements_files_list=requirements_files_list, winpy_dirname=winpython_dirname) + builder.build(rebuild=rebuild, winpy_dirname=winpython_dirname) for commmand in create_installer.lower().replace("7zip",".exe").split('.'): installer_type, compression = (commmand + "-").split("-")[:2] @@ -302,7 +292,6 @@ def make_all(build_number: int, release_level: str, pyver: str, architecture: in verbose=True, architecture=64, flavor="Barebone", - requirements=r"D:\Winpython\basedir34\barebone_requirements.txt", install_options=r"--no-index --pre --trusted-host=None", find_links=r"D:\Winpython\packages.srcreq", source_dirs=r"D:\WinPython\basedir34\packages.win-amd64", From 5809dbda49aab9f1f448a451885ee4b6559e5603 Mon Sep 17 00:00:00 2001 From: stonebig Date: Sat, 5 Jul 2025 10:31:50 +0200 Subject: [PATCH 255/305] simplify make.py given parameters --- generate_a_winpython_distro.bat | 6 ++-- make.py | 54 +++++++++++++-------------------- 2 files changed, 25 insertions(+), 35 deletions(-) diff --git a/generate_a_winpython_distro.bat b/generate_a_winpython_distro.bat index 474babc6..68086aa8 100644 --- a/generate_a_winpython_distro.bat +++ b/generate_a_winpython_distro.bat @@ -30,6 +30,8 @@ if %my_python_target%==312 set my_python_target_release=31210& set my_release=2 if %my_python_target%==313 set my_python_target_release=3135& set my_release=1 if %my_python_target%==314 set my_python_target_release=3140& set my_release=1 +set my_basedir_wpy=%my_basedir%\bu%my_flavor%\WPy%my_arch%-%my_python_target_release%%my_release% + echo -------------------------------------- >>%my_archive_log% echo (%date% %time%) preparing winPython for %my_pyver% (%my_python_target%)release %my_release%%my_flavor% (%my_release_level%) *** %my_arch% bit ***>>%my_archive_log% echo -------------------------------------- >>%my_archive_log% @@ -59,7 +61,7 @@ call %my_buildenv%\scripts\env.bat REM Create basic build infrastructure echo "(%date% %time%) Create basic build infrastructure">>%my_archive_log% -python.exe -c "from make import *;make_all(%my_release%, '%my_release_level%', pyver='%my_pyver%', basedir=r'%my_basedir%', verbose=True, architecture=%my_arch%, flavor='%my_flavor%', install_options=r'%my_install_options%', find_links=r'%my_find_links%', source_dirs=r'%my_source_dirs%', toolsdirs=r'%my_toolsdirs%', create_installer='False', python_target_release='%my_python_target_release%')">>%my_archive_log% +python.exe -c "from make import *;make_all(%my_release%, '%my_release_level%', basedir_wpy=r'%my_basedir_wpy%', verbose=True, flavor='%my_flavor%', install_options=r'%my_install_options%', find_links=r'%my_find_links%', source_dirs=r'%my_source_dirs%', toolsdirs=r'%my_toolsdirs%', create_installer='False', python_target_release='%my_python_target_release%')">>%my_archive_log% REM Check infrastructure is in place echo "(%date% %time%) Check infrastructure">>%my_archive_log% @@ -209,7 +211,7 @@ set path=%my_original_path% cd /D %~dp0 call %my_buildenv%\scripts\env.bat -python.exe -c "from make import *;make_all(%my_release%, '%my_release_level%', pyver='%my_pyver%', basedir=r'%my_basedir%', verbose=True, architecture=%my_arch%, flavor='%my_flavor%', install_options=r'%my_install_options%', find_links=r'%my_find_links%', source_dirs=r'%my_source_dirs%', create_installer='%my_create_installer%', rebuild=False, python_target_release='%my_python_target_release%')" >> %my_archive_log% +python.exe -c "from make import *;make_all(%my_release%, '%my_release_level%', basedir_wpy=r'%my_basedir_wpy%', verbose=True, flavor='%my_flavor%', install_options=r'%my_install_options%', find_links=r'%my_find_links%', source_dirs=r'%my_source_dirs%', create_installer='%my_create_installer%', rebuild=False, python_target_release='%my_python_target_release%')" >> %my_archive_log% echo -------------------------------------- >>%my_archive_log% diff --git a/make.py b/make.py index e7b0fafb..d524ac12 100644 --- a/make.py +++ b/make.py @@ -59,17 +59,16 @@ class WinPythonDistributionBuilder: def __init__(self, build_number: int, release_level: str, target_directory: Path, wheels_directory: Path, tools_directories: list[Path] = None, verbose: bool = False, - base_directory: Path = None, install_options: list[str] = None, flavor: str = ""): + install_options: list[str] = None, flavor: str = ""): """ Initializes the WinPythonDistributionBuilder. Args: build_number: The build number (integer). release_level: The release level (e.g., "beta", ""). - target_directory: The base directory where WinPython will be created. + target_directory: The base directory below which WinPython will be created. wheels_directory: Directory containing wheel files for packages. tools_directories: List of directories containing development tools to include. verbose: Enable verbose output. - base_directory: Base directory for building (optional, for relative paths). install_options: Additional pip install options. flavor: WinPython flavor (e.g., "Barebone"). """ @@ -81,7 +80,6 @@ def __init__(self, build_number: int, release_level: str, target_directory: Path self.verbose = verbose self.winpython_directory: Path | None = None self.distribution: wppm.Distribution | None = None - self.base_directory = base_directory self.install_options = install_options or [] self.flavor = flavor self.python_zip_file: Path = self._get_python_zip_file() @@ -132,11 +130,11 @@ def architecture_bits(self) -> int: def create_installer_7zip(self, installer_type: str = "exe", compression= "mx5"): """Creates a WinPython installer using 7-Zip: "exe", "7z", "zip")""" self._print_action(f"Creating WinPython installer ({installer_type})") - if installer_type not in ["exe", "7z", "zip"]: - return DISTDIR = self.winpython_directory filename_stem = f"Winpython{self.architecture_bits}-{self.python_full_version}.{self.build_number}{self.flavor}{self.release_level}" fullfilename = DISTDIR.parent / (filename_stem + "." + installer_type) + if installer_type not in ["exe", "7z", "zip"]: + return sfx_option = "-sfx7z.sfx" if installer_type == "exe" else "" zip_option = "-tzip" if installer_type == "zip" else "" compress_level = "mx5" if compression == "" else compression @@ -182,12 +180,12 @@ def _create_initial_batch_scripts(self): with open(self.winpython_directory / "scripts" / "env.ini", "w") as f: f.writelines([f'{a}={b}\n' for a, b in init_variables]) - def build(self, rebuild: bool = True, winpy_dirname: str = None): + def build(self, rebuild: bool = True, winpy_dir: Path = None): """Make or finalise WinPython distribution in the target directory""" print(f"Building WinPython with Python archive: {self.python_zip_file.name}") - if winpy_dirname is None: + if winpy_dir is None: raise RuntimeError("WinPython base directory to create is undefined") - self.winpython_directory = self.target_directory / winpy_dirname + self.winpython_directory = winpy_dir if rebuild: self._print_action(f"Creating WinPython {self.winpython_directory} base directory") @@ -222,7 +220,7 @@ def build(self, rebuild: bool = True, winpy_dirname: str = None): shutil.copyfile(output_markdown_filename, str(Path(CHANGELOGS_DIRECTORY) / Path(output_markdown_filename).name)) diff.write_changelog(self.winpyver2, None, CHANGELOGS_DIRECTORY, self.flavor, self.distribution.architecture, basedir=self.winpython_directory.parent) -def make_all(build_number: int, release_level: str, pyver: str, architecture: int, basedir: Path, +def make_all(build_number: int, release_level: str, basedir_wpy: Path = None, verbose: bool = False, rebuild: bool = True, create_installer: str = "True", install_options=["--no-index"], flavor: str = "", find_links: str | list[Path] = None, source_dirs: Path = None, toolsdirs: str | list[Path] = None, @@ -233,9 +231,7 @@ def make_all(build_number: int, release_level: str, pyver: str, architecture: in Args: build_number: build number [int] release_level: release level (e.g. 'beta1', '') [str] - pyver: python version ('3.4' or 3.5') - architecture: [int] (32 or 64) - basedir: where to create the build (r'D:\Winpython\basedir34') + basedir_wpy: top directory of the build (c:\...\Wpy...) verbose: Enable verbose output (bool). rebuild: Whether to rebuild the distribution (bool). create_installer: Type of installer to create (str). @@ -246,23 +242,22 @@ def make_all(build_number: int, release_level: str, pyver: str, architecture: in toolsdirs: Directory with development tools r'D:\WinPython\basedir34\t.Slim' python_target_release: Target Python release (str). """ - assert basedir is not None, "The *basedir* directory must be specified" - assert architecture in (32, 64) + assert basedir_wpy is not None, "The *winpython_dirname* directory must be specified" tools_dirs_list = parse_list_argument(toolsdirs, ",") install_options_list = parse_list_argument(install_options, " ") find_links_dirs_list = parse_list_argument(find_links, ",") find_links_options = [f"--find-links={link}" for link in find_links_dirs_list + [source_dirs]] - build_directory = Path(basedir) / ("bu" + flavor) + winpy_dir = Path(basedir_wpy) if rebuild: - utils.print_box(f"Making WinPython {architecture}bits at {Path(basedir) / ('bu' + flavor)}") - os.makedirs(build_directory, exist_ok=True) + utils.print_box(f"Making WinPython at {winpy_dir}") + os.makedirs(winpy_dir, exist_ok=True) builder = WinPythonDistributionBuilder( - build_number, release_level, build_directory, wheels_directory=source_dirs, + build_number, release_level, winpy_dir.parent, wheels_directory=source_dirs, tools_directories=[Path(d) for d in tools_dirs_list], - verbose=verbose, base_directory=basedir, + verbose=verbose, install_options=install_options_list + find_links_options, flavor=flavor ) @@ -270,13 +265,8 @@ def make_all(build_number: int, release_level: str, pyver: str, architecture: in python_minor_version_str = "".join(builder.python_name.replace(".amd64", "").split(".")[-2:-1]) while not python_minor_version_str.isdigit() and len(python_minor_version_str) > 0: python_minor_version_str = python_minor_version_str[:-1] - # simplify for PyPy - if python_target_release is not None: - winpython_dirname = f"WPy{architecture}-{python_target_release}{build_number}{release_level}" - else: - winpython_dirname = f"WPy{architecture}-{pyver.replace('.', '')}{python_minor_version_str}{build_number}{release_level}" - builder.build(rebuild=rebuild, winpy_dirname=winpython_dirname) + builder.build(rebuild=rebuild, winpy_dir=winpy_dir) for commmand in create_installer.lower().replace("7zip",".exe").split('.'): installer_type, compression = (commmand + "-").split("-")[:2] @@ -286,14 +276,12 @@ def make_all(build_number: int, release_level: str, pyver: str, architecture: in # DO create only one Winpython distribution at a time make_all( build_number=1, - release_level="build3", - pyver="3.4", - basedir=r"D:\Winpython\basedir34", + release_level="b3", + basedir_wpy=r"D:\WinPython\bd314\budot\WPy64-31401b3", verbose=True, - architecture=64, - flavor="Barebone", + flavor="dot", install_options=r"--no-index --pre --trusted-host=None", find_links=r"D:\Winpython\packages.srcreq", - source_dirs=r"D:\WinPython\basedir34\packages.win-amd64", - toolsdirs=r"D:\WinPython\basedir34\t.Slim", + source_dirs=r"D:\WinPython\bd314\packages.win-amd64", + toolsdirs=r"D:\WinPython\bd314\t.Slim", ) From 922c4c29feed402b7e43c8c2b5350a5e8638cc1a Mon Sep 17 00:00:00 2001 From: stonebig Date: Sat, 5 Jul 2025 10:36:12 +0200 Subject: [PATCH 256/305] we can .zip with Python only, but 4x slower --- wppm/utils.py | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/wppm/utils.py b/wppm/utils.py index dcec0207..df8e759b 100644 --- a/wppm/utils.py +++ b/wppm/utils.py @@ -303,6 +303,16 @@ def normalize(this): """Apply PEP 503 normalization to the string.""" return re.sub(r"[-_.]+", "-", this).lower() +def zip_directory(folder_path, output_zip_path): + folder_path = Path(folder_path) + output_zip_path = Path(output_zip_path) + + with zipfile.ZipFile(output_zip_path, 'w', compression=zipfile.ZIP_DEFLATED) as zipf: + for file in folder_path.rglob('*'): + if file.is_file(): + arcname = file.relative_to(folder_path) + zipf.write(file, arcname) + if __name__ == '__main__': print_box("Test") dname = sys.prefix From e32c24912866cd69b05620f009bfb50bba01097f Mon Sep 17 00:00:00 2001 From: stonebig Date: Sat, 5 Jul 2025 10:55:32 +0200 Subject: [PATCH 257/305] simplify --- generate_a_winpython_distro.bat | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/generate_a_winpython_distro.bat b/generate_a_winpython_distro.bat index 68086aa8..51d8cc67 100644 --- a/generate_a_winpython_distro.bat +++ b/generate_a_winpython_distro.bat @@ -30,7 +30,7 @@ if %my_python_target%==312 set my_python_target_release=31210& set my_release=2 if %my_python_target%==313 set my_python_target_release=3135& set my_release=1 if %my_python_target%==314 set my_python_target_release=3140& set my_release=1 -set my_basedir_wpy=%my_basedir%\bu%my_flavor%\WPy%my_arch%-%my_python_target_release%%my_release% +set my_WINPYDIRBASE=%my_basedir%\bu%my_flavor%\WPy%my_arch%-%my_python_target_release%%my_release%%my_release_level% echo -------------------------------------- >>%my_archive_log% echo (%date% %time%) preparing winPython for %my_pyver% (%my_python_target%)release %my_release%%my_flavor% (%my_release_level%) *** %my_arch% bit ***>>%my_archive_log% @@ -61,11 +61,10 @@ call %my_buildenv%\scripts\env.bat REM Create basic build infrastructure echo "(%date% %time%) Create basic build infrastructure">>%my_archive_log% -python.exe -c "from make import *;make_all(%my_release%, '%my_release_level%', basedir_wpy=r'%my_basedir_wpy%', verbose=True, flavor='%my_flavor%', install_options=r'%my_install_options%', find_links=r'%my_find_links%', source_dirs=r'%my_source_dirs%', toolsdirs=r'%my_toolsdirs%', create_installer='False', python_target_release='%my_python_target_release%')">>%my_archive_log% +python.exe -c "from make import *;make_all(%my_release%, '%my_release_level%', basedir_wpy=r'%my_WINPYDIRBASE%', verbose=True, flavor='%my_flavor%', install_options=r'%my_install_options%', find_links=r'%my_find_links%', source_dirs=r'%my_source_dirs%', toolsdirs=r'%my_toolsdirs%', create_installer='False', python_target_release='%my_python_target_release%')">>%my_archive_log% REM Check infrastructure is in place echo "(%date% %time%) Check infrastructure">>%my_archive_log% -set my_WINPYDIRBASE=%my_root_dir_for_builds%\bd%my_python_target%\bu%my_flavor%\Wpy%my_arch%-%my_python_target_release%%my_release%%my_release_level% set WINPYDIRBASE=%my_WINPYDIRBASE% if not exist %my_WINPYDIRBASE%\scripts\env.bat ( @@ -211,7 +210,7 @@ set path=%my_original_path% cd /D %~dp0 call %my_buildenv%\scripts\env.bat -python.exe -c "from make import *;make_all(%my_release%, '%my_release_level%', basedir_wpy=r'%my_basedir_wpy%', verbose=True, flavor='%my_flavor%', install_options=r'%my_install_options%', find_links=r'%my_find_links%', source_dirs=r'%my_source_dirs%', create_installer='%my_create_installer%', rebuild=False, python_target_release='%my_python_target_release%')" >> %my_archive_log% +python.exe -c "from make import *;make_all(%my_release%, '%my_release_level%', basedir_wpy=r'%my_WINPYDIRBASE%', verbose=True, flavor='%my_flavor%', install_options=r'%my_install_options%', find_links=r'%my_find_links%', source_dirs=r'%my_source_dirs%', create_installer='%my_create_installer%', rebuild=False, python_target_release='%my_python_target_release%')" >> %my_archive_log% echo -------------------------------------- >>%my_archive_log% From 30d34c95a38253d313899917c28984619334addb Mon Sep 17 00:00:00 2001 From: stonebig Date: Sat, 5 Jul 2025 16:13:02 +0200 Subject: [PATCH 258/305] allow python -m wppm --- wppm/__init__.py | 2 +- wppm/__main__.py | 6 ++++++ 2 files changed, 7 insertions(+), 1 deletion(-) create mode 100644 wppm/__main__.py diff --git a/wppm/__init__.py b/wppm/__init__.py index 16dcd6d5..e7414c38 100644 --- a/wppm/__init__.py +++ b/wppm/__init__.py @@ -28,6 +28,6 @@ OTHER DEALINGS IN THE SOFTWARE. """ -__version__ = '17.0.20250628' +__version__ = '17.1.20250705' __license__ = __doc__ __project_url__ = 'http://winpython.github.io/' diff --git a/wppm/__main__.py b/wppm/__main__.py new file mode 100644 index 00000000..f34bb5e4 --- /dev/null +++ b/wppm/__main__.py @@ -0,0 +1,6 @@ +import os +import sys +if __name__ == "__main__": + from wppm import wppm + + sys.exit(wppm.main()) \ No newline at end of file From 399c64eed9b7b15b9a5e254596461384d0024873 Mon Sep 17 00:00:00 2001 From: stonebig Date: Sun, 6 Jul 2025 08:59:06 +0200 Subject: [PATCH 259/305] duplicate zip login in wppm --- make.py | 16 +--------------- wppm/__init__.py | 2 +- wppm/utils.py | 30 +++++++++++++++++++++++++++++- 3 files changed, 31 insertions(+), 17 deletions(-) diff --git a/make.py b/make.py index d524ac12..66e243c9 100644 --- a/make.py +++ b/make.py @@ -23,14 +23,6 @@ assert CHANGELOGS_DIRECTORY.is_dir(), f"Changelogs directory not found: {CHANGELOGS_DIRECTORY}" assert PORTABLE_DIRECTORY.is_dir(), f"Portable directory not found: {PORTABLE_DIRECTORY}" -def find_7zip_executable() -> str: - """Locates the 7-Zip executable (7z.exe).""" - possible_program_files = [r"C:\Program Files", r"C:\Program Files (x86)", Path(sys.prefix).parent / "t"] - for base_dir in possible_program_files: - if (executable_path := Path(base_dir) / "7-Zip" / "7z.exe").is_file(): - return str(executable_path) - raise RuntimeError("7ZIP is not installed on this computer.") - def copy_items(source_directories: list[Path], target_directory: Path, verbose: bool = False): """Copies items from source directories to the target directory.""" target_directory.mkdir(parents=True, exist_ok=True) @@ -138,7 +130,7 @@ def create_installer_7zip(self, installer_type: str = "exe", compression= "mx5") sfx_option = "-sfx7z.sfx" if installer_type == "exe" else "" zip_option = "-tzip" if installer_type == "zip" else "" compress_level = "mx5" if compression == "" else compression - command = f'"{find_7zip_executable()}" {zip_option} -{compress_level} a "{fullfilename}" "{DISTDIR}" {sfx_option}' + command = f'"{utils.find_7zip_executable()}" {zip_option} -{compress_level} a "{fullfilename}" "{DISTDIR}" {sfx_option}' print(f'Executing 7-Zip script: "{command}"') try: subprocess.run(command, shell=True, check=True, stderr=sys.stderr, stdout=sys.stderr) @@ -224,7 +216,6 @@ def make_all(build_number: int, release_level: str, basedir_wpy: Path = None, verbose: bool = False, rebuild: bool = True, create_installer: str = "True", install_options=["--no-index"], flavor: str = "", find_links: str | list[Path] = None, source_dirs: Path = None, toolsdirs: str | list[Path] = None, - python_target_release: str = None, # e.g. "37101" for 3.7.10 ): """ Make a WinPython distribution for a given set of parameters: @@ -240,7 +231,6 @@ def make_all(build_number: int, release_level: str, basedir_wpy: Path = None, find_links: package directories (r'D:\Winpython\packages.srcreq') source_dirs: the python.zip + rebuilt winpython wheel package directory toolsdirs: Directory with development tools r'D:\WinPython\basedir34\t.Slim' - python_target_release: Target Python release (str). """ assert basedir_wpy is not None, "The *winpython_dirname* directory must be specified" @@ -261,10 +251,6 @@ def make_all(build_number: int, release_level: str, basedir_wpy: Path = None, install_options=install_options_list + find_links_options, flavor=flavor ) - # define the directory where to create the distro - python_minor_version_str = "".join(builder.python_name.replace(".amd64", "").split(".")[-2:-1]) - while not python_minor_version_str.isdigit() and len(python_minor_version_str) > 0: - python_minor_version_str = python_minor_version_str[:-1] builder.build(rebuild=rebuild, winpy_dir=winpy_dir) diff --git a/wppm/__init__.py b/wppm/__init__.py index e7414c38..a454a334 100644 --- a/wppm/__init__.py +++ b/wppm/__init__.py @@ -28,6 +28,6 @@ OTHER DEALINGS IN THE SOFTWARE. """ -__version__ = '17.1.20250705' +__version__ = '17.1.20250705a1' __license__ = __doc__ __project_url__ = 'http://winpython.github.io/' diff --git a/wppm/utils.py b/wppm/utils.py index df8e759b..20f154e7 100644 --- a/wppm/utils.py +++ b/wppm/utils.py @@ -312,7 +312,35 @@ def zip_directory(folder_path, output_zip_path): if file.is_file(): arcname = file.relative_to(folder_path) zipf.write(file, arcname) - + +def find_7zip_executable() -> str: + """Locates the 7-Zip executable (7z.exe).""" + possible_program_files = [r"C:\Program Files", r"C:\Program Files (x86)", Path(sys.prefix).parent / "t"] + for base_dir in possible_program_files: + if (executable_path := Path(base_dir) / "7-Zip" / "7z.exe").is_file(): + return str(executable_path) + raise RuntimeError("7ZIP is not installed on this computer.") + +def create_installer_7zip(origin, destination, filename_stem, installer_type: str = "exe", compression= "mx5"): + """Creates a WinPython installer using 7-Zip: "exe", "7z", "zip")""" + fullfilename = destination / (filename_stem + "." + installer_type) + if installer_type not in ["exe", "7z", "zip"]: + return + sfx_option = "-sfx7z.sfx" if installer_type == "exe" else "" + zip_option = "-tzip" if installer_type == "zip" else "" + compress_level = "mx5" if compression == "" else compression + command = f'"{find_7zip_executable()}" {zip_option} -{compress_level} a "{fullfilename}" "{origin}" {sfx_option}' + print(f'Executing 7-Zip script: "{command}"') + try: + subprocess.run(command, shell=True, check=True, stderr=sys.stderr, stdout=sys.stderr) + except subprocess.CalledProcessError as e: + print(f"Error executing 7-Zip script: {e}", file=sys.stderr) + +def command_installer_7zip(origin, destination, filename_stem, create_installer: str = "exe"): + for commmand in create_installer.lower().replace("7zip",".exe").split('.'): + installer_type, compression = (commmand + "-").split("-")[:2] + create_installer_7zip(Path(origin), Path(destination), filename_stem, installer_type, compression) + if __name__ == '__main__': print_box("Test") dname = sys.prefix From 07e29bef3be26118e056f6c4f96f3d2e538deaab Mon Sep 17 00:00:00 2001 From: stonebig Date: Sun, 6 Jul 2025 09:09:20 +0200 Subject: [PATCH 260/305] move zip logic out of make.py --- generate_a_winpython_distro.bat | 19 +++++++++++++------ make.py | 21 --------------------- 2 files changed, 13 insertions(+), 27 deletions(-) diff --git a/generate_a_winpython_distro.bat b/generate_a_winpython_distro.bat index 51d8cc67..522a5239 100644 --- a/generate_a_winpython_distro.bat +++ b/generate_a_winpython_distro.bat @@ -61,7 +61,7 @@ call %my_buildenv%\scripts\env.bat REM Create basic build infrastructure echo "(%date% %time%) Create basic build infrastructure">>%my_archive_log% -python.exe -c "from make import *;make_all(%my_release%, '%my_release_level%', basedir_wpy=r'%my_WINPYDIRBASE%', verbose=True, flavor='%my_flavor%', install_options=r'%my_install_options%', find_links=r'%my_find_links%', source_dirs=r'%my_source_dirs%', toolsdirs=r'%my_toolsdirs%', create_installer='False', python_target_release='%my_python_target_release%')">>%my_archive_log% +python.exe -c "from make import *;make_all(%my_release%, '%my_release_level%', basedir_wpy=r'%my_WINPYDIRBASE%', verbose=True, flavor='%my_flavor%', install_options=r'%my_install_options%', find_links=r'%my_find_links%', source_dirs=r'%my_source_dirs%', toolsdirs=r'%my_toolsdirs%', create_installer='False')">>%my_archive_log% REM Check infrastructure is in place echo "(%date% %time%) Check infrastructure">>%my_archive_log% @@ -70,7 +70,7 @@ set WINPYDIRBASE=%my_WINPYDIRBASE% if not exist %my_WINPYDIRBASE%\scripts\env.bat ( @echo off echo as %my_WINPYDIRBASE%\scripts\env.bat does not exist - echo please check and correct my_python_target_release=%my_python_target_release% + echo please check and correct: echo my_arch=%my_arch% echo my_python_target_release=%my_python_target_release% echo my_release=%my_release% @@ -206,12 +206,19 @@ call %my_WINPYDIRBASE%\scripts\env.bat REM Generate changelog and binaries echo "(%date% %time%) Generate changelog and binaries">>%my_archive_log% -set path=%my_original_path% -cd /D %~dp0 -call %my_buildenv%\scripts\env.bat -python.exe -c "from make import *;make_all(%my_release%, '%my_release_level%', basedir_wpy=r'%my_WINPYDIRBASE%', verbose=True, flavor='%my_flavor%', install_options=r'%my_install_options%', find_links=r'%my_find_links%', source_dirs=r'%my_source_dirs%', create_installer='%my_create_installer%', rebuild=False, python_target_release='%my_python_target_release%')" >> %my_archive_log% +rem markdowm and markdown diff +set mdn=WinPython%my_flavor%-%my_arch%bit-%WINPYVER2%.md +%target_python_exe% -m wppm -md>%my_basedir%\bu%my_flavor%\%mdn% +copy/y %my_basedir%\bu%my_flavor%\%mdn% %~dp0changelogs\%mdn% + +set out=WinPython%my_flavor%-%my_arch%bit-%WINPYVER2%_History.md +%target_python_exe% -c "from wppm import diff ;a=(diff.compare_package_indexes(r'%WINPYVER2%', searchdir=r'%~dp0changelogs',flavor=r'%my_flavor%',architecture=%my_arch%));f=open(r'%my_basedir%\bu%my_flavor%\%out%','w', encoding='utf-8');f.write(a);f.close()" +copy/y %my_basedir%\bu%my_flavor%\%out% %~dp0changelogs\%out% +rem compress +set stem=WinPython%my_arch%-%WINPYVER2%%my_flavor% +%target_python_exe% -c "from wppm import utils;utils.command_installer_7zip(r'%my_WINPYDIRBASE%', r'%my_WINPYDIRBASE%\..',r'%stem%', r'%my_create_installer%')" echo -------------------------------------- >>%my_archive_log% echo "(%date% %time%) END OF CREATION">>%my_archive_log% diff --git a/make.py b/make.py index 66e243c9..d6543e68 100644 --- a/make.py +++ b/make.py @@ -119,24 +119,6 @@ def architecture_bits(self) -> int: """Returns the architecture (32 or 64 bits) of the distribution.""" return self.distribution.architecture if self.distribution else 64 - def create_installer_7zip(self, installer_type: str = "exe", compression= "mx5"): - """Creates a WinPython installer using 7-Zip: "exe", "7z", "zip")""" - self._print_action(f"Creating WinPython installer ({installer_type})") - DISTDIR = self.winpython_directory - filename_stem = f"Winpython{self.architecture_bits}-{self.python_full_version}.{self.build_number}{self.flavor}{self.release_level}" - fullfilename = DISTDIR.parent / (filename_stem + "." + installer_type) - if installer_type not in ["exe", "7z", "zip"]: - return - sfx_option = "-sfx7z.sfx" if installer_type == "exe" else "" - zip_option = "-tzip" if installer_type == "zip" else "" - compress_level = "mx5" if compression == "" else compression - command = f'"{utils.find_7zip_executable()}" {zip_option} -{compress_level} a "{fullfilename}" "{DISTDIR}" {sfx_option}' - print(f'Executing 7-Zip script: "{command}"') - try: - subprocess.run(command, shell=True, check=True, stderr=sys.stderr, stdout=sys.stderr) - except subprocess.CalledProcessError as e: - print(f"Error executing 7-Zip script: {e}", file=sys.stderr) - def _print_action(self, text: str): """Prints an action message with progress indicator.""" if self.verbose: @@ -254,9 +236,6 @@ def make_all(build_number: int, release_level: str, basedir_wpy: Path = None, builder.build(rebuild=rebuild, winpy_dir=winpy_dir) - for commmand in create_installer.lower().replace("7zip",".exe").split('.'): - installer_type, compression = (commmand + "-").split("-")[:2] - builder.create_installer_7zip(installer_type, compression) if __name__ == "__main__": # DO create only one Winpython distribution at a time From 42584a00972a8c5b1354f2c4d38f764330b27793 Mon Sep 17 00:00:00 2001 From: stonebig Date: Sun, 6 Jul 2025 15:14:07 +0200 Subject: [PATCH 261/305] move laucnher scripts to python -m module avoiding the module.exe script when we can --- portable/launchers_final/scripts/winidle.bat | 3 ++- portable/launchers_final/scripts/winipython_notebook.bat | 3 ++- portable/launchers_final/scripts/winjupyter_lab.bat | 3 ++- portable/launchers_final/scripts/winpython.bat | 4 ++-- portable/launchers_final/scripts/wpcp.bat | 3 ++- 5 files changed, 10 insertions(+), 6 deletions(-) diff --git a/portable/launchers_final/scripts/winidle.bat b/portable/launchers_final/scripts/winidle.bat index 79a6a01a..797549ab 100644 --- a/portable/launchers_final/scripts/winidle.bat +++ b/portable/launchers_final/scripts/winidle.bat @@ -1,3 +1,4 @@ @echo off call "%~dp0env_for_icons.bat" %* -"%WINPYDIR%\python.exe" "%WINPYDIR%\Lib\idlelib\idle.pyw" %* \ No newline at end of file +rem "%WINPYDIR%\python.exe" "%WINPYDIR%\Lib\idlelib\idle.pyw" %* +"%WINPYDIR%\python.exe" -m idlelib %* \ No newline at end of file diff --git a/portable/launchers_final/scripts/winipython_notebook.bat b/portable/launchers_final/scripts/winipython_notebook.bat index 7ee541d9..f5681520 100644 --- a/portable/launchers_final/scripts/winipython_notebook.bat +++ b/portable/launchers_final/scripts/winipython_notebook.bat @@ -1,3 +1,4 @@ @echo off call "%~dp0env_for_icons.bat" %* -"%WINPYDIR%\scripts\jupyter-notebook.exe" %* \ No newline at end of file +rem "%WINPYDIR%\scripts\jupyter-notebook.exe" %* +"%WINPYDIR%\python.exe" -m jupyter notebook %* \ No newline at end of file diff --git a/portable/launchers_final/scripts/winjupyter_lab.bat b/portable/launchers_final/scripts/winjupyter_lab.bat index 845d1f0b..ffdf2fce 100644 --- a/portable/launchers_final/scripts/winjupyter_lab.bat +++ b/portable/launchers_final/scripts/winjupyter_lab.bat @@ -1,3 +1,4 @@ @echo off call "%~dp0env_for_icons.bat" %* -"%WINPYDIR%\scripts\jupyter-lab.exe" %* \ No newline at end of file +rem "%WINPYDIR%\scripts\jupyter-lab.exe" %* +"%WINPYDIR%\python.exe" -m jupyter lab %* \ No newline at end of file diff --git a/portable/launchers_final/scripts/winpython.bat b/portable/launchers_final/scripts/winpython.bat index 9f98d397..2a0706ec 100644 --- a/portable/launchers_final/scripts/winpython.bat +++ b/portable/launchers_final/scripts/winpython.bat @@ -1,8 +1,8 @@ @echo off call "%~dp0env_for_icons.bat" %* rem backward compatibility for non-ptpython users -if exist "%WINPYDIR%\scripts\ptpython.exe" ( - "%WINPYDIR%\scripts\ptpython.exe" %* +if exist "%WINPYDIR%\Lib\site-packages\ptpython" ( + "%WINPYDIR%\python.exe" -m ptpython %* ) else ( "%WINPYDIR%\python.exe" %* ) \ No newline at end of file diff --git a/portable/launchers_final/scripts/wpcp.bat b/portable/launchers_final/scripts/wpcp.bat index 5edb982c..a2bd53bb 100644 --- a/portable/launchers_final/scripts/wpcp.bat +++ b/portable/launchers_final/scripts/wpcp.bat @@ -1,3 +1,4 @@ @echo off call "%~dp0env_for_icons.bat" %* -cmd.exe /k "echo wppm & wppm %*" \ No newline at end of file +rem cmd.exe /k "echo wppm & wppm" %* +cmd.exe /k "echo wppm & python -m wppm" %* \ No newline at end of file From b85576f32a96bd76e3d12ac0f8cf2e4f8a737ce4 Mon Sep 17 00:00:00 2001 From: stonebig Date: Sun, 6 Jul 2025 15:38:45 +0200 Subject: [PATCH 262/305] align wppm script --- portable/launchers_final/scripts/wpcp.bat | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/portable/launchers_final/scripts/wpcp.bat b/portable/launchers_final/scripts/wpcp.bat index a2bd53bb..251a8348 100644 --- a/portable/launchers_final/scripts/wpcp.bat +++ b/portable/launchers_final/scripts/wpcp.bat @@ -1,4 +1,4 @@ @echo off call "%~dp0env_for_icons.bat" %* rem cmd.exe /k "echo wppm & wppm" %* -cmd.exe /k "echo wppm & python -m wppm" %* \ No newline at end of file +cmd.exe /k "echo wppm & "%WINPYDIR%\python.exe" -m wppm" %* \ No newline at end of file From 10dba934e4794f371dafa4cd9dade1a29fadd2e1 Mon Sep 17 00:00:00 2001 From: stonebig Date: Sun, 6 Jul 2025 15:56:31 +0200 Subject: [PATCH 263/305] markdown is generated per main dos script now --- make.py | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/make.py b/make.py index d6543e68..43c48175 100644 --- a/make.py +++ b/make.py @@ -15,12 +15,10 @@ from wppm import wppm, utils, diff # Define constant paths for clarity -CHANGELOGS_DIRECTORY = Path(__file__).parent / "changelogs" PORTABLE_DIRECTORY = Path(__file__).parent / "portable" NODEJS_RELATIVE_PATH = "n" # Relative path within WinPython dir # Ensure necessary directories exist at the start -assert CHANGELOGS_DIRECTORY.is_dir(), f"Changelogs directory not found: {CHANGELOGS_DIRECTORY}" assert PORTABLE_DIRECTORY.is_dir(), f"Portable directory not found: {PORTABLE_DIRECTORY}" def copy_items(source_directories: list[Path], target_directory: Path, verbose: bool = False): @@ -184,16 +182,6 @@ def build(self, rebuild: bool = True, winpy_dir: Path = None): self.distribution.do_pip_action(actions) self.distribution.patch_standard_packages(package_name) - self._print_action("Writing package index") - self.winpyver2 = f"{self.python_full_version}.{self.build_number}" - output_markdown_filename = str(self.winpython_directory.parent / f"WinPython{self.flavor}-{self.distribution.architecture}bit-{self.winpyver2}.md") - with open(output_markdown_filename, "w", encoding='utf-8') as f: - f.write(self.package_index_markdown) - - self._print_action("Writing changelog") - shutil.copyfile(output_markdown_filename, str(Path(CHANGELOGS_DIRECTORY) / Path(output_markdown_filename).name)) - diff.write_changelog(self.winpyver2, None, CHANGELOGS_DIRECTORY, self.flavor, self.distribution.architecture, basedir=self.winpython_directory.parent) - def make_all(build_number: int, release_level: str, basedir_wpy: Path = None, verbose: bool = False, rebuild: bool = True, create_installer: str = "True", install_options=["--no-index"], flavor: str = "", find_links: str | list[Path] = None, @@ -233,7 +221,6 @@ def make_all(build_number: int, release_level: str, basedir_wpy: Path = None, install_options=install_options_list + find_links_options, flavor=flavor ) - builder.build(rebuild=rebuild, winpy_dir=winpy_dir) From e8d8ccf5406521a0ee097724c80ae95e666181d7 Mon Sep 17 00:00:00 2001 From: stonebig Date: Sun, 6 Jul 2025 16:15:59 +0200 Subject: [PATCH 264/305] clean-up no-more-used modules and create_installer option --- generate_a_winpython_distro.bat | 2 +- make.py | 7 ++----- 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/generate_a_winpython_distro.bat b/generate_a_winpython_distro.bat index 522a5239..0b64a596 100644 --- a/generate_a_winpython_distro.bat +++ b/generate_a_winpython_distro.bat @@ -61,7 +61,7 @@ call %my_buildenv%\scripts\env.bat REM Create basic build infrastructure echo "(%date% %time%) Create basic build infrastructure">>%my_archive_log% -python.exe -c "from make import *;make_all(%my_release%, '%my_release_level%', basedir_wpy=r'%my_WINPYDIRBASE%', verbose=True, flavor='%my_flavor%', install_options=r'%my_install_options%', find_links=r'%my_find_links%', source_dirs=r'%my_source_dirs%', toolsdirs=r'%my_toolsdirs%', create_installer='False')">>%my_archive_log% +python.exe -c "from make import *;make_all(%my_release%, '%my_release_level%', basedir_wpy=r'%my_WINPYDIRBASE%', verbose=True, flavor='%my_flavor%', install_options=r'%my_install_options%', find_links=r'%my_find_links%', source_dirs=r'%my_source_dirs%', toolsdirs=r'%my_toolsdirs%')">>%my_archive_log% REM Check infrastructure is in place echo "(%date% %time%) Check infrastructure">>%my_archive_log% diff --git a/make.py b/make.py index 43c48175..bb76c605 100644 --- a/make.py +++ b/make.py @@ -9,10 +9,8 @@ import os import re import shutil -import subprocess -import sys from pathlib import Path -from wppm import wppm, utils, diff +from wppm import wppm, utils # Define constant paths for clarity PORTABLE_DIRECTORY = Path(__file__).parent / "portable" @@ -183,7 +181,7 @@ def build(self, rebuild: bool = True, winpy_dir: Path = None): self.distribution.patch_standard_packages(package_name) def make_all(build_number: int, release_level: str, basedir_wpy: Path = None, - verbose: bool = False, rebuild: bool = True, create_installer: str = "True", install_options=["--no-index"], + verbose: bool = False, rebuild: bool = True, install_options=["--no-index"], flavor: str = "", find_links: str | list[Path] = None, source_dirs: Path = None, toolsdirs: str | list[Path] = None, ): @@ -195,7 +193,6 @@ def make_all(build_number: int, release_level: str, basedir_wpy: Path = None, basedir_wpy: top directory of the build (c:\...\Wpy...) verbose: Enable verbose output (bool). rebuild: Whether to rebuild the distribution (bool). - create_installer: Type of installer to create (str). install_options: pip options (r'--no-index --pre --trusted-host=None') flavor: WinPython flavor (str). find_links: package directories (r'D:\Winpython\packages.srcreq') From 5633e31f33b76ff065b9d2ee44ee1792683498e1 Mon Sep 17 00:00:00 2001 From: stonebig Date: Sun, 6 Jul 2025 17:13:19 +0200 Subject: [PATCH 265/305] remove no-more-used markdown property and rebuild flag --- make.py | 61 +++++++++++++++++++++------------------------------------ 1 file changed, 22 insertions(+), 39 deletions(-) diff --git a/make.py b/make.py index bb76c605..445b8d1d 100644 --- a/make.py +++ b/make.py @@ -14,7 +14,6 @@ # Define constant paths for clarity PORTABLE_DIRECTORY = Path(__file__).parent / "portable" -NODEJS_RELATIVE_PATH = "n" # Relative path within WinPython dir # Ensure necessary directories exist at the start assert PORTABLE_DIRECTORY.is_dir(), f"Portable directory not found: {PORTABLE_DIRECTORY}" @@ -81,17 +80,6 @@ def _get_python_zip_file(self) -> Path: return source_item raise RuntimeError(f"Could not find Python zip package in {self.wheels_directory}") - @property - def package_index_markdown(self) -> str: - """Generates a Markdown formatted package index page.""" - return self.distribution.generate_package_index_markdown( - self.python_executable_directory, - self.winpyver2, - self.flavor, - self.architecture_bits, - self.release_level - ) - @property def winpython_version_name(self) -> str: """Returns the full WinPython version string.""" @@ -150,38 +138,36 @@ def _create_initial_batch_scripts(self): with open(self.winpython_directory / "scripts" / "env.ini", "w") as f: f.writelines([f'{a}={b}\n' for a, b in init_variables]) - def build(self, rebuild: bool = True, winpy_dir: Path = None): + def build(self, winpy_dir: Path = None): """Make or finalise WinPython distribution in the target directory""" print(f"Building WinPython with Python archive: {self.python_zip_file.name}") if winpy_dir is None: raise RuntimeError("WinPython base directory to create is undefined") self.winpython_directory = winpy_dir - if rebuild: - self._print_action(f"Creating WinPython {self.winpython_directory} base directory") - if self.winpython_directory.is_dir(): - shutil.rmtree(self.winpython_directory) - os.makedirs(self.winpython_directory, exist_ok=True) - # preventive re-Creation of settings directory - (self.winpython_directory / "settings" / "AppData" / "Roaming").mkdir(parents=True, exist_ok=True) - self._extract_python_archive() + self._print_action(f"Creating WinPython {self.winpython_directory} base directory") + if self.winpython_directory.is_dir(): + shutil.rmtree(self.winpython_directory) + os.makedirs(self.winpython_directory, exist_ok=True) + # preventive re-Creation of settings directory + (self.winpython_directory / "settings" / "AppData" / "Roaming").mkdir(parents=True, exist_ok=True) + self._extract_python_archive() self.distribution = wppm.Distribution(self.python_executable_directory, verbose=self.verbose) - if rebuild: - self._copy_essential_files() - self._create_initial_batch_scripts() - utils.python_execmodule("ensurepip", self.distribution.target) - self.distribution.patch_standard_packages("pip") - essential_packages = ["pip", "setuptools", "wheel", "wppm"] - for package_name in essential_packages: - actions = ["install", "--upgrade", "--pre", package_name] + self.install_options - self._print_action(f"Piping: {' '.join(actions)}") - self.distribution.do_pip_action(actions) - self.distribution.patch_standard_packages(package_name) + self._copy_essential_files() + self._create_initial_batch_scripts() + utils.python_execmodule("ensurepip", self.distribution.target) + self.distribution.patch_standard_packages("pip") + essential_packages = ["pip", "setuptools", "wheel", "wppm"] + for package_name in essential_packages: + actions = ["install", "--upgrade", "--pre", package_name] + self.install_options + self._print_action(f"Piping: {' '.join(actions)}") + self.distribution.do_pip_action(actions) + self.distribution.patch_standard_packages(package_name) def make_all(build_number: int, release_level: str, basedir_wpy: Path = None, - verbose: bool = False, rebuild: bool = True, install_options=["--no-index"], + verbose: bool = False, install_options=["--no-index"], flavor: str = "", find_links: str | list[Path] = None, source_dirs: Path = None, toolsdirs: str | list[Path] = None, ): @@ -192,7 +178,6 @@ def make_all(build_number: int, release_level: str, basedir_wpy: Path = None, release_level: release level (e.g. 'beta1', '') [str] basedir_wpy: top directory of the build (c:\...\Wpy...) verbose: Enable verbose output (bool). - rebuild: Whether to rebuild the distribution (bool). install_options: pip options (r'--no-index --pre --trusted-host=None') flavor: WinPython flavor (str). find_links: package directories (r'D:\Winpython\packages.srcreq') @@ -207,10 +192,8 @@ def make_all(build_number: int, release_level: str, basedir_wpy: Path = None, find_links_options = [f"--find-links={link}" for link in find_links_dirs_list + [source_dirs]] winpy_dir = Path(basedir_wpy) - if rebuild: - utils.print_box(f"Making WinPython at {winpy_dir}") - os.makedirs(winpy_dir, exist_ok=True) - + utils.print_box(f"Making WinPython at {winpy_dir}") + os.makedirs(winpy_dir, exist_ok=True) builder = WinPythonDistributionBuilder( build_number, release_level, winpy_dir.parent, wheels_directory=source_dirs, tools_directories=[Path(d) for d in tools_dirs_list], @@ -218,7 +201,7 @@ def make_all(build_number: int, release_level: str, basedir_wpy: Path = None, install_options=install_options_list + find_links_options, flavor=flavor ) - builder.build(rebuild=rebuild, winpy_dir=winpy_dir) + builder.build(winpy_dir=winpy_dir) if __name__ == "__main__": From 60848a704f178fa27b6aebd39b6304133c529a5b Mon Sep 17 00:00:00 2001 From: stonebig Date: Sun, 6 Jul 2025 18:45:36 +0200 Subject: [PATCH 266/305] get spyder config directory portable --- portable/launchers_final/scripts/WinPythonIni.py | 2 ++ portable/launchers_final/scripts/env.bat | 1 + 2 files changed, 3 insertions(+) diff --git a/portable/launchers_final/scripts/WinPythonIni.py b/portable/launchers_final/scripts/WinPythonIni.py index 7bc11bb9..ddc0c2e7 100644 --- a/portable/launchers_final/scripts/WinPythonIni.py +++ b/portable/launchers_final/scripts/WinPythonIni.py @@ -17,6 +17,7 @@ USERPROFILE = %HOME% [environment] ## Uncomment lines to override environment variables +#SPYDER_CONFDIR = %HOME%\settings\.spyder-py3 #JUPYTERLAB_SETTINGS_DIR = %HOME%\.jupyter\lab #JUPYTERLAB_WORKSPACES_DIR = %HOME%\.jupyter\lab\workspaces #R_HOME=%WINPYDIRBASE%\t\R @@ -26,6 +27,7 @@ #JULIA=%JULIA_HOME%%JULIA_EXE% #JULIA_PKGDIR=%WINPYDIRBASE%\settings\.julia #QT_PLUGIN_PATH=%WINPYDIR%\Lib\site-packages\pyqt5_tools\Qt\plugins + ''' def get_file(file_name): diff --git a/portable/launchers_final/scripts/env.bat b/portable/launchers_final/scripts/env.bat index 316f6587..952df8e4 100644 --- a/portable/launchers_final/scripts/env.bat +++ b/portable/launchers_final/scripts/env.bat @@ -30,6 +30,7 @@ rem set PYTHONUTF8=1 creates issues in "movable" patching set HOME=%WINPYDIRBASE%\settings rem see https://github.com/winpython/winpython/issues/839 rem set USERPROFILE=%HOME% +set SPYDER_CONFDIR=%HOME%\settings\.spyder-py3 set JUPYTER_DATA_DIR=%HOME% set JUPYTER_CONFIG_DIR=%WINPYDIR%\etc\jupyter set JUPYTER_CONFIG_PATH=%WINPYDIR%\etc\jupyter From 511c6dd9bb3172d5a809c27cf16f652e80306b60 Mon Sep 17 00:00:00 2001 From: stonebig Date: Sun, 6 Jul 2025 20:50:45 +0200 Subject: [PATCH 267/305] update readme for wppm package switch --- README.rst | 32 ++++++++++++++++++++++---------- 1 file changed, 22 insertions(+), 10 deletions(-) diff --git a/README.rst b/README.rst index 9a1e05cf..de5208ae 100644 --- a/README.rst +++ b/README.rst @@ -6,7 +6,7 @@ Copyright @ 2012-2013 Pierre Raybaut Copyright @ 2014-2025+ The Winpython development team https://github.com/winpython/ Licensed under the terms of the MIT License -(see winpython/__init__.py for details) +(see wppm/__init__.py for details) Overview @@ -15,17 +15,22 @@ Overview WinPython is a portable distribution of the Python programming language for Windows (https://winpython.github.io). -This is the `winpython` Python package, not the distribution itself. +This is the `wppm` Python package and build toolchain repository, not the distribution itself. It includes two main features: WinPython Package Manager (WPPM) a complementary tool to navigate provided packages, install packages from included Wheelhouse, or register WinPython. - pip is the recommanded way to add or remove packages + pip is the recommanded way to add or remove packages otherwise WinPython build toolchain - make.py is the script used to + generate_a_winpython_distro.bat and make.py are the toolchain used to build a WinPython distribution from (almost) scratch. +WinPython set of Wheel + You can get also the equivalent of the WinPython distribution by using one of the provided pylock.toml + or by using provided requirements-with-hash.txt until pip does support pylock.toml files + + Dependencies ------------ @@ -38,20 +43,27 @@ Requirements * installer can be 7-Zip or nothing (just .zip-it) -Installation ------------- +Wppm build +---------- From the source package (see section 'Building dependencies'), you may -install WinPython using the following commands: +build WPPM using the following commands: **python -m pip install flit** **python -m flit build** -**python -m pip install --no-index --trusted-host=None --find-links=.\dist winpython** +Winpython Distribution wheels installation +------------------------------------------ + +To only install the wheels assembled per WinPython Distribution, you may +**python -m pip install --no-deps --require-hashes https://github.com/winpython/winpython/releases/download/16.6.20250620final/requir.64-3_13_5_0slim.txt + +A pylock file is also available, when you package manager can handle it +**https://github.com/winpython/winpython/releases/download/16.6.20250620final/pylock.64-3_13_5_0slim.toml But the easiest way to install the last stable release of WinPython is -by using an executable installer: https://winpython.github.io/ +by using a zipped distribution with or without auto-extractor: https://winpython.github.io/ More informations ----------------- @@ -60,4 +72,4 @@ More informations * Development, bug reports, discussions and feature requests: https://github.com/winpython/winpython -* Discussions: https://groups.google.com/group/winpython +* Discussions: https://github.com/winpython/winpython/discussions From 0e2d3999cca738b79f3109f6709a566315999c77 Mon Sep 17 00:00:00 2001 From: stonebig Date: Sat, 12 Jul 2025 08:11:03 +0200 Subject: [PATCH 268/305] fix https://github.com/winpython/winpython/issues/1675 --- wppm/associate.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/wppm/associate.py b/wppm/associate.py index 9e02182b..49da0ca0 100644 --- a/wppm/associate.py +++ b/wppm/associate.py @@ -12,6 +12,7 @@ import winreg from . import utils from argparse import ArgumentParser +import shutil def get_special_folder_path(path_name): """Return special folder path.""" @@ -37,7 +38,7 @@ def remove_winpython_start_menu_folder(current=True): path = get_winpython_start_menu_folder(current=current) if Path(path).is_dir(): try: - shutil.rmtree(path, onexc=onerror) + shutil.rmtree(path) except WindowsError: print(f"Directory {path} could not be removed", file=sys.stderr) @@ -46,7 +47,7 @@ def create_winpython_start_menu_folder(current=True): path = get_winpython_start_menu_folder(current=current) if Path(path).is_dir(): try: - shutil.rmtree(path, onexc=onerror) + shutil.rmtree(path) except WindowsError: print(f"Directory {path} could not be removed", file=sys.stderr) Path(path).mkdir(parents=True, exist_ok=True) @@ -239,7 +240,7 @@ def register(target, current=True, reg_type=winreg.REG_SZ, verbose=True): # Create start menu entries if has_pywin32: if verbose: - print(f'Creating WinPython menu for all icons in {target.parent}') + print(f'Creating WinPython menu for all icons in {Path(target).parent}') for path, desc, fname in _get_shortcut_data(target, current=current, has_pywin32=True): try: create_shortcut(path, desc, fname, verbose=verbose) @@ -268,7 +269,7 @@ def unregister(target, current=True, verbose=True): # Remove start menu shortcuts if has_pywin32: if verbose: - print(f'Removing WinPython menu for all icons in {target.parent}') + print(f'Removing WinPython menu for all icons in {Path(target).parent}') _remove_start_menu_folder(target, current=current, has_pywin32=True) # The original code had commented out code to delete .lnk files individually. else: From 6337c913dbbe916ee56f5eb600d5b238ea6284ab Mon Sep 17 00:00:00 2001 From: stonebig Date: Sat, 12 Jul 2025 14:39:10 +0200 Subject: [PATCH 269/305] fixes lost in translation to wppm --- wppm/wppm.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/wppm/wppm.py b/wppm/wppm.py index 1f852236..1c9d4f43 100644 --- a/wppm/wppm.py +++ b/wppm/wppm.py @@ -4,7 +4,7 @@ # Copyright © 2012 Pierre Raybaut # Copyright © 2014-2025+ The Winpython development team https://github.com/winpython/ # Licensed under the terms of the MIT License -# (see winpython/__init__.py for details) +# (see wppm/__init__.py for details) import os import re @@ -358,8 +358,8 @@ def main(test=False): sys.exit() if utils.is_python_distribution(args.target): dist = Distribution(args.target, verbose=True) - cmd_fix = rf"from winpython import wppm;dist=wppm.Distribution(r'{dist.target}');dist.patch_standard_packages('pip', to_movable=False)" - cmd_mov = rf"from winpython import wppm;dist=wppm.Distribution(r'{dist.target}');dist.patch_standard_packages('pip', to_movable=True)" + cmd_fix = rf"from wppm import wppm;dist=wppm.Distribution(r'{dist.target}');dist.patch_standard_packages('pip', to_movable=False)" + cmd_mov = rf"from wppm import wppm;dist=wppm.Distribution(r'{dist.target}');dist.patch_standard_packages('pip', to_movable=True)" if args.fix: # dist.patch_standard_packages('pip', to_movable=False) # would fail on wppm.exe p = subprocess.Popen(["start", "cmd", "/k",dist.python_exe, "-c" , cmd_fix], shell = True, cwd=dist.target) From c3681c7f121661d659c287268e983ab978b7a149 Mon Sep 17 00:00:00 2001 From: stonebig Date: Sat, 12 Jul 2025 18:56:04 +0200 Subject: [PATCH 270/305] move essential package installation out of make.py --- generate_a_winpython_distro.bat | 10 +++++++--- make.py | 32 +++++--------------------------- 2 files changed, 12 insertions(+), 30 deletions(-) diff --git a/generate_a_winpython_distro.bat b/generate_a_winpython_distro.bat index 0b64a596..cf498951 100644 --- a/generate_a_winpython_distro.bat +++ b/generate_a_winpython_distro.bat @@ -61,7 +61,7 @@ call %my_buildenv%\scripts\env.bat REM Create basic build infrastructure echo "(%date% %time%) Create basic build infrastructure">>%my_archive_log% -python.exe -c "from make import *;make_all(%my_release%, '%my_release_level%', basedir_wpy=r'%my_WINPYDIRBASE%', verbose=True, flavor='%my_flavor%', install_options=r'%my_install_options%', find_links=r'%my_find_links%', source_dirs=r'%my_source_dirs%', toolsdirs=r'%my_toolsdirs%')">>%my_archive_log% +python.exe -c "from make import *;make_all(%my_release%, '%my_release_level%', basedir_wpy=r'%my_WINPYDIRBASE%', verbose=True, flavor='%my_flavor%', source_dirs=r'%my_source_dirs%', toolsdirs=r'%my_toolsdirs%')">>%my_archive_log% REM Check infrastructure is in place echo "(%date% %time%) Check infrastructure">>%my_archive_log% @@ -87,7 +87,11 @@ echo -------------------------------------- >>%my_archive_log% set path=%my_original_path% call %my_WINPYDIRBASE%\scripts\env.bat -rem Install pre-requirements if any +rem python -m ensurepip +rem insta essential packages +python -m pip install --upgrade pip setuptools wheel wppm -c %my_constraints% --pre --no-index --trusted-host=None --find-links=%my_find_links% >>%my_archive_log% + +rem Install complementary pre-requirements if any if not "Z%my_requirements_pre%Z"=="ZZ" ( if "%my_find_links_pre%"=="" set my_find_links_pre=%my_find_links% python -m pip install -r %my_requirements_pre% -c %my_constraints% --pre --no-index --trusted-host=None --find-links=%my_find_links_pre% >> %my_archive_log% @@ -100,7 +104,7 @@ echo -------------------------------------- >>%my_archive_log% echo "(%date% %time%) Add requirement packages">>%my_archive_log% echo -------------------------------------- >>%my_archive_log% python -m pip install -r %my_requirements% -c %my_constraints% --pre --no-index --trusted-host=None --find-links=%my_find_links% >>%my_archive_log% -python -c "from wppm import wppm;dist=wppm.Distribution(r'%WINPYDIR%');dist.patch_standard_packages('spyder', to_movable=True)" +python -c "from wppm import wppm;dist=wppm.Distribution(r'%WINPYDIR%');dist.patch_standard_packages('', to_movable=True)" REM Add Wheelhouse (to replace per pip lock direct ? would allow paralellism) echo -------------------------------------- >>%my_archive_log% diff --git a/make.py b/make.py index 445b8d1d..eb2ae678 100644 --- a/make.py +++ b/make.py @@ -14,8 +14,6 @@ # Define constant paths for clarity PORTABLE_DIRECTORY = Path(__file__).parent / "portable" - -# Ensure necessary directories exist at the start assert PORTABLE_DIRECTORY.is_dir(), f"Portable directory not found: {PORTABLE_DIRECTORY}" def copy_items(source_directories: list[Path], target_directory: Path, verbose: bool = False): @@ -46,7 +44,7 @@ class WinPythonDistributionBuilder: def __init__(self, build_number: int, release_level: str, target_directory: Path, wheels_directory: Path, tools_directories: list[Path] = None, verbose: bool = False, - install_options: list[str] = None, flavor: str = ""): + flavor: str = ""): """ Initializes the WinPythonDistributionBuilder. Args: @@ -56,7 +54,6 @@ def __init__(self, build_number: int, release_level: str, target_directory: Path wheels_directory: Directory containing wheel files for packages. tools_directories: List of directories containing development tools to include. verbose: Enable verbose output. - install_options: Additional pip install options. flavor: WinPython flavor (e.g., "Barebone"). """ self.build_number = build_number @@ -67,7 +64,6 @@ def __init__(self, build_number: int, release_level: str, target_directory: Path self.verbose = verbose self.winpython_directory: Path | None = None self.distribution: wppm.Distribution | None = None - self.install_options = install_options or [] self.flavor = flavor self.python_zip_file: Path = self._get_python_zip_file() self.python_name = self.python_zip_file.stem @@ -141,12 +137,10 @@ def _create_initial_batch_scripts(self): def build(self, winpy_dir: Path = None): """Make or finalise WinPython distribution in the target directory""" print(f"Building WinPython with Python archive: {self.python_zip_file.name}") - if winpy_dir is None: - raise RuntimeError("WinPython base directory to create is undefined") self.winpython_directory = winpy_dir self._print_action(f"Creating WinPython {self.winpython_directory} base directory") - if self.winpython_directory.is_dir(): + if self.winpython_directory.is_dir() and len(self.winpython_directory.parts)>=4: shutil.rmtree(self.winpython_directory) os.makedirs(self.winpython_directory, exist_ok=True) # preventive re-Creation of settings directory @@ -157,18 +151,10 @@ def build(self, winpy_dir: Path = None): self._copy_essential_files() self._create_initial_batch_scripts() - utils.python_execmodule("ensurepip", self.distribution.target) - self.distribution.patch_standard_packages("pip") - essential_packages = ["pip", "setuptools", "wheel", "wppm"] - for package_name in essential_packages: - actions = ["install", "--upgrade", "--pre", package_name] + self.install_options - self._print_action(f"Piping: {' '.join(actions)}") - self.distribution.do_pip_action(actions) - self.distribution.patch_standard_packages(package_name) def make_all(build_number: int, release_level: str, basedir_wpy: Path = None, - verbose: bool = False, install_options=["--no-index"], - flavor: str = "", find_links: str | list[Path] = None, + verbose: bool = False, + flavor: str = "", source_dirs: Path = None, toolsdirs: str | list[Path] = None, ): """ @@ -178,18 +164,13 @@ def make_all(build_number: int, release_level: str, basedir_wpy: Path = None, release_level: release level (e.g. 'beta1', '') [str] basedir_wpy: top directory of the build (c:\...\Wpy...) verbose: Enable verbose output (bool). - install_options: pip options (r'--no-index --pre --trusted-host=None') flavor: WinPython flavor (str). - find_links: package directories (r'D:\Winpython\packages.srcreq') - source_dirs: the python.zip + rebuilt winpython wheel package directory + source_dirs: the python.zip toolsdirs: Directory with development tools r'D:\WinPython\basedir34\t.Slim' """ assert basedir_wpy is not None, "The *winpython_dirname* directory must be specified" tools_dirs_list = parse_list_argument(toolsdirs, ",") - install_options_list = parse_list_argument(install_options, " ") - find_links_dirs_list = parse_list_argument(find_links, ",") - find_links_options = [f"--find-links={link}" for link in find_links_dirs_list + [source_dirs]] winpy_dir = Path(basedir_wpy) utils.print_box(f"Making WinPython at {winpy_dir}") @@ -198,7 +179,6 @@ def make_all(build_number: int, release_level: str, basedir_wpy: Path = None, build_number, release_level, winpy_dir.parent, wheels_directory=source_dirs, tools_directories=[Path(d) for d in tools_dirs_list], verbose=verbose, - install_options=install_options_list + find_links_options, flavor=flavor ) builder.build(winpy_dir=winpy_dir) @@ -212,8 +192,6 @@ def make_all(build_number: int, release_level: str, basedir_wpy: Path = None, basedir_wpy=r"D:\WinPython\bd314\budot\WPy64-31401b3", verbose=True, flavor="dot", - install_options=r"--no-index --pre --trusted-host=None", - find_links=r"D:\Winpython\packages.srcreq", source_dirs=r"D:\WinPython\bd314\packages.win-amd64", toolsdirs=r"D:\WinPython\bd314\t.Slim", ) From e1c0aa90d60319d8e9185391cbf19a459b7bd8ab Mon Sep 17 00:00:00 2001 From: stonebig Date: Sat, 12 Jul 2025 18:58:40 +0200 Subject: [PATCH 271/305] prepare for publishing b1 --- README.rst | 25 ++++++++++++++++--------- wppm/__init__.py | 2 +- 2 files changed, 17 insertions(+), 10 deletions(-) diff --git a/README.rst b/README.rst index de5208ae..45ea6512 100644 --- a/README.rst +++ b/README.rst @@ -1,9 +1,9 @@ WinPython tools =============== -Copyright @ 2012-2013 Pierre Raybaut +Copyright 2012-2013 Pierre Raybaut -Copyright @ 2014-2025+ The Winpython development team https://github.com/winpython/ +Copyright 2014-2025+ The Winpython development team: https://github.com/winpython/ Licensed under the terms of the MIT License (see wppm/__init__.py for details) @@ -13,7 +13,7 @@ Overview -------- WinPython is a portable distribution of the Python programming -language for Windows (https://winpython.github.io). +language for Windows: https://winpython.github.io This is the `wppm` Python package and build toolchain repository, not the distribution itself. It includes two main features: @@ -49,24 +49,31 @@ Wppm build From the source package (see section 'Building dependencies'), you may build WPPM using the following commands: -**python -m pip install flit** +.. code-block:: bash -**python -m flit build** + python -m pip install flit + python -m flit build Winpython Distribution wheels installation ------------------------------------------ To only install the wheels assembled per WinPython Distribution, you may -**python -m pip install --no-deps --require-hashes https://github.com/winpython/winpython/releases/download/16.6.20250620final/requir.64-3_13_5_0slim.txt + +.. code-block:: bash + + python -m pip install --no-deps --require-hashes https://github.com/winpython/winpython/releases/download/16.6.20250620final/requir.64-3_13_5_0slim.txt A pylock file is also available, when you package manager can handle it -**https://github.com/winpython/winpython/releases/download/16.6.20250620final/pylock.64-3_13_5_0slim.toml + +.. code-block:: text + + https://github.com/winpython/winpython/releases/download/16.6.20250620final/pylock.64-3_13_5_0slim.toml But the easiest way to install the last stable release of WinPython is by using a zipped distribution with or without auto-extractor: https://winpython.github.io/ -More informations ------------------ +More information +---------------- * Downloads: https://sourceforge.net/projects/winpython/files/ or https://github.com/winpython/winpython/releases diff --git a/wppm/__init__.py b/wppm/__init__.py index a454a334..186dabb5 100644 --- a/wppm/__init__.py +++ b/wppm/__init__.py @@ -28,6 +28,6 @@ OTHER DEALINGS IN THE SOFTWARE. """ -__version__ = '17.1.20250705a1' +__version__ = '17.1.20250712b1' __license__ = __doc__ __project_url__ = 'http://winpython.github.io/' From 23bbe3445de0f22e731dbc81ec808567c3bfb42a Mon Sep 17 00:00:00 2001 From: stonebig Date: Sun, 13 Jul 2025 08:12:35 +0200 Subject: [PATCH 272/305] remove unused code --- wppm/wheelhouse.py | 8 -------- 1 file changed, 8 deletions(-) diff --git a/wppm/wheelhouse.py b/wppm/wheelhouse.py index f500dc31..7ed9e54f 100644 --- a/wppm/wheelhouse.py +++ b/wppm/wheelhouse.py @@ -2,10 +2,6 @@ """ WheelHouse.py - manage WinPython local WheelHouse. """ -import os -import re -import tarfile -import zipfile import sys from pathlib import Path from collections import defaultdict @@ -13,9 +9,6 @@ import subprocess from typing import Dict, List, Optional, Tuple from . import packagemetadata as pm -from . import utils - -from packaging.utils import canonicalize_name, parse_wheel_filename, parse_sdist_filename # Use tomllib if available (Python 3.11+), otherwise fall back to tomli try: @@ -164,7 +157,6 @@ def get_pylock_wheels(wheelhouse: Path, lockfile: Path, wheelorigin: Optional[Pa destination_wheelhouse.mkdir(parents=True, exist_ok=True) # there can be an override - in_trusted = False if wheelorigin is None: From 97d11fd7dcb09f4af4ab8c32bc73bf332048261a Mon Sep 17 00:00:00 2001 From: stonebig Date: Sun, 13 Jul 2025 08:19:01 +0200 Subject: [PATCH 273/305] clarify env_config creation step, and reduce code complexity --- make.py | 74 ++++++++++++++++++++++----------------------------------- 1 file changed, 29 insertions(+), 45 deletions(-) diff --git a/make.py b/make.py index eb2ae678..9cd53815 100644 --- a/make.py +++ b/make.py @@ -12,7 +12,6 @@ from pathlib import Path from wppm import wppm, utils -# Define constant paths for clarity PORTABLE_DIRECTORY = Path(__file__).parent / "portable" assert PORTABLE_DIRECTORY.is_dir(), f"Portable directory not found: {PORTABLE_DIRECTORY}" @@ -35,8 +34,7 @@ def copy_items(source_directories: list[Path], target_directory: Path, verbose: def parse_list_argument(argument_value: str | list[str], separator=" ") -> list[str]: """Parse a separated list argument into a list of strings.""" - if not argument_value: - return [] + if not argument_value: return [] return argument_value.split(separator) if isinstance(argument_value, str) else list(argument_value) class WinPythonDistributionBuilder: @@ -72,7 +70,7 @@ def __init__(self, build_number: int, release_level: str, target_directory: Path def _get_python_zip_file(self) -> Path: """Finds the Python .zip file in the wheels directory.""" for source_item in self.wheels_directory.iterdir(): - if re.match(r"(pypy3|python-)([0-9]|[a-zA-Z]|.)*.zip", source_item.name): + if re.match(r"(pypy3|python-).*\.zip", source_item.name): return source_item raise RuntimeError(f"Could not find Python zip package in {self.wheels_directory}") @@ -86,25 +84,9 @@ def python_full_version(self) -> str: """Retrieves the Python full version string from the distribution.""" return utils.get_python_long_version(self.distribution.target) if self.distribution else "0.0.0" - @property - def python_executable_directory(self) -> str: - """Returns the directory containing the Python executable.""" - if self.winpython_directory: - python_path_directory = self.winpython_directory / self.python_directory_name - return str(python_path_directory) if python_path_directory.is_dir() else str(self.winpython_directory / self.python_name) - return "" - - @property - def architecture_bits(self) -> int: - """Returns the architecture (32 or 64 bits) of the distribution.""" - return self.distribution.architecture if self.distribution else 64 - def _print_action(self, text: str): """Prints an action message with progress indicator.""" - if self.verbose: - utils.print_box(text) - else: - print(f"{text}... ", end="", flush=True) + utils.print_box(text) if self.verbose else print(f"{text}...", end="", flush=True) def _extract_python_archive(self): """Extracts the Python zip archive to create the base Python environment.""" @@ -124,33 +106,38 @@ def _copy_essential_files(self): self._print_action(f"Copying tools to {tools_target_directory}") copy_items(self.tools_directories, tools_target_directory, self.verbose) - def _create_initial_batch_scripts(self): - """Creates initial batch scripts, including environment setup.""" - self._print_action("Creating initial batch scripts") - # Replacements for batch scripts (PyPy compatibility) - executable_name = self.distribution.short_exe if self.distribution else "python.exe" # default to python.exe if distribution is not yet set - init_variables = [('WINPYthon_exe', executable_name), ('WINPYthon_subdirectory_name', self.python_directory_name), ('WINPYVER', self.winpython_version_name)] - init_variables += [('WINPYVER2', f"{self.python_full_version}.{self.build_number}"), ('WINPYFLAVOR', self.flavor), ('WINPYARCH', self.architecture_bits)] - with open(self.winpython_directory / "scripts" / "env.ini", "w") as f: - f.writelines([f'{a}={b}\n' for a, b in init_variables]) + def _create_env_config(self): + """Creates environment setup""" + self._print_action("Creating env.ini environment setup") + executable_name = self.distribution.short_exe if self.distribution else "python.exe" + config = { + "WINPYthon_exe": executable_name, + "WINPYthon_subdirectory_name": self.python_directory_name, + "WINPYVER": self.winpython_version_name, + "WINPYVER2": f"{self.python_full_version}.{self.build_number}", + "WINPYFLAVOR": self.flavor, + "WINPYARCH": self.distribution.architecture if self.distribution else 64, + } + env_path = self.winpython_directory / "scripts" / "env.ini" + env_path.parent.mkdir(parents=True, exist_ok=True) + print("zzz env_path", env_path) + self._print_action(f"Creating env.ini environment {env_path}") + env_path.write_text("\n".join(f"{k}={v}" for k, v in config.items())) def build(self, winpy_dir: Path = None): """Make or finalise WinPython distribution in the target directory""" print(f"Building WinPython with Python archive: {self.python_zip_file.name}") - self.winpython_directory = winpy_dir - + self.winpython_directory = Path(winpy_dir) self._print_action(f"Creating WinPython {self.winpython_directory} base directory") if self.winpython_directory.is_dir() and len(self.winpython_directory.parts)>=4: shutil.rmtree(self.winpython_directory) - os.makedirs(self.winpython_directory, exist_ok=True) # preventive re-Creation of settings directory (self.winpython_directory / "settings" / "AppData" / "Roaming").mkdir(parents=True, exist_ok=True) - self._extract_python_archive() - - self.distribution = wppm.Distribution(self.python_executable_directory, verbose=self.verbose) + self._extract_python_archive() + self.distribution = wppm.Distribution(self.winpython_directory / self.python_directory_name, verbose=self.verbose) self._copy_essential_files() - self._create_initial_batch_scripts() + self._create_env_config() def make_all(build_number: int, release_level: str, basedir_wpy: Path = None, verbose: bool = False, @@ -170,22 +157,19 @@ def make_all(build_number: int, release_level: str, basedir_wpy: Path = None, """ assert basedir_wpy is not None, "The *winpython_dirname* directory must be specified" - tools_dirs_list = parse_list_argument(toolsdirs, ",") + tools_directories = [Path(d) for d in parse_list_argument(toolsdirs, ",")] winpy_dir = Path(basedir_wpy) - utils.print_box(f"Making WinPython at {winpy_dir}") os.makedirs(winpy_dir, exist_ok=True) + builder = WinPythonDistributionBuilder( build_number, release_level, winpy_dir.parent, wheels_directory=source_dirs, - tools_directories=[Path(d) for d in tools_dirs_list], - verbose=verbose, - flavor=flavor + tools_directories=tools_directories, + verbose=verbose, flavor=flavor ) - builder.build(winpy_dir=winpy_dir) - + builder.build(winpy_dir) if __name__ == "__main__": - # DO create only one Winpython distribution at a time make_all( build_number=1, release_level="b3", From d80b9bf3e132534e4f26ab6c09c2dfd3764edffc Mon Sep 17 00:00:00 2001 From: stonebig Date: Sun, 13 Jul 2025 16:56:02 +0200 Subject: [PATCH 274/305] make wppm -r .! work better, and declare Packaging dependancy --- make.py | 1 - pyproject.toml | 4 +++- wppm/__init__.py | 2 +- wppm/piptree.py | 4 ++-- 4 files changed, 6 insertions(+), 5 deletions(-) diff --git a/make.py b/make.py index 9cd53815..1bf22502 100644 --- a/make.py +++ b/make.py @@ -120,7 +120,6 @@ def _create_env_config(self): } env_path = self.winpython_directory / "scripts" / "env.ini" env_path.parent.mkdir(parents=True, exist_ok=True) - print("zzz env_path", env_path) self._print_action(f"Creating env.ini environment {env_path}") env_path.write_text("\n".join(f"{k}={v}" for k, v in config.items())) diff --git a/pyproject.toml b/pyproject.toml index 4460ae5a..cfae051f 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -8,7 +8,9 @@ authors = [ {name = "Pierre Raybaut"}, {name = "stonebig"}, ] -dependencies = [] +dependencies = [ + "packaging", +] requires-python = ">=3.10" readme = "README.rst" license = {file = "LICENSE"} diff --git a/wppm/__init__.py b/wppm/__init__.py index 186dabb5..3ed7567b 100644 --- a/wppm/__init__.py +++ b/wppm/__init__.py @@ -28,6 +28,6 @@ OTHER DEALINGS IN THE SOFTWARE. """ -__version__ = '17.1.20250712b1' +__version__ = '17.1.20250714b1' __license__ = __doc__ __project_url__ = 'http://winpython.github.io/' diff --git a/wppm/piptree.py b/wppm/piptree.py index 11700945..1dfd8560 100644 --- a/wppm/piptree.py +++ b/wppm/piptree.py @@ -198,7 +198,7 @@ def _get_dependency_tree(self, package_name: str, extra: str = "", version_req: Marker(dependency["req_marker"]).evaluate(environment=environment | {"extra": up_req})): # IA risk error: # dask[array] go upwards as dask[dataframe], so {"extra": up_req} , not {"extra": extra} #tag downward limiting dependancies - wall = " " if dependency["req_version"][:1] in("<", "~") or dependency["req_version"].startswith("==") else "" + wall = " " if dependency["req_version"][:1] = "~" or dependency["req_version"].startswith("==") or "<" in dependency["req_version"] else "" ret += self._get_dependency_tree( dependency["req_key"], up_req, @@ -249,7 +249,7 @@ def up(self, ppw: str, extra: str = "", depth: int = 20, indent: int = 5, versio pp = ppw[:-1] if ppw.endswith('!') else ppw ppend = "!" if ppw.endswith('!') else "" #show only downward limiting dependancies if pp == ".": - results = [aa:=self.up(p + ppend, extra, depth, indent, version_req, verbose) if '[requires :' in aa else None for p in sorted(self.distro)] + results = [aa for p in sorted(self.distro) if '[requires' in (aa:=self.up(p + ppend, extra, depth, indent, version_req, verbose))] return '\n'.join(filter(None, results)) if extra == ".": From 6341a9841c8ac9b19bda271c214a9f27f1ee7be9 Mon Sep 17 00:00:00 2001 From: stonebig Date: Sun, 13 Jul 2025 17:09:26 +0200 Subject: [PATCH 275/305] fixing the smallest bug requires to republish in the new workflow --- wppm/__init__.py | 2 +- wppm/piptree.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/wppm/__init__.py b/wppm/__init__.py index 3ed7567b..5bb4a702 100644 --- a/wppm/__init__.py +++ b/wppm/__init__.py @@ -28,6 +28,6 @@ OTHER DEALINGS IN THE SOFTWARE. """ -__version__ = '17.1.20250714b1' +__version__ = '17.1.20250715b1' __license__ = __doc__ __project_url__ = 'http://winpython.github.io/' diff --git a/wppm/piptree.py b/wppm/piptree.py index 1dfd8560..d6569b4d 100644 --- a/wppm/piptree.py +++ b/wppm/piptree.py @@ -198,7 +198,7 @@ def _get_dependency_tree(self, package_name: str, extra: str = "", version_req: Marker(dependency["req_marker"]).evaluate(environment=environment | {"extra": up_req})): # IA risk error: # dask[array] go upwards as dask[dataframe], so {"extra": up_req} , not {"extra": extra} #tag downward limiting dependancies - wall = " " if dependency["req_version"][:1] = "~" or dependency["req_version"].startswith("==") or "<" in dependency["req_version"] else "" + wall = " " if dependency["req_version"][:1] == "~" or dependency["req_version"].startswith("==") or "<" in dependency["req_version"] else "" ret += self._get_dependency_tree( dependency["req_key"], up_req, From 9d87ecef10361aedf90da629834d0092bc79eee8 Mon Sep 17 00:00:00 2001 From: stonebig Date: Mon, 14 Jul 2025 09:00:48 +0200 Subject: [PATCH 276/305] fix naming of the compressed WinPython --- generate_a_winpython_distro.bat | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/generate_a_winpython_distro.bat b/generate_a_winpython_distro.bat index cf498951..4d804b0f 100644 --- a/generate_a_winpython_distro.bat +++ b/generate_a_winpython_distro.bat @@ -1,8 +1,8 @@ rem generate_a_winpython_distro.bat: to be launched from a winpython directory, where 'make.py' is @echo on -REM Initialize variables -if "%my_release_level%"=="" set my_release_level= +REM Initialize variables -!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! +if "%my_release_level%"=="" set my_release_level=b1 if "%my_create_installer%"=="" set my_create_installer=True rem Set archive directory and log file @@ -221,7 +221,7 @@ set out=WinPython%my_flavor%-%my_arch%bit-%WINPYVER2%_History.md copy/y %my_basedir%\bu%my_flavor%\%out% %~dp0changelogs\%out% rem compress -set stem=WinPython%my_arch%-%WINPYVER2%%my_flavor% +set stem=WinPython%my_arch%-%WINPYVER2%%my_flavor%%my_release_level %target_python_exe% -c "from wppm import utils;utils.command_installer_7zip(r'%my_WINPYDIRBASE%', r'%my_WINPYDIRBASE%\..',r'%stem%', r'%my_create_installer%')" echo -------------------------------------- >>%my_archive_log% From 78e879a6e82f5b5c8eca7d7dcce50c921ea1644a Mon Sep 17 00:00:00 2001 From: stonebig Date: Mon, 14 Jul 2025 09:28:11 +0200 Subject: [PATCH 277/305] a miss --- generate_a_winpython_distro.bat | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/generate_a_winpython_distro.bat b/generate_a_winpython_distro.bat index 4d804b0f..e0f2dbc4 100644 --- a/generate_a_winpython_distro.bat +++ b/generate_a_winpython_distro.bat @@ -221,7 +221,7 @@ set out=WinPython%my_flavor%-%my_arch%bit-%WINPYVER2%_History.md copy/y %my_basedir%\bu%my_flavor%\%out% %~dp0changelogs\%out% rem compress -set stem=WinPython%my_arch%-%WINPYVER2%%my_flavor%%my_release_level +set stem=WinPython%my_arch%-%WINPYVER2%%my_flavor%%my_release_level% %target_python_exe% -c "from wppm import utils;utils.command_installer_7zip(r'%my_WINPYDIRBASE%', r'%my_WINPYDIRBASE%\..',r'%stem%', r'%my_create_installer%')" echo -------------------------------------- >>%my_archive_log% From f16a1ea2862bae9ca0d847275ac7cfa496eb53bc Mon Sep 17 00:00:00 2001 From: stonebig Date: Mon, 14 Jul 2025 15:00:42 +0200 Subject: [PATCH 278/305] DOS build clean-up with openai, step 1 --- generate_a_winpython_distro.bat | 57 ++++++++++++++++++++------------- 1 file changed, 35 insertions(+), 22 deletions(-) diff --git a/generate_a_winpython_distro.bat b/generate_a_winpython_distro.bat index e0f2dbc4..e7f54eb7 100644 --- a/generate_a_winpython_distro.bat +++ b/generate_a_winpython_distro.bat @@ -1,36 +1,49 @@ rem generate_a_winpython_distro.bat: to be launched from a winpython directory, where 'make.py' is @echo on -REM Initialize variables -!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! -if "%my_release_level%"=="" set my_release_level=b1 -if "%my_create_installer%"=="" set my_create_installer=True - -rem Set archive directory and log file -set my_archive_dir=%~dp0WinPython_build_logs -if not exist %my_archive_dir% mkdir %my_archive_dir% +REM === Set default values if not already defined === +if not defined my_release_level set "my_release_level=b1" +if not defined my_create_installer set "my_create_installer=True" +if not defined my_constraints set "my_constraints=C:\WinP\constraints.txt" +if not defined target_python_exe set "target_python_exe=python.exe" + +REM === Define archive directory === +set "my_archive_dir=%~dp0WinPython_build_logs" +if not exist "%my_archive_dir%" mkdir "%my_archive_dir%" + +REM === Format current time for use in log file === +set "my_time=%time:~0,5%" +set "my_time=%my_time::=_%" +set "my_time=%my_time: =0%" + +REM === Define archive log file path === +set "my_archive_log=%my_archive_dir%\build_%my_pyver%_%my_release%%my_flavor%_%my_release_level%_of_%date:/=-%at_%my_time%.txt" + +REM === Set Python version and release === +if "%my_python_target%"=="311" ( + set "my_python_target_release=3119" + set "my_release=2" +) else if "%my_python_target%"=="312" ( + set "my_python_target_release=31210" + set "my_release=2" +) else if "%my_python_target%"=="313" ( + set "my_python_target_release=3135" + set "my_release=1" +) else if "%my_python_target%"=="314" ( + set "my_python_target_release=3140" + set "my_release=1" +) -set my_time=%time:~0,5% -set my_time=%my_time::=_% -set my_time=%my_time: =0% -set my_archive_log=%my_archive_dir%\build_%my_pyver%._.%my_release%%my_flavor%_%my_release_level%_of_%date:/=-%at_%my_time%.txt +REM === Define base build and distribution paths === +set "my_basedir=%my_root_dir_for_builds%\bd%my_python_target%" +set "my_WINPYDIRBASE=%my_basedir%\bu%my_flavor%\WPy%my_arch%-%my_python_target_release%%my_release%%my_release_level%" -set my_basedir=%my_root_dir_for_builds%\bd%my_python_target% rem a building env need is a Python with packages: WinPython + build + flit + packaging + mkshim400.py set my_buildenv=C:\WinPdev\WPy64-310111 -if "%my_constraints%"=="" set my_constraints=C:\WinP\constraints.txt - -rem 2021-04-22 : path PyPy3 (as we don't try to copy PyPy3.exe to Python.exe) -if "%target_python_exe%"=="" set target_python_exe=python.exe -rem Set Python target release based on my_python_target -if %my_python_target%==311 set my_python_target_release=3119& set my_release=2 -if %my_python_target%==312 set my_python_target_release=31210& set my_release=2 -if %my_python_target%==313 set my_python_target_release=3135& set my_release=1 -if %my_python_target%==314 set my_python_target_release=3140& set my_release=1 -set my_WINPYDIRBASE=%my_basedir%\bu%my_flavor%\WPy%my_arch%-%my_python_target_release%%my_release%%my_release_level% echo -------------------------------------- >>%my_archive_log% echo (%date% %time%) preparing winPython for %my_pyver% (%my_python_target%)release %my_release%%my_flavor% (%my_release_level%) *** %my_arch% bit ***>>%my_archive_log% From f7616de18cd80ad2471ce999b7241e55d757ec2f Mon Sep 17 00:00:00 2001 From: stonebig Date: Mon, 14 Jul 2025 15:17:11 +0200 Subject: [PATCH 279/305] DOS clean-up with openai: Centralize and simplify log writing --- generate_a_winpython_distro.bat | 61 ++++++++++++++------------------- 1 file changed, 26 insertions(+), 35 deletions(-) diff --git a/generate_a_winpython_distro.bat b/generate_a_winpython_distro.bat index e7f54eb7..7d8ffe4d 100644 --- a/generate_a_winpython_distro.bat +++ b/generate_a_winpython_distro.bat @@ -42,12 +42,7 @@ set "my_WINPYDIRBASE=%my_basedir%\bu%my_flavor%\WPy%my_arch%-%my_python_target_r rem a building env need is a Python with packages: WinPython + build + flit + packaging + mkshim400.py set my_buildenv=C:\WinPdev\WPy64-310111 - - - -echo -------------------------------------- >>%my_archive_log% -echo (%date% %time%) preparing winPython for %my_pyver% (%my_python_target%)release %my_release%%my_flavor% (%my_release_level%) *** %my_arch% bit ***>>%my_archive_log% -echo -------------------------------------- >>%my_archive_log% +call :log_section preparing winPython for %my_pyver% (%my_python_target%)release %my_release%%my_flavor% (%my_release_level%) *** %my_arch% bit *** rem Pre-clear previous build infrastructure if "%my_preclear_build_directory%"=="Yes" ( @@ -63,20 +58,18 @@ if "%my_preclear_build_directory%"=="Yes" ( rmdir /S /Q dist ) -REM Create a new build -echo -------------------------------------- >>%my_archive_log% -echo "(%date% %time%) Create a new build">>%my_archive_log% -echo -------------------------------------- >>%my_archive_log% +call :log_section Create a new build + cd /D %~dp0 set path=%my_original_path% call %my_buildenv%\scripts\env.bat @echo on -REM Create basic build infrastructure +call :log_section Create basic build infrastructure echo "(%date% %time%) Create basic build infrastructure">>%my_archive_log% python.exe -c "from make import *;make_all(%my_release%, '%my_release_level%', basedir_wpy=r'%my_WINPYDIRBASE%', verbose=True, flavor='%my_flavor%', source_dirs=r'%my_source_dirs%', toolsdirs=r'%my_toolsdirs%')">>%my_archive_log% -REM Check infrastructure is in place +call :log_section Check infrastructure is in place echo "(%date% %time%) Check infrastructure">>%my_archive_log% set WINPYDIRBASE=%my_WINPYDIRBASE% @@ -92,10 +85,7 @@ if not exist %my_WINPYDIRBASE%\scripts\env.bat ( exit ) -REM Add pre-requisite packages -echo -------------------------------------- >>%my_archive_log% -echo "(%date% %time%) Add pre-requisite packages">>%my_archive_log% -echo -------------------------------------- >>%my_archive_log% +call :log_section Add pre-requisite packages set path=%my_original_path% call %my_WINPYDIRBASE%\scripts\env.bat @@ -112,17 +102,13 @@ if not "Z%my_requirements_pre%Z"=="ZZ" ( echo "No pre-requisite packages">>%my_archive_log% ) -REM Add requirement packages -echo -------------------------------------- >>%my_archive_log% -echo "(%date% %time%) Add requirement packages">>%my_archive_log% -echo -------------------------------------- >>%my_archive_log% +call :log_section Add requirement packages + python -m pip install -r %my_requirements% -c %my_constraints% --pre --no-index --trusted-host=None --find-links=%my_find_links% >>%my_archive_log% python -c "from wppm import wppm;dist=wppm.Distribution(r'%WINPYDIR%');dist.patch_standard_packages('', to_movable=True)" -REM Add Wheelhouse (to replace per pip lock direct ? would allow paralellism) -echo -------------------------------------- >>%my_archive_log% -echo "(%date% %time%) Add lockfile wheels">>%my_archive_log% -echo -------------------------------------- >>%my_archive_log% +call :log_section Add lockfile wheels + set path=%my_original_path% @echo on call %my_WINPYDIRBASE%\scripts\env.bat @@ -164,9 +150,7 @@ echo %my_WINPYDIRBASE%\python\scripts\wppm.exe "%pip_lock_includedweb%" -ws "%m %my_WINPYDIRBASE%\python\scripts\wppm.exe "%pip_lock_includedweb%" -ws "%my_find_links%" -wd "%my_WINPYDIRBASE%\wheelhouse\included.wheels" ) -echo -------------------------------------- >>%my_archive_log%; -echo "(%date% %time%) generate pylock.toml files and requirement.txt with hash files">>%my_archive_log% -echo -------------------------------------- >>%my_archive_log% +call :log_section generate pylock.toml files and requirement.txt with hash files set path=%my_original_path% call %my_WINPYDIRBASE%\scripts\env.bat @@ -212,10 +196,8 @@ copy/Y %pip_lock_web% %my_changelog_lockfile% copy/Y %req_lock_web% %my_changelog_reqfile% -REM Archive success -echo -------------------------------------- >>%my_archive_log% -echo "(%date% %time%) Archive success">>%my_archive_log% -echo -------------------------------------- >>%my_archive_log% +call :log_section Archive success + set path=%my_original_path% call %my_WINPYDIRBASE%\scripts\env.bat @@ -237,10 +219,19 @@ rem compress set stem=WinPython%my_arch%-%WINPYVER2%%my_flavor%%my_release_level% %target_python_exe% -c "from wppm import utils;utils.command_installer_7zip(r'%my_WINPYDIRBASE%', r'%my_WINPYDIRBASE%\..',r'%stem%', r'%my_create_installer%')" -echo -------------------------------------- >>%my_archive_log% -echo "(%date% %time%) END OF CREATION">>%my_archive_log% -echo -------------------------------------- >>%my_archive_log% +call :log_section END OF CREATION + start notepad.exe %my_archive_log% start notepad.exe %my_archive_log%.packages_versions.txt -set path=%my_original_path% \ No newline at end of file +set path=%my_original_path% +pause +exit + +:log_section +echo. >>%my_archive_log% +echo -------------------------------------- >>%my_archive_log% +echo (%date% %time%) %* >>%my_archive_log% +echo -------------------------------------- >>%my_archive_log% +echo. >>%my_archive_log% +exit /b From a343d632eaae769313e726d665cd08ae785eef33 Mon Sep 17 00:00:00 2001 From: stonebig Date: Mon, 14 Jul 2025 15:37:04 +0200 Subject: [PATCH 280/305] DOS clean-up with openai: Clean up Pre-clear Build Infrastructure --- generate_a_winpython_distro.bat | 31 +++++++++++++++++++------------ 1 file changed, 19 insertions(+), 12 deletions(-) diff --git a/generate_a_winpython_distro.bat b/generate_a_winpython_distro.bat index 7d8ffe4d..cf2e02e7 100644 --- a/generate_a_winpython_distro.bat +++ b/generate_a_winpython_distro.bat @@ -44,20 +44,27 @@ set my_buildenv=C:\WinPdev\WPy64-310111 call :log_section preparing winPython for %my_pyver% (%my_python_target%)release %my_release%%my_flavor% (%my_release_level%) *** %my_arch% bit *** -rem Pre-clear previous build infrastructure -if "%my_preclear_build_directory%"=="Yes" ( - echo "(%date% %time%) Pre-clear previous build infrastructure">>%my_archive_log% - del -y %userprofile%\.jupyter\jupyter_notebook_config.py - cd /D %my_root_dir_for_builds%\bd%my_python_target% - set build_det=\%my_flavor% - if "%my_flavor%"=="" set build_det= - dir %build_det% - ren bu%my_flavor% bu%my_flavor%_old - start rmdir /S /Q bu%my_flavor%_old - rmdir /S /Q bu%my_flavor% - rmdir /S /Q dist +REM === Step: Pre-clear previous build infrastructure === + +if /i "%my_preclear_build_directory%"=="Yes" ( + call :log_section Pre-clear previous build infrastructure + + REM Delete Jupyter config if it exists + if exist "%userprofile%\.jupyter\jupyter_notebook_config.py" ( + del /f /q "%userprofile%\.jupyter\jupyter_notebook_config.py" + ) + + REM Navigate to build directory + cd /D "%my_root_dir_for_builds%\bd%my_python_target%" + + REM Rename previous build folder if it exists + if exist "bu%my_flavor%" ( + ren "bu%my_flavor%" "bu%my_flavor%_old" + rmdir /s /q "bu%my_flavor%_old" + ) ) + call :log_section Create a new build cd /D %~dp0 From 515af524ab1c6606438f8078ee2cb0fb14b4975b Mon Sep 17 00:00:00 2001 From: stonebig Date: Mon, 14 Jul 2025 15:53:22 +0200 Subject: [PATCH 281/305] DOS clean-up with openai: Build Creation & Environment Activation Cleanup --- generate_a_winpython_distro.bat | 46 ++++++++++++++++----------------- 1 file changed, 23 insertions(+), 23 deletions(-) diff --git a/generate_a_winpython_distro.bat b/generate_a_winpython_distro.bat index cf2e02e7..51318ffa 100644 --- a/generate_a_winpython_distro.bat +++ b/generate_a_winpython_distro.bat @@ -45,7 +45,6 @@ set my_buildenv=C:\WinPdev\WPy64-310111 call :log_section preparing winPython for %my_pyver% (%my_python_target%)release %my_release%%my_flavor% (%my_release_level%) *** %my_arch% bit *** REM === Step: Pre-clear previous build infrastructure === - if /i "%my_preclear_build_directory%"=="Yes" ( call :log_section Pre-clear previous build infrastructure @@ -64,32 +63,33 @@ if /i "%my_preclear_build_directory%"=="Yes" ( ) ) - +REM === Step: Create new build === call :log_section Create a new build -cd /D %~dp0 -set path=%my_original_path% -call %my_buildenv%\scripts\env.bat -@echo on +REM Activate base build environment +cd /D "%~dp0" +set "path=%my_original_path%" +call "%my_buildenv%\scripts\env.bat" +REM Call make_all to create basic infrastructure call :log_section Create basic build infrastructure -echo "(%date% %time%) Create basic build infrastructure">>%my_archive_log% -python.exe -c "from make import *;make_all(%my_release%, '%my_release_level%', basedir_wpy=r'%my_WINPYDIRBASE%', verbose=True, flavor='%my_flavor%', source_dirs=r'%my_source_dirs%', toolsdirs=r'%my_toolsdirs%')">>%my_archive_log% - -call :log_section Check infrastructure is in place -echo "(%date% %time%) Check infrastructure">>%my_archive_log% -set WINPYDIRBASE=%my_WINPYDIRBASE% - -if not exist %my_WINPYDIRBASE%\scripts\env.bat ( - @echo off - echo as %my_WINPYDIRBASE%\scripts\env.bat does not exist - echo please check and correct: - echo my_arch=%my_arch% - echo my_python_target_release=%my_python_target_release% - echo my_release=%my_release% - echo my_release_level=%my_release_level% - pause - exit +python.exe -c "from make import make_all; make_all(%my_release%, '%my_release_level%', basedir_wpy=r'%my_WINPYDIRBASE%', verbose=True, flavor='%my_flavor%', source_dirs=r'%my_source_dirs%', toolsdirs=r'%my_toolsdirs%')" >>"%my_archive_log%" + + +REM === Check infrastructure exists === +call :log_section Check infrastructure + +set "WINPYDIRBASE=%my_WINPYDIRBASE%" + +if not exist "%WINPYDIRBASE%\scripts\env.bat" ( + echo ERROR: %WINPYDIRBASE%\scripts\env.bat does not exist + echo Please verify: + echo my_arch=%my_arch% + echo my_python_target_release=%my_python_target_release% + echo my_release=%my_release% + echo my_release_level=%my_release_level% + pause + exit /b 1 ) call :log_section Add pre-requisite packages From a6d6cfdc9ab8a8ab229c4b8f846f0fb4ff27c5b4 Mon Sep 17 00:00:00 2001 From: stonebig Date: Mon, 14 Jul 2025 16:08:19 +0200 Subject: [PATCH 282/305] DOS clean-up with openai: Adding Pre-requisite Packages --- generate_a_winpython_distro.bat | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/generate_a_winpython_distro.bat b/generate_a_winpython_distro.bat index 51318ffa..b9d9c1e8 100644 --- a/generate_a_winpython_distro.bat +++ b/generate_a_winpython_distro.bat @@ -92,21 +92,22 @@ if not exist "%WINPYDIRBASE%\scripts\env.bat" ( exit /b 1 ) +REM === Step: Add pre-requisite packages === call :log_section Add pre-requisite packages -set path=%my_original_path% -call %my_WINPYDIRBASE%\scripts\env.bat +set "path=%my_original_path%" +call "%my_WINPYDIRBASE%\scripts\env.bat" rem python -m ensurepip -rem insta essential packages -python -m pip install --upgrade pip setuptools wheel wppm -c %my_constraints% --pre --no-index --trusted-host=None --find-links=%my_find_links% >>%my_archive_log% +REM Upgrade essential pip tools +python -m pip install --upgrade pip setuptools wheel wppm -c "%my_constraints%" --pre --no-index --trusted-host=None --find-links="%my_find_links%" >>"%my_archive_log%" -rem Install complementary pre-requirements if any -if not "Z%my_requirements_pre%Z"=="ZZ" ( - if "%my_find_links_pre%"=="" set my_find_links_pre=%my_find_links% - python -m pip install -r %my_requirements_pre% -c %my_constraints% --pre --no-index --trusted-host=None --find-links=%my_find_links_pre% >> %my_archive_log% +REM Install additional pre-requirements if specified +if defined my_requirements_pre ( + if not defined my_find_links_pre set "my_find_links_pre=%my_find_links%" + python -m pip install -r "%my_requirements_pre%" -c "%my_constraints%" --pre --no-index --trusted-host=None --find-links="%my_find_links_pre%" >>"%my_archive_log%" ) else ( - echo "No pre-requisite packages">>%my_archive_log% + echo No pre-requisite packages specified >>"%my_archive_log%" ) call :log_section Add requirement packages From 02d649e6a6bd6d299fc2a99a23531c81bd0761d8 Mon Sep 17 00:00:00 2001 From: stonebig Date: Mon, 14 Jul 2025 17:12:39 +0200 Subject: [PATCH 283/305] DOS clean-up with openai: Add Lockfile Wheels --- generate_a_winpython_distro.bat | 58 +++++++++++++++++---------------- 1 file changed, 30 insertions(+), 28 deletions(-) diff --git a/generate_a_winpython_distro.bat b/generate_a_winpython_distro.bat index b9d9c1e8..200823af 100644 --- a/generate_a_winpython_distro.bat +++ b/generate_a_winpython_distro.bat @@ -110,12 +110,39 @@ if defined my_requirements_pre ( echo No pre-requisite packages specified >>"%my_archive_log%" ) -call :log_section Add requirement packages +REM === Step: Install main requirement packages === +call :log_section Add main requirement packages +python -m pip install -r "%my_requirements%" -c "%my_constraints%" --pre --no-index --trusted-host=None --find-links="%my_find_links%" >>"%my_archive_log%" -python -m pip install -r %my_requirements% -c %my_constraints% --pre --no-index --trusted-host=None --find-links=%my_find_links% >>%my_archive_log% +REM Patch installed packages to be portable (WinPython style) python -c "from wppm import wppm;dist=wppm.Distribution(r'%WINPYDIR%');dist.patch_standard_packages('', to_movable=True)" -call :log_section Add lockfile wheels +REM === Define lockfile paths for included wheels === +set "WINPYVERLOCK=%WINPYVER2:.=_%" +set "LOCKDIR=%WINPYDIRBASE%\..\" + +set "pip_lock_includedlocal=%LOCKDIR%pylock.%WINPYARCH%-%WINPYVERLOCK%%my_flavor%%my_release_level%_wheelslocal.toml" +set "pip_lock_includedweb=%LOCKDIR%pylock.%WINPYARCH%-%WINPYVERLOCK%%my_flavor%%my_release_level%_wheels.toml" +set "req_lock_includedlocal=%LOCKDIR%requir.%WINPYARCH%-%WINPYVERLOCK%%my_flavor%%my_release_level%_wheelslocal.txt" +set "req_lock_includedweb=%LOCKDIR%requir.%WINPYARCH%-%WINPYVERLOCK%%my_flavor%%my_release_level%_wheels.txt" + +@echo on +REM === Step: Add lockfile wheels for the Wheelhouse (optional) === +if defined wheelhousereq if exist "%wheelhousereq%" ( + call :log_section Add wheels for the Wheelhouse + + REM Generate pylock from wheelhousereq + python -m pip lock --no-index --trusted-host=None --find-links="%my_find_links%" -c "%my_constraints%" -r "%wheelhousereq%" -o "%pip_lock_includedlocal%" + + REM Convert pylock to requirement file with hashes + python -c "from wppm import wheelhouse as wh; wh.pylock_to_req(r'%pip_lock_includedlocal%', r'%req_lock_includedlocal%')" + + REM Freeze lock again from local hashes + python -m pip lock --no-deps --require-hashes -c "%my_constraints%" -r "%req_lock_includedlocal%" -o "%pip_lock_includedweb%" + + REM Use wppm to install from lock + "%my_WINPYDIRBASE%\python\scripts\wppm.exe" "%pip_lock_includedweb%" -ws "%my_find_links%" -wd "%my_WINPYDIRBASE%\wheelhouse\included.wheels" +) set path=%my_original_path% @echo on @@ -130,33 +157,8 @@ echo %my_WINPYDIRBASE%\python\scripts\wppm.exe "%pylockinclude%" -ws "%my_find_ ) @echo on -echo wheelhousereq=%wheelhousereq% -set LOCKDIR=%WINPYDIRBASE%\..\ -set pip_lock_includedlocal=%LOCKDIR%pylock.%my_flavor%-%WINPYARCH%bit-%WINPYVERLOCK%_includedwheelslocal.toml -set pip_lock_includedweb=%LOCKDIR%pylock.%my_flavor%-%WINPYARCH%bit-%WINPYVERLOCK%_includedwheels.toml -set req_lock_includedlocal=%LOCKDIR%requirement.%my_flavor%-%WINPYARCH%bit-%WINPYVERLOCK%_includedwheelslocal.txt -set req_lock_includedweb=%LOCKDIR%requirement.%my_flavor%-%WINPYARCH%bit-%WINPYVERLOCK%_includedwheels.txt - -set pip_lock_includedlocal=%LOCKDIR%pylock.%WINPYARCH%-%WINPYVERLOCK%%my_flavor%%my_release_level%_wheelslocal.toml -set pip_lock_includedweb=%LOCKDIR%pylock.%WINPYARCH%-%WINPYVERLOCK%%my_flavor%%my_release_level%_wheels.toml -set req_lock_includedlocal=%LOCKDIR%requir.%WINPYARCH%-%WINPYVERLOCK%%my_flavor%%my_release_level%_wheelslocal.txt -set req_lock_includedweb=%LOCKDIR%requir.%WINPYARCH%-%WINPYVERLOCK%%my_flavor%%my_release_level%_wheels.txt - - -if not "Z%wheelhousereq%Z"=="ZZ" if exist "%wheelhousereq%" ( -echo JOYYYwheelhousereq=%wheelhousereq% -echo z%pip_lock_includedlocal%z=%pip_lock_includedlocal% -rem no winpython in it naturally, with deps -python.exe -m pip lock --no-index --trusted-host=None --find-links=%my_find_links% -c C:\WinP\constraints.txt -r "%wheelhousereq%" -o %pip_lock_includedlocal% -rem generating also classic requirement with hash-256, from obtained pylock.toml -python.exe -c "from wppm import wheelhouse as wh;wh.pylock_to_req(r'%pip_lock_includedlocal%', r'%req_lock_includedlocal%')" -rem same with frozen web from local -python.exe -m pip lock --no-deps --require-hashes -c C:\WinP\constraints.txt -r "%req_lock_includedlocal%" -o %pip_lock_includedweb% -echo %my_WINPYDIRBASE%\python\scripts\wppm.exe "%pip_lock_includedweb%" -ws "%my_find_links%" -wd "%my_WINPYDIRBASE%\wheelhouse\included.wheels">>%my_archive_log% -%my_WINPYDIRBASE%\python\scripts\wppm.exe "%pip_lock_includedweb%" -ws "%my_find_links%" -wd "%my_WINPYDIRBASE%\wheelhouse\included.wheels" -) call :log_section generate pylock.toml files and requirement.txt with hash files From 414854292274fc270f98229a9662bb6336b3e49c Mon Sep 17 00:00:00 2001 From: stonebig Date: Mon, 14 Jul 2025 20:40:34 +0200 Subject: [PATCH 284/305] DOS clean-up with openai: Freeze the Full Environment & Create Final Lockfiles --- generate_a_winpython_distro.bat | 83 +++++++++++++-------------------- 1 file changed, 32 insertions(+), 51 deletions(-) diff --git a/generate_a_winpython_distro.bat b/generate_a_winpython_distro.bat index 200823af..66e9cf6a 100644 --- a/generate_a_winpython_distro.bat +++ b/generate_a_winpython_distro.bat @@ -126,7 +126,6 @@ set "pip_lock_includedweb=%LOCKDIR%pylock.%WINPYARCH%-%WINPYVERLOCK%%my_flavor%% set "req_lock_includedlocal=%LOCKDIR%requir.%WINPYARCH%-%WINPYVERLOCK%%my_flavor%%my_release_level%_wheelslocal.txt" set "req_lock_includedweb=%LOCKDIR%requir.%WINPYARCH%-%WINPYVERLOCK%%my_flavor%%my_release_level%_wheels.txt" -@echo on REM === Step: Add lockfile wheels for the Wheelhouse (optional) === if defined wheelhousereq if exist "%wheelhousereq%" ( call :log_section Add wheels for the Wheelhouse @@ -144,66 +143,48 @@ if defined wheelhousereq if exist "%wheelhousereq%" ( "%my_WINPYDIRBASE%\python\scripts\wppm.exe" "%pip_lock_includedweb%" -ws "%my_find_links%" -wd "%my_WINPYDIRBASE%\wheelhouse\included.wheels" ) -set path=%my_original_path% -@echo on -call %my_WINPYDIRBASE%\scripts\env.bat -@echo on -set WINPYVERLOCK=%WINPYVER2:.=_% -set pylockinclude=%my_root_dir_for_builds%\bd%my_python_target%\bu%addlockfile%\pylock.%addlockfile%-%WINPYARCH%bit-%WINPYVERLOCK%.toml -echo pylockinclude="%pylockinclude%" -if not "Z%addlockfile%Z"=="ZZ" if exist "%pylockinclude%" ( -echo %my_WINPYDIRBASE%\python\scripts\wppm.exe "%pylockinclude%" -ws "%my_find_links%" -wd "%my_WINPYDIRBASE%\wheelhouse\included.wheels">>%my_archive_log% -%my_WINPYDIRBASE%\python\scripts\wppm.exe "%pylockinclude%" -ws "%my_find_links%" -wd "%my_WINPYDIRBASE%\wheelhouse\included.wheels" -) - -@echo on - - - -call :log_section generate pylock.toml files and requirement.txt with hash files - -set path=%my_original_path% -call %my_WINPYDIRBASE%\scripts\env.bat - -rem generate pip freeze requirements -echo %date% %time% -set LOCKDIR=%WINPYDIRBASE%\..\ - -set WINPYVERLOCK=%WINPYVER2:.=_% -set req=%LOCKDIR%requirement.%my_flavor%-%WINPYARCH%bit-%WINPYVERLOCK%_raw.txt -set wanted_req=%LOCKDIR%requirement.%my_flavor%-%WINPYARCH%bit-%WINPYVERLOCK%.txt +rem set path=%my_original_path% +rem call %my_WINPYDIRBASE%\scripts\env.bat -set pip_lock_web=%LOCKDIR%pylock.%WINPYARCH%-%WINPYVERLOCK%%my_flavor%%my_release_level%.toml -set pip_lock_local=%LOCKDIR%pylock.%WINPYARCH%-%WINPYVERLOCK%%my_flavor%%my_release_level%_local.toml -set req_lock_web=%LOCKDIR%requir.%WINPYARCH%-%WINPYVERLOCK%%my_flavor%%my_release_level%.txt -set req_lock_local=%LOCKDIR%requir.%WINPYARCH%-%WINPYVERLOCK%%my_flavor%%my_release_level%_local.txt +REM === Freeze environment and generate final lockfiles === +call :log_section Freeze environment and generate lockfiles -set my_archive_lockfile=%my_archive_dir%\pylock.%my_flavor%-%WINPYARCH%bit-%WINPYVERLOCK%_%date:/=-%at_%my_time%.toml -set my_archive_lockfile_local=%my_archive_dir%\pylock.%my_flavor%-%WINPYARCH%bit-%WINPYVERLOCK%_%date:/=-%at_%my_time%.local.toml -set my_changelog_lockfile=%~dp0changelogs\pylock.%WINPYARCH%-%WINPYVERLOCK%%my_flavor%%my_release_level%.toml -set my_changelog_reqfile=%~dp0changelogs\requir.%WINPYARCH%-%WINPYVERLOCK%%my_flavor%%my_release_level%.txt +set "req=%LOCKDIR%requirement.%my_flavor%-%WINPYARCH%bit-%WINPYVERLOCK%_raw.txt" +set "wanted_req=%LOCKDIR%requirement.%my_flavor%-%WINPYARCH%bit-%WINPYVERLOCK%.txt" -python.exe -m pip freeze>%req% -findstr /v "winpython" %req% > %wanted_req% +set "pip_lock_web=%LOCKDIR%pylock.%WINPYARCH%-%WINPYVERLOCK%%my_flavor%%my_release_level%.toml" +set "pip_lock_local=%LOCKDIR%pylock.%WINPYARCH%-%WINPYVERLOCK%%my_flavor%%my_release_level%_local.toml" +set "req_lock_web=%LOCKDIR%requir.%WINPYARCH%-%WINPYVERLOCK%%my_flavor%%my_release_level%.txt" +set "req_lock_local=%LOCKDIR%requir.%WINPYARCH%-%WINPYVERLOCK%%my_flavor%%my_release_level%_local.txt" + +REM Archive paths +set "my_archive_lockfile=%my_archive_dir%\pylock.%my_flavor%-%WINPYARCH%bit-%WINPYVERLOCK%_%date:/=-%at_%my_time%.toml" +set "my_changelog_lockfile=%~dp0changelogs\pylock.%WINPYARCH%-%WINPYVERLOCK%%my_flavor%%my_release_level%.toml" +set "my_changelog_reqfile=%~dp0changelogs\requir.%WINPYARCH%-%WINPYVERLOCK%%my_flavor%%my_release_level%.txt" +REM Freeze full environment (excluding winpython) +python -m pip freeze > "%req%" +findstr /v "winpython" "%req%" > "%wanted_req%" -rem pip lock from pypi, from the frozen req -python.exe -m pip lock --no-deps -c C:\WinP\constraints.txt -r "%wanted_req%" -o %pip_lock_web% +REM Lock from PyPI +python -m pip lock --no-deps -c "%my_constraints%" -r "%wanted_req%" -o "%pip_lock_web%" -rem pip lock from local WheelHouse, from the frozen req -python.exe -m pip lock --no-deps --no-index --trusted-host=None --find-links=C:\WinP\packages.srcreq -c C:\WinP\constraints.txt -r "%wanted_req%" -o %pip_lock_local% +REM Lock from local wheelhouse +python -m pip lock --no-deps --no-index --trusted-host=None --find-links="%my_find_links%" -c "%my_constraints%" -r "%wanted_req%" -o "%pip_lock_local%" -rem generating also classic requirement with hash-256, from obtained pylock.toml -python.exe -c "from wppm import wheelhouse as wh;wh.pylock_to_req(r'%pip_lock_web%', r'%req_lock_web%')" -python.exe -c "from wppm import wheelhouse as wh;wh.pylock_to_req(r'%pip_lock_local%', r'%req_lock_local%')" +REM Convert both locks to requirement.txt with hash256 +python -c "from wppm import wheelhouse as wh; wh.pylock_to_req(r'%pip_lock_web%', r'%req_lock_web%')" +python -c "from wppm import wheelhouse as wh; wh.pylock_to_req(r'%pip_lock_local%', r'%req_lock_local%')" -rem compare the two (result from pypi and local Wheelhouse must be equal) -fc "%req_lock_web%" "%req_lock_local%" +REM Compare for reproducibility check +fc "%req_lock_web%" "%req_lock_local%" +@echo off -copy/Y %pip_lock_web% %my_archive_lockfile% -copy/Y %pip_lock_web% %my_changelog_lockfile% -copy/Y %req_lock_web% %my_changelog_reqfile% +REM Archive generated lockfile +copy /Y "%pip_lock_web%" "%my_archive_lockfile%" +copy /Y "%pip_lock_web%" "%my_changelog_lockfile%" +copy /Y "%req_lock_web%" "%my_changelog_reqfile%" call :log_section Archive success From f90a88755f44cd407b598da958d2bb268a9d72b9 Mon Sep 17 00:00:00 2001 From: stonebig Date: Mon, 14 Jul 2025 20:42:44 +0200 Subject: [PATCH 285/305] DOS clean-up with openai: Generate Changelog and Binaries. --- generate_a_winpython_distro.bat | 33 ++++++++++++++++++--------------- 1 file changed, 18 insertions(+), 15 deletions(-) diff --git a/generate_a_winpython_distro.bat b/generate_a_winpython_distro.bat index 66e9cf6a..6a7763a4 100644 --- a/generate_a_winpython_distro.bat +++ b/generate_a_winpython_distro.bat @@ -186,29 +186,31 @@ copy /Y "%pip_lock_web%" "%my_archive_lockfile%" copy /Y "%pip_lock_web%" "%my_changelog_lockfile%" copy /Y "%req_lock_web%" "%my_changelog_reqfile%" - call :log_section Archive success -set path=%my_original_path% -call %my_WINPYDIRBASE%\scripts\env.bat +rem set path=%my_original_path% +rem call %my_WINPYDIRBASE%\scripts\env.bat %target_python_exe% -m pip freeze > %my_archive_log%.packages_versions.txt -REM Generate changelog and binaries -echo "(%date% %time%) Generate changelog and binaries">>%my_archive_log% +REM === Step 13: Generate changelog and binaries === +call :log_section Generate changelog and binaries + +REM Define markdown changelog filenames +set "mdn=WinPython%my_flavor%-%my_arch%bit-%WINPYVER2%.md" +set "out=WinPython%my_flavor%-%my_arch%bit-%WINPYVER2%_History.md" -rem markdowm and markdown diff -set mdn=WinPython%my_flavor%-%my_arch%bit-%WINPYVER2%.md -%target_python_exe% -m wppm -md>%my_basedir%\bu%my_flavor%\%mdn% -copy/y %my_basedir%\bu%my_flavor%\%mdn% %~dp0changelogs\%mdn% +REM Create markdown package list +%target_python_exe% -m wppm -md > "%my_WINPYDIRBASE%\..\%mdn%" +copy /Y "%my_WINPYDIRBASE%\..\%mdn%" "%~dp0changelogs\%mdn%" -set out=WinPython%my_flavor%-%my_arch%bit-%WINPYVER2%_History.md -%target_python_exe% -c "from wppm import diff ;a=(diff.compare_package_indexes(r'%WINPYVER2%', searchdir=r'%~dp0changelogs',flavor=r'%my_flavor%',architecture=%my_arch%));f=open(r'%my_basedir%\bu%my_flavor%\%out%','w', encoding='utf-8');f.write(a);f.close()" -copy/y %my_basedir%\bu%my_flavor%\%out% %~dp0changelogs\%out% +REM Generate historical diff +%target_python_exe% -c "from wppm import diff; result = diff.compare_package_indexes('%WINPYVER2%', searchdir=r'%~dp0changelogs', flavor=r'%my_flavor%', architecture=%my_arch%); open(r'%my_WINPYDIRBASE%\..\%out%', 'w', encoding='utf-8').write(result)" +copy /Y "%my_WINPYDIRBASE%\..\%out%" "%~dp0changelogs\%out%" -rem compress -set stem=WinPython%my_arch%-%WINPYVER2%%my_flavor%%my_release_level% -%target_python_exe% -c "from wppm import utils;utils.command_installer_7zip(r'%my_WINPYDIRBASE%', r'%my_WINPYDIRBASE%\..',r'%stem%', r'%my_create_installer%')" +REM === Step 13b: Compress distribution to .7z or installer === +set "stem=WinPython%my_arch%-%WINPYVER2%%my_flavor%%my_release_level%" +%target_python_exe% -c "from wppm import utils; utils.command_installer_7zip(r'%my_WINPYDIRBASE%', r'%my_WINPYDIRBASE%\..', r'%stem%', r'%my_create_installer%')" call :log_section END OF CREATION @@ -223,6 +225,7 @@ exit echo. >>%my_archive_log% echo -------------------------------------- >>%my_archive_log% echo (%date% %time%) %* >>%my_archive_log% +echo (%date% %time%) %* echo -------------------------------------- >>%my_archive_log% echo. >>%my_archive_log% exit /b From 3375635dee51fd242e3e59a41ae3d372dc99b929 Mon Sep 17 00:00:00 2001 From: stonebig Date: Sat, 19 Jul 2025 10:38:41 +0200 Subject: [PATCH 286/305] DOS build clean-up: final clean-up --- generate_a_winpython_distro.bat | 45 +++++++++++++++++++-------------- 1 file changed, 26 insertions(+), 19 deletions(-) diff --git a/generate_a_winpython_distro.bat b/generate_a_winpython_distro.bat index 6a7763a4..470703e8 100644 --- a/generate_a_winpython_distro.bat +++ b/generate_a_winpython_distro.bat @@ -1,7 +1,7 @@ rem generate_a_winpython_distro.bat: to be launched from a winpython directory, where 'make.py' is @echo on -REM === Set default values if not already defined === +REM === Step 01:Set default values if not already defined === if not defined my_release_level set "my_release_level=b1" if not defined my_create_installer set "my_create_installer=True" if not defined my_constraints set "my_constraints=C:\WinP\constraints.txt" @@ -19,7 +19,7 @@ set "my_time=%my_time: =0%" REM === Define archive log file path === set "my_archive_log=%my_archive_dir%\build_%my_pyver%_%my_release%%my_flavor%_%my_release_level%_of_%date:/=-%at_%my_time%.txt" -REM === Set Python version and release === +REM === Step 02:Set Python version and release === if "%my_python_target%"=="311" ( set "my_python_target_release=3119" set "my_release=2" @@ -34,7 +34,7 @@ if "%my_python_target%"=="311" ( set "my_release=1" ) -REM === Define base build and distribution paths === +REM === Step 03:Define base build and distribution paths === set "my_basedir=%my_root_dir_for_builds%\bd%my_python_target%" set "my_WINPYDIRBASE=%my_basedir%\bu%my_flavor%\WPy%my_arch%-%my_python_target_release%%my_release%%my_release_level%" @@ -44,7 +44,7 @@ set my_buildenv=C:\WinPdev\WPy64-310111 call :log_section preparing winPython for %my_pyver% (%my_python_target%)release %my_release%%my_flavor% (%my_release_level%) *** %my_arch% bit *** -REM === Step: Pre-clear previous build infrastructure === +REM === Step 04: Pre-clear previous build infrastructure === if /i "%my_preclear_build_directory%"=="Yes" ( call :log_section Pre-clear previous build infrastructure @@ -63,7 +63,7 @@ if /i "%my_preclear_build_directory%"=="Yes" ( ) ) -REM === Step: Create new build === +REM === Step 05: Create new build === call :log_section Create a new build REM Activate base build environment @@ -92,7 +92,7 @@ if not exist "%WINPYDIRBASE%\scripts\env.bat" ( exit /b 1 ) -REM === Step: Add pre-requisite packages === +REM === Step 06: Add pre-requisite packages === call :log_section Add pre-requisite packages set "path=%my_original_path%" @@ -110,14 +110,14 @@ if defined my_requirements_pre ( echo No pre-requisite packages specified >>"%my_archive_log%" ) -REM === Step: Install main requirement packages === +REM === Step 07: Install main requirement packages === call :log_section Add main requirement packages python -m pip install -r "%my_requirements%" -c "%my_constraints%" --pre --no-index --trusted-host=None --find-links="%my_find_links%" >>"%my_archive_log%" REM Patch installed packages to be portable (WinPython style) python -c "from wppm import wppm;dist=wppm.Distribution(r'%WINPYDIR%');dist.patch_standard_packages('', to_movable=True)" -REM === Define lockfile paths for included wheels === +REM === Step 08: Define lockfile paths for included wheels === set "WINPYVERLOCK=%WINPYVER2:.=_%" set "LOCKDIR=%WINPYDIRBASE%\..\" @@ -126,7 +126,7 @@ set "pip_lock_includedweb=%LOCKDIR%pylock.%WINPYARCH%-%WINPYVERLOCK%%my_flavor%% set "req_lock_includedlocal=%LOCKDIR%requir.%WINPYARCH%-%WINPYVERLOCK%%my_flavor%%my_release_level%_wheelslocal.txt" set "req_lock_includedweb=%LOCKDIR%requir.%WINPYARCH%-%WINPYVERLOCK%%my_flavor%%my_release_level%_wheels.txt" -REM === Step: Add lockfile wheels for the Wheelhouse (optional) === +REM === Step 09: Add lockfile wheels for the Wheelhouse (optional) === if defined wheelhousereq if exist "%wheelhousereq%" ( call :log_section Add wheels for the Wheelhouse @@ -147,7 +147,7 @@ rem set path=%my_original_path% rem call %my_WINPYDIRBASE%\scripts\env.bat -REM === Freeze environment and generate final lockfiles === +REM === Step 10: Freeze environment and generate final lockfiles === call :log_section Freeze environment and generate lockfiles set "req=%LOCKDIR%requirement.%my_flavor%-%WINPYARCH%bit-%WINPYVERLOCK%_raw.txt" @@ -188,12 +188,7 @@ copy /Y "%req_lock_web%" "%my_changelog_reqfile%" call :log_section Archive success -rem set path=%my_original_path% -rem call %my_WINPYDIRBASE%\scripts\env.bat - -%target_python_exe% -m pip freeze > %my_archive_log%.packages_versions.txt - -REM === Step 13: Generate changelog and binaries === +REM === Step 11: Generate changelog and binaries === call :log_section Generate changelog and binaries REM Define markdown changelog filenames @@ -212,12 +207,24 @@ REM === Step 13b: Compress distribution to .7z or installer === set "stem=WinPython%my_arch%-%WINPYVER2%%my_flavor%%my_release_level%" %target_python_exe% -c "from wppm import utils; utils.command_installer_7zip(r'%my_WINPYDIRBASE%', r'%my_WINPYDIRBASE%\..', r'%stem%', r'%my_create_installer%')" +REM === Step 12: Final logs and cleanup === +call :log_section Final logs and cleanup + +REM Restore environment +set "path=%my_original_path%" +call "%my_WINPYDIRBASE%\scripts\env.bat" + +REM Freeze final package versions to archive +%target_python_exe% -m pip freeze > "%my_archive_log%.packages_versions.txt" + call :log_section END OF CREATION -start notepad.exe %my_archive_log% -start notepad.exe %my_archive_log%.packages_versions.txt +REM Open log files in Notepad for review +start notepad.exe "%my_archive_log%" +start notepad.exe "%my_archive_log%.packages_versions.txt" -set path=%my_original_path% +REM Restore path again (in case env.bat changed it) +set "path=%my_original_path%" pause exit From 0c709f32c8da3ea9db527bd576a8e17a496ddb7b Mon Sep 17 00:00:00 2001 From: stonebig Date: Sat, 19 Jul 2025 10:46:40 +0200 Subject: [PATCH 287/305] remove useless renaming of variables and changes of parameters order --- make.py | 44 +++++++++++++++++++------------------------- 1 file changed, 19 insertions(+), 25 deletions(-) diff --git a/make.py b/make.py index 1bf22502..786b640a 100644 --- a/make.py +++ b/make.py @@ -4,7 +4,7 @@ # Copyright © 2012 Pierre Raybaut # Copyright © 2014-2025+ The Winpython development team https://github.com/winpython/ # Licensed under the terms of the MIT License -# (see winpython/__init__.py for details) +# (see wppm/__init__.py for details) import os import re @@ -40,27 +40,27 @@ def parse_list_argument(argument_value: str | list[str], separator=" ") -> list[ class WinPythonDistributionBuilder: """Builds a WinPython distribution.""" - def __init__(self, build_number: int, release_level: str, target_directory: Path, wheels_directory: Path, - tools_directories: list[Path] = None, verbose: bool = False, - flavor: str = ""): + def __init__(self, build_number: int, release_level: str, basedir_wpy: Path, + source_dirs: Path, tools_directories: list[Path] = None, + verbose: bool = False, flavor: str = ""): """ Initializes the WinPythonDistributionBuilder. Args: build_number: The build number (integer). release_level: The release level (e.g., "beta", ""). - target_directory: The base directory below which WinPython will be created. - wheels_directory: Directory containing wheel files for packages. + basedir_wpy: top directory of the build (c:\...\Wpy...) + source_dirs: Directory containing wheel files for packages. tools_directories: List of directories containing development tools to include. verbose: Enable verbose output. flavor: WinPython flavor (e.g., "Barebone"). """ self.build_number = build_number self.release_level = release_level - self.target_directory = Path(target_directory) - self.wheels_directory = Path(wheels_directory) + self.winpython_directory = Path(basedir_wpy) + self.target_directory = self.winpython_directory.parent + self.source_dirs = Path(source_dirs) self.tools_directories = tools_directories or [] self.verbose = verbose - self.winpython_directory: Path | None = None self.distribution: wppm.Distribution | None = None self.flavor = flavor self.python_zip_file: Path = self._get_python_zip_file() @@ -69,10 +69,10 @@ def __init__(self, build_number: int, release_level: str, target_directory: Path def _get_python_zip_file(self) -> Path: """Finds the Python .zip file in the wheels directory.""" - for source_item in self.wheels_directory.iterdir(): + for source_item in self.source_dirs.iterdir(): if re.match(r"(pypy3|python-).*\.zip", source_item.name): return source_item - raise RuntimeError(f"Could not find Python zip package in {self.wheels_directory}") + raise RuntimeError(f"Could not find Python zip package in {self.source_dirs}") @property def winpython_version_name(self) -> str: @@ -108,7 +108,6 @@ def _copy_essential_files(self): def _create_env_config(self): """Creates environment setup""" - self._print_action("Creating env.ini environment setup") executable_name = self.distribution.short_exe if self.distribution else "python.exe" config = { "WINPYthon_exe": executable_name, @@ -123,10 +122,9 @@ def _create_env_config(self): self._print_action(f"Creating env.ini environment {env_path}") env_path.write_text("\n".join(f"{k}={v}" for k, v in config.items())) - def build(self, winpy_dir: Path = None): + def build(self): """Make or finalise WinPython distribution in the target directory""" print(f"Building WinPython with Python archive: {self.python_zip_file.name}") - self.winpython_directory = Path(winpy_dir) self._print_action(f"Creating WinPython {self.winpython_directory} base directory") if self.winpython_directory.is_dir() and len(self.winpython_directory.parts)>=4: shutil.rmtree(self.winpython_directory) @@ -139,10 +137,8 @@ def build(self, winpy_dir: Path = None): self._create_env_config() def make_all(build_number: int, release_level: str, basedir_wpy: Path = None, - verbose: bool = False, - flavor: str = "", source_dirs: Path = None, toolsdirs: str | list[Path] = None, -): + verbose: bool = False, flavor: str = ""): """ Make a WinPython distribution for a given set of parameters: Args: @@ -157,16 +153,14 @@ def make_all(build_number: int, release_level: str, basedir_wpy: Path = None, assert basedir_wpy is not None, "The *winpython_dirname* directory must be specified" tools_directories = [Path(d) for d in parse_list_argument(toolsdirs, ",")] - winpy_dir = Path(basedir_wpy) - utils.print_box(f"Making WinPython at {winpy_dir}") - os.makedirs(winpy_dir, exist_ok=True) + utils.print_box(f"Making WinPython at {basedir_wpy}") + os.makedirs(basedir_wpy, exist_ok=True) builder = WinPythonDistributionBuilder( - build_number, release_level, winpy_dir.parent, wheels_directory=source_dirs, - tools_directories=tools_directories, - verbose=verbose, flavor=flavor - ) - builder.build(winpy_dir) + build_number, release_level, Path(basedir_wpy), + verbose=verbose, flavor=flavor, + source_dirs=source_dirs, tools_directories=tools_directories) + builder.build() if __name__ == "__main__": make_all( From 5088010f395e4da51a402d7ff7b149d5fe18b2d8 Mon Sep 17 00:00:00 2001 From: stonebig Date: Sat, 19 Jul 2025 20:42:55 +0200 Subject: [PATCH 288/305] DOS post simplification with openAI: modularize and simplify --- generate_a_winpython_distro.bat | 170 ++++++++++++-------------------- mandatory_requirements.txt | 5 + 2 files changed, 70 insertions(+), 105 deletions(-) create mode 100644 mandatory_requirements.txt diff --git a/generate_a_winpython_distro.bat b/generate_a_winpython_distro.bat index 470703e8..afdb8deb 100644 --- a/generate_a_winpython_distro.bat +++ b/generate_a_winpython_distro.bat @@ -1,123 +1,78 @@ rem generate_a_winpython_distro.bat: to be launched from a winpython directory, where 'make.py' is @echo on -REM === Step 01:Set default values if not already defined === +REM === Initialize default values === if not defined my_release_level set "my_release_level=b1" if not defined my_create_installer set "my_create_installer=True" if not defined my_constraints set "my_constraints=C:\WinP\constraints.txt" if not defined target_python_exe set "target_python_exe=python.exe" +if not defined mandatory_requirements set "mandatory_requirements=%~dp0\mandatory_requirements.txt" -REM === Define archive directory === set "my_archive_dir=%~dp0WinPython_build_logs" if not exist "%my_archive_dir%" mkdir "%my_archive_dir%" -REM === Format current time for use in log file === +REM === Format log timestamp === set "my_time=%time:~0,5%" set "my_time=%my_time::=_%" set "my_time=%my_time: =0%" -REM === Define archive log file path === set "my_archive_log=%my_archive_dir%\build_%my_pyver%_%my_release%%my_flavor%_%my_release_level%_of_%date:/=-%at_%my_time%.txt" -REM === Step 02:Set Python version and release === -if "%my_python_target%"=="311" ( - set "my_python_target_release=3119" - set "my_release=2" -) else if "%my_python_target%"=="312" ( - set "my_python_target_release=31210" - set "my_release=2" -) else if "%my_python_target%"=="313" ( - set "my_python_target_release=3135" - set "my_release=1" -) else if "%my_python_target%"=="314" ( - set "my_python_target_release=3140" - set "my_release=1" -) +REM === Determine Python target version === +if "%my_python_target%"=="311" (set "my_python_target_release=3119" & set "my_release=2") +if "%my_python_target%"=="312" (set "my_python_target_release=31210" & set "my_release=2") +if "%my_python_target%"=="313" (set "my_python_target_release=3135" & set "my_release=1") +if "%my_python_target%"=="314" (set "my_python_target_release=3140" & set "my_release=1") -REM === Step 03:Define base build and distribution paths === +REM === Define base build and distribution paths === set "my_basedir=%my_root_dir_for_builds%\bd%my_python_target%" set "my_WINPYDIRBASE=%my_basedir%\bu%my_flavor%\WPy%my_arch%-%my_python_target_release%%my_release%%my_release_level%" - rem a building env need is a Python with packages: WinPython + build + flit + packaging + mkshim400.py -set my_buildenv=C:\WinPdev\WPy64-310111 +set "my_buildenv=C:\WinPdev\WPy64-310111" -call :log_section preparing winPython for %my_pyver% (%my_python_target%)release %my_release%%my_flavor% (%my_release_level%) *** %my_arch% bit *** +call :log_section Preparing WinPython for %my_pyver% (%my_python_target%)release %my_release%%my_flavor% (%my_release_level%) *** %my_arch% bit *** -REM === Step 04: Pre-clear previous build infrastructure === +REM === Optionally clear previous build === if /i "%my_preclear_build_directory%"=="Yes" ( call :log_section Pre-clear previous build infrastructure - REM Delete Jupyter config if it exists - if exist "%userprofile%\.jupyter\jupyter_notebook_config.py" ( - del /f /q "%userprofile%\.jupyter\jupyter_notebook_config.py" - ) - - REM Navigate to build directory + del /f /q "%userprofile%\.jupyter\jupyter_notebook_config.py" + REM Navigate to build directory and Rename previous build folder if it exists cd /D "%my_root_dir_for_builds%\bd%my_python_target%" - - REM Rename previous build folder if it exists - if exist "bu%my_flavor%" ( + if exist "bu%my_flavor%" ( ren "bu%my_flavor%" "bu%my_flavor%_old" rmdir /s /q "bu%my_flavor%_old" ) ) -REM === Step 05: Create new build === -call :log_section Create a new build +REM === Begin Build === +call :log_section Creating Build Infrastructure +call :activate_env "%my_buildenv%" -REM Activate base build environment -cd /D "%~dp0" -set "path=%my_original_path%" -call "%my_buildenv%\scripts\env.bat" - -REM Call make_all to create basic infrastructure -call :log_section Create basic build infrastructure python.exe -c "from make import make_all; make_all(%my_release%, '%my_release_level%', basedir_wpy=r'%my_WINPYDIRBASE%', verbose=True, flavor='%my_flavor%', source_dirs=r'%my_source_dirs%', toolsdirs=r'%my_toolsdirs%')" >>"%my_archive_log%" -REM === Check infrastructure exists === -call :log_section Check infrastructure - +REM === Check env.bat has been created === set "WINPYDIRBASE=%my_WINPYDIRBASE%" if not exist "%WINPYDIRBASE%\scripts\env.bat" ( - echo ERROR: %WINPYDIRBASE%\scripts\env.bat does not exist - echo Please verify: - echo my_arch=%my_arch% - echo my_python_target_release=%my_python_target_release% - echo my_release=%my_release% - echo my_release_level=%my_release_level% + echo ERROR: %WINPYDIRBASE%\scripts\env.bat script not found + echo Please verify: my_arch=%my_arch% my_python_target_release=%my_python_target_release% + echo my_release=%my_release% my_release_level=%my_release_level% pause exit /b 1 ) -REM === Step 06: Add pre-requisite packages === -call :log_section Add pre-requisite packages +REM === Install Prerequisites === +call :pip_install "%my_WINPYDIRBASE%" "%mandatory_requirements%" "Mandatory requirements" +call :pip_install "%my_WINPYDIRBASE%" "%my_requirements_pre%" "Pre-requirements" +call :pip_install "%my_WINPYDIRBASE%" "%my_requirements%" "Main requirements" -set "path=%my_original_path%" -call "%my_WINPYDIRBASE%\scripts\env.bat" - -rem python -m ensurepip -REM Upgrade essential pip tools -python -m pip install --upgrade pip setuptools wheel wppm -c "%my_constraints%" --pre --no-index --trusted-host=None --find-links="%my_find_links%" >>"%my_archive_log%" +REM === Patch WinPython === +python -c "from wppm import wppm; wppm.Distribution(r'%WINPYDIR%').patch_standard_packages('', to_movable=True)" -REM Install additional pre-requirements if specified -if defined my_requirements_pre ( - if not defined my_find_links_pre set "my_find_links_pre=%my_find_links%" - python -m pip install -r "%my_requirements_pre%" -c "%my_constraints%" --pre --no-index --trusted-host=None --find-links="%my_find_links_pre%" >>"%my_archive_log%" -) else ( - echo No pre-requisite packages specified >>"%my_archive_log%" -) - -REM === Step 07: Install main requirement packages === -call :log_section Add main requirement packages -python -m pip install -r "%my_requirements%" -c "%my_constraints%" --pre --no-index --trusted-host=None --find-links="%my_find_links%" >>"%my_archive_log%" - -REM Patch installed packages to be portable (WinPython style) -python -c "from wppm import wppm;dist=wppm.Distribution(r'%WINPYDIR%');dist.patch_standard_packages('', to_movable=True)" - -REM === Step 08: Define lockfile paths for included wheels === +REM === Lock files and requirements === set "WINPYVERLOCK=%WINPYVER2:.=_%" set "LOCKDIR=%WINPYDIRBASE%\..\" @@ -126,7 +81,7 @@ set "pip_lock_includedweb=%LOCKDIR%pylock.%WINPYARCH%-%WINPYVERLOCK%%my_flavor%% set "req_lock_includedlocal=%LOCKDIR%requir.%WINPYARCH%-%WINPYVERLOCK%%my_flavor%%my_release_level%_wheelslocal.txt" set "req_lock_includedweb=%LOCKDIR%requir.%WINPYARCH%-%WINPYVERLOCK%%my_flavor%%my_release_level%_wheels.txt" -REM === Step 09: Add lockfile wheels for the Wheelhouse (optional) === +REM === Add lockfile wheels for the Wheelhouse (optional) === if defined wheelhousereq if exist "%wheelhousereq%" ( call :log_section Add wheels for the Wheelhouse @@ -143,11 +98,7 @@ if defined wheelhousereq if exist "%wheelhousereq%" ( "%my_WINPYDIRBASE%\python\scripts\wppm.exe" "%pip_lock_includedweb%" -ws "%my_find_links%" -wd "%my_WINPYDIRBASE%\wheelhouse\included.wheels" ) -rem set path=%my_original_path% -rem call %my_WINPYDIRBASE%\scripts\env.bat - - -REM === Step 10: Freeze environment and generate final lockfiles === +REM === Freeze environment and generate final lockfiles === call :log_section Freeze environment and generate lockfiles set "req=%LOCKDIR%requirement.%my_flavor%-%WINPYARCH%bit-%WINPYVERLOCK%_raw.txt" @@ -188,45 +139,54 @@ copy /Y "%req_lock_web%" "%my_changelog_reqfile%" call :log_section Archive success -REM === Step 11: Generate changelog and binaries === -call :log_section Generate changelog and binaries - -REM Define markdown changelog filenames -set "mdn=WinPython%my_flavor%-%my_arch%bit-%WINPYVER2%.md" -set "out=WinPython%my_flavor%-%my_arch%bit-%WINPYVER2%_History.md" - -REM Create markdown package list -%target_python_exe% -m wppm -md > "%my_WINPYDIRBASE%\..\%mdn%" -copy /Y "%my_WINPYDIRBASE%\..\%mdn%" "%~dp0changelogs\%mdn%" +REM === Generate changelog and history === +call :log_section Generate changelog +call :generate_changelog -REM Generate historical diff -%target_python_exe% -c "from wppm import diff; result = diff.compare_package_indexes('%WINPYVER2%', searchdir=r'%~dp0changelogs', flavor=r'%my_flavor%', architecture=%my_arch%); open(r'%my_WINPYDIRBASE%\..\%out%', 'w', encoding='utf-8').write(result)" -copy /Y "%my_WINPYDIRBASE%\..\%out%" "%~dp0changelogs\%out%" - -REM === Step 13b: Compress distribution to .7z or installer === +REM === Create installer === +call :log_section Creating installer set "stem=WinPython%my_arch%-%WINPYVER2%%my_flavor%%my_release_level%" %target_python_exe% -c "from wppm import utils; utils.command_installer_7zip(r'%my_WINPYDIRBASE%', r'%my_WINPYDIRBASE%\..', r'%stem%', r'%my_create_installer%')" -REM === Step 12: Final logs and cleanup === +REM === Archive and cleanup === call :log_section Final logs and cleanup -REM Restore environment -set "path=%my_original_path%" -call "%my_WINPYDIRBASE%\scripts\env.bat" - REM Freeze final package versions to archive %target_python_exe% -m pip freeze > "%my_archive_log%.packages_versions.txt" -call :log_section END OF CREATION - REM Open log files in Notepad for review start notepad.exe "%my_archive_log%" start notepad.exe "%my_archive_log%.packages_versions.txt" +pause +exit /b -REM Restore path again (in case env.bat changed it) +:: ---------------------------------------- +:activate_env +cd /D "%~dp0" set "path=%my_original_path%" -pause -exit +call "%~1\scripts\env.bat" +exit /b + +:pip_install +call :log_section Installing %~3 +call :activate_env "%~1" +if not "%~2"=="" ( + python -m pip install -r "%~2" -c "%my_constraints%" --pre --no-index --trusted-host=None --find-links="%my_find_links%" >>"%my_archive_log%" +) else ( + echo No %~3 specified >>"%my_archive_log%" +) + +exit /b + +:generate_changelog +REM Create markdown file and diff history +set "mdn=WinPython%my_flavor%-%my_arch%bit-%WINPYVER2%.md" +set "out=WinPython%my_flavor%-%my_arch%bit-%WINPYVER2%_History.md" +%target_python_exe% -m wppm -md > "%my_WINPYDIRBASE%\..\%mdn%" +copy /Y "%my_WINPYDIRBASE%\..\%mdn%" "%~dp0changelogs\%mdn%" +%target_python_exe% -c "from wppm import diff; result = diff.compare_package_indexes('%WINPYVER2%', searchdir=r'%~dp0changelogs', flavor=r'%my_flavor%', architecture=%my_arch%); open(r'%my_WINPYDIRBASE%\..\%out%', 'w', encoding='utf-8').write(result)" +copy /Y "%my_WINPYDIRBASE%\..\%out%" "%~dp0changelogs\%out%" +exit /b :log_section echo. >>%my_archive_log% diff --git a/mandatory_requirements.txt b/mandatory_requirements.txt new file mode 100644 index 00000000..6f152f17 --- /dev/null +++ b/mandatory_requirements.txt @@ -0,0 +1,5 @@ +# the mandatory +pip +setuptools +#not Wheel +wppm From 2b13a0b627ce249d5a0b5d88488f452e09e409e6 Mon Sep 17 00:00:00 2001 From: stonebig Date: Sun, 27 Jul 2025 11:48:03 +0200 Subject: [PATCH 289/305] re-organize as a WinPython Module containing make.py and portable directory --- generate_a_winpython_distro.bat | 2 +- winpython/__init__.py | 0 winpython/__main__.py | 6 + winpython/make.py | 174 ++++++++++++++++++ .../launchers_building/build_my_launchers.bat | 0 .../launchers_building/icons/cmd.ico | Bin .../launchers_building/icons/code.ico | Bin .../launchers_building/icons/ijulia.ico | Bin .../launchers_building/icons/install.ico | Bin .../launchers_building/icons/ipython.ico | Bin .../launchers_building/icons/julia.ico | Bin .../launchers_building/icons/jupyter.ico | Bin .../launchers_building/icons/powershell.ico | Bin .../launchers_building/icons/python.ico | Bin .../launchers_building/icons/spyder.ico | Bin .../launchers_building/icons/spyder_reset.ico | Bin .../launchers_building/icons/terminal.ico | Bin .../launchers_building/icons/uninstall.ico | Bin .../launchers_building/icons/winpython.ico | Bin .../launchers_building/images/banner.bmp | Bin .../launchers_building/images/banner.pdn | Bin .../images/installer_logo.bmp | Bin .../launchers_building/images/splash.bmp | Bin .../launchers_building/images/splash.pdn | Bin .../launchers_building/images/win.bmp | Bin .../launchers_building/images/win.pdn | Bin .../images/winpython_title.svg | 0 .../images/winpython_title_portrait.svg | 0 .../IDLE (Python GUI).exe | Bin .../launchers_final_original/Jupyter Lab.exe | Bin .../Jupyter Notebook.exe | Bin .../launchers_final_original/Spyder reset.exe | Bin .../launchers_final_original/Spyder.exe | Bin .../launchers_final_original/VS Code.exe | Bin .../WinPython Command Prompt.exe | Bin .../WinPython Control Panel.exe | Bin .../WinPython Interpreter.exe | Bin .../WinPython Powershell Prompt.exe | Bin .../IDLE (Python GUI).exe | Bin .../IDLE (Python GUI)_2025-05-09_not_ok.exe | Bin .../IDLE (Python GUI)_20250401.exe | Bin .../launchers_final_proposed/Jupyter Lab.exe | Bin .../Jupyter Notebook.exe | Bin .../launchers_final_proposed/Spyder reset.exe | Bin .../launchers_final_proposed/Spyder.exe | Bin .../Spyder_2025-05-08_no_drag_and_drop.exe | Bin .../launchers_final_proposed/VS Code.exe | Bin .../WinPython Command Prompt.exe | Bin .../WinPython Control Panel.exe | Bin .../WinPython Control Panel_2025-05-09.exe | Bin .../WinPython Interpreter.exe | Bin .../WinPython Powershell Prompt.exe | Bin .../launchers_final_proposed/license.txt | 0 .../launchers_building/launchers_src/LICENSE | 0 .../launchers_src/build_one_launcher.bat | 0 .../launcher_template_CONSOLE.cpp | 0 .../launcher_template_WINDOWS.cpp | 0 .../launchers_src_original/LICENSE | 0 .../build_one_launcher.bat | 0 .../launcher_template_CONSOLE.cpp | 0 .../launcher_template_WINDOWS.cpp | 0 .../launchers_final/IDLE (Python GUI).exe | Bin .../portable}/launchers_final/Jupyter Lab.exe | Bin .../launchers_final/Jupyter Notebook.exe | Bin .../launchers_final/Spyder reset.exe | Bin .../portable}/launchers_final/Spyder.exe | Bin .../portable}/launchers_final/VS Code.exe | Bin .../WinPython Command Prompt.exe | Bin .../WinPython Control Panel.exe | Bin .../launchers_final/WinPython Interpreter.exe | Bin .../WinPython Powershell Prompt.exe | Bin .../portable}/launchers_final/license.txt | 0 .../launchers_final/notebooks/docs/README.txt | 0 .../launchers_final/scripts/WinPythonIni.py | 0 .../scripts/WinPython_PS_Prompt.ps1 | 0 .../launchers_final/scripts/activate.bat | 0 .../portable}/launchers_final/scripts/cmd.bat | 0 .../launchers_final/scripts/cmd_ps.bat | 0 .../portable}/launchers_final/scripts/env.bat | 0 .../launchers_final/scripts/env_for_icons.bat | 0 ...directory_and_userprofile_be_winpython.bat | 0 ...ake_working_directory_be_not_winpython.bat | 0 .../make_working_directory_be_winpython.bat | 0 .../launchers_final/scripts/python.bat | 0 .../launchers_final/scripts/readme.txt | 0 .../launchers_final/scripts/spyder_reset.bat | 0 .../launchers_final/scripts/upgrade_pip.bat | 0 .../launchers_final/scripts/winidle.bat | 0 .../scripts/winipython_notebook.bat | 0 .../scripts/winjupyter_lab.bat | 0 .../launchers_final/scripts/winpython.bat | 0 .../launchers_final/scripts/winspyder.bat | 0 .../launchers_final/scripts/winvscode.bat | 0 .../launchers_final/scripts/wpcp.bat | 0 94 files changed, 181 insertions(+), 1 deletion(-) create mode 100644 winpython/__init__.py create mode 100644 winpython/__main__.py create mode 100644 winpython/make.py rename {portable => winpython/portable}/launchers_building/build_my_launchers.bat (100%) rename {portable => winpython/portable}/launchers_building/icons/cmd.ico (100%) rename {portable => winpython/portable}/launchers_building/icons/code.ico (100%) rename {portable => winpython/portable}/launchers_building/icons/ijulia.ico (100%) rename {portable => winpython/portable}/launchers_building/icons/install.ico (100%) rename {portable => winpython/portable}/launchers_building/icons/ipython.ico (100%) rename {portable => winpython/portable}/launchers_building/icons/julia.ico (100%) rename {portable => winpython/portable}/launchers_building/icons/jupyter.ico (100%) rename {portable => winpython/portable}/launchers_building/icons/powershell.ico (100%) rename {portable => winpython/portable}/launchers_building/icons/python.ico (100%) rename {portable => winpython/portable}/launchers_building/icons/spyder.ico (100%) rename {portable => winpython/portable}/launchers_building/icons/spyder_reset.ico (100%) rename {portable => winpython/portable}/launchers_building/icons/terminal.ico (100%) rename {portable => winpython/portable}/launchers_building/icons/uninstall.ico (100%) rename {portable => winpython/portable}/launchers_building/icons/winpython.ico (100%) rename {portable => winpython/portable}/launchers_building/images/banner.bmp (100%) rename {portable => winpython/portable}/launchers_building/images/banner.pdn (100%) rename {portable => winpython/portable}/launchers_building/images/installer_logo.bmp (100%) rename {portable => winpython/portable}/launchers_building/images/splash.bmp (100%) rename {portable => winpython/portable}/launchers_building/images/splash.pdn (100%) rename {portable => winpython/portable}/launchers_building/images/win.bmp (100%) rename {portable => winpython/portable}/launchers_building/images/win.pdn (100%) rename {portable => winpython/portable}/launchers_building/images/winpython_title.svg (100%) rename {portable => winpython/portable}/launchers_building/images/winpython_title_portrait.svg (100%) rename {portable => winpython/portable}/launchers_building/launchers_final_original/IDLE (Python GUI).exe (100%) rename {portable => winpython/portable}/launchers_building/launchers_final_original/Jupyter Lab.exe (100%) rename {portable => winpython/portable}/launchers_building/launchers_final_original/Jupyter Notebook.exe (100%) rename {portable => winpython/portable}/launchers_building/launchers_final_original/Spyder reset.exe (100%) rename {portable => winpython/portable}/launchers_building/launchers_final_original/Spyder.exe (100%) rename {portable => winpython/portable}/launchers_building/launchers_final_original/VS Code.exe (100%) rename {portable => winpython/portable}/launchers_building/launchers_final_original/WinPython Command Prompt.exe (100%) rename {portable => winpython/portable}/launchers_building/launchers_final_original/WinPython Control Panel.exe (100%) rename {portable => winpython/portable}/launchers_building/launchers_final_original/WinPython Interpreter.exe (100%) rename {portable => winpython/portable}/launchers_building/launchers_final_original/WinPython Powershell Prompt.exe (100%) rename {portable => winpython/portable}/launchers_building/launchers_final_proposed/IDLE (Python GUI).exe (100%) rename {portable => winpython/portable}/launchers_building/launchers_final_proposed/IDLE (Python GUI)_2025-05-09_not_ok.exe (100%) rename {portable => winpython/portable}/launchers_building/launchers_final_proposed/IDLE (Python GUI)_20250401.exe (100%) rename {portable => winpython/portable}/launchers_building/launchers_final_proposed/Jupyter Lab.exe (100%) rename {portable => winpython/portable}/launchers_building/launchers_final_proposed/Jupyter Notebook.exe (100%) rename {portable => winpython/portable}/launchers_building/launchers_final_proposed/Spyder reset.exe (100%) rename {portable => winpython/portable}/launchers_building/launchers_final_proposed/Spyder.exe (100%) rename {portable => winpython/portable}/launchers_building/launchers_final_proposed/Spyder_2025-05-08_no_drag_and_drop.exe (100%) rename {portable => winpython/portable}/launchers_building/launchers_final_proposed/VS Code.exe (100%) rename {portable => winpython/portable}/launchers_building/launchers_final_proposed/WinPython Command Prompt.exe (100%) rename {portable => winpython/portable}/launchers_building/launchers_final_proposed/WinPython Control Panel.exe (100%) rename {portable => winpython/portable}/launchers_building/launchers_final_proposed/WinPython Control Panel_2025-05-09.exe (100%) rename {portable => winpython/portable}/launchers_building/launchers_final_proposed/WinPython Interpreter.exe (100%) rename {portable => winpython/portable}/launchers_building/launchers_final_proposed/WinPython Powershell Prompt.exe (100%) rename {portable => winpython/portable}/launchers_building/launchers_final_proposed/license.txt (100%) rename {portable => winpython/portable}/launchers_building/launchers_src/LICENSE (100%) rename {portable => winpython/portable}/launchers_building/launchers_src/build_one_launcher.bat (100%) rename {portable => winpython/portable}/launchers_building/launchers_src/launcher_template_CONSOLE.cpp (100%) rename {portable => winpython/portable}/launchers_building/launchers_src/launcher_template_WINDOWS.cpp (100%) rename {portable => winpython/portable}/launchers_building/launchers_src_original/LICENSE (100%) rename {portable => winpython/portable}/launchers_building/launchers_src_original/build_one_launcher.bat (100%) rename {portable => winpython/portable}/launchers_building/launchers_src_original/launcher_template_CONSOLE.cpp (100%) rename {portable => winpython/portable}/launchers_building/launchers_src_original/launcher_template_WINDOWS.cpp (100%) rename {portable => winpython/portable}/launchers_final/IDLE (Python GUI).exe (100%) rename {portable => winpython/portable}/launchers_final/Jupyter Lab.exe (100%) rename {portable => winpython/portable}/launchers_final/Jupyter Notebook.exe (100%) rename {portable => winpython/portable}/launchers_final/Spyder reset.exe (100%) rename {portable => winpython/portable}/launchers_final/Spyder.exe (100%) rename {portable => winpython/portable}/launchers_final/VS Code.exe (100%) rename {portable => winpython/portable}/launchers_final/WinPython Command Prompt.exe (100%) rename {portable => winpython/portable}/launchers_final/WinPython Control Panel.exe (100%) rename {portable => winpython/portable}/launchers_final/WinPython Interpreter.exe (100%) rename {portable => winpython/portable}/launchers_final/WinPython Powershell Prompt.exe (100%) rename {portable => winpython/portable}/launchers_final/license.txt (100%) rename {portable => winpython/portable}/launchers_final/notebooks/docs/README.txt (100%) rename {portable => winpython/portable}/launchers_final/scripts/WinPythonIni.py (100%) rename {portable => winpython/portable}/launchers_final/scripts/WinPython_PS_Prompt.ps1 (100%) rename {portable => winpython/portable}/launchers_final/scripts/activate.bat (100%) rename {portable => winpython/portable}/launchers_final/scripts/cmd.bat (100%) rename {portable => winpython/portable}/launchers_final/scripts/cmd_ps.bat (100%) rename {portable => winpython/portable}/launchers_final/scripts/env.bat (100%) rename {portable => winpython/portable}/launchers_final/scripts/env_for_icons.bat (100%) rename {portable => winpython/portable}/launchers_final/scripts/make_working_directory_and_userprofile_be_winpython.bat (100%) rename {portable => winpython/portable}/launchers_final/scripts/make_working_directory_be_not_winpython.bat (100%) rename {portable => winpython/portable}/launchers_final/scripts/make_working_directory_be_winpython.bat (100%) rename {portable => winpython/portable}/launchers_final/scripts/python.bat (100%) rename {portable => winpython/portable}/launchers_final/scripts/readme.txt (100%) rename {portable => winpython/portable}/launchers_final/scripts/spyder_reset.bat (100%) rename {portable => winpython/portable}/launchers_final/scripts/upgrade_pip.bat (100%) rename {portable => winpython/portable}/launchers_final/scripts/winidle.bat (100%) rename {portable => winpython/portable}/launchers_final/scripts/winipython_notebook.bat (100%) rename {portable => winpython/portable}/launchers_final/scripts/winjupyter_lab.bat (100%) rename {portable => winpython/portable}/launchers_final/scripts/winpython.bat (100%) rename {portable => winpython/portable}/launchers_final/scripts/winspyder.bat (100%) rename {portable => winpython/portable}/launchers_final/scripts/winvscode.bat (100%) rename {portable => winpython/portable}/launchers_final/scripts/wpcp.bat (100%) diff --git a/generate_a_winpython_distro.bat b/generate_a_winpython_distro.bat index afdb8deb..a54e65a6 100644 --- a/generate_a_winpython_distro.bat +++ b/generate_a_winpython_distro.bat @@ -50,7 +50,7 @@ REM === Begin Build === call :log_section Creating Build Infrastructure call :activate_env "%my_buildenv%" -python.exe -c "from make import make_all; make_all(%my_release%, '%my_release_level%', basedir_wpy=r'%my_WINPYDIRBASE%', verbose=True, flavor='%my_flavor%', source_dirs=r'%my_source_dirs%', toolsdirs=r'%my_toolsdirs%')" >>"%my_archive_log%" +python.exe -c "from winpython import make;make.make_all(%my_release%, '%my_release_level%', basedir_wpy=r'%my_WINPYDIRBASE%', verbose=True, flavor='%my_flavor%', source_dirs=r'%my_source_dirs%', toolsdirs=r'%my_toolsdirs%')" >>"%my_archive_log%" REM === Check env.bat has been created === diff --git a/winpython/__init__.py b/winpython/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/winpython/__main__.py b/winpython/__main__.py new file mode 100644 index 00000000..0dd8efd8 --- /dev/null +++ b/winpython/__main__.py @@ -0,0 +1,6 @@ +import os +import sys +if __name__ == "__main__": + from winpython import make + + sys.exit(make.main()) \ No newline at end of file diff --git a/winpython/make.py b/winpython/make.py new file mode 100644 index 00000000..437a8042 --- /dev/null +++ b/winpython/make.py @@ -0,0 +1,174 @@ +# -*- coding: utf-8 -*- +# +# WinPython build script +# Copyright © 2012 Pierre Raybaut +# Copyright © 2014-2025+ The Winpython development team https://github.com/winpython/ +# Licensed under the terms of the MIT License +# (see wppm/__init__.py for details) + +import os +import re +import shutil +from pathlib import Path +from wppm import wppm, utils + +PORTABLE_DIRECTORY = Path(__file__).parent / "portable" +assert PORTABLE_DIRECTORY.is_dir(), f"Portable directory not found: {PORTABLE_DIRECTORY}" + +def copy_items(source_directories: list[Path], target_directory: Path, verbose: bool = False): + """Copies items from source directories to the target directory.""" + target_directory.mkdir(parents=True, exist_ok=True) + for source_dir in source_directories: + if not source_dir.is_dir(): + print(f"Warning: Source directory not found: {source_dir}") + continue + for source_item in source_dir.iterdir(): + target_item = target_directory / source_item.name + copy_function = shutil.copytree if source_item.is_dir() else shutil.copy2 + try: + copy_function(source_item, target_item) + if verbose: + print(f"Copied: {source_item} -> {target_item}") + except Exception as e: + print(f"Error copying {source_item} to {target_item}: {e}") + +def parse_list_argument(argument_value: str | list[str], separator=" ") -> list[str]: + """Parse a separated list argument into a list of strings.""" + if not argument_value: return [] + return argument_value.split(separator) if isinstance(argument_value, str) else list(argument_value) + +class WinPythonDistributionBuilder: + """Builds a WinPython distribution.""" + + def __init__(self, build_number: int, release_level: str, basedir_wpy: Path, + source_dirs: Path, tools_directories: list[Path] = None, + verbose: bool = False, flavor: str = ""): + """ + Initializes the WinPythonDistributionBuilder. + Args: + build_number: The build number (integer). + release_level: The release level (e.g., "beta", ""). + basedir_wpy: top directory of the build (c:\...\Wpy...) + source_dirs: Directory containing wheel files for packages. + tools_directories: List of directories containing development tools to include. + verbose: Enable verbose output. + flavor: WinPython flavor (e.g., "Barebone"). + """ + self.build_number = build_number + self.release_level = release_level + self.winpython_directory = Path(basedir_wpy) + self.target_directory = self.winpython_directory.parent + self.source_dirs = Path(source_dirs) + self.tools_directories = tools_directories or [] + self.verbose = verbose + self.distribution: wppm.Distribution | None = None + self.flavor = flavor + self.python_zip_file: Path = self._get_python_zip_file() + self.python_name = self.python_zip_file.stem + self.python_directory_name = "python" + + def _get_python_zip_file(self) -> Path: + """Finds the Python .zip file in the wheels directory.""" + for source_item in self.source_dirs.iterdir(): + if re.match(r"(pypy3|python-).*\.zip", source_item.name): + return source_item + raise RuntimeError(f"Could not find Python zip package in {self.source_dirs}") + + @property + def winpython_version_name(self) -> str: + """Returns the full WinPython version string.""" + return f"{self.python_full_version}.{self.build_number}{self.flavor}{self.release_level}" + + @property + def python_full_version(self) -> str: + """Retrieves the Python full version string from the distribution.""" + return utils.get_python_long_version(self.distribution.target) if self.distribution else "0.0.0" + + def _print_action(self, text: str): + """Prints an action message with progress indicator.""" + utils.print_box(text) if self.verbose else print(f"{text}...", end="", flush=True) + + def _extract_python_archive(self): + """Extracts the Python zip archive to create the base Python environment.""" + self._print_action("Extracting Python archive") + utils.extract_archive(self.python_zip_file, self.winpython_directory) + # Relocate to /python subfolder if needed (for newer structure) #2024-12-22 to /python + expected_python_directory = self.winpython_directory / self.python_directory_name + if self.python_directory_name != self.python_name and not expected_python_directory.is_dir(): + os.rename(self.winpython_directory / self.python_name, expected_python_directory) + + def _copy_essential_files(self): + """Copies pre-made objects""" + self._print_action("Copying launchers") + copy_items([PORTABLE_DIRECTORY / "launchers_final"], self.winpython_directory, self.verbose) + + tools_target_directory = self.winpython_directory / "t" + self._print_action(f"Copying tools to {tools_target_directory}") + copy_items(self.tools_directories, tools_target_directory, self.verbose) + + def _create_env_config(self): + """Creates environment setup""" + executable_name = self.distribution.short_exe if self.distribution else "python.exe" + config = { + "WINPYthon_exe": executable_name, + "WINPYthon_subdirectory_name": self.python_directory_name, + "WINPYVER": self.winpython_version_name, + "WINPYVER2": f"{self.python_full_version}.{self.build_number}", + "WINPYFLAVOR": self.flavor, + "WINPYARCH": self.distribution.architecture if self.distribution else 64, + } + env_path = self.winpython_directory / "scripts" / "env.ini" + env_path.parent.mkdir(parents=True, exist_ok=True) + self._print_action(f"Creating env.ini environment {env_path}") + env_path.write_text("\n".join(f"{k}={v}" for k, v in config.items())) + + def build(self): + """Make or finalise WinPython distribution in the target directory""" + print(f"Building WinPython with Python archive: {self.python_zip_file.name}") + self._print_action(f"Creating WinPython {self.winpython_directory} base directory") + if self.winpython_directory.is_dir() and len(self.winpython_directory.parts)>=4: + shutil.rmtree(self.winpython_directory) + # preventive re-Creation of settings directory + (self.winpython_directory / "settings" / "AppData" / "Roaming").mkdir(parents=True, exist_ok=True) + + self._extract_python_archive() + self.distribution = wppm.Distribution(self.winpython_directory / self.python_directory_name, verbose=self.verbose) + self._copy_essential_files() + self._create_env_config() + +def make_all(build_number: int, release_level: str, basedir_wpy: Path = None, + source_dirs: Path = None, toolsdirs: str | list[Path] = None, + verbose: bool = False, flavor: str = ""): + """ + Make a WinPython distribution for a given set of parameters: + Args: + build_number: build number [int] + release_level: release level (e.g. 'beta1', '') [str] + basedir_wpy: top directory of the build (c:\...\Wpy...) + verbose: Enable verbose output (bool). + flavor: WinPython flavor (str). + source_dirs: the python.zip + toolsdirs: Directory with development tools r'D:\WinPython\basedir34\t.Slim' + """ + assert basedir_wpy is not None, "The *winpython_dirname* directory must be specified" + + tools_directories = [Path(d) for d in parse_list_argument(toolsdirs, ",")] + utils.print_box(f"Making WinPython at {basedir_wpy}") + os.makedirs(basedir_wpy, exist_ok=True) + + builder = WinPythonDistributionBuilder( + build_number, release_level, Path(basedir_wpy), + verbose=verbose, flavor=flavor, + source_dirs=source_dirs, tools_directories=tools_directories) + builder.build() + +if __name__ == "__main__": + make_all( + build_number=1, + release_level="b3", + basedir_wpy=r"D:\WinPython\bd314\budot\WPy64-31401b3", + verbose=True, + flavor="dot", + source_dirs=r"D:\WinPython\bd314\packages.win-amd64", + toolsdirs=r"D:\WinPython\bd314\t.Slim", + ) diff --git a/portable/launchers_building/build_my_launchers.bat b/winpython/portable/launchers_building/build_my_launchers.bat similarity index 100% rename from portable/launchers_building/build_my_launchers.bat rename to winpython/portable/launchers_building/build_my_launchers.bat diff --git a/portable/launchers_building/icons/cmd.ico b/winpython/portable/launchers_building/icons/cmd.ico similarity index 100% rename from portable/launchers_building/icons/cmd.ico rename to winpython/portable/launchers_building/icons/cmd.ico diff --git a/portable/launchers_building/icons/code.ico b/winpython/portable/launchers_building/icons/code.ico similarity index 100% rename from portable/launchers_building/icons/code.ico rename to winpython/portable/launchers_building/icons/code.ico diff --git a/portable/launchers_building/icons/ijulia.ico b/winpython/portable/launchers_building/icons/ijulia.ico similarity index 100% rename from portable/launchers_building/icons/ijulia.ico rename to winpython/portable/launchers_building/icons/ijulia.ico diff --git a/portable/launchers_building/icons/install.ico b/winpython/portable/launchers_building/icons/install.ico similarity index 100% rename from portable/launchers_building/icons/install.ico rename to winpython/portable/launchers_building/icons/install.ico diff --git a/portable/launchers_building/icons/ipython.ico b/winpython/portable/launchers_building/icons/ipython.ico similarity index 100% rename from portable/launchers_building/icons/ipython.ico rename to winpython/portable/launchers_building/icons/ipython.ico diff --git a/portable/launchers_building/icons/julia.ico b/winpython/portable/launchers_building/icons/julia.ico similarity index 100% rename from portable/launchers_building/icons/julia.ico rename to winpython/portable/launchers_building/icons/julia.ico diff --git a/portable/launchers_building/icons/jupyter.ico b/winpython/portable/launchers_building/icons/jupyter.ico similarity index 100% rename from portable/launchers_building/icons/jupyter.ico rename to winpython/portable/launchers_building/icons/jupyter.ico diff --git a/portable/launchers_building/icons/powershell.ico b/winpython/portable/launchers_building/icons/powershell.ico similarity index 100% rename from portable/launchers_building/icons/powershell.ico rename to winpython/portable/launchers_building/icons/powershell.ico diff --git a/portable/launchers_building/icons/python.ico b/winpython/portable/launchers_building/icons/python.ico similarity index 100% rename from portable/launchers_building/icons/python.ico rename to winpython/portable/launchers_building/icons/python.ico diff --git a/portable/launchers_building/icons/spyder.ico b/winpython/portable/launchers_building/icons/spyder.ico similarity index 100% rename from portable/launchers_building/icons/spyder.ico rename to winpython/portable/launchers_building/icons/spyder.ico diff --git a/portable/launchers_building/icons/spyder_reset.ico b/winpython/portable/launchers_building/icons/spyder_reset.ico similarity index 100% rename from portable/launchers_building/icons/spyder_reset.ico rename to winpython/portable/launchers_building/icons/spyder_reset.ico diff --git a/portable/launchers_building/icons/terminal.ico b/winpython/portable/launchers_building/icons/terminal.ico similarity index 100% rename from portable/launchers_building/icons/terminal.ico rename to winpython/portable/launchers_building/icons/terminal.ico diff --git a/portable/launchers_building/icons/uninstall.ico b/winpython/portable/launchers_building/icons/uninstall.ico similarity index 100% rename from portable/launchers_building/icons/uninstall.ico rename to winpython/portable/launchers_building/icons/uninstall.ico diff --git a/portable/launchers_building/icons/winpython.ico b/winpython/portable/launchers_building/icons/winpython.ico similarity index 100% rename from portable/launchers_building/icons/winpython.ico rename to winpython/portable/launchers_building/icons/winpython.ico diff --git a/portable/launchers_building/images/banner.bmp b/winpython/portable/launchers_building/images/banner.bmp similarity index 100% rename from portable/launchers_building/images/banner.bmp rename to winpython/portable/launchers_building/images/banner.bmp diff --git a/portable/launchers_building/images/banner.pdn b/winpython/portable/launchers_building/images/banner.pdn similarity index 100% rename from portable/launchers_building/images/banner.pdn rename to winpython/portable/launchers_building/images/banner.pdn diff --git a/portable/launchers_building/images/installer_logo.bmp b/winpython/portable/launchers_building/images/installer_logo.bmp similarity index 100% rename from portable/launchers_building/images/installer_logo.bmp rename to winpython/portable/launchers_building/images/installer_logo.bmp diff --git a/portable/launchers_building/images/splash.bmp b/winpython/portable/launchers_building/images/splash.bmp similarity index 100% rename from portable/launchers_building/images/splash.bmp rename to winpython/portable/launchers_building/images/splash.bmp diff --git a/portable/launchers_building/images/splash.pdn b/winpython/portable/launchers_building/images/splash.pdn similarity index 100% rename from portable/launchers_building/images/splash.pdn rename to winpython/portable/launchers_building/images/splash.pdn diff --git a/portable/launchers_building/images/win.bmp b/winpython/portable/launchers_building/images/win.bmp similarity index 100% rename from portable/launchers_building/images/win.bmp rename to winpython/portable/launchers_building/images/win.bmp diff --git a/portable/launchers_building/images/win.pdn b/winpython/portable/launchers_building/images/win.pdn similarity index 100% rename from portable/launchers_building/images/win.pdn rename to winpython/portable/launchers_building/images/win.pdn diff --git a/portable/launchers_building/images/winpython_title.svg b/winpython/portable/launchers_building/images/winpython_title.svg similarity index 100% rename from portable/launchers_building/images/winpython_title.svg rename to winpython/portable/launchers_building/images/winpython_title.svg diff --git a/portable/launchers_building/images/winpython_title_portrait.svg b/winpython/portable/launchers_building/images/winpython_title_portrait.svg similarity index 100% rename from portable/launchers_building/images/winpython_title_portrait.svg rename to winpython/portable/launchers_building/images/winpython_title_portrait.svg diff --git a/portable/launchers_building/launchers_final_original/IDLE (Python GUI).exe b/winpython/portable/launchers_building/launchers_final_original/IDLE (Python GUI).exe similarity index 100% rename from portable/launchers_building/launchers_final_original/IDLE (Python GUI).exe rename to winpython/portable/launchers_building/launchers_final_original/IDLE (Python GUI).exe diff --git a/portable/launchers_building/launchers_final_original/Jupyter Lab.exe b/winpython/portable/launchers_building/launchers_final_original/Jupyter Lab.exe similarity index 100% rename from portable/launchers_building/launchers_final_original/Jupyter Lab.exe rename to winpython/portable/launchers_building/launchers_final_original/Jupyter Lab.exe diff --git a/portable/launchers_building/launchers_final_original/Jupyter Notebook.exe b/winpython/portable/launchers_building/launchers_final_original/Jupyter Notebook.exe similarity index 100% rename from portable/launchers_building/launchers_final_original/Jupyter Notebook.exe rename to winpython/portable/launchers_building/launchers_final_original/Jupyter Notebook.exe diff --git a/portable/launchers_building/launchers_final_original/Spyder reset.exe b/winpython/portable/launchers_building/launchers_final_original/Spyder reset.exe similarity index 100% rename from portable/launchers_building/launchers_final_original/Spyder reset.exe rename to winpython/portable/launchers_building/launchers_final_original/Spyder reset.exe diff --git a/portable/launchers_building/launchers_final_original/Spyder.exe b/winpython/portable/launchers_building/launchers_final_original/Spyder.exe similarity index 100% rename from portable/launchers_building/launchers_final_original/Spyder.exe rename to winpython/portable/launchers_building/launchers_final_original/Spyder.exe diff --git a/portable/launchers_building/launchers_final_original/VS Code.exe b/winpython/portable/launchers_building/launchers_final_original/VS Code.exe similarity index 100% rename from portable/launchers_building/launchers_final_original/VS Code.exe rename to winpython/portable/launchers_building/launchers_final_original/VS Code.exe diff --git a/portable/launchers_building/launchers_final_original/WinPython Command Prompt.exe b/winpython/portable/launchers_building/launchers_final_original/WinPython Command Prompt.exe similarity index 100% rename from portable/launchers_building/launchers_final_original/WinPython Command Prompt.exe rename to winpython/portable/launchers_building/launchers_final_original/WinPython Command Prompt.exe diff --git a/portable/launchers_building/launchers_final_original/WinPython Control Panel.exe b/winpython/portable/launchers_building/launchers_final_original/WinPython Control Panel.exe similarity index 100% rename from portable/launchers_building/launchers_final_original/WinPython Control Panel.exe rename to winpython/portable/launchers_building/launchers_final_original/WinPython Control Panel.exe diff --git a/portable/launchers_building/launchers_final_original/WinPython Interpreter.exe b/winpython/portable/launchers_building/launchers_final_original/WinPython Interpreter.exe similarity index 100% rename from portable/launchers_building/launchers_final_original/WinPython Interpreter.exe rename to winpython/portable/launchers_building/launchers_final_original/WinPython Interpreter.exe diff --git a/portable/launchers_building/launchers_final_original/WinPython Powershell Prompt.exe b/winpython/portable/launchers_building/launchers_final_original/WinPython Powershell Prompt.exe similarity index 100% rename from portable/launchers_building/launchers_final_original/WinPython Powershell Prompt.exe rename to winpython/portable/launchers_building/launchers_final_original/WinPython Powershell Prompt.exe diff --git a/portable/launchers_building/launchers_final_proposed/IDLE (Python GUI).exe b/winpython/portable/launchers_building/launchers_final_proposed/IDLE (Python GUI).exe similarity index 100% rename from portable/launchers_building/launchers_final_proposed/IDLE (Python GUI).exe rename to winpython/portable/launchers_building/launchers_final_proposed/IDLE (Python GUI).exe diff --git a/portable/launchers_building/launchers_final_proposed/IDLE (Python GUI)_2025-05-09_not_ok.exe b/winpython/portable/launchers_building/launchers_final_proposed/IDLE (Python GUI)_2025-05-09_not_ok.exe similarity index 100% rename from portable/launchers_building/launchers_final_proposed/IDLE (Python GUI)_2025-05-09_not_ok.exe rename to winpython/portable/launchers_building/launchers_final_proposed/IDLE (Python GUI)_2025-05-09_not_ok.exe diff --git a/portable/launchers_building/launchers_final_proposed/IDLE (Python GUI)_20250401.exe b/winpython/portable/launchers_building/launchers_final_proposed/IDLE (Python GUI)_20250401.exe similarity index 100% rename from portable/launchers_building/launchers_final_proposed/IDLE (Python GUI)_20250401.exe rename to winpython/portable/launchers_building/launchers_final_proposed/IDLE (Python GUI)_20250401.exe diff --git a/portable/launchers_building/launchers_final_proposed/Jupyter Lab.exe b/winpython/portable/launchers_building/launchers_final_proposed/Jupyter Lab.exe similarity index 100% rename from portable/launchers_building/launchers_final_proposed/Jupyter Lab.exe rename to winpython/portable/launchers_building/launchers_final_proposed/Jupyter Lab.exe diff --git a/portable/launchers_building/launchers_final_proposed/Jupyter Notebook.exe b/winpython/portable/launchers_building/launchers_final_proposed/Jupyter Notebook.exe similarity index 100% rename from portable/launchers_building/launchers_final_proposed/Jupyter Notebook.exe rename to winpython/portable/launchers_building/launchers_final_proposed/Jupyter Notebook.exe diff --git a/portable/launchers_building/launchers_final_proposed/Spyder reset.exe b/winpython/portable/launchers_building/launchers_final_proposed/Spyder reset.exe similarity index 100% rename from portable/launchers_building/launchers_final_proposed/Spyder reset.exe rename to winpython/portable/launchers_building/launchers_final_proposed/Spyder reset.exe diff --git a/portable/launchers_building/launchers_final_proposed/Spyder.exe b/winpython/portable/launchers_building/launchers_final_proposed/Spyder.exe similarity index 100% rename from portable/launchers_building/launchers_final_proposed/Spyder.exe rename to winpython/portable/launchers_building/launchers_final_proposed/Spyder.exe diff --git a/portable/launchers_building/launchers_final_proposed/Spyder_2025-05-08_no_drag_and_drop.exe b/winpython/portable/launchers_building/launchers_final_proposed/Spyder_2025-05-08_no_drag_and_drop.exe similarity index 100% rename from portable/launchers_building/launchers_final_proposed/Spyder_2025-05-08_no_drag_and_drop.exe rename to winpython/portable/launchers_building/launchers_final_proposed/Spyder_2025-05-08_no_drag_and_drop.exe diff --git a/portable/launchers_building/launchers_final_proposed/VS Code.exe b/winpython/portable/launchers_building/launchers_final_proposed/VS Code.exe similarity index 100% rename from portable/launchers_building/launchers_final_proposed/VS Code.exe rename to winpython/portable/launchers_building/launchers_final_proposed/VS Code.exe diff --git a/portable/launchers_building/launchers_final_proposed/WinPython Command Prompt.exe b/winpython/portable/launchers_building/launchers_final_proposed/WinPython Command Prompt.exe similarity index 100% rename from portable/launchers_building/launchers_final_proposed/WinPython Command Prompt.exe rename to winpython/portable/launchers_building/launchers_final_proposed/WinPython Command Prompt.exe diff --git a/portable/launchers_building/launchers_final_proposed/WinPython Control Panel.exe b/winpython/portable/launchers_building/launchers_final_proposed/WinPython Control Panel.exe similarity index 100% rename from portable/launchers_building/launchers_final_proposed/WinPython Control Panel.exe rename to winpython/portable/launchers_building/launchers_final_proposed/WinPython Control Panel.exe diff --git a/portable/launchers_building/launchers_final_proposed/WinPython Control Panel_2025-05-09.exe b/winpython/portable/launchers_building/launchers_final_proposed/WinPython Control Panel_2025-05-09.exe similarity index 100% rename from portable/launchers_building/launchers_final_proposed/WinPython Control Panel_2025-05-09.exe rename to winpython/portable/launchers_building/launchers_final_proposed/WinPython Control Panel_2025-05-09.exe diff --git a/portable/launchers_building/launchers_final_proposed/WinPython Interpreter.exe b/winpython/portable/launchers_building/launchers_final_proposed/WinPython Interpreter.exe similarity index 100% rename from portable/launchers_building/launchers_final_proposed/WinPython Interpreter.exe rename to winpython/portable/launchers_building/launchers_final_proposed/WinPython Interpreter.exe diff --git a/portable/launchers_building/launchers_final_proposed/WinPython Powershell Prompt.exe b/winpython/portable/launchers_building/launchers_final_proposed/WinPython Powershell Prompt.exe similarity index 100% rename from portable/launchers_building/launchers_final_proposed/WinPython Powershell Prompt.exe rename to winpython/portable/launchers_building/launchers_final_proposed/WinPython Powershell Prompt.exe diff --git a/portable/launchers_building/launchers_final_proposed/license.txt b/winpython/portable/launchers_building/launchers_final_proposed/license.txt similarity index 100% rename from portable/launchers_building/launchers_final_proposed/license.txt rename to winpython/portable/launchers_building/launchers_final_proposed/license.txt diff --git a/portable/launchers_building/launchers_src/LICENSE b/winpython/portable/launchers_building/launchers_src/LICENSE similarity index 100% rename from portable/launchers_building/launchers_src/LICENSE rename to winpython/portable/launchers_building/launchers_src/LICENSE diff --git a/portable/launchers_building/launchers_src/build_one_launcher.bat b/winpython/portable/launchers_building/launchers_src/build_one_launcher.bat similarity index 100% rename from portable/launchers_building/launchers_src/build_one_launcher.bat rename to winpython/portable/launchers_building/launchers_src/build_one_launcher.bat diff --git a/portable/launchers_building/launchers_src/launcher_template_CONSOLE.cpp b/winpython/portable/launchers_building/launchers_src/launcher_template_CONSOLE.cpp similarity index 100% rename from portable/launchers_building/launchers_src/launcher_template_CONSOLE.cpp rename to winpython/portable/launchers_building/launchers_src/launcher_template_CONSOLE.cpp diff --git a/portable/launchers_building/launchers_src/launcher_template_WINDOWS.cpp b/winpython/portable/launchers_building/launchers_src/launcher_template_WINDOWS.cpp similarity index 100% rename from portable/launchers_building/launchers_src/launcher_template_WINDOWS.cpp rename to winpython/portable/launchers_building/launchers_src/launcher_template_WINDOWS.cpp diff --git a/portable/launchers_building/launchers_src_original/LICENSE b/winpython/portable/launchers_building/launchers_src_original/LICENSE similarity index 100% rename from portable/launchers_building/launchers_src_original/LICENSE rename to winpython/portable/launchers_building/launchers_src_original/LICENSE diff --git a/portable/launchers_building/launchers_src_original/build_one_launcher.bat b/winpython/portable/launchers_building/launchers_src_original/build_one_launcher.bat similarity index 100% rename from portable/launchers_building/launchers_src_original/build_one_launcher.bat rename to winpython/portable/launchers_building/launchers_src_original/build_one_launcher.bat diff --git a/portable/launchers_building/launchers_src_original/launcher_template_CONSOLE.cpp b/winpython/portable/launchers_building/launchers_src_original/launcher_template_CONSOLE.cpp similarity index 100% rename from portable/launchers_building/launchers_src_original/launcher_template_CONSOLE.cpp rename to winpython/portable/launchers_building/launchers_src_original/launcher_template_CONSOLE.cpp diff --git a/portable/launchers_building/launchers_src_original/launcher_template_WINDOWS.cpp b/winpython/portable/launchers_building/launchers_src_original/launcher_template_WINDOWS.cpp similarity index 100% rename from portable/launchers_building/launchers_src_original/launcher_template_WINDOWS.cpp rename to winpython/portable/launchers_building/launchers_src_original/launcher_template_WINDOWS.cpp diff --git a/portable/launchers_final/IDLE (Python GUI).exe b/winpython/portable/launchers_final/IDLE (Python GUI).exe similarity index 100% rename from portable/launchers_final/IDLE (Python GUI).exe rename to winpython/portable/launchers_final/IDLE (Python GUI).exe diff --git a/portable/launchers_final/Jupyter Lab.exe b/winpython/portable/launchers_final/Jupyter Lab.exe similarity index 100% rename from portable/launchers_final/Jupyter Lab.exe rename to winpython/portable/launchers_final/Jupyter Lab.exe diff --git a/portable/launchers_final/Jupyter Notebook.exe b/winpython/portable/launchers_final/Jupyter Notebook.exe similarity index 100% rename from portable/launchers_final/Jupyter Notebook.exe rename to winpython/portable/launchers_final/Jupyter Notebook.exe diff --git a/portable/launchers_final/Spyder reset.exe b/winpython/portable/launchers_final/Spyder reset.exe similarity index 100% rename from portable/launchers_final/Spyder reset.exe rename to winpython/portable/launchers_final/Spyder reset.exe diff --git a/portable/launchers_final/Spyder.exe b/winpython/portable/launchers_final/Spyder.exe similarity index 100% rename from portable/launchers_final/Spyder.exe rename to winpython/portable/launchers_final/Spyder.exe diff --git a/portable/launchers_final/VS Code.exe b/winpython/portable/launchers_final/VS Code.exe similarity index 100% rename from portable/launchers_final/VS Code.exe rename to winpython/portable/launchers_final/VS Code.exe diff --git a/portable/launchers_final/WinPython Command Prompt.exe b/winpython/portable/launchers_final/WinPython Command Prompt.exe similarity index 100% rename from portable/launchers_final/WinPython Command Prompt.exe rename to winpython/portable/launchers_final/WinPython Command Prompt.exe diff --git a/portable/launchers_final/WinPython Control Panel.exe b/winpython/portable/launchers_final/WinPython Control Panel.exe similarity index 100% rename from portable/launchers_final/WinPython Control Panel.exe rename to winpython/portable/launchers_final/WinPython Control Panel.exe diff --git a/portable/launchers_final/WinPython Interpreter.exe b/winpython/portable/launchers_final/WinPython Interpreter.exe similarity index 100% rename from portable/launchers_final/WinPython Interpreter.exe rename to winpython/portable/launchers_final/WinPython Interpreter.exe diff --git a/portable/launchers_final/WinPython Powershell Prompt.exe b/winpython/portable/launchers_final/WinPython Powershell Prompt.exe similarity index 100% rename from portable/launchers_final/WinPython Powershell Prompt.exe rename to winpython/portable/launchers_final/WinPython Powershell Prompt.exe diff --git a/portable/launchers_final/license.txt b/winpython/portable/launchers_final/license.txt similarity index 100% rename from portable/launchers_final/license.txt rename to winpython/portable/launchers_final/license.txt diff --git a/portable/launchers_final/notebooks/docs/README.txt b/winpython/portable/launchers_final/notebooks/docs/README.txt similarity index 100% rename from portable/launchers_final/notebooks/docs/README.txt rename to winpython/portable/launchers_final/notebooks/docs/README.txt diff --git a/portable/launchers_final/scripts/WinPythonIni.py b/winpython/portable/launchers_final/scripts/WinPythonIni.py similarity index 100% rename from portable/launchers_final/scripts/WinPythonIni.py rename to winpython/portable/launchers_final/scripts/WinPythonIni.py diff --git a/portable/launchers_final/scripts/WinPython_PS_Prompt.ps1 b/winpython/portable/launchers_final/scripts/WinPython_PS_Prompt.ps1 similarity index 100% rename from portable/launchers_final/scripts/WinPython_PS_Prompt.ps1 rename to winpython/portable/launchers_final/scripts/WinPython_PS_Prompt.ps1 diff --git a/portable/launchers_final/scripts/activate.bat b/winpython/portable/launchers_final/scripts/activate.bat similarity index 100% rename from portable/launchers_final/scripts/activate.bat rename to winpython/portable/launchers_final/scripts/activate.bat diff --git a/portable/launchers_final/scripts/cmd.bat b/winpython/portable/launchers_final/scripts/cmd.bat similarity index 100% rename from portable/launchers_final/scripts/cmd.bat rename to winpython/portable/launchers_final/scripts/cmd.bat diff --git a/portable/launchers_final/scripts/cmd_ps.bat b/winpython/portable/launchers_final/scripts/cmd_ps.bat similarity index 100% rename from portable/launchers_final/scripts/cmd_ps.bat rename to winpython/portable/launchers_final/scripts/cmd_ps.bat diff --git a/portable/launchers_final/scripts/env.bat b/winpython/portable/launchers_final/scripts/env.bat similarity index 100% rename from portable/launchers_final/scripts/env.bat rename to winpython/portable/launchers_final/scripts/env.bat diff --git a/portable/launchers_final/scripts/env_for_icons.bat b/winpython/portable/launchers_final/scripts/env_for_icons.bat similarity index 100% rename from portable/launchers_final/scripts/env_for_icons.bat rename to winpython/portable/launchers_final/scripts/env_for_icons.bat diff --git a/portable/launchers_final/scripts/make_working_directory_and_userprofile_be_winpython.bat b/winpython/portable/launchers_final/scripts/make_working_directory_and_userprofile_be_winpython.bat similarity index 100% rename from portable/launchers_final/scripts/make_working_directory_and_userprofile_be_winpython.bat rename to winpython/portable/launchers_final/scripts/make_working_directory_and_userprofile_be_winpython.bat diff --git a/portable/launchers_final/scripts/make_working_directory_be_not_winpython.bat b/winpython/portable/launchers_final/scripts/make_working_directory_be_not_winpython.bat similarity index 100% rename from portable/launchers_final/scripts/make_working_directory_be_not_winpython.bat rename to winpython/portable/launchers_final/scripts/make_working_directory_be_not_winpython.bat diff --git a/portable/launchers_final/scripts/make_working_directory_be_winpython.bat b/winpython/portable/launchers_final/scripts/make_working_directory_be_winpython.bat similarity index 100% rename from portable/launchers_final/scripts/make_working_directory_be_winpython.bat rename to winpython/portable/launchers_final/scripts/make_working_directory_be_winpython.bat diff --git a/portable/launchers_final/scripts/python.bat b/winpython/portable/launchers_final/scripts/python.bat similarity index 100% rename from portable/launchers_final/scripts/python.bat rename to winpython/portable/launchers_final/scripts/python.bat diff --git a/portable/launchers_final/scripts/readme.txt b/winpython/portable/launchers_final/scripts/readme.txt similarity index 100% rename from portable/launchers_final/scripts/readme.txt rename to winpython/portable/launchers_final/scripts/readme.txt diff --git a/portable/launchers_final/scripts/spyder_reset.bat b/winpython/portable/launchers_final/scripts/spyder_reset.bat similarity index 100% rename from portable/launchers_final/scripts/spyder_reset.bat rename to winpython/portable/launchers_final/scripts/spyder_reset.bat diff --git a/portable/launchers_final/scripts/upgrade_pip.bat b/winpython/portable/launchers_final/scripts/upgrade_pip.bat similarity index 100% rename from portable/launchers_final/scripts/upgrade_pip.bat rename to winpython/portable/launchers_final/scripts/upgrade_pip.bat diff --git a/portable/launchers_final/scripts/winidle.bat b/winpython/portable/launchers_final/scripts/winidle.bat similarity index 100% rename from portable/launchers_final/scripts/winidle.bat rename to winpython/portable/launchers_final/scripts/winidle.bat diff --git a/portable/launchers_final/scripts/winipython_notebook.bat b/winpython/portable/launchers_final/scripts/winipython_notebook.bat similarity index 100% rename from portable/launchers_final/scripts/winipython_notebook.bat rename to winpython/portable/launchers_final/scripts/winipython_notebook.bat diff --git a/portable/launchers_final/scripts/winjupyter_lab.bat b/winpython/portable/launchers_final/scripts/winjupyter_lab.bat similarity index 100% rename from portable/launchers_final/scripts/winjupyter_lab.bat rename to winpython/portable/launchers_final/scripts/winjupyter_lab.bat diff --git a/portable/launchers_final/scripts/winpython.bat b/winpython/portable/launchers_final/scripts/winpython.bat similarity index 100% rename from portable/launchers_final/scripts/winpython.bat rename to winpython/portable/launchers_final/scripts/winpython.bat diff --git a/portable/launchers_final/scripts/winspyder.bat b/winpython/portable/launchers_final/scripts/winspyder.bat similarity index 100% rename from portable/launchers_final/scripts/winspyder.bat rename to winpython/portable/launchers_final/scripts/winspyder.bat diff --git a/portable/launchers_final/scripts/winvscode.bat b/winpython/portable/launchers_final/scripts/winvscode.bat similarity index 100% rename from portable/launchers_final/scripts/winvscode.bat rename to winpython/portable/launchers_final/scripts/winvscode.bat diff --git a/portable/launchers_final/scripts/wpcp.bat b/winpython/portable/launchers_final/scripts/wpcp.bat similarity index 100% rename from portable/launchers_final/scripts/wpcp.bat rename to winpython/portable/launchers_final/scripts/wpcp.bat From 1a145347a3cc66bc86c93dceceaa0c77d81153d7 Mon Sep 17 00:00:00 2001 From: stonebig Date: Sun, 27 Jul 2025 11:51:30 +0200 Subject: [PATCH 290/305] remove make.py as it is displaced --- make.py | 174 -------------------------------------------------------- 1 file changed, 174 deletions(-) delete mode 100644 make.py diff --git a/make.py b/make.py deleted file mode 100644 index 786b640a..00000000 --- a/make.py +++ /dev/null @@ -1,174 +0,0 @@ -# -*- coding: utf-8 -*- -# -# WinPython build script -# Copyright © 2012 Pierre Raybaut -# Copyright © 2014-2025+ The Winpython development team https://github.com/winpython/ -# Licensed under the terms of the MIT License -# (see wppm/__init__.py for details) - -import os -import re -import shutil -from pathlib import Path -from wppm import wppm, utils - -PORTABLE_DIRECTORY = Path(__file__).parent / "portable" -assert PORTABLE_DIRECTORY.is_dir(), f"Portable directory not found: {PORTABLE_DIRECTORY}" - -def copy_items(source_directories: list[Path], target_directory: Path, verbose: bool = False): - """Copies items from source directories to the target directory.""" - target_directory.mkdir(parents=True, exist_ok=True) - for source_dir in source_directories: - if not source_dir.is_dir(): - print(f"Warning: Source directory not found: {source_dir}") - continue - for source_item in source_dir.iterdir(): - target_item = target_directory / source_item.name - copy_function = shutil.copytree if source_item.is_dir() else shutil.copy2 - try: - copy_function(source_item, target_item) - if verbose: - print(f"Copied: {source_item} -> {target_item}") - except Exception as e: - print(f"Error copying {source_item} to {target_item}: {e}") - -def parse_list_argument(argument_value: str | list[str], separator=" ") -> list[str]: - """Parse a separated list argument into a list of strings.""" - if not argument_value: return [] - return argument_value.split(separator) if isinstance(argument_value, str) else list(argument_value) - -class WinPythonDistributionBuilder: - """Builds a WinPython distribution.""" - - def __init__(self, build_number: int, release_level: str, basedir_wpy: Path, - source_dirs: Path, tools_directories: list[Path] = None, - verbose: bool = False, flavor: str = ""): - """ - Initializes the WinPythonDistributionBuilder. - Args: - build_number: The build number (integer). - release_level: The release level (e.g., "beta", ""). - basedir_wpy: top directory of the build (c:\...\Wpy...) - source_dirs: Directory containing wheel files for packages. - tools_directories: List of directories containing development tools to include. - verbose: Enable verbose output. - flavor: WinPython flavor (e.g., "Barebone"). - """ - self.build_number = build_number - self.release_level = release_level - self.winpython_directory = Path(basedir_wpy) - self.target_directory = self.winpython_directory.parent - self.source_dirs = Path(source_dirs) - self.tools_directories = tools_directories or [] - self.verbose = verbose - self.distribution: wppm.Distribution | None = None - self.flavor = flavor - self.python_zip_file: Path = self._get_python_zip_file() - self.python_name = self.python_zip_file.stem - self.python_directory_name = "python" - - def _get_python_zip_file(self) -> Path: - """Finds the Python .zip file in the wheels directory.""" - for source_item in self.source_dirs.iterdir(): - if re.match(r"(pypy3|python-).*\.zip", source_item.name): - return source_item - raise RuntimeError(f"Could not find Python zip package in {self.source_dirs}") - - @property - def winpython_version_name(self) -> str: - """Returns the full WinPython version string.""" - return f"{self.python_full_version}.{self.build_number}{self.flavor}{self.release_level}" - - @property - def python_full_version(self) -> str: - """Retrieves the Python full version string from the distribution.""" - return utils.get_python_long_version(self.distribution.target) if self.distribution else "0.0.0" - - def _print_action(self, text: str): - """Prints an action message with progress indicator.""" - utils.print_box(text) if self.verbose else print(f"{text}...", end="", flush=True) - - def _extract_python_archive(self): - """Extracts the Python zip archive to create the base Python environment.""" - self._print_action("Extracting Python archive") - utils.extract_archive(self.python_zip_file, self.winpython_directory) - # Relocate to /python subfolder if needed (for newer structure) #2024-12-22 to /python - expected_python_directory = self.winpython_directory / self.python_directory_name - if self.python_directory_name != self.python_name and not expected_python_directory.is_dir(): - os.rename(self.winpython_directory / self.python_name, expected_python_directory) - - def _copy_essential_files(self): - """Copies pre-made objects""" - self._print_action("Copying launchers") - copy_items([PORTABLE_DIRECTORY / "launchers_final"], self.winpython_directory, self.verbose) - - tools_target_directory = self.winpython_directory / "t" - self._print_action(f"Copying tools to {tools_target_directory}") - copy_items(self.tools_directories, tools_target_directory, self.verbose) - - def _create_env_config(self): - """Creates environment setup""" - executable_name = self.distribution.short_exe if self.distribution else "python.exe" - config = { - "WINPYthon_exe": executable_name, - "WINPYthon_subdirectory_name": self.python_directory_name, - "WINPYVER": self.winpython_version_name, - "WINPYVER2": f"{self.python_full_version}.{self.build_number}", - "WINPYFLAVOR": self.flavor, - "WINPYARCH": self.distribution.architecture if self.distribution else 64, - } - env_path = self.winpython_directory / "scripts" / "env.ini" - env_path.parent.mkdir(parents=True, exist_ok=True) - self._print_action(f"Creating env.ini environment {env_path}") - env_path.write_text("\n".join(f"{k}={v}" for k, v in config.items())) - - def build(self): - """Make or finalise WinPython distribution in the target directory""" - print(f"Building WinPython with Python archive: {self.python_zip_file.name}") - self._print_action(f"Creating WinPython {self.winpython_directory} base directory") - if self.winpython_directory.is_dir() and len(self.winpython_directory.parts)>=4: - shutil.rmtree(self.winpython_directory) - # preventive re-Creation of settings directory - (self.winpython_directory / "settings" / "AppData" / "Roaming").mkdir(parents=True, exist_ok=True) - - self._extract_python_archive() - self.distribution = wppm.Distribution(self.winpython_directory / self.python_directory_name, verbose=self.verbose) - self._copy_essential_files() - self._create_env_config() - -def make_all(build_number: int, release_level: str, basedir_wpy: Path = None, - source_dirs: Path = None, toolsdirs: str | list[Path] = None, - verbose: bool = False, flavor: str = ""): - """ - Make a WinPython distribution for a given set of parameters: - Args: - build_number: build number [int] - release_level: release level (e.g. 'beta1', '') [str] - basedir_wpy: top directory of the build (c:\...\Wpy...) - verbose: Enable verbose output (bool). - flavor: WinPython flavor (str). - source_dirs: the python.zip - toolsdirs: Directory with development tools r'D:\WinPython\basedir34\t.Slim' - """ - assert basedir_wpy is not None, "The *winpython_dirname* directory must be specified" - - tools_directories = [Path(d) for d in parse_list_argument(toolsdirs, ",")] - utils.print_box(f"Making WinPython at {basedir_wpy}") - os.makedirs(basedir_wpy, exist_ok=True) - - builder = WinPythonDistributionBuilder( - build_number, release_level, Path(basedir_wpy), - verbose=verbose, flavor=flavor, - source_dirs=source_dirs, tools_directories=tools_directories) - builder.build() - -if __name__ == "__main__": - make_all( - build_number=1, - release_level="b3", - basedir_wpy=r"D:\WinPython\bd314\budot\WPy64-31401b3", - verbose=True, - flavor="dot", - source_dirs=r"D:\WinPython\bd314\packages.win-amd64", - toolsdirs=r"D:\WinPython\bd314\t.Slim", - ) From d75ade96329b5c5e555310b1d1f3d2e454d59e95 Mon Sep 17 00:00:00 2001 From: stonebig Date: Sun, 27 Jul 2025 12:05:07 +0200 Subject: [PATCH 291/305] add competing pythonic replacement for generate_a_winpython.bat from 200 lines up to 350 lines, so not yet lean, but goal was to be "on par" first --- generate_a_winpython_distropy.bat | 38 ++++ winpython/build_winpython.py | 306 ++++++++++++++++++++++++++++++ 2 files changed, 344 insertions(+) create mode 100644 generate_a_winpython_distropy.bat create mode 100644 winpython/build_winpython.py diff --git a/generate_a_winpython_distropy.bat b/generate_a_winpython_distropy.bat new file mode 100644 index 00000000..6099115d --- /dev/null +++ b/generate_a_winpython_distropy.bat @@ -0,0 +1,38 @@ +rem generate_a_winpython_distropy.bat: to be launched with a winpython sub-directory +rem where 'build_winpython.py' and 'make.py' are +@echo on + +REM === Initialize default values === +if not defined my_release_level set "my_release_level=b1" +if not defined my_create_installer set "my_create_installer=True" +if not defined my_constraints set "my_constraints=C:\WinP\constraints.txt" +if not defined target_python_exe set "target_python_exe=python.exe" +if not defined mandatory_requirements set "mandatory_requirements=%~dp0mandatory_requirements.txt" + +set "my_archive_dir=%~dp0WinPython_build_logs" +if not exist "%my_archive_dir%" mkdir "%my_archive_dir%" + +REM === Format log timestamp === +set "my_time=%time:~0,5%" +set "my_time=%my_time::=_%" +set "my_time=%my_time: =0%" + +set "my_archive_log=%my_archive_dir%\build_%my_pyver%_%my_release%%my_flavor%_%my_release_level%_of_%date:/=-%at_%my_time%.txt" + +REM === Define base build and distribution paths === +set "my_basedir=%my_root_dir_for_builds%\bd%my_python_target%" +set "my_WINPYDIRBASE=%my_basedir%\bu%my_flavor%\WPy%my_arch%-%my_python_target_release%%my_release%%my_release_level%" + +rem a building env need is a Python with packages: WinPython + build + flit + packaging + mkshim400.py +set "my_buildenv=C:\WinPdev\WPy64-310111" +set "my_buildenvi=C:\WinPdev\WPy64-310111\python-3.10.11.amd64" +set "my_python_exe=C:\WinPdev\WPy64-310111\python-3.10.11.amd64\python.exe" + +if "%my_requirements_pre%" == "" set "my_requirements_pre=%mandatory_requirements%" +set "my_requirements_pre=%mandatory_requirements%" + +cd/d %~dp0 +echo %my_python_exe% -m winpython.build_winpython --buildenv %my_buildenvi% --python-target %my_python_target% --release %my_release% --release-level %my_release_level% --winpydirbase %my_WINPYDIRBASE% --flavor %my_flavor% --source_dirs %my_source_dirs% --tools_dirs %my_toolsdirs% --log-dir %~dp0WinPython_build_logs --mandatory-req %mandatory_requirements% --pre-req %my_requirements_pre% --requirements %my_requirements% --constraints %my_constraints% --find-links %my_find_links% --wheelhousereq "%wheelhousereq%" --create-installer "%my_create_installer%" +%my_python_exe% -m winpython.build_winpython --buildenv %my_buildenvi% --python-target %my_python_target% --release %my_release% --release-level %my_release_level% --winpydirbase %my_WINPYDIRBASE% --flavor %my_flavor% --source_dirs %my_source_dirs% --tools_dirs %my_toolsdirs% --log-dir %~dp0WinPython_build_logs --mandatory-req %mandatory_requirements% --pre-req %my_requirements_pre% --requirements %my_requirements% --constraints %my_constraints% --find-links %my_find_links% --wheelhousereq "%wheelhousereq%" --create-installer "%my_create_installer%" +pause +exit diff --git a/winpython/build_winpython.py b/winpython/build_winpython.py new file mode 100644 index 00000000..6afef268 --- /dev/null +++ b/winpython/build_winpython.py @@ -0,0 +1,306 @@ +# build_winpython.py +import os, sys, argparse, datetime, subprocess, shutil +from pathlib import Path + +# --- logging, helpers (same as Step 2) --- +def log_section(logfile, message): + ts = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S") + section = f"\n{'-'*40}\n({ts}) {message}\n{'-'*40}\n" + print(section); open(logfile, 'a', encoding='utf-8').write(section) + +# --- Helpers --- +def get_target_release(python_target): + mapping = { + '311': ('3119', '2'), + '312': ('31210', '2'), + '313': ('3135', '1'), + '314': ('3140', '1') + } + return mapping.get(python_target, (None, None)) + +def delete_folder_if_exists(folder: Path,check_flavor: str=""): + check_last = folder.parent.name if not folder.is_dir() else folder.name + if folder.exists() and folder.is_dir() and check_last=="bu" + check_flavor: + print ("hello", folder) + folder_old = Path(str(folder)+'.old') + if folder_old.exists(): + shutil.rmtree(Path(str(folder)+'.old')) + os.rename(folder, folder_old) + shutil.rmtree(Path(str(folder)+'.old')) + return + for item in folder_old: + if item.is_dir(): + pass + # delete_folder_if_exists(item) + else: + pass + # item.unlink() + # folder.rmdir() + +def activate_env(env_path): + # Windows-specific virtual env activation + env_script = Path(env_path) / "scripts" / "env.bat" + if not env_script.exists(): + raise FileNotFoundError(f"Cannot find env.bat at {env_script}") + # Note: This step is simplified here. Full environment activation logic will be added later. + + +def run_make_py(build_python, winpydirbase, args, logfile): + cmd = [ + build_python, "-c", + ( + "from wppm import make; " + f"make.make_all({args.release}, '{args.release_level}', basedir_wpy=r'{winpydirbase}', " + f"verbose=True, flavor='{args.flavor}', source_dirs=r'{args.source_dirs}', " + f"toolsdirs=r'{args.tools_dirs}')" #, portable_dir=r'{args.portable_dir}')" + ) + ] + print(cmd) + from . import make + make.make_all( args.release , args.release_level , basedir_wpy= winpydirbase , + verbose=True, flavor= args.flavor , source_dirs= args.source_dirs , + toolsdirs= args.tools_dirs) #, portable_dir= args.portable_dir ) + #subprocess.run(cmd, stdout=open(logfile, 'a'), stderr=subprocess.STDOUT, check=True) + +def pip_install(python_exe: Path, req_file: str, constraints: str, find_links: str, logfile: Path, label: str): + if req_file and Path(req_file).exists(): + cmd = [ + str(python_exe), "-m", "pip", "install", + "-r", req_file, "-c", constraints, + "--pre", "--no-index", f"--find-links={find_links}" + ] + log_section(logfile, f"Pip‑install {label}") + subprocess.run(cmd, stdout=open(logfile, 'a'), stderr=subprocess.STDOUT, check=True) + else: + log_section(logfile, f"No {label} specified/skipped") + +def run_command(cmd, env=None, log_file=None): + print(f"[RUN] {cmd}") + with subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, env=env, universal_newlines=True) as proc: + for line in proc.stdout: + print(line, end="") + if log_file: + with open(log_file, "a", encoding="utf-8") as logf: + logf.write(line) + +def patch_winpython(python_exe: Path, logfile: Path): + cmd = [str(python_exe), "-c" , + ( + "from wppm import wppm;" + "wppm.Distribution().patch_standard_packages('', to_movable=True)" + )] + print(cmd) + subprocess.run(cmd, stdout=open(logfile, 'a'), stderr=subprocess.STDOUT, check=True) + #run_command(f'{activate_env(WINPYDIRBASE)} python -c "from wppm import wppm; wppm.Distribution(r\'{WINPYDIRBASE}\').patch_standard_packages(\'\', to_movable=True)"') + + +def check_env_bat(winpydirbase: Path): + envbat = winpydirbase / "scripts" / "env.bat" + if not envbat.exists(): + raise FileNotFoundError(f"Missing env.bat at {envbat}") + +def generate_lockfiles(target_python: Path, winpydirbase: Path, constraints: str, find_links: str, logfile: Path, file_postfix: str): + pip_req = winpydirbase.parent / "requirement_temp.txt" + with subprocess.Popen([str(target_python), "-m", "pip", "freeze"], stdout=subprocess.PIPE) as proc: + packages = [l for l in proc.stdout if b"winpython" not in l] + pip_req.write_bytes(b"".join(packages)) + # Lock to web and local (scaffolding) + # if local --no-index --trusted-host=None --find-links="%my_find_links%" + for kind in ("", "local"): + out = winpydirbase.parent / f"pylock.{file_postfix}_{kind}.toml" + outreq = winpydirbase.parent / f"requir.{file_postfix}_{kind}.txt" + print( + [str(target_python), "-m", "pip", "lock", "--no-deps", "-c", constraints] + + (["--find-links",find_links] if kind =="local" else []) + + ["-r", str(pip_req), "-o", str(out)] + ) + subprocess.run( + [str(target_python), "-m", "pip", "lock", "--no-deps", "-c", constraints] + + (["--find-links",find_links] if kind =="local" else []) + + ["-r", str(pip_req), "-o", str(out)], + stdout=open(logfile, 'a'), stderr=subprocess.STDOUT, check=True + ) + # Convert both locks to requirement.txt with hash256 + cmd = f"from wppm import wheelhouse as wh; wh.pylock_to_req(r'{out}', r'{outreq}')" + print( + [str(target_python), "-c", cmd] + ) + subprocess.run( + [str(target_python), "-c", cmd], + stdout=open(logfile, 'a'), stderr=subprocess.STDOUT, check=False + ) + # check equality + from filecmp import cmp + web, local = "", "local" + if not cmp(winpydirbase.parent / f"requir.{file_postfix}_{web}.txt", winpydirbase.parent / f"requir.{file_postfix}_{local}.txt"): + print("ALARM differences in ", winpydirbase.parent / f"requir.{file_postfix}_{web}.txt", winpydirbase.parent / f"requir.{file_postfix}_{local}.txt") + raise os.error + else: + print ("match ok ",winpydirbase.parent / f"requir.{file_postfix}_{web}.txt", winpydirbase.parent / f"requir.{file_postfix}_{local}.txt") + +# --- main --- +def main(): + parser = argparse.ArgumentParser() + + parser.add_argument('--python-target', required=True, help='Target Python version, e.g. 311') + parser.add_argument('--release', default='', help='Release') + parser.add_argument('--flavor', default='', help='Build flavor') + parser.add_argument('--arch', default='64', help='Architecture') + + parser.add_argument('--release-level', default='b1', help='Release level (e.g., b1, rc)') + parser.add_argument('--winpydirbase', required=True, help='Path to put environment') + parser.add_argument('--source_dirs', required=True, help='Path to directory with python zip') + + parser.add_argument('--tools_dirs', required=True, help='Path to directory with python zip') + #parser.add_argument('--portable_dir', required=True, help='Path to normal make.py') + + parser.add_argument('--buildenv', required=True, help='Path to build environment') + parser.add_argument('--constraints', default='constraints.txt', help='Constraints file') + parser.add_argument('--requirements', help='Main requirements.txt file') + parser.add_argument('--find-links', default='wheelhouse', help='Path to local wheelhouse') + parser.add_argument('--log-dir', default='WinPython_build_logs', help='Directory for logs') + parser.add_argument('--mandatory-req', help='Mandatory requirements file') + parser.add_argument('--pre-req', help='Pre requirements file') + parser.add_argument('--wheelhousereq', help='Wheelhouse requirements file') + parser.add_argument('--create-installer', default='', help='default installer to create') + args = parser.parse_args() + + # compute paths (same as Step2)... + build_python = Path(args.buildenv) / "python.exe" + winpydirbase = Path(args.winpydirbase) # from Step2 logic + target_python = winpydirbase / "python" / "python.exe" + + # Setup paths and logs + now = datetime.datetime.now() + log_dir = Path(args.log_dir) + log_dir.mkdir(exist_ok=True) + time_str = now.strftime("%Y-%m-%d_at_%H%M") + log_file = log_dir / f"build_{args.python_target}_{args.flavor}_{args.release_level}_{time_str}.txt" + + #logs termination + z = Path(winpydirbase).name[(4+len(args.arch)):-len(args.release_level)] + tada = f"{z[:1]}_{z[1:3]}_{z[3]}_{args.release}" + winpyver2 = tada.replace('_','.') + file_postfix=f"{args.arch}-{args.python_target[:1]}_{args.python_target[1:]}_{args.release}{args.flavor}{args.release_level}" + file_postfix=f"{args.arch}-{tada}{args.flavor}{args.release_level}" + + log_section(log_file, f"Preparing build for Python {args.python_target} ({args.arch}-bit)") + + log_section(log_file, f"🙏 Step 0: displace old {Path(winpydirbase)}") + # O) Pre-clear + + #delete_folder_if_exists(Path(winpydirbase)) + delete_folder_if_exists(winpydirbase.parent, check_flavor=args.flavor) #bu{flavor]} + + log_section(log_file, f"🙏 Step 1: make.py Python with {str(build_python)} at ({winpydirbase}") + # 1) run make.py + run_make_py(str(build_python), winpydirbase, args, log_file) + + # 2) env.bat exists + check_env_bat(winpydirbase) + + # 3) pip install in built environment + log_section(log_file, "🙏 Step 3: install requirements") + + for label, req in [ + ("Mandatory", args.mandatory_req), + ("Pre", args.pre_req), + ("Main", args.requirements), + ]: + pip_install(target_python, req, args.constraints, args.find_links, log_file, label) + + # 4) patch Winpython + log_section(log_file, "🙏 Step 4: Patch Winpython") + patch_winpython(target_python, log_file) + + # 5) Install Wheelhouse + if args.wheelhousereq: + log_section(log_file, f"🙏 Step 5: install wheelhouse requirements {args.wheelhousereq}") + wheelhousereq = Path(args.wheelhousereq) + kind = "local" + out = winpydirbase.parent / f"pylock.{file_postfix}_wheels{kind}.toml" + outreq = winpydirbase.parent / f"requir.{file_postfix}_wheels{kind}.txt" + if wheelhousereq.is_file(): + # Generate pylock from wheelhousereq + cmd = [str(target_python), "-m" , "pip", "lock","--no-index", "--trusted-host=None", + "--find-links", args.find_links, "-c", args.constraints, "-r", wheelhousereq, + "-o", out ] + subprocess.run(cmd, stdout=open(log_file, 'a'), stderr=subprocess.STDOUT, check=True) + # Convert pylock to requirements with hash + cmd = f"from wppm import wheelhouse as wh; wh.pylock_to_req(r'{out}', r'{outreq}')" + print( [str(target_python), "-c", cmd] ) + subprocess.run([str(target_python), "-c", cmd], + stdout=open(log_file, 'a'), stderr=subprocess.STDOUT, check=False + ) + + kind = "" + outw = winpydirbase.parent / f"pylock.{file_postfix}_wheels{kind}.toml" + outreqw = winpydirbase.parent / f"requir.{file_postfix}_wheels{kind}.txt" + # Generate web pylock from local frozen hashes + cmd = [str(target_python), "-m" , "pip", "lock","--no-deps", "--require-hashes", + "-r", str(outreq), "-o", str(outw) ] + subprocess.run(cmd, stdout=open(log_file, 'a'), stderr=subprocess.STDOUT, check=True) + cmd = f"from wppm import wheelhouse as wh; wh.pylock_to_req(r'{outw}', r'{outreqw}')" + print( [str(target_python), "-c", cmd] ) + subprocess.run([str(target_python), "-c", cmd], + stdout=open(log_file, 'a'), stderr=subprocess.STDOUT, check=False + ) + + # Use wppm to download local from req made with web hashes + wheelhouse = winpydirbase / "wheelhouse" / "included.wheels" + cmd = [str(target_python), "-X", "utf8", "-m", "wppm", str(out), "-ws", args.find_links, + "-wd", str(wheelhouse) + ] + print(cmd) + subprocess.run(cmd, stdout=open(log_file, 'a'), stderr=subprocess.STDOUT, check=False) + + + + # 6) lock files + log_section(log_file, "🙏 Step 6: install lockfiles") + print(target_python, winpydirbase, args.constraints, args.find_links, log_file) + print(' - - -') + generate_lockfiles(target_python, winpydirbase, args.constraints, args.find_links, log_file, file_postfix) + + # 5b) Archive lock files + + # 6) generate changelog + mdn = f"WinPython{args.flavor}-{args.arch}bit-{winpyver2}.md" + out = f"WinPython{args.flavor}-{args.arch}bit-{winpyver2}_History.md" + changelog_dir = log_dir.parent/ "changelogs" + + log_section(log_file, f"🙏 Step 6: generate changelog {mdn}") + + cmd = ["set", f"WINPYVER2={winpyver2}&", "set", f"WINPYFLAVOR={args.flavor}&", + "set", f"WINPYVER={winpyver2}{args.flavor}{args.release_level}&", + str(target_python), "-c" , + ( + "from wppm import wppm;" + "result = wppm.Distribution().generate_package_index_markdown();" + f"open(r'{winpydirbase.parent / mdn}', 'w', encoding='utf-8').write(result)" + )] + print(cmd) + subprocess.run(cmd, stdout=open(log_file, 'a'), stderr=subprocess.STDOUT, check=True, shell=True) + shutil.copyfile (winpydirbase.parent / mdn, changelog_dir / mdn) + + cmd = [str(target_python), "-c", + ( + "from wppm import diff;" + f"result = diff.compare_package_indexes('{winpyver2}', searchdir=r'{log_dir}', flavor=r'{args.flavor}', architecture={args.arch});" + f"open(r'{winpydirbase.parent / out}', 'w', encoding='utf-8').write(result)" + )] + subprocess.run(cmd, stdout=open(log_file, 'a'), stderr=subprocess.STDOUT, check=True) + shutil.copyfile (winpydirbase.parent / out, changelog_dir / out) + log_section(log_file, "✅ Step 6 complete") + + # 7) Create Installers + if args.create_installer != "": + log_section(log_file, "🙏 Step 7 Create Installer") + stem = f"WinPython{args.arch}-{winpyver2}{args.flavor}{args.release_level}" + cmd = f"from wppm import utils; utils.command_installer_7zip(r'{winpydirbase}', r'{winpydirbase.parent}', r'{stem}', r'{args.create_installer}')" + print( [str(target_python), "-c", cmd] ) + subprocess.run([str(target_python), "-c", cmd], + stdout=open(log_file, 'a'), stderr=subprocess.STDOUT, check=False) + +if __name__ == '__main__': + main() From 8288cb28894b87447d4e69572cb93d514a0656d2 Mon Sep 17 00:00:00 2001 From: stonebig Date: Sun, 27 Jul 2025 14:24:58 +0200 Subject: [PATCH 292/305] fix changelog_dir and my_release miss, simplify code a bit --- generate_a_winpython_distropy.bat | 8 +- winpython/build_winpython.py | 149 +++++++++++------------------- 2 files changed, 58 insertions(+), 99 deletions(-) diff --git a/generate_a_winpython_distropy.bat b/generate_a_winpython_distropy.bat index 6099115d..0e8c37d7 100644 --- a/generate_a_winpython_distropy.bat +++ b/generate_a_winpython_distropy.bat @@ -17,7 +17,11 @@ set "my_time=%time:~0,5%" set "my_time=%my_time::=_%" set "my_time=%my_time: =0%" -set "my_archive_log=%my_archive_dir%\build_%my_pyver%_%my_release%%my_flavor%_%my_release_level%_of_%date:/=-%at_%my_time%.txt" +REM === Determine Python target version === +if "%my_python_target%"=="311" (set "my_python_target_release=3119" & set "my_release=2") +if "%my_python_target%"=="312" (set "my_python_target_release=31210" & set "my_release=2") +if "%my_python_target%"=="313" (set "my_python_target_release=3135" & set "my_release=1") +if "%my_python_target%"=="314" (set "my_python_target_release=3140" & set "my_release=1") REM === Define base build and distribution paths === set "my_basedir=%my_root_dir_for_builds%\bd%my_python_target%" @@ -33,6 +37,6 @@ set "my_requirements_pre=%mandatory_requirements%" cd/d %~dp0 echo %my_python_exe% -m winpython.build_winpython --buildenv %my_buildenvi% --python-target %my_python_target% --release %my_release% --release-level %my_release_level% --winpydirbase %my_WINPYDIRBASE% --flavor %my_flavor% --source_dirs %my_source_dirs% --tools_dirs %my_toolsdirs% --log-dir %~dp0WinPython_build_logs --mandatory-req %mandatory_requirements% --pre-req %my_requirements_pre% --requirements %my_requirements% --constraints %my_constraints% --find-links %my_find_links% --wheelhousereq "%wheelhousereq%" --create-installer "%my_create_installer%" -%my_python_exe% -m winpython.build_winpython --buildenv %my_buildenvi% --python-target %my_python_target% --release %my_release% --release-level %my_release_level% --winpydirbase %my_WINPYDIRBASE% --flavor %my_flavor% --source_dirs %my_source_dirs% --tools_dirs %my_toolsdirs% --log-dir %~dp0WinPython_build_logs --mandatory-req %mandatory_requirements% --pre-req %my_requirements_pre% --requirements %my_requirements% --constraints %my_constraints% --find-links %my_find_links% --wheelhousereq "%wheelhousereq%" --create-installer "%my_create_installer%" +%my_python_exe% -m winpython.build_winpython --buildenv %my_buildenvi% --python-target %my_python_target% --release %my_release% --release-level %my_release_level% --winpydirbase %my_WINPYDIRBASE% --flavor %my_flavor% --source_dirs %my_source_dirs% --tools_dirs %my_toolsdirs% --log-dir %~dp0WinPython_build_logs --mandatory-req %mandatory_requirements% --pre-req %my_requirements_pre% --requirements %my_requirements% --constraints %my_constraints% --find-links %my_find_links% --wheelhousereq "%wheelhousereq%" --create-installer "%my_create_installer%" pause exit diff --git a/winpython/build_winpython.py b/winpython/build_winpython.py index 6afef268..b2377e59 100644 --- a/winpython/build_winpython.py +++ b/winpython/build_winpython.py @@ -2,65 +2,43 @@ import os, sys, argparse, datetime, subprocess, shutil from pathlib import Path -# --- logging, helpers (same as Step 2) --- +# --- Logging --- def log_section(logfile, message): ts = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S") section = f"\n{'-'*40}\n({ts}) {message}\n{'-'*40}\n" - print(section); open(logfile, 'a', encoding='utf-8').write(section) - -# --- Helpers --- -def get_target_release(python_target): - mapping = { - '311': ('3119', '2'), - '312': ('31210', '2'), - '313': ('3135', '1'), - '314': ('3140', '1') - } - return mapping.get(python_target, (None, None)) - -def delete_folder_if_exists(folder: Path,check_flavor: str=""): + print(section) + with open(logfile, 'a', encoding='utf-8') as f: + f.write(section) + + +# --- Utility Functions --- + +def delete_folder_if_exists(folder: Path, check_flavor: str = ""): check_last = folder.parent.name if not folder.is_dir() else folder.name - if folder.exists() and folder.is_dir() and check_last=="bu" + check_flavor: - print ("hello", folder) - folder_old = Path(str(folder)+'.old') + expected_name = "bu" + check_flavor + + if folder.exists() and folder.is_dir() and check_last == expected_name: + print("Removing old backup:", folder) + folder_old = folder.with_suffix('.old') if folder_old.exists(): - shutil.rmtree(Path(str(folder)+'.old')) - os.rename(folder, folder_old) - shutil.rmtree(Path(str(folder)+'.old')) - return - for item in folder_old: - if item.is_dir(): - pass - # delete_folder_if_exists(item) - else: - pass - # item.unlink() - # folder.rmdir() - -def activate_env(env_path): - # Windows-specific virtual env activation - env_script = Path(env_path) / "scripts" / "env.bat" - if not env_script.exists(): - raise FileNotFoundError(f"Cannot find env.bat at {env_script}") - # Note: This step is simplified here. Full environment activation logic will be added later. + shutil.rmtree(folder_old) + folder.rename(folder_old) + shutil.rmtree(folder_old) -def run_make_py(build_python, winpydirbase, args, logfile): - cmd = [ - build_python, "-c", - ( - "from wppm import make; " - f"make.make_all({args.release}, '{args.release_level}', basedir_wpy=r'{winpydirbase}', " - f"verbose=True, flavor='{args.flavor}', source_dirs=r'{args.source_dirs}', " - f"toolsdirs=r'{args.tools_dirs}')" #, portable_dir=r'{args.portable_dir}')" - ) - ] - print(cmd) - from . import make - make.make_all( args.release , args.release_level , basedir_wpy= winpydirbase , - verbose=True, flavor= args.flavor , source_dirs= args.source_dirs , - toolsdirs= args.tools_dirs) #, portable_dir= args.portable_dir ) - #subprocess.run(cmd, stdout=open(logfile, 'a'), stderr=subprocess.STDOUT, check=True) +def run_command(cmd, log_file=None, shell=False, check=True): + print(f"[RUNNING] {' '.join(cmd) if isinstance(cmd, list) else cmd}") + with subprocess.Popen( + cmd, shell=shell, stdout=subprocess.PIPE, + stderr=subprocess.STDOUT, universal_newlines=True + ) as proc: + with open(log_file, 'a', encoding='utf-8') if log_file else open(os.devnull, 'w') as logf: + for line in proc.stdout: + print(line, end="") + logf.write(line) + if check and proc.wait() != 0: + raise subprocess.CalledProcessError(proc.returncode, cmd) + def pip_install(python_exe: Path, req_file: str, constraints: str, find_links: str, logfile: Path, label: str): if req_file and Path(req_file).exists(): @@ -69,29 +47,18 @@ def pip_install(python_exe: Path, req_file: str, constraints: str, find_links: s "-r", req_file, "-c", constraints, "--pre", "--no-index", f"--find-links={find_links}" ] - log_section(logfile, f"Pip‑install {label}") - subprocess.run(cmd, stdout=open(logfile, 'a'), stderr=subprocess.STDOUT, check=True) + log_section(logfile, f"Pip-install {label}") + run_command(cmd, log_file=logfile) else: log_section(logfile, f"No {label} specified/skipped") -def run_command(cmd, env=None, log_file=None): - print(f"[RUN] {cmd}") - with subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, env=env, universal_newlines=True) as proc: - for line in proc.stdout: - print(line, end="") - if log_file: - with open(log_file, "a", encoding="utf-8") as logf: - logf.write(line) - -def patch_winpython(python_exe: Path, logfile: Path): - cmd = [str(python_exe), "-c" , - ( - "from wppm import wppm;" - "wppm.Distribution().patch_standard_packages('', to_movable=True)" - )] - print(cmd) - subprocess.run(cmd, stdout=open(logfile, 'a'), stderr=subprocess.STDOUT, check=True) - #run_command(f'{activate_env(WINPYDIRBASE)} python -c "from wppm import wppm; wppm.Distribution(r\'{WINPYDIRBASE}\').patch_standard_packages(\'\', to_movable=True)"') + +def patch_winpython(python_exe, logfile): + cmd = [ + str(python_exe), "-c", + "from wppm import wppm; wppm.Distribution().patch_standard_packages('', to_movable=True)" + ] + run_command(cmd, log_file=logfile) def check_env_bat(winpydirbase: Path): @@ -99,13 +66,13 @@ def check_env_bat(winpydirbase: Path): if not envbat.exists(): raise FileNotFoundError(f"Missing env.bat at {envbat}") + def generate_lockfiles(target_python: Path, winpydirbase: Path, constraints: str, find_links: str, logfile: Path, file_postfix: str): pip_req = winpydirbase.parent / "requirement_temp.txt" with subprocess.Popen([str(target_python), "-m", "pip", "freeze"], stdout=subprocess.PIPE) as proc: packages = [l for l in proc.stdout if b"winpython" not in l] pip_req.write_bytes(b"".join(packages)) # Lock to web and local (scaffolding) - # if local --no-index --trusted-host=None --find-links="%my_find_links%" for kind in ("", "local"): out = winpydirbase.parent / f"pylock.{file_postfix}_{kind}.toml" outreq = winpydirbase.parent / f"requir.{file_postfix}_{kind}.txt" @@ -138,22 +105,24 @@ def generate_lockfiles(target_python: Path, winpydirbase: Path, constraints: str else: print ("match ok ",winpydirbase.parent / f"requir.{file_postfix}_{web}.txt", winpydirbase.parent / f"requir.{file_postfix}_{local}.txt") -# --- main --- +# --- Main Logic --- +def run_make_py(build_python, winpydirbase, args, logfile): + from . import make + make.make_all( + args.release, args.release_level, basedir_wpy=winpydirbase, + verbose=True, flavor=args.flavor, + source_dirs=args.source_dirs, toolsdirs=args.tools_dirs + ) def main(): parser = argparse.ArgumentParser() - parser.add_argument('--python-target', required=True, help='Target Python version, e.g. 311') parser.add_argument('--release', default='', help='Release') parser.add_argument('--flavor', default='', help='Build flavor') parser.add_argument('--arch', default='64', help='Architecture') - parser.add_argument('--release-level', default='b1', help='Release level (e.g., b1, rc)') parser.add_argument('--winpydirbase', required=True, help='Path to put environment') parser.add_argument('--source_dirs', required=True, help='Path to directory with python zip') - parser.add_argument('--tools_dirs', required=True, help='Path to directory with python zip') - #parser.add_argument('--portable_dir', required=True, help='Path to normal make.py') - parser.add_argument('--buildenv', required=True, help='Path to build environment') parser.add_argument('--constraints', default='constraints.txt', help='Constraints file') parser.add_argument('--requirements', help='Main requirements.txt file') @@ -180,26 +149,20 @@ def main(): #logs termination z = Path(winpydirbase).name[(4+len(args.arch)):-len(args.release_level)] tada = f"{z[:1]}_{z[1:3]}_{z[3]}_{args.release}" - winpyver2 = tada.replace('_','.') - file_postfix=f"{args.arch}-{args.python_target[:1]}_{args.python_target[1:]}_{args.release}{args.flavor}{args.release_level}" - file_postfix=f"{args.arch}-{tada}{args.flavor}{args.release_level}" + winpyver2 = tada.replace('_', '.') + file_postfix = f"{args.arch}-{tada}{args.flavor}{args.release_level}" log_section(log_file, f"Preparing build for Python {args.python_target} ({args.arch}-bit)") log_section(log_file, f"🙏 Step 0: displace old {Path(winpydirbase)}") - # O) Pre-clear - - #delete_folder_if_exists(Path(winpydirbase)) + delete_folder_if_exists(winpydirbase.parent, check_flavor=args.flavor) #bu{flavor]} log_section(log_file, f"🙏 Step 1: make.py Python with {str(build_python)} at ({winpydirbase}") - # 1) run make.py run_make_py(str(build_python), winpydirbase, args, log_file) - # 2) env.bat exists check_env_bat(winpydirbase) - # 3) pip install in built environment log_section(log_file, "🙏 Step 3: install requirements") for label, req in [ @@ -209,11 +172,9 @@ def main(): ]: pip_install(target_python, req, args.constraints, args.find_links, log_file, label) - # 4) patch Winpython log_section(log_file, "🙏 Step 4: Patch Winpython") patch_winpython(target_python, log_file) - # 5) Install Wheelhouse if args.wheelhousereq: log_section(log_file, f"🙏 Step 5: install wheelhouse requirements {args.wheelhousereq}") wheelhousereq = Path(args.wheelhousereq) @@ -255,15 +216,10 @@ def main(): subprocess.run(cmd, stdout=open(log_file, 'a'), stderr=subprocess.STDOUT, check=False) - - # 6) lock files log_section(log_file, "🙏 Step 6: install lockfiles") print(target_python, winpydirbase, args.constraints, args.find_links, log_file) - print(' - - -') generate_lockfiles(target_python, winpydirbase, args.constraints, args.find_links, log_file, file_postfix) - # 5b) Archive lock files - # 6) generate changelog mdn = f"WinPython{args.flavor}-{args.arch}bit-{winpyver2}.md" out = f"WinPython{args.flavor}-{args.arch}bit-{winpyver2}_History.md" @@ -286,14 +242,13 @@ def main(): cmd = [str(target_python), "-c", ( "from wppm import diff;" - f"result = diff.compare_package_indexes('{winpyver2}', searchdir=r'{log_dir}', flavor=r'{args.flavor}', architecture={args.arch});" + f"result = diff.compare_package_indexes('{winpyver2}', searchdir=r'{changelog_dir}', flavor=r'{args.flavor}', architecture={args.arch});" f"open(r'{winpydirbase.parent / out}', 'w', encoding='utf-8').write(result)" )] subprocess.run(cmd, stdout=open(log_file, 'a'), stderr=subprocess.STDOUT, check=True) shutil.copyfile (winpydirbase.parent / out, changelog_dir / out) log_section(log_file, "✅ Step 6 complete") - # 7) Create Installers if args.create_installer != "": log_section(log_file, "🙏 Step 7 Create Installer") stem = f"WinPython{args.arch}-{winpyver2}{args.flavor}{args.release_level}" From 375604a58ef0b367d7188a82e395cddf8b7086d8 Mon Sep 17 00:00:00 2001 From: stonebig Date: Sun, 27 Jul 2025 19:03:10 +0200 Subject: [PATCH 293/305] simlpify by using logging standard library module --- winpython/build_winpython.py | 171 +++++++++++++++-------------------- 1 file changed, 75 insertions(+), 96 deletions(-) diff --git a/winpython/build_winpython.py b/winpython/build_winpython.py index b2377e59..eea3c841 100644 --- a/winpython/build_winpython.py +++ b/winpython/build_winpython.py @@ -1,73 +1,75 @@ # build_winpython.py import os, sys, argparse, datetime, subprocess, shutil -from pathlib import Path - -# --- Logging --- -def log_section(logfile, message): - ts = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S") - section = f"\n{'-'*40}\n({ts}) {message}\n{'-'*40}\n" - print(section) - with open(logfile, 'a', encoding='utf-8') as f: - f.write(section) +import logging +from pathlib import Path +from filecmp import cmp + +LOG_FORMAT = "%(asctime)s %(levelname)s: %(message)s" + +def setup_logging(log_file: Path): + """Initialize logging to both file and stdout.""" + logging.basicConfig( + level=logging.INFO, + format=LOG_FORMAT, + handlers=[ + logging.StreamHandler(sys.stdout), + logging.FileHandler(str(log_file), encoding="utf-8", mode='a') + ] + ) -# --- Utility Functions --- +def log_section(message: str): + logging.info("\n" + "-"*40) + logging.info(message) + logging.info("-"*40) def delete_folder_if_exists(folder: Path, check_flavor: str = ""): check_last = folder.parent.name if not folder.is_dir() else folder.name expected_name = "bu" + check_flavor - if folder.exists() and folder.is_dir() and check_last == expected_name: - print("Removing old backup:", folder) + logging.info(f"Removing old backup: {folder}") folder_old = folder.with_suffix('.old') if folder_old.exists(): shutil.rmtree(folder_old) folder.rename(folder_old) shutil.rmtree(folder_old) - -def run_command(cmd, log_file=None, shell=False, check=True): - print(f"[RUNNING] {' '.join(cmd) if isinstance(cmd, list) else cmd}") +def run_command(cmd, shell=False, check=True): + logging.info(f"[RUNNING] {' '.join(cmd) if isinstance(cmd, list) else cmd}") with subprocess.Popen( cmd, shell=shell, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, universal_newlines=True ) as proc: - with open(log_file, 'a', encoding='utf-8') if log_file else open(os.devnull, 'w') as logf: - for line in proc.stdout: - print(line, end="") - logf.write(line) + for line in proc.stdout: + logging.info(line.rstrip()) if check and proc.wait() != 0: raise subprocess.CalledProcessError(proc.returncode, cmd) - -def pip_install(python_exe: Path, req_file: str, constraints: str, find_links: str, logfile: Path, label: str): +def pip_install(python_exe: Path, req_file: str, constraints: str, find_links: str, label: str): if req_file and Path(req_file).exists(): cmd = [ str(python_exe), "-m", "pip", "install", "-r", req_file, "-c", constraints, "--pre", "--no-index", f"--find-links={find_links}" ] - log_section(logfile, f"Pip-install {label}") - run_command(cmd, log_file=logfile) + log_section(f"Pip-install {label}") + run_command(cmd) else: - log_section(logfile, f"No {label} specified/skipped") + log_section(f"No {label} specified/skipped") - -def patch_winpython(python_exe, logfile): +def patch_winpython(python_exe): cmd = [ str(python_exe), "-c", "from wppm import wppm; wppm.Distribution().patch_standard_packages('', to_movable=True)" ] - run_command(cmd, log_file=logfile) - + run_command(cmd) def check_env_bat(winpydirbase: Path): envbat = winpydirbase / "scripts" / "env.bat" if not envbat.exists(): raise FileNotFoundError(f"Missing env.bat at {envbat}") - -def generate_lockfiles(target_python: Path, winpydirbase: Path, constraints: str, find_links: str, logfile: Path, file_postfix: str): +def generate_lockfiles(target_python: Path, winpydirbase: Path, constraints: str, find_links: str, file_postfix: str): pip_req = winpydirbase.parent / "requirement_temp.txt" with subprocess.Popen([str(target_python), "-m", "pip", "freeze"], stdout=subprocess.PIPE) as proc: packages = [l for l in proc.stdout if b"winpython" not in l] @@ -76,28 +78,15 @@ def generate_lockfiles(target_python: Path, winpydirbase: Path, constraints: str for kind in ("", "local"): out = winpydirbase.parent / f"pylock.{file_postfix}_{kind}.toml" outreq = winpydirbase.parent / f"requir.{file_postfix}_{kind}.txt" - print( - [str(target_python), "-m", "pip", "lock", "--no-deps", "-c", constraints] + - (["--find-links",find_links] if kind =="local" else []) + - ["-r", str(pip_req), "-o", str(out)] - ) - subprocess.run( - [str(target_python), "-m", "pip", "lock", "--no-deps", "-c", constraints] + - (["--find-links",find_links] if kind =="local" else []) + - ["-r", str(pip_req), "-o", str(out)], - stdout=open(logfile, 'a'), stderr=subprocess.STDOUT, check=True - ) + cmd = [str(target_python), "-m", "pip", "lock", "--no-deps", "-c", constraints] + if kind == "local": + cmd += ["--find-links", find_links] + cmd += ["-r", str(pip_req), "-o", str(out)] + run_command(cmd) # Convert both locks to requirement.txt with hash256 - cmd = f"from wppm import wheelhouse as wh; wh.pylock_to_req(r'{out}', r'{outreq}')" - print( - [str(target_python), "-c", cmd] - ) - subprocess.run( - [str(target_python), "-c", cmd], - stdout=open(logfile, 'a'), stderr=subprocess.STDOUT, check=False - ) + cmd = [str(target_python), "-X", "utf8", "-c", f"from wppm import wheelhouse as wh; wh.pylock_to_req(r'{out}', r'{outreq}')"] + run_command(cmd) # check equality - from filecmp import cmp web, local = "", "local" if not cmp(winpydirbase.parent / f"requir.{file_postfix}_{web}.txt", winpydirbase.parent / f"requir.{file_postfix}_{local}.txt"): print("ALARM differences in ", winpydirbase.parent / f"requir.{file_postfix}_{web}.txt", winpydirbase.parent / f"requir.{file_postfix}_{local}.txt") @@ -106,7 +95,7 @@ def generate_lockfiles(target_python: Path, winpydirbase: Path, constraints: str print ("match ok ",winpydirbase.parent / f"requir.{file_postfix}_{web}.txt", winpydirbase.parent / f"requir.{file_postfix}_{local}.txt") # --- Main Logic --- -def run_make_py(build_python, winpydirbase, args, logfile): +def run_make_py(build_python, winpydirbase, args): from . import make make.make_all( args.release, args.release_level, basedir_wpy=winpydirbase, @@ -136,7 +125,7 @@ def main(): # compute paths (same as Step2)... build_python = Path(args.buildenv) / "python.exe" - winpydirbase = Path(args.winpydirbase) # from Step2 logic + winpydirbase = Path(args.winpydirbase) target_python = winpydirbase / "python" / "python.exe" # Setup paths and logs @@ -145,38 +134,38 @@ def main(): log_dir.mkdir(exist_ok=True) time_str = now.strftime("%Y-%m-%d_at_%H%M") log_file = log_dir / f"build_{args.python_target}_{args.flavor}_{args.release_level}_{time_str}.txt" - - #logs termination + setup_logging(log_file) + + # Logs termination and version naming z = Path(winpydirbase).name[(4+len(args.arch)):-len(args.release_level)] tada = f"{z[:1]}_{z[1:3]}_{z[3]}_{args.release}" winpyver2 = tada.replace('_', '.') file_postfix = f"{args.arch}-{tada}{args.flavor}{args.release_level}" - log_section(log_file, f"Preparing build for Python {args.python_target} ({args.arch}-bit)") - - log_section(log_file, f"🙏 Step 0: displace old {Path(winpydirbase)}") + log_section(f"Preparing build for Python {args.python_target} ({args.arch}-bit)") + log_section(f"🙏 Step 0: displace old {Path(winpydirbase)}") delete_folder_if_exists(winpydirbase.parent, check_flavor=args.flavor) #bu{flavor]} - log_section(log_file, f"🙏 Step 1: make.py Python with {str(build_python)} at ({winpydirbase}") - run_make_py(str(build_python), winpydirbase, args, log_file) + log_section(f"🙏 Step 1: make.py Python with {str(build_python)} at ({winpydirbase}") + run_make_py(str(build_python), winpydirbase, args) check_env_bat(winpydirbase) - log_section(log_file, "🙏 Step 3: install requirements") + log_section("🙏 Step 3: install requirements") for label, req in [ ("Mandatory", args.mandatory_req), ("Pre", args.pre_req), ("Main", args.requirements), ]: - pip_install(target_python, req, args.constraints, args.find_links, log_file, label) + pip_install(target_python, req, args.constraints, args.find_links, label) - log_section(log_file, "🙏 Step 4: Patch Winpython") - patch_winpython(target_python, log_file) + log_section("🙏 Step 4: Patch Winpython") + patch_winpython(target_python) if args.wheelhousereq: - log_section(log_file, f"🙏 Step 5: install wheelhouse requirements {args.wheelhousereq}") + log_section(f"🙏 Step 5: install wheelhouse requirements {args.wheelhousereq}") wheelhousereq = Path(args.wheelhousereq) kind = "local" out = winpydirbase.parent / f"pylock.{file_postfix}_wheels{kind}.toml" @@ -184,15 +173,12 @@ def main(): if wheelhousereq.is_file(): # Generate pylock from wheelhousereq cmd = [str(target_python), "-m" , "pip", "lock","--no-index", "--trusted-host=None", - "--find-links", args.find_links, "-c", args.constraints, "-r", wheelhousereq, - "-o", out ] - subprocess.run(cmd, stdout=open(log_file, 'a'), stderr=subprocess.STDOUT, check=True) + "--find-links", args.find_links, "-c", str(args.constraints), "-r", str(wheelhousereq), + "-o", str(out) ] + run_command(cmd) # Convert pylock to requirements with hash - cmd = f"from wppm import wheelhouse as wh; wh.pylock_to_req(r'{out}', r'{outreq}')" - print( [str(target_python), "-c", cmd] ) - subprocess.run([str(target_python), "-c", cmd], - stdout=open(log_file, 'a'), stderr=subprocess.STDOUT, check=False - ) + cmd = [str(target_python), "-X", "utf8", "-c", f"from wppm import wheelhouse as wh; wh.pylock_to_req(r'{out}', r'{outreq}')"] + run_command(cmd, check=False) kind = "" outw = winpydirbase.parent / f"pylock.{file_postfix}_wheels{kind}.toml" @@ -200,62 +186,55 @@ def main(): # Generate web pylock from local frozen hashes cmd = [str(target_python), "-m" , "pip", "lock","--no-deps", "--require-hashes", "-r", str(outreq), "-o", str(outw) ] - subprocess.run(cmd, stdout=open(log_file, 'a'), stderr=subprocess.STDOUT, check=True) - cmd = f"from wppm import wheelhouse as wh; wh.pylock_to_req(r'{outw}', r'{outreqw}')" - print( [str(target_python), "-c", cmd] ) - subprocess.run([str(target_python), "-c", cmd], - stdout=open(log_file, 'a'), stderr=subprocess.STDOUT, check=False - ) + run_command(cmd) + cmd = [str(target_python), "-X", "utf8", "-c", f"from wppm import wheelhouse as wh; wh.pylock_to_req(r'{outw}', r'{outreqw}')"] + run_command(cmd, check=False) # Use wppm to download local from req made with web hashes wheelhouse = winpydirbase / "wheelhouse" / "included.wheels" cmd = [str(target_python), "-X", "utf8", "-m", "wppm", str(out), "-ws", args.find_links, "-wd", str(wheelhouse) ] - print(cmd) - subprocess.run(cmd, stdout=open(log_file, 'a'), stderr=subprocess.STDOUT, check=False) - + run_command(cmd, check=False) - log_section(log_file, "🙏 Step 6: install lockfiles") - print(target_python, winpydirbase, args.constraints, args.find_links, log_file) - generate_lockfiles(target_python, winpydirbase, args.constraints, args.find_links, log_file, file_postfix) + log_section("🙏 Step 6: install lockfiles") + print(target_python, winpydirbase, args.constraints, args.find_links, file_postfix) + generate_lockfiles(target_python, winpydirbase, args.constraints, args.find_links, file_postfix) # 6) generate changelog mdn = f"WinPython{args.flavor}-{args.arch}bit-{winpyver2}.md" out = f"WinPython{args.flavor}-{args.arch}bit-{winpyver2}_History.md" changelog_dir = log_dir.parent/ "changelogs" - log_section(log_file, f"🙏 Step 6: generate changelog {mdn}") + log_section(f"🙏 Step 6: generate changelog {mdn}") cmd = ["set", f"WINPYVER2={winpyver2}&", "set", f"WINPYFLAVOR={args.flavor}&", "set", f"WINPYVER={winpyver2}{args.flavor}{args.release_level}&", - str(target_python), "-c" , + str(target_python), "-X", "utf8", "-c" , ( "from wppm import wppm;" "result = wppm.Distribution().generate_package_index_markdown();" f"open(r'{winpydirbase.parent / mdn}', 'w', encoding='utf-8').write(result)" )] - print(cmd) - subprocess.run(cmd, stdout=open(log_file, 'a'), stderr=subprocess.STDOUT, check=True, shell=True) + run_command(cmd, shell=True) shutil.copyfile (winpydirbase.parent / mdn, changelog_dir / mdn) - cmd = [str(target_python), "-c", + cmd = [str(target_python), "-X", "utf8", "-c", ( "from wppm import diff;" f"result = diff.compare_package_indexes('{winpyver2}', searchdir=r'{changelog_dir}', flavor=r'{args.flavor}', architecture={args.arch});" f"open(r'{winpydirbase.parent / out}', 'w', encoding='utf-8').write(result)" )] - subprocess.run(cmd, stdout=open(log_file, 'a'), stderr=subprocess.STDOUT, check=True) + run_command(cmd, check=False) shutil.copyfile (winpydirbase.parent / out, changelog_dir / out) - log_section(log_file, "✅ Step 6 complete") + log_section("✅ Step 6 complete") if args.create_installer != "": - log_section(log_file, "🙏 Step 7 Create Installer") + log_section("🙏 Step 7 Create Installer") stem = f"WinPython{args.arch}-{winpyver2}{args.flavor}{args.release_level}" - cmd = f"from wppm import utils; utils.command_installer_7zip(r'{winpydirbase}', r'{winpydirbase.parent}', r'{stem}', r'{args.create_installer}')" - print( [str(target_python), "-c", cmd] ) - subprocess.run([str(target_python), "-c", cmd], - stdout=open(log_file, 'a'), stderr=subprocess.STDOUT, check=False) + cmd = [str(target_python), "-c", + f"from wppm import utils; utils.command_installer_7zip(r'{winpydirbase}', r'{winpydirbase.parent}', r'{stem}', r'{args.create_installer}')" ] + run_command(cmd, check=False) if __name__ == '__main__': main() From 81d853a972e8342ea88574e300be085e277ad92f Mon Sep 17 00:00:00 2001 From: stonebig Date: Sun, 27 Jul 2025 19:10:09 +0200 Subject: [PATCH 294/305] move wheelhouse requirements processing into a dedicated function --- winpython/build_winpython.py | 80 ++++++++++++++++++++++-------------- 1 file changed, 49 insertions(+), 31 deletions(-) diff --git a/winpython/build_winpython.py b/winpython/build_winpython.py index eea3c841..62adf0cf 100644 --- a/winpython/build_winpython.py +++ b/winpython/build_winpython.py @@ -102,6 +102,54 @@ def run_make_py(build_python, winpydirbase, args): verbose=True, flavor=args.flavor, source_dirs=args.source_dirs, toolsdirs=args.tools_dirs ) + +def process_wheelhouse_requirements(target_python: Path, winpydirbase: Path,args: argparse.Namespace,file_postfix: str): + """ + Handle installation and conversion of wheelhouse requirements. + """ + log_section(f"🙏 Step 5: install wheelhouse requirements {args.wheelhousereq}") + wheelhousereq = Path(args.wheelhousereq) + kind = "local" + out = winpydirbase.parent / f"pylock.{file_postfix}_wheels{kind}.toml" + outreq = winpydirbase.parent / f"requir.{file_postfix}_wheels{kind}.txt" + if wheelhousereq.is_file(): + # Generate pylock from wheelhousereq + cmd = [ + str(target_python), "-m", "pip", "lock", "--no-index", "--trusted-host=None", + "--find-links", args.find_links, "-c", args.constraints, "-r", str(wheelhousereq), + "-o", str(out) + ] + run_command(cmd) + # Convert pylock to requirements with hash + pylock_to_req_cmd = [ + str(target_python), "-X", "utf8", "-c", + f"from wppm import wheelhouse as wh; wh.pylock_to_req(r'{out}', r'{outreq}')" + ] + run_command(pylock_to_req_cmd, check=False) + + kind = "" + outw = winpydirbase.parent / f"pylock.{file_postfix}_wheels{kind}.toml" + outreqw = winpydirbase.parent / f"requir.{file_postfix}_wheels{kind}.txt" + # Generate web pylock from local frozen hashes + web_lock_cmd = [ + str(target_python), "-m", "pip", "lock", "--no-deps", "--require-hashes", + "-r", str(outreq), "-o", str(outw) + ] + run_command(web_lock_cmd) + pylock_to_req_cmd2 = [ + str(target_python), "-X", "utf8", "-c", + f"from wppm import wheelhouse as wh; wh.pylock_to_req(r'{outw}', r'{outreqw}')" + ] + run_command(pylock_to_req_cmd2, check=False) + + # Use wppm to download local from req made with web hashes + wheelhouse = winpydirbase / "wheelhouse" / "included.wheels" + wppm_cmd = [ + str(target_python), "-X", "utf8", "-m", "wppm", str(out), "-ws", args.find_links, + "-wd", str(wheelhouse) + ] + run_command(wppm_cmd, check=False) + def main(): parser = argparse.ArgumentParser() parser.add_argument('--python-target', required=True, help='Target Python version, e.g. 311') @@ -165,37 +213,7 @@ def main(): patch_winpython(target_python) if args.wheelhousereq: - log_section(f"🙏 Step 5: install wheelhouse requirements {args.wheelhousereq}") - wheelhousereq = Path(args.wheelhousereq) - kind = "local" - out = winpydirbase.parent / f"pylock.{file_postfix}_wheels{kind}.toml" - outreq = winpydirbase.parent / f"requir.{file_postfix}_wheels{kind}.txt" - if wheelhousereq.is_file(): - # Generate pylock from wheelhousereq - cmd = [str(target_python), "-m" , "pip", "lock","--no-index", "--trusted-host=None", - "--find-links", args.find_links, "-c", str(args.constraints), "-r", str(wheelhousereq), - "-o", str(out) ] - run_command(cmd) - # Convert pylock to requirements with hash - cmd = [str(target_python), "-X", "utf8", "-c", f"from wppm import wheelhouse as wh; wh.pylock_to_req(r'{out}', r'{outreq}')"] - run_command(cmd, check=False) - - kind = "" - outw = winpydirbase.parent / f"pylock.{file_postfix}_wheels{kind}.toml" - outreqw = winpydirbase.parent / f"requir.{file_postfix}_wheels{kind}.txt" - # Generate web pylock from local frozen hashes - cmd = [str(target_python), "-m" , "pip", "lock","--no-deps", "--require-hashes", - "-r", str(outreq), "-o", str(outw) ] - run_command(cmd) - cmd = [str(target_python), "-X", "utf8", "-c", f"from wppm import wheelhouse as wh; wh.pylock_to_req(r'{outw}', r'{outreqw}')"] - run_command(cmd, check=False) - - # Use wppm to download local from req made with web hashes - wheelhouse = winpydirbase / "wheelhouse" / "included.wheels" - cmd = [str(target_python), "-X", "utf8", "-m", "wppm", str(out), "-ws", args.find_links, - "-wd", str(wheelhouse) - ] - run_command(cmd, check=False) + process_wheelhouse_requirements(target_python, winpydirbase, args, file_postfix) log_section("🙏 Step 6: install lockfiles") print(target_python, winpydirbase, args.constraints, args.find_links, file_postfix) From 41596b6a64a3789cfa9532d54c7ff8c3a84b228d Mon Sep 17 00:00:00 2001 From: stonebig Date: Sun, 27 Jul 2025 19:36:45 +0200 Subject: [PATCH 295/305] clean-up --- winpython/build_winpython.py | 20 +++++++++----------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/winpython/build_winpython.py b/winpython/build_winpython.py index 62adf0cf..d35c1a39 100644 --- a/winpython/build_winpython.py +++ b/winpython/build_winpython.py @@ -107,7 +107,6 @@ def process_wheelhouse_requirements(target_python: Path, winpydirbase: Path,args """ Handle installation and conversion of wheelhouse requirements. """ - log_section(f"🙏 Step 5: install wheelhouse requirements {args.wheelhousereq}") wheelhousereq = Path(args.wheelhousereq) kind = "local" out = winpydirbase.parent / f"pylock.{file_postfix}_wheels{kind}.toml" @@ -192,15 +191,15 @@ def main(): log_section(f"Preparing build for Python {args.python_target} ({args.arch}-bit)") - log_section(f"🙏 Step 0: displace old {Path(winpydirbase)}") + log_section(f"🙏 Step 1: displace old {Path(winpydirbase)}") delete_folder_if_exists(winpydirbase.parent, check_flavor=args.flavor) #bu{flavor]} - log_section(f"🙏 Step 1: make.py Python with {str(build_python)} at ({winpydirbase}") + log_section(f"🙏 Step 2: make.py Python with {str(build_python)} at ({winpydirbase}") run_make_py(str(build_python), winpydirbase, args) check_env_bat(winpydirbase) - log_section("🙏 Step 3: install requirements") + log_section("🙏 Step 3: install requirements") for label, req in [ ("Mandatory", args.mandatory_req), @@ -209,23 +208,23 @@ def main(): ]: pip_install(target_python, req, args.constraints, args.find_links, label) - log_section("🙏 Step 4: Patch Winpython") + log_section("🙏 Step 4: Patch Winpython") patch_winpython(target_python) + log_section(f"🙏 Step 5: install wheelhouse requirements {args.wheelhousereq}") if args.wheelhousereq: process_wheelhouse_requirements(target_python, winpydirbase, args, file_postfix) - log_section("🙏 Step 6: install lockfiles") + log_section("🙏 Step 6: install lockfiles") print(target_python, winpydirbase, args.constraints, args.find_links, file_postfix) generate_lockfiles(target_python, winpydirbase, args.constraints, args.find_links, file_postfix) - # 6) generate changelog + + log_section(f"🙏 Step 7: generate changelog") mdn = f"WinPython{args.flavor}-{args.arch}bit-{winpyver2}.md" out = f"WinPython{args.flavor}-{args.arch}bit-{winpyver2}_History.md" changelog_dir = log_dir.parent/ "changelogs" - log_section(f"🙏 Step 6: generate changelog {mdn}") - cmd = ["set", f"WINPYVER2={winpyver2}&", "set", f"WINPYFLAVOR={args.flavor}&", "set", f"WINPYVER={winpyver2}{args.flavor}{args.release_level}&", str(target_python), "-X", "utf8", "-c" , @@ -245,10 +244,9 @@ def main(): )] run_command(cmd, check=False) shutil.copyfile (winpydirbase.parent / out, changelog_dir / out) - log_section("✅ Step 6 complete") if args.create_installer != "": - log_section("🙏 Step 7 Create Installer") + log_section("🙏 Step 8: Create Installer") stem = f"WinPython{args.arch}-{winpyver2}{args.flavor}{args.release_level}" cmd = [str(target_python), "-c", f"from wppm import utils; utils.command_installer_7zip(r'{winpydirbase}', r'{winpydirbase.parent}', r'{stem}', r'{args.create_installer}')" ] From a7165ad3c680457a0810e08a8e3a5572afa12926 Mon Sep 17 00:00:00 2001 From: stonebig Date: Sat, 2 Aug 2025 09:45:36 +0200 Subject: [PATCH 296/305] an emoji is worth a thousand words --- winpython/build_winpython.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/winpython/build_winpython.py b/winpython/build_winpython.py index d35c1a39..940b285a 100644 --- a/winpython/build_winpython.py +++ b/winpython/build_winpython.py @@ -89,10 +89,10 @@ def generate_lockfiles(target_python: Path, winpydirbase: Path, constraints: str # check equality web, local = "", "local" if not cmp(winpydirbase.parent / f"requir.{file_postfix}_{web}.txt", winpydirbase.parent / f"requir.{file_postfix}_{local}.txt"): - print("ALARM differences in ", winpydirbase.parent / f"requir.{file_postfix}_{web}.txt", winpydirbase.parent / f"requir.{file_postfix}_{local}.txt") + print("⚠️⚠️⚠️⚠️⚠️⚠️ ALARM ⚠️⚠️⚠️⚠️⚠️⚠️differences in ", winpydirbase.parent / f"requir.{file_postfix}_{web}.txt", winpydirbase.parent / f"requir.{file_postfix}_{local}.txt") raise os.error else: - print ("match ok ",winpydirbase.parent / f"requir.{file_postfix}_{web}.txt", winpydirbase.parent / f"requir.{file_postfix}_{local}.txt") + print ("💖💖💖 match 💖💖💖 ok ",winpydirbase.parent / f"requir.{file_postfix}_{web}.txt", winpydirbase.parent / f"requir.{file_postfix}_{local}.txt") # --- Main Logic --- def run_make_py(build_python, winpydirbase, args): From acef1b16dd2164f84669b3efd8402e6aa8e6edb7 Mon Sep 17 00:00:00 2001 From: stonebig Date: Sat, 2 Aug 2025 12:39:39 +0200 Subject: [PATCH 297/305] prepare for b2 --- wppm/__init__.py | 2 +- wppm/wppm.py | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/wppm/__init__.py b/wppm/__init__.py index 5bb4a702..02ec4fa3 100644 --- a/wppm/__init__.py +++ b/wppm/__init__.py @@ -28,6 +28,6 @@ OTHER DEALINGS IN THE SOFTWARE. """ -__version__ = '17.1.20250715b1' +__version__ = '17.2.20250802b2' __license__ = __doc__ __project_url__ = 'http://winpython.github.io/' diff --git a/wppm/wppm.py b/wppm/wppm.py index 1c9d4f43..a80d3961 100644 --- a/wppm/wppm.py +++ b/wppm/wppm.py @@ -14,7 +14,7 @@ import json from pathlib import Path from argparse import ArgumentParser, RawTextHelpFormatter -from . import utils, piptree, associate, diff +from . import utils, piptree, associate, diff, __version__ from . import wheelhouse as wh from operator import itemgetter # Workaround for installing PyVISA on Windows from source: @@ -263,7 +263,7 @@ def main(test=False): registerWinPythonHelp = f"Register WinPython: associate file extensions, icons and context menu with this WinPython" unregisterWinPythonHelp = f"Unregister WinPython: de-associate file extensions, icons and context menu from this WinPython" parser = ArgumentParser(prog="wppm", - description="WinPython Package Manager: handle a WinPython Distribution and its packages", + description=f"WinPython Package Manager: handle a WinPython Distribution and its packages ({__version__})", formatter_class=RawTextHelpFormatter, ) parser.add_argument("fname", metavar="package(s) or lockfile", nargs="*", default=[""], type=str, help="optional package names, wheels, or lockfile") From ff7714616ecbe6d2c23dea346bef4ace96d8266c Mon Sep 17 00:00:00 2001 From: stonebig Date: Sat, 2 Aug 2025 12:48:19 +0200 Subject: [PATCH 298/305] remove old big .BAT chain --- generate_a_winpython_distro.bat | 198 -------------------------------- 1 file changed, 198 deletions(-) delete mode 100644 generate_a_winpython_distro.bat diff --git a/generate_a_winpython_distro.bat b/generate_a_winpython_distro.bat deleted file mode 100644 index a54e65a6..00000000 --- a/generate_a_winpython_distro.bat +++ /dev/null @@ -1,198 +0,0 @@ -rem generate_a_winpython_distro.bat: to be launched from a winpython directory, where 'make.py' is -@echo on - -REM === Initialize default values === -if not defined my_release_level set "my_release_level=b1" -if not defined my_create_installer set "my_create_installer=True" -if not defined my_constraints set "my_constraints=C:\WinP\constraints.txt" -if not defined target_python_exe set "target_python_exe=python.exe" -if not defined mandatory_requirements set "mandatory_requirements=%~dp0\mandatory_requirements.txt" - -set "my_archive_dir=%~dp0WinPython_build_logs" -if not exist "%my_archive_dir%" mkdir "%my_archive_dir%" - -REM === Format log timestamp === -set "my_time=%time:~0,5%" -set "my_time=%my_time::=_%" -set "my_time=%my_time: =0%" - -set "my_archive_log=%my_archive_dir%\build_%my_pyver%_%my_release%%my_flavor%_%my_release_level%_of_%date:/=-%at_%my_time%.txt" - -REM === Determine Python target version === -if "%my_python_target%"=="311" (set "my_python_target_release=3119" & set "my_release=2") -if "%my_python_target%"=="312" (set "my_python_target_release=31210" & set "my_release=2") -if "%my_python_target%"=="313" (set "my_python_target_release=3135" & set "my_release=1") -if "%my_python_target%"=="314" (set "my_python_target_release=3140" & set "my_release=1") - -REM === Define base build and distribution paths === -set "my_basedir=%my_root_dir_for_builds%\bd%my_python_target%" -set "my_WINPYDIRBASE=%my_basedir%\bu%my_flavor%\WPy%my_arch%-%my_python_target_release%%my_release%%my_release_level%" - -rem a building env need is a Python with packages: WinPython + build + flit + packaging + mkshim400.py -set "my_buildenv=C:\WinPdev\WPy64-310111" - -call :log_section Preparing WinPython for %my_pyver% (%my_python_target%)release %my_release%%my_flavor% (%my_release_level%) *** %my_arch% bit *** - -REM === Optionally clear previous build === -if /i "%my_preclear_build_directory%"=="Yes" ( - call :log_section Pre-clear previous build infrastructure - REM Delete Jupyter config if it exists - del /f /q "%userprofile%\.jupyter\jupyter_notebook_config.py" - REM Navigate to build directory and Rename previous build folder if it exists - cd /D "%my_root_dir_for_builds%\bd%my_python_target%" - if exist "bu%my_flavor%" ( - ren "bu%my_flavor%" "bu%my_flavor%_old" - rmdir /s /q "bu%my_flavor%_old" - ) -) - -REM === Begin Build === -call :log_section Creating Build Infrastructure -call :activate_env "%my_buildenv%" - -python.exe -c "from winpython import make;make.make_all(%my_release%, '%my_release_level%', basedir_wpy=r'%my_WINPYDIRBASE%', verbose=True, flavor='%my_flavor%', source_dirs=r'%my_source_dirs%', toolsdirs=r'%my_toolsdirs%')" >>"%my_archive_log%" - - -REM === Check env.bat has been created === -set "WINPYDIRBASE=%my_WINPYDIRBASE%" - -if not exist "%WINPYDIRBASE%\scripts\env.bat" ( - echo ERROR: %WINPYDIRBASE%\scripts\env.bat script not found - echo Please verify: my_arch=%my_arch% my_python_target_release=%my_python_target_release% - echo my_release=%my_release% my_release_level=%my_release_level% - pause - exit /b 1 -) - -REM === Install Prerequisites === -call :pip_install "%my_WINPYDIRBASE%" "%mandatory_requirements%" "Mandatory requirements" -call :pip_install "%my_WINPYDIRBASE%" "%my_requirements_pre%" "Pre-requirements" -call :pip_install "%my_WINPYDIRBASE%" "%my_requirements%" "Main requirements" - -REM === Patch WinPython === -python -c "from wppm import wppm; wppm.Distribution(r'%WINPYDIR%').patch_standard_packages('', to_movable=True)" - -REM === Lock files and requirements === -set "WINPYVERLOCK=%WINPYVER2:.=_%" -set "LOCKDIR=%WINPYDIRBASE%\..\" - -set "pip_lock_includedlocal=%LOCKDIR%pylock.%WINPYARCH%-%WINPYVERLOCK%%my_flavor%%my_release_level%_wheelslocal.toml" -set "pip_lock_includedweb=%LOCKDIR%pylock.%WINPYARCH%-%WINPYVERLOCK%%my_flavor%%my_release_level%_wheels.toml" -set "req_lock_includedlocal=%LOCKDIR%requir.%WINPYARCH%-%WINPYVERLOCK%%my_flavor%%my_release_level%_wheelslocal.txt" -set "req_lock_includedweb=%LOCKDIR%requir.%WINPYARCH%-%WINPYVERLOCK%%my_flavor%%my_release_level%_wheels.txt" - -REM === Add lockfile wheels for the Wheelhouse (optional) === -if defined wheelhousereq if exist "%wheelhousereq%" ( - call :log_section Add wheels for the Wheelhouse - - REM Generate pylock from wheelhousereq - python -m pip lock --no-index --trusted-host=None --find-links="%my_find_links%" -c "%my_constraints%" -r "%wheelhousereq%" -o "%pip_lock_includedlocal%" - - REM Convert pylock to requirement file with hashes - python -c "from wppm import wheelhouse as wh; wh.pylock_to_req(r'%pip_lock_includedlocal%', r'%req_lock_includedlocal%')" - - REM Freeze lock again from local hashes - python -m pip lock --no-deps --require-hashes -c "%my_constraints%" -r "%req_lock_includedlocal%" -o "%pip_lock_includedweb%" - - REM Use wppm to install from lock - "%my_WINPYDIRBASE%\python\scripts\wppm.exe" "%pip_lock_includedweb%" -ws "%my_find_links%" -wd "%my_WINPYDIRBASE%\wheelhouse\included.wheels" -) - -REM === Freeze environment and generate final lockfiles === -call :log_section Freeze environment and generate lockfiles - -set "req=%LOCKDIR%requirement.%my_flavor%-%WINPYARCH%bit-%WINPYVERLOCK%_raw.txt" -set "wanted_req=%LOCKDIR%requirement.%my_flavor%-%WINPYARCH%bit-%WINPYVERLOCK%.txt" - -set "pip_lock_web=%LOCKDIR%pylock.%WINPYARCH%-%WINPYVERLOCK%%my_flavor%%my_release_level%.toml" -set "pip_lock_local=%LOCKDIR%pylock.%WINPYARCH%-%WINPYVERLOCK%%my_flavor%%my_release_level%_local.toml" -set "req_lock_web=%LOCKDIR%requir.%WINPYARCH%-%WINPYVERLOCK%%my_flavor%%my_release_level%.txt" -set "req_lock_local=%LOCKDIR%requir.%WINPYARCH%-%WINPYVERLOCK%%my_flavor%%my_release_level%_local.txt" - -REM Archive paths -set "my_archive_lockfile=%my_archive_dir%\pylock.%my_flavor%-%WINPYARCH%bit-%WINPYVERLOCK%_%date:/=-%at_%my_time%.toml" -set "my_changelog_lockfile=%~dp0changelogs\pylock.%WINPYARCH%-%WINPYVERLOCK%%my_flavor%%my_release_level%.toml" -set "my_changelog_reqfile=%~dp0changelogs\requir.%WINPYARCH%-%WINPYVERLOCK%%my_flavor%%my_release_level%.txt" - -REM Freeze full environment (excluding winpython) -python -m pip freeze > "%req%" -findstr /v "winpython" "%req%" > "%wanted_req%" - -REM Lock from PyPI -python -m pip lock --no-deps -c "%my_constraints%" -r "%wanted_req%" -o "%pip_lock_web%" - -REM Lock from local wheelhouse -python -m pip lock --no-deps --no-index --trusted-host=None --find-links="%my_find_links%" -c "%my_constraints%" -r "%wanted_req%" -o "%pip_lock_local%" - -REM Convert both locks to requirement.txt with hash256 -python -c "from wppm import wheelhouse as wh; wh.pylock_to_req(r'%pip_lock_web%', r'%req_lock_web%')" -python -c "from wppm import wheelhouse as wh; wh.pylock_to_req(r'%pip_lock_local%', r'%req_lock_local%')" - -REM Compare for reproducibility check -fc "%req_lock_web%" "%req_lock_local%" -@echo off - -REM Archive generated lockfile -copy /Y "%pip_lock_web%" "%my_archive_lockfile%" -copy /Y "%pip_lock_web%" "%my_changelog_lockfile%" -copy /Y "%req_lock_web%" "%my_changelog_reqfile%" - -call :log_section Archive success - -REM === Generate changelog and history === -call :log_section Generate changelog -call :generate_changelog - -REM === Create installer === -call :log_section Creating installer -set "stem=WinPython%my_arch%-%WINPYVER2%%my_flavor%%my_release_level%" -%target_python_exe% -c "from wppm import utils; utils.command_installer_7zip(r'%my_WINPYDIRBASE%', r'%my_WINPYDIRBASE%\..', r'%stem%', r'%my_create_installer%')" - -REM === Archive and cleanup === -call :log_section Final logs and cleanup - -REM Freeze final package versions to archive -%target_python_exe% -m pip freeze > "%my_archive_log%.packages_versions.txt" - -REM Open log files in Notepad for review -start notepad.exe "%my_archive_log%" -start notepad.exe "%my_archive_log%.packages_versions.txt" -pause -exit /b - -:: ---------------------------------------- -:activate_env -cd /D "%~dp0" -set "path=%my_original_path%" -call "%~1\scripts\env.bat" -exit /b - -:pip_install -call :log_section Installing %~3 -call :activate_env "%~1" -if not "%~2"=="" ( - python -m pip install -r "%~2" -c "%my_constraints%" --pre --no-index --trusted-host=None --find-links="%my_find_links%" >>"%my_archive_log%" -) else ( - echo No %~3 specified >>"%my_archive_log%" -) - -exit /b - -:generate_changelog -REM Create markdown file and diff history -set "mdn=WinPython%my_flavor%-%my_arch%bit-%WINPYVER2%.md" -set "out=WinPython%my_flavor%-%my_arch%bit-%WINPYVER2%_History.md" -%target_python_exe% -m wppm -md > "%my_WINPYDIRBASE%\..\%mdn%" -copy /Y "%my_WINPYDIRBASE%\..\%mdn%" "%~dp0changelogs\%mdn%" -%target_python_exe% -c "from wppm import diff; result = diff.compare_package_indexes('%WINPYVER2%', searchdir=r'%~dp0changelogs', flavor=r'%my_flavor%', architecture=%my_arch%); open(r'%my_WINPYDIRBASE%\..\%out%', 'w', encoding='utf-8').write(result)" -copy /Y "%my_WINPYDIRBASE%\..\%out%" "%~dp0changelogs\%out%" -exit /b - -:log_section -echo. >>%my_archive_log% -echo -------------------------------------- >>%my_archive_log% -echo (%date% %time%) %* >>%my_archive_log% -echo (%date% %time%) %* -echo -------------------------------------- >>%my_archive_log% -echo. >>%my_archive_log% -exit /b From 38feddca6c8482f79a0bfff225a0383d213f7c6e Mon Sep 17 00:00:00 2001 From: stonebig Date: Sun, 3 Aug 2025 12:09:27 +0200 Subject: [PATCH 299/305] initial step calling the reduced .bat --- generate_winpython_distros313_dot.bat | 3 ++- generate_winpython_distros313_slim.bat | 3 ++- generate_winpython_distros313_wheel.bat | 3 ++- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/generate_winpython_distros313_dot.bat b/generate_winpython_distros313_dot.bat index a1290cd3..cbd95581 100644 --- a/generate_winpython_distros313_dot.bat +++ b/generate_winpython_distros313_dot.bat @@ -29,6 +29,7 @@ set my_toolsdirs=C:\Winp\bdTools\Tools.dot set my_install_options=--no-index --pre --trusted-host=None -call %~dp0\generate_a_winpython_distro.bat +rem call %~dp0\generate_a_winpython_distro.bat +call %~dp0\generate_a_winpython_distropy.bat pause \ No newline at end of file diff --git a/generate_winpython_distros313_slim.bat b/generate_winpython_distros313_slim.bat index e8829c58..67459b8c 100644 --- a/generate_winpython_distros313_slim.bat +++ b/generate_winpython_distros313_slim.bat @@ -32,6 +32,7 @@ set my_toolsdirs=C:\WinP\bdTools\tools64_pandoc_alone set my_install_options=--no-index --pre --trusted-host=None -call %~dp0\generate_a_winpython_distro.bat +rem call %~dp0\generate_a_winpython_distro.bat +call %~dp0\generate_a_winpython_distropy.bat pause \ No newline at end of file diff --git a/generate_winpython_distros313_wheel.bat b/generate_winpython_distros313_wheel.bat index 317d7774..9afee135 100644 --- a/generate_winpython_distros313_wheel.bat +++ b/generate_winpython_distros313_wheel.bat @@ -34,6 +34,7 @@ set wheelhousereq=C:\Winp\bd313\dot_requirements.txt set wheelhousereq=C:\Winp\bd313\requirements64_whl.txt -call %~dp0\generate_a_winpython_distro.bat +rem call %~dp0\generate_a_winpython_distro.bat +call %~dp0\generate_a_winpython_distropy.bat pause From 83cb0678dfcbe3766a5206807308208dd0d4c7c4 Mon Sep 17 00:00:00 2001 From: stonebig Date: Sun, 3 Aug 2025 23:46:47 +0200 Subject: [PATCH 300/305] build_winpython_meta.py to replace remaining .bat build script --- build_winpython_meta.py | 102 +++++++++++++++++++++++++ generate_a_winpython_distropy_meta.bat | 1 + winpython_builds_bd13.toml | 54 +++++++++++++ 3 files changed, 157 insertions(+) create mode 100644 build_winpython_meta.py create mode 100644 generate_a_winpython_distropy_meta.bat create mode 100644 winpython_builds_bd13.toml diff --git a/build_winpython_meta.py b/build_winpython_meta.py new file mode 100644 index 00000000..4ad25b5a --- /dev/null +++ b/build_winpython_meta.py @@ -0,0 +1,102 @@ +import os +import sys +# Use tomllib if available (Python 3.11+), otherwise fall back to tomli +try: + import tomllib # Python 3.11+ +except ImportError: + try: + import tomli as tomllib # For older Python versions + except ImportError: + print("Please install tomli for Python < 3.11: pip install tomli") + sys.exit(1) + +#import yaml +import subprocess +from pathlib import Path + +def load_builds(config_file): + with open(config_file, "rb") as f: + config = tomllib.load(f) + builds = config["builds"] + python_versions = config.get("pythons", {}) + return builds, python_versions + #with open(config_file, "r", encoding="utf-8") as f: + # return yaml.safe_load(f)["builds"] + +def run_build(build, python_versions): + print(f"\n=== Building WinPython: {build['name']} ===") + print(build) + + root_dir_for_builds = build["root_dir_for_builds"] + my_python_target = build["python_target"] + my_flavor = build["flavor"] + my_arch = str(build["arch"]) + my_create_installer = build.get("create_installer", "True") + my_requirements = build.get("requirements", "") + my_source_dirs = build.get("source_dirs", "") + my_find_links = build.get("find_links", "") + my_toolsdirs = build.get("toolsdirs", "") + #my_install_options = build.get("install_options", "") + wheelhousereq = build.get("wheelhousereq", "") + + # Get Python release info from TOML [pythons] + py_target = my_python_target + vinfo = python_versions.get(py_target, {}) + my_python_target_release = vinfo.get("python_target_release", "") + my_release = vinfo.get("release", "") + my_release_level = vinfo.get("my_release_level", "b0") + mandatory_requirements = vinfo.get("mandatory_requirements", os.path.join(os.getcwd(), "mandatory_requirements.txt")) + + # Get Python release info from TOML [pythons] + my_constraints = build.get("my_constraints", r"C:\WinP\constraints.txt") + target_python_exe = build.get("target_python_exe", "python.exe") + + # Build directory logic + my_basedir = f"{root_dir_for_builds}\\bd{my_python_target}" + my_WINPYDIRBASE = f"{my_basedir}\\bu{my_flavor}\\WPy{my_arch}-{my_python_target_release}{my_release}{my_release_level}" + + # Build env paths (customize as needed) already defined per the launcher of that script... + + my_python_exe = Path(sys.executable) + my_buildenvi = str(my_python_exe.parent) + + my_archive_dir = os.path.join(os.getcwd(), "WinPython_build_logs") + os.makedirs(my_archive_dir, exist_ok=True) + + my_requirements_pre = build.get("my_requirements_pre", mandatory_requirements) + + # Build command + build_cmd = [ + str(my_python_exe), + "-m", "winpython.build_winpython", + "--buildenv", my_buildenvi, + "--python-target", my_python_target, + "--release", my_release, + "--release-level", my_release_level, + "--winpydirbase", my_WINPYDIRBASE, + "--flavor", my_flavor, + "--source_dirs", my_source_dirs, + "--tools_dirs", my_toolsdirs, + "--log-dir", my_archive_dir, + "--mandatory-req", mandatory_requirements, + "--pre-req", my_requirements_pre, + "--requirements", my_requirements, + "--constraints", my_constraints, + "--find-links", my_find_links, + "--wheelhousereq", wheelhousereq, + "--create-installer", my_create_installer, + #"--install-options", env["my_install_options"], + ] + + print("Running build command:") + print(" ".join(build_cmd)) + subprocess.run(build_cmd, cwd=os.getcwd(), check=False) + +def main(): + config_file = sys.argv[1] if len(sys.argv) > 1 else "winpython_buildsZZZ.toml" + builds, python_versions = load_builds(config_file) + for build in builds: + run_build(build, python_versions) + +if __name__ == "__main__": + main() diff --git a/generate_a_winpython_distropy_meta.bat b/generate_a_winpython_distropy_meta.bat new file mode 100644 index 00000000..443ab3fb --- /dev/null +++ b/generate_a_winpython_distropy_meta.bat @@ -0,0 +1 @@ +"C:\WinPdev\WPy64-310111\python-3.10.11.amd64\python.exe" build_winpython_meta.py %1 diff --git a/winpython_builds_bd13.toml b/winpython_builds_bd13.toml new file mode 100644 index 00000000..284b4056 --- /dev/null +++ b/winpython_builds_bd13.toml @@ -0,0 +1,54 @@ +[pythons] +"311" = { python_target_release = "3119", release = "2", my_release_level = "b3" } +"312" = { python_target_release = "31210", release = "2", my_release_level = "b3" } +"313" = { python_target_release = "3135", release = "1", my_release_level = "b3" } +"314" = { python_target_release = "3140", release = "1", my_release_level = "rc1" } + + +[[builds]] +name = "dot" +root_dir_for_builds = "C:\\Winp" +python_target = "313" +pyver = "3.13" +flavor = "test" +arch = "64" +create_installer = "7zip.zip" +preclear_build_directory = "Yes" +requirements = "C:\\Winp\\bd313\\dot_requirements.txt" +source_dirs = "C:\\Winp\\bd313\\packages.win-amd64" +find_links = "C:\\Winp\\packages.srcreq" +toolsdirs = "C:\\Winp\\bdTools\\Tools.dot" +install_options = "--no-index --pre --trusted-host=None" + + +[[builds]] +name = "slim" +root_dir_for_builds = "C:\\Winp" +python_target = "313" +pyver = "3.13" +flavor = "slim" +arch = "64" +create_installer = "7zip.7z" +preclear_build_directory = "Yes" +requirements = "C:\\Winp\\bd313\\requirements64_slim.txt" +source_dirs = "C:\\Winp\\bd313\\packages.win-amd64" +find_links = "C:\\Winp\\packages.srcreq" +toolsdirs = "C:\\Winp\\bdTools\\tools64_pandoc_alone" +install_options = "--no-index --pre --trusted-host=None" + + +[[builds]] +name = "whl" +root_dir_for_builds = "C:\\Winp" +python_target = "313" +pyver = "3.13" +flavor = "whl" +arch = "64" +create_installer = ".7z-mx9" +preclear_build_directory = "Yes" +requirements = "C:\\Winp\\bd313\\dot_requirements.txt" +source_dirs = "C:\\Winp\\bd313\\packages.win-amd64" +find_links = "C:\\Winp\\packages.srcreq" +toolsdirs = "C:\\Winp\\bdTools\\Tools.dot" +install_options = "--no-index --pre --trusted-host=None" +wheelhousereq = "C:\\Winp\\bd313\\requirements64_whl.txt" From 4a3e60b9171edf53649848d0dde07e2e418413fb Mon Sep 17 00:00:00 2001 From: stonebig Date: Sun, 3 Aug 2025 23:48:16 +0200 Subject: [PATCH 301/305] format constraints.txt to smodern standard --- constraints.txt | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/constraints.txt b/constraints.txt index bf61c161..843a382a 100644 --- a/constraints.txt +++ b/constraints.txt @@ -299,7 +299,7 @@ numba>=0.53.1 numcodecs>=0.7.3 numdifftools>=0.9.39 numexpr>=2.7.3 -numpy>=1.20.2+mkl +numpy>=1.20.2 numpydoc>=1.1.0 oct2py>=5.2.0 octave-kernel>=0.32.0 @@ -425,7 +425,7 @@ pytest>=6.2.3 python-baseconv>=1.2.2 python-dateutil>=2.8.1 python-dotenv>=0.15.0 -python-hdf4>=0.10.0+dummy +python-hdf4>=0.10.0 python-jsonrpc-server>=0.4.0 python-language-server>=0.36.2 python-Levenshtein>=0.12.2 @@ -547,15 +547,14 @@ tinycss>=0.4 toml>=0.10.2 toolz>=0.11.1 -torch>=1.8.1+cpu +torch>=1.8.1 torchaudio>=0.8.1 -torchvision>=0.8.2+cpu - +torchvision>=0.8.2 tornado>=6.1 tqdm>=4.59.0 traitlets>=5.0.5 traittypes>=0.2.1 -tranquilizer>=0.5.0+1.gff8dd5f +tranquilizer>=0.5.0 trio>=0.18.0 trio-asyncio>=0.12.0 twine>=3.4.1 From 9feb7c600fd6e20843965b7894a7100b7d1f9438 Mon Sep 17 00:00:00 2001 From: stonebig Date: Tue, 5 Aug 2025 21:24:25 +0200 Subject: [PATCH 302/305] switch to toml+python build toolchain --- build_winpython_meta.py | 2 +- generate_a_winpython_distropy.bat | 42 ------------------------- generate_winpython_distros313_dot.bat | 35 --------------------- generate_winpython_distros313_slim.bat | 38 ---------------------- generate_winpython_distros313_wheel.bat | 40 ----------------------- winpython_builds_bd14.toml | 38 ++++++++++++++++++++++ 6 files changed, 39 insertions(+), 156 deletions(-) delete mode 100644 generate_a_winpython_distropy.bat delete mode 100644 generate_winpython_distros313_dot.bat delete mode 100644 generate_winpython_distros313_slim.bat delete mode 100644 generate_winpython_distros313_wheel.bat create mode 100644 winpython_builds_bd14.toml diff --git a/build_winpython_meta.py b/build_winpython_meta.py index 4ad25b5a..02132f2f 100644 --- a/build_winpython_meta.py +++ b/build_winpython_meta.py @@ -93,7 +93,7 @@ def run_build(build, python_versions): subprocess.run(build_cmd, cwd=os.getcwd(), check=False) def main(): - config_file = sys.argv[1] if len(sys.argv) > 1 else "winpython_buildsZZZ.toml" + config_file = sys.argv[1] if len(sys.argv) > 1 else "winpython_buildsNOT.toml" builds, python_versions = load_builds(config_file) for build in builds: run_build(build, python_versions) diff --git a/generate_a_winpython_distropy.bat b/generate_a_winpython_distropy.bat deleted file mode 100644 index 0e8c37d7..00000000 --- a/generate_a_winpython_distropy.bat +++ /dev/null @@ -1,42 +0,0 @@ -rem generate_a_winpython_distropy.bat: to be launched with a winpython sub-directory -rem where 'build_winpython.py' and 'make.py' are -@echo on - -REM === Initialize default values === -if not defined my_release_level set "my_release_level=b1" -if not defined my_create_installer set "my_create_installer=True" -if not defined my_constraints set "my_constraints=C:\WinP\constraints.txt" -if not defined target_python_exe set "target_python_exe=python.exe" -if not defined mandatory_requirements set "mandatory_requirements=%~dp0mandatory_requirements.txt" - -set "my_archive_dir=%~dp0WinPython_build_logs" -if not exist "%my_archive_dir%" mkdir "%my_archive_dir%" - -REM === Format log timestamp === -set "my_time=%time:~0,5%" -set "my_time=%my_time::=_%" -set "my_time=%my_time: =0%" - -REM === Determine Python target version === -if "%my_python_target%"=="311" (set "my_python_target_release=3119" & set "my_release=2") -if "%my_python_target%"=="312" (set "my_python_target_release=31210" & set "my_release=2") -if "%my_python_target%"=="313" (set "my_python_target_release=3135" & set "my_release=1") -if "%my_python_target%"=="314" (set "my_python_target_release=3140" & set "my_release=1") - -REM === Define base build and distribution paths === -set "my_basedir=%my_root_dir_for_builds%\bd%my_python_target%" -set "my_WINPYDIRBASE=%my_basedir%\bu%my_flavor%\WPy%my_arch%-%my_python_target_release%%my_release%%my_release_level%" - -rem a building env need is a Python with packages: WinPython + build + flit + packaging + mkshim400.py -set "my_buildenv=C:\WinPdev\WPy64-310111" -set "my_buildenvi=C:\WinPdev\WPy64-310111\python-3.10.11.amd64" -set "my_python_exe=C:\WinPdev\WPy64-310111\python-3.10.11.amd64\python.exe" - -if "%my_requirements_pre%" == "" set "my_requirements_pre=%mandatory_requirements%" -set "my_requirements_pre=%mandatory_requirements%" - -cd/d %~dp0 -echo %my_python_exe% -m winpython.build_winpython --buildenv %my_buildenvi% --python-target %my_python_target% --release %my_release% --release-level %my_release_level% --winpydirbase %my_WINPYDIRBASE% --flavor %my_flavor% --source_dirs %my_source_dirs% --tools_dirs %my_toolsdirs% --log-dir %~dp0WinPython_build_logs --mandatory-req %mandatory_requirements% --pre-req %my_requirements_pre% --requirements %my_requirements% --constraints %my_constraints% --find-links %my_find_links% --wheelhousereq "%wheelhousereq%" --create-installer "%my_create_installer%" -%my_python_exe% -m winpython.build_winpython --buildenv %my_buildenvi% --python-target %my_python_target% --release %my_release% --release-level %my_release_level% --winpydirbase %my_WINPYDIRBASE% --flavor %my_flavor% --source_dirs %my_source_dirs% --tools_dirs %my_toolsdirs% --log-dir %~dp0WinPython_build_logs --mandatory-req %mandatory_requirements% --pre-req %my_requirements_pre% --requirements %my_requirements% --constraints %my_constraints% --find-links %my_find_links% --wheelhousereq "%wheelhousereq%" --create-installer "%my_create_installer%" -pause -exit diff --git a/generate_winpython_distros313_dot.bat b/generate_winpython_distros313_dot.bat deleted file mode 100644 index cbd95581..00000000 --- a/generate_winpython_distros313_dot.bat +++ /dev/null @@ -1,35 +0,0 @@ -rem this replace running manually from spyder the make.py -rem to launch from a winpython module 'make' directory - -set my_original_path=%path% - -set my_root_dir_for_builds=C:\Winp -set my_python_target=313 -set my_pyver=3.13 -set my_flavor=dot -set my_arch=64 - -rem settings delegated to generate_a_winpython_distro.bat -set my_release= -set my_release_level= - -rem list of installers to create separated per dot: False=none, .zip=zip, .7z=.7z, 7zip=auto-extractible 7z -set my_create_installer=7zip.7z.zip -set my_create_installer=7zip.zip - -set my_preclear_build_directory=Yes - -set tmp_reqdir=%my_root_dir_for_builds%\bd%my_python_target% - -set my_requirements=C:\Winp\bd313\dot_requirements.txt -set my_source_dirs=C:\Winp\bd313\packages.win-amd64 - -set my_find_links=C:\Winp\packages.srcreq -set my_toolsdirs=C:\Winp\bdTools\Tools.dot - -set my_install_options=--no-index --pre --trusted-host=None - -rem call %~dp0\generate_a_winpython_distro.bat -call %~dp0\generate_a_winpython_distropy.bat - -pause \ No newline at end of file diff --git a/generate_winpython_distros313_slim.bat b/generate_winpython_distros313_slim.bat deleted file mode 100644 index 67459b8c..00000000 --- a/generate_winpython_distros313_slim.bat +++ /dev/null @@ -1,38 +0,0 @@ -rem this replace running manually from spyder the make.py -rem to launch from a winpython module 'make' directory - -set my_original_path=%path% - -set my_root_dir_for_builds=C:\Winp -set my_python_target=313 -set my_pyver=3.13 -set my_flavor=slim -set my_arch=64 - -rem settings delegated to generate_a_winpython_distro.bat -set my_release= -set my_release_level= - -rem list of installers to create separated per dot: False=none, .zip=zip, .7z=.7z, 7zip=auto-extractible 7z -rem set my_create_installer=7zip.7z.zip -set my_create_installer=7zip.7z - -set my_preclear_build_directory=Yes - -set tmp_reqdir=%my_root_dir_for_builds%\bd%my_python_target% - -set my_requirements=C:\Winp\bd313\requirements64_slim.txt -set my_source_dirs=C:\Winp\bd313\packages.win-amd64 - -set my_find_links=C:\Winp\packages.srcreq -set my_toolsdirs=C:\Winp\bdTools\Tools.dot - -REM 2024-07-13:put back pandoc (so from 598Mo to 518Mo?) -set my_toolsdirs=C:\WinP\bdTools\tools64_pandoc_alone - -set my_install_options=--no-index --pre --trusted-host=None - -rem call %~dp0\generate_a_winpython_distro.bat -call %~dp0\generate_a_winpython_distropy.bat - -pause \ No newline at end of file diff --git a/generate_winpython_distros313_wheel.bat b/generate_winpython_distros313_wheel.bat deleted file mode 100644 index 9afee135..00000000 --- a/generate_winpython_distros313_wheel.bat +++ /dev/null @@ -1,40 +0,0 @@ -rem this replace running manually from spyder the make.py -rem to launch from a winpython module 'make' directory - -set my_original_path=%path% - -set my_root_dir_for_builds=C:\Winp -set my_python_target=313 -set my_pyver=3.13 -set my_flavor=whl -set my_arch=64 - -rem settings delegated to generate_a_winpython_distro.bat -set my_release= -set my_release_level= - -rem list of installers to create separated per dot: False=none, .zip=zip, .7z=.7z, 7zip=auto-extractible 7z -set my_create_installer=7zip-mx5.7z-mx7.zip -set my_create_installer=.7z-mx9 -set my_preclear_build_directory=Yes - -set tmp_reqdir=%my_root_dir_for_builds%\bd%my_python_target% - -set my_requirements=C:\Winp\bd313\dot_requirements.txt -set my_source_dirs=C:\Winp\bd313\packages.win-amd64 - -set my_find_links=C:\Winp\packages.srcreq -set my_toolsdirs=C:\Winp\bdTools\Tools.dot - -set my_install_options=--no-index --pre --trusted-host=None - -rem set addlockfile=dot - -set wheelhousereq=C:\Winp\bd313\dot_requirements.txt -set wheelhousereq=C:\Winp\bd313\requirements64_whl.txt - - -rem call %~dp0\generate_a_winpython_distro.bat -call %~dp0\generate_a_winpython_distropy.bat - -pause diff --git a/winpython_builds_bd14.toml b/winpython_builds_bd14.toml new file mode 100644 index 00000000..ce0726ad --- /dev/null +++ b/winpython_builds_bd14.toml @@ -0,0 +1,38 @@ +[pythons] +"311" = { python_target_release = "3119", release = "2", my_release_level = "b3" } +"312" = { python_target_release = "31210", release = "2", my_release_level = "b3" } +"313" = { python_target_release = "3135", release = "1", my_release_level = "b3" } +"314" = { python_target_release = "3140", release = "1", my_release_level = "rc1b" } + + +[[builds]] +name = "dot" +root_dir_for_builds = "C:\\Winp" +python_target = "314" +pyver = "3.14" +flavor = "dot" +arch = "64" +create_installer = "7zip.zip" +preclear_build_directory = "Yes" +requirements = "C:\\Winp\\bd314\\dot_requirements.txt" +source_dirs = "C:\\Winp\\bd314\\packages.win-amd64" +find_links = "C:\\Winp\\packages.srcreq" +toolsdirs = "C:\\Winp\\bdTools\\Tools.dot" +install_options = "--no-index --pre --trusted-host=None" + + +[[builds]] +name = "free" +root_dir_for_builds = "C:\\Winp" +python_target = "314" +pyver = "3.14" +flavor = "free" +arch = "64" +create_installer = "7zip.zip" +preclear_build_directory = "Yes" +requirements = "C:\\Winp\\bd314\\dot_requirements.txt" +source_dirs = "C:\\Winp\\bd314\\packages.win-amd64t" +find_links = "C:\\Winp\\packages.srcreq" +toolsdirs = "C:\\Winp\\bdTools\\Tools.dot" +install_options = "--no-index --pre --trusted-host=None" + From 1811311dc293ae8d9a91ec469fcf073d7cfbb469 Mon Sep 17 00:00:00 2001 From: stonebig Date: Sun, 10 Aug 2025 23:35:52 +0200 Subject: [PATCH 303/305] move pieces of initialisation from env.bat to winpython.ini --- .../launchers_final/scripts/WinPythonIni.py | 20 ++++++++++++++----- .../portable/launchers_final/scripts/env.bat | 14 ++----------- 2 files changed, 17 insertions(+), 17 deletions(-) diff --git a/winpython/portable/launchers_final/scripts/WinPythonIni.py b/winpython/portable/launchers_final/scripts/WinPythonIni.py index ddc0c2e7..4e704914 100644 --- a/winpython/portable/launchers_final/scripts/WinPythonIni.py +++ b/winpython/portable/launchers_final/scripts/WinPythonIni.py @@ -7,6 +7,15 @@ winpython_inidefault=r''' [debug] state = disabled +[env.bat] +#PYTHONPATHz = %WINPYDIR%;%WINPYDIR%\Lib;%WINPYDIR%\DLLs +#see https://github.com/winpython/winpython/issues/839 +#USERPROFILE = %HOME% +#PYTHONUTF8=1 creates issues in "movable" patching +SPYDER_CONFDIR = %HOME%\settings\.spyder-py3 +JUPYTER_DATA_DIR = %HOME% +JUPYTER_CONFIG_DIR = %WINPYDIR%\etc\jupyter +JUPYTER_CONFIG_PATH = %WINPYDIR%\etc\jupyter [inactive_environment_per_user] ## changing this segment to [active_environment_per_user] makes this segment of lines active or not HOME = %HOMEDRIVE%%HOMEPATH%\Documents\WinPython%WINPYVER%\settings @@ -39,7 +48,7 @@ def get_file(file_name): with open(file_name, 'r') as file: return file.read() except FileNotFoundError: - if file_name[-3:] == 'ini': + if file_name.endswith("winpython.ini"): os.makedirs(Path(file_name).parent, exist_ok=True) with open(file_name, 'w') as file: file.write(winpython_inidefault) @@ -77,7 +86,8 @@ def main(): if not (p / 'qt.conf').is_file(): with open(p / 'qt.conf', 'w') as file: file.write(qt_conf) - + prefix , postfix = "set ", "&& " + #prefix , postfix = "set ", "\n" for l in my_lines: if l.startswith("["): segment = l[1:].split("]")[0] @@ -85,11 +95,11 @@ def main(): data = l.split("=", 1) if segment == "debug" and data[0].strip() == "state": data[0] = "WINPYDEBUG" - if segment in ["environment", "debug", "active_environment_per_user", "active_environment_common"]: - txt += f"set {data[0].strip()}={translate(data[1].strip(), env)}&& " + if segment in ["env.bat", "environment", "debug", "active_environment_per_user", "active_environment_common"]: + txt += f"{prefix}{data[0].strip()}={translate(data[1].strip(), env)}{postfix}" env[data[0].strip()] = translate(data[1].strip(), env) if segment == "debug" and data[0].strip() == "state": - txt += f"set WINPYDEBUG={data[1].strip()}&&" + txt += f"{prefix}WINPYDEBUG={data[1].strip()}{postfix}" print(txt) diff --git a/winpython/portable/launchers_final/scripts/env.bat b/winpython/portable/launchers_final/scripts/env.bat index 952df8e4..51b6a177 100644 --- a/winpython/portable/launchers_final/scripts/env.bat +++ b/winpython/portable/launchers_final/scripts/env.bat @@ -16,29 +16,19 @@ if "%WINPYDIRBASE:~-1%"=="\" set WINPYDIRBASE=%WINPYDIRBASE:~0,-1% set WINPYDIRBASETMP= popd -set WINPYDIR=%WINPYDIRBASE%\%WINpython_subdirectory_name% +set WINPYDIR=%WINPYDIRBASE%\%WINPYthon_subdirectory_name% rem 2019-08-25 pyjulia needs absolutely a variable PYTHON=%WINPYDIR%\python.exe set PYTHON=%WINPYDIR%\%WINpython_exe% -set PYTHONPATHz=%WINPYDIR%;%WINPYDIR%\Lib;%WINPYDIR%\DLLs -set WINPYVER=%WINPYVER% rem 2023-02-12 utf-8 on console to avoid pip crash rem see https://github.com/pypa/pip/issues/11798#issuecomment-1427069681 set PYTHONIOENCODING=utf-8 -rem set PYTHONUTF8=1 creates issues in "movable" patching set HOME=%WINPYDIRBASE%\settings -rem see https://github.com/winpython/winpython/issues/839 -rem set USERPROFILE=%HOME% -set SPYDER_CONFDIR=%HOME%\settings\.spyder-py3 -set JUPYTER_DATA_DIR=%HOME% -set JUPYTER_CONFIG_DIR=%WINPYDIR%\etc\jupyter -set JUPYTER_CONFIG_PATH=%WINPYDIR%\etc\jupyter -set FINDDIR=%WINDIR%\system32 rem Remove all double quotes set PATH_CLEANED=%PATH:"=% -echo ";%PATH_CLEANED%;" | %FINDDIR%\find.exe /C /I ";%WINPYDIR%\;" >nul +echo ";%PATH_CLEANED%;" | %WINDIR%\system32\find.exe /C /I ";%WINPYDIR%\;" >nul if %ERRORLEVEL% NEQ 0 ( set "PATH=%WINPYDIR%\Lib\site-packages\PyQt5;%WINPYDIR%\;%WINPYDIR%\DLLs;%WINPYDIR%\Scripts;%WINPYDIR%\..\t;%WINPYDIR%\..\n;%PATH%" cd . From b1c23bc3b98da1403fa764fe3fb82285a620badc Mon Sep 17 00:00:00 2001 From: stonebig Date: Mon, 11 Aug 2025 00:12:49 +0200 Subject: [PATCH 304/305] move further pieces from env.bat to WinpythonIni.py --- .../launchers_final/scripts/WinPythonIni.py | 26 ++++++++++++++++--- .../portable/launchers_final/scripts/env.bat | 7 ----- 2 files changed, 22 insertions(+), 11 deletions(-) diff --git a/winpython/portable/launchers_final/scripts/WinPythonIni.py b/winpython/portable/launchers_final/scripts/WinPythonIni.py index 4e704914..88a3ce76 100644 --- a/winpython/portable/launchers_final/scripts/WinPythonIni.py +++ b/winpython/portable/launchers_final/scripts/WinPythonIni.py @@ -63,13 +63,31 @@ def translate(line, env): def main(): import sys - args = sys.argv[1:] - file_name = args[0] if args else "..\\settings\\winpython.ini" + args = sys.argv[:] + env = os.environ.copy() # later_version: env = os.environ + my_lines = [] + # before env.ini + # env.bat things transfered to WinpythonIni.py + env["WINPYDIRBASE"] = WINPYDIRBASE = Path(env.get('WINPYDIRBASE', Path(__file__).parent.parent)) + my_lines += [f"WINPYDIRBASE={WINPYDIRBASE}"] + env["WINPYDIR"] = WINPYDIR = Path(env.get('WINPYDIR', WINPYDIRBASE / env.get('WINPYthon_subdirectory_name', 'python'))) + my_lines += [f"WINPYDIR={WINPYDIR}"] + if (WINPYDIR / "Lib" / "site-package" / "PyQt5" / "__init__.py").is_file(): + my_lines += ["QT_API=pyqt5"] + if (PYPANDOC_PANDOC := WINPYDIRBASE / "t" / "pandoc.exe").is_file(): + my_lines += [f"PYPANDOC_PANDOC={PYPANDOC_PANDOC}"] + + # theorical option: a "winpython.ini" file as an initial parameter + if len(args) >=2 and args[1].endswith("winpython.ini"): + file_name = args[1] + args = args[1:] + else: + file_name = "..\\settings\\winpython.ini" + # classic WinpythonIni.py actions: digesting winpython.ini file + my_lines += get_file(file_name).splitlines() - my_lines = get_file(file_name).splitlines() segment = "environment" txt = "" - env = os.environ.copy() # later_version: env = os.environ # default directories (from .bat) os.makedirs(Path(env['WINPYDIRBASE']) / 'settings' / 'Appdata' / 'Roaming', exist_ok=True) diff --git a/winpython/portable/launchers_final/scripts/env.bat b/winpython/portable/launchers_final/scripts/env.bat index 51b6a177..1bec9140 100644 --- a/winpython/portable/launchers_final/scripts/env.bat +++ b/winpython/portable/launchers_final/scripts/env.bat @@ -34,10 +34,3 @@ if %ERRORLEVEL% NEQ 0 ( cd . ) set PATH_CLEANED= - -rem force default pyqt5 kit for Spyder if PyQt5 module is there -if exist "%WINPYDIR%\Lib\site-packages\PyQt5\__init__.py" set QT_API=pyqt5 - -rem modern Pandoc wheel need this -if exist "%WINPYDIRBASE%\t\pandoc.exe" set PYPANDOC_PANDOC=%WINPYDIRBASE%\t\pandoc.exe - From 51e5e9cb2be03f537a6d89f3e2dea6ab3a650937 Mon Sep 17 00:00:00 2001 From: stonebig Date: Mon, 11 Aug 2025 00:38:56 +0200 Subject: [PATCH 305/305] move pieces of initialization from env_for_icons.bat to winpythonIni.py --- .../launchers_final/scripts/WinPythonIni.py | 34 ++++++++++++++++--- .../launchers_final/scripts/env_for_icons.bat | 31 +---------------- 2 files changed, 30 insertions(+), 35 deletions(-) diff --git a/winpython/portable/launchers_final/scripts/WinPythonIni.py b/winpython/portable/launchers_final/scripts/WinPythonIni.py index 88a3ce76..8717cdab 100644 --- a/winpython/portable/launchers_final/scripts/WinPythonIni.py +++ b/winpython/portable/launchers_final/scripts/WinPythonIni.py @@ -76,13 +76,36 @@ def main(): my_lines += ["QT_API=pyqt5"] if (PYPANDOC_PANDOC := WINPYDIRBASE / "t" / "pandoc.exe").is_file(): my_lines += [f"PYPANDOC_PANDOC={PYPANDOC_PANDOC}"] - + # theorical option: a "winpython.ini" file as an initial parameter if len(args) >=2 and args[1].endswith("winpython.ini"): file_name = args[1] args = args[1:] else: file_name = "..\\settings\\winpython.ini" + + # env_for_icons.bat default directory logic transfered to WinpythonIni.py + + env['WINPYWORKDIR'] = WINPYWORKDIR = WINPYDIRBASE / "Notebooks" + my_lines += [f"WINPYWORKDIR={WINPYWORKDIR}"] + + # supposing winpython.ini is given the %* parameters to apply in python the [tricky] change of directory logic + # if a file or directory is in %1 parameter, and current directory is not the icon nor scripts, we use that directory to define WINPYWORKDIR1 + WINPYWORKDIR1 = WINPYWORKDIR + if len(args) >=2: + if Path(args[1:1]).isfile(): + WINPYWORKDIR1 = Path(args[1:1]).parent + if Path(args[1:1]).isdir(): + WINPYWORKDIR1 = Path(args[1:1]) + + # if WinPython launched from another directory than icon origin, it's not a Drag&Drop so keep current directory + CD_directory = Path(os.getcwd()) + dp0_directory = Path(__file__).parent + if CD_directory != dp0_directory and CD_directory / "scripts" != dp0_directory: + WINPYWORKDIR1 = CD_directory + env['WINPYWORKDIR'] = WINPYWORKDIR1 + my_lines += [f"WINPYWORKDIR1={WINPYWORKDIR1}"] + # classic WinpythonIni.py actions: digesting winpython.ini file my_lines += get_file(file_name).splitlines() @@ -119,12 +142,13 @@ def main(): if segment == "debug" and data[0].strip() == "state": txt += f"{prefix}WINPYDEBUG={data[1].strip()}{postfix}" - print(txt) - - # set potential directory - for i in ('HOME', 'WINPYWORKDIR'): + # create potential directory + for i in ('HOME', 'WINPYWORKDIR', 'WINPYWORKDIR1'): if i in env: os.makedirs(Path(env[i]), exist_ok=True) + # output to push change upward + print(txt) + # later_version: # p = subprocess.Popen(["start", "cmd", "/k", "set"], shell = True) # p.wait() # I can wait until finished (although it too finishes after start finishes) diff --git a/winpython/portable/launchers_final/scripts/env_for_icons.bat b/winpython/portable/launchers_final/scripts/env_for_icons.bat index a6ac886f..4f3a4bc0 100644 --- a/winpython/portable/launchers_final/scripts/env_for_icons.bat +++ b/winpython/portable/launchers_final/scripts/env_for_icons.bat @@ -1,39 +1,10 @@ @echo off call "%~dp0env.bat" -rem default is as before: Winpython ..\Notebooks -set WINPYWORKDIR=%WINPYDIRBASE%\Notebooks -set WINPYWORKDIR1=%WINPYWORKDIR% - -rem if we have a file or directory in %1 parameter, we use that directory to define WINPYWORKDIR1 -if not "%~1"=="" ( - if exist "%~1" ( - if exist "%~1\" ( - rem echo it is a directory %~1 - set WINPYWORKDIR1=%~1 - ) else ( - rem echo it is a file %~1, so we take the directory %~dp1 - set WINPYWORKDIR1=%~dp1 - ) - ) -) else ( -rem if it is launched from another directory than icon origin , we keep it that one echo %__CD__% -if not "%__CD__%"=="%~dp0" if not "%__CD__%scripts\"=="%~dp0" set WINPYWORKDIR1="%__CD__%" -) -rem remove potential doublequote -set WINPYWORKDIR1=%WINPYWORKDIR1:"=% -rem remove some potential last \ -if "%WINPYWORKDIR1:~-1%"=="\" set WINPYWORKDIR1=%WINPYWORKDIR1:~0,-1% - rem you can use winpython.ini to change defaults -FOR /F "delims=" %%i IN ('""%WINPYDIR%\python.exe" "%~dp0WinpythonIni.py""') DO set winpythontoexec=%%i +FOR /F "delims=" %%i IN ('""%WINPYDIR%\python.exe" "%~dp0WinpythonIni.py" %*"') DO set winpythontoexec=%%i %winpythontoexec%set winpythontoexec= - -rem Preventive Working Directories creation if needed -if not "%WINPYWORKDIR%"=="" if not exist "%WINPYWORKDIR%" mkdir "%WINPYWORKDIR%" -if not "%WINPYWORKDIR1%"=="" if not exist "%WINPYWORKDIR1%" mkdir "%WINPYWORKDIR1%" - rem Change of directory only if we are in a launcher directory if "%__CD__%scripts\"=="%~dp0" cd/D %WINPYWORKDIR1% if "%__CD__%"=="%~dp0" cd/D %WINPYWORKDIR1% pFad - Phonifier reborn

    Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

    Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


    Alternative Proxies:

    pFad Proxy

    pFad v3 Proxy

    pFad v4 Proxy

    Alternative Proxy

    nA>nq5n8{Fqg6Sx3y(oLObO*b#HJ$hTS}+z};S zf`trldrgTw;ge9NQXQe=ufM}99v⁣xW^53OT}TI%Lgkd;QpIM`FL3zR0Pb7UqQM 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 diff --git a/portable/launchers_final_proposed/IDLE (Python GUI).exe b/portable/launchers_final_proposed/IDLE (Python GUI).exe index 01eed2ceb1d8abd7392722bba7ae4220f72746c7..655231994190695525c083a6183388780987aeb7 100644 GIT binary patch delta 63188 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 delta 51248 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 !WLwJ9g>wY#uM2gBM8$#p^+vc3yMqnBR z&5_*A);N}4g@l$>I`!N}6@jtE7|4>F9E#+=Dp)Hf4K_h|+BfDg;FnV+-4YCH_niUZ zZYPqDnQF(U%`UjzA1V2`{r99RjBQo98z*#)Hc6hm$#56l3!?n7ivv3=>F8MF6+sMW zAr5cha4AD#(I6@9E$9DuUr82_EQsZ&*M)=I7j6y?h>Kk<-6&XXq<&&tvm@p;@|vj| zA1?6Yr>9OfCp#HyI5}Cb5D-s0t8!lsr?;nDDvaE4uv5El218I-iJIvB5##F8h;egS z#8^c7ePwsM7R#G0(_8N|@{GK9lJ!ITCExO~3{oFwq&=axbsOV-tY7fiI?SIgF>te9 zzcF^>is@`&f{1F%)%;yf)J|R;tDFBU*%Z*oC9Jb>sqEGZbc|~3lKy(`rR={*v2_MW zO!-r%9&mVLP}*>@Zny<1`^`ao^3mNpK35NKOcmEOCPOmb{^|T z<@F$OB)jczcK&z23tx5X$>~Lf6)X{Nq@_uQ(GCq4jd1g3=||6hs$Yhy>d&$wefLNx zNpM|kWDjXPDI81>>fVLD`0HMrzuH5_meKYc$Y}c`cobpu5SiU&{R$Rr4?>M=fYb(g zE|q8146!?s+1Jod#i$bFbLJu!#`9UZtEiFoUHwOPqvw+w(33i?tC&(E7t<0ryDoO4 z4bSLEU2AwYQNp^9@3e8rni}ewQ);ar(Tw4Fl5ZJGTcjJ?t*h-~u&U;kiA!Pe@c4Ih z;CKvAg0jR_l}Sqw-t9ze8r#yow;q*uf-Jk}E|fI0{@CD$0AiiVs={sn0LvM!yDB(|ojjCXBP95L$BtDbQ>Rz-pv zv^s=aSpr%;i_B3)WU~r3BM2a3JallW6cd)xHxhhDt8b!6>gForg@ZE(%Y;OXZA9vT zv9#~;M`S95Z^rLQ`+~eBIW|%a8C=#+pg`hYHeLTEnxyG_h=*l}^hrH& z9Z1V!oLMWQ$fR!vE}J+rpSuCGjB3ij45XWENIw)vVITnmSOwY23wr>%NCD~rr&8eL zFbBXn$A)vRz&V8UdK{cHdcgVczmJm*jW_9(mzok^;ma4Oxi-}OZvyUrB*@L!#jMdY zH*z}tNFh1?2{`svvv*lWmQ`|=q7z|*cn{AuU`PwDf09rk9KIJwtwwclSeHmwQ6ClT zz7@uXwC~;w__MpfGpCrVz8y}QA&uWnU+n_l{ayA7B4O6fjLzk?b*>H(qYc+Xvmi+l zKw7Un$3~~|g|S<b_e-_X98BTHX9Z-1+q4qD(D;H%hk^Yh7h3YY_NiY2REb1~wXbC6{7dh65i0&#lfLuY3a zp`jbLt{B*C{q_R_BF%@21Y0nFWSvC_0Pov|PYkBRekA&>=r=uNLikK+*w~H#Rf2Ji zcB^HGJ>v1YQPaS>lhG5fkC_TPxiCk+n8hTtbxYd!gNJ2|;$&dA>$2OcSsAz+qK5C& zYq1=QefJeAL<7FxEr3qHdvRpfE7Yz+6kvyfxCpiiL0Rf=Vk?{tSS6oXm$M#OF!Ybb zc0-Y04Ec&KVUxN*xQ{YVp7{I8>icn(WM|s)LPmMt@>@mi@|8(x%V=AmTyrwk)v&2M zt=rfO*f%Hy1yb2GSqwEX$wC+KymmYIwD&)HgEa#9f-J1jSc-KuU$J~8kEL>K?XW90 zfHCX>&#QD}Sj#oAyGMri`YjS=&gz2)B%R%FBe1HF_h##`u2JF;#Q`MWf>LlzRAF9Fat)EAELV zb$8edeck?*)W+-{cVnq*|F?|MxS0jC$emc4=ho`iNKT@Ou#umM?2#f?CE_LnU-K*R z{k3H#=d+Bvys{ zb9nZzE&B&gZc;@b?^!gSs}$o_ zG25j_^^@hbIcm86s>JM$QU%rG8R=i))urb1q34I)$^i95hJ(taLat-qcLNOM@u&G_0> zct4T{;U{22b=oBB-@r%>4;8Dhqh!^-Ir{xkjtHWJQl&cJB0jGes6S^}LmI-t|&oKjj+}nAqXx*BEz1xeKFL>U8PqShY>D2}w>rOyd7VEgpCC zU=p6j%P7Sj=P4{%v@9i-9nU8+HXr<1p9c;YTM=2pD+i^DY7UQAF|T5Mm%xiwY;BF< zva#6OIGKS7FTB!=SE7xvtN0_Ubx^jGv0I`>XLw~V_R%aov4x83sW=8BU3&ev@v-yN z%7m3$52z}g!WT!0s3gLDt92z)8`#KJ)Fa7@BZ(Hb^#SFgxnHIJA_J;W6L0Mx4~k*z zXRPZL9PteZ5K$_WdXYtOvoJqoD!-Bttdl!c9FgePL4^#3cx6}EjmRs0lU8e?fHd!g zOG4$K3exg*nPxJGwB?UtvFQapr{X9^()_b*`fl5U{q694_02f$o9WrX2TL|L`tBA< zw@TWu^RKbfFOn}1+oQa z52XZ$#7-SIBA!nI>es>$f6wj(^FqA&FSS#Ol31CG;b*^y7vH^Rkh}bxiQwFB$swd0 zqQ~-$uk@zRa^dU5{C=a?r(>sdo2|e9EBYv==kx|Wc#s2A3i5H>v*%QBR%th&VnZ@8 z`lNk6U@#H*_m%lO^?sHKt3{o~NmPVIg_wvETa7-}3Ze}WrM6jOFIgpVHDvS{TbGPh zGk(F1P&KU{;mi&PTkg7?99D+m#v?iwG+zK!G+Kp?8@`}?3vMU$EU-@B)tV7M)4rRP zD&ZN+=Trd>(71=`y@)rfJYRJsm(Za20JOJv?UHMFSicbpXZqf;v$jdrj}_6I=$7LB zHn?`q!_z5oW*c}g>Z_Zrg5CgR?19GGLt?T?in<*ngR>42Z^l8QREz%>(qmQ@Zm2AV;#BT~*1pQSpET#|D)*5t zCfxyLZBrJ1^eMu8UQJfESu+?^Vwv9&>nn3Gn}Jkc+sx(y^PI_5XF3s=r?EESJh5VB zE}P9aW7P}%ZTiSf&|AEJ+BXb=kd12WO8ZVB3532<3gJ4%D>%u_tJ2J(5=0?~K75~U z7UGijZKV)67%o~yStcKOUVxJA7C4Uxp44Y31uFC+`Ka(N^8I+MYRzjzZ3t|{+MaH& zV_<=u>c!csak{+`t9YN~o>~?eT*GG#?N20; z19IiCcBA_?NJ@dr?h~c=cWo9F!9(nn>o9q(f{08}wB)?t74(6{0Js%0HT%3#k z#F3ns&l=(F8u?xnVAxh_SeRg?R9;v`ZYdC{{DkM0E3wd-VR7~<6W(USbtkq#+xE(? zUF@@7XFM4!{vrd*z1%aMQV3d#$b*@PRKhPxyDUGR?H7>D;<*dO{w{jdiIG>)qsyg2 zCj{xjek6LbXj_*%LERU!bz4BHs(X~2Z`VcIzeNsv!}Dy}PMwr?20n>mH6pTA&dkCo zP&j;ZFA=?CDq7ALdLU30K>xnli&`$qc;HR+O?}r^^onS3lWk?xOWtXa_%yxg2-Ln! zH;zE?J7x3dlB($B%-+INE6hqb=Nlr={bQW$kf_mN4F{b_zj2(?cjblcm>s*!&$`MS z0Tt>*;VU4A-nCRYStteXM9iT_BgO%^aHNFbv!;Ba!gA>oZEq1q&QY6nEaLt8U#RqR zDuo+DK!})kxWh(k*jSg4eTILBZZWz>wb6D)lKr9Mb11IHThg?WBKZth4`A&;Z90d_ zln6_SEC{}D(*tlQkbEcLd?T}8D@q!v9$wihSOa&4TLjzhdsDe0J+U!#kxLL#V%<_c zCeP#a_KZB{R|3iB_H4zKe!WfM#Pw{H;fZUmQx60cE4tcEpCW-aY1f?0=IQ)KTP|FT zVpT>5WugWhNDRl#lOQo;4Hr<9M71!W3N^nX(n<7dy zLoRxlhm`IkbVHpV@O+9@uYE2wj2#H}oyQ~~({M<<+zF*MTsKb@`iB3PE+xZshP^K=Q#pDvd@}?qBSY9) z73;Q=J;i}hv(n12wHffbDu1%F7%ph_u^S8#&tST~5jvlA9feIu^a54$OL{isF6)qxGS*%~4>K8A*<{#DQ)F5;S(kszn0WrzC-!q{P)P13>sg}PQKa?6C?5}pRbl77OBM2ZtGrS>?=?GbJr9R9RPqv|8s(*H%%-n) z1KFnM&h=<=mF3K}v{$z=HVBvR6G%NGS^w5k&t-OPVIG z%yWlVI3wvMWN8A|KXRfG5b3p>nomhh)J8|@Wz}zMIen3~`>a+BxRuufE;B+@Z|sbW zadAOXNgw$t*m_IWxacFo2IFFm)xSNRwgZON;x=Sl?Kjg%mZvD*tz_H{;X+1=AK*v$ zMt8#JeHo!SFC%*D!QvD;o~b-sMIvC=scH& z1#ujoxzcOhX{U`^VY!dx5Wv%#lT9?}TwIX%u=G1iAH%7$;n?FysySx|oZ5pDoCL}0Gg(ML zD@SHxqNvc*ht*cvF=4?j#bhxI+=W$5;H`X#CetyUFUKU1Q(C>^q&z``lndt@wR58!RG77JdL zSePAeh%s1 zi11HvsBKYzV1?8I!!wmq61rd=pa?ts-)mYKvV9mRh=u{bk`k(J+)D()R?1;5`ZeED zYvefKi>hM$B*T-Qh~~7@dO|g}Ek%UbHcJB|6rWFV-8d*3;b?lNAKWWMX5@w#H1pWd z1?wBQZ&ru(JOM}I%d2S1Hkr`^zXtZ-z+c74E~TqToJ3 zNrqRd8q47R7r1sQ{xP63xc}>Yk`#nzC!h!O$;eh`F=Weo76iyO2B5N9Bm&!Kc}1m! zA4teL)Di1t)W3L=@D5G9tJ-Es+FBs2t<&YoJu+cUcEup5A&Vn|9T(ldsnnR01Q zC7+LtA?bp7SOtwLm_O|aQ(5Q^?OQSqa;LO$^t3jx(g&rMUXPO1a@qSTJs8QZFRocG zs|f5&`x!bFoP1$nTkREVO?}8)ZqJ6ILh=}W%c5<`d{p!0t z7o0g3)Is$6!NAQ4`}BkRagQ#X7}1_=vk_UpCxgp>B7oDUV!>sv_f(oI&^#~U{R5ZE zLQXtpjg8J7pz{uTeLOl9Ke|BiBV2(ZGRvWkt92LL zOe`=N8wNJhMM}?Mih{3bzm|yJ6ZrtIV8fIK_Jl=qJ4~=AV~md|yQ*0D)fBH4r&*F(?vsB-wc`dm#_Z@Bb1~wsvl9+55tZ$Q2lrs$y}e)Do*g2Oh6iU!Zg2%YOu}ZA)!Up5;!dGyHXW6 z{9Skt1@=@L9Vf*5H;nCgypI6y^U4Ruryq~_?RH_C-wim?NKcIT9c)G!>k9BL$S#vX zO9Btj2APDw&akmnO@lR14cuY^26JDd`lHwKd%Jw#yfJhY}YVDIa$$a>q z_!l8=;>R#@Q_n<=xx`p6+t=O+G9|(Jf63#*nuxgXmsLkfTA~EW7#)$Oqqz}$D5kFL zUsb`cv43sTi4PPaH7Y9V!3O1~8?jE%ws?v;u%pU2s3&J&)FbL<#!TQdPBFP{L-yTXW%P;~pGMN_Czg#X#+g^LowS}i zqq>T{0xg<)feE+4s^lnlDg^ivHMUe4FI$Jsvp=p?7@g*>FqgWc#u8$5wrceRf;jZ@ z3*seV;|){KvvisWK$!Ba=Tu{wtceNuaQzS~FhALwx;0vIfu0Q}xK~yaA?iywq^@yw z#`(JO8h3wMd8Y%H6*_{cxkW+RWZl5?pCUMsHy-;&^eUpyj~rNKu!BC= z*E-$w!%qPY;*D6DbLQFO&RWt(*Zzsq^O5F-Ua>j%zEJ8jNgLwtRIJPi*K}SO=g`0; z3<%p}zAD4^r%1`qXt4bXpoeR$vjb^Lp0%VPk^%OVb75|1Ws6?&I=k>;Zr73=rvKsr>m?7^5@_TM81K$AHGdW0Hx zcro*>W=F`ChlLz5xZH&(MmI!FZ#vAj_#!qsQu4Yia3tJ6QrmV|SR2q%QvGU{J?O9j zPZ7WZ^Z|g@ENgX$qE+>jbuRhhmoa7O%3UYJUXX$h6|Io9UHh^u@t)KQ8{d`eo2>4A zYz!tM!!e@TU=hD^S6szhUj-Gr3JL8hf4hW6iKI}fBn2hTNf}GSp1hiM=1972;iAyk zt&Rd<*cT~)Wqm>^KqMf%f0l;$uFqk0i4=BfTnPbFxu(#1jz36Yx=3N{#>IU^0$4>G zDI+UPoq&@ISYhN1&=bYTV~_U`sE%dg@NaPiD4NYcIS!@{TP_eAPVL951ht0ikwBJA z)UcGp=$u^K(%>R3!MY1LpSnmb!+~kv?3n7k$(2zYhj8HxAOHWk|o>B%Gu=hpw zV|Llw^%OzKeu7V_;9}{^0_y;T381rCK{6^?L3>t<+2)}l88#8TT%>)Mp9tQr_@SQm zL(Xos;nBSx4R4jiP#DM>%6^F|g^|pYk2zZS!|fu=TpL#2j7l73X7xRCSzUjp+*had zk8n|5h}*2fe%?!YFXcVNdx-aH-m7_^&HHSQQj^7fbCC``cU?qopnYzoV}&zyI^tx5 zlOb5a`TV&LcXY<5dhx5Ws~C(!nmx9cE{-TLx1JkyyPwxdKcoNObPdbzbE#p{Er)dL z(Hr@b0#TW6J+@2cc_Ikozy7v~G$(ZWTaQ{MWI1u9Qitq2*?_3ag}Gj8Z!&J78~Fb|E;)>vIT|gy8>9^?qlhV zUpK$cD*60HnK!5#7g)jB?wSYxXN}%dpeHBgt;TeTeecIY-?Zl&=k5Os=T%!v!Ar@} zm3hNeq@yR<;~_UE=(8M1mTTCTc&f z!6MCGfBtM5P$IzsWjft$MDl76$$rdS0?m#mV884~vH`WaGiX=3%#Qk}pm2pV-AL=f z4GX_oSy6-xKfUM*cJ~5*%3q;9H^Her*P7}Z+`6b>Lq)*?f4V6gY+c+T{(_Y`1Vz1N zOw5x=k_FI=Qo<3oLLrLnU^cUU0eBEOM@XA_5_5M$Q3%s3EmMoL61wpVK@}m35CzQ1 z3m9Rk6fYLh$m)ZrcT5#lC&iDeRlk5i99wY*ae%fh!hAsba3IGS>su2oEcC97x^7ST z4&>y-`pLV0<^3)q$Q@inuyMuxg@q(#WT*>z;!|h5B{eayQz6Nm;v}Hu_XK$R6P<&X z^r?yVE%cfb{Hc?;R4nt3?7L5HG+0sBR{$Xzfz{U+3d2(q1Gzf$A2zv?nX}2&qAa@dct z)3}Fhm(`y>8J%K&9A*8CuGy4Djw>^sLbn#~*WogDM*TXr3 zC8;YLqu3A5ViTwnftv+*E_kvBT8T|ZPue~`Y8WeIuh)C-8%u0a9czyDCf@5REdG^c zq&vkeU`}))8Cl}9KxxI*ZT*ccN0+p^Dy5TC6jGS<81UKl3(4x@$D%%AN%E`1A&0oD zkA~`%laQde#A-49D|zTQG6AU@?Atjy;iK@R-`gZo2x0Kl*hQk~jj)HDE5vpXY!#Fb67lk$&6P`^drj>oLl$5<79t_)*w~ z9q}lRrkO%ck{%}+wAV-4Gd+PZlIi*q3ozf_=3x~>laT}8CCv?7&p21ZozvF&{N3Ps zgG~DZl8jyPbS{)YwZl#Hw17z9p58113v^9ZdYAb@-3jCR02-wznvezK3+oe*AJ}7b z%2K|ZbrdzvT1PJ{3=U9muYo`>^LfNzk-*S64>lon5s=%iUhJSAjTZ79Da*U z0Ed#H#Fb!Ye2kE7J^4E!L&@t3=OwS>YSMcOwC9@@Ef)%oLa_{`y8S(>32|ga6Hj-u z4eMnlQJB;vg&Bta!`aX*l#QI^Jz2O~{Vypc1owMo*A#s(c4pc4ow3uk=faTI{#-#m zuwa5!U~irG?qr^><0Yf?bbDBA>+1Nn|)wD#u7AZ*#Zz zW!}n%ofhJ{gZi&%i51s=kmoVu`uQvoBR5pZz1-&bu`Gx1KZTe?&7q-4)BAZ!zGIl?_Ef{jaxD$QzVxc0CU3@$o3yfVKccYWAhac*Hn?rWJci}wlL zEjuNSnAC)M=9_5ASMk4rLpoUdnHuZp#AkW2A&JjCF;DQDIKv$F&Y$dI4%;FLhB@p7 zNifV|e<2Yqc_%Zox_L!`n$M}`xDxI8ijzC%C3AH1vK&F@XYGS!B{I#u(5v8#D!dV5 zeeaW!jcmy>KTW8khw5-w`(m5+u!qyW>u!>{ zb=}KhrnK+r8`aC5ymb3@Y7d>qie2J2YhMi_QFZoSQV?GAXV!jLdt}{0SK`na@v{Rv zQzf;B9(U)_cd8#H0GffW4G}+H?GS*95^F=-@ z7ef*HNM+s5DAN^^pDxfUTljw)M|41FPLlhRDS)3rSZb(Jcpfs;EV?^cb@w}c03q(3 zqJ;cPgR%l@b&tvdFgm!*zEplaLPh=aGIkO_!(fh`q$f7y@OpmyU-BzWWqQeed15!) zkfZN7N)M2VD#*czEFb(>d$!Apn`6<@sX7MXn>dG<@#l_FFsPwmP??}bDrTjqUsI7< z$k+$vmzHu>{NFaKjca=B7u&0e?)@W~e|z;HXLZH@V~+1O0cZTOfjvxJ>0F&Fv1Y5G z>i+WYyYJ?pJ-1F+x>r%OQfJJymJKYIBqqeQqUQTJ8F`IP0dq>HwT%&F5g5B#Hy?8# z{z-fs9A;@L7n5v9wX@HYKTKS%o|x8&En-@~nj1Zx$c4!ZS|+<4jy`=hOfKjXT5*n& zP&sC|a6e)7I`MqivDU{M?2`_A6!wH^ibN^g4clXxbkf$7QR${+I-7Ou>gLm`Lm0W) zw85=0Gz6%6e6Dnb2DtV0Q;|z*xl+$%D1{4q}2GFh+{v$r#0I8JHcgZdxHm} zrWWv19yZ^lQxg9R`m5;~$6T5NX>(e>byQfevDa|D%SIK@ey&G6U(S19$Q{4s1)pFpq#E!O7pR6)W(dQ+!d+Qk|7yvB@|HGTsd*Dm*i|E=5%RZjM|=pZN}7#+gmFZ1hjcGquQx-d9w z1f5v)Ll{uhJZ})Nh%J?4O-)B>b6g{B9yn0ZS?0tnkhr_EI32s#`d5okAZPq^mh7OC zwpia_TYSiB%qQto!D`Gi>6B|V1|#Cfxj%~z2n;X@to3d8FuIi~v7{R$g&+PGx;0%3^9FLz~E?8@la8HG` zfg1&D2P(ER0@zE%_Ttn~>n|Bl%{((bso^p!MIaDx#71Mda)7kj5mM4ZMN`uCMVW-7 zEBnm}&LLhQ7956zH)93<%pWK+1Z{~G{XnbxKk@;pH(!bL_siRyLfu@D_mZqUJ@*~N zplBI}y{nMHg5y_>gP~6wpX9;Gli6Y8Q#}z(%LD|E#=-}BIb-7v^m20$!|0p#T|P&8 z7&}8Z)-(JWbP~FxHy!H5JVp%M=jOmhQQVUiJBnBKT2Zm13@3mbT@jB>;xlLb5oLv; zPpCBn9^Z^5MpT=-im}GncLsfz@6R7NAhdSQR&?dJ#Jb%B??XAIHx9j^Vs9~m9Z_l= zyhHceTUOKlQ`*{4vA3+&*a}-6gmER-hYEFkQVvjuY&SS5CoF!sKPqG{hO(3|1E zew18D*42&K+R9LkNKDQS0Vl*-au=m$HIW#&4A)gp|hFAJj=zh5BP=?&t~ zNgU19>d#W86iw>V^^+`<$d!RN#NF0kHX{;VxPeAa0fIcsk^ zy)r{~GkjJypTu5_fBbwwSwT=NSA8rE76nw_(NoTu!ZZx}oMSxU~I?3|R!F=|)vE`msu8si`C5AA#PR<8DPa!|Ay-$`FXuIJeUXNcqj+s z`&zO-@bc*<5$*7$k9*KK#p2X_iiXh5kQHfuQMdu{jn}MNfb)|dWh6yjG~+Jgb>0_P z^VJ7qJ0)=wTxGvuuX30(j#yLW)iBTt9M%%)gkfNLbXYgr>1s*OlC){eCJpexHh>51 zH_5-b!=S+h_Khm~Ex0ee!A;5A$jj2uQd;B^yMLn=yCv>yI_^48e_u_Fgt2l>-MbvmvmK*m=z!ECm#?pd=>i3W;x%J1|tLxX|c>8V2 zC7QjEIpVwb#3mC!fLe!Sv+h!Oi?L0~rSw)w9&4B>t|78s#}xo+J0*&potz4eh8VlT za(l(tYbnqPG-XpjK%Cl9TP}@Ys+o?dre;~8I>c7#$Qb^`sKal@1h!b`{6RVfehu(z zfM0X2I_xWV+^G1NnG^Vb+ zxVqd0X*UQ1gYgoT_$BEZZlsn@6t@G8q7y`k%6LSJ3?6Gu}7}%r4 z4MN5ZLx5Uezp2uyW`{~AvcsM%jS>B8xCIZj?Lq~t&31V&SufR)!H;fP4R&6k6yx=A z`&GbLzqQjccI%H)+vSm$9i{xqhAIdb^;rKpEO^^wy|7z)X9t5xy;Fey z<*#h`{cP)+4ZSrBoqixMD!NKJ?nvL5?x=7^dalkqGEl<0mS^@oyFRn;*_pE6d#=#$ z56`Sn)}vaXQlyW)M3KqtC7Q|0tWks^wMMP;z=9%TisUPEqqSaKG-iYFI@`u+xPC_y z^{t{T4rlYn&$MqWy8m@$YxFHWmkzMoi)GS{Hv3~UAB9kG3__U;(PBl7vM$(4rL2x` z?}o#&hb9R|!#Wp#2H)fW6nY20FI6sJCGJ!prDP7CfW9a0A_V$vkbh9fD(5C)ew(bH zQ!LdYRu@?ms<9LJdwWo7NHLdyowp7~)^!2cRO9}m52KuN&h38&0UWC`$J-*tPCc*# z0d^&a&$uJv4XuvALFmO!LCLyyVPI9km$kaxf-`kL*Z~Jn?C}TpYIRTWq5Tj1sWSe4 zz)>P0xkLzMZwOm{r9vF^Cq6Ch8_b*B5H`V_`4ojJz@O<8+mW>#+(FPr+gZ*(iHy9} z`jMSGK!xIvk@j6+!xLJ~0N;%({E2+t!o6RrXDPx`nzJuL_wcKu>VJBLjA{>Yh}ql4 z#;`y@#&3OeSrPsz*-OG+QDwQpo3m*5@Oe#$;n^qKN_MQ|pyPJ?yzSKGzf>qqoduj3 z6ihXch>`%a-KTWb8N0(%m%pG2+tXMr`u9xR=D>t@dGt|wY`K@sis85hYO{JMt)p-( zAPu^1@t*kCRbFlPY<0Ca|MeY@sWJ)nFKC|TSnIKu>v%ZAh2hI5L*`GC!G9GsJS zz}Y&z+YV>%QMnhb?GaYD+>7>^2~;8LAWH6cvwkI8w8y<@8|a7Ji}n-XoNzy8Wmo%N zwB-U=?nPTnLLIsCJt|FL>2X*WN>_J52-Fm)d(m#pfIqnlyi(LbNLM@q_Jy82x7xmE z%lLv}oTeISr#Vehrq9b`^+0KBt8hz@ds)<|D|(n5xp&LBzvw}d#_M7S#6UZ1+(3B+BnQuZiS`@$1;6$NU0-njB6TcD@SpDwO0BVZ=`+aN;h2A zkwU4_MIyxl<3{y+C`&n8|x zq1;HsWpYdym6)FdO8fqN8Eqs+@;|Dh>2fHKT3fu$Rvf?6FCLMA={HrtG*|kH(;yoZ zzDTqFyhCgw1)vC{O;~iAKGt3}7F&wco|GRb75|`Xu#8Z}kq(mIIPI?!_-GcCVFJa^ zK47wZ#k}`z(Lvc#pab0JCj;Q3kEBcR!gW$=r*pP4Dn1~=LPkZ(u4CIrCzonWm+8R1 z!7AcjjTZq#ES1EgB9^}s|A0SS>Bf&zVTNe#)Dw4ga@%aCyj!kLFcj|aL2wF}nTWq7 zm)nClyT8ZU4m0jSP=@L86%nc?A~Rvs6+jcRfcTZF4^{Opy#>X+-kQB{AeTw`&ie*_nw2nw=X-ntG3gm(KTftEg*+7Q z#b}vz;X!r?+u-M1D^BCrtHRGYD^{=xu&TsPOB~9JMH7d5#ZFEfa>phl4)u+VPaM)> zZZn+1uCrtrKL@SVJxQ-{YH4+xP$kjZzP&Ti-b<^yPjU`9V=+`GvHn<>Y!)tOfxCF2 zGX4=sMn1DngtNLk6Ri++&+vSiB)jR|JT5#>^)8>8CrqJ{spUtw;91l^$@&IdWujfy zJcUg1Hw@M8%5x8>0pL|L#}7vUz^i7C?fN=;TOEvG!sYqE*Xzc=B-8CEnNv! z>?Sj%k;Gg#1>Et=tsNU7vLQLyy_Em`Ruk_nA@BWkLJFKqi#clK`|={Wm4b*PASi7L+fDZyy(xq>*L;smc7Cdt-4*G2AA2-^0^ibQ6=?7i5$R}Tur*bBQSB9) z%kS5_YNj!Y^!8LgmBC#Ax08|HDMM;iL*f95J)B6g(k&pKw%h_D$|!Vi>Je$tZC;XV zolkpq%dKmb_-XIoWA*?(CY^oI7p}`b;0FsOx=5%%>?%VaXf!ohp2wWAON^$XT;ji7 z2bvn=eY7?2_Fb5l&PiRs*7Me&L&4vv<~G6ucUTl3ZogU|Fd=d_4X6{{T*j8qvoPUi zPifX4**`rfaz-{*eUrPx*a)-vSw1c#pm&2e*}L>BG%J0M>q8z(PB*&+hkA-FJ&R%N-+Yb>m7X5s}3Pzfa2|Q0z|TRu>*uEdl<>VtlaY zn-8VxhIA<$vP~tX%?GXDF{P=;2`qo{6`>ms71gki*iEzLO0MP=QTbU1bv_`Jn2TM5 z3vCi}{fwk)pPp2g++bm?#5~X{BbF*I`upwaQ8e zYR~hP%D<2yki;=Dfok5SGHmGx01{~3$REhV zX$nSPV4&e{Qge?@>8b%@G>^-rWa>5xsn)#tX=nQmhWMTSMZe+t083VxW|>3^=L99UxC!0>A6R^odO18C^ixxvh>< z5fC_`>Dh(V6l->0>*vE|d%2qJcTRIPm8N~KMPxln6GsZ;sE?jU`E2chc);X;OiXd?rJhrK<=aJxsaW8p=ivfG`pGQgw~ z{Jy2?gbg55mxEr=6$!!-9&hLc*4n+YAGCV04O_2>2X7->^9-76A1})wdDiG6ac~J` zoPE3$EO$R`Y?qtRv-{1pUrcC7kLARx+xIHeyZ#N6jJqwrT;I{-9A8(R+lPI-&a-x% zReO%D0~HoK4t~E=>1&3)?|F=Fvn6tka3SkOIqHy$n=`@%!8^ zDCen=YER{mkv6{R*})}CWC zZP!b7Y0vdpkrQ6Q-KC8xQ2GOP)N70C`WUu9_P6a$h*Jz*bk>LMj?_J=c zs@DJEJuu*a;EX9ora2}ihA5>Kii|S~H5ep$DNIceAxs3~qS*0*VhK(Z=bSEfIYoE7 z$~mWtb~%Ap?21+=%r0Yga&Wq!mZ6or-)F67&Fq=%bpG$}eLuhV^LfvPJ>UIZ&${3C z+Rs{R?{7G8DLDviOx%cw(;oKv?~ylipoQAGW4C?sRdT#|N)P8^9QY z+5~+Qo9aG2g;P7DmHmbdaJObhHmDrTt7i@Qt)X;k3V28F$608Kqo_UNXJ2K1&n4Tj z{9*u_1eRYMeXIv>ZbcKoQzO(?baN2%pOyQw(D!~oPQ%jb`g%Vj?U}f0aVFq7aBmjW zZ1~m-9*nE{Z$M+fir{T{AdDC7;ajg&XBI_f^!^*%@$e|pQx%$4cNV>8rCvDib9vp& zb9%4%u z7I?If!HTX8A>JY8m#`z}NT~UxmRff&^Gliit>$O&0-4r2Tsbyi8&K7!-XUlhtzt$8 z7kluXNN1}j^!+c^&BUishM<+DZ!o1p8L*%FYAleVEWf=DSzfy%2WfBdc6!F*AyD*+ z{vX}*b0)N_4VR?k(R*aS!1(!8M#3rdu!DRVU%j< zt{!)xxnjS;n@bSlolOwxolao%UP%zUP@r{jv3 z_9KY)MiKP!h7p*tLDjLk zP@AsuKUn+AFr9N>1V&$8;UPdrQ9&UdpfbwB&2?s7eZPz1R*hK3e5!%}7A& z!V`6Ew`JMZw1hnvmzb9=pX|Er_T)#Xj^?dGEW)3*~G%U83f_p z$ppQ;DFi0(ID!aoB0;400)pP&Ap}w0Sb}JLO$*S+OIdVEBy(S(*}E5sdz0=jXt(3k z_sp@0k-pqjXwK!ctVLHtss_To9dER1K@0jo4q`YXphrNapk2s(*^a*T*n^sO5+{9U zpcl?QIAd@Q!Z{4*g*Y$5nT&H1PWrk*7S5SCpU3$+&bM(Mz~-IeX7fXM{%G;$(pdE{spXE*?YaT?1JAk_sAH$;^@bTe zwfGbm*0=Sb5uI8ViM!Z|G}Adov53xzmgRcC_MibTzk-D`E^>uRfY!OkDU(d_q zA$Fb}^YVD2U73xpa@Ws@xtNzXIrHb`;*ERQnT^?O4>W4G99V@_6R5^}Jm1CONpL%c zNh?BJ9ciwr>U6wl5s&cr&T$#0>T8gGsC2Qt7yIbXFjwD>tyr1)Zt6HL#n=Y-{S5yk zd}s?66OjVRdG0>vu)Q>8e@aZ*kB0gaQ})}IVQD6MY|PbnV{|O$>gjC=q~>|ofR~1Z zi}`vC8{YIRhH`^7pS~&kT{LBXLRfzY*3;@2#>LCX(i5_LwG^W5NkAkihBw0!Ei|wr z8*oQih#h$J2!e|wOxS#g-J-OUCLXDHPp(JsGCwA<$5K6%q6MDQ&(r4k>Rg zy98!uT;H%`B9>e7Fo50Hrf>7dP<&n8lO8>KQ~UK9FBkxlaAEhj}PHS`Kl7K1_9$e>p@t%*E;l z6Rmz2izPT%{eWhMTI@nCZYZ#*iLrUx#dDgAbI^O2&i^MpzaX*RCftH`_g*yEGU%@H z`c$#t94Z!QdOXLWwuEM_g>oDQIq=nvQ6-GFzzFIQ7$jq)2!m!AfF+S8ZWGz37~r}| znp-`~FnxoTS|pZBz;oUrN1sV6lPmlxu)^;UP2A8kmgi+CI>+w8#|Z9hRquht*enwx zDP$OZtigeo%4K22J+NO^!<>)?#~ausO(` zY)0L0B&BG+iC#g9BF3`V%!aU0c>_MYXpIttmAa zr&yzgHB`r5Qc?44-Y9eh$WVOQoAXD%UkR(m_CsADmU+0s5>Fs6NnMbBwln`&7VWym zTJ|iw(F}yzBie*KNBg z78$PNS2h@rrX|l!vQ_q`-Hf=OoDN&@E!~xFcf+GAUF!~$%}iJN=FEiMlkp_dWxL$` zkJrXqpTatUp55uL@6r;EWaWRDmC|m$qZ)TnD24H2f%h{L+NQy8sD|l#(|EX=ydlkC z!!FpAf37%^e#myn;M|H~8;rXt&45zXJ9;e|uAsgT~CRlrB;B6tUJ4HGsZ^%5BdZHB@oRAa8 zY&8des!PXLWG2_a7~b`&OE-Ckc+U9BKbULrO*<6zM{?h| ztjT}=8dVK@Ezhr6d56~Nf(49ogov`UN=h-?27xQ(Wq-^0(oAW-HvTdG|X)JG`0cn8vzg->S)|8{a`KkcIDw z*8Xc!22|r$H4OR&!Dv~bpE@=elN~*+sFfdyrXyZ21n>6SGDLM*@fm7w=*Ng)TJpR* z=y}_lu>tcnVLx5%ugg8#As2B#!;-b4CbKKmm^|wa@7p~wTP~(4lzYfA6{^=nSLB^k z8LPL9Ak{w}Gh5Q{IcDyw)jQE&XPr$C_kXRXuH%6?JC)j+9n@o~0SIlk#Xfq!|M1lN z6puIX&UBj3+LGNLGp?hoaEx`QuCU1{1=ft(A<4|&hru^qIPP$D%KkUnVnQE)n?pt@ z)Nx%-m$CIq+$J(zmF@Akb=LQ)zXBhF-C0pei&*WX&5GL)jzX9iSryT9g=tr4H1@Q} z9rF$A;wB*stQjl+NRD1bf1c1m)deFqG;#R>x}KPyE)v?Uv!Jw2GF)Ly*JahEaaQ196l*3~a2}x{!o{jhONBjkyByAbyC-16$Yc zw2$fA>xRZ*`*LsnRCfd&HEgFyp!iZt97*By@FQ(DV0 z%}xV+>isZAqbDNj>9U;(t<<;8f@89+^#Wq3NV?86SKC&)HDck(1(-K*c`!c87<&T0 zV^vn)DI7qV4PWhe7lbnuFAsY=Edk$uTsB5zbZjWLqM`1+g9prn-St!O-OtmV<1py# ziJ^Cr(%Ts^+_^1|vW9A+1^PkCZpuW|MAX8?cB+ZA>vS&WU#UG}ausSB8X4)gOk45p zyiB~aFn>S293$3q*7NB6t(xaTpd4a}^%58}Riq4Fj%Hc0ScEOMXJIdOp;7GD%4~>h z$#A9ppiMrJ=EkV$ats?^#@rfKQ|gQ{m$DC|5Z>_gBrXw@*PJdU6X3#uvcRPGTb{>g zPJg%eTu-gE4|oq2zm|^P5}28P5ZXq3xy8Kh zK^jp&J2k{J1b#!|n=FDDfGBu=xLpL%xdL|Z?2h5rYOJro@GHypbw=wi7;sI*fGetV zviTpCC&xEj-ZRm#ECM^6e{9Dr?`CAd$z&_N_tWUOyTEU)2zI8Di6(Nw>V8&9$`P+g0@e z9pxI3)VRo0u8H})?nL}-J4#j8$ zgBgtU@b+vxS7?YQo-`t`elbDB*fp<%ZiMZ)5z>nWakhG_u(1%AXv&H7*~W7{VbAy~ z^T$uqB{D_p+=elOE6eR!2BXdwL6Ejd(9nxwrk#xT%CMSA1Mx2Aox%~VWA)sJOEiYg zTgY+xmkIK_a=7Qx^EYaEuCIpE4svmSrRTgP(R+(;EqcB~wP}16)k{Nbk4qW+DkdPY zzaal7+;U&0$w*fet*@^N@y^6z6}h_8q{t)!=FhVS-ZoIH3VY585$DyYYjb5)pi?~4Rk>pgqK}t z+8R_}G_Wi7l6Ew-u)ZJVlW(0Q`fA)81Nv#FYXX+Wsb%ZO=)*I#8Sh)F9xlvDp}jwh z>$K!CRVK$4L>ezWPQx5MF?3_-W;a|Ba-t*a+?I?VJ2GlpLh*_>d0WGv-c6k$l(SU& zRrExE0|toMYtVGCbAP%ZXvKXbyVVov?0Kiq(Ypl$i!D7! zWZ|$j8enYEKEZWwbRK>6N`;=ADBIhhdB&iA0EP~v6+r;lK`WIbQEfE~_a^@$ z)ie5~M{jphjzYIkNVj!rAf89CS_%mqLV+iXDLg9VB+n^n-pl+lMz`KDXniO@sNVbf z60}#WVxa{Oi6SxLR(NE+xD|S@Mq9M9%X(_BiFLh)AA{ z2)Rn84q^Uw(R)Op_vqz$Arck*pvUovP&K{fiAT1O2IVc!1Q=l?(I&^^7Sg|9w246M z=)1OliA*4!3-Sb$!kG<&H>01%)Gn4~nsXp?ZNu0o%bbpU+2?4u(cm$R^JE2VZLh{ z#<87P>Y_O|w8pt7Vq3nWImCM&v95`3Vxe9OvF?do=38j8#nEiU^is=Kj5D=_HrI#m zf8p5Bk?^5o*k13*^bJ#t4p%?NhB@JQ#nkDEA?Ecj!J2)-r{=ZKk=qF!=Gw<_VSdS* zk@9UCRzH}hyo)J*5j}*`GObLF|^=FqfhA)haF}2N)w;YY;LpPD2HxF*7Ee zw3M0aV$1teri9cF`0?W`^nUaSfSum6aOv6nXka%$(?l5Kj=GU5+FZOo6MZb*4dtgk zQTyeAGR-M8uf_~VZR&Br7U`z_xcRH&h30F&DKwASX})!gFg*~n9(InI=MFbNN$$s7au3kFu7gV5 zJac#_7=5aISXe3SWe$t324w6#m=W5FkW1R&V)!lOV(sUMABGg8FxeRMJ}d#F-y$~+ z(P_BjBZxPTIn1-8F#jBn*~oZ&S~|M-CK6Z%_k$0>=mW5S%sl&JoNwa9Y;3&ym^o+g zAz_{qP4BURIn0EeHj=$8Wn}*o@VDSk;xK71`oQDD{U@eK? z17Y3;kB`E`J-FVBYdXKcc?4#|n`E>Tx5%g}**>-hJC>M7M?iT6W_TJuBaQH`MkETT_5N-C_dF^IV52%3P`spgYO+AXCqBz>Et7y8$0 zIa9*+K#XsJq=Yro#k%#5_ZGewsUcEK&x^C9eX_>u#6Q z=)VXb4h(*r@Lr?4hvQcJ4ng{5$Dp_><&j?O(Ze@9gx({6O}PdZWJqq7oOr z2zq?(n>$)7P`hDp336@c@!73Af3gf7Prm$QNi+a=d~x)t!LfXixEZdIVQyi1jJ*75 zHpt$sZ9Bd=xbH0TeK0Jvd<`g*l=+5Igdl2T{9ba@lH9S;Avh%6Lfh6_L-n;X_ z>@R@(#P$2LkL)~<^RJx;=6;1t9y~z!Fn2r5+^`qD^bxo@Fnjna!b7ve1V1!;@b$!h z%GrSvS(CF}7gNgBJ4o!E8?&BpZ^gcGJ39}=9C;YzWc;?Bdru|yp%k1#WwhhIBAA;C(T{zkI<$!Fyg{pp%?Hp;lifoSxw2k#`VIv`~9Dxf9T~PhJ3>TuS zLl{%Y)rm0FYNL6GT_2JfYrDd(Jxr547yzB7*QsGZkk&9I6c~?Z?%r^ZMW1P;I(`K; z3NKe`AB=ilA2t-OXwYQ7YdiEHa>y;_67hTzCS)gnS%zIn2C`0r948*)b>D55_y5}5 z4m{m=XSv#3$I>ue0PQ2qPepJ43IpAk$MIO^>cAu4jXg2T;ZJRMc-4GJABPmHmxcci z!;VvEg%I7jC<9D6I}Tw2}<%yA;dG?zAuf~N2J{txETqA{p|^5<3#@IfH! zjOMHq!%;-iKc^;#jQJHy-+#D zqwKe`T8ZmrH6VK(@zUNImXsdl~v@YOS?V%yAlP6kDmHnZES#B1Y001Lx;x*zg=1LY4C5Su7@(3 zRJ(XYw<8zvT;@55z7wWZ%aD8a+LfzAs`|Rp->7vTg1l;TZChx4`WtDk^!cPccalfw zw%{65Vx@Qs8)bejnOZ%T5F}<2>MkuP!yA>7=(*31<+~zGtZ@O(D|OAfK|G3x(Btuo zftBY63?{sTP~nW|NooGpE>hx22bHcdOYdSsKa<8YIsVZ^+<1 z!WOLFqAoS;-S5#w;hjdbXyTE2Bh*Y5O(=(lwIMHznCp&8X{#DFc8}SB^`c)`op>aG zAs)?;9(3-v!+l)%#PD={&mP{b1_i7DKyy>O!y@!G^a6-maKm?OMXN!_O<93xqt8V1 zr9Qd#>mn4F#~gpu;o6I_nuFHEUg)4#do4<!5(=J;Lac)13n zh&sN2LpL6){n})Heo&mt7>D?qwp0ITeje|*-)?>$yDPW0pwk-aGb=QY4!iFKbc_Az zY9p?eMjmsT6Wj1}VXM$9)PBwP4vLAaJ-8~9*@VhT+2q9Yxwvm7dn3tO+ zw^E@n@Z!j$WB0v*d5D(!tBp`pTI#b+5~3U@S}c`#1wgvxjXNN(bs7yY3Spx^OQR4N z8QAEL(#QxSBOBc=jZ82yu~DNmvY^`G48>DSuU5D5$M&%fQ?1)_5w?f;1QD(7P!^a1 z1d*-o5Ed8%1ieFB*gOR0@SXf>^+d6u0fwH#XiQL6;lW=7RhtoIIkC;?Blw`XiAcJo z)){3yvCZNmAt$z3eZ=4j-Kyonr(vylTW+dm#R%pCpdAP;P-_+1D7-L*dPj&0>uJeD zyk|=eeGJJBw6hNv)}IO1eAQ#dSJl4?TVox9ml2RrgzyN9w~}j}RzvMdyM~z{n7@K= z#q@gfaUDU|l)t!+r0WoQ-J7nlGmgxoT!vbAXk`+$-y!tVhuUzwb4_o`W2`)aooM_d z^zrti>ppZHjjUTUtmh%z94S{2W_EozWv3(CSsyMnJ?Q!Ev=JRjvK>~@lcCdq9@tPB z)8IHwdw*j+tNu*m18VBt-kzHTpymE3_>1 zwXA!h&DEYhWT^{1RAvMP5u^7ExUd0(G~zH7$-#P6y2D$cck?_5IU?74JBEf7 zv(CT3K(3F&XW41#4=2ahJ7wlOCSs788QO~F^q9G^_fI#!oP*ilmRP)68;i9o&vRu* zWv1*ak90Xrp>JlU>@Dwug$A$?pPuqo`4{q4f`9STe7ahvjDygeV#M_>WP@+Tr(j%9fL3P*p{um z(S!@fPmRT`e0yLt0{UA^W_|xSTFHU$Wn+oS%(&Rhg!U}+(~AM_qcsY*Inr3!;hUM7S-vb(6suV zkEF4mUwaL0%BPi;ZO0$G9(zSxc)X3dCJ8F<+HSLXeH3m~di}^1uG`i&uZFrY^i4<4 z!R?Kit`OH$Q=0kZsZmfJPVbXhPfIYM9d|~h)n)g=s=pA(VBw{yk&qQam{#YE#P@h3 zF>$@U(G>}|lZ_+~uP1kQBjn-aPWh|zlAOWnWSaC&tFwpr!+&XNl(YxeQ7TjpP|%mA z;#C4#ozui#OWWHyd=6UBmnIv9??z-sBtAvEopx%OAfospSFFp<#$JNRyf!uGJxvQWul)kGCj&3kvf`#XfG)IH zZCUh*u&j@<3f_E61x9T6M`o(z0a zIkeSh;SpG1@679IVY7H5_B{`uE{%k@)2;Zq&W@i2xjTPZ9f9*|D}H9%@spPe^9?od z2l%HZiTAZge8f%o%j)_XiGOU8cyEiuhuuIYrdbfObImq_j5Qt!G6}WSXn9!;PQ?G9 zI}0!NZ}o;<;dVp>cJv&gG~X79d72(vt-dXSuV7~Nnei3O>^?KTf?2N5jIT;F zBWuXB%m@OoCdmlES|k%tY;f;9y;|GZy=;47BXZ!^`E?lib(r$&Fy+_b|0KT-bABD> z{5s6}b@=~&e)X@RW*3}aD-ZuVzsSrgbHtZlWEPxXWEPNLD-Y}QiZt?~ql!CGM-i2SSeQd~)JSzS*_Y=Oebgyx>c}I>8YLs38YUS5ShHjV zRNo{c0Be_w0L(3!fMNr6C>m6`L)IaN$S2EL*hP{-AD>9;+l8&DmW*1D8ES^(zIZ#0I{fy3b$=oi7oL3Ejz68@YL)jV7hZf7 z^Y@XoGIU?Ys|G$Y&6__i%rKW=JqO*mYAI3J4;tD=x2#-Ij&#e)te<@}t$y}N+-he3 zl2$jn2d_(?eGKFjnVjb70AKz?cpTL~02isapqoPS2cqqq#!X?zp_Q>M1{C&h z-2#>tz@ZTi&FkMqq66C_dTs+w2Rg6S4s>3t9l7{fLq$&5#Mr{<26AT}*o#-ZbcPNL?M1E_BSh)yL<*9lV!RQ*SHi})X=_#dYDAEx*p z=J+4x_#a*)<9~R~|5^NZ=;FWfu!=uj$@tTij6Yq;_^&)H;!lA16X@gb>l9V|Q8anG zWq-JEpD5D{@$fE7^UVF;m7)NZdvsgafVtX1ot=X^J4X`zP{-z=j?FJ{LhMBxCoiNe;sky4XyE=Oz0Lau!d*`mAJ}Ni{2Tw8~;UG2*!tdcQ2l z(&N`8=T|Io<1K)=uC0zWR$VDftF6|sKc7RdnSzyS>rf)3Q6O?YNL8Gt6@`h1$9Oz` zB68$uj>+>Z8P?~-dtUtmqPRQVipD@MZJ}qFd9*%8rDZHSUOd-zu3v|z9iJ)up|}aj zk|2oz37=OUkZ_eP={d?#a)2Z8Iy~vykU#-clk}K~2!sa;j6T6PwfdOVtSrMzYUPWC z-iJh&{VEn&cvO#&p1%I7-mTMh%SOruPS~9R9_y3*M3df`D=S<2c1M7*P_9bB)F7X- zlBBsUD0qXc8kJFNk}(^B4}N2Jru=${ug3QyBRkz{)2HJTvl$mKmNC{aHZpEvY+>wR)Hq+F7zZ-OGhWPSXPnMh$ymd9JL6-F z&5W-xwlRLf_%-8cM$>~bo&6cDj2AOH8LwxoX8aT5BaF?A+ZgvTe#zLyc$)Dn&d+$p z35=qW;3rmv6sP`}DdbjdM36rt;9?*?W=G# zLrADGEW8&(FHO>362g0F1|jYx0bJ1VUIO3_?#Vga6M!=c5OQg5ARx|2KqrL{pzs0Y zUZMaYm)t-=oRNUt6hUl;lh8#83{OiDGy=$ zj093H%?*k(0({}i_=n2yLL?GM_mUeFX9Ots!kr<6?K1*cF3k;!Glp{s%kmfbZw!<9 zFObS#{Y%am z7OqP_r4N+D7f6)D7o55Q8NNhN6~2_C!OQR^g0ft4w13GNjk@qf`q1E|dx@azUUIa5 z$r(fa?u9$Fe<^1S@yVsRL2<_LGnK#0e`6SxAAD2kCr<63(=QNIhDQZYasa1aASlbF zIm%yhMq`*i|E2p-b}td-&+a8h`Ag0i>US^Pq5qe1#t@%eni~{n3_C;mIsc7>h@A>w zaHOBZml$gF#b3%pSk4&YlS^}h;*7>$htKg36&Mn#{FmIIIAiFq+_U`$pzX`ebGbs<`ekQ|{;VU0y_=-vQ z#xOniGrxPiJS0>xB@g6^DOBl~wpIEiQ{jjA@^ebRWb#+0-!G^12g(DvVu9i7-5bLK z-3M~T^zQZcLqa9<%LBP&{!&osH$_ltRr)3Kr{B+I`IAKYB-8Jg%ktODDJ(x%%pX6h zaeDWPDgOhxVtV&_|Ec^bG`~EMOZMyZlN&l^{rAUL)_*^z^b_;@Pbv1x74ypj?MoIM zzTUktEYSZzE?J;^z5S3-VtRQXC#G-1{_>CPtuKFKWY^#RC0A~P%U{`-%*rus^Tlt@8^_$V#+_&{*`@7 zf1o^&OBNiy-+zitp!+~BS)hBpeQN)KV_K!1z;{D*t6|@Y|>S*SnW2(7j$x-Ku+vT>DPxJ-YYPCJtwz;{!@zm z_9fHDFVH@*Ux%-EZww3cKadj(cCWV|5*jQINhb zlzxBwN$L+z_Wyn^rF#D<#eTVDdO1n`oY=3!*Sn`Xyx%^Bujj;q-RtFa{|}T0@~CKi z3)h#wEN{Owu>2!?ORoG@+Mtf z50nS;$lm@E)~DYef9YCrnSN7*;!^6*PgVX(F5ACePS<`;SAp@9-|%D zBfmT_JxXu#Tk_!WEPeV!^@)m#q%$fq(xi~CBTc68V6MzbW(p5C{+>M8zH&!y!;Qv} z|Ec@m^FKH|6)uHs48f9W)(ffp(&x2mA4*1CT`N@XNk%8R*V`kxo+~@S?iE+zD^Bj| zT5&>Uhx}6ED>=#jojlmSB`V4kWilD*G#Rk~i1UNtzw=>eUevw?Aa7|tkhlQiM1cg9 z@5nzXCm_y9Am!5hzw=@LoevZB;lJ}?V*Unsfsv1BKbYDQ^HKku4-@^zf9J!fUi^1H zOpfz#{}Juv|E>8j>!3lggJNU*(;3^pzeOQk_qSN0g1Is$8I2`=PabSvxl`ki|Ec@m z^FKH|6>jkOM~$a~QH_t3c`&z_uzN{=@IXqI9`$cjo8?$Q^>=c7p~eRi)pLUKpWI9P z64i5nU#{v$AX;N%EwL7hiB5_ec69|Djl4d}&g&M-o{{UNEYC{(dVJve!^X3uxk_ad zb6QhQ$EG0p7UmIBthF)6tLwzk5yU;rqgdV@UMYvrXU^_#4SO*e-Mui;)9s0{IUk|xFGxSL3~sYPhzgx zgFT36GgtL9hq`LRDu1dQe$LX<{Nyy2eRuG|_gU z*dajm8D41<;Rmd1HsB~={76k(1-u^T3Y-_f(F$B#2zdg|M4V%A4##POqlxg~0$i`a zc|FeDrG=Gw3yKRyz%3oQOBV!j%Ha`OZsqc_g3>}|P0OVv=fzl#j&FWsT7_+Uw@Tz{@f3+r}952pY^t3f8p|yyd`KFi%PIj13kyh z1?ASl(sHY+7fPO2Sx~*GQdj-;w&0Ji^8DN2eD?mM$Wgj~m5;yUe?WV$EGjR+1}A^B z*HnLIJ^y?wy!Z3`()oGI@)mJ7>NB61O1&8R&Y9>}tZ4-m`Q?ks{N00QolM=vl;XUK z3Z2xNS80{E6206(`>Z%$*@<%zntFMD(Q=(*VZ%D5bV(WY(AH@SZp0nLnn_z{eBF|k zn^#g=vV2KtRfQGhS5Q%gCQS~@_`cT6*u|KKeOimqV=uujr9|F4l!(1Vw7;qVCWVkL zz*V`B7i$;6Or9e7*jx1P-B)0jmfZD~i2X?9@?xAx(lLG)3%^V7Tda+ROdWy#N>duM zUtV0{pzT7+9wD1wUS3cjjG13iPsi zy;}IGe!{TDSdD$iY%sWbHY9#`5N`lCk${iegZLdmoZdsHw@+`c)AK(CaeCpMUj9Nz zAb&B4M{zvVcvy{Nsr*%`)2=bvJw`*9DW&DR z8CUQ=OogvqFXh(x5}kKQT*#>MsgnJj%l0=icCVK9$JMa=YKhAKb(NAUe-tXY;;#k8 zdj)f4FHXsW%&ET6oBOHG&`J47NOd3XMR? zzvPyXo?pmcdL0;<(fIo;KFOTMWMqB`PT~&cQyFn-DSHKX$Xd*(kg8qb&cU}3Z}#xo`}rZGAhvl(+4 zs~HWP$#u*d88YdPX57Nq!r0E}X6#}#4U_S;GA1!P8M7I47;_nm7|R%|8EY8p z7#kTkGBz=8V%);m&gf=T{&z9g;y7O!t&GWxPR3luO2!q8b&O4nZH#Wl8C4}(7It~h z#C`5sJloAIs?shmU!={*tJEM{n716S6D*ZTMFM*jWC*(@@=6vI+?5LfDBKHoB!NFw z<;IdHi)72!{C;Jm7Isg_odFFb}DJXnT(apmBYRU31B&~0Hu5f>u$MqeO>(q*KG~A-_iKT zKmGa6yY9Yc zuf6_{H(FY^ZQrqT*Y37GZ@%^RJMX^NzIWgIAAI=Fk2>~$eBhH$Kl|K$@QXuV{_Cs5 zp3WoQufO^ByRM_hj(`8di66U9p8DzMUrzU^`BgRFYw3Gdzy2`;&W=52;JJeapEtxh z^!#CQ!!H;SKk~waQHi6+Bwcjz*m0L!dRg-L2`SJ4OtR-KfI_(NhN49`E-qeDQd)LX zc|~Q_(q+}lZ=N%E-u3fye_Q^C6)RV*{@+gj|91HQgh9P;(KU0v#*o+|J(BaPvn0UG$8t;DM5}GmA=N!+&YTQ8QU4HiPBu@b#j?EF}fM8 zquD)UJEL_Bn=>lCP#yCoMh|14UPit(Mz1fTQ3&0gD={jfH|Qv>kJ1_ao_o?a(R*u@ zJJJ?itjnO^b6<>cNCH#V2Py@bYrp4S z)`)V%Lb;{btI##1?BDAPt3@uzIz&Fmko`WK**%4)v{#9UdnHDZ^wyt88`N(ZRICOmU~k!cyySPD0! z$xTGgQ68PC7m%%4m5&NDFkMpbMd3Nh3oc(&T;M2MRN=U4Mh3=bQubR&IyDQNu8mtTbnxm{NyR>*w{&HxKS?M{mpnS=q67hbj ztb)p-QhNOJ9TX2bx@@u^C7l)>-OMRGaZHkOsJX;pVov%(I%1itbp}@ElpZ?bnUk)N zjwI%!i=!i%IqB-?urnv!8y!yOq+6pSn>p#^=*VH-M^Y`9xmrh2#GLY$jxy$?%cG;3 z`B{=`HO%`luVdbyc_VW*&%Tj4=@jW`Voo|$IyNysM^desxmpLYg}GX1(88Q_nRK)< zhrV7M?aa?(-oae0GjTJwvfRUbDDy7n=PQ1pEZPA;N4U^UGP@#QX~8o0w-XZ)QG~`4;9^GH+q7 z^uuk;r?I@9c{cM7=GQQHGgta!5A*9--o;#LGP;?sX8CJ}G*SKr)d4uTzhG`*9?IOx zoVM)Hq4eHi%#&Ci&fLzt7xQf9Cg!=!BbY1wVQ=PTERSMd!#tXKBlAAYo0yxKH#4^| zZ(-h-xzgvK#a!w0`!R24`~8`_na42iVm^SmHd*FhEOQIZpE=Gn}(beZ1i%q`5XVQyu9E%PMi*D<#< zFJPX{d@=J}=Ecm*n6F`8!`#3FkVfW4=4zg<7xN~TM=)<@9?86gc@*<@<`(8|=KYv= zG4Ib@yIkhS0Ol6v1DRWy4`!asd=zsh^AzT}%x%oem``C|!+bIGjm!-^pxVUT$b1X) zUd-E=M=HhHxrO;a=2qq@%#)cL zc);jn9>F|^c_i~9=26V6nGa-M$2^636LSL(D4Ur_FmGWV$-JHUK;~}dDa^Z>8?4lO zVGTfrOmBo$P%V~uB=dOYDa@0Z8{(vWr*h9cN4aNSq}(&FR_^1a`#R;G`9|fQ`6gw5 zl(fG^*=OFS>@)9B_LHQ2kFw9aTiIuBnkv(87$@z=GLK*$&peWOva+8n?K_p6d5)4# zl=31aXI`!3b}6q@a^@QqPm}UZiaRCWqIjm{ZHi}0-of0sLUIrDfy}#^%UL-M&;2(D zi=?}vL#=0U@=Q@avn7+ZVSnkZ+H{mLr?-03L0T(`(m&E$(NV$r%nI!$<}_=l!Br8Xv`4xXI_N#s zbkG_zIx2kWk>M1JSw~u@B6%Ulb1A2<2znVh@{nV66hQAl#}bZ59&&(=#q5r>T67e# zd(z9$v6$^IX8$UnEuy1}{jKEi%h;bAI2_Wh&_S9ZIu>&|Eb--slrLfP8#sNG&x>K7 z^h%TyqywUyqWX}CGI!vb4yqT4+GI^V_fY*v#JkgHNU=usg4VsL=MbtNiI}BT&po7% zA)e0mrFP~D-?|v8CyAK7RnJjWUx-g<`&4fdA?0e0e5(R?Vg^$lRF6om;zRX`_)L~l zJxavvv2tI66cL}sa;jH}n0Zxls$Y~|6+YFoL@;Ha^h(54_*CyGKFU7TKgvIqeyWFw z$W7&c1#+3>DnF=RCL*@ntPwi-H`C`I)l-U}@{j5(rH{J>#D>C~r7JJWugPM46(y1C zGli$}mvqHceky#b--(Ewdd{SJPF&?5)prU{rH|@;B5bSYSgQY&K3?ts+cyh-9e(MZ z`<1?af%45?Z>W7F!j(!F*-Jz%QuVG{g$EnmuC6$k=iG%=Th~Y+9`3>E~vc{SK(8;rE&?*2WrRq`m;c! z+aE7#-}-n`JJ)k+?}1#l50x%z|9bfnQT~4asbA2`=}QB8PW=Rxi}EjDr1J{YD0xu- zp)W_-kNAC%{R!2$*}{SBSI9?M!)`))C}$>f$w=+Bzg(Aya=OZw&$2(t(5~k2Wq&fo z*Iwj$27ml$9)m*5Vf(T_nd~bU*+2N*%l^SHFA?e2_YYKF*}8f{`8NY5f%RLqYkxnc zZwFIEA6qP9BK{mXhb*_Yq?dZTxz@+}>GEgdpn(tY($-mjg$_9XMk;fuG-Cx@@! zlKJFsk20U8_}X8Es3$U=`gq9r`_rl7mCZRUYG1Y8LumR z@mBFt{iEz}C+p(51Y-w(%a!4$`Rb1hKg-t-sPO&$A%*X+Z!-KTzWz>z?~gCdxl!$P z;8)+jRp5?K@lYizbI$$ojDw8v8sm3aAx}Ij||7( zo@6*_zVz$;4J_9sq9+K9|1`8Dc}Rb!>Nw@YHNNyv`pHDq3>mN4KDl&1#n+Fhd{*~W za!(}@=w9_Aa(qeoq55Byf2zNg;Z60WQ-(LwSC6E9hp$|v{Y+haDD>-m>vN@j)!I~h zyHY17``NmFh*CcVbwVD}e}^vpB%kGL7g9bs$bEK@{AyqQknvHyCglhDH^X<|mfWeU z2PD5rci$(T?MuIZd@t|xR4?dIdScbzXR{u8luVXppDmx0Dx( ze`FrdT=mDv%>T}EC-Y}ic$~j#oS4IM7t514{9eq9Sgz(}l38wIc{R%)WnRbp9p)RE zKg)a*^F7SBF#i+tHs-G|?_j=@xrg}+%)6QYleuZG%&&IlvCP#tIi7h7%afVE&)m-G zi(u|#`CjHZ%s*vb#QY=X)y&^yUdQ}J<{O!}GT+4f1Lj+pKgPU``E$%Wn19aP!~D<8 zyP3P0o94;Zc>!}f%hfz+ z9m|VZZe{re%r~;Uh`E!?CzAOlmS-~0W%r|*Z((@_^K5qCn|T|{?_}P={BhDF-yO?({znXb9`)6V9VYzzV&f)kbvb>w+@@|cF4=lfk<)-1z*7M8~` zFJigWnjwA6Z&&`a{RHN9EMLNWBlBA39c(|9`6ia%%Dj!`Da^O9d>!*LmM1CuEdLAh z4(3u@r)eJMRV?pjK8tzXBw0RZF*oH(emC=2<};bcGrxy;O?lG&1I$}EymOexvV0D6jl(;ic|6M( zGEZjy59Uth+nMJuZ)RS^d<*kx=5H~tW4@bt8^>=T^NlQ@%UtR44>8}w@@>ppn7_`v zgZUH8yO`h0yq&{4m$_+y%&+^H$1ZBbaxyd=Ya~zKl;P^H}Dg%02Thm?txD zWbS1CF!LPde`8+6{AuRZ%r9qN$GnWW)XUxsU4lI1b8a4TJWHU9IQ&D6>EwEDv-~tH|~CUBv zTk;!xE@m!Fg#xtG%)ewnY{O82A{*ZW@;BwwoY zkM!&XI!^N*W3t!U*$jP zUyFV9QOcKS`7D?7ApZEtc^ZGal=GJUeWr5$NiQe=soly$>b2D@Hq8%H`sE&9vLWZ$ z=&R83kn@0Q_FB%TQ@^0{OU`rn+pFaCD-W7)PlU!=_1lXDzrmMZa=vS^uYJgQC4coi|Z<>_yaa(+hkDSNx zw;##<>5-g%m3x~1RI4l0yfW?7QF1wdpnM>GKGiVggPI@F%W1wuFQ*(;F;epheoph~ zv`a;Wr`iwg{-QMuQX=O!etkcb<`u~IGufBs`unGx&r_jOda1su*b=AtUV3|wiVwws zY{)yeoTv5Yx7?wn=QQuHR;AGT4NASg{>XIz^eYcJZ|pBmIqy%q-Q^+I36%Nn-?H|| zUw!`Q&GqS(^ZH8>3wg--cYl23d;#?*vWM|=*@6^T?jOkHdBsclQJ!)XgCI+8GUdWdhn*&X|g1Fy1tHtD-iy_~Gtb@p-D<+Cr%-F_aN0AV55FBjZz zf0j5t43f9|_7}mp*c@nI`!Y3Lzu4bZ-lRxCA@{h7B1gEM7Q!rylbE&g1 zQ>b)MY`5{j*XNKwWgl!_OqhGu)=I*rrFZ^8VAi-bgxRM1*Acedbb38uP2=@0!mb-% zy`8YBHu8^z?iXMD6JhqW`F9d(GkV=k*uMR_dkDK8n|?2$_2dut5tePg=K;c|@Z<*x zn|J>6A;Ar=G!a@4u78-YC1lnk0&f`lC}CsYZv@sDwme4MoxJvOLd(`GpCGi?_J5MF zW#cCT+fO~ZN${s{e2TFBsida~5f6ddeXl%2ys=@`vxJrp9nTRq-DG^8ux#Njfz8ja z-%PwEK2DT>*9GeYHtstlFlp43zmnWO?h%2xUhQwhEz{=Y3_L|cY@0|S-+3%Y7g23ia`@BqC>%T}~ zu3@{tq$dV#5$2&w1t!J5C(!=Yh^=JaxTHp4)AJnykw34HdDHwlfo1KV3vB-R(pSm6 z{mTY{N%da}v>%!98kv`w{wUD$7uLatl zI7{?TNlzpT%)aei~;YE z``ihaN$is&P9eZMVQ| zckgx){?c;=CK(e1TIweVw1-U<=&qhEuyG{~)mC?rj2_ZF>cFefGJ)vSr^2%r*TYu<4Jz_fdSZ`wbLW z)(|hyqFp91X>q#1_IGCp)Djj*zPe1H{hd_;bNe+2v`)WYU{n250^M6*miWa^fz8Gb z1ZEHULSW0qT>`C>P75qcixT6n=E(yEy2r;0v|M>~4DQ?K2($`gIpyQzzoEJ#T^{(kDUwo4yBa^3f-z27)Ev1rPU)V`1J%6+H)Wa>ks zhgeG&{F3_4>mP4%P3ugJNt*m!N1bMSZh68J{fs8tj`zQ9Is2Y4TS&$S&n=t!Txy@B z%ep2l?PJ@1BK(Sv7933N|610Nw+-R8H~w|vYWMLYsovuQ&+C12gl%_7OIiJ+EvZ-U z#>~uUi>*(|JKt(^Vr-jV3@saZ>*uLU9=-JMTd%d)rX2~N+ID3>+jFly{NTq^2G}k< z^5Y9n77n(3_w$d*?!TQ#t?Me=HM8@0>fhg-5D`&sv^_a*#Nj*22HOsAy=mElpAWI+ zhDSd6#t4&5#$$kO&h?w2gXZ$7`cP5^QM&pRQ~_`()~amxW%N zYmc$zo_q71uDwyVRZp!LQSjW^wx{Mlv@@%&uWfC6c7fl=;F~&CGV8WrD z{m-`DH?88ACttn5R=dvq;vL`rl6qI~tljsI8D{GjwcP2cIGI|Kv&;0_+vnLfPMvwx2!5c1iNW;jZ`2wbgv%8oX)#5ZjmgN1n`@8fUvR>iiDt#}cDglZrkb;~H$c?6L{Je7Ysh zW<2Zpyj5%a*&Z@?X8hr{QMSRe?}_O;GSYVGA1*3+;^}j2v%*wMFbO04bDx325`>O!mSF~f*;QR5>C&e~s>FuA~ zcz##vHv=bJ^wHFbwzC^5R(KZ1*kTJe9R2!^v9`jc%YJz9PpP&oO$}Ws&hfSja-ROS z&!;K2S1t>g{ppVJw%u=f-JQn=+MbObv3AD0m)Ks}df|-9Y2$4(Z>_s)#JFCzt}74q z)~<`)MO-RYgXPjvs1!^U2v`kC#Q;hTAvwTeUjDc3%C^ z?IlTLZP`^Wx_#Of4*ux2OPX!A$~$j4zisIR+o4-Oo4%`0s%>-5t?suU8)JJgvSr^R z>r!lc=WILH{J7P2?}<6*=l(O*c3Ic`x0wHGvK@S@@x@_vHrt82&pY0?-=((u%#X}n zKV-D+@vY-C%I_Lw`y$77^Ic)dwsD~k9l7A>7+b_Ox6l4z#(0}^$2Hxht(V%q&pT#5 z|E)ONBQsJzv>v>~cFnQ+yw%eu*vt=n(DU;($+nL_ieEcAD#_;lJnhc*en(TEn0=&A zzGb+r??)G#t4Cj8d#~FvaKG)F)LY)Ua@Ev=VYZ>q)nru939~IM`RfOXV}{zIei*<1 zxgD3;ey+J`!Md~KZFw07cQ3g5NUE%V7uo8TKAey>@iN<*)K2%~o(pZ8hYsl4)qJ6? zaL%WduJe*?cg}qE>ryM;g#Y%ma@Px8sUyG0>pi4)l5O*Ay>{F)usikXm){yx9B;Gz zIr99B-udyixuYIwjp^N!dU?d4!|5|GvE8yHygTWu6x;aX{ayc8dtU-jRn@hS`D&6q(MB%83z$gHf_3L6ZE5{G)t ztS*9xya%z)#rM?+4bC# z9_mjLR~{R`$VIJ>v;Se(csKRM9cc?c)!rC3azgr7%jet~mUM2eYvX{y>Upcw^$u_K zRXaOGznz#lMBQe?{_41iw}(C5ePi4B4Fkc){Eji(?+tr_31-W~2dG_MaWeX+%OJTQ z4N{NRTC6TK7t|fXwqJVB%U5mf>1U^Z)mt6a_T=i}{(^c?%8*%>Q9kPLT@OxPJKRfM zc!*X%?Y8ysS?S$P?YXtJU8bY2`d;Y#jc14TQ@8%9<8$Bq3OoI7-s-JWyQ|lC z>k~2djIH|UK(iio1$D!`e0yc;hmTOt8rfL1>(?IYOWM(^R*dPY?vv(!VYqE~wQ9Vx zg?qPP_4F@Jw(65QS{*d!blQxN0Ck7Y#$Ne)Z?O8%H%n&^Th?9eyzkJ>8LzslzgzT0 zl>794>Y#4>>VI6-UA_G$-VhxusO_g+Ui$Xo5$ejqad+c)4^@}sN31HC+f#kw7yGmi zj{B=?$7_xTS9MpvT(fY=m<1ZOQ>)seCIM~L+k-wo67!)({n@}%el0#8pdL4L-lVPh z$;155`Wai^a#uH;x@f7}+(#X_&SZUK+cE0NdvBc!{Z*}gH|7$voEIpM4`bEZ3xn6@ zCI+eXxi)qCV@9Y`t_JPD>)2QQ@rnGkZ4U>lV-^+Pn_kgH-F|c%t0SNLsbATpv5NT2 zPpu2-dTjEbK()4`$H1E9gVkRi)Oa3h-C2F@x3p(|+oVzdH0A7&q>sm{r!?3UZ8Hg0 z+Y}ajesa}l_1jZEwAG#TR9n4!*(u?Z0Cmew7q_|g8m1n;GQzpT#~sznQcjOmztm0L zv&b+0m8Ltx`dQQ&6^-hkKC>`m>6o%{YO8-n-Sdner|$dfsl#UH{nT6A)vfFq*IT_b z|4e3`xsSRr`TgErH#O?VtEoa72~}5BubCgeC;Y5>dr5lvJt6ij zeM!G9_k>F!FBG&%xhJIjp!&pT$~|F0o3m+KeC`QPi4It+!vA~1y0uLgPyTRM__TfY zS=Fa^g)=; zT_L3^aq}BCcZHAM3z(63?T%o*%lNs;HFt!6{zLWr{KI#IE$3&MzLtMS7{2cIw65## z2<<+88vpMIYe(6h*dBgI&^LXc+AJVEyU&m}y513Lt1^tu?d}NcH?IA4)%DxL4YTdf z_5AL(@QgY$=I+tkLiOA4x42n)Tj<1HdOo$|wy=J{>0t@WZVRTr9=>=X=C&}t?d8`q z#@!Y^H>(*PH2Ah~Dm_6n$o;mE-|r z67K%|Y~S|#ZwZH^=4yZ2c}tjj-gCl_D{l$&+f)~-=HC)VuZuJHn{rENlkbQBw}k9= zA3oco*Db+l%#xd5wL*Bd3jc2jrv^Ce*mU)#&^vBk>sP+LDH!Ek8h7HzP2se|q${1v zZwk`-*iC^~ZL;mV=BAKbY14E`cT*@|e9`)y88?O6pHAMX2)Zf!*lX8{kGyUQ-7i#+ zy6t{b_$Eu`G~V{6aLZ-)=J#(l3BusIC80ky317K*Zd85MB=~Slq~2>1_SMg`KUmr% z?0!zwSoLC)FuI~d|HIlQ;o#P)L)}uE1edju_}?V7FiSnc#y1Jy9X_z+1>YtiJAb8W zbPvRfu1PR+(Wa}+ngq=X)m_tu8$$c>(a+E=!#9KvuGU&~ zEW07BAM)nBeY zH-wG%{65rs-4G6aKVpSP=Np3M(%th@oo@)b4C@)SMmL1k+H0+}*BXV72m8;valTQA zJeJY5@I<4~I^q3R3GX)w!`kFoje50F$V#4g!Z)W;sH)EN8My`VaT%@RG8%<8v8q9@ zJl!bV>^NcW)yPI6Z}iYL<3k&T=nmFXj}31WzOPzWIe9>%pqZ^&e5+HVu)Vxr+-ofw z1+!M++6>c1;ZE=FUeS%$g@3lJuAKhQ>q5bWs~^PHTo5J`)X z^O^O+`>8!|w+pQoMmX1&rj4i<4jh^?{gO|;aI5{?UuN{J7v6K|Ir?I!dg0BVe+pmh zQZHnk@Km|l)(cvrqdktP>V>$zIq$A+ye5n}aW7}w&)0+((#KSFsl6s-hxArieFN;3 zG4}Q+*96DG(>C2ad`-~wRF#>$eoZiazkX}Gz1M_2PM5m-?YSltm{d+r-gZrJuE=z% z$h;p1J0aA5J4!ZW38)dPo1zkcSHKb?RCPLo>{9Z*3}74 zE*Xw48Fj+ylWkqsEv^&N77TyREU`{d^}iFcF}hB$?Y1!Dsp)mXC*R!7J2;_E82Xu& zT|`iw(0QcSMmwQSa6C2;|LcU(s$ZU4->Xg-;5qZ3;hpM)u0chvo^22>x;i1Gy8_^45O!NJ52|B-Iw%C|o9)(dTBxxKN)Q!o6~ees=W z54~VvVw9nA*9(J}Oc>PJ1?fen7t-;fP!kJ1tz*C`h<)s&*nXZ;p!iqXzYzRo{6O=_ z{TYJ{|Ef1zI``E)d(Z`(SVUmBjLqZO|1ExgSCJH8vgXlzhRFPBWsH+iCu6FNRLYT{ zr^I6#w(xsl6AQFW|cwQ<9JZYqySO4&>2` zu{2Q6-WWSThd|DK5Y`vtDaZ{!NLfArV;88w2j3bRif=Rw!Ej9tfp+Ov$g z14V~Cp6_9)9G{Cz={#RNrs9e5UxP>`th1*l(;+O~${?(NKe4?tUCl+PknvRL|@ed8_9PaN&X)>FIQDD}?Vbdtx&WFNAiFvb| zg;8K}voL>zRUphADAhZPf>`y#>BKr}9tsN)>!?K-)FkH(38%dJhtq{q!lsAA#PZlh zLwUo*@+=TWwj}WqCZ=;oSk`WY;iE1ok>Ga)#tW5lO)UW3VccD9d_OE1K@9T$4fQk6=g?n)eUek6I*;-b`SE@zY?{cA#xN{QN*DA{ zn3OIAVOkrMmn!qUL&Yu;-{N&=7zJb7U%+@tbxL;8pTZ6yti^*c^aivC!VK)ki^5!9 zQn4`Du$*@gg|TcE(~vDnRf_krCIpMuos-4BEY>HQVe$gXqDB9%#*exB%$C0;Q-v|Z z4%a%l5GcD=)c1nqsLr0^&&Fy`pq{ZvlPrdbd{bHf4(Ix^J$t#~CAQ=1U2NmgT$YiN z!;-zS@tNG+%(T{6YZSuRhOQXHO&C*|88Nf|MxH7w6K3UQ#;p3A=~N~vX0j4-gu@wg zeaej4sJbyzor%^s#K@EKxTsV{SAg~Jx0Y_wSi2=VYWDndHeES<{M zjM;iwG28x@dULH=NC#6RW_rm|>=512DVnG(3QMtIbUhtpu}&)g;cJvn`H+q})BU`p zOoMBcof)(9vSxPut@IYPX4(#|%~Ak{&sureu~x}WdWTxODjS`(mfFJ;qN5cu(uS+VUy%|cY>M$BC0 z%v3E+QRmyNrK*ydQ5xhYM=0`y_H7vro?xdf`#aXE?9G^cv^}$jKJ2$z>x_&{m~ks+ zW~5c=lzfCnDr07Za48gJwXLqpZEx z2dus7Fq1Sa^~qX{N2(SUtVOgHYY}G2T6n=9>Y#I!`>CSW{{FcCfewK$v1~C9(uSEM zj~Q#x-$AFsi!`0RY?yPXjozx(LPvc})!v4+Pq9Y*R;)eBZ;$fZ_jlE|u5DSR!i#Q2e^og`Bz;pBid6o1<;~6^#GCw2B>14#5l3|b5DrOB`szg4)V;Fe!vScp( zWj@7lgh56Z$f$%riYMC%jI{+Ok#(w?()O!VwQ!a7{*dJJ`2Z3)b#HOTBZgW3_#it zr8UO6R%nZsQd_B(c4n=iYv%!W2gEyQwMmsSmq0TyM}s+p!gpFGo+UsN75$3$b3B)}pfS!4 zZE1`4Lz`~J80Tog9K9TwW3nxdb6HlI>&&!N4w|0*um$TtTk(7%m(y|^z7r2pt{>H( zMr5IFK}ugy*%&dKWYb6Xy>Te(Ezm|qzfNY%$;*K`9S}!nkq_$6SCMA>c032j>0I4R znXPIaGpjYJHmZ_r)d9Em4jxv_qhSqmPg#p`^jYQ*mdPxQ_X=b`p$^(NX2)M&_Km<{-}X07`>>m6(Dt8J^$FKJ#gT+z$J zV}#2)SZf5?pGARiu5K30!ONaGBtN*XDswQ3S6LY|t2iUE?H*;9mPhf-4N~;1vM^#6 zTTMJ&yW(CIhd!Ztidoi@^_zN{gh=vLQ@J#jIbp7D4I7CwW#&hyHiXl>!U#z7&J^eo z{kkp2xwidVgjkApVhKCJ*k>^At@{k$?*(;(OoY;WQJViNeRn3F?Xy7iOiw7*<0RFo ztnn%987>suQi?PDtC7Q+@a)#yVYp{5&*M1=RPl&-N>6KeTK?y!pHJLYiZ;R%eUwx20ipgDgW{#$|rd(@En@`2lCQd89BpxR(BMG z9{Quy6N2)ZJE}+bC-u-;7&*gw0u1D_z_YR9y29^$L3)N(!usq+e64czFh;*D<(=`0 zg#G2R0%V*aW3r6tGCnV3v5bdh{8GlNGO}G#x$R{1k#U@ivt?W^<4zgNWjre5_cAuf zXhAZ;wUKe0%)hUE9U|jw8FezI%a|o&v5ZwR*2u_Yz1YauMn(@A`^%`2F;vDB8PjFl zBxAme6*3-@@tBNfWxOimJsB3G%mFj^gSjpbX;JtVhP`qK0~6ylBhl^8GOf? zghs|Mh`Fyz#x77QN!|D&*jy?#IC4QsU~+O2bnHhuHn{dyp|N6;{gc5qz8E$U)_@kl za*c6tOyr`N--WkO1;ix8r2H;oo`K}eGWjJ&Pt?UHikfB>reO&S{1Ot9q8K|sey}$= zG67%revPicoOJanU5!YNiD9p+2!i8hC)0PfD@h(|UccyQH0lDzJ~a+bibT&4;{(xo z*jY)p(Xz?2E@o38o@mD`Ruz~UuYCCoPg>1%F6N(L4CU%1CMSu0krB3BH3Bv)_9nJk z^pA+g*HEc7#C$u%uyN=V6f}ixMY}_q_-Oy6=$H`nZT1fJWj}w+b8@KW@quH>|Ebu+ zL&yx+xn{lHk2M;PU6_y(KRhi3pK_ZLA06W#7n#f)%@l7~(*1bmN2LZPE{ac1N}Laa zmp%+fqrhvT79SNgoh)Kv%6)BxQyHQ~r|DwYdAgE{3Bxr?sx%IM@Xa|~AEp#?haE{LPjhcBEnCx+IPEh#?+lLbi_juxiq7N(F+ObtTO zDNxb?;*)ZQB*l}-(&z3zm&Ywh-<_p)mdgTb{{vnB+;hEO#QxU5>OPz4{^gvnX(l5% zx{J_U4zn%sFaC&^3wKKMormu-59UA*B~~tgRH_Z|erX1A|6Z?j^5s!~rFz^S>;Aob z{HIEL{D+ezjvoJE-~SZH|2_3S$|9sNss6{Bh5LUGfB((3{4X~XI@M;Vv3xwRX;-GL z>>vjgo|8N|1rlbwQhSGdn&s&t79;)pd8hN-rRd-N&A2B8X=HrkFQ)gC)4z%IU*ulO zZNq-Zy_`G!@#Qbi5pzs1#rdt%vrfC?1i{?X{ePeStD5g?Z!*?zxx|^ii*!Cs8HW|5 zjE4T-71S&syy(&A+>~Vh>3D??1+|aiSLY$gq3IQ9_eGiNM2MI&S%OZGJ}O-b9!MhM@zf;Ctmy22G&(#uvtf9ygU)-HIx^O7ok~O(_&wn#>j^oplbLDUk25}Pgp32R|BIu;yfP0X^prFL_83hcVf&PJkuIAt?N=aVY=)m{1`-O zjsbrL5uaCq_MIia18@NLQ9Y0*2)G(V<sI9B$D0N=-1lrZEy3Oos-@@s&(y}%E`^MOankMQF_yu3>+pYSVC zDbjomybPkegllkv$wzo5@H*&q_?v+7eW5S-6MzLEN?#1TAp3Dti6wbT zPuL4YauH6F{o%l^vVS|U1SIMQ7~UVpeUNuMa6gE`zXrDRLb)4MB2I>%!LJ3r3ZgVe zfo=mOTXF}^ko|-^WxvNDoF@l$M&3%`cOc@e7WnL7?13Yk_H&AcU{3)4Vqi6h$|w9u z_Fn}~#rc*E!~-xHL}^lhYh`~G@C+y%X=;JzWxpO+C;NL1#R?sW@&*HAWPcp6n=fn| zc|CwhAWEYHZk7Gpfu}*l|5>0j&a0BY1u#mD@3|vyG;lA7!b^eIWPbzDN07pOfg3^8 z2eW{6AgWiR!EXTk(68ao2Zjzuzut&5fWTzXWrU{y^JITM@MjS5*#PY1FO}aJ7!K-; zyjtLe0Q52VQv%UnMq*DIelOq_5b?Pk*k%;+AiNzg6GXfbZW@ho3E^456QE4^zXtva zqI&f}t1*(_1{fgwgMo)YR1Tqgu*3u5Ob~@@fjdDpD3fsNSm*)%IAG^-=r8aSCW44h z9q=ErpFZm23nCtZfNNxbCa@7?vI%>RAsF{ScTkQO@MRE{Qw;nHB=QgJIRQFB`d+|T zP!{}gK$nTA1Af9jVd(qtYk*5YUhwAwuY!8PPam)91fnuK193b=^baLY6tO+@a zp8}`NXUqov8NgOakPChn;119X_;&(5bdo(2S|+0|gxdf=#p>t=_>Tiur{Ei!@DpAF zkt~Gt0#5Q19$bvJK$=6qeyNZJ{vhCd5T!W|OiM#sAbcrs*%C>vbl@Qn*#=?cGZH`1 zz}G=dNKZIpDaPdjLG*^L5D=-ejPdFeQb_~B4Fa<>I zLbyBw;{d|bfmcDKf5L#3k_`|BuR=dU8p3BlRM%3VjEB?!wIc6NNH?=SO6lq zih-6JCH`%Imq87vm(Y8Yl!h=KbQR$Vz%mf&zXBMzS&}6P7!4vGbU-~w?5Dt9SyDNK zPlEz*#wG=r3!*XVD6r2qv=_oXfuDkO@E-@3ZpSzbKcVFgoI8Nu2DlbP$_rAs4*2U%Nv0yJOiS7J&N#~H4u%r zH9*H=DZB-66NuU?3)pTi>=Jni%RmY6R{(dHV=f9m;hy~%cedk91Mpyl{j#7_ut7l_7$-N0`^G+(U&jyni` zkT(vfdRw+D;7HJFga-ltL4K5Z9N6a_j2j5|1e(5!`9J&)z;}*dJ_P?Epxp;jT@Jur zAkr1#6%dVGSAjE+q8}l>7O47A(uoQ1eGt`E3k>{-VK4&^K%)ksqd?DGZAw85_d4hOk_A1!bW$Q}MHU^XZSenQ)m(mc=; zr~zpaPI&B;6i&YfqBGx_XfHxKKYbN`LOQctiu8nZHjmN}(z#*s6ViEK@)Oe8O!5=b z`9|^+(wRc?6Vf?A@)Ob-KJpXNIX&_d(s?WL6VjPA@)Oe8F!B@9887k^(%C5T6Hb)< zbQUUI_M?^mcK>z_7%^j%=?*p90poxG182@uxJt)=BOr#^bV`pQC*1^yE|hKxtOc3@ zn}Fs(2Mm*d`;N+}LYPOha9RztL_r!#@Q{XH?V&TB^EmS9^)n{NpY7D-$l7VpTSx6VuuIUA#IFsrsBbM z#HXiAfWPp9(pgni6(YF! zADgn|1K}S9Jy;$@=o30*)*EE8Uo~LBX1YFpyo#V{zyNP=B(OPp9IlGhBYG8GYjD2{ zK7Jh60|v;~II+WVEiPA5JTq?!5aS1U>&0vP)$;X#&C+#10LmvPDA$`&zu|QdN<*6a z@d0p1^U!rry>h*pq61KgR6gpLuI2i{A4&@dfWE}~z+wX>xX(YXH?NkjJ&lyb$DlupU>I24eESHbdXAwM~?a|e(+=>M{vXJ(=f+^rxYVbcI_40Je!HK3j_vwpyU zrcA`vdxNcX$pXEb8YD{tZsvT|03h16en69GA@$yRl-5LcAzFl3UIVgFxlLmGi}m5^ zj(~)2=rhPbRAr1xRFtt9AuJtnN;*CAGzpTP+)<7OgcUXXeY~@?!*AVMwPHPc_GE(w z4Pw*#wZNKEI~MBOlg%C8l_icH$N~cbSa2}D7d?Iyn>cYIn>KwqTNXW%O~a3Z=fuXc zxr-LF%#p6_wQ=SwcagwKmJDNWt{BR`m~PAdG24Zmp6$#o#ImKYo>!7G7n$>o_}g>J^Zx+}WwLV<2OB(|ghI;nt-K$rxzC-VaJ>}{uz1)k^ z@&0}K^zPkj=+Is?go>`KnYpD~hj#7TQ!?JK9}*zG=Yx1tY>i^K)5^x)tpnowQi5I& z#~T@&n3xP8*7_p>4d|ki%13@9M0fY;=nRqX)F8&285vt!TiYVORm)DY z`na#BB1Bg+BNJ;|Tf|cWoKkXgv$wbJ=u1+{`K=Ib=i6CM;3g*E&|_~Y-Wb{K?1p%> zMgs6C6~G~crxb5O(RKrTP{4x(yl)?=k-A!-csn~sM=yo9K~w@MP|}};wUdJrT=(vd zR-zChkKCl47|psOzPnQoryh6%mkDp}<3mEYxf#Zzc9ievXlLTvnc|V4qpv}JTRSHw z$L>x}cD7zVkOB!h`3x|K?_r11yZ7kfd=F&q(WAR9__VWgvbD9g zGBGiJz@MWdDZt6v#2R30V`F0h=jf+M1OSgeugI(o#Da@q} zTwBQv>NaqY*I?P~J?;m$ZA)of+O!?mty`C;+DqA4w=PO>d+8;aN`xHGx^$DmmFp)$ z(a!JxN$3CMY(4UpV%*VIlFi79{bz~Q^wGHmw&fMPI$W#nKt&ZSVD%ehi=QD+UZf1%c z3O`6<)WXEr*x=gU+|1NYkri@^Wk~Yg5%7fQhBbV9iK?(hkghV&h2ljRE!HXN^vKhM zyfn^YnSp6RI7NcLf4jdm@V`z2Wbv?WW&)z6XIgfqNrR-C$*Yq+@4XZ5#7jo9UvmA~fi1pl5#$-NeWpMLTI;2kAnwdy#*7)Qu3WjY;?}KOU*eW= zQ@m|F_;V9;+b?jLfwWKJs86|r`V;?y+gWiug>pRn&~1|Ad5*idw7wVU)1NPzIhyZ^ z3*hf1`|wW_dfaoz3%S*;zwbH2RT;QX}-bEB7kr0Vg@v zK>I_X>A}Z2A8-u3ALYCUWa#=X=N;eXeA8L6QC?E={sB_^((`3kP%q-&$4%lJkMe^yK|KJ@18%Q1fRZ#_&C{e!MDa5I-`f%e_~}Szaj$Waann z-mRbVJ?A59IQRbs`X?FC27~^AwGhaV_$}v+chEK`IQKj(@{e7LKXqg~EkWW~LHrMO zw-b3LofDD$v~S;@V-JQ895|2<8Z_u3qA(&aFE23-$w>0_>C=b%qK#rg1Dl?U7~Vu2 zjR*f@&PXy0$8Qv|KFoa}!$8=L?v%uT{8yZJJ|yzb|CD>FpHcs!v9~4hKdhtueZGlz zOd`35hX)@rWQa&UK0bWt(4qHbE_5^tjJ&U|=988ZlyoNFzs%6lEZrZ`ZCJr#}D8GtcmI z$6x0~i+y?C!eM;R0<|au2{7{~&Zo*Ugq-6%7(4|*hWq`QWRUxF9~zS|rgp)Y)B!TM zRZ3$kih1n)f%y09>MZh2yt}%(ihY%MCSHSrg7~OWqeL1#dNd~@{gd5LdKz=F=EAF9 zh~_0}zPxbpFrEt;UWN?hA~Al>fDG8j;b9jzCmEFfOfo3_nZ~4kA4BgSaNeC{fd1VN zqW@!@g8N)C`sPUd510AJJ{QOOBPY8dzKPc{W5#goZSk>V$KEI6zkB!YqRr9$qN%Bg zzmeg`%byv__d$jN$dHpF@xS0V&b2>7hRd8!feh52X-pc8F-hsqB!kkQNd~1q)0pJ( zj>!Lw=6oyHBLCf5aN-?Hu%hjd-idGGdEB^heEj(FJR~H9Pna-4MCt=%`_yNMe{yfF z7{U)M_2K19hVs3skYUjzO#dfjFzC-TCQ*O(LtmgV$s1!5-Jg{) zsoQ&;car#j?6^w&`-6Yt9SfY|c&O-`_$Ho1Lqj?C74H+-mZE>Me{yf958-bvAHrXS z3}uj^7&07sF^M<)2IKh)?kC7OA8q1I_h-nU%rUwhmNF~)ZjK`V9xcT&lg1qyZ%F5) zZ-sAsKZQ@8Jo!FR`%oVz{nP!L+~Jkp{2*j_W4RBnSUQxKLWbu3c?ZU%E%W{OhIzwz zX1qUN737IC3^iI4he9xLS zi$_F6aB3HtKhXG3{4ZO!j9)(S8b7jnFt36P??48zKSKr@la&6PjWKC=vcO-^Y4|qC zun97(gA8k6M;Z8F7daY}{0!z8uc6<={o(i@*rPS?+_|$j-W%$kY=(HBIddi_-nCjS zkBp2Iuc;5ve1~M9F_-QE=ih&cf4JVCzqiVpza#f&8k3a%oR2Z-709qlmSHRGXwy7D z{#?8y12HPjF)-f_2EB~&>fT?t{}TVi3ynL(Kj~Mo8?qNe-lL+TI1$N4GSEConWGjK z7V>M?t`Qr5=)OH#et(WZ{duF@pPOa+%k!U+yQE z&zUnvL<*-gl#k}5)c9R+Fp3GUZk z95-paZ_Yp24)HmA_G}&<9WC-68ym~xB6TU*Uc3+_`+-ym_3i zN$$ae2a9uP8keX)5dU>`b^Pf10RCkW_`lW2Kh0nCV2**lKywW0&om~zw0NvI_a^yY z(momglYF}IF~QRO#?by1`-z0^$$k|5lkSQ4goFgqrs$qQ&oJ~nMtz}Er%odO+1c4* zpBDQw+JWxRN`Iy?iTX2*Nz|W@zx4_)EiDzFe|BjHKau{Y2|alz#+jIBmhtH^bNJj9 z89XXU$Kw~La-2Qlcp(yBuxbrYNLeV_eOz1|SM*QqL-QfB9qI#QNAwJ)JV$)-#TVk( z`q|5~`Jpu$+@Ga62Hl@amihCyw#D)@|9F$1Jb6;gOZUZHkx$0|bWLwQ5qw0YF5zJq z@8g%J^O%%HJZ|A)p8V`{d=|#d=6!%`QYGn)i_m^bASQHZ;ECbpiaV zufF0pZ{8GbT=_%S-+c28->_kWSO(ocX&ih~{-+7O#Ag$l7towjxrfpHSGj*FW2j+2 zrtyfzT(TRodm2y4=4cF{HlaSD^l6f(OP4O9ZPB_65nWSTk?qkM0U_z(N%^0u?#Xc! zkB4BcK>ABqy_QeH_&$H-DjoqHlMGR?d1?c?hmj1#JB_WBk90*hp8-1^6F!Ykh>ic3`JXb>g9l;^nfu%ZJ{EJI=(J~e z6#DACm8*Hm=B+$#aT-tEx`Rj0PrN^$h>oAjr_GMyiR(A<2~jb8@$)b8S-3w?KTkoQ zSp*rTqfbr6xIp8v!hcBEBtCs!0-qS6JSmw^c{+s;BzuD$KB@jE`E=!h zXy}m%>4pK@R2B=%8bG|Iw5>2 zAB*c)_#@`d?`|rds9bva-4xgi*}4|_W}pnR znaRjA5jqJ$INhhikatq_9PwU3w&M#DFzyCIe>Bz(#8~vC_7mLiDe>9M8+J(RYBau4 z*>pb=$5qrn%3v*p`Ua&T+aaPkG}#96OGJH!#u~DB3a9kMd+3009S@ygp(t&>$?ZnT;IP==r7W{l%OMU@#F}@Y3^#h87Kdu$O03OfJX~}D& zTkvyH&iuPbXMQ%qk)N66z)#Jv=a;ud@?Y|oa{Zwke)g5;_-C(v$g8K=Z~7yi4dbrt ziNE{3!b|Lbjh7n8`0Z3%esa14|2DD>ubI=4pPJu`pL%-0-O~#O=})D2pFW)?ynlMh z@Yl|)7`5lSXT#Q>+c<0C`4{F#{kZShQJ3;oc%R>yNc(+%+38=+th|ui<9B*dc=>jw zGq0K5mY<66!cQgk;ingR^V5rb8cwIGFP>TI|H;`Equ)Baa$M25_0u=jZi`)VanGXo zAB$E`{BiGE-wV4^de?55BcCPw%Pc)n!k-G4J6zto`uW<8Gd}xnb;zObo}E;BZd1h0 z3oq%G{gAs<_e0^z=|7fa4!@Y4HlTLf+^1?cX=%^*Z}U#i!G8Bg6y6bj`7r!p-fuI0zccsQNddQl3)2n_TXH z8U>LL{91=lfT|7kOPaSAf8XQ|)o4H}ar+&fe~)W^et`C9X^+!dCi2t1GxdGiH>C6` z(0|2Iekx1ZOQk(|ItxJOD>{PcoCxi46VcfVHxTU^)42;eJ3;3g{?&6Y$SU$r`KcT_ zgF)nBE{dCqR4p!~^k0=Wpm7p&f{HLb~{`ILc3YAl;HK*u{$%Gq9%q zInHL>pq5u0UEjWa`#APkAG;n)`4xxnL1{PouqBz^ENp`h>z$<*>rkQ}iKr{%yC%*T zVXrL+YpArxNo(=6r_&#MYcsGme^OfF{4*YmzRd`@_gQos{$XTW{^oddUOJN9!MTF( zvxl=ccBt7VoX?2^Z$g%@s8f+2)c;#7_Lyj&lGdU%SU;yT2ee=Rbv@@_U{zGWJ|*0* zj}$-(B-?6r_Jvp;Il!6w5A4b3hWha}vq$rSq#%AU#h-t<#Fx$t@gv%{{Ppn`ykrEc z!#Nx5{BTZt*0kSC`;4@|MSBvoKle=o=hcw?FYL9GUAa;H<2~%|pNpZrHd-5_^#Yn} zYkV-L92>wFMNYsP_5_}nIEt$0)3H}bd(I)}qBv$+Fzq{7qrJo?hoXr^KJH2 ze`rrfagUGo$!Ncc)<!okHqHk`T#@#zCxQpscc(Kb zw6|htkF?)T`@FuuZysTjRR0vumf~6@$xhFDwEiLpg7|Fm?YH0ZcV3(?u0hhCKkbPq z^%D=Xzys|&)AD|cbZUa|dX}PRDsr^0PiwJxSc|1S_lDoD@C@`ZLmtQ;CpWW40rp6Jg3dCL zJw9rml;oc=sI9oqPtSR@r>?Av(DNNR+V7-2D%!85eZn_i(EaJ2?Uh@cC!fQfGkBo$ zRMaPE&zxLy`DYDoC+=sE%~9P{FFj+@vpqT5-=Mud+GC=q1qDeL}IvVbBBI@7iDM<0kHDD9_haH|<@~I_uf9 zXZe?T@#4NM?HAJCIqlif-v2A|el7J0+MlAm+H~v@DmtLb4995NJBRz7{YMUU6YZX4 zC!N#!in1rTd-rbMaQPJfbX$nHPec0yWRG-)g7yZKK0*6@wAV`elq+N&sIriA(m9G5 zsQc^<3VC=8BKwQNx&ZYzYIBmE*41dupVo0{4fnu-1H7@ZQOx|fKVKc$FYZ~>Ug>J^ zK>O9r++)YT7@@PcW;ze+HncvOfc3GtSQkr5Tf%iqmhc73SMb!#=XmVgd0fD_M2_~) z=^TdACmv;wl#bTStCD?g8QPqopX87A>mshB#HT$YuHDVUo=Dop&0L52mv7m6e;Jz_S_?rK6;UxM*GkZjzAbTYDSL%=R>nheiNnTrX1r{YD;vwZuvD=JO=%Jro>x zUF@5`+poEGOWbE#y?V9SR)0nRb6|h8FS7t`zT|}$c@p*r=E4T%KeLpt*!40`+q{MA z)@Je`$UYhCg7K+K_#EtC(D*P7YlYER7p1;C9_!|#u`WkzdUWrm{SKPLRO!6`(Eg&; zoy2iJVtx{j#QOdHy-}=7&cvC3Sl!d2eyAxT6$+lR*7=Jr3w*G*h29~%_Nr;PFAGlK;l73|CBjv2^x zV?6od;NCoScsriz>%=#YYRz-TwczFBZTVXhtoXYVt@+V#TYentTo+!7<3Fwo=D+NY z;SFzY5ciB*=)DjWXu11)K1<$D8r@CtC1NrdaY5)2;cp z5w`p^*5l4bIdWwUOj(P>a)Li&%%FHMko`_VV9QUj17;_{}dW`6tEi@WZcN;$KX* z-EAndq5n!z+Pz1WP3wGyWsB>3Q7!oQ^4i|%nGT%RuTEku?c0dfye6&-zq0RHesNp$ z^$X9(pS<{zuJXIpp?khxH&yqKv8In*54u*l^`pzHhl^{6-_MrT4Ih+^wK}Z}ufe+5 z>8A(qGimBuXP)uDaCYU`_pt_5e11p#noGG$=VKjg%!NIR`+dJ9hMxJJ$X(f+-tJ2I zy2=Y%X5ToQKI$sgw>|~W73ZIyx8;X|^o2hZuA2NqL56qj_PO+2_y3H;%X9=RuFwLD zJwMM@ynl}g>G<6)1XRel3eUfPfhe8*Un65)WiH+pn!Sg`ojswWXD3<*=pYlVf70{J zpSs%G+D>}C{)0Pr?%)ZQb37|IUAS=JGt4(akeSN;LwEP?-OAUlW6q7aE}fAbg}Ht< z&d#EYFOZSe2L8~Y%ElPX+v%()&DZf8VlH5Q2!3uNBdsAk$`N0*rqF?S7U%sagPyV&dYcfk@e9Y1vlm_86(blMBW&&Y;l&@&W0 zN7A`zdWO|to+|63J26J{Ji4#b95ZiI3fH3yLx@4YUR zx4EMqD0J;N#?Nax3-I+drUmRjD7|O!!EmIK#A* zmzMC%nY+6K&_sL#8{R4DAYIY>*NhNHX)MIIuNfmwx}tZlnJ`aJx^frayk;t=#1+z* z$tm5%x2`?*_SRhV|Gn3>c%Ln}56TV64bRo)#^t8wX69z+7Ux#vR_0da9?Px8cWCsv z9(kU5-g)79+Pt_tU0!NldLApZD0C=vDReLNDD*7!F4Po~PV-S#NJ)5!wj{1ZSCU?m zRgzs&QBqY>T~b@3FJYw)rS7GkrJB-^Qf;ZOG`%#dG`qB-w5qhaw6;`V%E}zd+{--6 zG-V-W+A>{PdRbOkc3DMPRatdeZJEA|l{=KXmwT3L%0tSv<+}3p@~rag@{01R^6K*1 za(y}5@37x}zvq6<{*e9J{kr|>`?L0E@2}WjwZD3Q?SB1!Fz0~xp8{C6L$-UiXSOCg zBwL%U%TCYE!jZL#?5gbQ?AmO7Hp_9yanJG0(d2~WXmfNq={Z?B**O(CRXNo;wK@76 zmg|t~p6i*bf!?&ay4>{K@V(l-aeK2xX^%nP8c2K@GB=f2Kx!Ar?E%TXA$xdfTxlv~ z&xG_lOD!Oi3#8JOr$U}gNVF3&6+@~@$aM^o)j+n(kgf^xSwKP;$mjtny&-21Bn^kG zaga6@@@7KfoshX0Qdf#{*Ff^ikiBU?bH{s%McFMNy$j^`fCjvwgCJ-j9D0a@CQ_k` zOlV^#^id3rR6-}mpp_cvz^Ta#v(Jw1eRt?H&%CaSqY1*fkiguTI9LpdB7%vV3l#O$jrQ*dBu5^dB^f<@-F8! zNrNE=WyCA3_ydbV1wIH)# zXF+j6Wx=t6nu5y(O$8RPZ4cOWP+@psTw!WqX5r4l;=;GK+Q=6&F<&9V@CSx?I#$WKrx=>{0Ap98?@$99NuLoLRgRKa#2}K2}^) ze7U%(*kZ5CUXQ)rdxQ3d!){XdX71g&w|H;m-eY@f_FmrGwAW&v%RY~N-ur^~h3|{o zm%1-=-_Cu-`zrSx+gG#i^1h~h7SOr}G#-TB7FUuAJ?|_jE~zXz2FtrFTAd3l&bu^7 zwzo{!T5)M*>9Nw9(#xeyr50r_WgcbTWkF@(WpQPxWtn9=%Zke?%Z`=RlwB@sDzku9 zdX#&Y2bG7H$H6u;VVA|Q$z!m`%jNWv&SJ79w7xr9UV~QG{!i@jA$aF6?C#&+-?K1E zR$zpz#t5m;WqA&H?ieFAc_A1hbr>JB^0M#nr{N#rk5l*I}>wUeCQuhj&gxUB%+q z6Jju~kPh*^27tc68+{@b{h<;)ffZSx?jW(=IMkeqx-(JxPSj8Rp$a{s8hxS`y+U84 Wfi3UcR|N}pfbF8NzukXS1OEqfz2&WQ{e&*~Z0kN;|>-YNp z_vOXOnVB>5%*-=0&pfx8t+{%+&0(|I@_8~Dn{6d;`4?1w|N9@8-DVp&YV|wt;Eu;utM{9aJ*nPrJ@#|; zeVfYnm*Q=|{D}DP9(wDsKdbkdzqH=lRs7N$XU>s2zN<&I)i&D=_Z8UwddclS$mQv@ zjkXQQ8(3y*CdEf*`FHt9{uHZVP^CyX&t@x7Nxg5CC`jdBo~^DSS14PSR0~M%CHb-` z613e=XSa=&z~gqCZwl|_c3as%Nyz@|wAtom3Y-1lK37EE@^Q`6R^DoFWI>X9l z>y$>$1!G0LuTz-o$w|KEGv-dVnd-8*tOsyZKYL#)UZo4 zifmd#w@ih3Q#B)WvKDCZ-1ol}(ew^;bU)rr&7Q_bB*B<_vX=PQUM+c1SNg1#{Us@| zQ}c}9*$1LA*{%gT7T%^g*2kaL^e@sb^B+tLP4A2(&x<6lqg8*KWQ@3l!nT^^?Bb~2 zs_C1}+e)D$XnoeK+&9lcR^Jho&Hcgja>-1VntgQ&m2wfMNK4W^T zIT|vz(R`Hkw$c2v{M{%>Dw%5G+o!#n!)HX_3Gy}l^Jrk5XURbt5CxH%mN;0ruvAN4 zRjfI7OLN*oC4xrttLJUDYX833;p92~l!cL2EqPaIP)l?a@<9u%TX13DuJ>Z{@*Yh7 z7)XN2oqzF?})_^fj8{zNOh_V@_$tWiBl_Kr=L#XHcHGa43}<&U!v-Nry(YfW4+wARJNt z^rMzP-zq=tDCGfri6pm&n1up9&{mC!%IbcLq3 z3sz1+a~LF9YwhsL8zFc|>ERJ^CerkPly@nx^fV zr+Urd6-4#FN0Qf+)Ffy6rbdkC7JW@64IkIDqiDMGo@=Pfzg9~&&4mXEt;`ovlDrdu z57!a&ug`cNdRZp=KQ*ICQb1)iIjhq%sCqB&u1I^ckc&vBdGD6E|V$~i@ORnWBOiAU)-sACK71Mcp6(kQs{LXfXP``t+)HPn}HW4=5CY@8Qun7 zo|o*iLxJ}B6Fe)L!E#<(*jdN?eUzK1@tuzFT+GLzOgK9d>N4nJ*ut$(eTWV|>@6T7+Y>6&LAqM`RDfTqp zEaQ+^d|0Mi$kfyvFJdUZ0C;K&c~lp@lVxP+p;6-tt(4hLWj^U)h56`#OomMD;nKNt z_~37*Jw6~;7QRez)>fE($_PV!z>2Thzg|+bYJW2zo{@zv-v%Od&* z>?O~^Yzl2kTwhFcozDpBEy6vWz6otrg!_oSVG!SBZppsF_LALOhBJP^cu2wM-CI;y zi0ZC3rUme1bK1&eRRF@Jz8)x$R@tK7^e8YjeZf?)MIF%wBM0KJHvG&g+{FO(-QN`L z*0)*I`X-BfpLS7>d>=={`|N*dkEU-h2Z0%O`oR*uk+5w0|F(8Zc#TY~z`P9XZZtn+ z!EQ|bK*EB@kIQQGP^G575z)7qZYI@AwU82P%Y@noFRRws<=+VvsvxOn%olTaQi`f4fn`86M z=irPO@4dXt!Q?aFmdqXIWuw%hzf{FdFVH|Qw9EZx$@Ga-u~kAF(2Gf-sa#hCs!iBfmL`M7={2Q@c;L^5*!3 z3e^j95sRe}rn!PX1<%d|m)^zJe=>>7cIxhXZm`=D-F8poNWM0$k56iM&LK&Swc-8E z3f1fH^D@7po%F5$$_(vF?c@*CBxq$gMKa7KL%Z`-N;53Bv@7_MUDdU0gEc@SmYk@5cZujJjUco-}15XpO|m6!Q5z??jW97931 z=cS$IvJ-5!u)ZOxHzUCq?ol6PGUgroGZ_Z*e6oPz+F)ZQ?likg!QS>4?B>US(p%HR z$RXoJj`Qk4iH$t#$Rh;jTH&hKR?KL%2I2d(X1Nu-k{}BypC&Bl{UQaH=f-C+y;K8n z2RyzSGtFA4vt|D^yeE#&Ez}<&5^qe+I7y9H4?Pe{{Q92-NgFcWKN84zSE^{o>VEk) z8F=3{T4u~2BrO>&bukGlR~-wkGv3EZV{i)9%-#f@cfUQ|ZZkJAj+!1Wt<;jvR}sNw zr>kT$hm&^JNL+XRPF_jpv1FH=LBhjHYIlBqt=%TowmZ{=WJ0t%zsiPIf;XFXQ?o3I zPe{|+^X)R|z3IC9;Y$Q?G~bs?gk-v#bBPqZ{3V7l1FDwOv&vRA$5#np6CB$lv8*-Q z&9ZDaS0RVdO&1NV&^uH=Kc#vzF3lmajMl#;J)xgv*?!JaJ#)S$ucY%#vbQ_E{I&Y# zA!PM!ST>YvuJmmXY5L`G(#auqqEE;)ugSJp(Lv$OeZrduAv_uHd(TTdUhb0S7?;Cs z=v$cF8Sgepr{QO7i5p5Q`4%mmrUAG%%F?Beh~e#$SSOJ(;Z6XX@jjuzU0XT_Tm%&x zAH3{}-rDA?&wr8H{2A(zD(etmGv4d7^;PxOH%IEL>#eU%>YICbeP>fF)1JuW-SvX1 z@j4|?DO&Rx149Q+n5F6YV=5H7HCNgR4;&lfZ-&8s!9BJPBK_&v7J+)+p5C8b7f_YL zHs=_=+ReYSL`*-kzp*)!N<#$1@lpeOLSk z(5Zz#G-p{YDQnstFJ(;L=BxQvRuYsGHroBJ#DA;eu`{T_FYHLSaQKOi47`x@w`5=< z{E?SL{@PUokR?~qR+~ASd9BuRNmOrHS#!1U=gw8{vI#BHX1YHnz{-AB zUXC{!szj$4pRsZPg=SZUO5&GC%hz~bx?~7^bcyEJ=6NYpfI^`@Y81V}oGOh3w#7>H zNk!2>%e?;jc$cFk8fc!!!d_FB-UB^r+HPSfaYw0bvEZvecrDX`bXWsv=|436 zVD9$rvbrC0<=Zu}-aJuTS$6_E&dm{uXVO;;-4Lv=fQ=d#j?!EsS<|lqM);#Qv>B zPn8xy@29u=n_D+3Mh7Nmr7dW)@uu6)3h~H{`93vn-1xk`b>kWWu!z4Qy|w2pd-T7h z{|Q&A`7bMg5GRw_-(2O~N~NBMnkE1BH(KQ`k#}Oujer4;?As{4{!ki}{i5OHW+tG% zD@*!b`-575`TB-Ur>ufWvzcqDLH4|w&d|!O>}lrw-_l{C8ShnO*7RSRvQCYMck+=v zMNy)O@`Y(KHb)tZz3QvV)Jq*`q+!Yjp+^eC1bnhV4OF0;I^-i1q*hBdNj1_Cl^9z2 zsMMRmBw(kr&=V#hP6_Hu}&TQMz(IX7fElIO68!dYL&I}UGX!unc7&*(UD#2zTUO& zO{{7J%D@FhiB&?AZJvj73)R{y3^xp$%%gXHuV{*lx24z75w^P<0yF2|vNt{=ac4<> ze5ihz&$xH*ft&x8=*nB*MJ5ma4@w@T*HJtmY8~?l;i!`E;WJ$3@2#-;(-V(?ZHx?@ z&g?bDox>}A3_O-}s37Bw%19Bdla zUKzT=TJy#JX8(H66Jfn2tZxrBd~xHgvm&8}&Rb)%ZiaCS>z)4fYRP$?s2;GDRUc~j zeB!KIApN&A2#&lko@o4SN2Z-3}ZMJdE1$JAkY+PMI zo-KC5xViE=&iQ=z*O^3@4^1jeu(ic&o+n%84+-l|$JKUQDA8dLC!Jkafs;bgJ|loy zAf$g@t?#PVw}ldi3h$Z~GD3yYc3P!>L4#;74Wc=o)gSbmKL8+k0Qn1L6J7SZhOJ}_ zY=(9~I{OY~C}Cw^S;~iSp!2T57AAJ|{Rl~1g~{e+;d->h-b3xqKN6Ld(e8YP5POO2 zP!ALItp4|q`NPTdS-UgY`{@pX$&vL|hT)z>IfbdnzEx{^-=__L#7*^4bc83dPhjcQ zzR|50w0hLS)twsU{=7HQ;c9oDOHgP_(&;A@+SlTXO;2?A+MOeavbgwg93doD$5xu1 zM>u>UDyO~Q(7^vpBoNlmyv;BSz8yOSf|B1rBwUg<(Iyh^~c z`d`P+FVZ}#J4^WV94R3%Jb3=39#FxM{zizsrX^K8CS%LDCEhDcI?tO1sD|}rHk)1B zzfC*Q{UZh2{Xe)MZem`F4UdR_3acyZOiwYGr zZCqO%x(-GDMn$uqnMvawW>e_%Ptj?a<4p9sN=umLsAlVLciE!)7pU`NQBAkY5({gI zEg38+^~80$0KmcbJC|B9T!;Z5O%hkz|2?x5(b+jtillu9=S11}178tMyOCk@N;Ni=}{I);SQ&va5&OPpwHn?PcAd$#Nl(r(4D z!kfNBYhU*{9~=gs5gWNLuQ&!N>4(-47_@5|n{^PXTlx&MsadG8Pixv88!c?6Psu2E z{EliQeV@Y>chal4^L3$9t7Y;Ea>}9*U6}G%X~ilbZh|^w5ePhF8CfqR0O;3T!Tlmy zS__w(#qZ66UkJ&Sq04*BRY6)@qjyL2j))koJ~Gc?w$|uBaMkGNNAww$HRb==cTxWA zkbaNmY5H6>f~vLT&83y8%|!Jr*e~?Y^zerKXrR+`?@CDvZ*WN@0jako?%Ggn^E5tg z1&i#l;e0NN=x;?FYh?qe$ZW;_wDc!@zx(cn?TMBylRl(1qE8G)9B&G?&~Z%! ziy%7V9m*zeR#7C=9te2u74=36y(lA;dWBa+zs(mZ|2Xw)!eM<&jbr`zp57)&lbCdO z{yiYd7rW5Ey_(5*j{b%q2DE4abKWS)Lty?;$z5E<6CWVKB7#M+!pxdbVC%e%fx&UH zFl3qqtId>8jBT~WiuL?f%Em_t{P@Y~V~vS+`Wi}3)WQPd1$&KSZ78!f(;n6xp+J}C z-l=p!VI^uHcca#;i0C&}M)diFKd=mIp=)Jc2!HhfJ+EM z#`W?3rqWd(AWx4-u~BPUAN#@5%b8jjK^m&m_+6H`oedXlm+y304D7cHnP;I2S*7P| zD6?1{gEYq_th-2=c`8Uu`_jknvlYkKwL@i^?h>eM&8(Rq9PEFD*+{I_WNm7h_p|M$ z7)+6m55f$nzHG75m_I754~ZeztN*gnzdJ5GnoCPwURn}niWEoMTcjH)A=j#?w4?7o z)h^vRPMT?W&;AM)DzGMYVjsyaDcq12(2D03@Yl7VaFv^cO{Z96AiW&~6Z__+P+#Of zr}+r%oYe`{ufb9p7D86y8AhDnD_FXIxb#aPg!G9gZU$>(cM4cTb9C>YWi058Y>%Y zPiy;xMX-zTi|=CoO}lmXO!8v>sg#-^xLbz^fyj8*{zl>$czftA6f`^kSm50NF;8Pw zC7q)IfITBN20XT**?^R%`9QM`aWuo`POF+h8RtGeXIkNi=j~86_0QF$tf3Yh zedJbhrAIPozn1J903^UVGTzS~2lMV1NJXCB(<2G~7aHu-yQ9Xqm$qPpOKiql;5~~J zNA$)_?Y(x}@<^b~)A&bP!H{{Ho+eO(4Zrar0(u0BVJ|*NWcJAQLga! z`v5vg0qO&1oxou_iN)##3(lVfPB)U!5pa&{184KEj*v6-cWBgdN@AThyh{Ws3rnER z7jVA^96AI>jh4AG-p#ZljTG`@;8;t|T4m5ik&6_6rRYRR?*#A^0Za|f?-39KxZxcu zRpe8Jd9gGVRfK{)Ags4#ytie+AKL?-F-7(HZF6{*G=4XIwK9D7cWJN1swkNU`MubZ z-#a0}Fu3=Rg(NAHw}{#yy-WW>-z7`mY1%t25gtvPB{!RYf^$$peQ{Q({}ln_ z`s5mvT%sLOCdVH=27>j!x|jySm9b%NR#N`;qzj(U%SriJePb{u;nzUlU}x%b@;v~v z^8Fc7RBv)g+mlTeWGjY94?i}SR2ahEJk|9uda;bRhJya}dRNAK@E3drI>Nh2P!w}b znRt;Hn+l<`MW4w`u=Ec8jpj%+C1TSPY_a*n>&%A%_`qVqVcs{@h_1w%6Fod3`%Fbh z-xb0AM40ZB*$(xW9*@)X`jtY^37@4@p2%#nIr>D!s=ux2n=;-@e<|%3B|ocOlht0! z%s|~A)xGatfE1%|K-{1})bG8R>J#r>7}@a#rE6dXSfL;;f-E8^OaD>y&UJuQ{F!+f zsA0m;J|^1@r9KfV6Y?GN?(MB-WO@2{lw!Cy2aYj+U_mSx81$9V!__B87?{ zOXoopSus5}OZu<_JTKSukuO!T-E9Cdnt!BUv}rpw@U`CvsW$72lRB1|;Nsh3=VR3L zZu1xjx7gwph4(amPo^>4l#WkDLo@A)z+JejDus|W7e@lk@h>CzCx`>sV6sNV)+iC= zf85c!oN;$FskuT%@axo9QW_C3?n3LE`nU8^zX_r;-<4RD@A5RQmXt(Gg=Rb;yhqv< zO-4|=wiJt#$CnM22L6fqoyD;`8Y*#_YL4C1Pzlf99J{umlKjoFnuf{;V&+UtMBENysTK6L?U`~#`_CKFnMQj8aryf^i(C@N1~Rz$(0(+xLcbTavK6q zPMj6iWuxwV1Sg-?jY;>9)mziOU!BhgzM=WOjiksxGQ*p;XN6tn$t{wRe4EIJ>RV;K zs&Ce~18r#p0|rYWGv?6$$Y4ix=Py-$G$~tG1?fTJ{R_+Ai0oKj$_~i$5hm`n65S*wTR65XJQkxYK6694?om`O72ndW7l`tECE|EcdD9j|Cy6EBfk`&Uk}BRSLT ze*Wzw(22HfX1W;NIkgwGIj*G#G#DECu~Z+sh)i)8^^Y6dFIELIPFHtex0_IE~!ovF3F=cw`gi5b$O?cW*+v@94AajaKZG0z?*+XYMCe4G$O zqYt&o(u}EBphLt>)v_G;GhzMnruCl2%a{j72<@JI!BBHU36U8?G1Vt=0n!hq&gHB5 zzo!Ax82M+>`zRMPI1k9v#idfyxerc;UL{A~EH66k3|4+Gj+@7qY^<7=TpWxVH9WhO}30|M7!GfA!3g2dNs3qq2Xw1u~c<2}n>L8Z-A(*|`$Y-0v zd;)lVa}RWLKW=L18SN;0tAmVqa%76-k#z3nuYY~|Mtqo1mMmr^Z!i}^r}a)qGcspQ zrFk>3g;V6KSw|R$%nOyn5IhjevFZZxK?u6EOp8`k8UIhxy+pxO(30MJiI}JK0WngA z@o#01WFwSO77xwrI4CyEpV6wu-3UTs`OIj|oKy~;$5lu(6o2kS*_A$7ntF~}rs#qs zWgz;z$&})C8ZQRn1uWK*?OEQkC5x2B%*yJWMOOn!P=>GBWbEds-W6I_z&e_t zB{orT9R<%oIhR>Cc3kY-th#2C`LHU|CHvwSVU>ir?=Y`qX#MM1idrOjVI)Y?G zZ~77640i(`Oj+E>yNe~@S&CC6 zx0np8cjANMS>YJ#TiB0rsK7ZRcKq1U@j?PnzjnI#YgR9q7vjzT^mfTgV3`BO&zHhp zeD|Dz@ACOS(eSG-?}oe4677ZhS6a(w4)%3i|GvQoG1+w+X9Box@2~m_>z{h+IeY>-ssM`DDC%^bXm^b#HnC z-vV24`SP#Pc64Of&y4pPSQQ5JpL|XiVN8#^iG51UtSVGZap0O0ABv&J?hTKonCL1s(Zs>`4_ zcnljgZxZ(rHls%MUczOBJE5#QR|;p1JcY^W&1CgXb1I!mEcV%A17r;9=t%AKRu&hS zxAn-~<`m{8J5Q`ksmtp4rZ0bmzbzlRa5{?*Vm`nqvQYIM8E+mzAPkUPFxNYXf|KmH zDo>E8IOH&;4DYQ^3317ISC9!Dj1noMGMf%RFF;9l37iK7PwF$20ulNe`Ka(N{QV~= zrCL`@=ltu@vS(6_bj-h9MeM1CL}&wZLR_v=b7UmZm%_JwD3(49UwX5}x9z>KydzrW z{1xEh$G{v${9Co8SLxS;j+mz~X9SLadup@-DsYSj8~)kPW-i1(;uy|xG@}*ozr=kO zvz1-LYmOL%Rm%psvYETSKVv z*@r&sGf4{UWLvEA#|A0^Z-e4GGbg-!aEo-CcDgQgz#C7&FN3f9Sm+*uYU%S6OOn3 z{k(ne3|}vj?s;%nRbr_2B@X7ryyocQo}TadoSD{)u7w`pF~mV;8EJN+tWA)5D4N^v0_H`$w)b0Xnuc zBUeNN8!RoOR{rivv6X5q2ch;mHT@t2ze^UsgHX6j3mlwxeAuXF=lq-SbAKHxDLu?t7aF@&}h zVxe@nug z_+?~Q{Vi`g}khdnV1z9SvF7~{#5i+4nnA7wVS|XDXwapguTqY&3 z4wNZa;2|oG;RPzdDW6;jkA*C`=%XG|vX9UWh$Q>wuh8nHX3-U7Ue3ErMtkrv@jyDIeH+Y~c$fEB7vKxlr>6dsohS##y=5Fqh>lFBr^PO68@509DWGv^imvOPC zU#Xj@B)6yZ>g?M>CG->}{g1GXZjU)V#d+!C#JK4w4Q+9^r`Y-YY0CSuAbqj<0DG>M zEL2{2j!v1WaYe-L@OKKn1SI&;YS zXXN)ElVQ&o*TtWO%|Z_Y0C)-V?}{W$*8&eaL!M|nPHc%ZwZ^uvg0qWXU4{ky_9qd z2bT1qWS66qFS5#eM77b+{2kk-2q2S=D9yYTp6n>)H!_vs71XXJBcnsN`kB{d;pF`v z!)dhOSp7(5WwVn@Uy->>HiB!I@dz0u>TBZh$0=qrPl8{DZf~VsB8pIJO^Nw{ zV#P)1ko5!>j?0~cHQ_ygx4~Q>cvWm+uD?P0VA5wE0p+cwxhoIrseH-xaBs5upK7+Q zfyl6~PEzAUVLdX}9M&6|X3G3P(Ij8$%#1>|ip(*;=#6ORhrN+nb7ya4k-4EKlB}05 zzuX&d1_$PI#6f{Civmy$3f>kK8wWT^l#`7dog}e}L^{ppm7_CCj27}D9!yC^GCQ&L1|)7TmO~y-okF(cudQ;s#bJu`9FnGJN1t`mOV2Xi zryF2r-ItsIzqM0rccaX0XG#&JBPxQi$;9XTaaKsr)!pUf64wQDA6Z!8|6biemzAy7 z3_$I4cR$IY%EpWFK-f$^v_(JTTY5F@srjlZ7(YgL@9`-gg+Hjuwxsb4+hTga2-)Wd z;neqwL^z1nY5VsGkvXv~2F*O&b;0~b&UR&G7We&tlr9W62P&vL)qW&hh%HXvqPuVA zyK4UVsui(0eVTt49nsyBB!{K;ljeKKM|*biEzN1~9p<4kluCr=`>f`FLIP-(=5H`- z;YP^*EZId3jSW4!rI}YqGcB6a7x(4NAolf9y||yM;2jP3e{=OIH!oDz-hOT?>!m*G$C5=Rg*?N5HyEPV3RQxE7AbJDYz>V>Hwf$dW9-TKK;`!4~ z3z1E`v$%W>2AnpP2`&rXSK$%h^0rEaOQj*tcq5A~bZ!Hkx6|q)(W&;M^VNQYDNvXO z_Za}lcuOcqOOG`t$VAq6X1sUb#UkUp9=n-nV6r+4bf)u_oWl?W-thcPJZg_-0~BA{ z3jgkqNNxv2%0xaIU3qnx>{pYD%{a9zol&MGXCV8`K<1g@OATa)tsEAgs#RTG62GW7 zZ^X)Lo%Ot5P@bF!W!xaAQ?~Elo_N2=^H2*0&xe|qP6XnV60t1m?7l zRL)RspHghfMJlv?vQc!N`HhV5kr-5q63vlMz%nmVv z$7BF9oE)3tQ(g_0nmj19s8$??#e7$x9EQIO??M0WYQ6KQc>jjJ9f|kR;C*)0u=wRi zB7Uot+1l?0AFZcHNBlMxqx5wtco$?>N~a~j>9{r-1poGszF7@}IYf2bWB`U`yaVn~ z10ef~`7(d>l2ns|HKjxgq!x_t9fNbT{m?gAcOo1)1gx1&M-IXF)y%erKs75n7b^VQ zk;ltalfs;+Z5Yxs7B?O~7SpV;U>L-$jIo%*SOl%HpkFQ}+>5a@=jf~qo^@Ednz*RiaePyRzhz|`X)U!6O@0DewR_`}F@%>@hn3K*x_+3nS}r(Ot)7hJmdQgegI zefj_)DaFEGS=J^45a}XVt-azWStuL3OlbVSv190t^q-^pEPSjN?@e`qObJBwEt1A% zFA*`{FRqQ0w?}c3;WC|;LyibG6hl+`ubRNu=)bmT_y-D+8WR=qpiPx3t6R+aBRuhD7v%=KGkPv8vY? z3(#O4jDIXf;mu--#^Co@>ElvmVr^ZIBOz8*W%T2~an>$l`u?s&=^WqFYyZqm2RSx} zwGuU=e;-;i{NAJbdzdVPmFJui->)Pbxsb^55h5q9*9&~c_^b^Bt==4&b#v9?S9cVN zD|L;r$R2fkBTan{mJ7Nq#{Xe8Vq{$>clm&{q32mh+er^<$`4KA8YI3%^-VSUTC@9H z>*LD`qf=aAW05PWFT_V@v!@9Sh)t_HKVBZv|7K|UrbZQh2vecCLRIFGIWZm^t`A}b z<|h`XZ;6(l-+SSZ%qCpa7jj74Gub%pJWYSAMsGLsPX;bCbTmVAvx2n2yn**?!Z?vO zjj-O9%46}-+D1QzRS`0L#fa- z&XrXN&#F6D4`HKM9(_Lez#5$u^ttx3-9w-9k1};K@ur=nb(Jgz5IJ`;bu=Kd%lc5Lj6={1aZy(Gx#{26Vv2UiGPrG&YUU z>#1)rT2w76!Uv`Du2M}l*Klb?;&Bmbzu``t^abY0qt(Vf{3sc$g_<6Eluuza{>IeD zr31%f%x0lI4}syxgq#JD10kHfspd%Zdg0+djtMe$D%t7SzJ32vXn0o&%MQ4WmAY!m z&ncBT0p9_Lxzfd22`!?7^*l>?meb2e&A8G&qGRpt-5jfTwTJaCazbzKj>yorcSn3u zy}Mi*Q1i99g8o4i>zh!mZ;@WrSDg_bv@B#tedHT^M!X@NfMxMT?376P z+cLr7aDPi_%V1%)A*G}T)-Qh4W&xfgfCcDcfYvYWu!*2m^SpUB>0*~LWa`SDD!+V1 zGCo$iROWWWTAAW~sTDfDD_J)=*}IQ_2CNz^!(pu2Fk!zOORr|EuZBar8V>DhU+PuX zg>VWLic?VRoa8Y*=#y75&umGT#axu=yVOwt6#K#jFs+Zu1qcU(_0ROczH2j?UBZPG z%u`Ijfr8N(cv_Fyj)PLJ0C30k%@YyGLFA;VaiG;VR6=-oALgBu9}8JGG6UR zs`bW~kjm!N9bNk^v0EimbF2cCaY! zWDw71GBf{^>fKBb(Cr7d&KeGn#q)-i*m zS2BaHSuJXt$4aH!c<^$k-krXP+{$C&=P>;tXSa4@(Y+rDZ@KtT=MIjq4`~r9x2VTNwc2%0e{jUD%-4QcE~tS0Ac(eWT{B=5*SNx zMzK;2XEV|eW+dwr;6%ElTF>5-Eq1R`v0_{5i+WKVdrZ!ale>?ss$|WezKdxmv(PLt zF2(~5c~8{iYaQM-@Q1qH2pCz#@{!|9DrGp=HmeEzD88`LeVuVZJsb2j@wbM)>a z?t;u;h3XRh-hD#fJTEoR{_;7_K0o6IFXe}p<&RRHl3L;ud;AN{__2)UYH7~0{HmpP zahDSl$`@G$+TmWbvgBCna<*B6C8!r}f_v@INVC?TF3PQSxqcMJU6159bjy15G>((T zvf^tqUf-><06mRZW>u3}QLjn$OYNCvY7ex{`)XOZ6dwNa(kocqbA4%F*t251-Ls-2 zJs_}oeog2ifutKtz32S8bht)f*2(y#yN0e%sOD7I5 zxD7u*OBZ20EN$4AXO9i2kCv1aFN->FOMCa_<;4a{+_&t0=WP_{Qj7IV?=LAKC_O`5 z&=Q~8+L`q}4F;ESXhR7n9p=vfj5g)( zZ0KyM6*@OyDH0Y61oPE#ww27lRdTG$9HJN!(Xe_NAC`HkS68e?Z%beUClzEh(xtop z|Iv?#qeDnr#L=v%o6Ou5heN{J2$LN`8Fd2pf9)^_(I&l1)Q@A#2WXl_S>%{9{V9P# z6wbhMehP{Ms5l!t%^iQ2j#gJ>t#W;gGiZ`}l2M9{@6RGoCjvJLa0hs@I$DiRM@w2Z zJxb_HWvw^4zds1yqDJN%^G&SRHE8^+D+zarS-_a!gflY5W`WR(soVS`OO7Ua8f%nH zPF6@^(tQ*AZ0Z7%diG;+AB8>fsly@Ny0e=cP0C1!Q(R(|sQwi{^gl8H=^Lz@Ub@&v z*^_>4kw_tgf#YM}6G3mZ)n$he+oAOH>VEVS2P|^P@y9*N_FbSQmsmyNr6H+`hFFll zkR2L0jDd1qq}|q0bG%;7>ru)r7rkHoxVO;l+Tu|RO_f4UlI|BspuUe>@^TLzAc@YW zBr)kWc$sC;Wca`b2y+A0pY5yIoipZn{B3hCAPR9W)DJBQJS(4z8yO zWiUmfr6*NhTY6ILw92dOv6DS3LXg%$fvpRNl&>-Fup2|l>Z9kE#l&^QWG{-uvd{g`@{o?$F)Kg63*cpjbK3-lackGzJCJw#g%08MMp&GkD z8nw0a90{-mJ5Q8AA%SDWWMJ)3={!B1yw#N&z_?Y7+y+`aOa#-wpl~>ziRcsx3vU`LB%?nGbjaqxC z;ehO%^N$TJD-1i%)7J1SR-rMb*0fzf)<2}OdweB+ab>*Yy6pPwIljgyE0pC^E^M* zrccUN$y-%flC5%Rw#tE4m9YZP>MshJxhRT|N2(jQM;Wdl1SsmMZs*y;5gibkm*g5% zGGMcjEj3szdmcR044QksYVLR10D>9sNOH)v*2>Q4X?#j1fZjPfTvZVpfhz?{w`L;e zTqIWjpL3CxXv-sdUi_bOi*}_}{-wOpo3-U>+YZqJxS}vAD3RrZ4{gs@nQ=2s8ai1+ zA$;S9GF6mK@eBon5()-|aayEcj*I#k1t|p=zF%&_b}0Y9E#^)RGFlPKs)_7<{SDIS zZ~6ZprUK5|W&OJux{6sE*Q?d3u4=xjt6X<+(4Kw9)QS~FtFXtMFSCHJ?` zF8IRa`Rx;3He3JxZ4-<72bZ3uI8=_=&HEC!dJTU*^jPcSE3K0byA}3i(-e+Ub~kj7 zStDrHpJ7tAvDwAy(~K8XgHUp_Xak#LNC;5%>ED;8P(k2O{8Qme>U%-=+Erzq3oi~s zj__^WWv_pZ$FYx_<4-YP#JTL{e&7MGskv?NHEQ3bQR4p#`fEWS$6Q+d8DmPJc}TWk zeUI*ZfQ2fp^l??sd63wKW9_y`)!03;y!2>uIl~@F=A-)MY>Tm|C_O}X)=?nQ985Z| zl#(1)XjuhUX)|qDEzzSb(`Iht%<=_*L3PbhIIX2iE`Z~Vdwz4)$~yge7Os`=nE#e< zoXU4Zzt!C{+RR-|>le)njNE>l-8TP+Y(P=t+_s^#Z106~tf}P?b&hSO&VBpBU6pp! z0*Sl2$}+JF&3|&`zi>4tGi8UC?~Dxy?2Hdzh596uE?R|pCX;rqLScmec*gq}4G&m{?w$&3L)Ht{_Jz071Gbm&*0S^n^SLajR^Hi`)N?VKA`mb* zqNCBBfA-3qMM1?agjS_z`scg_Uv#kzAxf1J-i~3O}P{zCI zI>DR?R_&U&u@8V1&3LDP-t7MCL&$}c?O~GS#S5i^VEU{?w4nUR{1PS9c5(yjIS^}E8{vMD@? z&4=|}WWLY%nVW$47rT|^^gWr(vMkxn?z19di0{R?t2mFW=|ut2T=h3Sz|az<0mv8w z({PaMs%-Nha2N>U!TQmU<#ASsVnDSj&j>gvAVN;$zwnM2CYtrU-yGMAL)R?0W@ zo%SpuX;B#QkzSl!NgDOqm~8`7{HMcJ`%@`_MSxX29^tJky;oDJOaTtuhY)#F$nomulW#zO)P{96q zTf1Z9MyT0f^Z4C@CFNH)u-*2Le~>THS`3-Pzk7FVA`S$Ib#OLoE>R6td?~F}oQG1| zv46acDFD)TTogS!{Rwk4MBfpT+bc@1X7sv%rgRE0h?6@Ts-zNBHJ78Rsb5^84zX3+ zvWkCE>eTo&|0eT=C!}HER|mg3_%&u_f4U}gt@5wz%y0}rZ`ezXLRcM2kI~S1c+@;R zDrBrDvk|Hctt^lXhIcm$LaVCnloNHu;s*{mwvR=oO>7Ufu-dt#W?w}7o)Hg{KA@#; z=TA#>ImwWV$1ji4MOnq#-46uDa}3ADs+(e%XLY{RaXgNfHNf31e&ub-&0#Rr+^ zsd3Q-f_Vq(1aeq?>B%vqPmUXejO)4pHNSpGg;mK;6;9;3Jy9yd`&UOvg8?liRKVP5 z{+;qTNf&p z8cI%!9;1M9zKO0{6kNqhF6LxL!?m<2)7-j}C2$XCQmCTBqT7b^X~_&7CI7Ly%E&J2 zHvf4*@V3ExWtX(hat4!f#{oZ|lYkJ` zGd*+h-2BYNb0cNN`_9m+uLY^hQ0AkWp^~M)HAUgctSOpJ%g#}lAvH(MbHRclVv6J| zb)&gXOf<$yAwZUnQ+M7?6-^x?ERJIF$4|3vEV}<~rEBz-d4zG;VwTCE>pQKFt$Y+h z!7&IWwjjmI9%G)*?Nc18?X6FIwOB(J2}VPjK1>U|!vQGdj`Or+m4Fq$Q-PG0G57=Y zJ#i;4(EkAWe-pCGxk)y^4dzeDmTniVi%betS=P3RjMcOL`cP^}F_(ay`{#uGTv+x3 zu*v%Uhw60ELwbMyCBV@tbG$90Z`b_WU|^SV_>4Ou{^n`ChFK)d1|@4!vVqkE)_NLu z3C`60VEdYv30o)q5A5+Y{(%pvC-_sNzqoHXx-q%qYjf^~u-h(Ih=cybr)0c#Vsb;+ zcw^f0WD0{n!>jCQOTZlj?G!7iVX^SYo6R3tse_d(4hb3WC<~s@YC5>>UWGs5&)c~@ zOtmbHTS{v#B6JVCI->sDmr1X7)<(yb}OG( z2kD-5vaNjEG7dU!wa(j4Uh`~VnuOm0}-o600@Dj6VFZ1^$9OiZmyHQ4Q12O+FMw~*78Mj z;{`)2$8fogz!gKCtW!XRD5tJ9JI8`^uE1Fd7cFo&9lusCA=*jL6*-ak5p5Ykf!vj0 zE(?ZzHZWpY7@RWMpy~w9a>1a~Pk8L5Hk;Ka)un&nj;YoWU0P3=E^SAZWS$Nf0MMAC zT**m&pbP{`4mS$UF9nX%LQT?w^K*goA&cb*IC*{GtYA++e2vPzXwv`y>tc9s1BB9o z(z*bN<|DF1``nARf_BKgXbXUI)b*I-U9Ef33I(v-i?$CZNOk1OTPjr?L&MDrq^Ua~ z1ZoJ>y=Yfv!Dni7;FX~MU2C4Pt+npi(!Zb^zfqN>sO~2cGQ7)qtr{YAZI;~<1(K~<&d?^7mfR@2TlTc5BSSoxOuRDvlI#~g8WChG+yt!Dmmu~6@=*uU!3kKxq z{Rf29kvRIbg|L~Yc78Qi`s;toct=Y!oaVt2DbYhBMf2oB_$v~tm*Mn^btV9-<^08` zG{(? z(7cO%&^b(csQgHW;>|dJkcQ)Gefg?qMa-Qw_^i-6<_i7@QoZ?VF*2OuM;C+(%ojg+O1ayFNJ$iTINi6ELz+)s{NmYPq?{sQD}udyp%`H;j!ksCV&fCt17hP6-JY1s2&K{MEL@yO<#`(aM5{1rc^Y*U=x5#D znMf6Q8t;{qZhI_-==2l9=EWOjmopi(c!^T};Ymh1qmGAjXgcnuNQH=dx;u6~$t~~Y zb9sKcU)8jH*%X=?+Lrhi>{*mQ#{33cWxZWiKMzmxM-

    Q-b$Ik!fiTEPA4YV!2#tKvTE* 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

    1Z4NsGh(cNz)ze`RunG>}_T$ldPa&np1WZr~6a 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 QOA;M=0A$t`{t*lOKcm4QqyPW_ diff --git a/portable/launchers_final/WinPython Control Panel.exe b/portable/launchers_final/WinPython Control Panel.exe index feec0d212777638799f5ab40e87cfbb3bbd61632..5795bf9c7d21bed97783602689c0e32337cea753 100644 GIT binary patch delta 61711 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 delta 61711 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

    1Z4NsGh(cNz)ze`RunG>}_T$ldPa&np1WZr~6a z$g~EC{2yeo$umVrc3L`=_q${&j>{0nW(zVJ@y9&O&BT;Gm52Ta-{X3sFri-50A-|!ax@Q; z)(70hdQD1Z!2>2~iUnvzJ4wLtlq9Q*OF-v8Dl1g09ZL`-vQR9qNJaG- zsRm96JSg=gmaT7;)HllV_au2ndF8|mZDmVxfcMR+>6QBPcRssb6RQNQG_g(uc| z>LPb_Ki<0bBw;XEUmO8iDWsvkMhfA?1#I71unCN&h6jvx-h2zA$@ulgXkC1T`EX}+ zk9sQxUDXw6YlWf_>_8J^>X(Z_pD~Ijn?YSs?`kJSPJpOGA&xl+hS1Qi3HVUU~ z6hi^Yd9+0kE-B=h$3q_rI5{vrY-Od#YzGS4StWlgHmoU!kpe}?{ZCFDKK2MOp}871 z1sW`$6jo1oW*z{FhT$f=Z=;5IP7MLn_wvo+=XM^h|0yAu}g5oiMTTG90e^~OPI1odnVw0>wa1EryJp~?Rf6uaY5^SWry$)MfPOeJdOqz87>7c}y2RZX<4U#KtLQ<%`6bjzF;^g5 z3z9V{Qz7orL})K@MeWwOg|>$fuu71+w-f#BIA(d{zYydZzb(Hqe%tAKVktXQlSoJ% zY(s7Dkz6K=N3OYDWS6myNIh|NeiuP9|GO*$4&s^drRnl8Jg-uP3(hW`S#Wmb{L&f9 z@|T~DV32p)q9H|V6W_~73@NM*UzVTc{7Nr+JNkvF6O^7BMY4R=@YTo3U+sp=v|caT z9R1R`I;*Dbw@mfO1+lg)bQIfiB7?n~5*jS~;Y4_6@` zJ^qmNlSdAd@wx7{Qy8&vBc8>Au2v^C2?A5tx@W(BJYR_74P`8pT#SFTF%$f+3sws! z#`{8z`?JcN=!htDvLdI&4&+2~u)9G&M^tUH z`Z?lT;-Q}-t`!gc9O1(gN<2`I9)ysSnRjEh8cpq`zFcg`tc+*siR&^2q!>}zVzzN0 zPeOBTF(=~_o>!P@$L_M}J2J=7KxMV_yIY4?R!lH#z(HcAd0n>5)5p0%^dYx%f8L_G z)+rK>MX9ZP%UAnA=Bd$qI8-!Ok)m$xrL1e~HYja;%c}KBC@PDlW6_q|gdN4JEBNZ( zXWRD}!cCi2{pmv{bIYP@B7s#U%uKu^Bjb$5n0a30;xUFomlYPsT%3mezdkEMf?1b#obN4*J^5|)zsUi z(3|DYbZIJAy{x8AwwmfwO--JkZd|dX?Abj&PnWP^@@KHsxB;{w(novwU|%LbN}?!% z2Wz=5!WJ!dzqMd9zpdN{dfvq}?M5^SaP^GOd+WUKj%Wav*7PYJq)11-f@P`v&2?zC?Z8>n?) z-9_kSN3|G*3o%$HlCxa%d0JIbF`d3x(wC5)GzIvz+BvLcGHX_5t+t$R zteKV>|1K-qAL5N<=H}Qk#ARZ@YODEDvFv71u!)mfYFQH^n!j{x7PN&e0ofKR`cSm0 zll^Uvei&uMU5jrDjk`2*9Zy_;Xue2e=n~A^`1lXoex?Q_@FBXdm|Wl<=eV&SMn6ky zR%2sui#Zjc61_#FdLLPZu($_R&Rg#UHnZfuYhUBDwr6Bxr>eyDnY#Ba?Lnm-wTiyT zzmf2Ywb)XUSmjEg9eGlysB{-ls0?E5tt5~(VK3=JbbK#4HcJSH;~1&t1rJ!QESt^1 z>Pv((lS;>4mKGl*uFf>)C_CbcFc+1B?R+M$hxg8_vYAY1^Uilf>a5inQi{&F)Aqqa-Zdo2i`X?~#|MtHN?aUPk>r4(s=DGMedz75GDNo>`- z)vO>47UVE<4Vf4xn-UHYtd@VbC4(LY2ybmte0&yonvZ`87dd+DFWq4b~WPFRh!5-5;$+ns0Z;@!iNbi-a%E8@UUF?O zwV`@E7A`G;3=~d=Ig|_{G|IZdjHy0lLz-@k__=Jy&YEEkep?_4A0yVxCaUfX{uhwH zN!8QTb|b_7HEGd}Yv`U?N=~-XO>JU#1$VaIWvEH7Fls~@uhDcDDBa6map+llxU=7A zj-SMW7&f`oog9->>6~(64wl@{&r3$va9%I&6C+i`}f~4 zIlI5F{vyQ6&>!Yi<7z}(aqb?ai29yhuLX|7txFXGkwgALa)J7`p zw5`D;{;C=z7w?Yf-YxQ|Jv8Z;OQb1O;5{DwOy=T0KkO>HOO>p&|(Nd9BV1Cr+>1n@UoNYxTJUSR@~<~`_CWxEjjF5$T+tHx@&PtsE8Wp=31aw$bZ@J4LW?L6cCR6i zKI^@@jf)p}N4(6=Qgs)2fal5oLRsAFkZaqGpHb)d2I}nS2y~Waz@v>l&{>#@Txqty z&Pg9i=NypV(4w7@0p6X_(^h}M#7kzcMx>BRx>h5o;NDj%Z!7~NW$3XmnZXJ}&EM0_ zW{1GpT#7g55vtps1~OJGWS<<*)I%n6c8VQ29?dhav(lP(b!AUpO%E>i=5(@MRGp{K z67yDa{)JqUOB{_RJs7f4pwt(HxnWsBHy^d; z?&(n#c8g-weQa7jhg$I~+rx{j0;f zORL*t+u0DtQFEK*$^5amyVTjJ2S&ma%XQXJ_m{5lWvu+R6sd z*zUquXJ)jo6z)r21ic(RU;J+FvrCZPOdD8*OflE%fK;&l047DBW?#Mpr#6UQK8}ZvrwHS1^BI|GiK(S{e~LE|bs-&1Or38&q9TlKq~w*frPfz5$2`+690H#&;e?QH z1z%ECmV6q<(|npMtm2;&f34+zLHvs?zlfa7dz8Ox=>Un_ntaoHSfZ)mtOtnVw^r!! z=p1Zj%x67b5M&vYtk=2M5HLOtD%OFhV;O;8He!*+llbQ)|sH5CU08!@eb{HUXnta&&Uiyox!{uAjD1AJwAO{+tM% zjh}_K=pt-hXu7u%Wsg+|tK^@i$6DLX_UR-lqBYVj_PTqUotuQma*Fx4e+YCG0olLV z@xceAi#2fxbXO#VAq$uXP$1vBO*K>EgHvHN46j$?%npWvMwL2A`w5GlHr`h{cP)=9kgum3kN_c`WG7TBJanssG z`+}bDkm5k|i%lgDo5m459n^rucqD^wa^1m0X>IrMCr#J)qCsg}rxY%lv<;E_V7e}y zLM7hD$i2D|YqcA8htTpfnVVL_xxKp*lwfW_af=jIU%FDX^hmKvP_AJ} zq2>!c!hfs$v2?d5OJx&D=oUECw8^SAtF8381g)tiKrh;A-eZO3OENxhwLYa7^IFR< zeK((x~DXZ};rXB7n10*Yr$(r{`z-J3Ug?ch4ExHqoA; z$Y<3Il_dSGDGKdmO;J0{o}&;gYL1$h00q!F`rkr3t9{#iMwlpxRV!$)C2cWWOF_SN zEh4NQ$zqM3Z&?N{K+e5_Ys~F8&;V9@p$xjQ(~7)Bgy1Y}RAAKc!rnE^3!BLVT)OHL z=tI)YsNu4@~U|h_T&Ee#ma2Bh~6MwtJ27`0;H;SkVm|BcfNr-YEfPy$Piq zdh3m__g(9)g)*9qs?*xGRytkgU1vSDXxZTH@JMc}^WNQB-BFUXJuK;r7du+HXCQ`j zx1`PRervvh8mK_4WBwtdH|KGf#T0KaQT_r6MdX{vEBOP#R#bl);q~Rk&yQG_fCpguG@c^5T=tv&U2DsfN$-WS8_|EL>} z7d%Zgx&XRiJwhzXP)2P*HKB5w+y~_Zj~a6Q5p|4_k7E4w#N#cL;}E=T4`wJ+dD8)Q z@?zPbH=9x|%GkUKYCXdsid%t#LQzvomrge9qs)~yi{X}@TDa4o$y1~6B@T_~(MxQ1 zb}zT<+^rCZWmEW%uT!ho6#gk5r9zk2`YbTeXs%hQmb7JA^8FnbPrKsj2Qe(nxCxKr zCzPEWV1H!aYc;A^PAR1_ewJPb=lq^~YERgYQxyvA&k{>twUY6 zj!^G0W2Tx)WASsr|EN=SUnr{5%)8$d?nyRHftlhLQ+xf*n^f~VG4{tb&gVZsj3-(N zOH^pP^nEBcM5+eqMY~}il_CM*Ze0_`Qf#3HbEp@opm-eMf>hq?(t$b-*{&OCJ9aIt zH69xs;8R&$u#Y%h>^Ws)QVeCyk>P;vK<#4J>en-8uKUH~yHj~@Q6!htg+~uT{$X?% zeeOTRWBe8}NaYmcL*5xzM1S{_C&g0HlM0>)JF!k7I@mid#@-RYREMt< z)`41bw&Ewv!G7)}=qAgaQI8@6=^{DB{Zkc`K5^T7ahEMuH`{IEOKVdbVV9BSVz0%*GD07-mZBRpXnS{V5b~Rj@ z9UVe3hPi>T@NucfQ4Ss^C}*PKrEr8+JKJ9_Qz?tXHfw84%a#3+S2kQ# zbLd8DTQZ;6v`t%yf*vg=Dz!s;_oC|EU&`Y1+)~^#=Eg?)6sALZZt_W~-JQ7FX+F;Y zTdfGasHoGEtqJ7XI_u(Dj?xglys~6zW`YN28lfR8jK)SYrywJ8jnP=(9G@9=bu=QK z&|cm%U_n+YGs(6+DYu$KR<4!L@DEwB-6Z`;L8j<{9%fkNb~oita$`6afKJMfxmjYG zc_npPi@$sSQ|nc1oN~gbP%6CbwC)G%)KnPp+O@!Wmg_G#;lx-)-IvOH5Vdic28vCJ zBCj!2FvVGh-rfAXp3NVqn(vnLE{3{Z){Pr!J-1VgK1u;uS-qE$)`b?CCPYfP$lE>E z=o6uovY@rlQ4_Tq#3~lOV*Z=~PX3;*jitdoOnz60?NC|!_2Dj)QYNDmCe-U62Uc=#39q(F@+7f;d;?U zJ*ge`y<>aYVdqpPhDq1cUDzrYqtD)8=7VY(Uu8qpW3^=fZQ*GBrl~WfXmbetQZUj7 zB>?HaHQ9c{FHd5!{Yn+cmV-Q1pa4n+z!joo{@0AQakS+d^(Q=rYY-gIl3j8~Uz*TY zX{jb%s04(Y^;s=Sf*E&x0;AGg)+Ay{cIS`etBo&x+=%z_+tT*mI>*YhPI#&(tLwm3D$m#II&hh4<0B{J z`zBo-2Dn2R(KAsnR5JA)TJ0#{gpnWX_3%LH#nHivO>+vt+`zu5tv{Y%>30jGpu0EC z4_4AdZdM13>#|XD6OF>?Ind+xhG`*WiYF}Bi#SnjH3u__@Oda2OLH5T+~IM5qo0oG z5V4b6`&&Y^m3=DXecOcM&{o1A$wYuQR$p>Qz?kCZUHXirMSgGF180jl-8v|b4KIrj z5vmkxdum@*>O2RL6tHes&6D!=Sv>RQZCjuPN*89x*?UqxGV|nAu>b%jYMykys52zJ zl;~HdP^(!$;pmjNkO_RmWL|1AE zHjfM0<;pc(bd3gX5G0tz>%l8XsHBY`cKe^jhd~`*jFm9Ovo8RUq6S)9kV^>67~<`C7JkIL%)71^W5j%I2PK0%lsf2u&xn;!pDfls+F z7L+RY)q-N&aQxMRLU9w{OJQLAc-VPFkPF(umEHEIghj(`+x4Ntu++;D${llS5C061 zlzG2e7@e9JdqK$H0CGI!J-p~VZKMM#B>v%TPrMX;OxOd0TH6)TV3K><&3e znOgWBPlIqNHN+{PAXK!wM}10@GW(SJtW)YyX}B&UB&_6*xyMRMURdIQ8iPm ze<)M7o_jWN3G3BOqUYHb7WA_{i5-RyrzFM}^=u9gb#7M8@u}u4h1lD|qzZdKixgC9 zBWvjtq?ESOA&;sRy~QJJ^_l*9tk5^8>p1`JE=!tjm-WSM(zT_`m8}cdSv!0j02o%*t1q)C28m!jueKCEfm&09^Y7=@d27;l`C}b zp@l^u=ZBoKsz!BJqSoY_s*;ITCA*U6Y9oCPk}?X5Mw~S1FgvMk90(O1N7rKEiRrBI zJ#ec4VcAZxTvqd{cPdL z6WU`9+{3D#$gbpQl7+mVeyurHvI;vHsz_{BdJz^c*F%G=$@4%_*!yW!9yI`x9NsTu{a++VfImATL(Cgq zL3ah!G|^r86C%ZctTyCU80zfFA%ZIZhdj@+Rr0$6^@EbgT6S5!SM(xI?Ay!G2$N?b zj-;YPmb2`*wX&82`(M?{`z(0@VJJqXgMTW)kv_U;68xKe138TZ~p9M8qU_>Xq!lg$OWL4U3ur)Xb%b*i<-t8C=jrh zG*&Iz5XkbNG}9mf5411OOper6a#i+YC&~b^*1p=x@DPvoM~vY$*5mUpm)p7@BuBF7 z8kO`7&&Jputeu+9xAxZFkmZSvWJL#;yMr)tl#y-pU1c&k&fL$b|WHc9Dc z^%xI%UommX-B6SM*j^2GeW>UtJ2|b?Zra6@(y2q*JOqiI0~b{pwGTb=F@x;fkZP5O zQ!|nk;$$Xgh~rFNCr(y!syMD>K%73w3F7okUMh||d7(J{l7-^*Po62xfaGv-vXiHX zlatIAXJFDLj)pM`zhWv@YLUiD?cE01(@WUAv{$#mq>uIqCT1K=4heFnVD0K$;2$dD zwTVW*_CpNuG#0J(^M2mLTM0KFd8kFTeM@Q&B_GL<;xpQWQ6Qh0@|oH8jQ#19PiLD* zbtIM-V(FM-^2?`cnk#v~`1?pypX5C8_Z5HNsNl@2B8$gy&(U=T}Pj z0PznCVRiQ`n=Jerl9CSR^(NSr>&iQ@E4dc|=k z$BNT0IYylR$+N{7kQ^yab~0a_oa7*J1||hWM^!g>RBB0in^ahBrGnSf`xyoZDz&-% zD(v6<1_mlUL!!gUj{9fj_f!_{(AM*Q{UkAU;Hiu&%zv2AO z=65l_EBL+2uZiCq{I>Jk$!|BmkNADc?+bp%_+>J6`|-==H;msI{6_QRY(p#qljb8s z!@Y0ol@2lcK-SuPsN0|5jMb2=5V6&MVWS=tav;I>V44kr=aDv`=$ne&=XStlOtFZL zF6z%V*AZ}^nx&Kxbyk+~R%}lO#yd%H(kl*N>8_irU)P&}hj6P8y$Ki!OCT{_9Z>0( z-h^A9wFEZD=Ru>@GEl=QdinMP;8h%V*{UeTm*28{V=QdHA@ zdHfmL*Vu9rRf^wl5f#4hEOq6m3StV%Pj`ahd9jt<6Puu;cw%#cM0D#-Oh~I#=%`e* zEON?fitTAfCC_@-q-c+*Q%nPzTCIz$wn|05SOJ*%cd78CdKFsjPEc0>N*qNIX|jx) zrA|TP&EuOTr(n3hl1xd3&=C<=xZUCwL!jXlir?cm{$Xy#>MNDWEds3;OTyTWvlR#!yEwvmz>j=XcDoivEdcHp>}lGdY_3Djk$O^Mb!w&{ACOE-jSiT$S=S zr2IxOaF;@wtd2D;++h>QMQ)?h0h(#SjEnrh4A8QT5AA}Rc{XrXMuvtbFHk40u5M@B zF_F_y22LxiTwqRTNR#I%QFbbVE=yOG%e-7hyCd13b;s%RYpO1%5iOKsnOihlf(Yc% zY+;eI1`O6fVs>s?)Y^S_ze`PcJ_lM(w(24htS>P+;(d+sY6}_!Fa(s-d>pT(GY0i5UXoyx+$*wkOlwQXJ%<^RAFf;tuF3k1J3MeaRs%6P#$^m&T9BdYKC#WSs za+bOYq#G+l$qZUDI;{6==4QtbXn>tbui+aafD>S_s5Ucuiv6oHpd1A1g=#XTKsZd8 z9CO19=~g72iSpyXs$9VenA=KA0;>w4G<)it0KXA?_sOU~hUq2ItZ*^$Zr#BdpIU(9&6(lhtb3z0-hl}EiWVI)z4>O+w z3W5geX*j5ccAEbMwJViNy{D-BC>I6O^(HSd7h9F)f356S7#_z->hv4CX|Ad^F`YXy zTg;27mNjyiwhv=HHuD2Ub;jRb~^WGo`(i6U2>&xM#|1HpW{>6#-JuO zG@g(l*L&|TWircZW2JHQ;Dv3ddi8RhA4AV&+#|$2r7UqvX2QRQd+UKjh->R>0@`FQ z#GRU$0={k3CcjbC7#$Gg0MbXDB-Yus)_U-oyWdq1_C{oK$u6|%2jrwuYxdEiMAk_E zDm3yOKS6k3w03(ZxEoVtWzLSN#^Z;J{|vA1c4j-M?A-fYiKQuK-fbD)-AirN7f?qR zk4AWm@)}pu)LFHMOUYT+u=qWF!oMiIYCBt;->7Zg_Cv%<8`648(NoQXe@@S7b7}$z z!^BZbIc> zGMCIodckS)eH=@jKlWw{$wehK^iplw#911??&*e1>YDw z%`3VpGM_XQ-;EKHCq)I%_O$YsnDcuu%r+(fZwMVGGmKYWOGExY+&+i~hsope@!*>9 zEbtFoOK_PU4?c^%wld?hP~%td!tZTHW$~8&)YEz;SA!d-7`1J==VUsj7=ca*kKq0w z+&d?R0cZa*l@|ku@!(5hS8)2X{?hLiMzcdqjYobZGS%snJ0;%;Wyi~2feMd1|8TtQfblLm{lQ1$OCGcC|8YI}{eG#GZLp(G=o&HTcNo(kUtK}( zraB*aQ<~%}9TypxS}T_QFdWZa@drMYTW8;Il{7|eQqoN1EZupAj8cVXHH5uuwMQ32$AM0!B!<{^Jg(|ko>?Erf%o4C10m$y^1uPG z#!_?x%TggH3JUL-PoFP*km=9T=+QJ9JT=vLL{*LTn~C)g9JxZ}d_1uB;|-~XfYFNTY?!IQ*q4!FI!`i}J!U2c&>)0{T5SbQGlI`!hjUho?)<#% z82y9Ge6{xapYm0wxce41g1-zGZNM5YCR?>fh0vtF=OMRu8_lsJ>8jd$RP{Vnp-Vwk z)m>G6NxqQt%b@X5*toa34U|qCe;&T z8SSCSzR3_*#|MUtiO|FD%8BE~hn8FvPAtp_d!xV9V)Lni$7Jl}aMh&&BTeR;bTumV z8y(5h$_(yDz9X;BNPKF)9gmIzd=m&~Y}Ux1VxHJ3L{tYk6x7uE2^yQ&M;^m+RoP3X z7a37Nk+HR>Nlw||0rHcgtDKmwg^k&4Hk(p;Z|bt=Yqg(IlJQQ_^fk`w-B_{-jEg?0 zJ-CO!>Lri%k6xjy{#M3=k9HT7@O?o^kE&AY>{5i>iY<9ELwoRd_)zC33rT-xHS6BB5A4pkJ}Wt0 zW}xhcVWX^>9BP^}*Oq5pY-eD?k%4*eKx-glQdV-*WCrMpt`$+uXl3z|Rh%eyD(|Mr ztYHLTP%UM{glF`N^JE%7RUoRtaPkD7q^VTv>Blrb@1BBukx{Rj261K9pF?WseDwc@ z+SsPHz(-7Y7N;SMP_6YFZ5A%f$sU7FB8WQVG{Hx@k<~aAlpQuA+X@9y^o>u(#O3;` zd2-6~2@ADgc^^i7eE(>_)MWPtCpRLS)WfEFqPE~l>OdiB!Mm0Qy~3?UJYdF=R%ueA zTn9nHeVeOfj3a}QVHami&ce74=anxP{7hhQJ#k{(tywo7QH>Tj{ODYZl928};z38; z%>itmEyT8YXuV)idv+QI!}I=EFmRv$zXJm;_8{Qzg2P4HOK>SSWLCyH`$uzQliiuC zbBM2u%L{v%l_F+q!X`p(!4)=8U^(7d;GqCE9E>X|sOZ~|$#&y&?y~ex*%yN+1x>wx zrj)p^f#&|g{|+?0=f@2~5v`g}gUmZer{QxHQJgIisvt(q5%eq92C;Le_RAdeJPST$ z&h|2+Q(iUdnkIKz)5KZk-N2Tj#kMFAVXQ6WJzh0NdkKDJGax$BKbrlr1s;^y8UPO) zIJdYGj}&zFp&{PJ1*p&5X}|J5O}xBb38bd!MU8@2rjuDxJNn{6stG$iV6-U1Zz!LA z_&PL#$&?C->BC4#8q|-g3}Sr}CTsv+y%W1cn*!*-jLb28gGUZzx4tQD^~yvtarHbpC@7F~3l1J;y_hDQ?x}0bg9vw}%Os*FY+iAr{^F-R&JV`Z|yW$zKSz|GE2HhAG+3XDkbI8ph)B(1~ z_pFp-Y-l?hkU}T*u%nuOGa;knMp0yK-zTrImJ&G^(r|iLX6z3&{s;PIHjhG`Pe-%&Ok5sl z8&@A(b-ZPK#-e_-@9;J>HhxGC+e$rRblq=k#g0~{`6Bx;6r1$dAF?iM&6PR;0xGxK+^Bj;NN-Fixxe2R)!I zd)c&Frx@Y3!c^XdiPq-#H=?xH%T~!Hy%>JE)7TGzwN}TWz;Sh=0G<6M4Pg>cM{otrTJi1OT!VwBbnfv>r)2fyuDTeq{8zcd{ z8*8=9`=6=-$-lA>`X>b|y-XA2QCZ=U39l?s#*yY-(~TO(L2P0fi`{Kck%a!f zcD78FY=KEz>5}WLK142+_K#5QueOV#2*oIT*SrD^^5iNhzB}xyV}$*-ci7+~gso73 zf^Jw>(h#I2XF{fn?2(qngDu#(_Xz;moAL(WBh*;ZLKA}x2em;#*sOV{(?Do#Bs`{v zgfsDiFwU1p>W7^$uj7-(w*3i`z$n`$>aWLti7fmnzSR(R1k6%j#8rL8@W@D60CwKf z>7J~KHj&*K!G9Dr+b?D>?%ua=5eAdMQr$o=R=dJ#HyKUuFE~uS0!1zs;|jbZZi3+# znXAt_##Vkke%;8HyE@U#0qlTHsN}0S}xP{Kj_$f3}EG??B5k5kGPkq>8-MGA@A$@!0XqfF$ zmM1a^8u}iTpjIo4zA%E>YTVMkQ8)Z7e96;GCuhh9c*&8}mQT*?*jaX3L+J3%P^`g; zfnQMw^*}{RYb(sb(ojSKGK}{FLd3E6z!aoWoD#C#~!s zO07i*b;{RRNg*Cm`9^Ni26d*FxjJE-Fx;b;%DNkFPJnS@3vzyRKktnIz-2UzdtD6E zo={Dv1T5MqL2ci~FFTa@Wgetyv9xU~rRa);SLP9%*1bRLD%zVan&;&y_g`G$R^^JZ z8D-n*I>o$&1~Om#oh;!%0g4>ea!TMZ3VF^^dkEgX*!RSn&C{4L%lcCkBx^Dw`u<5p zMj}Q*Mk(4xJ^}Fwdv(nxKbG0Sty_}0*7ak3s++dO`mEPv;-e}ZHl7jYcbV~dARc5Q zy@w5dOhwLiBSgw&3WyMC5{Q8*mh2Zp(D_J*?DMn!tASi~9g+qmnoZ_Nm8P9E$4Rq; zGy&ta7OBI!x{JVRaW0RLwjh6vvq~^> zTbX3;SbDk2d|p>(kIFpUzdXC3EBBQ>aS(eaYC8iaka~TPikGn1xpfWn$fn>XPzsbwUJab4c2wk!ruUlpJW}$H<4Ig>civ zRB9n(qG)yxQNZmHN!Lbp|KV%o9<-lV3Akdo#q1Qw za6Nk5xa7^obSNG!dU0-05>O;I8hGeGync;DzN2B>>sk( zAx;rF)YAaMl0(sIbqP%^U|aaKf>>d4nnNw&lO<50ySDJjI)#7_7K0Be6h4soz;@pA zJ{XH%$aZ6^80a%THh(Vi2zIXMpdQ4OVDjXR41>i`Wp)b(c<*JhD5Hbn|6U6GT7<^> z>5riCwh2D-sQr)g#Jg~CzkRyJOok4JPigU#vsNh(Ou%84 zatsrq!~7A)E2hgxX+)_tA%r?GKeNK2p5aC$U8`i56`Tzn0OKoOj@(FBH+F#{*c$z& zjnNA>Ok|&$s16}|d|JDHrf#MWTIOFP>Kr01vq>k5NXq6GLSJ)gHbg+H+47d+o6E&9 zGnb)|L-m{H>x42}gx{{}2HNv2DzUrn(Ndx8E2_?h9xdS@e2G=Jq7N}WWm9Pr%&6kK zzllMx%Q|G`ylFoFHdO)icg@kzjCBq7xk%4EHFzlrVM%}UV-ywi*etFDkopOZ6p-5% zu*Eu-O%kT(=L09`)W;@d=Ck}ys!;y}PD&esrh3(8Cpfynd<=Xqdhtf57~m^wu%}@4 zl6FT#Gj9DvP6p=X^G~7~KUxKzR5PBz=O05~Ua2kPZc}W6SFX%!b#0*HO094wzg84n z-Wpq}YfI5yIW}VCY87KvYB!A8$4*wMT{vbJu2x%T<=J*f`{+=mcGIWCtk)j8P=)Tw z>r1|a+RV|9s{9vTG7Ma0X&6w_=I^LQ{YDY+wse9FTalo8||^0J*HH-U2!|?bfn46d-Wx0 zY5BitJ`K#hi^1PD!pc9hiTGB+P}(ZoWS39JW^Cd2A#u{FMt;P1cZw1El`48> z-cOX9`!Pl4eYKL}nNIYn>TMLQj*dBvPBLr0Z2O!OVdaYG8MGp2A;|)U>v`hL;ViAB z-UB{4i>=rvB=$cn&g6OB@YB7n5Yas1;dK>@XNx|-brT+$N)44OdbCj+35!cFX;{Cf zYTMX#dyXu{cWi{0wCj(4bZGsNU1L)Jh5yKfV-DkLwSH#v`t1ikC4{-XkF`RYydp_| zZ06{{i+kk4OT6?}tNp$en=?X%?iw*#+&xu?GS=_;$405EW&L}*M$aQHc}AZjc^>?$ zJ-gSpCG(<^{_|wcy|_%`kDB>BH1myhjaAHU0{%;K9-7g({#fpa)spsD?wA_fb$dVm z{fHmio-r5V0i3NWbb(4XgOBa2Th{H}vw9N+UY{&~ zo2b>Ur&ZeWwd;>`jq?if<~^svXS!YxH(9=I{juBLAbj)-s>a+gEmqB+uRm12kvg}p z+uQd0(J=zWGv=ofo1C$I{jM2%ad#;HTQfdhzpMP;>vzrk2q2I6kt$(k6Jf2S%jtNL zJiBI$J}&OQ87}p`Z^noZ<@;FqI(~qrys1Y^1*)2A;LN&ym8l z>$e{r^L>dp%4GC`an<~YUO-QBKKi?wk0WV@xg1tRk8-W$+qHfr^-e4GmlS5s?426@ zaM$mNj+}#Mg?MCszJy1iI_7+n`@cA`YbjZ-g%Cl$qwAYF-C2&=P_@v zNoa{zyA4`TMBPI1t=YCkEBa}Yg%f#G5wN0!DmOas;3!fD-(YRn*juIrIp**1W7%5Q zf=2_!SA=x(P+-|<9pO=*mvOMj)|(puORBAm$z2&7cXOZU9K>fDhbVM;7Y~y=5YAwH zARm6rA9DY{O)j_imp2x)j>j6G|Aoxt8S>RWzE!@QSl#EVb9}p2cYwzEU&!Jh+OQfH zwxg)Uc>Arr{^dK1-u92$o;)|Wd}5a080=qub019iA0MBoJ^U)ke3yTqJqYj|{>yi2 zu|MF^RwhH<0~ntz(&$nnoQ}8k# z+7evkz3oRqY4zfw-DvrqJP%KtP=>bA;%k2JcHT+rNq!NOIi zB)>X6p3w5ERa5Rn92AD8g*J%0enUyvX3&kdQ+e}LZ9>(STbd8k#|pW0I?Ihtjdgd{*2l;x7-Y$Cu1RExLPjH;ZsDNxGm|oBb|wefiw$DfVd-6b zhVIBo^)AZ8vl{7-Uxq1Po-fW;gQWZkID=?U+P9QAk~*_lmglMi#*Z~@^DpGG?s=iV@+&FA+Z1`7;+_z{oO0H&R+u(_NacO+ zTmdw3uc1U@oogPY4pEZneXiMnO+~S{j2z(|NbiT@ssoCT4E+tR>oU+me`2A0#b>4O zes>&w(769}euWSFhsZn^i%ZkkB5Mnz$;Nwlt((CwH*m~}>l^?qD<|;Beb9u1bdx{j zyc_4+W_rK{0&kD`(A{$O#}@IM<}1kSC?&wDi}wqA+MGzkR7r7S`$if^IvU-PA->v< z`!oe4b1DVK_8m^%q)Zq2YLB48slEJBzpDObv5GpD9PjIB&cMC|!TqZ=iy1vc#T`$2 zh|9#5191bYPT?ar(qCOQFb~qG*uJk+&=85wuF6^Mp~vP<6>~rV4UyR{Il>g9>_OwP zaH7sx>Sezh^~9WwsO+?oNjrBwaB=PFp!;%FE_eW2Gsfo%WUH%3f{oQnPNsvhjk4Qi zUg|Qhd^TKQFzY}O5Se?JsDwrr0X<)A$+FDoAS1XY*1C`Q=<~4_Ckj9TBY3+d6{a9i z9l7By%@g(tz@KKZuZJ)d&3Bp0DBzEU^~E%xRyavkoyJz&Tjv?mzb(m&RqciRg$Osl zgz!wB&ct)L=n$-AUG>ED^O`GuEhbjIkT%9Wt zMNqNpqrq&p*wPe*ykEz&P<_pH`9_sqfYn` z1HU7GL7(w`f?A-F;-2Ia=W!g^Be8Y4w?GS^=aq21y`HA5K26$1|2!s5caWe|;qurg za~LvHEBxGVY=^e@%N3&Yz)u;`?*!t$o!U(t2?kBu7Bo0!4Dz)!`x?$9f3r_rU{8)= zN5jAs<9<_v0$izIEqwgU71{32lGIcS#|;2>Ef{zsVMbxG`4SM;3O8tla$z&JZjK24BWX@B8?z9#K2a9370uoa)#6;`QT;QDwST7*NyXX0Df z|DdjoY2nX#jS8Q|KC$;4X^8-bZBK+B3QSB;0h8W?mton~7oNs+>k>SJ!6OTwm+V-B zM6e-#Z5HCO-1s!NZ45#P5!^=3eBd`gBCU##W~t;qDdDzp*vbj>zg2 zF~Heihi4K_=~7msnQaGV5NPgZK_O;AaHXn>g|c%y)@F5mxI5OmoOA@9w^?kaecT*CmN%yQ;KjqMQI(6=eYHqnH*+)!@!dG zj3g>A68|4@YCcLK1Zw=qRpS}yIL>Af%|_&FIbzEqK5d$MubnM6QI@L&%x8?1JH_P(& z$D3(+2jInKgQU$iGGeXHNU<#4k@9DtEZ;)CW`KYf1+6>#rp^({b0>Lg6h%0N54ZZQ47n;bF1K!!Wh!%Ve-d?NIHsbZuBCW9kR%i z1I%00hu{Y?6xz1X%^*xtV`psNmF9HuQH*_GU+_Nq9^ly?27(k%)o5o4mKtv!-d?kD zS#>Hks%6x%0b5z`#nltmLti^0qdOXX5s!HU;ZE|*4Xzg?5cFIe+q1^}7lE?TC*AV( zj(qiIzp;Cz?F+nT{*HJWH=qepQd-vb3;{~l*fb;xdkWGSa8h`de>}un*xAT+LzD)5 zLxS2%<%oqE@Fs5aPy*n24H*~iXLwws84D_RO8EYsEdf!~I*D_h%h20cA zWp^EM>x4h;mifBX97|u|ww@(6qSQrg6Syk7S(@Q1z{>n#o@dYKCTeK4;xVr(yP3n+ zxD1}boptSa^mS@3pB5CwiIRrZ16Z<^auE;o=?i8co!_XJ-zTf60ji!VWB(AL<9YXg8XpNwlZzvTeHK)>7#}D zTjqVMYG|duX0M~YEb%i3LLUDHr-Vk)NGC6~yBWY-i(XNh#9!-k$e3}GKC7PInbEta z!P6T2hj#{?4S~8zC-!#Ri2uH~-Q%tFz}_?WpOH#+OvT(z;zF|zZ0b#$w3VF98w0$(f#AyDxR(hyHn- z3(TFG_HZ_YM^FCfWaE(s9eXi`>3qYV+S9ZmY-D1rBA~rAB^zGEbpyk3sCGA&GxY30 z{j`Bi#1lt?l~ei?S4m``Uhm(;MGBPcnpPP7$vZJi;`_uUpD&B}K9Vn8ZjT}*8%ZaM zf?lBBm)Twa$|>1aI&x>HYqcv>pDU+e*ve6_yX~T_)J=B%cGc>0<-{yidKSRwuhU4e zgy1Gh+6z=Xi-vKRw*R4t+PoVw+j;c2AKqm*WVAP3oyg_^lsCfKRU1RzjoO1^uPHX6 zo+GSNdvGt<0Rg;h!3&3q$C2+?l+)o#K*nckbyZN}>yOXNT=%P`^X|!Pl>~rZd#H)^ z7dAGAVtYnnhQSjm+88R@Ugm7Zd+6jo$aC_DP=~>5slh3g5Cv`q@6h zz-@Mz?IX~wcm!!*-nCL zW{ma_M7KS$H70g$&xtJw7JgUpf7MFU=3SSI=VlLozEzC4jC=CSt_7nmo8jTl9mRxC z@$u)nX_Bl$lFcU~-o3x@N~ttjT1bJ>c2a5)r$**M8Qr^FclxjG zPh!sl5q`^|Kd>)a`;)=LCwcqcM)zjrj?gO^_P?<9{QH$5ZElmbamA!l*yC}w$d>g& z*OnEI&p`WU#u2uf8D9nJXQX)XZN@=9j!MXJTO8O0e-H_lZ{X6-H*Nt7XOnR(8MTME(COam5zL*z&kyoi<_CE#^H=bvMuuG6r){^v zc3W|6WZoN#SFJn=25;|L9fD44(|8-7jeYRhI0v7NX_f^Piop@wf}@a1pa&A}NpFB| zY5#s{|9)xzerf-HyZ!s^_V2H;+P}Z%f7bpX2ocMi)(*5}f4cqRv)V5{tNr4$+P`GK zYQH$NU!0!p??Q^{^~=!wV4sB#fBTsl)AL})SfhDzyf;-1U^+i&3j-v}{DSQKg6#ao z@<$MxUl5yL5Su@Z*iOJ`YfpmFO1t{3CZj@S48jWQ>uJjotR*93ISO3``Y8m(>{SS= zH--7l>sL=K7h0e#vj4cKyKLfH#;EPi?(YhTzoGlvC*OhYZ;yPB<=Z!%(=p6|k97mq z!FI!K?zmng3Q+N=EEB6@N;cM%y5QcZ%jXh){d7x$LTtQ@gLj#3zCTn>5s7MA0z+ZG zZoKwm@fx?g%{3AgFRy^v05<}j!;Dh%k5hSjButb5Od6!wU$Urh@@m@4H>(OebsS#oye{VJB&) z({87EG>;Qi0{J||_~QSgR&TnLR{x!1{@1M*mW6;mUWN)~Y=deTzP*^w~hZtk{xg@sFlH+3c)0dK(`>lQq#-sYs507ep zzUV8Nx16G`Fc0_})AmjCy}{ID-bBNgf(;ZVT{9=E?=l}Bg}u5#`+%*QtFW^?0i$lG zRAv zA~UY%Fi88&KTCFk?S*O$fO$QcVvCC%OWmf9H>Il+d3uZ(>W|Hcow2xA=#XHr|+Kkwxv-ve<3bta{XS=&2CP1Fp-9WN^=X{b3O(-l5WJm|5eRj-CK56jcV z+~2zx41}a(?&uYx9_O}d)_X@FJrZ6XjlHmU1gA$kVrZ|3>Lv4e5yvuA{GWSH0$5q` z*b=r1?T_D%dSG@tHGTR2|NVa$ z0t>}x690bP*K+%3TJGt#JJxom*lxM)&b8fY+x?O4{=s(F+3rr;{laz!JFW81w%yBZ z_eR^DZ@UlK?o+nA(sno5ZmaDcwB5(;_7BOj$}hCt%WYS;-E!NVW4nuOcZKafXS)ry zYufG?wwr0gE7x|1+is!lUT(W#+ns5;@{=s%v+U{E0eaCh`vfWPG&Fo|K zZ=mfCx7}jfy~=hgZ1;P%`?&4?)^`79yX$Oso9%vRyPw!@hwZv;_~zU0dA570?FMYO z+;->MZnf>Emr#3#)&BJNa~C=k!IpM&M`ft*;uG9-`uTQv`um2_R{r#N+U2USDkosa zzi`0%p0nO^TRyPd;^9_(>3nH7cZC(dbBGmherSEC)J%$sW$yz^ftPv7|s<$UXoJ3V(SSa8REp1HFZdG47#_uG*Nol5!~61#iXmke*s_99QP1% z2j8<*++2K7Rf>mHl3vov-?{va*tJ)Y<6f1cl2Y%XW~;4IPIsz%PUy=8wErr?zN6~A zQ>C28U#VMaN|(M!wf=5Z=eG$zS-+%*Cxe32A^&F4zB}om^j3OyAt4@QjOp-i(T<3c zIa=xeANJk@E~;bgAD>;?Qq%=e0X4223%V*%ESv*k!4?rvG3M%0RzWG7Wl=Cj(HKLb zQ8Xqoofr$L64Qt=2}v{|openl#u!rXf(`rsd1jv3J-d>d`+x6yfA9PI{O;)RJ>Pkr znR%w3IWuQ>+p*pUp5WoZt z5a1ucbX*)D063@q0URJ6#K-6m9|1Ta2QC-kIt1i|2~LBV&7yCw)Qyl8bPim(=i zamVNJbb8V!)Vt&&TqijpW+>|)QBXeqfKu<^?SpEf{r!<61w?@VH2yKZ2fyIU#^6f1W-LcubEFf$QVIhj0YW2?1n$A%_9a<%9qv7vV7e1t;|L*OVX22bA*X zh?Mf@9H#-1zd)cee<6nfFY*@%l;ncL_!peeSCc<49}IXAUm#G5FF1^U!3llb@p(KL z|3Xd(>qd$%!gZ1p`nT2oqW*pTu>BymEI)D_|5SdCKq-A_X_Ny{`8fh5xd?~$7o5=7 zPud49&Exw}e1Q;3@dbzW7o5q$(?2>vjKX{J%=yJ3pB(=B?N1 zTKkxI>$bzc#+F zpJ)1>Trki0T7A6_GOgT`Bh!vycl!qgYug_g>bl3j;4-dv`%8V%{>Wte30owW%w0dC z{oV1gg|+cLxn$b-T75D8we2IMQeQA_{fHLV=8t1k+AGTM=2(7YGCeu|r9PJ5Q|`$H z^UmL$K3d}$-;)dG8DFc9j!Oh zbHP0A$2OJei{9YY$NJaC7tAxhR*voOS$wAuW!QHyDe~1>B`feuWvMvOd z%rk$%Fh9}$s4L@(5ihx9+W6vH=*#=RTQ0677bvX|>lZ8&#+LaD=FVTsrLIg*j(=$% zmLFrf<(^zH@BA@_$Pdf!8Q+r&<{4kBFYf?!7F5+s- zCt6&}CDWE4QYFnTOae+a%A4|wQ{`wd&)g|NIUHa*S5cCZ@1L5 z{eyx9mubuP6#XBWj4y0=%RRYZ+VY7OcgGha+#TPO3+5Rgb)~)-|5`ap+#H!KgXrI) z#M=CEjLP&x`@1>D)ut!MztqR}_mq2bWLM_zP9LrDjPJ>jdB@l4=()Wu>9KeRh}S^|gTFVI;V3is`}_Wt+*@D9!?^ywzWRSP{$HiR?(je#Aw=~-@SpQA7+yHOIY8awc_4BQ$dLjfV7){A2{{6CLIfcf z;r}@g`_Fk8?+^bu598-IP#3WB;o}F6w)lC}f6l}B{PCajFzgrqIS&)-Jh=bxaq{mv z4>NV^7SSytA{>20c(_p_UWXfvA>LeuqYT#)e^4}wSb)O#QH+64+P5R1erd@7y1I_bAVee`-dl* zA|i|tMxy~e+6HgMdpN^!@!ph$-XARQs^{+!nz{+ReChH<@D~WrM}|cPgZCw5@Fh>> zaEf?^gYWa;4nL1^h4BAi!2eeJYLdkJkmXeW-tS3f!TXKg??_^`H57~XlD({vIKK3c zuE|T@N<2`AnZY6A2N93(;?cxINFGOA#-BjkpX4cCa*G$YdGT`M(%uT<(w^liox))FJ;^|&I!;4=>T-KMxi|2Uh=X&vcFK#0)$4j{vuOu$}=XT<< zzf=WItwZy?^D(rY9x z?O~h;)6(DPh6(oMBGGjW0}aW7x6ga(Zq9!!#84bx1BhC z6&$)+;&OhjCmt%qtdY2!KfUKmr=dQDm1PkZ!&t3l~~5v+_jBknZxlMUI8TT=ob)+>4KJahtZ7f9O;J91Ive zfU#A83&5`g-wz_Kgo}Y79|S%I{7~?H!7C7H93;>Wu2+Iz0N%1}ks~uJ-`XGIqO&Z^ z^5R&-{h7s4X0sM8l4{I?ulDDgiXHHNf3|6HNv1uA%Pisp9&Wv5*#1x}5MF`}MiPr? zK2crxi4ZRhOOAC>W=X!olwDLPqnfhwi;7F^+*S+rjZFKW$EWnQ(eoUl&d~&S{;t%u zVwYT)|7WRSI(c?S3DiVRUa>7dGuv8VEp(U)GHtS))?CwHm?G-kt>>-@liMVVTmBDC zvSb(8%Kogit`{lW^q@N7%AFDMf<$v^Z(|dVJXNg%v@~E`KwCx)@!p;F+X>`UQu)I z+V{|t_3u^BT5ZtJDJ#q@fT59BnCHlYnPY|3Zdz1iH_3h><(Up^X`VyV{k2+Pv(59JLOW+P-nvNe)a!pIjl37?(SXNL}Qfz|uvliQ6NMpnry01A2%{Peq zawdFUEe~ew0{GNc3|r1WqZI?6s>08kSs`Q*gk-^$oy+stFbET#7au-#^^fBh!>887 zr{7}WQ(_o%IC!&&41bsMv-&DZe-oKb9r+5Gj0;-D>5*#3x%F zb29TwM3_b|O&gBu0Mwu2>gGvy=BOT zZwGEb0l7_He6tsaFXQmg$8Uet#^372@e5bWK23d8Fmo{0odM_doXwdo;m0zKLKsE7Sd_BJbgzAp#*0WO)6itH0% zUP-YRWm}8k(l(2$u8(|gU6NEK{&l1)W9w4kEJV;ni_#R;c;irU$2^$HU z2u~7TAe8C*t`+4DAq*!p5t<3(2$KoZ2{Q;Sgf_woLhM`UwiB-+tR}1>tR<`?tS4+B zY$S9NvYUk65rk&K1i}nL3t=vyjj)ukoUnqhl5jg=6=5}D4Ph-|Jz*oElTfD5)(Ja} zgeF2WVKQL`p^b1I;YPykgf)bR37v##C53DTd}=!#=Iy!gtdgEv!Y0}CSX!oofh;Gp z48GpANFcTc=oMoi=oX4A42AIA5<3^bHN@xfFdWh;u@jq`S;!_?v)GJGJ4>|L0n6A_ z$bV`{K1(cF%+jnjHWMD8t|?l^CRoKS2jal9LK()h^9x85;%DaqLK=BEcR?EbrUU7K zwGdvixTKgC5Rj(BT99Ss4^AM1^ox)|9@=2c&&3mGFqQ%y-HaJSb8?23@pO^rfE#R@ z0nUUMW#BNFB`1$5C>Vn?r*LWfQ|J&M?(BsSlnxw?oC|;Pi4Z@BUII7??)3QRnZ`d) zjfkIK&jBXV74h9%q*LtD5b5Fl+#LqVQTn)waL2`Pk)JzE;Z!OoBDO^$;9|fuh-U+w$?((k@SD$256b{2KsdInNWX-qis^`a z><}CC5oL#9$`?P)FPz99KLIbC$e%Yq4-j^^;|qIApdLhr5Oz7hiUL|^iFAaWMXoSm zueX-8-!nWBtVEYWh}SdV-%zO29Qa$NDG!F=zroDJbx_ab3PDYwoy?Ni7_hMb{uaYO z>8#KyF>E%}uW&d|b_S1YD)hL{K*Tjt1bDpXw*!y+X}Iz-p9dcE#&*T< z0`MmA*oV4-$3BO)mV-xI*AT7+#PFNIV>;`=V|-Z0;aL`Ykod!ZXxC2gn9m;Ys0Y8( z#qIh45anNhNBKOcK-^=AfJ(vosaP-Obh9yD27j7x^ z{}?unm)|W<=jA7r{{Ym0>56~Ru-+8^u9RIFk__dWCMbI-p}`{MqW4!r!zt97rv{>H&WZ@yLk z_B-#s_x=YTHhlE)C!c=y`4@+eeEHSa-+cRBD#Y=^nihb2FDB; zY92OxMC{cgN5zdEGZywJ)P&3|*sxx-I5%&}()@zLBHQ)$Vn@lc<)vjS=3n=>1q&^I zF27;rjjLAwPnZ9HI{$yU{u9S1O_(@oa`Kd^)27e3W@gH))UAj43*NXc8bNT;@ z`Y(YU8m+6mUEFsX2o0MAPav!$bjt9}LN526%8AzzvPz0iSV`!V;ah~fl2GnjRTHlx zY#@x-D)gnzp8H5w?r-5L6IWjjSoPvJAjw@SxySWa@o|3)zi~;%!`-b|$o#(&Z}>kE zFCXsP*^qiZQyK?xea^mV7Eym{oT=V7v z$M2`g0VY!vyMiLgze*3&z$cVKSk-IeON;(Gei`J9@$s9kWD3}7qSpQ@zUV=AutLT~ z>t*hL-R`Bl7DS)J6hzMM6xz-o^OL(|F<`p`o=fmsw(O9%uqX#gv%C$P+D;GSW)7RLlWEqb<;yR6t^_DHQ{*7X}t!H0@917Crz0Es;ndUM4K(8C_gW|40g$B zlQrFHFUTw8-*+~{>c}n1L0ujG0cU(z%&YiJf-ZtM=8w)q93E4+izbfGd+6eb%l9Y} zh+{d>B@@SIJ#;C=@mUI82624WLT4e4&qnBSiQ}^oIva6(rb1UryuF~ToVa{Xq=Gos zCAv!D_>72dJMl0?GWv0BDsNhPvS=6y@)q#6#Bi1N07V^aTD>r z#G{GhI{@g+#QO`%;)vrjF}eie_>7A#nfM?FxCN_-A+_K0X--2XslAbzc&%t&0!k}&>>uO_*PxQ-@( zXySU}am0OyClkkygrSrB7JkGtNbXNOmv{j2QsM^U6~qIH%l+hF;@e3cLcE%IJL0v( z+Y_%R-hudG;zr_4#6yY8{g^P~azCac@mA6gCvMm&>bn#12;!ZIM-z`A9!ETqcrx)Q z;u*xd63->xjd&^X?!+sIUqyU7@gBshiJOSm67Na8o_H_fhl%$l-bB0)@mAt}i5qr_ z^7kViLA*clXyOBi#}OY$Jel|);u*vT6VD|cL%f{$P~w%uhZCs-R zKztPOM&fbAoy12IXS+pt#}GFXA4}XsTp?~Ijz7tTE`fLg@f6~T#4W^=h}(!yAYMUy zBJu6SClRkEKACte@hQaXiBBbdnD{i}O~j`YZzX;Wal;-_{+Yxhh^G*bCZ0+>j`$qn z$;9Up&mev+@m%6o;-$ow60abhPkcM^HN>ll>u3Q|OWc>Z+-D6SUQhBs;)jU`5pNmUsnmh4^;jNyMv(FC|__ zTt^Ek_+i%sTnqXVZzLW-+(|r;ID1s+2N5?C4f(6`C>#LH!T;*~N!@hTZV zTEwrB@rl>T_{1Be{$QcsDD{aur9N@?geb4hEcA`U1Bsi62N5?*{aB%&AoYo-NPXfK zsUIiwZBkCWT*}7@d8L#SuafcvA+M2g;&qZw5b_4elLc>-e7fLH$x{SpPm1#Ut`yuz zJc_u9xHzSS@6+a|u=qXRnLL6#k4mPK!)$myMu+=x0>w%bpRUp2Iio783YG`=uG09qEOP80F>E}O&p+5tV&J>-(@+Qw z`v;z1%I6X6Coyn(FQ0#K9|rkEp$-gpWhT4MH?hCOz^T4`p2B{EJeBmZ|HOclx;xZg z3Gie%*%l7_6UwDM*sqYMlN|d~44kgY_=Qj+I@GwT*IFAJ{)*z*-vKkUOTA?n)2)E7~X1!+wk9 zqv-*x!Te@x+6(JzJU=JLB4WSB{AB&&o-wwc%pd!C3|J?hH?hAXm-UDJ9`lps!~P!w z+VXi8#{rga2Gu8y2jthn-{}z7;hGJcf>6G$%aq|_t-rXF> zmsTIg8TKn#F0qR|$<=N+?ywxv?gC!U8Lo2TKBKl@h<(!;u6o3Ais$mOpW}E%F2@Cq zTjVl-9KYBu-t~avS=)cIc)8tn;W*dYiQ`?%aol@yF+OCua30Xg3wZmx)5rNiE5~1$ z&~ltFuw7(&*}R;Sp+^aa^N6+`#eCvULCh=IS3QgQXbPJpvWMP}OO z^*?dnPIiqaQBR33yG1=Ey5=oWPww$3>M6-J{)%}&5#`j{A?$aTQ`(h6H7x9!?ix43 zt~8gO!mjBWJFvgG^A&bYcG)fMlJldOZ^vuwEPyqHd*q7zC%F2L$bW`w9+3IF=R?fj z-QPt1Nv`=$*BnP z{jBYLaKy?UD)LEp^&gRsdpwDJCb-J4P1mzs3;0anY5z2Sz zdxo%Uo=Yy`C%NVkS>rc+NBEPAwa*F)YUHwStC%W2I z=ug+!gSlVpde2Je%h4vs+cb?F^;0zS5SBg(`h;*I{X|XqQ9j!>E`)r%SNs$&`7Bre z5cbGf6YB%hOLN_~1y9!W1C(E*x$h%Sah2b_&KGxj>=#-m_l@PeZ`&cBD+ZI2?Ipp* zYTJDdCDSM;`C$sEB>pAwD&kKQuOVJVypH&0;tj+gnf?^Hxhr5 zxQX~d;%4Gs6Hg#6&k0h9zejQl@mGo4h}RR(p!ym>yqx6s5#LUHDe(x>?@7Fd4$@o19E zc{-Wo@?0^Fw@j8;{690s_g~}I5yp-f05w9Tr4e{;7zaU;s{2k)8#GfNxPy99FhlzhmyovZu z;;qD=ByM(kBZ%KYJeqhT@i^iy5l<%m0r3pt-xJRz{uS|3;@=XlAby1ScH(am zkEZe1n|L+Jt;8)Pm*=9jB+n;#0?GRkuP1pf@my-3AmWEfKAm_u#UDbviR8t^Z4^J4 zcq_@b5jWI{`rSnwe)^s76F)^fnz+2b#}R*?9Sya(~aB+n#XLFu4kT|S`JKcKuZi}UMSMHy8;M7dTt0V~l07jb zk0!aiYi}p{Fp|fSyp*^+haN*bndEDUS3NB32_UoYYrB+nt9OZ*k$rNrMLUO~Ku_;%v8#H)$FOT3o&Tg02lz9{1L zB)^Wh+}Hns_+gU2PTWcSW#Wc|qP}*^_{8s#`jlT+;&CLumv}PqzY(vd`WZnygXAlS z%lA|gi06|0HsTEwKaO}Q$;*i!Ci!UM6(nCnyp`LH)Et#mpic^;kaNWO$lRU}_ZrzeuPs`n(vlRPj z_*W~(x8Oawybp@=CVVeh%*5h6Xt8VeLG0V$Z!-%gc$Ujv!R2YC+!xArwX=}p`^?(- zc`o~ee2J@_1uyhU-{$IVh&%V6)9`nV5+Z(D15Hnf>1 z_m+Fc$G6J0`r@;)7$Wj>x3}PnUF|1$uB+b&UI6cYYtt)qwV#m7(?^-UO;ev(9`RXU zcm6h4zZLOucU+r(iI;qtCOzD5w`w?^e_$%YiSsD@{cXwdTt}WdlsGIR2IC<34P@t3L{P0m~-2I1h2#C(di!<5HYox<7|3&Y`q&OdrRs zaAJR3o@(QHF_vF^1{^iSc^m#JxNzb;P@ZOs^L3mTWPOSA4)=H!9RCU@K99NtT2MG~ zj<(oUU*g8$Hn=gJXOc@bv%ERr|o!tj_v6l zkK&wAo~ol9&!1#&$Z;OTzru<0Ev;OPH@6&lfvf+Cb3ptnoH!qrZy$*F5w!hBoEOQr z6i|-&YxOaG_k1AE^W64`^Je*01HRvY{XNT7UxLfG9T?p2#EFocF(j8GUUE4i#d)=S zO9J1Q!2W}Og%js}ZhORej(hwF?kD1=f3!<6=@IJfEwb?EzWD*^({WJrR8}3FW*wZ_c^fi?*1d*2as>Cpd9;) zyFJDEKYkm6aN>Odo9q59dXM<4tsiZ;w!Gqee;HUIoH&Pf+at~ma6S<;jGK!QB)N<) zc&^JH!SNG1!U&X3Od&d#L|lk3)9&CI>h$97LoUvf zYu#MO5&m2ZkXKr)@ziI3c=2X0ZgfSaFEd{)1CFPo1<$$kKYepQ*mtXoKQya3p!bw4 z7k6I%TYYT#I2XrsFin{rR+k>U>;_42vWRD{v*AQh?op9$<%2KJ$8>C;?p=y#x${K_ zV%4&3H*lO0y9P1EaNjz_y6Z39f>>U;U<0Ca$xE9Mt8NO~g4p=nb6XKpW-i=@$kGDt zLTq^B$-5DqJ5%pLG@U(lFQV;@yYEM=@{fBEvF6a{4{@&BUxjG;{+5Rk>-4jCa9rH; z5yZ;S-#M1+YIh=Uj9a@4(fH!D-G~V{h3`SE+x|7jhI5ZpbN<+pM-dwyH9v+3c5r0( z?tdJ42JTXkI><_YX_Y zM>r;wUlO=&-t(yM{M)k}Yrbj!0&*6f$I+sDgQIzOw^|%n|BmKZaK=tl(&C_>N=Eg^@2|c*C*VIht=h#xdcSF$XZ*X4t~fc zjN#>TNh?ym}A4U z=^UL8t>jo&!6B3?f3@9Gi@3#upy6Q`RPiI7F{jJM(4L2&4>IB@^Y*i z%(02(ax9O&P2ixt92+}*D&#-4a#}uDdj;7At>M>qrXadK&Q`sCFU%!PTD|?(H^goVORV^HCVV(JWTvITbWBI=8 zII{0ob4)qAgQM;IA&xaaHF0#l9Q+RESH5ZpN6Ua&9IIX_=4eyy;^?fdO_vV@@$UI{F^z}OxPoMz}p<_p8tiTc~;1K7%%0E7=cq}a!lA`<7jT) zB6$C2IF?WOl%p}@6i1fU`F)IU88b>?`wWik!%~j6mG^M0>b#$0!vkM(bcUYiXfE#h z0mg@M#4+XKe2$iWD>*ifyI)|!0gmOvzvkEwdO?JL+x0_?-*C@Zj#cC5b1Xlyf}?H0 zy&Nk)dXb}Z_z{j(Yg;*{GzK^D{Fim*X!ae%(Rk|^jtPEKIX0Hg^KY!pZH(uo`!K1k!p24xAp+Qu>A{Z$+-9dGAoO1+O` z)vb?mY<%$rfkzKvbS#U;L--hK$JT@O1p#k5@IdyYqwiyn?K;6Ha^*KUW#K>z8X!#s|Op{kYtu zgYlue-n6`b>)H5+hV(EMWnGMa|K%@hH_ZGwzLR%)D6k$haW&VOC#?zzxm1$Wkn>#KEQ^sVKf3QypRKDHT>F1Bk z;mWY8%|_$W?n+|I{^0v>>8uPouzP{da5+AI@tg0*KR-Yj{P@8GgY|=y3D$3JZ0K?} z{=rc`b1ey-6ie3?+cta@qO5v!Wq<3FU6e-`K6GeCMX0j2!QXN)w2RVe7&dN5;811E z_k(^o6y8O-cV_X$JumfBZd%v)+~$)P zsi|jw?$lGM9X4!ULYJY+)p0p}H+ z%9`~{yy$KyX8kK${j(yrUYk4E7uL)@miR?@v+M2{3Fiq?&+(nsoDJW&F_s=>Z`9}1(Rcy9-nl6utFWB+%mAN zopJ66<+LvIsj`p8Do0PhF~|5wh;rU=f0iv8z5r|S$K`SR$0)mR9PsXlk%JZeFMq!$ zZe361xWV+m+wYB4Qa*Wkf**@hzF%VL_xhGW%6EgF@Aut`fyYwKq&i%^`o9e#|T z*+co^&a#qsEN9{;&no|9)uIdWMc*xnJUwERvh*h9gz<%;N=IYP{=$mUO4P=^4Y_IO zGSV@6L16Y6<=e;?=d2$etL#3qPq+1*kxI8a298-9*IzMj z?b5y?bewW2wcz%zXnR?UeY5kNTWl2ZJw;Q17W_C1~`cGHpfB1RlA*EB5G}SQUp{?wx^m#Nm09sO4p2HicHr!FPn(o)mVKCQnm2Ph+%KfiQQfhZ!b20D!vC88+7v8jM$spyU-#e7O@m`YBI5Xkk^tu7c1BXji zOe;=M!a6q|^qtUE*_Qml>()aF%KKLzNeq8$gmTT;rL(v0w8tlXo#+#I&ZL|?@~Vx_0i7tU0<25SeI2_nqSjb={_|o==Bd0m51(22wM1lqGC(wS3hUuM8(o8`s%~0 zMkyb^m|#B8rH|6`_p%%Qz9~WZdG6Pvi{6@{%sm;h=MLZLO33bAAAEk(RAv9%L+xyz zo0XuKo5J$no}hH<{lguRgX5L)YZrFx`BpFGM#q;klzaOtgZ3omJ=A(3ewd+Izh_EM z<*Sl4E2lkqjS}=z_9b)PHOkOGj=bXkeWJ3pTl3mMxiQMhonKWn2aHip+h2=`J)5BX z+5U{Fu?PIStU3cO=vLQVR>RKe9_#k-W!2QWrbp|V%j$DqRXt(MzN}t9e(HnP3BZGT zPdMH8vTEqD()n7zWmUgvV(VK!UsCIS(>)XL-X--{-ToEjPhCQ&qUHtOL2CH1!Ttv`JJ<3;tI?p0sw-npoLwdTcT zmZvVNx2?Xacgxm`YV6?J^yimfRQK6S%AdIIqT2n_MEHMEjhcVqk-_~hs*bwC&Ci8g zRNs7c!gYl$7u4YUd~Tg{_=5V=ySlpyUb&!d`F?@lGdnM+<8M2EZNCi{)NXHG5C1Qy z>!-B)Xj{ew)!F)nZnFyERYOKU*YASbShvO}p#24P!|m(;xarh+^^E_vTL*n}UcEu7 zuwFcPUTxU_TKL%~&a1sIM+~~^&hzSq5nsmV-*{g2`{R`#j#|&FGrKlDyXKnn>IeRZ zrzVd&uO2DSPZ()BukP%1WZ1O8^J?_ohYzf8Ij1hD+_t*ut8;2s+o34ip>yiRUvC-O zeeXH-mFy*!zi&UM&imdx>-gGpYC%-PZe77Sb?R-o0f}?ZsZl!<;r}_cs@tJk1`a-_ z>Zh$Z`$=aAuhPN)bLx>1#ydCtc2GRZCRqT(Q zRWH|VYB%)ev#Px|r1hBXtoqdQAA(=H?yTDQ^XC_8lFzEg2j92)&DgW*fTIml&YRAv zpH=F@X0|)4o{PAD^J`~YRdrPJiqzw+>L(HA+jXC`s$(w0Lh994^|2F6JG}Trt9t*f zy3=*{w5n5U9(Vq@zEyp3Yu$nVj#f2deJ1>GRm1&DUuQF0)o)(ex8m+`t!mZIwYsST zLC#&P>K|b#*ZH@q39EG%{Z5`yyU)CKR^Ov%)RTTUCN69^qps8q+4{^YXVf=-Yc%wF z@{GD+^z%y}yYGxzzq54B^xMv;?cTgM)KGRtefrVZV_z>mqZX9tUVmrK8Ff;Zzd1gd zct*YbQsN>2gIx06;!_c@~muDrjXwBs4owkG(xM*SJJi>0NrrRB8x)~KYVXTCqJ zX4bFixBH{hYM1=iI_JN3T8)o-BxuUhr`1Y(+DGFaKCRX@RE(Lt1?0JFI_IuAtwt@@ zjeO|()9Tq?vzGjpd0KsB>e!oSrk+-FdIry{AAef?w(hptIU`Q130b=3=X#%3w>>p1 z_nGk1s(V=pAu{oztsXujUsGa}QDRtM;-`-e!_>?-=c*mfMw@;~C&P{&v z!2VNe-L<- zeM%Mkp{LYKYhOCvck(Iq*A6F>14o}yr}Bpp7f7VhnPOYJ)+)$cd&{ziHEq&olA)T+<- zo>ZsmmOZ(8$4PZ@!@eIz-+59kPuBJFt2n9N5dPHU?^m2u7g^@Teo$~yz4yaYZ@p_d zslK!9t)oZMPO9gRWLaA$om6N1@wmDFn3L))JwEHZDCVR(Yu&zVlD;oL!dYx|GZ z27rFY8dZ1xgc`7S*Z9qUoKW?T9y>7j=n3`BlE=0j`Rs)H)8jYnyz}i7>g)l%k62zl zp@xrry5rcVPpG}>SH$(%bwbTv9Wl7uJtx#nhDD$Bx*gKq_Kls}T^|jJL=ewnzP$zY4e4=d933cCrx$}>WIia5GzU24ohMrJg zH4d8kL+=yn^S}O_u{`30TKSP#7uoKFYSAAYSg$*w<_>-M<#nf9)M+1Gdia`OThzPD zr`7dsY*DLHVst^D0S;a>y6I;7I+M+%fc5Fc6 zgDvVV-`e^1J6hC^H5Fks6)ozF4<3#?cVmlsb^kTBDa9>nf8FORpUG`eo41zRdM#*C z_buPD>VdQtb!(p~@V`Z!Z|QRP3rdUn-GO^c=ft+C1H-C%=?1o_rRRIDd7(#(dVF?r zd0D3x^+?^~kjcR1Oq=8=^8_+|#T+7}^-Ad$3u( zf5*o1v~A7mSA!~Vs=2LM4U1S48nLEXUH5s{$lI1Tt7XOGZ}l&1R&~QKq}-mWCdg?c)8fsZP+y9tT zy=&6uYSULvb%@cY5<0bc|D9`Kdm%fV-Zp9TKcK{|E}{5Rk~2mc}XL*QQm|1|hL;2$5XV>`h= z0RArUo59}<{s!>ZgI^5(ju;)=2>xd9tH3V@Zv&qPJ`4PO@c)d{YNbT!S@jQKFZe%m zD5=xP8#LD#2h)%a#}Hm8fX8&TPRmLmj_DY*sh5scAJ6;ZKu5X^xGo3poxhZ0n$i-j z9hi^SRfC=k(dt!u>B%^lW}Qa%XEw+*F&^fD=^fU@lj&*o8bB}lM+iaxCl2#Z(8x33 zx~)3Ev}7vUa`E&vX-gdpYDGICy>dSB^U*pjOYW*? z=HogBzlE(;@wi4wvPPbvxkg1yLpp8wFhrvG?3*SEqFGi>4F}4X_6zu~q4~_!g9$tC58vN7X-voaKd{1}* zeAW;hD+7N!_y+J_fd3Z!S@1oF!h8yTJ^0(fZv+1n_*(Fq2RIZ-^Aiy(%MnS zhQQC|IrMMc@WZJ1I52PexKA>eP9KVPL&y*tMwF;1M>3$35&7hJlS%8Bu2``mCkv{d*?y(+*&W$^rX(gp5G(ZvyO!Hit_@2UdKDgFLa!3S>fu9E zLrR6+85eczYqW=R92wBvE{oqnqkb_Q!>)rc=(4h}jKDA(glYN@j56rMIz4+GUTC7Y zBQcB_^(+PZB2^XM3tJ(WbEp=alVDg&&R^8BLD*rmGmCzE$P7FTxJ@RaXEyA+_F{W> zA2a_LnJrb%l2^OJxZRlje}~ig>zV&>y;&FJ%YtJ4Srmo+M*{!_vA3(L63RqMaH#b z{T(Y=|C}3G|JW6*zs|uToShrP8^Y?0DR3`^e8&BzV_TsQMNfo_Jn%t537uf-^Bse* z#z%l32c3X5zMVVi*+%^^U*A(c{@)tT`UL%9xHFJt_(mA|z*NC>?fhB0*dW$!c%U=D z;-AvfPtW|01@bv;01UDU$cBeG3=H{v@Y^vA;(Br@7sdlU9GtGWSbZ9)p;nYWAXU4!fLAsq{ z16Zf9_KlE#ip~J@2=q@~ppFG*0rGy_js@AFAH$d58tlF{AB)}`h<&;j{H8MGiMBix z18oKO(t(gCBDX&U5Weu1_ls12$j=Y*+Rr-aYMDRC&|zG3h}<4%_f9!r50tah@X$sb zFJlKNV|&(NYp_kP_hmkvnZMqmv&ndfdYuo`L%0aVv;tWt2jrLI%Q~g|Kze%CsS(1% z4J;hW91e9E4tazRH`+uV0gwmO=kQ>gt~0hx2((Qw>pa}uHj&+YSbO-wLOs}y?bHDI z>bixnZaGHQ4cf9B*x1eP8f`XR-w@U}*ALn+6xz=S?biX?uRV+02kpo0Xa{zLfE~ds z+zxi|uuupyLRbeDzRze2jL@@)kHgKfo_~eeGZ^l`zd$`By4nQh5O3YPLH7ml<3SfO zupO)~*1Fs5=Oh>(;HzNmfv5}cVFBZDHiGM`g4k7H>s7;}oDq$k8^Y_tY@rroil{4h zpNqW8z^+R5(BZcFK;0~YmtkAMzdQ`m2OI>x2ejHJz|ma`*A@+rgfA;KejMTqYBV(X z*NJ|H<<^6446Mm;U6u;#B1GixfM1U5Byf>~f>~s42k2WS*4`P?7}Q{>^SAj~e9ep< zFu_;?ohR&2cW~D@4f!J;ydG=<3>hxc_yKfie5ORg7o~R8b!1?TDv7+u*tqyp&5W<)Y8DgFXX&2j+`z!`*!*6z?B)xF0}XXw@}~7+Vc~ zB$bofXV<6bB7#^%4*2vy77=S;5yQisVU5sV_jc z`Bag1Dc}O|h?p1RU&Rla2H)jBUFhEcmzdw)b&U;YU0XywMD~ZW>-w^G&fvzthJZSLpEc`KaNOd$ zDsmvyyKY#UavR8XQ9&#U(u>;H*%{s#)?ln_Z);}>NzwHTW<6tjv!3w9s2;sO1=8es z_HQ#y+Ww&V0@@w!72a(RRR}j>m{+qPts#M|d(J`DJ@yUOUH1wTv$L3Y8e!ce=87Pg zD*|DzfcY#H<_|ts2Z%KXpEu#Y0CPK^)A&4WWbHooPvLzG)+n-FUSGr5SKx=zIM89= zj}2iRQ~6l5;r%=m<_@&$80-MnuGH~&iVYLNjt;)=d6Tyh^gHO6kziLO*aiKsQOxTh zFc$~IJRHP2*UZr|-3SRjrM zh$n5&+{oB|@C(6qKhO!)*dulNf_w=0iL!hFI+*7`Hyq}FxPQv}llsqWX6#q+8>N1j zo`ukVG!+m_C3kT2BeL}L4cZRTG1%WI5ny$haY z!Q-_=U63Bz*sKfGv%sw|7a+o%&{q0yZ)fZX_lzYGi@c&3>3&>yl3!OlachTtR zx&*Nf%hdbmfJx;fq4qX0iUPr&`PP%Lbnt5bYJjI@rb94coYEFU(I*!=8jpm**c0V@&Aj{C$`|tY!RdU?biG!2XC- zKIb)v6=aZD*EwLELEr8KW3W>ytfP2ecdvOu`8@5R^BatP4*m$);5}b#dW*4L z;H6yG4dyaO7gz^%hPLYjZ5Ix6YnWJXwb$bs-K>l7hkI23*b6v3+!7hn?&=;6n6Gm> z@;=gWMEiYwCEws%C)ZaQP#>Y1=O}64qaQN%68IKbNBFGafbkNJYrFQ)&ake6{u92{ zXbZ(Ym=g+l7+Dv4M`vhbhlX}_?zQr;Ba9sfA3Q?LGdW)}wi3MLZH=k*U%+}7yc{pO zFn@UN=)l5Yy%e?&*3cn(7Gn2nb38r>X$O7fzFTMCzD=e z4?osUcN_C>^li}BiN0-w#YoTSAQpY{W@d7%hxNcM%$Q!m46(Pe#_wUD>nQAxoE6Vl zTF#$wa(q}Y^rK+tN0BhE`R)*DCP1Bw`$&*j^Yi`}3jNQ>I(!^#gLa$k(QavNx0`4S zSjWPeHyr8(*Rr}E!K{a)E9;RH$$G>_upaQ`=Dg>^IN{G7S#nH>b-1jHi6^1H!RJt2 z=)z&nKI(mEhq(Bx26=T&?c(gz*s&qBu7j&SdtQRI4)|5FK1T$@SnUOCgecGTBG`ia zYW0V7>|LmfK4<8@6cY$*j7oji*iHJby4&=kwW!X*p$>;Z+0yUQ_lVu5@1fhIcRw`< z9Si7)z8uJcQvGeRY+H3Y77EXLcgnJ1e@$->{k0wIlIrfS9?wDhpdI=L&yGwBhZX9T z^?>tUIkqD{!;J?t`ZFWU1xA<)jHw~EQ0O?uSm1Ci?YJ=*&W^x8CG80EVL`ci-Y;;C z4|9|=u#whLv|nMyJn(rD`c7Np!WNA`m?Yc7mYc$R`RZT=QN zvoF*;+Fgff;ypeL_E3VMkHYg)!0Ql(_eDJ*wy^`+0-oWz!rG?m@bDCm=iuS)xpZw0 zICld7CX@*=u#LH7h6(njz~kO2BF_h&*U`zd7`gu(fq}3?;_Xr>tP1wXyqymO)IoR? zc-%v4%i&oII&D6c&|kF92n5eT&}sEjy!22m?J-}vGCxe=&uqan4|E>sn|P4NADMn- z8|h;RoM{R_BBO0E(19;Lek z*S7I+_6KQ6=Z_sN!Odkj;xf3`pxY53Fi0=38(}QrRKg6xLc(&wy9gg6JVgf_zUg!dCZPxu~TBVh~SHnKk)%L*=!L()+<&@;}-x0h9e)tbUPx+=g@{=-cjuN{ysi+Xopx8wWn_g73 zw8S>4q%hl&S5!E$&|xowJrzHY%*nGmN;30j7cS2$%z-tT-|WI%Zc5I?(rl{@)xl(k z74~p;V!8fQJRB{eQj?wRpr8D)L1{Y7ran`ONnT{11f>F7Q|#7as4QmlomFDBm!(+k zi;C<}q1jN15-0}zp5m3MPsw4UG@^7e% zg?Wy=%>29+*0kw)#g1f%!m7Zc3D&HV#fz!Vymkz;p7x+T~s&xzT=IU>h#QF$3(lm z2sZ4l>LwOu7v)$}it>0pOaTt{kz|Krz%M?gLGOSTf@gW3>DJ6;)+@q$>n2$9 zt&S@M>oqmu6)CYWC(V{u$ZMW`?w6iloS2_qlnrOKcn#*x$;>aYvLndASi!zPHpy3Lc9Oz33qWBIVT6LWH)kzv>GxX<*WOc*I#J`n~JJ0a>ihlT)~=06vT$NM!a z)lDqTlfPWawt2S!kMHyvfr%{N2ddvD%(n4sZW`OHn*_a_k2iKFzn+u_zmtva#Z%hN z!>)m0gF$oIQ_wS@e0e!Z*aR^8*?X8*ViK&Ho=00|PMm?)UvUdku%oar-x($Oj=b?@ z4)`g~xp_I(q})t98|5!A(~DekmWF9eEL@gnFDfj60U&H5=@=<{W6=CwIUN4qyvXMp4Clqwe9nG4GN+)UqI$++vkw+3Vh7- z_emj*PkpAle~}b9=0d|8+W>xfgx7x>j5zpq3x1ty6)p23q+3#)ix!SAS+vM%hu#r| z@nPyJE`rIg#9=FOVEuO1gu)PnlxAaDF(wTR7)tC*nk7ZsO%=U}(gM@|Tix&--^JWB z=)a!i`+qZiyy#P0DG7(G9&yLP(|qnYE!i&CQ{Jm0j3pHjJ?~cTHJH?CxJA4VC)1IL za_zO$|1*pT)Bni|O~m-0mV4W6>(aKpDYuFGXxJdIe3d}&_RdA5G=e-ExE7eeX2N9q3mMR?_cp}*vHKfajt<+90?0pv{0ADI9Sx zc(kVm@RMGUFX%J@_USF+;`zlC@Mzm~z&+p(gATrP*}o5z2d)zU7l3btYYX58@K~;m zfaCj$>j{AA;4vM<0=l*V{s!;yU4XcVm%yVA>kscj4S;(81IhyU8+f$yBw+MFktX7K z@EM?U0niA~j2IX3N$@EUUIW;DFtj6Fn*g_f&xh-6fbWAx{RY6G7;zl}csKY;2;UB9 zh8s{R=p&|s$8f|O>AD zyaq6MxacP#fXQ@?xQ?z3BN&{iK|h1I+W}t&kM`67E{=t^fN&e&Yv4niI(87S)723E zcNimpE5MuKdL`g9BVqi&^|OHAg2!~40H==v`yd=~6?n9*955vg$`9cVz+I!EY;au- z7&?}*`{6nqu**28Teyw@92GCFFDUSymnzba1Ka=}$HGRy2f<_dRe<~G8o&JwzcC8! zLB#iE@EUPR0`yNvKOb;VBIv>OV8Em#Vb27>eDIhi;>~nj1K526oW((%^Z`r*k7yv;@3t*0bYs9`5 zF~*|-i!))2H$xu)d^{WUAg?C?6BaSpXoT}Iz&pSF{a7#Ye2Kv#3kS2I6`xAg)gU5D3Tx5gx1^ryWqGFiWK;H)F?-2dj0C)=gvk=}2 zSY9H+7+eZAL;o=XhSIeOuqRz#2e<<~+OrezE4uy~a1cEG z)G}Ym{ss~53pg7*mL&u5MesPj*h;83@HG&QxP-24fOpY#72r>F z-2^!E#{aLqF9C>gd;dQ(O`3!zt+tv}DlI~Y7DG|il8_~3Eo(zX3B4h5%ayfAO#4i` zxJ1QRQf_EaimS}EHQkc5XhHLT&P+qrd%yR4-Fv^kf2W@LJnwm*bIx;~^PKaZdEfV( zfqvZxV>sY>AT{7~0I6HWd171=0OK?0wi-}|fUy!}sDQ;lEf9~f9*75gBcN8GnAZke z1%&nS2FwJ)I-drt1~P?w8UcN_i*2j41AHtJ1u{Iq zUVFvy{Q>88@CyI~JNScu`@;F$*S{Q<`U;XE0D4jnwkJwUkJ2*9!q9^>%C zVtG5jEgd`om;}UwJW~MW!o_KO04@f?`7;5Z1BrY%0@4E2VR^u6pdPQ`Iu59R1g@LF z8v?EaG6CKj@Gg)O@Wp`9N8!2;Y2yH|0yP4U@mwT4KLeQ@K&@lqcGL!J2EygG03MAJ z>vjxq>2Yy9#(^iqyf&Z<5Z2iZa9anz1MmhAwut~xgC*uI0FQR?PXP_0#qoxK(>r(v zKqipL4mhrZ$0!{mmdEdn*Z|?WI0N2}75jWKpldvgQBW^8!01G{ZUP?%sK)`FfXC>Q z0^=(1zJQ9U;=1$)9FYb-(F}e9I5!>I9{2@-gHOVk54<5D2gn)t6hNCyvE48loQ8P_ zmH~`B1O5j5F+iuYFfRfg<7psVFO0kn9^;<#Fm{7X7@$-(Tnm6_1MbX$b_YHf@NllU zUJ-zGTxe5>$5?U+)^@eP+~6`?qk*u^Z2+r)@I0gj(BcZzA7n5-1u_HP^eRHNKzN>0 z2e>RxtlJL2b=P1%1Tx-$oAbrjCX8o+mO^|MU<(i)yD*ZkL){^s0>}iy?Se4|2+PC) zru+;~PC*8v`3>mrz!v~o-4g5R0eAukr!4?v7IpXlUfr;Ge)_d&^$YJh1#Zop>%<^ze!1?1O(4Iv(5Kt1RO{0%_Q2J!gJ1mpl=`4qrG zjbfYY0iFWlf&6K}2~DtO6nHzp+*a^;*bkixc)1O(YrtOxEPo^B`G5}ZpwB`)#x?EW z8^ALGH;~|(4Egv14u<#bQXt+Ca4k?6=)eRl0>b+602QTROoG0t1b7DCJ>!9Ve`(ma z00_&h2JF)f>IX9Y0Z+iYb}b;o0@Uvg<0Z}?umlLtCHR2-2EqlQA z8F&U@84&gjK43_1&;jDvfPqTz9v$#I0Pg`|-O2zPfv`RpGnFA9h(8TzpaSC!$QuH_ z03v{|1I$&0aRtVchk)bMzzz^^1K18Ex=!^WA>F=^2gI8IvVe+#$H)c3b0Lhg`#~NM z&jciZ1i*6vD}nHLPXS<^IuOKTq{I7nSWk?WKw-c$0CRvS@Ln9oUpnF+0=@vk@(enx zp9V6-GJxYW!8Z82GhiB!1H|L^HHQoo$K&_2{ef`*rD>5+Zy+v=jV6F2feL_k17rf# z0gtgTz5tK{$On`LYys>BNQ15|0|;xE2r3{0P!`Y`usa|V z5a4~lc{`915&TI!ekvdf1+cKdM?oB)@s)V)SK@hJiRXVMzV0jW2pi#}Al8TWm3aDB z;!VC1&wzNm*4zUdvm=x_laZj4Ja;~r0dfTr|2D+XPG`Xv z;K&5X4G2bV`21ENz?0xSL5Kl9fdwKEm&=6{LeW3GsEauu_`^{j9#25*zdUUGQh@K& z!CwkYBtv|mKGeS|p7_rB|5bW^Eg#T-$5-sL>nrg)O+P<@?YYa*;jlBOmDVfojpyL6b| zrb2573{w*~2L@eSu62{AX@h+Oj+c><)^wx8jaHCe!%d7b7Vj!i=xVJw3I zLI(Ma)PTWlh>SGd5oSR$Xv559x-dNH&>it4Mh1B;)4>4_=`dn~JPe68^hoTW9MxfE7 zMEdu3Wu} zuI61s*YXQc@z0mhy&G2%|NdR{_?LU=X~q37Xw?sP*Ou|A1p6afPV$}SHQBp zXuU+C2LxGJDpf|jX8L3K4t*4aki9rTk6sdavZz)c%Xd`ZgE*EJ8}cZDk>@+`e;DV#2>#K#O?b#Vv33y z8XY8(M}Oo>B$oM>v;SW`C+Gu$SPo)Df zfZ$0oe11K2>(&j)%EDfn@C_S!r09EU-@bj(fB^&Ee^=Gl*GEQ1MrhcuVIO^09Y21& z=)3CV$&)|&t{So{2!-t4h4$>;iT1(^gNOF*MTZZB!Mkw#P{hIgC^F(OI)3yBVnrTB zC(}~V)k|Ddcs(E8__+Yxy74nAx^)BbF!64oiqhNYc?G=e(iOTa&}D(Y%mOfm{AGFl z*^CB$`W;QJkJ|ev%`a|q^`R*E%J$7~ZT|<(t9_{L=N#0pAM9WH)d1)FDt_Z@hUmPa zV$ZK-f%8{{AQVa@ME6Z4*B)&A0r)ih%Tq@0`ClJ*bBZfaF*}q+v(?1N0ya8U+79_!BdFdRl`9X=!Oe z{%V8a%K3Rv(#L;r9$##~8V2G*zHbn><%drw?Ylm6ARzw_rHSvS)1Xi~(C^Jt@O|*` z{d>_(m>=MK++Cr|0$mpPzi$B;FFvc}C(Fw}zGDMR2qYJ*j)eHQBNx%TU2u#qW#SKz z5g%h=vDAn2;-WvK|8U%qwFvO}&VfvpEO-|q{9J@2z|Ni&((kC>IV&;$1rvNO^o1Cl z4%2Rj>9#$)!)Edb^_*m9yc{&`#SlPk*( zo!(EQUl%M4V`TT9u{2a$JM^S7Gc@QD`TlOjUtW&B)-stpsl7nsRY0q5z|&lv{K9v~ z+!@4ymRySi`TiSdcP0x^VQ+db*#Uy_REpia7o+FIZ!O7p(l~Xue17)uQ%&#eP7N=2 zahX+q_oDqQpXM9RJ&>E>>{tVMf3QDX6}m~mOVTEPB@^47zi;B4ZpdWqTbJUgbI{(# zCi!mGcH)H9LRAu&wQ^QkM=H@1imdhHVan|A%IZ}V-?5u#uhpTgj<+jb6{;s&q z%kymgZ?|SnK3hFqfAC7uh}R>UTO;PUZ}N{csLINIWBuk~>ZamMx1(*8!t?1a+H0oDybBNJE?jJI`mhU;EoXGr;?=G>HM#rNEgrOL24kts>au~%!r01lr3>?p z2P_(r-SFdxz{RP|Wl}j_^`_Meatb0V&c5uqq3VupwD+myE`|3zv*unf4mYT2tU8r) z%4=Ur)*)F{6H~Jr3;mv{6;>LZS^vy&!>h$7oGZ!MuOC#UBqyJ0yKuLnH<|B934O77 z-Pr6^Pd1IT81}fPUx?4tRqp3jzb=|kAHbZQVpen`L z2g{789C2@5dzNLdWoenl>Gycb+vbf(yD{gt>r%40{EUP5lPGWHl=Ss7e^m(NP{%3n zj!$u&Hq$c2g;YnN%}w<$UfymFV7fE~_e||)H{*~~@r<;DAD8TM8&g=(XL3anHH zcPZp@N9(a;()pX7t-mkp7Sh+|@Xh7R+Cn}0tazYEw2a#L+EAb9+0UxagQInW+A3=| zztY)||6)~c)f(a1U6vWGYd5^Qvuw74PeEnFz!vvRVS8(Onahcb<%Jtuf23+4SFNzXrPPSrG0e zT$Dn&Sbl(=Fr%NFy4}m?x3uPYo?ZQD%*x}_!+$mkm#KcHc<7=|^K;+a-M<}YHe_yo zv+a~aNv?}R&7#mdUiCNUROqXp)N@$dSWkVtQ8s3`V5P0hAz_fR^Yh60v8po;QGTjh za3)jvwj4`ktk%Heedq3HT>EirwmZLvoYl}bEA@${>SVH6hS2Wj;kWlj6y{ciH($KG z_FeHx&$gh-<_z<(4f^-88%9-FY-~%*9#ybnhSBT#LYe#LeNHrPns}UYY}CFp&zsIx zESmYtu+>#PL*`yE%0KSER`(aZZRU}MqjS}6ztANeoRXPuJtJ3Gnm${aztm#O1Et>F zy?KuV6!z}-RXSFgsY?{T+rD?&ibC6st*gAJl>|i}PZ=`uoy^+QUxNmm{`r#Ux<~7( zfAq_t_2{8keDBtf5JsK3>_LTX_M4Brd1J9)-}bQq7nQcXa^#$hDtY&-XM61H^f7Uq z4Lh?Q?3mN=d^XEVeZY&PtDEHp-dU-sc02G!Dxvq#;dM`ALvy|2l9HyH+6%v=sv0ff z)KCtEA;rKGr=G6w+i&K|-ht2T_~%EL+L0b^s`m72eev6tBWwKXj7M5n)ZA1YceTAz zHMi!+BBx#5JqK7_JD=^@m^vp}hMzV^<>jN>XYDhdjWRlvYC1r-Pm`tM%OxWt_x;jb zBy6O-dF9$pSiY&*u%YQ#^8K4GqcX>Ho~GnK%}8*Jxn_ItP+>;+)^|shxO`rQmboUu z8IR7@xbChIM%}+;-%sZnHN{DpduW_Lm34Z<)YOBUR<}gP^XC7ih~x+C9FbjIQE+Zz zc$95u>XAD$9p(#HGRF)tN|<;k-Bv-pcj!Xb0A{!6oPgvI9pwjel5C34?|hv+wxxXb zrD+-^Co3(+uu6ta)JnS4yz$z(-p4G)IB2bMc$pJ9Yk2CcC4rk37rk)5eO)TLZk?uN<``R;5S2n08|9#-lEy#1U-mX{N?A^;+{!es+8ZnM36ehY zr_%j#)kE@xmumPL-pA#(l7iJ4Z~1d%asx+MncaH*d_oW1Viil%_Srg%gX)`}E}qrU zFren4<2F6s56Mx1T%Oj-l-g^Vqf&cWZtm%C<2jC#8UI|PjPt8Y_3?*|v(6m7)jdU{ zgrB|TM&EKj^-T&#)ud*7toN38p0P^$sX`brY%?=)5;<@2?fFBkw-715L)J(IFC=s( zFy8E#cPFUy=1J)cw;4`D6)YnLSKd0lxIvlZ8)7?m*UmvNFB)7unK3ixCuM)0{fc92 z8UDtF3j>}|vg!554W2eu1Qn(@sVyoW<&zneEq~H;i+_mP<1*V=|C*l<{5&@#%3{+) z6)ry`XC;fu_q5r6;)nb&-$wHyEi2OLkaauXw3nJ!zf1^GetXG6EBof!4C!r;CS5(J z+&zLX%cvb<=x8yHMA_9%xpL_bW7NH>oyv`$4c?J$L7UWmAYj%|zmqlB;_Q`beYG>&A@vny0}r%k+>zG?YIC&SiT8cUBAl1$08fMn}# zuNJ?$e9jRakhVvC{AF%Lj66i)X{lJ=s<|ipp`k{WZ#y1YY9sY^JexCZueUC{pkqNh z9liOoOMuU^AtOsp24pnJ|Mx);B`8wmmsgb(VV?m77gft7(6;)II20``QOQ zhrEqVar0CItToE~D`xcwxcS8UP3#z%5k(r5dwqH~9oyn$yl$7&;X7C7uN|IW>^FUd z!WCkDd`*0`KY3VY^@(-2jLz*zYl-}|rcF9_W8Qp)`RMg@Z%SQ6#HMZc10Pjd$d@WJ za%Vr9|C`*_H}-mAIo|D3KE)@;<~Ej3;h&CCSR!1x<=rz%QJ)rRn!wLyk|A&4oYLKE zw>*h@>vh13hlRvHp35ZWn3+33%+NyAW=|Vn?%d1 zpI0TD70!zg+OW*;CLLd%zA$u_vDEoIb|o$8S;opSv+OP$51sX54aI+G;2YVuO|zq( zM>37w+C~m^(v2TExg@FSbP=gL$@{7jW4@KHTtEGT`!80_emo0SYT9iYac0R%^X!LX z1yPi#bRxwtg?`Px->5C`Ztja2kvvcC(Sf#M0~>8$1SB}-IS-knJ0YCcSmM8JBT@?z zY+rJ4$L zs=Kjg^`7k;urb%Pb+3EHn1SyK}_>;Ak$dk+}jvT#|kt>MnoNbfN#j!dd97Q7v_$^Y)u z(xc(tQLo1IvQ2h<=p8gZ(8%@FeO=VO?#SK5yc+mT045cY33TnCr3bCn;ft56;@%xqr3iMr(9F z;lN>85(BNcvqFVCDhR!1puX>;_RK|%eU=VG<+gj&i3?S6%f=%btJBr5%YGiqF+zg*7kUHKz3|6g0uf|@89 zt4fU@y|oW$ySv-qqI;2gYtGhpZL*JE(YR#|+tJY}DBaAG7}}j5IUbqYDii(QZhW|I z*Ridy@>HLl9!&aR5C?R)VMf)F;R$()#9K0HZ9tEbT9QDKTU(x;>(_7OYU;C}Hm1J| z>XAmF6D>X~y|>aB4YGVk*Nbm^?O00ANP4vJz(f=~OP%a-oG6LXpzw0Y^t7XWW}?IO z6Z&ft@;^2i*VNXg&E;s5gHLHW$uiI@+_H3Hk~T8;G%h0L1bF9PRyLSjoT5YtOH<#| z%elOD9J;BG3R|s+WPug2xd(}TWDU)dXpof-d#%kHQ*?;C=4|;$O>=d!n!i||$IrG_ zy7TsTCx)pSRH-m>y^t|(@8ufSXc4K*5?xzNY8PA0=ylfzZ>8uq8% z9Yf9<7|=uK2znTrH_x^GipI&(4Z>q3io}mUTSI&8Z;L;YHeyKC7$YrW%A6Y40V*dq z`z#=p_3>KKt2Z~W;>5{W$+P!x9G{%?q7%;xrZY+jGc1 z)lb|ogLb3A+GwpXV(}@eTh2xcipguR#ULfdQ7Y;6D zf4JB&TPcha-KK8Rbvw6UpGLQzN0WX1ewn?Y(CBO^$C1XU9|lFzr;Ry*+N$25VVN=} zUduyYN(mIndZWj3jukGw|BgnSdGEVPNN|>v{78m3LugKV)3$5V?H!sP?|oQQ90>?1Iu7<*)lAJM!=+Z%u-g z7)Lgt(B9UlZ=$3}amWG2duqh0dmq(d z7LwY2rG6Aik2?wZ1PpNQ&T?Ap-6!l8DGa@STc3Dg{+j&cdaPdD))fh>ZcaHry^!kW z;oNPk4{7<-$a${lozxY}AjcWKNDmtPUdN|fl1Uy%r_UQiL8Q1ziQV0pzB}$GBBOh^ zhXxtHC{^IHXpED3{%Fmb@#vyFNzhr;!{h3O?)3JJQ$sXizC!H3(I3W^{ZC~`rqO7p z+^uDd-VFc#q)>3par3S6YlG0~X}U(@@n@#AiG}0R4R7bKeo%a-jjYzcZ`wj>kHXAp zu3L7z*i@@~!L_>&|hO1c{9`)f4vw@39Cdl^8ApC&AK!qp;HU~ zpp!i`5uLbmJW;--M3E7l$OtFp4ffXJC8W0x{iqGmc}`IkDoEbsBW+?xaWFKuCRQIV zmm+yYey|E*b>Bci!7AR!-nD+FEeaZM&siFvLYd^y*Zl1Z`{sMfjA)17 z^uwpD9~gP_sWb0Xg@Xf{+zmTSAAkHR z$pV~5o8x*^Jl52Z1@p37pL%YvD4En;pVf`IbTm7@t_jT^8DQU?FqV40 z{@l9Mk5djK7tC2Qa!H;7BZ%VWKJ{8wbs>#N>(r_blt|9&C=Qw=vpxrgZj~YPMnZiK zNIQ62?VH>%Io?t5)A?Ra&gBcMJ@QZZuQ%_hWKpb@CKJEA@8IO>r1Wx)7woedPij3c z4)OvF%RJrQNMY*;W12FI0(FyLppKy3g?%o9mYj$-n5g z@tpa9puxoJGdZ4fdywkXyKhycG9E!^kDQCV!)EXud5$J`PxZT@)R-VsZxcQF@)q8k z+qt!*0c4gscVj%dmpVWH!Gj0mmErPR8hb>VF>b1S_m$l@oGnT4TN~2zX!xP(ivuYc zBhJAV@w_MMl%)suH2*?oc~Vw-dde$PNO9@5vC{l*=h~Q3>ZeBPYE06BO>dI^P5 z1nbmRGnqWO4c_H}Ar>+jTMQ_)jSEl75$9hh)ve{l%E?c>qQX5e9) zTVXJjZ0EXnUSY|-Exx|aR(qcfQgKtKF)ruy(?@+{XNJl5=usdeZHbnUaQQZJ#Jm=R zIcWv%-8Vfnlky%~K)}Twn^wNq z-h5h$rP!NWQF%hJ`NfM<6*;p;87&=do}jJBb+2u`cONcZmE)=O`=+@GZX36&y9+Ma z#JHg3IqA!XFTX(rYdJ+L`Y6?e4{<#lxL0u_Ylep^H)&RK*{nG(%7Y8MNe*GnO-+8| z_C~H{3DELdk(;QZp?QhH#rgrKUXd_sN-@rs8q^r*hE?4e9OxVZ;Z(rNJfjoSn_tb`z=2kt%Kk8EORphqfX z-{sd~+IjzNYlF4)v^XSqU@2|olAr&~0<9d*p)lmnAG3Y3d2?Ye)O1^ym^L0|_tiz` zmxa&UvU%1>^lF74iD$ds{I5s_s z%v#&NTT%CE)MnUU%R`mn?yfukw8soK-GywnvG!R1>L>GkNNVOrTByyU{neBFXVWYZ zvP@ZUaRQY;$%t&GPvLRqqvAU!Ed6IMd~jvN7SwpBn9RD@UUqUx%Sd%}ZFhn)+S63k zW9+;w=-OW8vuj45^NgHGa;Q5%*>+VKm0$C36wFvqD&t1x852Qrs+ra47p5FtxU3?Is)_Y) zt?K6wJM{!kByF~(@;P=;pS#zs+U`Nd4JNf@mie0s-zPoqm6nzY)<`1?<5$X11+l zZrdj0MO$axkYOCie0&BbFlT-Y z*FVwCLLO^R%euwVxFk(t?y2S1BmL|8Y(+;kUXVQ+VR7qY(H-zHFcbF5Xy#NOP?kp? z+GC`dj)LD? z(}=PrmMo@b7|wl#h>0<$WayL(_$hT(5Ko_o9gjwh+_W8b6a=SxbK%YFO9SjHiUsgq zz*XB=q;9pInSbxuo(ekbdN(`8pF!p853okJr34e?5ixuG31mV+tY^IYQf31;A^4qW z-gs|0QVwiZ<2I;`!hF=+OXJ}yn>k`F;7zpcfv|L6EsE?rh04ml-H(ET_tLm4G>N>v z)5%+3-rSyRpVF!B-?;l=6R^K5T-JCnLnRCO# zb;i)cr=BfK%1&WS)DO(oG4peNZJ|5%+}4T4@y{LyIl9lVnl&}YAZ3B^aQ};Qr&}g_ z?m9or}W>Kw4{ z_$@yjpuzug(gOVyfZo@^*L(d0Sa&Y`Um(!i6bRP=w}U8Py`oFRce?)&=2TZVj8SilUud2tl z^oRYtM0!i~hyB1r{shk~g|LX=Ur~?$RDbMCm>3L(5O!Sty}|EW`_3a3n& zBDA%&6~bO_LfGr=AF0QGt3R#-tlt;;mASdO5ca0S`-A*#b@?mxx3jYowFf+16pkG` zRtWp+3F&k?EKyYy!hU?;rB2_{|7m&IXZ=^Q{!!vTo$cRQf7k<1Xk%j|5{G>jgs?B5 zB5mJR^k2+l-7(>SuXCU3 zFFFAq68&+X$L#|9911NgEQHwKVBbTbnVFez$ z`rn@2yF~XyKlPFCdED9mU|(FJm6g@s`b_H6^6|4Je7^_ZU;Uo-mgN1V^05y1-VVP1 z3wsfNS3NqH4|@{7zrQ58w;_s!^HPr@v{f43+w?c#Lpfj;mHKUJ=iS-< zlKSKL&gG99HA*Ncf5?y_BD)wE7zknSPa$jpDtcxCduWTEJALZU-zp#9+mwV)?f*T> zj|@ND+`0a^d`bPkR{oeVV}yTI{f|Y2|D)wc{ln$M_}_e+cT4!5ihwV=`5Eybj&}>w z4H3cq=)$6#g(AZ7w;>(ul`a&^iO<14>cX3a*M+dBx)AnOe@`9$Cz}7l9_{V0x4Q6A z>1`qGv;LP7zF&y*{1iLN7tR0oh3?*rkN-}>-#K8MlzjgIwk!No7Lbf}e`ooUGBM)& z6tD(Pbg$xj-lu?li-rF!ftr8ndM_#WuSzem-5M zz2v+EJC`Ym`&N31E}vrOw4bKO$CB`=oFt!5<2&pB>A630{8y!ieY1ssh9u=no&$Xg zCC`gGqa^)*gJ7qBGzf($;}H7K38xdMCBecZ6WGia|GKINTzg=&p^J|Ma2Jk@V74kc zr$@p!q)lLvE8Y*C4Xc4DAlY#QtF)y-QhekAtIP03Oq3V8)F1y~jyN41v0=p-wIdxI zK?>Q9badoF>9j~nl>RUHV31%}1Gs-46C4v36A{CT$%x^`l*RC41Tl3nEiouoEtVdu z7wZwrjP;F;h-JmHV>4p2V!5$p@%(r}d|iA?JW7BJ+(@E(@U&#LWO}k*a&SsmN<<1P zg`2`l;iuH4pj28aJ=G+Yk?N4@mdZ>eQo~YNsTrxg1#5lyb#V}(Cu!`6wJg`X}*nfqxO^Dbqut^5k zBO-~F#7+{|iw!l)g1Qwz?aERGP`?(aAr?SNKSVj$OqX*V81N+#4g`B}g9$+P3uv0KtDgtc925V)3y$Zl$WneP_ zSgi%@Mg_~Mf$j9bdS=lc3CslF1R{Z-B7oLyf%c_B3#&mJ>p?4OGgJ%`QmcvN%CpOB^*`EnY9)EZ#2OIo>1QH$FH%BAy+e6<-iv27cKR zPfbuu&`U5&uuE`G@Bm$d6Cx7W30VmR31ta_gq8$qqFSO}qFJI{qI050qHkhwVniZ4 zF)Ohku`E%L*pf(PtFiUiW^6mQGuwmh%MNBou-WV^b^*JLEnv5>sT?(q9>d$NG?kjB)23}Q`A!QQp{59Qk+vfQhZZ_p+B)xvQi3C z%E0C=DO9kw9$4BAtn2|64o;0oWrNohh&-+(l?uM5*Wqg(;Ag?$V{GuR0`M&X_!Sj= zN)PLqa@P8f&9$>4A~JPw~z$3aQ7Bzlrb5+lhW$t{VQ zL?ng5c$JaFP2wf-lj@RCG7ZLUlVnD+L$X^kG&-Mz;KGDjSh&}-qO)LxEPyexEE*zd zWaI>p0d21aV}WzDZ#28(JQc=ICiEr(`coM6C>Hdo3{kJ*LBHZd&#HsIh1d?zBiK-O QOA;M=0A$t`{t*lOKcm4QqyPW_ delta 61793 zcmagH3w(@6_Xoba$;y(f4YIjNB1;w_MOc@_x@1XsmR+K*RhMW`eM_tCqAfPwO~`s| zOQ(J7?Ty~=t=?Q)646{L?yXWSdSlj7p>GMw{=a9Q4QYS<|NlOp%`-F4%$YN1&YW}R z%$Y~=))vKO&DRdlG^o}M8sfQXczE9@52;^j{Jp8wZrFO&R&SCFq#&0N_m zUA1k@qxUx!)~h?KWF&wAwkjokMC(<-<7f?0DPE>ej>s4y6n4)q3n@|&i$n#D%MdUD54w2ik- zuuYV_=d&F0b-T{Mudm%V4S0P!!k;n^tyNCn>{y3fDarf!wSY?H@J9}oFiVoF*=aeBl{ar4{Uk8)JIp5j zc0Bu``OtO)P{~p*RS!)h-jRGmV`l?@fjnO`f(>esl&(cre53X@S;Ex8$mB6Jlv1p& zwlS%mrRG@T%0!26so4Zxde2<^XDB4CIA4rqD#_YEox;t z&CuIg$v^e9R&N<)T{It8>O|g5qCiu%gH!-B;s%B$2N{8FPbU;G;^i7~?*b+NCC)Q<@yyY6n8&JD1 z5ww;9+EGVlrTtJtFe*$Cunee`YnWL3dk2HZSzxy|I1EFoCI9%_R6xq_%;o2nt#|a@ITi+TfprhG?PU@z(@Bohr~1qQ@}YsR|jBAb!0K zpy(r@_cEH;CH3*v{4otWz7K$HI$Il?0=omWpJl<4*!9hyMjLttGpBZ>(K@Jkco^ znVj0UESZr+lzQd637=F zFQiad1lVAE%jU6nI$>cz***?4kf|3iD@!fLU@w z#XNECM^A#nSA^1RKy89p&>+csxehhELgNA#Di&b;C$n#V{z(BEv z^xLV@Eb8JIrH;^_H}D5-rjJ2-=Qv~lTFd_nMaI|A`;pMOSc1(II&DLdieJQEQb^wO z8T?hGA@{v|GN7uEUySsP<3R(Y?f4JBlsl-9aORBIQah{lVx^7J2KnB(!_lYkcn(_$-Bi7IehsbEnmq)>$; zBUP$uZ6CCz^%&IUZdOxYDW=tX`6LjIM*%fSJ|=myRjzhqn!FRqOl{*lZ~YH1e-@ff zc^OA9mkYFAI!TV^AB;i`J>W}n1HWf9JrlVdPlsGB$wy=z|N2TOgvq*zEdB zFz*b2T#IKbdJ3wy!O#S`7r^QhGb1Sr;V@(&Xt<-aabj>? ziN>@yWL$|v$hcNyYqmF!RMGsJ?v+9vOQ_7}Fze83_BJdA)LViw%t@5cJ^LWt^e15w z^L>~;NzOB8OFr$FFH-lE_Ljpe(T=CQto?u{|CyX>PR(B_MLKBKW{BTc0`&Q3n8lX>l+Kv&~XKm83M6D zzdhNNb?nb}>7I48R4PKqr9xGqK8l057n!+ zsraj4pMaEtefw~#5h21p31#v)*j2tbHL?-U{h?wnr?pGoc9Htq0fmEF-Q@RqVU8-Vu-C*~*j>F%r)#Q$j=zo+C`XBU<3O!j!1_M8}>twb$frU^`7I9lLD+ z4#Mu@2ig#4x+8m)2jh5m$P{FnTWa~KHY{W^&img>z*Ro(z8{Nm@xOQ%MRH`6o^YFi z-buXWP6#E4gIMIxP=27uySf9Sg;dg|-+{BYCIq#leIFG-lg)TgmY&G&!lO#-dx@=R z->LPwA0Q={NJaWRNPtgQ{J^%gFZQ&-`mh`ZQ$?4Ya7Rh2jGKv5gfXeGZ1KQ%QKDLX z+!a}J*d4>a0vcH14`QFS2}V}fWDc{pci>7?hDtx~j^eLj&5$}cf)UI|F^|GhpuQwS z-Vw6T(U@)RaM#FjYtZG6Uay?$_TNm5$y(`lN#0qc2%WJZ<9@RFdLy^ zNI*@#jq*zIWZTlyQ{F;j!_(zd^1xfln|tW#?fA$GtRcNa#D9V+mTES2-tj&0j1zeD z3=)Pfa=}E;9E0$|+7@h-hPpG&gCfqHQ?b|0Jv8R;*-^78^V~TM;+UnDxVu2|(Q@?X z*Hc0Y8B6h!BuZ|`xB$)CceF&jfak=HV>pT(gF^)TdXma8(VYqOArD94NLNNrQ8A`SwJc%<{vYXSZy`qNR)TI=ow{xfyh z-G8^cJ?dOui9zYF;%_eMo$#dwkVNh8@CZhsg69xYhV5q(7RE@1?e&Rxw+kgU!}g!s zEF5tgR<2F{%7$f75s2*=f?ve@W0X((*t3AOqBcXNQcG74N$L7h0bIWv4^VPZwB-G9 zm*mqwqyYTMxDeVi--Lcnw^`U6k3M5pc2cW=#uRfltOckzV7VvOHVymkx;jgFj`sX3 z!0wsyN>=}A982lkx%6sPJzUnfiMU!k+*HKNgWnJ&mt=5>a z_Ur1HBeP5Nj&vXa+X)4%;I5A7Jb{&W>yl}V#x5G@| zy>BDTR_M{$y$<8-8}6#o@q_9?R)(t`*F_!P2V>Be^wsRt6S5`D|)3i&AxwcN_0|qT-5P_ zUj5rKGLfv4CM}HSWt5bqNkI*yoo}R$FV?comNd@2TP%!?wFPQ3JjF&g`O4Y&ATK^wOq#+AsLe3N&?x$zJUlggRt=}F-h{hIzCQh zCS~xnfkaMan=zOQz2&B+^n_ZbGFW0_tq_f+(ppz5@T!V-g4P=BWbW>V9b5ODw%G#| zXo@l-*JrHINZx@bmq3@eqb%itwE!404#u`Z*4LsGc7DrrR-BVG<4xpvU#v?=qfy(7 zQO`eO1@8usvR=l!u%I$a@JCsb%Z^18F~&vZv*P1=a$vl@jhnjpW5lC#i(;FFn(d`N0IWDUHY824Ih4^3({tFWdtt_~7MXRYR@S>u2%O|#N~`?}~{24~R{ zOjZL#oIfrq*i4eY&67h|4Th4()Np>4hFq=q#0GX`&@g=j6cUMPQ^=TcjCC43L*p)I zzQOI1DsEuxzGi_ZfQv0>d7{f;FPfIfmtSS&gL`#aL~rGTVZZI4yI_}D?K#UbTn|X4 zS6nl(&RX$KS6O22h?MR*V74yw$4r0H=ucbxSvpr*O`CPQ z!VcNmXb&c#OXleu-;5VzQ}Xzb0h(9qS;A0r+;L2_B(E_a!&v2ebaD=V_zyOE=n&18 zOKjJWRJLiTfjue3YF=KzUY4@Q8!&k9atSQvO5oe!aPTf!a?4P<3aeaRE_p9%f@%EK zaIq_nuSZf|vV^b2vpQEWl{XYJteJ@VHt%vBIkVz+v+nkU#;H_eqDR~9-E?Rnd6$?} zhLQylAX@{bRFWr|_(hQznO&7t_@IT^h9|JWMr(Vn1cAJbd!5^RzO@Hdcl$V;;M zi%7uh4$hUlh1n|J(u%RQyXcB*8{~2+==I0hHG@`d>-eu}@ zB*bKSq*OE}MvB-?X61Z7uJHv5^W*`sV5{Z*`5=@!T&=Nj0@BPV8T0Kpyd zvSKGxCKgu4u23kf1SM!|p#)d2A=TN_k=C44hmyPJFS!+tAsSzhed);aEXF+Zr~U|2 z$$cMG;e1ks7muT8#U89%m2$FRn=*acy;CbchV`L|W0wj#Yu10x+K!PX{RX1K zVk<|bO;Gt;`6a?HTp&+X%6>qZH>h?Qs1`p!HIQ{*@-925a%J!dzX9!{@dq)xuC`E{ zEqUH=Z2OpLT~va9@^I$j*RR<@EL5PoV<-t?!%%7t+S~5Ft;Q)k=dal(@3y9HJ}StY z{de;66+IL`U0bFeo0R<1d7AASN5p)ksD8D65gIms}%rrbj{u&HsnWROTqkXXnOsVF$M+QavKo8QFr~wQYjnOQp7ewrKZimAuo9RiA57yQ_rtgRGdAfSi{=Z?{P#FCo*H)I zo*Yf=?<{_D$H*C7p=pLs?$x{>1TgsT;Cc4%$)i$Dp8+f1m?l`M!&s4Mx-dCWvmt^- z-J6~I(Wn1k6{p;5YQ&q`t>~2!-4xFI_ul3hdj0ji{YG@G{wG)QMd4u3Zu$yb+vsP; z!CIql`z=u}PSpG&iRD_sY||XEAD*L`%Z2X;vXQ@hj=ebT?#x!$Cvb`0_~x7VV3B~u z(pS_iFiG;=8G>}Y_!ri8dP=)y;)OJyd}q0~t+a_0g4AK2!@p|D#!c_4+24{CPfv(` zJpf%$n5*J11lTLn&6-_G3s@LoBX%8DFW++Z(?G)oZ; z{Bz<^xC1AVMO5UBl>CuvvGgE|xUZhQKWC_RPZ|^eyW~z_F%QHH>`nEHMniT~d6%jq zRjy>-{!WopG({cBW2qpb5*r>UzXhaA}P-`Ni~-8a4Q zz~m-#`$>y`eXeG^ADq>^&vp#jZ|q;kvgY>F%zA*WV{O>dxh*sgJ;2K5n%he_%nPQ% z4o^TLv=;~Q&*N7E+j=W3Y<-sp*uJ?v6W#y`y!#Qi@FTX-4*8s2E(sOyRx{%~vuDn3 zHC)@U0i*5KlZMg?P&xRZQ~vxaHhN>$1OBZL)3}f{up+OtgkG^-jBC2nulc2aYC$R+U^u-$tmmFC*>N^M=y7m}=*$ zPX%WC=5_YmsU(cv=HT3rF%!VBmlEmD1Q_P0+O=-6mawe2dj(B$ZI72{Ko5e@M|~!51f{dH38Ia^HUGU^*)BGh#>GA z4Hg0?dGq06YNlV1?D^l_Fs4LYz-cmzn9t9>Vm6jC>PNlxwypD91?|@OuA%BJ9WY zsX(Cejyt3SI-tS8hlr)MRZz_pwH35i2|-3&+;~8YK5u{y5R|ED1=uU^#XuxW>fZan z3P<+hZO>Hf2X4pF1O}(Fi|#Z}|6~drsa52Lp=1!vtBg}VL}9EbM?ZG>4)i(Mw0z2A z?bdSl?{>KYI2lUXpsGX8)j28C3>mw(LF?8#e3H)Q&;2uiLr5x8yLC7P3BVHxzz<>` z7wWuAB6WsRNKTc+o?P@s_iYeg5E|tnWAaB((T~RlV`V9l0Exn8D3p8;>H=**Jxe(& z_$pzZtnEGnq^k4jJBgf!KsK1gd#uSv$;4zEXrNfg-bL7)&sUqt2K|P0DA*x;~ zY*N)7VJWY)J zqEPkfsNf|!W&Q%iPT2fWc3(Tf#U6?@KlNymI*YY^G|d; zXz~~Zr`1u0ozS_x?jRJZZi+LZ7^)7;CL2J3gCiV*6X-y?0{uqXy`2zU6lrGbzDdxT z#71yRB|Gux(3r_^GYH1xHEmhf$E*W?hf~2nJsyW8KDZp@8-YHcB>$!xsOe7~F%2Gi zCAvvI0&ZT^5yf&JHXZEkOPxENz4BN$wVfS&tb=DZ;OvOOz%8|aRgYZYUqEM+KN121 zr(O9HY()nmc$8Iq6+uom?=7`EUe3=2L2zJzzI@sf_-m;RK7i;QoZK$U#v0@s(jlDd zu_BYO%gyFb12*X>yyay`%eR7qCHBbUDW+ATv1sNq{u>!Srb*rWB=-K}ojhukyCN;+ zL5VN83qu`<&23nLYrO|TLAYD@^4@}*%H5)*rR3B8Je7v5-Gc|{a6D0ud;#n%TSNKuVLzX}K?IEOvDlYlv=;;*Iyxk8m5XHY zT=OJoa}m5ay^F0g0N7dr z0lF#38%h^~%>&bDHKNXYco`UljH044B)K^PbDp{vJg4PH$i!;mEf(({Qr>M*-g(G@ zDqP93HXm<@Je{N*tqo~6acvTB3w;Kpn)6yT!RvE4U298K1!U3IuWyb5zLb#i>$Q|# zBM?-|9n_bs|6{V!C@?_u4fnOI9TlKLK+Qqs%W#?ys6aZ5z;jr;0s;FS1fHX+KJB~o zP(~P7h-$Q3uv#ui@^vZm8Zm&kI!gXSs<;?|FhoSg-NY2T+TJ;aJ^mKawo)gBswC@G z_Zg@iBP;jBwM!1yX%R9$gE~MEhkmGMJr(>J+Nqttlc&73P{ap#8*t28M9f4W(PVAj z*6_sxYwm%NGn8&XMWNSMY2QSNB&%f|;(vN$=o|9M^Gym(HZpo=J&4FH%WmmNP1x87 z8G~;EzF)rwuY)mO&o#AMkL-SA`6E#Rmk5OUxZA*(oI&IA>-*!u|4Y>N8>cBnqp4`6 zn2@15s@}3n+Z7xq?VBy-E3OqSoOfEB#*>Mb2S!bVwH0d|FUjXI z`vo{@26;wMNFRHh^;?nac^Tt`1Wv5V&%h)hDAn)$8hI1a+~LnZjWie@hwc9H$F`Ck z4)gP%FaK*_{xLotsCk!}R4$xIQqVRIE2mb1(MjLl-V5-DvuNL=c4f?x8|YdsNJnX#${yS$~E$lknu4j0V0~J!NeN-y0GZN^CQ-^gQ9i7E`H+~SS&P@ zzNiGIOC#GbJ6s+zs!&P-PDgOk-=H4oHDnKr^Apq~$mfB%22{jz+z-TUreseU!V!hp&7x64os1$Ly0vG+2rzVxoGS?Jvg(*k)s_3aPHQy zckGsflF!%=S;6^y2IijNSPlm|2%s#*n>_hA<`m1<$j7xpG?5BoLd64@LZPjc5)H!= zBV-&zc>A=W3D~?EbCk?=WNsg@P=rP;3Md|Pfl!rc7ip1K$!X1LPhibFrX>$dyU!idE?7!aG!X23nhP1 zz?kSMv}KuVMuY)$(!@r)5sTY$!GWEfoCvGQP%;M~uo-zKm+aD!uz4>_7K_t@J;=SW z*qYFW#PS_%cNp1#E0tjv^;4pcJ&S|MZU5pQPoz??xtz`YuwaE#inh3>V76o6CaMD9t zvID#ihz(f%6L8=D)Y&kQ*$LZTAn= z*?mK~(?2p%$Qh@9D7X8^nrN46_m7Ola}wVIy#ZE1R2&%*?nv+ub`Z8$DMyXDiK=`a3s)hW3S1{g@W{oF|4OA&Qpz3jqplp)Cj2; z2M~Go@=W3R-pd!ly-s;UE>;PiGMz2Zdz@x93GlMi2JYDnvC#-e|L|DsY-&RFh6*+9 z!62;kQ&5C;*=-;m*1fJ64_^$q2YWXUFB)Od`axYgsg6nXTGrd80Lamg;&M=5==#vI7DB|-do+)a}K&{2Z=Ro z1eU||41b~!7!JACky$Zxb)?Q#rnZMFV8J4;_naE`U+H1@@vZZjuAu!h8Rz5KN?#au@rxXsScEb zbQ_MAu>@KMKR4&o!j&{ssf$|6p75LFy5MdIa=3)}yT~)&lLZ4m=|Md`xfYdR z4iChtbR}Tf-bL#UgN*h*8cTu5Yr5gRZ-c0Ytu4s3m!H3j#jj2Coc#|Zy?$L^D3W93 zR7>N}z#NDFn%E--Vld=hXbD-a1n0~82T@D%eih=|Q3bEhZm$70+lVi?71N8AMm0oR zcPs)Tod!%aNxn+9#~7d| zT|FfwmrLnYE=(?M39(y&k4nVm+=S$4G?(;s*kjWelKEi^K{zH>5{<#NEI3crzlZk% z{~LG>{O4@1@!TH3Qlt>GPE{1QGY#MfDgvQnco(!{zs+}xmNbAu)I^PsL{EDO|Gm5b zvJ=(cMs;!_z=<4QqI?43DU>LjMvXx#@N0XXpOHMDxZu zXhM7;UH$rQ7&QMHyM3Q_6rd8vP$aUE$A;K2X3A_wg-TEhDtYyKeDvQo!z*6jTeE1(a_x-%karwKra%$Mzb%QkDwR+)Ws+x zz&Hn*WCF`Ch7zTN%iFGwurf$)0%!PbIHWVcQiw#mL26p`6Y1Bc_hQ~>26x_hQ4A%6 zhIR6^NT*;}r<`I~!r>7zzWfvmJd-}4pSZjT*C7d1{Y$74GR}XBmW4Zk4;7o*V|38qC@uN49E+4L@alsb=h?6e5S)-L{N@z zx+%~SLLxiKJzmP0oai2Qr>FTlM!&eV`e~K|YT>;1E)8%Eu z0daI9xgzE70y{k<^5o&Tj+hvHiQE;iPqC}064trA&*mS~g13TlbC9FL9Un5*LHc1R zhtLP7jk%l{Tqen*6CKt|i-u-T7s!u}<#fLm$dB~L^yN2+#(&4hZphmYgr+sYNI6X+ zYy=_>frza5)deCxXicf8hJ4E|B5eqcozW&TQb|H!?sI8b6-e;GD*m5o&%SR|Cwp=& zC-M=_@J~d(iE;d$$Q?lB**Qt>aet@sL8Y=HsoVV1sQ!`4p1`3nmCHb6qHMNs3?YFi zo+_fa<*-fOFKEus$I&1;sGSrtj(k#3n*<`?fj@F$pj5ybohVrYi-z1Gc%Se<($wLHGy$O87|%;X!lZ zcw36&YVV$0+cd0g0thKR&g_XDKVhP6T=;gj@B$QCV6Yx1yDFal3Un10@8jQ-H5S+i z`it9a{jn>e8+@nXGsOkda@Pd7019ST=NEJxjJB-NI0COoqR_JnMqZ`K{`M~4pQtSck3JxHRLL_R=7`j z96o1(O?Yzb@*y0KaTlaYSg$S`;g73#%2y@d_+xa);2S>)9blyLUVG*N$>%)il$$x^ z-|V3;hh`7RfFCvUAkv6vDR5$KU@1mpuS}s#UcngolVCC(#BIl8BYcrP?Gazvy%VZ1 z4fz23Kli6F#-NjM`2Y$k3WUdvb#!jeJO#pFbiwfGPLbY?v&${{Pjp2pRPFRHf;a1i z`#eRn?I%}!6{{GM*jhMOaZfAkb>a=*v6r6DXnoCc#fg(k`J6-k5su&7?B49y^ES`B zP~R9g9Regd$>02?i1Vo7NBb*dIEFDeGjEN+-E_Qh$orh~9=Pr=L61CV%UfBDsVv$l)8sH;c{;G)F_=%{EEC=+Pj=@YvuyM`k~^@dcyD zFw%clUrGMPDOdBFOaKClbO2@Mil%${Ogwigrv`iy(sETm1O5kk_2>b@2Ucwi$1@g< z`iVx=MUq49(FJjxq>1Ah6&^a?XuOz|1(B(IufYGFnIsFYaA%RlBWtgBfpQZ^wI7Eo#lhFFYW8GdUq&h^}VfqKPG|IYB{ zD8no8{AGMSJKh;zV~ucyrsMnDD>1%tgn{!jMt=cv8oI zv3Zinj)^FnjM<$GQ)e)&VblIz@3O%Ev`)Iy^?P zP_SU-e^jt!NWkOB&(6VumWsepWX=p*B^2z)|3SfS#vhn75}7lS_0Xagq+Qpdlc3ya zl>CE|3>zqXtpE!h>3TbCm^}M@b9EBy_e!j1KCB@u@3llLS$m{o-F!3n}Amw1|jGRQqe1qBFN zo}=Q$BC0MAYTUC`S+2P;ZX+($B5Zj$akweWt-&0g1A?N*w%J(R3bQx9Y-DAnoml3L zuORb9xCbFKpI?Ez0nkG51PzOLV#iuUQ2Adl$I`%YogN=0dE8{jHTq{iYOYRBU4!kz zS~@tn?W%x{p9nL0B0MPU`B&$+4!W@={x<@i!#>-DBP{hbQ!`n=r9WyoUz^@~9MuQ{ zP`F0%VYc(N4h9vxEO5xt7QHziewkf-?Jf_l{eeT9Y!JluCs#fW`Vl#KB0>Va9rwYr zq4M6iB1Hh)Lb5e&%Q)%gX05^2KZxP2yH2! z{rkJP63AheN}0D-N2ZC;0Lgnn?Y=DepGX3n?S$p($ec1YPGp78>M|Wo%_45Vib8;l z@}UsYQ20;?JT_p%v+Wz%aK3P~9GC5pE3Ofz7)sy{6wHX=o+Vyl4MRy+6cLJ;>z&kH znL1RC-mF#Z?Ke`p>|YpDl@~ML6soXUYZleR0@AG3;Qs9Q^3X^+EtwCt%|cwwes=MV zM2{Og3KZlb6bj%_1yM_q%xJtg-vkfh$Y(y#h8_Y*kudSEa{kr?5pJmdw^pU|f!SXh zu0um%drAIh=A*?GjoRaiE_Ng)#;$f~9}XI?Xf&>tlsBzjqkS0dgPLBoWor@>k)(0J zvXi{OsomAVp_ap9=>8FEoX~7QM2pGWkhHi(u_HP$)<47)Y;C)pH~EL02B7k?l4t@1 z4GUTwT|gppzK7_I^$~+pPw}-0Oo*~P7K-HoX{lJx4vH{xfCl)?&P3(>EH`&G;-5y_z zIKo?@54nMy79IIIbfqju1S|kLPlVk-%0fAy%bh-LYNc}f{|F3z!b6hFsQ*Uav< z?6_~2!w2y1G%zb%aavwS&?7K#1@ZhWI6Zu#Ikk|>$O0+Vzk&;u?h>#OSSTM#&iM<{ z*+?UTHox9KR10;|efCberr{j>?wt(JbM1g94*9YaWKRiCeKX0oipEFWoCSBRkV4zwd{ptv zB&1<$gNR}Wi*A+MpW@;dd@5_nO;J414R4Ri?SKkctAFH=PK!}&TvCxGXeLJnn1um5~w4k z1pz|5cYF6Hq93%zRMa5@m6ob}nO^|)EGOiK(iCvlSg?Y_-|Z*hnI|JM>`VWH>YQvt z$tc$Dy~K9iFb=~O-0GUXT#+j&C=mL|+TiZa#=X}bQF{CNGHfvdKj9T=7;qVaNW=B_ zfNUhOM!Ji0R9i%eC?xJiA}mgW8ae2DNEe6(Epk#H zfk((t`UfC_^#WJ_4tdBtQqNURL^~n?b{uGI+es_N;ZMo6SNt65jM$5XXvuqAR#dKEh57V9L!vCZT(Rk(3nC;wkz}4EGry?z5%RCmXaWFY?XD;Nm~@Y>Fpj^dp&X zxuWd54JEH(B5}!Oc3w`FDMo`}=0(nyDH z!MzDxmWL9!Zs>&x`@4fQQ{=gEjg;VqS%-l8@Bu(~hlhZmi2#DuH~~gW3pR-4UwIZS z(G1qgRXgIvBJfc;^5d(pD3y%j1&1Ae=uyJ@{{%b1<8{aJBIqlEF7B*c_U=cqo;V(T zrcpH0hyyz?pW6q55Oz7lD`$W!;fo{vpb_$FS-5?ai1pV65RBGx{Ic;v30gOA3{ zHP3gqCRfJmqC!1{PbOa4KF5j_$IPXlApx`pOF4a#@W$1bd$u0{MF@Pl0`)p<3P6p< zYeVS@fyRDLpNfLh1prUrb#NX+8x1A&2@~OXwaazSWtaQQ-Eao2FTHSGQg8gdf7aGW^Iy_gkz8aGl( zKa^Yc2&(PnujAwk<$CTyJNb`lRae3XFaAV6n82qJIC#1geJ=kd|3N=uPU;9wpvq4( zG}=Av!l#ooCw^kXKkJe64z!k~*6xcO#1l}*F2@WaAB@d`XgdD{HNWqeKn34}Xbe(w ze}>f){E2<|S@PYTDxqt68S20Ystf!MAJy%X3d;!yj;vWyIEDw8)J-|}=$7J2GZZeD zVj;$tnzPg{?GEC?#zP}E|Ngk>?Gj4-BO3VGA6e1nE}EsS*%O-wYkvQc9oQ_j`C=gk z?X8w1>n-FvaVZtwXB1mZU>HI>8QA{g8gfYDLMWWbh3O()+Rxdksvc!>zDS0 zdT8E-y}l(agWrW?n(|zq_7oBbd<|A?gLS9kiD(D6$ZDzR5aRfEXRz~IlJ#FKpu=ua z@|-Bqytsh%+}b{AG8!-Z7i1EZg$Ff`4RVt#J7Hc{a zCsk1NMMVSawk@$=R82|U9P=kFq3K&&II12Rz&Yk_9lRJlTt=T-Q$T|2X-+q!Cw z&S!6J8_>K4>&Y;BU`1DUVVgPj-AAaJtE(h`i4OgpSo`gZHF2HTbKAS9pJaQsXO8bS zpIDE>&x)`zgzH3uaYM!}C=IJClVNiWVrNbvm`CG|Dt4U8&JFhTUW;(wMQL5IqbQQ9 z^G;%0K6-))DkKsST7~=a-_Y<`;OZg|*`#ahi zex&WA9AhQEZNUxf=#Ks#lTidozAjAGktUoI$15dFDak-dj8d{fDS-{B*C-_qD<#<| zX^0bWrYa@5DEUn(8L5qWLJ|N{LY^S%Q+2N=bw$k&D3v zC_JPT{)WLzvMkI{tA3ACcw8wIHiT8bMJe1vh2b+QBEW2M#Kl^E(cGg}YP=+xjno19 z)iz=@Ym|~$lw43s9#cvtp(I^tHAg8aL`jlTGJ#4&Pr@R&bE1pW0e|En5s`aY+J>p5 ze`!*$^h@GXsKc+)9e7-Th~_k>a8FBq1Ri1Wo>w;bu%W{z+w8S3(mgBCTJn#~mcQX- z-1yyE`6%-9`5f^=J_t(T?(bwJmj&VBAAf_7q^vCGBFmrrPNWgGrs7^DEh1VLQ`#>V zq8z}J6aed$9GRGScTkNpHbB1#HbXWGnhd#%N{$>O)Yoas%JN2JxmkfvUs~mfN_rEe zW0W*SCUKQWlP?2@Ut*}!l=IAQzouU3t66fHm{#l{6OgIlv!P3bT`0-IzQXt7hU%n|%K9^5{RfovqjQi01CFpDU3t|~u%7NjUuVa7iG#lo^k)oUjMpbuW^lKBX_mWJ3khkWTG{p1`YUdbwphq)^8i$_gfmF2qkD)t@_~y)bm!xVqu@4 zdc$$>1fw33clEvOyBXiXjK`D3DLOTK`fUJqB%W^ptk z8z7sghL%q{%3ANvi0zIFFs@Oaf}P=AE7*wL9R_77U)S|(L%@Vq6gJTb@`@?wSm^y< z#9;UGufHMa%E>f=XbTW^#q6EkD>Uo$tXt(M;}2xL`L_~RDZ6Z0dsNTXR>t*v?XYm< z88?|oY#!hlG-mmjay{(?UeXjJv{USGVM2?LlhI$X6O|)0J)&9XJwrV$#?vR7!&eDR(_wXX{3jR3dPp_;Mku$Ke=&B@^C~nQo5@^HXbB_)g??I04 zN)GW)+Jstpz}|2C6XrMH@RhLEyC_A+aYReDnolWhBTm9l5Hflcc*NsS<6XuHIv@xe zR@tf&fm#sXSgfRsq#%m0d8`3M6H`mXT8_Vc&$2s&3CQs)93RSx8PRy5vbCsN?&^iu z$EpZ+`pb4%M7v-&RDTiGgIke!8VQhaTP_AKB7{Yh=Jk=QJ|{x6ee+D%1~$eC(%s4V z7}d5E)P}AuL>gnCiU(Jbpn@8Y$8waaE5JMo*I;i~3PiSc)TqjDvk^QO0QKJ|gb@oP z0|~(K16Du7ZIK=A~q`TqshlDHE}^bQ zLb-&xk)X8(G(HVrz!6O^p$0Jmg5;e+)rGEtT4sayB(Y6Z23sEih2}P$QhuWuk8N=T z>@vwDQ0D)CZd175YS*5JJ7=T72)#`(uaSrFSXj zM5n~|DwAJQ>+X?(K&4ag&x`nkTKHfnehU<7Q;5dibo_8d#IK#wmhG$^de_f&WNF7> zI56dHWZ|^nvOq`Cc7_jsfFFpQtsf<`ZeOKnLZjKpuhNsd5;T0F(WfOWakr6{6s&=c zZ?$EA>UbE*BYU0x`P#z1F zhYOEJ2fC@zbBU%n=*hQS$ZJ0r-%i+!@6@?)CUH&UYVW-k>2i3lHFG6+ujyPvyw{># z1HIP_E}h>Ngkx&)GH*a*DEScGdIOP$67UWZ%?%|_tMVw-%uw=gD!Qh2xnK=JMymMg zY7*AuNpUCAeu<7nQI2^*WQ=Vpee(vY5Nx5ZU%=pXnmN?ALVo{+Ny1a!wpHy)=(jJjdqrED!KZ@_U zph*V)69iYPj=b0JdZ#)fWH*mHux%asq>GD z;0w^9(skWt&=5C2;yk!>a7+U0Mnjgbm1O+?0d#Ol3(qxKmg3}!3a)=k?HVOlm?IDd zq`gv6?rve&{$uol$dD%3kFHA<S;=r{|e$$d@Z03)rEwYcxa+m z2i7t0*TM3Vr|H4voizpio&er1w9A)p2?OYjuToaln0PQnk#-0k4u5a43bW~35ha2V zfdfsMBqtF5?VI3lY>IzNfxj+<8#M-8#MvRq6CoK8;UY(|4F_`Dy@a_4zKtNEYhVT9 za-uG{ybxcmoL2eNK}r2Jvmb2dX$;hbAd>AMm7vf_P{=h*wq`!A^A_R5vGPK2ngyS@ z0^{uE@gTEYL%|Z*EUidWsjLmI7WLkdaj{rX!B+CnxC*WT0k!qsqPUyn7jINBq)n$o z0NmE)k{xlCEvWe3Kn&~^en0+TX|@+Yq5%Z<^j<+`Y?GQ{n}nBimoY-|bS(~Qh5pG(M1+hPoW(MlUdn3_}owZ(t*F1sd&D-(! z)?hzDAi676kp){sjrxu0n-h?RJr?J&T(F1ZC@FT&P?C*y;;MfSByzL6x?5rEU?_pZ zN;TWpC4lV!Ok>=)A@|(p+X;Uh7_C?mLx;@n4zP~A=$T>;#b?v_41swKhyf^44dh+U zThxWSE7|bP44%zV_-`||p#+^F=u?SQXpB0ND*_+mjbStHM2y47h-%skhtu8S$Rtm; z>ueCx%X`?YmzH*w?J)?bDLnxbaXWd-pf!a+B7YuFAfE!Avw#oqT`b%kveqvcl$-sq zNA1c6oS;|!(k8G_AcPwuL=`K8PQ(a`EXD8x-w~r3O39PJo58V(_*%uo8W>21v#(oe zE7^qH33MCz6mUltCA~@Ay{ms?Rkj5VVHq}g#qWc6Qo0U3UmF}I^ zi>@>TXF4+vtYxvs+IGY@0r!h~k1F-LHKKXd)xm)<$jk%ye@d9)SjWk!_K1@($QBxv zdyt}$S!wiZupM4vXp6D;Itqy;UPgsq3c_5pXWoJrY!T!cDkwBM1CLB;x#uVL{;{0A zSu{%PABZx@{7tg{wkT0lRL0;F6P$-XP8e*M3xU5*?@Jk$bLKJ*WO|^Mtt%5k8IiaM=rOe~Pcg1FYXPlm4 z$Hy++zXeUJBiocAgkv{sUVLSWtLaYHMYS8oS;!rcSJoQh%k8tnFn6~cRyHmvl^8pPZ(gSzv86 z{%hjabijMz@AK{;#!ht7IQFm|C$?+K_OQj@A5foR!++>%nhql3^D^#(dD#Y4fwr*-~0G|ir)_WcH>uz-$DGo#qT73zgDtg zr%V~W;N=Zlz}5eSLM;y#lFUDgnB#?)?eam=Att`(L-xd}C7!D7``ovuLI+p0{fi` zDfuwY(_CYv71!}WaMj}Ol7EOnvhH4tQ`~ZVY`mV&u>f6iiqhQ#GPU=saTBJQaExLt zf5qR0l}X=Qge`X4H(Eu$(JP`l{)Yk;eXuh_!B(QPWYcyO!lkpH4+WZp<6|fw^m9Q7 zaOzBi`H^NtA`A7tL5MqrTxDP!2wkU9@^uIhk%}6qF~xgrC-n15&$;fF^XF4xR}@+s z3{R38Zwh(j-$0Y*B&c%!9OXDW2Y?X_0?kK0)WDDU1961^s|;b-AXyDSf&=j-3BeqmQOlb8d&k~)m)fJ?H_oqF) zGy*1fOXF=uJKl4T2k)@n^Hf@*cDPJVL#gt^B!1>Q!vpEVcMf&(jr+ zchbEB_hECSGL$^d4*zVi-~TQMLLPa`iNHppZRrJ<78tn`_|u=>UPfJ>f$Sn~4SK`_ zD``<{zVJ>3-7{>|FJ?_wBXj-ICEAcgdIIj|mY=e>ei^1tWEX!KtLgd<%lkFGS!J*< z|Mf>U@7KiatzZUKFfK29*(v(wLVop~m}rDlB~YYF!zYT_Q-YeHv)@_GKYE*0{F

    Q-b$Ik!fiTEPA4YV!2#tKvTE* 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