This is page 30 of 168. Use http://codebase.md/romanshablio/mcp_server?lines=true&page={x} to view the full context.
# Directory Structure
```
├── .DS_Store
├── .venv
│ ├── __pycache__
│ │ └── hello.cpython-312.pyc
│ ├── bin
│ │ ├── activate
│ │ ├── activate.csh
│ │ ├── activate.fish
│ │ ├── Activate.ps1
│ │ ├── flask
│ │ ├── normalizer
│ │ ├── pip
│ │ ├── pip3
│ │ ├── pip3.12
│ │ ├── python
│ │ ├── python3
│ │ └── python3.12
│ ├── hello.py
│ ├── lib
│ │ └── python3.12
│ │ └── site-packages
│ │ ├── beautifulsoup4-4.12.3.dist-info
│ │ │ ├── INSTALLER
│ │ │ ├── licenses
│ │ │ │ ├── AUTHORS
│ │ │ │ └── LICENSE
│ │ │ ├── METADATA
│ │ │ ├── RECORD
│ │ │ ├── REQUESTED
│ │ │ └── WHEEL
│ │ ├── blinker
│ │ │ ├── __init__.py
│ │ │ ├── __pycache__
│ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ ├── _utilities.cpython-312.pyc
│ │ │ │ └── base.cpython-312.pyc
│ │ │ ├── _utilities.py
│ │ │ ├── base.py
│ │ │ └── py.typed
│ │ ├── blinker-1.8.2.dist-info
│ │ │ ├── INSTALLER
│ │ │ ├── LICENSE.txt
│ │ │ ├── METADATA
│ │ │ ├── RECORD
│ │ │ └── WHEEL
│ │ ├── bs4
│ │ │ ├── __init__.py
│ │ │ ├── __pycache__
│ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ ├── css.cpython-312.pyc
│ │ │ │ ├── dammit.cpython-312.pyc
│ │ │ │ ├── diagnose.cpython-312.pyc
│ │ │ │ ├── element.cpython-312.pyc
│ │ │ │ └── formatter.cpython-312.pyc
│ │ │ ├── builder
│ │ │ │ ├── __init__.py
│ │ │ │ ├── __pycache__
│ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ ├── _html5lib.cpython-312.pyc
│ │ │ │ │ ├── _htmlparser.cpython-312.pyc
│ │ │ │ │ └── _lxml.cpython-312.pyc
│ │ │ │ ├── _html5lib.py
│ │ │ │ ├── _htmlparser.py
│ │ │ │ └── _lxml.py
│ │ │ ├── css.py
│ │ │ ├── dammit.py
│ │ │ ├── diagnose.py
│ │ │ ├── element.py
│ │ │ ├── formatter.py
│ │ │ └── tests
│ │ │ ├── __init__.py
│ │ │ ├── __pycache__
│ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ ├── test_builder_registry.cpython-312.pyc
│ │ │ │ ├── test_builder.cpython-312.pyc
│ │ │ │ ├── test_css.cpython-312.pyc
│ │ │ │ ├── test_dammit.cpython-312.pyc
│ │ │ │ ├── test_docs.cpython-312.pyc
│ │ │ │ ├── test_element.cpython-312.pyc
│ │ │ │ ├── test_formatter.cpython-312.pyc
│ │ │ │ ├── test_fuzz.cpython-312.pyc
│ │ │ │ ├── test_html5lib.cpython-312.pyc
│ │ │ │ ├── test_htmlparser.cpython-312.pyc
│ │ │ │ ├── test_lxml.cpython-312.pyc
│ │ │ │ ├── test_navigablestring.cpython-312.pyc
│ │ │ │ ├── test_pageelement.cpython-312.pyc
│ │ │ │ ├── test_soup.cpython-312.pyc
│ │ │ │ ├── test_tag.cpython-312.pyc
│ │ │ │ └── test_tree.cpython-312.pyc
│ │ │ ├── fuzz
│ │ │ │ ├── clusterfuzz-testcase-minimized-bs4_fuzzer-4670634698080256.testcase
│ │ │ │ ├── clusterfuzz-testcase-minimized-bs4_fuzzer-4818336571064320.testcase
│ │ │ │ ├── clusterfuzz-testcase-minimized-bs4_fuzzer-4999465949331456.testcase
│ │ │ │ ├── clusterfuzz-testcase-minimized-bs4_fuzzer-5000587759190016.testcase
│ │ │ │ ├── clusterfuzz-testcase-minimized-bs4_fuzzer-5167584867909632.testcase
│ │ │ │ ├── clusterfuzz-testcase-minimized-bs4_fuzzer-5270998950477824.testcase
│ │ │ │ ├── clusterfuzz-testcase-minimized-bs4_fuzzer-5375146639360000.testcase
│ │ │ │ ├── clusterfuzz-testcase-minimized-bs4_fuzzer-5492400320282624.testcase
│ │ │ │ ├── clusterfuzz-testcase-minimized-bs4_fuzzer-5703933063462912.testcase
│ │ │ │ ├── clusterfuzz-testcase-minimized-bs4_fuzzer-5843991618256896.testcase
│ │ │ │ ├── clusterfuzz-testcase-minimized-bs4_fuzzer-5984173902397440.testcase
│ │ │ │ ├── clusterfuzz-testcase-minimized-bs4_fuzzer-6124268085182464.testcase
│ │ │ │ ├── clusterfuzz-testcase-minimized-bs4_fuzzer-6241471367348224.testcase
│ │ │ │ ├── clusterfuzz-testcase-minimized-bs4_fuzzer-6306874195312640.testcase
│ │ │ │ ├── clusterfuzz-testcase-minimized-bs4_fuzzer-6450958476902400.testcase
│ │ │ │ ├── clusterfuzz-testcase-minimized-bs4_fuzzer-6600557255327744.testcase
│ │ │ │ ├── crash-0d306a50c8ed8bcd0785b67000fcd5dea1d33f08.testcase
│ │ │ │ └── crash-ffbdfa8a2b26f13537b68d3794b0478a4090ee4a.testcase
│ │ │ ├── test_builder_registry.py
│ │ │ ├── test_builder.py
│ │ │ ├── test_css.py
│ │ │ ├── test_dammit.py
│ │ │ ├── test_docs.py
│ │ │ ├── test_element.py
│ │ │ ├── test_formatter.py
│ │ │ ├── test_fuzz.py
│ │ │ ├── test_html5lib.py
│ │ │ ├── test_htmlparser.py
│ │ │ ├── test_lxml.py
│ │ │ ├── test_navigablestring.py
│ │ │ ├── test_pageelement.py
│ │ │ ├── test_soup.py
│ │ │ ├── test_tag.py
│ │ │ └── test_tree.py
│ │ ├── certifi
│ │ │ ├── __init__.py
│ │ │ ├── __main__.py
│ │ │ ├── __pycache__
│ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ ├── __main__.cpython-312.pyc
│ │ │ │ └── core.cpython-312.pyc
│ │ │ ├── cacert.pem
│ │ │ ├── core.py
│ │ │ └── py.typed
│ │ ├── certifi-2024.8.30.dist-info
│ │ │ ├── INSTALLER
│ │ │ ├── LICENSE
│ │ │ ├── METADATA
│ │ │ ├── RECORD
│ │ │ ├── top_level.txt
│ │ │ └── WHEEL
│ │ ├── charset_normalizer
│ │ │ ├── __init__.py
│ │ │ ├── __main__.py
│ │ │ ├── __pycache__
│ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ ├── __main__.cpython-312.pyc
│ │ │ │ ├── api.cpython-312.pyc
│ │ │ │ ├── cd.cpython-312.pyc
│ │ │ │ ├── constant.cpython-312.pyc
│ │ │ │ ├── legacy.cpython-312.pyc
│ │ │ │ ├── md.cpython-312.pyc
│ │ │ │ ├── models.cpython-312.pyc
│ │ │ │ ├── utils.cpython-312.pyc
│ │ │ │ └── version.cpython-312.pyc
│ │ │ ├── api.py
│ │ │ ├── cd.py
│ │ │ ├── cli
│ │ │ │ ├── __init__.py
│ │ │ │ ├── __main__.py
│ │ │ │ └── __pycache__
│ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ └── __main__.cpython-312.pyc
│ │ │ ├── constant.py
│ │ │ ├── legacy.py
│ │ │ ├── md__mypyc.cpython-312-darwin.so
│ │ │ ├── md.cpython-312-darwin.so
│ │ │ ├── md.py
│ │ │ ├── models.py
│ │ │ ├── py.typed
│ │ │ ├── utils.py
│ │ │ └── version.py
│ │ ├── charset_normalizer-3.4.0.dist-info
│ │ │ ├── entry_points.txt
│ │ │ ├── INSTALLER
│ │ │ ├── LICENSE
│ │ │ ├── METADATA
│ │ │ ├── RECORD
│ │ │ ├── top_level.txt
│ │ │ └── WHEEL
│ │ ├── click
│ │ │ ├── __init__.py
│ │ │ ├── __pycache__
│ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ ├── _compat.cpython-312.pyc
│ │ │ │ ├── _termui_impl.cpython-312.pyc
│ │ │ │ ├── _textwrap.cpython-312.pyc
│ │ │ │ ├── _winconsole.cpython-312.pyc
│ │ │ │ ├── core.cpython-312.pyc
│ │ │ │ ├── decorators.cpython-312.pyc
│ │ │ │ ├── exceptions.cpython-312.pyc
│ │ │ │ ├── formatting.cpython-312.pyc
│ │ │ │ ├── globals.cpython-312.pyc
│ │ │ │ ├── parser.cpython-312.pyc
│ │ │ │ ├── shell_completion.cpython-312.pyc
│ │ │ │ ├── termui.cpython-312.pyc
│ │ │ │ ├── testing.cpython-312.pyc
│ │ │ │ ├── types.cpython-312.pyc
│ │ │ │ └── utils.cpython-312.pyc
│ │ │ ├── _compat.py
│ │ │ ├── _termui_impl.py
│ │ │ ├── _textwrap.py
│ │ │ ├── _winconsole.py
│ │ │ ├── core.py
│ │ │ ├── decorators.py
│ │ │ ├── exceptions.py
│ │ │ ├── formatting.py
│ │ │ ├── globals.py
│ │ │ ├── parser.py
│ │ │ ├── py.typed
│ │ │ ├── shell_completion.py
│ │ │ ├── termui.py
│ │ │ ├── testing.py
│ │ │ ├── types.py
│ │ │ └── utils.py
│ │ ├── click-8.1.7.dist-info
│ │ │ ├── INSTALLER
│ │ │ ├── LICENSE.rst
│ │ │ ├── METADATA
│ │ │ ├── RECORD
│ │ │ ├── top_level.txt
│ │ │ └── WHEEL
│ │ ├── fake_useragent
│ │ │ ├── __init__.py
│ │ │ ├── __pycache__
│ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ ├── errors.cpython-312.pyc
│ │ │ │ ├── fake.cpython-312.pyc
│ │ │ │ ├── log.cpython-312.pyc
│ │ │ │ ├── settings.cpython-312.pyc
│ │ │ │ └── utils.cpython-312.pyc
│ │ │ ├── data
│ │ │ │ └── browsers.json
│ │ │ ├── errors.py
│ │ │ ├── fake.py
│ │ │ ├── log.py
│ │ │ ├── settings.py
│ │ │ └── utils.py
│ │ ├── fake_useragent-1.5.1.dist-info
│ │ │ ├── AUTHORS
│ │ │ ├── INSTALLER
│ │ │ ├── LICENSE
│ │ │ ├── METADATA
│ │ │ ├── RECORD
│ │ │ ├── REQUESTED
│ │ │ ├── top_level.txt
│ │ │ └── WHEEL
│ │ ├── flask
│ │ │ ├── __init__.py
│ │ │ ├── __main__.py
│ │ │ ├── __pycache__
│ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ ├── __main__.cpython-312.pyc
│ │ │ │ ├── app.cpython-312.pyc
│ │ │ │ ├── blueprints.cpython-312.pyc
│ │ │ │ ├── cli.cpython-312.pyc
│ │ │ │ ├── config.cpython-312.pyc
│ │ │ │ ├── ctx.cpython-312.pyc
│ │ │ │ ├── debughelpers.cpython-312.pyc
│ │ │ │ ├── globals.cpython-312.pyc
│ │ │ │ ├── helpers.cpython-312.pyc
│ │ │ │ ├── logging.cpython-312.pyc
│ │ │ │ ├── sessions.cpython-312.pyc
│ │ │ │ ├── signals.cpython-312.pyc
│ │ │ │ ├── templating.cpython-312.pyc
│ │ │ │ ├── testing.cpython-312.pyc
│ │ │ │ ├── typing.cpython-312.pyc
│ │ │ │ ├── views.cpython-312.pyc
│ │ │ │ └── wrappers.cpython-312.pyc
│ │ │ ├── app.py
│ │ │ ├── blueprints.py
│ │ │ ├── cli.py
│ │ │ ├── config.py
│ │ │ ├── ctx.py
│ │ │ ├── debughelpers.py
│ │ │ ├── globals.py
│ │ │ ├── helpers.py
│ │ │ ├── json
│ │ │ │ ├── __init__.py
│ │ │ │ ├── __pycache__
│ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ ├── provider.cpython-312.pyc
│ │ │ │ │ └── tag.cpython-312.pyc
│ │ │ │ ├── provider.py
│ │ │ │ └── tag.py
│ │ │ ├── logging.py
│ │ │ ├── py.typed
│ │ │ ├── sansio
│ │ │ │ ├── __pycache__
│ │ │ │ │ ├── app.cpython-312.pyc
│ │ │ │ │ ├── blueprints.cpython-312.pyc
│ │ │ │ │ └── scaffold.cpython-312.pyc
│ │ │ │ ├── app.py
│ │ │ │ ├── blueprints.py
│ │ │ │ ├── README.md
│ │ │ │ └── scaffold.py
│ │ │ ├── sessions.py
│ │ │ ├── signals.py
│ │ │ ├── templating.py
│ │ │ ├── testing.py
│ │ │ ├── typing.py
│ │ │ ├── views.py
│ │ │ └── wrappers.py
│ │ ├── flask-3.0.3.dist-info
│ │ │ ├── entry_points.txt
│ │ │ ├── INSTALLER
│ │ │ ├── LICENSE.txt
│ │ │ ├── METADATA
│ │ │ ├── RECORD
│ │ │ ├── REQUESTED
│ │ │ └── WHEEL
│ │ ├── idna
│ │ │ ├── __init__.py
│ │ │ ├── __pycache__
│ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ ├── codec.cpython-312.pyc
│ │ │ │ ├── compat.cpython-312.pyc
│ │ │ │ ├── core.cpython-312.pyc
│ │ │ │ ├── idnadata.cpython-312.pyc
│ │ │ │ ├── intranges.cpython-312.pyc
│ │ │ │ ├── package_data.cpython-312.pyc
│ │ │ │ └── uts46data.cpython-312.pyc
│ │ │ ├── codec.py
│ │ │ ├── compat.py
│ │ │ ├── core.py
│ │ │ ├── idnadata.py
│ │ │ ├── intranges.py
│ │ │ ├── package_data.py
│ │ │ ├── py.typed
│ │ │ └── uts46data.py
│ │ ├── idna-3.10.dist-info
│ │ │ ├── INSTALLER
│ │ │ ├── LICENSE.md
│ │ │ ├── METADATA
│ │ │ ├── RECORD
│ │ │ └── WHEEL
│ │ ├── itsdangerous
│ │ │ ├── __init__.py
│ │ │ ├── __pycache__
│ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ ├── _json.cpython-312.pyc
│ │ │ │ ├── encoding.cpython-312.pyc
│ │ │ │ ├── exc.cpython-312.pyc
│ │ │ │ ├── serializer.cpython-312.pyc
│ │ │ │ ├── signer.cpython-312.pyc
│ │ │ │ ├── timed.cpython-312.pyc
│ │ │ │ └── url_safe.cpython-312.pyc
│ │ │ ├── _json.py
│ │ │ ├── encoding.py
│ │ │ ├── exc.py
│ │ │ ├── py.typed
│ │ │ ├── serializer.py
│ │ │ ├── signer.py
│ │ │ ├── timed.py
│ │ │ └── url_safe.py
│ │ ├── itsdangerous-2.2.0.dist-info
│ │ │ ├── INSTALLER
│ │ │ ├── LICENSE.txt
│ │ │ ├── METADATA
│ │ │ ├── RECORD
│ │ │ └── WHEEL
│ │ ├── jinja2
│ │ │ ├── __init__.py
│ │ │ ├── __pycache__
│ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ ├── _identifier.cpython-312.pyc
│ │ │ │ ├── async_utils.cpython-312.pyc
│ │ │ │ ├── bccache.cpython-312.pyc
│ │ │ │ ├── compiler.cpython-312.pyc
│ │ │ │ ├── constants.cpython-312.pyc
│ │ │ │ ├── debug.cpython-312.pyc
│ │ │ │ ├── defaults.cpython-312.pyc
│ │ │ │ ├── environment.cpython-312.pyc
│ │ │ │ ├── exceptions.cpython-312.pyc
│ │ │ │ ├── ext.cpython-312.pyc
│ │ │ │ ├── filters.cpython-312.pyc
│ │ │ │ ├── idtracking.cpython-312.pyc
│ │ │ │ ├── lexer.cpython-312.pyc
│ │ │ │ ├── loaders.cpython-312.pyc
│ │ │ │ ├── meta.cpython-312.pyc
│ │ │ │ ├── nativetypes.cpython-312.pyc
│ │ │ │ ├── nodes.cpython-312.pyc
│ │ │ │ ├── optimizer.cpython-312.pyc
│ │ │ │ ├── parser.cpython-312.pyc
│ │ │ │ ├── runtime.cpython-312.pyc
│ │ │ │ ├── sandbox.cpython-312.pyc
│ │ │ │ ├── tests.cpython-312.pyc
│ │ │ │ ├── utils.cpython-312.pyc
│ │ │ │ └── visitor.cpython-312.pyc
│ │ │ ├── _identifier.py
│ │ │ ├── async_utils.py
│ │ │ ├── bccache.py
│ │ │ ├── compiler.py
│ │ │ ├── constants.py
│ │ │ ├── debug.py
│ │ │ ├── defaults.py
│ │ │ ├── environment.py
│ │ │ ├── exceptions.py
│ │ │ ├── ext.py
│ │ │ ├── filters.py
│ │ │ ├── idtracking.py
│ │ │ ├── lexer.py
│ │ │ ├── loaders.py
│ │ │ ├── meta.py
│ │ │ ├── nativetypes.py
│ │ │ ├── nodes.py
│ │ │ ├── optimizer.py
│ │ │ ├── parser.py
│ │ │ ├── py.typed
│ │ │ ├── runtime.py
│ │ │ ├── sandbox.py
│ │ │ ├── tests.py
│ │ │ ├── utils.py
│ │ │ └── visitor.py
│ │ ├── jinja2-3.1.4.dist-info
│ │ │ ├── entry_points.txt
│ │ │ ├── INSTALLER
│ │ │ ├── LICENSE.txt
│ │ │ ├── METADATA
│ │ │ ├── RECORD
│ │ │ └── WHEEL
│ │ ├── lxml
│ │ │ ├── __init__.py
│ │ │ ├── __pycache__
│ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ ├── _elementpath.cpython-312.pyc
│ │ │ │ ├── builder.cpython-312.pyc
│ │ │ │ ├── cssselect.cpython-312.pyc
│ │ │ │ ├── doctestcompare.cpython-312.pyc
│ │ │ │ ├── ElementInclude.cpython-312.pyc
│ │ │ │ ├── pyclasslookup.cpython-312.pyc
│ │ │ │ ├── sax.cpython-312.pyc
│ │ │ │ └── usedoctest.cpython-312.pyc
│ │ │ ├── _elementpath.cpython-312-darwin.so
│ │ │ ├── _elementpath.py
│ │ │ ├── apihelpers.pxi
│ │ │ ├── builder.cpython-312-darwin.so
│ │ │ ├── builder.py
│ │ │ ├── classlookup.pxi
│ │ │ ├── cleanup.pxi
│ │ │ ├── cssselect.py
│ │ │ ├── debug.pxi
│ │ │ ├── docloader.pxi
│ │ │ ├── doctestcompare.py
│ │ │ ├── dtd.pxi
│ │ │ ├── ElementInclude.py
│ │ │ ├── etree_api.h
│ │ │ ├── etree.cpython-312-darwin.so
│ │ │ ├── etree.h
│ │ │ ├── etree.pyx
│ │ │ ├── extensions.pxi
│ │ │ ├── html
│ │ │ │ ├── __init__.py
│ │ │ │ ├── __pycache__
│ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ ├── _diffcommand.cpython-312.pyc
│ │ │ │ │ ├── _html5builder.cpython-312.pyc
│ │ │ │ │ ├── _setmixin.cpython-312.pyc
│ │ │ │ │ ├── builder.cpython-312.pyc
│ │ │ │ │ ├── clean.cpython-312.pyc
│ │ │ │ │ ├── defs.cpython-312.pyc
│ │ │ │ │ ├── diff.cpython-312.pyc
│ │ │ │ │ ├── ElementSoup.cpython-312.pyc
│ │ │ │ │ ├── formfill.cpython-312.pyc
│ │ │ │ │ ├── html5parser.cpython-312.pyc
│ │ │ │ │ ├── soupparser.cpython-312.pyc
│ │ │ │ │ └── usedoctest.cpython-312.pyc
│ │ │ │ ├── _diffcommand.py
│ │ │ │ ├── _html5builder.py
│ │ │ │ ├── _setmixin.py
│ │ │ │ ├── builder.py
│ │ │ │ ├── clean.py
│ │ │ │ ├── defs.py
│ │ │ │ ├── diff.cpython-312-darwin.so
│ │ │ │ ├── diff.py
│ │ │ │ ├── ElementSoup.py
│ │ │ │ ├── formfill.py
│ │ │ │ ├── html5parser.py
│ │ │ │ ├── soupparser.py
│ │ │ │ └── usedoctest.py
│ │ │ ├── includes
│ │ │ │ ├── __init__.pxd
│ │ │ │ ├── __init__.py
│ │ │ │ ├── __pycache__
│ │ │ │ │ └── __init__.cpython-312.pyc
│ │ │ │ ├── c14n.pxd
│ │ │ │ ├── config.pxd
│ │ │ │ ├── dtdvalid.pxd
│ │ │ │ ├── etree_defs.h
│ │ │ │ ├── etreepublic.pxd
│ │ │ │ ├── extlibs
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ └── __init__.cpython-312.pyc
│ │ │ │ │ ├── libcharset.h
│ │ │ │ │ ├── localcharset.h
│ │ │ │ │ ├── zconf.h
│ │ │ │ │ └── zlib.h
│ │ │ │ ├── htmlparser.pxd
│ │ │ │ ├── libexslt
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ └── __init__.cpython-312.pyc
│ │ │ │ │ ├── exslt.h
│ │ │ │ │ ├── exsltconfig.h
│ │ │ │ │ └── exsltexports.h
│ │ │ │ ├── libxml
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ └── __init__.cpython-312.pyc
│ │ │ │ │ ├── c14n.h
│ │ │ │ │ ├── catalog.h
│ │ │ │ │ ├── chvalid.h
│ │ │ │ │ ├── debugXML.h
│ │ │ │ │ ├── dict.h
│ │ │ │ │ ├── encoding.h
│ │ │ │ │ ├── entities.h
│ │ │ │ │ ├── globals.h
│ │ │ │ │ ├── hash.h
│ │ │ │ │ ├── HTMLparser.h
│ │ │ │ │ ├── HTMLtree.h
│ │ │ │ │ ├── list.h
│ │ │ │ │ ├── nanoftp.h
│ │ │ │ │ ├── nanohttp.h
│ │ │ │ │ ├── parser.h
│ │ │ │ │ ├── parserInternals.h
│ │ │ │ │ ├── relaxng.h
│ │ │ │ │ ├── SAX.h
│ │ │ │ │ ├── SAX2.h
│ │ │ │ │ ├── schemasInternals.h
│ │ │ │ │ ├── schematron.h
│ │ │ │ │ ├── threads.h
│ │ │ │ │ ├── tree.h
│ │ │ │ │ ├── uri.h
│ │ │ │ │ ├── valid.h
│ │ │ │ │ ├── xinclude.h
│ │ │ │ │ ├── xlink.h
│ │ │ │ │ ├── xmlautomata.h
│ │ │ │ │ ├── xmlerror.h
│ │ │ │ │ ├── xmlexports.h
│ │ │ │ │ ├── xmlIO.h
│ │ │ │ │ ├── xmlmemory.h
│ │ │ │ │ ├── xmlmodule.h
│ │ │ │ │ ├── xmlreader.h
│ │ │ │ │ ├── xmlregexp.h
│ │ │ │ │ ├── xmlsave.h
│ │ │ │ │ ├── xmlschemas.h
│ │ │ │ │ ├── xmlschemastypes.h
│ │ │ │ │ ├── xmlstring.h
│ │ │ │ │ ├── xmlunicode.h
│ │ │ │ │ ├── xmlversion.h
│ │ │ │ │ ├── xmlwriter.h
│ │ │ │ │ ├── xpath.h
│ │ │ │ │ ├── xpathInternals.h
│ │ │ │ │ └── xpointer.h
│ │ │ │ ├── libxslt
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ └── __init__.cpython-312.pyc
│ │ │ │ │ ├── attributes.h
│ │ │ │ │ ├── documents.h
│ │ │ │ │ ├── extensions.h
│ │ │ │ │ ├── extra.h
│ │ │ │ │ ├── functions.h
│ │ │ │ │ ├── imports.h
│ │ │ │ │ ├── keys.h
│ │ │ │ │ ├── namespaces.h
│ │ │ │ │ ├── numbersInternals.h
│ │ │ │ │ ├── pattern.h
│ │ │ │ │ ├── preproc.h
│ │ │ │ │ ├── security.h
│ │ │ │ │ ├── templates.h
│ │ │ │ │ ├── transform.h
│ │ │ │ │ ├── variables.h
│ │ │ │ │ ├── xslt.h
│ │ │ │ │ ├── xsltconfig.h
│ │ │ │ │ ├── xsltexports.h
│ │ │ │ │ ├── xsltInternals.h
│ │ │ │ │ ├── xsltlocale.h
│ │ │ │ │ └── xsltutils.h
│ │ │ │ ├── lxml-version.h
│ │ │ │ ├── relaxng.pxd
│ │ │ │ ├── schematron.pxd
│ │ │ │ ├── tree.pxd
│ │ │ │ ├── uri.pxd
│ │ │ │ ├── xinclude.pxd
│ │ │ │ ├── xmlerror.pxd
│ │ │ │ ├── xmlparser.pxd
│ │ │ │ ├── xmlschema.pxd
│ │ │ │ ├── xpath.pxd
│ │ │ │ └── xslt.pxd
│ │ │ ├── isoschematron
│ │ │ │ ├── __init__.py
│ │ │ │ ├── __pycache__
│ │ │ │ │ └── __init__.cpython-312.pyc
│ │ │ │ └── resources
│ │ │ │ ├── rng
│ │ │ │ │ └── iso-schematron.rng
│ │ │ │ └── xsl
│ │ │ │ ├── iso-schematron-xslt1
│ │ │ │ │ ├── iso_abstract_expand.xsl
│ │ │ │ │ ├── iso_dsdl_include.xsl
│ │ │ │ │ ├── iso_schematron_message.xsl
│ │ │ │ │ ├── iso_schematron_skeleton_for_xslt1.xsl
│ │ │ │ │ ├── iso_svrl_for_xslt1.xsl
│ │ │ │ │ └── readme.txt
│ │ │ │ ├── RNG2Schtrn.xsl
│ │ │ │ └── XSD2Schtrn.xsl
│ │ │ ├── iterparse.pxi
│ │ │ ├── lxml.etree_api.h
│ │ │ ├── lxml.etree.h
│ │ │ ├── nsclasses.pxi
│ │ │ ├── objectify.cpython-312-darwin.so
│ │ │ ├── objectify.pyx
│ │ │ ├── objectpath.pxi
│ │ │ ├── parser.pxi
│ │ │ ├── parsertarget.pxi
│ │ │ ├── proxy.pxi
│ │ │ ├── public-api.pxi
│ │ │ ├── pyclasslookup.py
│ │ │ ├── readonlytree.pxi
│ │ │ ├── relaxng.pxi
│ │ │ ├── sax.cpython-312-darwin.so
│ │ │ ├── sax.py
│ │ │ ├── saxparser.pxi
│ │ │ ├── schematron.pxi
│ │ │ ├── serializer.pxi
│ │ │ ├── usedoctest.py
│ │ │ ├── xinclude.pxi
│ │ │ ├── xmlerror.pxi
│ │ │ ├── xmlid.pxi
│ │ │ ├── xmlschema.pxi
│ │ │ ├── xpath.pxi
│ │ │ ├── xslt.pxi
│ │ │ └── xsltext.pxi
│ │ ├── lxml-5.3.0.dist-info
│ │ │ ├── INSTALLER
│ │ │ ├── LICENSE.txt
│ │ │ ├── LICENSES.txt
│ │ │ ├── METADATA
│ │ │ ├── RECORD
│ │ │ ├── REQUESTED
│ │ │ ├── top_level.txt
│ │ │ └── WHEEL
│ │ ├── markupsafe
│ │ │ ├── __init__.py
│ │ │ ├── __pycache__
│ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ └── _native.cpython-312.pyc
│ │ │ ├── _native.py
│ │ │ ├── _speedups.c
│ │ │ ├── _speedups.cpython-312-darwin.so
│ │ │ ├── _speedups.pyi
│ │ │ └── py.typed
│ │ ├── MarkupSafe-3.0.1.dist-info
│ │ │ ├── INSTALLER
│ │ │ ├── LICENSE.txt
│ │ │ ├── METADATA
│ │ │ ├── RECORD
│ │ │ ├── top_level.txt
│ │ │ └── WHEEL
│ │ ├── pip
│ │ │ ├── __init__.py
│ │ │ ├── __main__.py
│ │ │ ├── __pip-runner__.py
│ │ │ ├── __pycache__
│ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ ├── __main__.cpython-312.pyc
│ │ │ │ └── __pip-runner__.cpython-312.pyc
│ │ │ ├── _internal
│ │ │ │ ├── __init__.py
│ │ │ │ ├── __pycache__
│ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ ├── build_env.cpython-312.pyc
│ │ │ │ │ ├── cache.cpython-312.pyc
│ │ │ │ │ ├── configuration.cpython-312.pyc
│ │ │ │ │ ├── exceptions.cpython-312.pyc
│ │ │ │ │ ├── main.cpython-312.pyc
│ │ │ │ │ ├── pyproject.cpython-312.pyc
│ │ │ │ │ ├── self_outdated_check.cpython-312.pyc
│ │ │ │ │ └── wheel_builder.cpython-312.pyc
│ │ │ │ ├── build_env.py
│ │ │ │ ├── cache.py
│ │ │ │ ├── cli
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── autocompletion.cpython-312.pyc
│ │ │ │ │ │ ├── base_command.cpython-312.pyc
│ │ │ │ │ │ ├── cmdoptions.cpython-312.pyc
│ │ │ │ │ │ ├── command_context.cpython-312.pyc
│ │ │ │ │ │ ├── index_command.cpython-312.pyc
│ │ │ │ │ │ ├── main_parser.cpython-312.pyc
│ │ │ │ │ │ ├── main.cpython-312.pyc
│ │ │ │ │ │ ├── parser.cpython-312.pyc
│ │ │ │ │ │ ├── progress_bars.cpython-312.pyc
│ │ │ │ │ │ ├── req_command.cpython-312.pyc
│ │ │ │ │ │ ├── spinners.cpython-312.pyc
│ │ │ │ │ │ └── status_codes.cpython-312.pyc
│ │ │ │ │ ├── autocompletion.py
│ │ │ │ │ ├── base_command.py
│ │ │ │ │ ├── cmdoptions.py
│ │ │ │ │ ├── command_context.py
│ │ │ │ │ ├── index_command.py
│ │ │ │ │ ├── main_parser.py
│ │ │ │ │ ├── main.py
│ │ │ │ │ ├── parser.py
│ │ │ │ │ ├── progress_bars.py
│ │ │ │ │ ├── req_command.py
│ │ │ │ │ ├── spinners.py
│ │ │ │ │ └── status_codes.py
│ │ │ │ ├── commands
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── cache.cpython-312.pyc
│ │ │ │ │ │ ├── check.cpython-312.pyc
│ │ │ │ │ │ ├── completion.cpython-312.pyc
│ │ │ │ │ │ ├── configuration.cpython-312.pyc
│ │ │ │ │ │ ├── debug.cpython-312.pyc
│ │ │ │ │ │ ├── download.cpython-312.pyc
│ │ │ │ │ │ ├── freeze.cpython-312.pyc
│ │ │ │ │ │ ├── hash.cpython-312.pyc
│ │ │ │ │ │ ├── help.cpython-312.pyc
│ │ │ │ │ │ ├── index.cpython-312.pyc
│ │ │ │ │ │ ├── inspect.cpython-312.pyc
│ │ │ │ │ │ ├── install.cpython-312.pyc
│ │ │ │ │ │ ├── list.cpython-312.pyc
│ │ │ │ │ │ ├── search.cpython-312.pyc
│ │ │ │ │ │ ├── show.cpython-312.pyc
│ │ │ │ │ │ ├── uninstall.cpython-312.pyc
│ │ │ │ │ │ └── wheel.cpython-312.pyc
│ │ │ │ │ ├── cache.py
│ │ │ │ │ ├── check.py
│ │ │ │ │ ├── completion.py
│ │ │ │ │ ├── configuration.py
│ │ │ │ │ ├── debug.py
│ │ │ │ │ ├── download.py
│ │ │ │ │ ├── freeze.py
│ │ │ │ │ ├── hash.py
│ │ │ │ │ ├── help.py
│ │ │ │ │ ├── index.py
│ │ │ │ │ ├── inspect.py
│ │ │ │ │ ├── install.py
│ │ │ │ │ ├── list.py
│ │ │ │ │ ├── search.py
│ │ │ │ │ ├── show.py
│ │ │ │ │ ├── uninstall.py
│ │ │ │ │ └── wheel.py
│ │ │ │ ├── configuration.py
│ │ │ │ ├── distributions
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── base.cpython-312.pyc
│ │ │ │ │ │ ├── installed.cpython-312.pyc
│ │ │ │ │ │ ├── sdist.cpython-312.pyc
│ │ │ │ │ │ └── wheel.cpython-312.pyc
│ │ │ │ │ ├── base.py
│ │ │ │ │ ├── installed.py
│ │ │ │ │ ├── sdist.py
│ │ │ │ │ └── wheel.py
│ │ │ │ ├── exceptions.py
│ │ │ │ ├── index
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── collector.cpython-312.pyc
│ │ │ │ │ │ ├── package_finder.cpython-312.pyc
│ │ │ │ │ │ └── sources.cpython-312.pyc
│ │ │ │ │ ├── collector.py
│ │ │ │ │ ├── package_finder.py
│ │ │ │ │ └── sources.py
│ │ │ │ ├── locations
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── _distutils.cpython-312.pyc
│ │ │ │ │ │ ├── _sysconfig.cpython-312.pyc
│ │ │ │ │ │ └── base.cpython-312.pyc
│ │ │ │ │ ├── _distutils.py
│ │ │ │ │ ├── _sysconfig.py
│ │ │ │ │ └── base.py
│ │ │ │ ├── main.py
│ │ │ │ ├── metadata
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── _json.cpython-312.pyc
│ │ │ │ │ │ ├── base.cpython-312.pyc
│ │ │ │ │ │ └── pkg_resources.cpython-312.pyc
│ │ │ │ │ ├── _json.py
│ │ │ │ │ ├── base.py
│ │ │ │ │ ├── importlib
│ │ │ │ │ │ ├── __init__.py
│ │ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ │ ├── _compat.cpython-312.pyc
│ │ │ │ │ │ │ ├── _dists.cpython-312.pyc
│ │ │ │ │ │ │ └── _envs.cpython-312.pyc
│ │ │ │ │ │ ├── _compat.py
│ │ │ │ │ │ ├── _dists.py
│ │ │ │ │ │ └── _envs.py
│ │ │ │ │ └── pkg_resources.py
│ │ │ │ ├── models
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── candidate.cpython-312.pyc
│ │ │ │ │ │ ├── direct_url.cpython-312.pyc
│ │ │ │ │ │ ├── format_control.cpython-312.pyc
│ │ │ │ │ │ ├── index.cpython-312.pyc
│ │ │ │ │ │ ├── installation_report.cpython-312.pyc
│ │ │ │ │ │ ├── link.cpython-312.pyc
│ │ │ │ │ │ ├── scheme.cpython-312.pyc
│ │ │ │ │ │ ├── search_scope.cpython-312.pyc
│ │ │ │ │ │ ├── selection_prefs.cpython-312.pyc
│ │ │ │ │ │ ├── target_python.cpython-312.pyc
│ │ │ │ │ │ └── wheel.cpython-312.pyc
│ │ │ │ │ ├── candidate.py
│ │ │ │ │ ├── direct_url.py
│ │ │ │ │ ├── format_control.py
│ │ │ │ │ ├── index.py
│ │ │ │ │ ├── installation_report.py
│ │ │ │ │ ├── link.py
│ │ │ │ │ ├── scheme.py
│ │ │ │ │ ├── search_scope.py
│ │ │ │ │ ├── selection_prefs.py
│ │ │ │ │ ├── target_python.py
│ │ │ │ │ └── wheel.py
│ │ │ │ ├── network
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── auth.cpython-312.pyc
│ │ │ │ │ │ ├── cache.cpython-312.pyc
│ │ │ │ │ │ ├── download.cpython-312.pyc
│ │ │ │ │ │ ├── lazy_wheel.cpython-312.pyc
│ │ │ │ │ │ ├── session.cpython-312.pyc
│ │ │ │ │ │ ├── utils.cpython-312.pyc
│ │ │ │ │ │ └── xmlrpc.cpython-312.pyc
│ │ │ │ │ ├── auth.py
│ │ │ │ │ ├── cache.py
│ │ │ │ │ ├── download.py
│ │ │ │ │ ├── lazy_wheel.py
│ │ │ │ │ ├── session.py
│ │ │ │ │ ├── utils.py
│ │ │ │ │ └── xmlrpc.py
│ │ │ │ ├── operations
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── check.cpython-312.pyc
│ │ │ │ │ │ ├── freeze.cpython-312.pyc
│ │ │ │ │ │ └── prepare.cpython-312.pyc
│ │ │ │ │ ├── build
│ │ │ │ │ │ ├── __init__.py
│ │ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ │ ├── build_tracker.cpython-312.pyc
│ │ │ │ │ │ │ ├── metadata_editable.cpython-312.pyc
│ │ │ │ │ │ │ ├── metadata_legacy.cpython-312.pyc
│ │ │ │ │ │ │ ├── metadata.cpython-312.pyc
│ │ │ │ │ │ │ ├── wheel_editable.cpython-312.pyc
│ │ │ │ │ │ │ ├── wheel_legacy.cpython-312.pyc
│ │ │ │ │ │ │ └── wheel.cpython-312.pyc
│ │ │ │ │ │ ├── build_tracker.py
│ │ │ │ │ │ ├── metadata_editable.py
│ │ │ │ │ │ ├── metadata_legacy.py
│ │ │ │ │ │ ├── metadata.py
│ │ │ │ │ │ ├── wheel_editable.py
│ │ │ │ │ │ ├── wheel_legacy.py
│ │ │ │ │ │ └── wheel.py
│ │ │ │ │ ├── check.py
│ │ │ │ │ ├── freeze.py
│ │ │ │ │ ├── install
│ │ │ │ │ │ ├── __init__.py
│ │ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ │ ├── editable_legacy.cpython-312.pyc
│ │ │ │ │ │ │ └── wheel.cpython-312.pyc
│ │ │ │ │ │ ├── editable_legacy.py
│ │ │ │ │ │ └── wheel.py
│ │ │ │ │ └── prepare.py
│ │ │ │ ├── pyproject.py
│ │ │ │ ├── req
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── constructors.cpython-312.pyc
│ │ │ │ │ │ ├── req_file.cpython-312.pyc
│ │ │ │ │ │ ├── req_install.cpython-312.pyc
│ │ │ │ │ │ ├── req_set.cpython-312.pyc
│ │ │ │ │ │ └── req_uninstall.cpython-312.pyc
│ │ │ │ │ ├── constructors.py
│ │ │ │ │ ├── req_file.py
│ │ │ │ │ ├── req_install.py
│ │ │ │ │ ├── req_set.py
│ │ │ │ │ └── req_uninstall.py
│ │ │ │ ├── resolution
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ └── base.cpython-312.pyc
│ │ │ │ │ ├── base.py
│ │ │ │ │ ├── legacy
│ │ │ │ │ │ ├── __init__.py
│ │ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ │ └── resolver.cpython-312.pyc
│ │ │ │ │ │ └── resolver.py
│ │ │ │ │ └── resolvelib
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── base.cpython-312.pyc
│ │ │ │ │ │ ├── candidates.cpython-312.pyc
│ │ │ │ │ │ ├── factory.cpython-312.pyc
│ │ │ │ │ │ ├── found_candidates.cpython-312.pyc
│ │ │ │ │ │ ├── provider.cpython-312.pyc
│ │ │ │ │ │ ├── reporter.cpython-312.pyc
│ │ │ │ │ │ ├── requirements.cpython-312.pyc
│ │ │ │ │ │ └── resolver.cpython-312.pyc
│ │ │ │ │ ├── base.py
│ │ │ │ │ ├── candidates.py
│ │ │ │ │ ├── factory.py
│ │ │ │ │ ├── found_candidates.py
│ │ │ │ │ ├── provider.py
│ │ │ │ │ ├── reporter.py
│ │ │ │ │ ├── requirements.py
│ │ │ │ │ └── resolver.py
│ │ │ │ ├── self_outdated_check.py
│ │ │ │ ├── utils
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── _jaraco_text.cpython-312.pyc
│ │ │ │ │ │ ├── _log.cpython-312.pyc
│ │ │ │ │ │ ├── appdirs.cpython-312.pyc
│ │ │ │ │ │ ├── compat.cpython-312.pyc
│ │ │ │ │ │ ├── compatibility_tags.cpython-312.pyc
│ │ │ │ │ │ ├── datetime.cpython-312.pyc
│ │ │ │ │ │ ├── deprecation.cpython-312.pyc
│ │ │ │ │ │ ├── direct_url_helpers.cpython-312.pyc
│ │ │ │ │ │ ├── egg_link.cpython-312.pyc
│ │ │ │ │ │ ├── encoding.cpython-312.pyc
│ │ │ │ │ │ ├── entrypoints.cpython-312.pyc
│ │ │ │ │ │ ├── filesystem.cpython-312.pyc
│ │ │ │ │ │ ├── filetypes.cpython-312.pyc
│ │ │ │ │ │ ├── glibc.cpython-312.pyc
│ │ │ │ │ │ ├── hashes.cpython-312.pyc
│ │ │ │ │ │ ├── logging.cpython-312.pyc
│ │ │ │ │ │ ├── misc.cpython-312.pyc
│ │ │ │ │ │ ├── packaging.cpython-312.pyc
│ │ │ │ │ │ ├── retry.cpython-312.pyc
│ │ │ │ │ │ ├── setuptools_build.cpython-312.pyc
│ │ │ │ │ │ ├── subprocess.cpython-312.pyc
│ │ │ │ │ │ ├── temp_dir.cpython-312.pyc
│ │ │ │ │ │ ├── unpacking.cpython-312.pyc
│ │ │ │ │ │ ├── urls.cpython-312.pyc
│ │ │ │ │ │ ├── virtualenv.cpython-312.pyc
│ │ │ │ │ │ └── wheel.cpython-312.pyc
│ │ │ │ │ ├── _jaraco_text.py
│ │ │ │ │ ├── _log.py
│ │ │ │ │ ├── appdirs.py
│ │ │ │ │ ├── compat.py
│ │ │ │ │ ├── compatibility_tags.py
│ │ │ │ │ ├── datetime.py
│ │ │ │ │ ├── deprecation.py
│ │ │ │ │ ├── direct_url_helpers.py
│ │ │ │ │ ├── egg_link.py
│ │ │ │ │ ├── encoding.py
│ │ │ │ │ ├── entrypoints.py
│ │ │ │ │ ├── filesystem.py
│ │ │ │ │ ├── filetypes.py
│ │ │ │ │ ├── glibc.py
│ │ │ │ │ ├── hashes.py
│ │ │ │ │ ├── logging.py
│ │ │ │ │ ├── misc.py
│ │ │ │ │ ├── packaging.py
│ │ │ │ │ ├── retry.py
│ │ │ │ │ ├── setuptools_build.py
│ │ │ │ │ ├── subprocess.py
│ │ │ │ │ ├── temp_dir.py
│ │ │ │ │ ├── unpacking.py
│ │ │ │ │ ├── urls.py
│ │ │ │ │ ├── virtualenv.py
│ │ │ │ │ └── wheel.py
│ │ │ │ ├── vcs
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── bazaar.cpython-312.pyc
│ │ │ │ │ │ ├── git.cpython-312.pyc
│ │ │ │ │ │ ├── mercurial.cpython-312.pyc
│ │ │ │ │ │ ├── subversion.cpython-312.pyc
│ │ │ │ │ │ └── versioncontrol.cpython-312.pyc
│ │ │ │ │ ├── bazaar.py
│ │ │ │ │ ├── git.py
│ │ │ │ │ ├── mercurial.py
│ │ │ │ │ ├── subversion.py
│ │ │ │ │ └── versioncontrol.py
│ │ │ │ └── wheel_builder.py
│ │ │ ├── _vendor
│ │ │ │ ├── __init__.py
│ │ │ │ ├── __pycache__
│ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ └── typing_extensions.cpython-312.pyc
│ │ │ │ ├── cachecontrol
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── _cmd.cpython-312.pyc
│ │ │ │ │ │ ├── adapter.cpython-312.pyc
│ │ │ │ │ │ ├── cache.cpython-312.pyc
│ │ │ │ │ │ ├── controller.cpython-312.pyc
│ │ │ │ │ │ ├── filewrapper.cpython-312.pyc
│ │ │ │ │ │ ├── heuristics.cpython-312.pyc
│ │ │ │ │ │ ├── serialize.cpython-312.pyc
│ │ │ │ │ │ └── wrapper.cpython-312.pyc
│ │ │ │ │ ├── _cmd.py
│ │ │ │ │ ├── adapter.py
│ │ │ │ │ ├── cache.py
│ │ │ │ │ ├── caches
│ │ │ │ │ │ ├── __init__.py
│ │ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ │ ├── file_cache.cpython-312.pyc
│ │ │ │ │ │ │ └── redis_cache.cpython-312.pyc
│ │ │ │ │ │ ├── file_cache.py
│ │ │ │ │ │ └── redis_cache.py
│ │ │ │ │ ├── controller.py
│ │ │ │ │ ├── filewrapper.py
│ │ │ │ │ ├── heuristics.py
│ │ │ │ │ ├── py.typed
│ │ │ │ │ ├── serialize.py
│ │ │ │ │ └── wrapper.py
│ │ │ │ ├── certifi
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __main__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── __main__.cpython-312.pyc
│ │ │ │ │ │ └── core.cpython-312.pyc
│ │ │ │ │ ├── cacert.pem
│ │ │ │ │ ├── core.py
│ │ │ │ │ └── py.typed
│ │ │ │ ├── distlib
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── compat.cpython-312.pyc
│ │ │ │ │ │ ├── database.cpython-312.pyc
│ │ │ │ │ │ ├── index.cpython-312.pyc
│ │ │ │ │ │ ├── locators.cpython-312.pyc
│ │ │ │ │ │ ├── manifest.cpython-312.pyc
│ │ │ │ │ │ ├── markers.cpython-312.pyc
│ │ │ │ │ │ ├── metadata.cpython-312.pyc
│ │ │ │ │ │ ├── resources.cpython-312.pyc
│ │ │ │ │ │ ├── scripts.cpython-312.pyc
│ │ │ │ │ │ ├── util.cpython-312.pyc
│ │ │ │ │ │ ├── version.cpython-312.pyc
│ │ │ │ │ │ └── wheel.cpython-312.pyc
│ │ │ │ │ ├── compat.py
│ │ │ │ │ ├── database.py
│ │ │ │ │ ├── index.py
│ │ │ │ │ ├── locators.py
│ │ │ │ │ ├── manifest.py
│ │ │ │ │ ├── markers.py
│ │ │ │ │ ├── metadata.py
│ │ │ │ │ ├── resources.py
│ │ │ │ │ ├── scripts.py
│ │ │ │ │ ├── t32.exe
│ │ │ │ │ ├── t64-arm.exe
│ │ │ │ │ ├── t64.exe
│ │ │ │ │ ├── util.py
│ │ │ │ │ ├── version.py
│ │ │ │ │ ├── w32.exe
│ │ │ │ │ ├── w64-arm.exe
│ │ │ │ │ ├── w64.exe
│ │ │ │ │ └── wheel.py
│ │ │ │ ├── distro
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __main__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── __main__.cpython-312.pyc
│ │ │ │ │ │ └── distro.cpython-312.pyc
│ │ │ │ │ ├── distro.py
│ │ │ │ │ └── py.typed
│ │ │ │ ├── idna
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── codec.cpython-312.pyc
│ │ │ │ │ │ ├── compat.cpython-312.pyc
│ │ │ │ │ │ ├── core.cpython-312.pyc
│ │ │ │ │ │ ├── idnadata.cpython-312.pyc
│ │ │ │ │ │ ├── intranges.cpython-312.pyc
│ │ │ │ │ │ ├── package_data.cpython-312.pyc
│ │ │ │ │ │ └── uts46data.cpython-312.pyc
│ │ │ │ │ ├── codec.py
│ │ │ │ │ ├── compat.py
│ │ │ │ │ ├── core.py
│ │ │ │ │ ├── idnadata.py
│ │ │ │ │ ├── intranges.py
│ │ │ │ │ ├── package_data.py
│ │ │ │ │ ├── py.typed
│ │ │ │ │ └── uts46data.py
│ │ │ │ ├── msgpack
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── exceptions.cpython-312.pyc
│ │ │ │ │ │ ├── ext.cpython-312.pyc
│ │ │ │ │ │ └── fallback.cpython-312.pyc
│ │ │ │ │ ├── exceptions.py
│ │ │ │ │ ├── ext.py
│ │ │ │ │ └── fallback.py
│ │ │ │ ├── packaging
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── _elffile.cpython-312.pyc
│ │ │ │ │ │ ├── _manylinux.cpython-312.pyc
│ │ │ │ │ │ ├── _musllinux.cpython-312.pyc
│ │ │ │ │ │ ├── _parser.cpython-312.pyc
│ │ │ │ │ │ ├── _structures.cpython-312.pyc
│ │ │ │ │ │ ├── _tokenizer.cpython-312.pyc
│ │ │ │ │ │ ├── markers.cpython-312.pyc
│ │ │ │ │ │ ├── metadata.cpython-312.pyc
│ │ │ │ │ │ ├── requirements.cpython-312.pyc
│ │ │ │ │ │ ├── specifiers.cpython-312.pyc
│ │ │ │ │ │ ├── tags.cpython-312.pyc
│ │ │ │ │ │ ├── utils.cpython-312.pyc
│ │ │ │ │ │ └── version.cpython-312.pyc
│ │ │ │ │ ├── _elffile.py
│ │ │ │ │ ├── _manylinux.py
│ │ │ │ │ ├── _musllinux.py
│ │ │ │ │ ├── _parser.py
│ │ │ │ │ ├── _structures.py
│ │ │ │ │ ├── _tokenizer.py
│ │ │ │ │ ├── markers.py
│ │ │ │ │ ├── metadata.py
│ │ │ │ │ ├── py.typed
│ │ │ │ │ ├── requirements.py
│ │ │ │ │ ├── specifiers.py
│ │ │ │ │ ├── tags.py
│ │ │ │ │ ├── utils.py
│ │ │ │ │ └── version.py
│ │ │ │ ├── pkg_resources
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ └── __pycache__
│ │ │ │ │ └── __init__.cpython-312.pyc
│ │ │ │ ├── platformdirs
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __main__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── __main__.cpython-312.pyc
│ │ │ │ │ │ ├── android.cpython-312.pyc
│ │ │ │ │ │ ├── api.cpython-312.pyc
│ │ │ │ │ │ ├── macos.cpython-312.pyc
│ │ │ │ │ │ ├── unix.cpython-312.pyc
│ │ │ │ │ │ ├── version.cpython-312.pyc
│ │ │ │ │ │ └── windows.cpython-312.pyc
│ │ │ │ │ ├── android.py
│ │ │ │ │ ├── api.py
│ │ │ │ │ ├── macos.py
│ │ │ │ │ ├── py.typed
│ │ │ │ │ ├── unix.py
│ │ │ │ │ ├── version.py
│ │ │ │ │ └── windows.py
│ │ │ │ ├── pygments
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __main__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── __main__.cpython-312.pyc
│ │ │ │ │ │ ├── cmdline.cpython-312.pyc
│ │ │ │ │ │ ├── console.cpython-312.pyc
│ │ │ │ │ │ ├── filter.cpython-312.pyc
│ │ │ │ │ │ ├── formatter.cpython-312.pyc
│ │ │ │ │ │ ├── lexer.cpython-312.pyc
│ │ │ │ │ │ ├── modeline.cpython-312.pyc
│ │ │ │ │ │ ├── plugin.cpython-312.pyc
│ │ │ │ │ │ ├── regexopt.cpython-312.pyc
│ │ │ │ │ │ ├── scanner.cpython-312.pyc
│ │ │ │ │ │ ├── sphinxext.cpython-312.pyc
│ │ │ │ │ │ ├── style.cpython-312.pyc
│ │ │ │ │ │ ├── token.cpython-312.pyc
│ │ │ │ │ │ ├── unistring.cpython-312.pyc
│ │ │ │ │ │ └── util.cpython-312.pyc
│ │ │ │ │ ├── cmdline.py
│ │ │ │ │ ├── console.py
│ │ │ │ │ ├── filter.py
│ │ │ │ │ ├── filters
│ │ │ │ │ │ ├── __init__.py
│ │ │ │ │ │ └── __pycache__
│ │ │ │ │ │ └── __init__.cpython-312.pyc
│ │ │ │ │ ├── formatter.py
│ │ │ │ │ ├── formatters
│ │ │ │ │ │ ├── __init__.py
│ │ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ │ ├── _mapping.cpython-312.pyc
│ │ │ │ │ │ │ ├── bbcode.cpython-312.pyc
│ │ │ │ │ │ │ ├── groff.cpython-312.pyc
│ │ │ │ │ │ │ ├── html.cpython-312.pyc
│ │ │ │ │ │ │ ├── img.cpython-312.pyc
│ │ │ │ │ │ │ ├── irc.cpython-312.pyc
│ │ │ │ │ │ │ ├── latex.cpython-312.pyc
│ │ │ │ │ │ │ ├── other.cpython-312.pyc
│ │ │ │ │ │ │ ├── pangomarkup.cpython-312.pyc
│ │ │ │ │ │ │ ├── rtf.cpython-312.pyc
│ │ │ │ │ │ │ ├── svg.cpython-312.pyc
│ │ │ │ │ │ │ ├── terminal.cpython-312.pyc
│ │ │ │ │ │ │ └── terminal256.cpython-312.pyc
│ │ │ │ │ │ ├── _mapping.py
│ │ │ │ │ │ ├── bbcode.py
│ │ │ │ │ │ ├── groff.py
│ │ │ │ │ │ ├── html.py
│ │ │ │ │ │ ├── img.py
│ │ │ │ │ │ ├── irc.py
│ │ │ │ │ │ ├── latex.py
│ │ │ │ │ │ ├── other.py
│ │ │ │ │ │ ├── pangomarkup.py
│ │ │ │ │ │ ├── rtf.py
│ │ │ │ │ │ ├── svg.py
│ │ │ │ │ │ ├── terminal.py
│ │ │ │ │ │ └── terminal256.py
│ │ │ │ │ ├── lexer.py
│ │ │ │ │ ├── lexers
│ │ │ │ │ │ ├── __init__.py
│ │ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ │ ├── _mapping.cpython-312.pyc
│ │ │ │ │ │ │ └── python.cpython-312.pyc
│ │ │ │ │ │ ├── _mapping.py
│ │ │ │ │ │ └── python.py
│ │ │ │ │ ├── modeline.py
│ │ │ │ │ ├── plugin.py
│ │ │ │ │ ├── regexopt.py
│ │ │ │ │ ├── scanner.py
│ │ │ │ │ ├── sphinxext.py
│ │ │ │ │ ├── style.py
│ │ │ │ │ ├── styles
│ │ │ │ │ │ ├── __init__.py
│ │ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ │ └── _mapping.cpython-312.pyc
│ │ │ │ │ │ └── _mapping.py
│ │ │ │ │ ├── token.py
│ │ │ │ │ ├── unistring.py
│ │ │ │ │ └── util.py
│ │ │ │ ├── pyproject_hooks
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── _compat.cpython-312.pyc
│ │ │ │ │ │ └── _impl.cpython-312.pyc
│ │ │ │ │ ├── _compat.py
│ │ │ │ │ ├── _impl.py
│ │ │ │ │ └── _in_process
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ └── _in_process.cpython-312.pyc
│ │ │ │ │ └── _in_process.py
│ │ │ │ ├── requests
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── __version__.cpython-312.pyc
│ │ │ │ │ │ ├── _internal_utils.cpython-312.pyc
│ │ │ │ │ │ ├── adapters.cpython-312.pyc
│ │ │ │ │ │ ├── api.cpython-312.pyc
│ │ │ │ │ │ ├── auth.cpython-312.pyc
│ │ │ │ │ │ ├── certs.cpython-312.pyc
│ │ │ │ │ │ ├── compat.cpython-312.pyc
│ │ │ │ │ │ ├── cookies.cpython-312.pyc
│ │ │ │ │ │ ├── exceptions.cpython-312.pyc
│ │ │ │ │ │ ├── help.cpython-312.pyc
│ │ │ │ │ │ ├── hooks.cpython-312.pyc
│ │ │ │ │ │ ├── models.cpython-312.pyc
│ │ │ │ │ │ ├── packages.cpython-312.pyc
│ │ │ │ │ │ ├── sessions.cpython-312.pyc
│ │ │ │ │ │ ├── status_codes.cpython-312.pyc
│ │ │ │ │ │ ├── structures.cpython-312.pyc
│ │ │ │ │ │ └── utils.cpython-312.pyc
│ │ │ │ │ ├── __version__.py
│ │ │ │ │ ├── _internal_utils.py
│ │ │ │ │ ├── adapters.py
│ │ │ │ │ ├── api.py
│ │ │ │ │ ├── auth.py
│ │ │ │ │ ├── certs.py
│ │ │ │ │ ├── compat.py
│ │ │ │ │ ├── cookies.py
│ │ │ │ │ ├── exceptions.py
│ │ │ │ │ ├── help.py
│ │ │ │ │ ├── hooks.py
│ │ │ │ │ ├── models.py
│ │ │ │ │ ├── packages.py
│ │ │ │ │ ├── sessions.py
│ │ │ │ │ ├── status_codes.py
│ │ │ │ │ ├── structures.py
│ │ │ │ │ └── utils.py
│ │ │ │ ├── resolvelib
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── providers.cpython-312.pyc
│ │ │ │ │ │ ├── reporters.cpython-312.pyc
│ │ │ │ │ │ ├── resolvers.cpython-312.pyc
│ │ │ │ │ │ └── structs.cpython-312.pyc
│ │ │ │ │ ├── compat
│ │ │ │ │ │ ├── __init__.py
│ │ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ │ └── collections_abc.cpython-312.pyc
│ │ │ │ │ │ └── collections_abc.py
│ │ │ │ │ ├── providers.py
│ │ │ │ │ ├── py.typed
│ │ │ │ │ ├── reporters.py
│ │ │ │ │ ├── resolvers.py
│ │ │ │ │ └── structs.py
│ │ │ │ ├── rich
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __main__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── __main__.cpython-312.pyc
│ │ │ │ │ │ ├── _cell_widths.cpython-312.pyc
│ │ │ │ │ │ ├── _emoji_codes.cpython-312.pyc
│ │ │ │ │ │ ├── _emoji_replace.cpython-312.pyc
│ │ │ │ │ │ ├── _export_format.cpython-312.pyc
│ │ │ │ │ │ ├── _extension.cpython-312.pyc
│ │ │ │ │ │ ├── _fileno.cpython-312.pyc
│ │ │ │ │ │ ├── _inspect.cpython-312.pyc
│ │ │ │ │ │ ├── _log_render.cpython-312.pyc
│ │ │ │ │ │ ├── _loop.cpython-312.pyc
│ │ │ │ │ │ ├── _null_file.cpython-312.pyc
│ │ │ │ │ │ ├── _palettes.cpython-312.pyc
│ │ │ │ │ │ ├── _pick.cpython-312.pyc
│ │ │ │ │ │ ├── _ratio.cpython-312.pyc
│ │ │ │ │ │ ├── _spinners.cpython-312.pyc
│ │ │ │ │ │ ├── _stack.cpython-312.pyc
│ │ │ │ │ │ ├── _timer.cpython-312.pyc
│ │ │ │ │ │ ├── _win32_console.cpython-312.pyc
│ │ │ │ │ │ ├── _windows_renderer.cpython-312.pyc
│ │ │ │ │ │ ├── _windows.cpython-312.pyc
│ │ │ │ │ │ ├── _wrap.cpython-312.pyc
│ │ │ │ │ │ ├── abc.cpython-312.pyc
│ │ │ │ │ │ ├── align.cpython-312.pyc
│ │ │ │ │ │ ├── ansi.cpython-312.pyc
│ │ │ │ │ │ ├── bar.cpython-312.pyc
│ │ │ │ │ │ ├── box.cpython-312.pyc
│ │ │ │ │ │ ├── cells.cpython-312.pyc
│ │ │ │ │ │ ├── color_triplet.cpython-312.pyc
│ │ │ │ │ │ ├── color.cpython-312.pyc
│ │ │ │ │ │ ├── columns.cpython-312.pyc
│ │ │ │ │ │ ├── console.cpython-312.pyc
│ │ │ │ │ │ ├── constrain.cpython-312.pyc
│ │ │ │ │ │ ├── containers.cpython-312.pyc
│ │ │ │ │ │ ├── control.cpython-312.pyc
│ │ │ │ │ │ ├── default_styles.cpython-312.pyc
│ │ │ │ │ │ ├── diagnose.cpython-312.pyc
│ │ │ │ │ │ ├── emoji.cpython-312.pyc
│ │ │ │ │ │ ├── errors.cpython-312.pyc
│ │ │ │ │ │ ├── file_proxy.cpython-312.pyc
│ │ │ │ │ │ ├── filesize.cpython-312.pyc
│ │ │ │ │ │ ├── highlighter.cpython-312.pyc
│ │ │ │ │ │ ├── json.cpython-312.pyc
│ │ │ │ │ │ ├── jupyter.cpython-312.pyc
│ │ │ │ │ │ ├── layout.cpython-312.pyc
│ │ │ │ │ │ ├── live_render.cpython-312.pyc
│ │ │ │ │ │ ├── live.cpython-312.pyc
│ │ │ │ │ │ ├── logging.cpython-312.pyc
│ │ │ │ │ │ ├── markup.cpython-312.pyc
│ │ │ │ │ │ ├── measure.cpython-312.pyc
│ │ │ │ │ │ ├── padding.cpython-312.pyc
│ │ │ │ │ │ ├── pager.cpython-312.pyc
│ │ │ │ │ │ ├── palette.cpython-312.pyc
│ │ │ │ │ │ ├── panel.cpython-312.pyc
│ │ │ │ │ │ ├── pretty.cpython-312.pyc
│ │ │ │ │ │ ├── progress_bar.cpython-312.pyc
│ │ │ │ │ │ ├── progress.cpython-312.pyc
│ │ │ │ │ │ ├── prompt.cpython-312.pyc
│ │ │ │ │ │ ├── protocol.cpython-312.pyc
│ │ │ │ │ │ ├── region.cpython-312.pyc
│ │ │ │ │ │ ├── repr.cpython-312.pyc
│ │ │ │ │ │ ├── rule.cpython-312.pyc
│ │ │ │ │ │ ├── scope.cpython-312.pyc
│ │ │ │ │ │ ├── screen.cpython-312.pyc
│ │ │ │ │ │ ├── segment.cpython-312.pyc
│ │ │ │ │ │ ├── spinner.cpython-312.pyc
│ │ │ │ │ │ ├── status.cpython-312.pyc
│ │ │ │ │ │ ├── style.cpython-312.pyc
│ │ │ │ │ │ ├── styled.cpython-312.pyc
│ │ │ │ │ │ ├── syntax.cpython-312.pyc
│ │ │ │ │ │ ├── table.cpython-312.pyc
│ │ │ │ │ │ ├── terminal_theme.cpython-312.pyc
│ │ │ │ │ │ ├── text.cpython-312.pyc
│ │ │ │ │ │ ├── theme.cpython-312.pyc
│ │ │ │ │ │ ├── themes.cpython-312.pyc
│ │ │ │ │ │ ├── traceback.cpython-312.pyc
│ │ │ │ │ │ └── tree.cpython-312.pyc
│ │ │ │ │ ├── _cell_widths.py
│ │ │ │ │ ├── _emoji_codes.py
│ │ │ │ │ ├── _emoji_replace.py
│ │ │ │ │ ├── _export_format.py
│ │ │ │ │ ├── _extension.py
│ │ │ │ │ ├── _fileno.py
│ │ │ │ │ ├── _inspect.py
│ │ │ │ │ ├── _log_render.py
│ │ │ │ │ ├── _loop.py
│ │ │ │ │ ├── _null_file.py
│ │ │ │ │ ├── _palettes.py
│ │ │ │ │ ├── _pick.py
│ │ │ │ │ ├── _ratio.py
│ │ │ │ │ ├── _spinners.py
│ │ │ │ │ ├── _stack.py
│ │ │ │ │ ├── _timer.py
│ │ │ │ │ ├── _win32_console.py
│ │ │ │ │ ├── _windows_renderer.py
│ │ │ │ │ ├── _windows.py
│ │ │ │ │ ├── _wrap.py
│ │ │ │ │ ├── abc.py
│ │ │ │ │ ├── align.py
│ │ │ │ │ ├── ansi.py
│ │ │ │ │ ├── bar.py
│ │ │ │ │ ├── box.py
│ │ │ │ │ ├── cells.py
│ │ │ │ │ ├── color_triplet.py
│ │ │ │ │ ├── color.py
│ │ │ │ │ ├── columns.py
│ │ │ │ │ ├── console.py
│ │ │ │ │ ├── constrain.py
│ │ │ │ │ ├── containers.py
│ │ │ │ │ ├── control.py
│ │ │ │ │ ├── default_styles.py
│ │ │ │ │ ├── diagnose.py
│ │ │ │ │ ├── emoji.py
│ │ │ │ │ ├── errors.py
│ │ │ │ │ ├── file_proxy.py
│ │ │ │ │ ├── filesize.py
│ │ │ │ │ ├── highlighter.py
│ │ │ │ │ ├── json.py
│ │ │ │ │ ├── jupyter.py
│ │ │ │ │ ├── layout.py
│ │ │ │ │ ├── live_render.py
│ │ │ │ │ ├── live.py
│ │ │ │ │ ├── logging.py
│ │ │ │ │ ├── markup.py
│ │ │ │ │ ├── measure.py
│ │ │ │ │ ├── padding.py
│ │ │ │ │ ├── pager.py
│ │ │ │ │ ├── palette.py
│ │ │ │ │ ├── panel.py
│ │ │ │ │ ├── pretty.py
│ │ │ │ │ ├── progress_bar.py
│ │ │ │ │ ├── progress.py
│ │ │ │ │ ├── prompt.py
│ │ │ │ │ ├── protocol.py
│ │ │ │ │ ├── py.typed
│ │ │ │ │ ├── region.py
│ │ │ │ │ ├── repr.py
│ │ │ │ │ ├── rule.py
│ │ │ │ │ ├── scope.py
│ │ │ │ │ ├── screen.py
│ │ │ │ │ ├── segment.py
│ │ │ │ │ ├── spinner.py
│ │ │ │ │ ├── status.py
│ │ │ │ │ ├── style.py
│ │ │ │ │ ├── styled.py
│ │ │ │ │ ├── syntax.py
│ │ │ │ │ ├── table.py
│ │ │ │ │ ├── terminal_theme.py
│ │ │ │ │ ├── text.py
│ │ │ │ │ ├── theme.py
│ │ │ │ │ ├── themes.py
│ │ │ │ │ ├── traceback.py
│ │ │ │ │ └── tree.py
│ │ │ │ ├── tomli
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── _parser.cpython-312.pyc
│ │ │ │ │ │ ├── _re.cpython-312.pyc
│ │ │ │ │ │ └── _types.cpython-312.pyc
│ │ │ │ │ ├── _parser.py
│ │ │ │ │ ├── _re.py
│ │ │ │ │ ├── _types.py
│ │ │ │ │ └── py.typed
│ │ │ │ ├── truststore
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── _api.cpython-312.pyc
│ │ │ │ │ │ ├── _macos.cpython-312.pyc
│ │ │ │ │ │ ├── _openssl.cpython-312.pyc
│ │ │ │ │ │ ├── _ssl_constants.cpython-312.pyc
│ │ │ │ │ │ └── _windows.cpython-312.pyc
│ │ │ │ │ ├── _api.py
│ │ │ │ │ ├── _macos.py
│ │ │ │ │ ├── _openssl.py
│ │ │ │ │ ├── _ssl_constants.py
│ │ │ │ │ ├── _windows.py
│ │ │ │ │ └── py.typed
│ │ │ │ ├── typing_extensions.py
│ │ │ │ ├── urllib3
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── _collections.cpython-312.pyc
│ │ │ │ │ │ ├── _version.cpython-312.pyc
│ │ │ │ │ │ ├── connection.cpython-312.pyc
│ │ │ │ │ │ ├── connectionpool.cpython-312.pyc
│ │ │ │ │ │ ├── exceptions.cpython-312.pyc
│ │ │ │ │ │ ├── fields.cpython-312.pyc
│ │ │ │ │ │ ├── filepost.cpython-312.pyc
│ │ │ │ │ │ ├── poolmanager.cpython-312.pyc
│ │ │ │ │ │ ├── request.cpython-312.pyc
│ │ │ │ │ │ └── response.cpython-312.pyc
│ │ │ │ │ ├── _collections.py
│ │ │ │ │ ├── _version.py
│ │ │ │ │ ├── connection.py
│ │ │ │ │ ├── connectionpool.py
│ │ │ │ │ ├── contrib
│ │ │ │ │ │ ├── __init__.py
│ │ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ │ ├── _appengine_environ.cpython-312.pyc
│ │ │ │ │ │ │ ├── appengine.cpython-312.pyc
│ │ │ │ │ │ │ ├── ntlmpool.cpython-312.pyc
│ │ │ │ │ │ │ ├── pyopenssl.cpython-312.pyc
│ │ │ │ │ │ │ ├── securetransport.cpython-312.pyc
│ │ │ │ │ │ │ └── socks.cpython-312.pyc
│ │ │ │ │ │ ├── _appengine_environ.py
│ │ │ │ │ │ ├── _securetransport
│ │ │ │ │ │ │ ├── __init__.py
│ │ │ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ │ │ ├── bindings.cpython-312.pyc
│ │ │ │ │ │ │ │ └── low_level.cpython-312.pyc
│ │ │ │ │ │ │ ├── bindings.py
│ │ │ │ │ │ │ └── low_level.py
│ │ │ │ │ │ ├── appengine.py
│ │ │ │ │ │ ├── ntlmpool.py
│ │ │ │ │ │ ├── pyopenssl.py
│ │ │ │ │ │ ├── securetransport.py
│ │ │ │ │ │ └── socks.py
│ │ │ │ │ ├── exceptions.py
│ │ │ │ │ ├── fields.py
│ │ │ │ │ ├── filepost.py
│ │ │ │ │ ├── packages
│ │ │ │ │ │ ├── __init__.py
│ │ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ │ └── six.cpython-312.pyc
│ │ │ │ │ │ ├── backports
│ │ │ │ │ │ │ ├── __init__.py
│ │ │ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ │ │ ├── makefile.cpython-312.pyc
│ │ │ │ │ │ │ │ └── weakref_finalize.cpython-312.pyc
│ │ │ │ │ │ │ ├── makefile.py
│ │ │ │ │ │ │ └── weakref_finalize.py
│ │ │ │ │ │ └── six.py
│ │ │ │ │ ├── poolmanager.py
│ │ │ │ │ ├── request.py
│ │ │ │ │ ├── response.py
│ │ │ │ │ └── util
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── connection.cpython-312.pyc
│ │ │ │ │ │ ├── proxy.cpython-312.pyc
│ │ │ │ │ │ ├── queue.cpython-312.pyc
│ │ │ │ │ │ ├── request.cpython-312.pyc
│ │ │ │ │ │ ├── response.cpython-312.pyc
│ │ │ │ │ │ ├── retry.cpython-312.pyc
│ │ │ │ │ │ ├── ssl_.cpython-312.pyc
│ │ │ │ │ │ ├── ssl_match_hostname.cpython-312.pyc
│ │ │ │ │ │ ├── ssltransport.cpython-312.pyc
│ │ │ │ │ │ ├── timeout.cpython-312.pyc
│ │ │ │ │ │ ├── url.cpython-312.pyc
│ │ │ │ │ │ └── wait.cpython-312.pyc
│ │ │ │ │ ├── connection.py
│ │ │ │ │ ├── proxy.py
│ │ │ │ │ ├── queue.py
│ │ │ │ │ ├── request.py
│ │ │ │ │ ├── response.py
│ │ │ │ │ ├── retry.py
│ │ │ │ │ ├── ssl_.py
│ │ │ │ │ ├── ssl_match_hostname.py
│ │ │ │ │ ├── ssltransport.py
│ │ │ │ │ ├── timeout.py
│ │ │ │ │ ├── url.py
│ │ │ │ │ └── wait.py
│ │ │ │ └── vendor.txt
│ │ │ └── py.typed
│ │ ├── pip-24.2.dist-info
│ │ │ ├── AUTHORS.txt
│ │ │ ├── entry_points.txt
│ │ │ ├── INSTALLER
│ │ │ ├── LICENSE.txt
│ │ │ ├── METADATA
│ │ │ ├── RECORD
│ │ │ ├── REQUESTED
│ │ │ ├── top_level.txt
│ │ │ └── WHEEL
│ │ ├── requests
│ │ │ ├── __init__.py
│ │ │ ├── __pycache__
│ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ ├── __version__.cpython-312.pyc
│ │ │ │ ├── _internal_utils.cpython-312.pyc
│ │ │ │ ├── adapters.cpython-312.pyc
│ │ │ │ ├── api.cpython-312.pyc
│ │ │ │ ├── auth.cpython-312.pyc
│ │ │ │ ├── certs.cpython-312.pyc
│ │ │ │ ├── compat.cpython-312.pyc
│ │ │ │ ├── cookies.cpython-312.pyc
│ │ │ │ ├── exceptions.cpython-312.pyc
│ │ │ │ ├── help.cpython-312.pyc
│ │ │ │ ├── hooks.cpython-312.pyc
│ │ │ │ ├── models.cpython-312.pyc
│ │ │ │ ├── packages.cpython-312.pyc
│ │ │ │ ├── sessions.cpython-312.pyc
│ │ │ │ ├── status_codes.cpython-312.pyc
│ │ │ │ ├── structures.cpython-312.pyc
│ │ │ │ └── utils.cpython-312.pyc
│ │ │ ├── __version__.py
│ │ │ ├── _internal_utils.py
│ │ │ ├── adapters.py
│ │ │ ├── api.py
│ │ │ ├── auth.py
│ │ │ ├── certs.py
│ │ │ ├── compat.py
│ │ │ ├── cookies.py
│ │ │ ├── exceptions.py
│ │ │ ├── help.py
│ │ │ ├── hooks.py
│ │ │ ├── models.py
│ │ │ ├── packages.py
│ │ │ ├── sessions.py
│ │ │ ├── status_codes.py
│ │ │ ├── structures.py
│ │ │ └── utils.py
│ │ ├── requests-2.32.3.dist-info
│ │ │ ├── INSTALLER
│ │ │ ├── LICENSE
│ │ │ ├── METADATA
│ │ │ ├── RECORD
│ │ │ ├── REQUESTED
│ │ │ ├── top_level.txt
│ │ │ └── WHEEL
│ │ ├── soupsieve
│ │ │ ├── __init__.py
│ │ │ ├── __meta__.py
│ │ │ ├── __pycache__
│ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ ├── __meta__.cpython-312.pyc
│ │ │ │ ├── css_match.cpython-312.pyc
│ │ │ │ ├── css_parser.cpython-312.pyc
│ │ │ │ ├── css_types.cpython-312.pyc
│ │ │ │ ├── pretty.cpython-312.pyc
│ │ │ │ └── util.cpython-312.pyc
│ │ │ ├── css_match.py
│ │ │ ├── css_parser.py
│ │ │ ├── css_types.py
│ │ │ ├── pretty.py
│ │ │ ├── py.typed
│ │ │ └── util.py
│ │ ├── soupsieve-2.6.dist-info
│ │ │ ├── INSTALLER
│ │ │ ├── licenses
│ │ │ │ └── LICENSE.md
│ │ │ ├── METADATA
│ │ │ ├── RECORD
│ │ │ └── WHEEL
│ │ ├── urllib3
│ │ │ ├── __init__.py
│ │ │ ├── __pycache__
│ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ ├── _base_connection.cpython-312.pyc
│ │ │ │ ├── _collections.cpython-312.pyc
│ │ │ │ ├── _request_methods.cpython-312.pyc
│ │ │ │ ├── _version.cpython-312.pyc
│ │ │ │ ├── connection.cpython-312.pyc
│ │ │ │ ├── connectionpool.cpython-312.pyc
│ │ │ │ ├── exceptions.cpython-312.pyc
│ │ │ │ ├── fields.cpython-312.pyc
│ │ │ │ ├── filepost.cpython-312.pyc
│ │ │ │ ├── poolmanager.cpython-312.pyc
│ │ │ │ └── response.cpython-312.pyc
│ │ │ ├── _base_connection.py
│ │ │ ├── _collections.py
│ │ │ ├── _request_methods.py
│ │ │ ├── _version.py
│ │ │ ├── connection.py
│ │ │ ├── connectionpool.py
│ │ │ ├── contrib
│ │ │ │ ├── __init__.py
│ │ │ │ ├── __pycache__
│ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ ├── pyopenssl.cpython-312.pyc
│ │ │ │ │ └── socks.cpython-312.pyc
│ │ │ │ ├── emscripten
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── connection.cpython-312.pyc
│ │ │ │ │ │ ├── fetch.cpython-312.pyc
│ │ │ │ │ │ ├── request.cpython-312.pyc
│ │ │ │ │ │ └── response.cpython-312.pyc
│ │ │ │ │ ├── connection.py
│ │ │ │ │ ├── emscripten_fetch_worker.js
│ │ │ │ │ ├── fetch.py
│ │ │ │ │ ├── request.py
│ │ │ │ │ └── response.py
│ │ │ │ ├── pyopenssl.py
│ │ │ │ └── socks.py
│ │ │ ├── exceptions.py
│ │ │ ├── fields.py
│ │ │ ├── filepost.py
│ │ │ ├── http2
│ │ │ │ ├── __init__.py
│ │ │ │ ├── __pycache__
│ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ ├── connection.cpython-312.pyc
│ │ │ │ │ └── probe.cpython-312.pyc
│ │ │ │ ├── connection.py
│ │ │ │ └── probe.py
│ │ │ ├── poolmanager.py
│ │ │ ├── py.typed
│ │ │ ├── response.py
│ │ │ └── util
│ │ │ ├── __init__.py
│ │ │ ├── __pycache__
│ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ ├── connection.cpython-312.pyc
│ │ │ │ ├── proxy.cpython-312.pyc
│ │ │ │ ├── request.cpython-312.pyc
│ │ │ │ ├── response.cpython-312.pyc
│ │ │ │ ├── retry.cpython-312.pyc
│ │ │ │ ├── ssl_.cpython-312.pyc
│ │ │ │ ├── ssl_match_hostname.cpython-312.pyc
│ │ │ │ ├── ssltransport.cpython-312.pyc
│ │ │ │ ├── timeout.cpython-312.pyc
│ │ │ │ ├── url.cpython-312.pyc
│ │ │ │ ├── util.cpython-312.pyc
│ │ │ │ └── wait.cpython-312.pyc
│ │ │ ├── connection.py
│ │ │ ├── proxy.py
│ │ │ ├── request.py
│ │ │ ├── response.py
│ │ │ ├── retry.py
│ │ │ ├── ssl_.py
│ │ │ ├── ssl_match_hostname.py
│ │ │ ├── ssltransport.py
│ │ │ ├── timeout.py
│ │ │ ├── url.py
│ │ │ ├── util.py
│ │ │ └── wait.py
│ │ ├── urllib3-2.2.3.dist-info
│ │ │ ├── INSTALLER
│ │ │ ├── licenses
│ │ │ │ └── LICENSE.txt
│ │ │ ├── METADATA
│ │ │ ├── RECORD
│ │ │ └── WHEEL
│ │ ├── useragent
│ │ │ ├── __init__.py
│ │ │ ├── __init__.pyc
│ │ │ ├── __pycache__
│ │ │ │ └── __init__.cpython-312.pyc
│ │ │ ├── resources
│ │ │ │ └── user_agent_data.json
│ │ │ └── test
│ │ │ ├── __init__.py
│ │ │ ├── __pycache__
│ │ │ │ └── __init__.cpython-312.pyc
│ │ │ ├── test_additional_os.json
│ │ │ ├── test_browser.json
│ │ │ ├── test_device.json
│ │ │ ├── test_firefox.json
│ │ │ ├── test_os.json
│ │ │ └── test_pgts_browser.json
│ │ ├── useragent-0.1.1.dist-info
│ │ │ ├── INSTALLER
│ │ │ ├── LICENSE.txt
│ │ │ ├── METADATA
│ │ │ ├── RECORD
│ │ │ ├── REQUESTED
│ │ │ ├── top_level.txt
│ │ │ └── WHEEL
│ │ ├── werkzeug
│ │ │ ├── __init__.py
│ │ │ ├── __pycache__
│ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ ├── _internal.cpython-312.pyc
│ │ │ │ ├── _reloader.cpython-312.pyc
│ │ │ │ ├── exceptions.cpython-312.pyc
│ │ │ │ ├── formparser.cpython-312.pyc
│ │ │ │ ├── http.cpython-312.pyc
│ │ │ │ ├── local.cpython-312.pyc
│ │ │ │ ├── security.cpython-312.pyc
│ │ │ │ ├── serving.cpython-312.pyc
│ │ │ │ ├── test.cpython-312.pyc
│ │ │ │ ├── testapp.cpython-312.pyc
│ │ │ │ ├── urls.cpython-312.pyc
│ │ │ │ ├── user_agent.cpython-312.pyc
│ │ │ │ ├── utils.cpython-312.pyc
│ │ │ │ └── wsgi.cpython-312.pyc
│ │ │ ├── _internal.py
│ │ │ ├── _reloader.py
│ │ │ ├── datastructures
│ │ │ │ ├── __init__.py
│ │ │ │ ├── __pycache__
│ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ ├── accept.cpython-312.pyc
│ │ │ │ │ ├── auth.cpython-312.pyc
│ │ │ │ │ ├── cache_control.cpython-312.pyc
│ │ │ │ │ ├── csp.cpython-312.pyc
│ │ │ │ │ ├── etag.cpython-312.pyc
│ │ │ │ │ ├── file_storage.cpython-312.pyc
│ │ │ │ │ ├── headers.cpython-312.pyc
│ │ │ │ │ ├── mixins.cpython-312.pyc
│ │ │ │ │ ├── range.cpython-312.pyc
│ │ │ │ │ └── structures.cpython-312.pyc
│ │ │ │ ├── accept.py
│ │ │ │ ├── accept.pyi
│ │ │ │ ├── auth.py
│ │ │ │ ├── cache_control.py
│ │ │ │ ├── cache_control.pyi
│ │ │ │ ├── csp.py
│ │ │ │ ├── csp.pyi
│ │ │ │ ├── etag.py
│ │ │ │ ├── etag.pyi
│ │ │ │ ├── file_storage.py
│ │ │ │ ├── file_storage.pyi
│ │ │ │ ├── headers.py
│ │ │ │ ├── headers.pyi
│ │ │ │ ├── mixins.py
│ │ │ │ ├── mixins.pyi
│ │ │ │ ├── range.py
│ │ │ │ ├── range.pyi
│ │ │ │ ├── structures.py
│ │ │ │ └── structures.pyi
│ │ │ ├── debug
│ │ │ │ ├── __init__.py
│ │ │ │ ├── __pycache__
│ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ ├── console.cpython-312.pyc
│ │ │ │ │ ├── repr.cpython-312.pyc
│ │ │ │ │ └── tbtools.cpython-312.pyc
│ │ │ │ ├── console.py
│ │ │ │ ├── repr.py
│ │ │ │ ├── shared
│ │ │ │ │ ├── console.png
│ │ │ │ │ ├── debugger.js
│ │ │ │ │ ├── ICON_LICENSE.md
│ │ │ │ │ ├── less.png
│ │ │ │ │ ├── more.png
│ │ │ │ │ └── style.css
│ │ │ │ └── tbtools.py
│ │ │ ├── exceptions.py
│ │ │ ├── formparser.py
│ │ │ ├── http.py
│ │ │ ├── local.py
│ │ │ ├── middleware
│ │ │ │ ├── __init__.py
│ │ │ │ ├── __pycache__
│ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ ├── dispatcher.cpython-312.pyc
│ │ │ │ │ ├── http_proxy.cpython-312.pyc
│ │ │ │ │ ├── lint.cpython-312.pyc
│ │ │ │ │ ├── profiler.cpython-312.pyc
│ │ │ │ │ ├── proxy_fix.cpython-312.pyc
│ │ │ │ │ └── shared_data.cpython-312.pyc
│ │ │ │ ├── dispatcher.py
│ │ │ │ ├── http_proxy.py
│ │ │ │ ├── lint.py
│ │ │ │ ├── profiler.py
│ │ │ │ ├── proxy_fix.py
│ │ │ │ └── shared_data.py
│ │ │ ├── py.typed
│ │ │ ├── routing
│ │ │ │ ├── __init__.py
│ │ │ │ ├── __pycache__
│ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ ├── converters.cpython-312.pyc
│ │ │ │ │ ├── exceptions.cpython-312.pyc
│ │ │ │ │ ├── map.cpython-312.pyc
│ │ │ │ │ ├── matcher.cpython-312.pyc
│ │ │ │ │ └── rules.cpython-312.pyc
│ │ │ │ ├── converters.py
│ │ │ │ ├── exceptions.py
│ │ │ │ ├── map.py
│ │ │ │ ├── matcher.py
│ │ │ │ └── rules.py
│ │ │ ├── sansio
│ │ │ │ ├── __init__.py
│ │ │ │ ├── __pycache__
│ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ ├── http.cpython-312.pyc
│ │ │ │ │ ├── multipart.cpython-312.pyc
│ │ │ │ │ ├── request.cpython-312.pyc
│ │ │ │ │ ├── response.cpython-312.pyc
│ │ │ │ │ └── utils.cpython-312.pyc
│ │ │ │ ├── http.py
│ │ │ │ ├── multipart.py
│ │ │ │ ├── request.py
│ │ │ │ ├── response.py
│ │ │ │ └── utils.py
│ │ │ ├── security.py
│ │ │ ├── serving.py
│ │ │ ├── test.py
│ │ │ ├── testapp.py
│ │ │ ├── urls.py
│ │ │ ├── user_agent.py
│ │ │ ├── utils.py
│ │ │ ├── wrappers
│ │ │ │ ├── __init__.py
│ │ │ │ ├── __pycache__
│ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ ├── request.cpython-312.pyc
│ │ │ │ │ └── response.cpython-312.pyc
│ │ │ │ ├── request.py
│ │ │ │ └── response.py
│ │ │ └── wsgi.py
│ │ └── werkzeug-3.0.4.dist-info
│ │ ├── INSTALLER
│ │ ├── LICENSE.txt
│ │ ├── METADATA
│ │ ├── RECORD
│ │ └── WHEEL
│ ├── pyvenv.cfg
│ ├── static
│ │ └── styles.css
│ ├── templates
│ │ └── index.html
│ └── test.py
├── cline_config.json
├── mcp_server.py
├── README.md
├── search_results.json
├── settings.json
└── test_files
├── text1.txt
└── text2.txt
```
# Files
--------------------------------------------------------------------------------
/.venv/lib/python3.12/site-packages/lxml/includes/libxml/xmlunicode.h:
--------------------------------------------------------------------------------
```
1 | /*
2 | * Summary: Unicode character APIs
3 | * Description: API for the Unicode character APIs
4 | *
5 | * This file is automatically generated from the
6 | * UCS description files of the Unicode Character Database
7 | * http://www.unicode.org/Public/4.0-Update1/UCD-4.0.1.html
8 | * using the genUnicode.py Python script.
9 | *
10 | * Generation date: Mon Mar 27 11:09:52 2006
11 | * Sources: Blocks-4.0.1.txt UnicodeData-4.0.1.txt
12 | * Author: Daniel Veillard
13 | */
14 |
15 | #ifndef __XML_UNICODE_H__
16 | #define __XML_UNICODE_H__
17 |
18 | #include <libxml/xmlversion.h>
19 |
20 | #ifdef LIBXML_UNICODE_ENABLED
21 |
22 | #ifdef __cplusplus
23 | extern "C" {
24 | #endif
25 |
26 | XMLPUBFUN int xmlUCSIsAegeanNumbers (int code);
27 | XMLPUBFUN int xmlUCSIsAlphabeticPresentationForms (int code);
28 | XMLPUBFUN int xmlUCSIsArabic (int code);
29 | XMLPUBFUN int xmlUCSIsArabicPresentationFormsA (int code);
30 | XMLPUBFUN int xmlUCSIsArabicPresentationFormsB (int code);
31 | XMLPUBFUN int xmlUCSIsArmenian (int code);
32 | XMLPUBFUN int xmlUCSIsArrows (int code);
33 | XMLPUBFUN int xmlUCSIsBasicLatin (int code);
34 | XMLPUBFUN int xmlUCSIsBengali (int code);
35 | XMLPUBFUN int xmlUCSIsBlockElements (int code);
36 | XMLPUBFUN int xmlUCSIsBopomofo (int code);
37 | XMLPUBFUN int xmlUCSIsBopomofoExtended (int code);
38 | XMLPUBFUN int xmlUCSIsBoxDrawing (int code);
39 | XMLPUBFUN int xmlUCSIsBraillePatterns (int code);
40 | XMLPUBFUN int xmlUCSIsBuhid (int code);
41 | XMLPUBFUN int xmlUCSIsByzantineMusicalSymbols (int code);
42 | XMLPUBFUN int xmlUCSIsCJKCompatibility (int code);
43 | XMLPUBFUN int xmlUCSIsCJKCompatibilityForms (int code);
44 | XMLPUBFUN int xmlUCSIsCJKCompatibilityIdeographs (int code);
45 | XMLPUBFUN int xmlUCSIsCJKCompatibilityIdeographsSupplement (int code);
46 | XMLPUBFUN int xmlUCSIsCJKRadicalsSupplement (int code);
47 | XMLPUBFUN int xmlUCSIsCJKSymbolsandPunctuation (int code);
48 | XMLPUBFUN int xmlUCSIsCJKUnifiedIdeographs (int code);
49 | XMLPUBFUN int xmlUCSIsCJKUnifiedIdeographsExtensionA (int code);
50 | XMLPUBFUN int xmlUCSIsCJKUnifiedIdeographsExtensionB (int code);
51 | XMLPUBFUN int xmlUCSIsCherokee (int code);
52 | XMLPUBFUN int xmlUCSIsCombiningDiacriticalMarks (int code);
53 | XMLPUBFUN int xmlUCSIsCombiningDiacriticalMarksforSymbols (int code);
54 | XMLPUBFUN int xmlUCSIsCombiningHalfMarks (int code);
55 | XMLPUBFUN int xmlUCSIsCombiningMarksforSymbols (int code);
56 | XMLPUBFUN int xmlUCSIsControlPictures (int code);
57 | XMLPUBFUN int xmlUCSIsCurrencySymbols (int code);
58 | XMLPUBFUN int xmlUCSIsCypriotSyllabary (int code);
59 | XMLPUBFUN int xmlUCSIsCyrillic (int code);
60 | XMLPUBFUN int xmlUCSIsCyrillicSupplement (int code);
61 | XMLPUBFUN int xmlUCSIsDeseret (int code);
62 | XMLPUBFUN int xmlUCSIsDevanagari (int code);
63 | XMLPUBFUN int xmlUCSIsDingbats (int code);
64 | XMLPUBFUN int xmlUCSIsEnclosedAlphanumerics (int code);
65 | XMLPUBFUN int xmlUCSIsEnclosedCJKLettersandMonths (int code);
66 | XMLPUBFUN int xmlUCSIsEthiopic (int code);
67 | XMLPUBFUN int xmlUCSIsGeneralPunctuation (int code);
68 | XMLPUBFUN int xmlUCSIsGeometricShapes (int code);
69 | XMLPUBFUN int xmlUCSIsGeorgian (int code);
70 | XMLPUBFUN int xmlUCSIsGothic (int code);
71 | XMLPUBFUN int xmlUCSIsGreek (int code);
72 | XMLPUBFUN int xmlUCSIsGreekExtended (int code);
73 | XMLPUBFUN int xmlUCSIsGreekandCoptic (int code);
74 | XMLPUBFUN int xmlUCSIsGujarati (int code);
75 | XMLPUBFUN int xmlUCSIsGurmukhi (int code);
76 | XMLPUBFUN int xmlUCSIsHalfwidthandFullwidthForms (int code);
77 | XMLPUBFUN int xmlUCSIsHangulCompatibilityJamo (int code);
78 | XMLPUBFUN int xmlUCSIsHangulJamo (int code);
79 | XMLPUBFUN int xmlUCSIsHangulSyllables (int code);
80 | XMLPUBFUN int xmlUCSIsHanunoo (int code);
81 | XMLPUBFUN int xmlUCSIsHebrew (int code);
82 | XMLPUBFUN int xmlUCSIsHighPrivateUseSurrogates (int code);
83 | XMLPUBFUN int xmlUCSIsHighSurrogates (int code);
84 | XMLPUBFUN int xmlUCSIsHiragana (int code);
85 | XMLPUBFUN int xmlUCSIsIPAExtensions (int code);
86 | XMLPUBFUN int xmlUCSIsIdeographicDescriptionCharacters (int code);
87 | XMLPUBFUN int xmlUCSIsKanbun (int code);
88 | XMLPUBFUN int xmlUCSIsKangxiRadicals (int code);
89 | XMLPUBFUN int xmlUCSIsKannada (int code);
90 | XMLPUBFUN int xmlUCSIsKatakana (int code);
91 | XMLPUBFUN int xmlUCSIsKatakanaPhoneticExtensions (int code);
92 | XMLPUBFUN int xmlUCSIsKhmer (int code);
93 | XMLPUBFUN int xmlUCSIsKhmerSymbols (int code);
94 | XMLPUBFUN int xmlUCSIsLao (int code);
95 | XMLPUBFUN int xmlUCSIsLatin1Supplement (int code);
96 | XMLPUBFUN int xmlUCSIsLatinExtendedA (int code);
97 | XMLPUBFUN int xmlUCSIsLatinExtendedB (int code);
98 | XMLPUBFUN int xmlUCSIsLatinExtendedAdditional (int code);
99 | XMLPUBFUN int xmlUCSIsLetterlikeSymbols (int code);
100 | XMLPUBFUN int xmlUCSIsLimbu (int code);
101 | XMLPUBFUN int xmlUCSIsLinearBIdeograms (int code);
102 | XMLPUBFUN int xmlUCSIsLinearBSyllabary (int code);
103 | XMLPUBFUN int xmlUCSIsLowSurrogates (int code);
104 | XMLPUBFUN int xmlUCSIsMalayalam (int code);
105 | XMLPUBFUN int xmlUCSIsMathematicalAlphanumericSymbols (int code);
106 | XMLPUBFUN int xmlUCSIsMathematicalOperators (int code);
107 | XMLPUBFUN int xmlUCSIsMiscellaneousMathematicalSymbolsA (int code);
108 | XMLPUBFUN int xmlUCSIsMiscellaneousMathematicalSymbolsB (int code);
109 | XMLPUBFUN int xmlUCSIsMiscellaneousSymbols (int code);
110 | XMLPUBFUN int xmlUCSIsMiscellaneousSymbolsandArrows (int code);
111 | XMLPUBFUN int xmlUCSIsMiscellaneousTechnical (int code);
112 | XMLPUBFUN int xmlUCSIsMongolian (int code);
113 | XMLPUBFUN int xmlUCSIsMusicalSymbols (int code);
114 | XMLPUBFUN int xmlUCSIsMyanmar (int code);
115 | XMLPUBFUN int xmlUCSIsNumberForms (int code);
116 | XMLPUBFUN int xmlUCSIsOgham (int code);
117 | XMLPUBFUN int xmlUCSIsOldItalic (int code);
118 | XMLPUBFUN int xmlUCSIsOpticalCharacterRecognition (int code);
119 | XMLPUBFUN int xmlUCSIsOriya (int code);
120 | XMLPUBFUN int xmlUCSIsOsmanya (int code);
121 | XMLPUBFUN int xmlUCSIsPhoneticExtensions (int code);
122 | XMLPUBFUN int xmlUCSIsPrivateUse (int code);
123 | XMLPUBFUN int xmlUCSIsPrivateUseArea (int code);
124 | XMLPUBFUN int xmlUCSIsRunic (int code);
125 | XMLPUBFUN int xmlUCSIsShavian (int code);
126 | XMLPUBFUN int xmlUCSIsSinhala (int code);
127 | XMLPUBFUN int xmlUCSIsSmallFormVariants (int code);
128 | XMLPUBFUN int xmlUCSIsSpacingModifierLetters (int code);
129 | XMLPUBFUN int xmlUCSIsSpecials (int code);
130 | XMLPUBFUN int xmlUCSIsSuperscriptsandSubscripts (int code);
131 | XMLPUBFUN int xmlUCSIsSupplementalArrowsA (int code);
132 | XMLPUBFUN int xmlUCSIsSupplementalArrowsB (int code);
133 | XMLPUBFUN int xmlUCSIsSupplementalMathematicalOperators (int code);
134 | XMLPUBFUN int xmlUCSIsSupplementaryPrivateUseAreaA (int code);
135 | XMLPUBFUN int xmlUCSIsSupplementaryPrivateUseAreaB (int code);
136 | XMLPUBFUN int xmlUCSIsSyriac (int code);
137 | XMLPUBFUN int xmlUCSIsTagalog (int code);
138 | XMLPUBFUN int xmlUCSIsTagbanwa (int code);
139 | XMLPUBFUN int xmlUCSIsTags (int code);
140 | XMLPUBFUN int xmlUCSIsTaiLe (int code);
141 | XMLPUBFUN int xmlUCSIsTaiXuanJingSymbols (int code);
142 | XMLPUBFUN int xmlUCSIsTamil (int code);
143 | XMLPUBFUN int xmlUCSIsTelugu (int code);
144 | XMLPUBFUN int xmlUCSIsThaana (int code);
145 | XMLPUBFUN int xmlUCSIsThai (int code);
146 | XMLPUBFUN int xmlUCSIsTibetan (int code);
147 | XMLPUBFUN int xmlUCSIsUgaritic (int code);
148 | XMLPUBFUN int xmlUCSIsUnifiedCanadianAboriginalSyllabics (int code);
149 | XMLPUBFUN int xmlUCSIsVariationSelectors (int code);
150 | XMLPUBFUN int xmlUCSIsVariationSelectorsSupplement (int code);
151 | XMLPUBFUN int xmlUCSIsYiRadicals (int code);
152 | XMLPUBFUN int xmlUCSIsYiSyllables (int code);
153 | XMLPUBFUN int xmlUCSIsYijingHexagramSymbols (int code);
154 |
155 | XMLPUBFUN int xmlUCSIsBlock (int code, const char *block);
156 |
157 | XMLPUBFUN int xmlUCSIsCatC (int code);
158 | XMLPUBFUN int xmlUCSIsCatCc (int code);
159 | XMLPUBFUN int xmlUCSIsCatCf (int code);
160 | XMLPUBFUN int xmlUCSIsCatCo (int code);
161 | XMLPUBFUN int xmlUCSIsCatCs (int code);
162 | XMLPUBFUN int xmlUCSIsCatL (int code);
163 | XMLPUBFUN int xmlUCSIsCatLl (int code);
164 | XMLPUBFUN int xmlUCSIsCatLm (int code);
165 | XMLPUBFUN int xmlUCSIsCatLo (int code);
166 | XMLPUBFUN int xmlUCSIsCatLt (int code);
167 | XMLPUBFUN int xmlUCSIsCatLu (int code);
168 | XMLPUBFUN int xmlUCSIsCatM (int code);
169 | XMLPUBFUN int xmlUCSIsCatMc (int code);
170 | XMLPUBFUN int xmlUCSIsCatMe (int code);
171 | XMLPUBFUN int xmlUCSIsCatMn (int code);
172 | XMLPUBFUN int xmlUCSIsCatN (int code);
173 | XMLPUBFUN int xmlUCSIsCatNd (int code);
174 | XMLPUBFUN int xmlUCSIsCatNl (int code);
175 | XMLPUBFUN int xmlUCSIsCatNo (int code);
176 | XMLPUBFUN int xmlUCSIsCatP (int code);
177 | XMLPUBFUN int xmlUCSIsCatPc (int code);
178 | XMLPUBFUN int xmlUCSIsCatPd (int code);
179 | XMLPUBFUN int xmlUCSIsCatPe (int code);
180 | XMLPUBFUN int xmlUCSIsCatPf (int code);
181 | XMLPUBFUN int xmlUCSIsCatPi (int code);
182 | XMLPUBFUN int xmlUCSIsCatPo (int code);
183 | XMLPUBFUN int xmlUCSIsCatPs (int code);
184 | XMLPUBFUN int xmlUCSIsCatS (int code);
185 | XMLPUBFUN int xmlUCSIsCatSc (int code);
186 | XMLPUBFUN int xmlUCSIsCatSk (int code);
187 | XMLPUBFUN int xmlUCSIsCatSm (int code);
188 | XMLPUBFUN int xmlUCSIsCatSo (int code);
189 | XMLPUBFUN int xmlUCSIsCatZ (int code);
190 | XMLPUBFUN int xmlUCSIsCatZl (int code);
191 | XMLPUBFUN int xmlUCSIsCatZp (int code);
192 | XMLPUBFUN int xmlUCSIsCatZs (int code);
193 |
194 | XMLPUBFUN int xmlUCSIsCat (int code, const char *cat);
195 |
196 | #ifdef __cplusplus
197 | }
198 | #endif
199 |
200 | #endif /* LIBXML_UNICODE_ENABLED */
201 |
202 | #endif /* __XML_UNICODE_H__ */
203 |
```
--------------------------------------------------------------------------------
/.venv/lib/python3.12/site-packages/pip/_internal/index/sources.py:
--------------------------------------------------------------------------------
```python
1 | import logging
2 | import mimetypes
3 | import os
4 | from collections import defaultdict
5 | from typing import Callable, Dict, Iterable, List, Optional, Tuple
6 |
7 | from pip._vendor.packaging.utils import (
8 | InvalidSdistFilename,
9 | InvalidVersion,
10 | InvalidWheelFilename,
11 | canonicalize_name,
12 | parse_sdist_filename,
13 | parse_wheel_filename,
14 | )
15 |
16 | from pip._internal.models.candidate import InstallationCandidate
17 | from pip._internal.models.link import Link
18 | from pip._internal.utils.urls import path_to_url, url_to_path
19 | from pip._internal.vcs import is_url
20 |
21 | logger = logging.getLogger(__name__)
22 |
23 | FoundCandidates = Iterable[InstallationCandidate]
24 | FoundLinks = Iterable[Link]
25 | CandidatesFromPage = Callable[[Link], Iterable[InstallationCandidate]]
26 | PageValidator = Callable[[Link], bool]
27 |
28 |
29 | class LinkSource:
30 | @property
31 | def link(self) -> Optional[Link]:
32 | """Returns the underlying link, if there's one."""
33 | raise NotImplementedError()
34 |
35 | def page_candidates(self) -> FoundCandidates:
36 | """Candidates found by parsing an archive listing HTML file."""
37 | raise NotImplementedError()
38 |
39 | def file_links(self) -> FoundLinks:
40 | """Links found by specifying archives directly."""
41 | raise NotImplementedError()
42 |
43 |
44 | def _is_html_file(file_url: str) -> bool:
45 | return mimetypes.guess_type(file_url, strict=False)[0] == "text/html"
46 |
47 |
48 | class _FlatDirectoryToUrls:
49 | """Scans directory and caches results"""
50 |
51 | def __init__(self, path: str) -> None:
52 | self._path = path
53 | self._page_candidates: List[str] = []
54 | self._project_name_to_urls: Dict[str, List[str]] = defaultdict(list)
55 | self._scanned_directory = False
56 |
57 | def _scan_directory(self) -> None:
58 | """Scans directory once and populates both page_candidates
59 | and project_name_to_urls at the same time
60 | """
61 | for entry in os.scandir(self._path):
62 | url = path_to_url(entry.path)
63 | if _is_html_file(url):
64 | self._page_candidates.append(url)
65 | continue
66 |
67 | # File must have a valid wheel or sdist name,
68 | # otherwise not worth considering as a package
69 | try:
70 | project_filename = parse_wheel_filename(entry.name)[0]
71 | except (InvalidWheelFilename, InvalidVersion):
72 | try:
73 | project_filename = parse_sdist_filename(entry.name)[0]
74 | except (InvalidSdistFilename, InvalidVersion):
75 | continue
76 |
77 | self._project_name_to_urls[project_filename].append(url)
78 | self._scanned_directory = True
79 |
80 | @property
81 | def page_candidates(self) -> List[str]:
82 | if not self._scanned_directory:
83 | self._scan_directory()
84 |
85 | return self._page_candidates
86 |
87 | @property
88 | def project_name_to_urls(self) -> Dict[str, List[str]]:
89 | if not self._scanned_directory:
90 | self._scan_directory()
91 |
92 | return self._project_name_to_urls
93 |
94 |
95 | class _FlatDirectorySource(LinkSource):
96 | """Link source specified by ``--find-links=<path-to-dir>``.
97 |
98 | This looks the content of the directory, and returns:
99 |
100 | * ``page_candidates``: Links listed on each HTML file in the directory.
101 | * ``file_candidates``: Archives in the directory.
102 | """
103 |
104 | _paths_to_urls: Dict[str, _FlatDirectoryToUrls] = {}
105 |
106 | def __init__(
107 | self,
108 | candidates_from_page: CandidatesFromPage,
109 | path: str,
110 | project_name: str,
111 | ) -> None:
112 | self._candidates_from_page = candidates_from_page
113 | self._project_name = canonicalize_name(project_name)
114 |
115 | # Get existing instance of _FlatDirectoryToUrls if it exists
116 | if path in self._paths_to_urls:
117 | self._path_to_urls = self._paths_to_urls[path]
118 | else:
119 | self._path_to_urls = _FlatDirectoryToUrls(path=path)
120 | self._paths_to_urls[path] = self._path_to_urls
121 |
122 | @property
123 | def link(self) -> Optional[Link]:
124 | return None
125 |
126 | def page_candidates(self) -> FoundCandidates:
127 | for url in self._path_to_urls.page_candidates:
128 | yield from self._candidates_from_page(Link(url))
129 |
130 | def file_links(self) -> FoundLinks:
131 | for url in self._path_to_urls.project_name_to_urls[self._project_name]:
132 | yield Link(url)
133 |
134 |
135 | class _LocalFileSource(LinkSource):
136 | """``--find-links=<path-or-url>`` or ``--[extra-]index-url=<path-or-url>``.
137 |
138 | If a URL is supplied, it must be a ``file:`` URL. If a path is supplied to
139 | the option, it is converted to a URL first. This returns:
140 |
141 | * ``page_candidates``: Links listed on an HTML file.
142 | * ``file_candidates``: The non-HTML file.
143 | """
144 |
145 | def __init__(
146 | self,
147 | candidates_from_page: CandidatesFromPage,
148 | link: Link,
149 | ) -> None:
150 | self._candidates_from_page = candidates_from_page
151 | self._link = link
152 |
153 | @property
154 | def link(self) -> Optional[Link]:
155 | return self._link
156 |
157 | def page_candidates(self) -> FoundCandidates:
158 | if not _is_html_file(self._link.url):
159 | return
160 | yield from self._candidates_from_page(self._link)
161 |
162 | def file_links(self) -> FoundLinks:
163 | if _is_html_file(self._link.url):
164 | return
165 | yield self._link
166 |
167 |
168 | class _RemoteFileSource(LinkSource):
169 | """``--find-links=<url>`` or ``--[extra-]index-url=<url>``.
170 |
171 | This returns:
172 |
173 | * ``page_candidates``: Links listed on an HTML file.
174 | * ``file_candidates``: The non-HTML file.
175 | """
176 |
177 | def __init__(
178 | self,
179 | candidates_from_page: CandidatesFromPage,
180 | page_validator: PageValidator,
181 | link: Link,
182 | ) -> None:
183 | self._candidates_from_page = candidates_from_page
184 | self._page_validator = page_validator
185 | self._link = link
186 |
187 | @property
188 | def link(self) -> Optional[Link]:
189 | return self._link
190 |
191 | def page_candidates(self) -> FoundCandidates:
192 | if not self._page_validator(self._link):
193 | return
194 | yield from self._candidates_from_page(self._link)
195 |
196 | def file_links(self) -> FoundLinks:
197 | yield self._link
198 |
199 |
200 | class _IndexDirectorySource(LinkSource):
201 | """``--[extra-]index-url=<path-to-directory>``.
202 |
203 | This is treated like a remote URL; ``candidates_from_page`` contains logic
204 | for this by appending ``index.html`` to the link.
205 | """
206 |
207 | def __init__(
208 | self,
209 | candidates_from_page: CandidatesFromPage,
210 | link: Link,
211 | ) -> None:
212 | self._candidates_from_page = candidates_from_page
213 | self._link = link
214 |
215 | @property
216 | def link(self) -> Optional[Link]:
217 | return self._link
218 |
219 | def page_candidates(self) -> FoundCandidates:
220 | yield from self._candidates_from_page(self._link)
221 |
222 | def file_links(self) -> FoundLinks:
223 | return ()
224 |
225 |
226 | def build_source(
227 | location: str,
228 | *,
229 | candidates_from_page: CandidatesFromPage,
230 | page_validator: PageValidator,
231 | expand_dir: bool,
232 | cache_link_parsing: bool,
233 | project_name: str,
234 | ) -> Tuple[Optional[str], Optional[LinkSource]]:
235 | path: Optional[str] = None
236 | url: Optional[str] = None
237 | if os.path.exists(location): # Is a local path.
238 | url = path_to_url(location)
239 | path = location
240 | elif location.startswith("file:"): # A file: URL.
241 | url = location
242 | path = url_to_path(location)
243 | elif is_url(location):
244 | url = location
245 |
246 | if url is None:
247 | msg = (
248 | "Location '%s' is ignored: "
249 | "it is either a non-existing path or lacks a specific scheme."
250 | )
251 | logger.warning(msg, location)
252 | return (None, None)
253 |
254 | if path is None:
255 | source: LinkSource = _RemoteFileSource(
256 | candidates_from_page=candidates_from_page,
257 | page_validator=page_validator,
258 | link=Link(url, cache_link_parsing=cache_link_parsing),
259 | )
260 | return (url, source)
261 |
262 | if os.path.isdir(path):
263 | if expand_dir:
264 | source = _FlatDirectorySource(
265 | candidates_from_page=candidates_from_page,
266 | path=path,
267 | project_name=project_name,
268 | )
269 | else:
270 | source = _IndexDirectorySource(
271 | candidates_from_page=candidates_from_page,
272 | link=Link(url, cache_link_parsing=cache_link_parsing),
273 | )
274 | return (url, source)
275 | elif os.path.isfile(path):
276 | source = _LocalFileSource(
277 | candidates_from_page=candidates_from_page,
278 | link=Link(url, cache_link_parsing=cache_link_parsing),
279 | )
280 | return (url, source)
281 | logger.warning(
282 | "Location '%s' is ignored: it is neither a file nor a directory.",
283 | location,
284 | )
285 | return (url, None)
286 |
```
--------------------------------------------------------------------------------
/.venv/lib/python3.12/site-packages/urllib3/contrib/emscripten/connection.py:
--------------------------------------------------------------------------------
```python
1 | from __future__ import annotations
2 |
3 | import os
4 | import typing
5 |
6 | # use http.client.HTTPException for consistency with non-emscripten
7 | from http.client import HTTPException as HTTPException # noqa: F401
8 | from http.client import ResponseNotReady
9 |
10 | from ..._base_connection import _TYPE_BODY
11 | from ...connection import HTTPConnection, ProxyConfig, port_by_scheme
12 | from ...exceptions import TimeoutError
13 | from ...response import BaseHTTPResponse
14 | from ...util.connection import _TYPE_SOCKET_OPTIONS
15 | from ...util.timeout import _DEFAULT_TIMEOUT, _TYPE_TIMEOUT
16 | from ...util.url import Url
17 | from .fetch import _RequestError, _TimeoutError, send_request, send_streaming_request
18 | from .request import EmscriptenRequest
19 | from .response import EmscriptenHttpResponseWrapper, EmscriptenResponse
20 |
21 | if typing.TYPE_CHECKING:
22 | from ..._base_connection import BaseHTTPConnection, BaseHTTPSConnection
23 |
24 |
25 | class EmscriptenHTTPConnection:
26 | default_port: typing.ClassVar[int] = port_by_scheme["http"]
27 | default_socket_options: typing.ClassVar[_TYPE_SOCKET_OPTIONS]
28 |
29 | timeout: None | (float)
30 |
31 | host: str
32 | port: int
33 | blocksize: int
34 | source_address: tuple[str, int] | None
35 | socket_options: _TYPE_SOCKET_OPTIONS | None
36 |
37 | proxy: Url | None
38 | proxy_config: ProxyConfig | None
39 |
40 | is_verified: bool = False
41 | proxy_is_verified: bool | None = None
42 |
43 | _response: EmscriptenResponse | None
44 |
45 | def __init__(
46 | self,
47 | host: str,
48 | port: int = 0,
49 | *,
50 | timeout: _TYPE_TIMEOUT = _DEFAULT_TIMEOUT,
51 | source_address: tuple[str, int] | None = None,
52 | blocksize: int = 8192,
53 | socket_options: _TYPE_SOCKET_OPTIONS | None = None,
54 | proxy: Url | None = None,
55 | proxy_config: ProxyConfig | None = None,
56 | ) -> None:
57 | self.host = host
58 | self.port = port
59 | self.timeout = timeout if isinstance(timeout, float) else 0.0
60 | self.scheme = "http"
61 | self._closed = True
62 | self._response = None
63 | # ignore these things because we don't
64 | # have control over that stuff
65 | self.proxy = None
66 | self.proxy_config = None
67 | self.blocksize = blocksize
68 | self.source_address = None
69 | self.socket_options = None
70 | self.is_verified = False
71 |
72 | def set_tunnel(
73 | self,
74 | host: str,
75 | port: int | None = 0,
76 | headers: typing.Mapping[str, str] | None = None,
77 | scheme: str = "http",
78 | ) -> None:
79 | pass
80 |
81 | def connect(self) -> None:
82 | pass
83 |
84 | def request(
85 | self,
86 | method: str,
87 | url: str,
88 | body: _TYPE_BODY | None = None,
89 | headers: typing.Mapping[str, str] | None = None,
90 | # We know *at least* botocore is depending on the order of the
91 | # first 3 parameters so to be safe we only mark the later ones
92 | # as keyword-only to ensure we have space to extend.
93 | *,
94 | chunked: bool = False,
95 | preload_content: bool = True,
96 | decode_content: bool = True,
97 | enforce_content_length: bool = True,
98 | ) -> None:
99 | self._closed = False
100 | if url.startswith("/"):
101 | # no scheme / host / port included, make a full url
102 | url = f"{self.scheme}://{self.host}:{self.port}" + url
103 | request = EmscriptenRequest(
104 | url=url,
105 | method=method,
106 | timeout=self.timeout if self.timeout else 0,
107 | decode_content=decode_content,
108 | )
109 | request.set_body(body)
110 | if headers:
111 | for k, v in headers.items():
112 | request.set_header(k, v)
113 | self._response = None
114 | try:
115 | if not preload_content:
116 | self._response = send_streaming_request(request)
117 | if self._response is None:
118 | self._response = send_request(request)
119 | except _TimeoutError as e:
120 | raise TimeoutError(e.message) from e
121 | except _RequestError as e:
122 | raise HTTPException(e.message) from e
123 |
124 | def getresponse(self) -> BaseHTTPResponse:
125 | if self._response is not None:
126 | return EmscriptenHttpResponseWrapper(
127 | internal_response=self._response,
128 | url=self._response.request.url,
129 | connection=self,
130 | )
131 | else:
132 | raise ResponseNotReady()
133 |
134 | def close(self) -> None:
135 | self._closed = True
136 | self._response = None
137 |
138 | @property
139 | def is_closed(self) -> bool:
140 | """Whether the connection either is brand new or has been previously closed.
141 | If this property is True then both ``is_connected`` and ``has_connected_to_proxy``
142 | properties must be False.
143 | """
144 | return self._closed
145 |
146 | @property
147 | def is_connected(self) -> bool:
148 | """Whether the connection is actively connected to any origin (proxy or target)"""
149 | return True
150 |
151 | @property
152 | def has_connected_to_proxy(self) -> bool:
153 | """Whether the connection has successfully connected to its proxy.
154 | This returns False if no proxy is in use. Used to determine whether
155 | errors are coming from the proxy layer or from tunnelling to the target origin.
156 | """
157 | return False
158 |
159 |
160 | class EmscriptenHTTPSConnection(EmscriptenHTTPConnection):
161 | default_port = port_by_scheme["https"]
162 | # all this is basically ignored, as browser handles https
163 | cert_reqs: int | str | None = None
164 | ca_certs: str | None = None
165 | ca_cert_dir: str | None = None
166 | ca_cert_data: None | str | bytes = None
167 | cert_file: str | None
168 | key_file: str | None
169 | key_password: str | None
170 | ssl_context: typing.Any | None
171 | ssl_version: int | str | None = None
172 | ssl_minimum_version: int | None = None
173 | ssl_maximum_version: int | None = None
174 | assert_hostname: None | str | typing.Literal[False]
175 | assert_fingerprint: str | None = None
176 |
177 | def __init__(
178 | self,
179 | host: str,
180 | port: int = 0,
181 | *,
182 | timeout: _TYPE_TIMEOUT = _DEFAULT_TIMEOUT,
183 | source_address: tuple[str, int] | None = None,
184 | blocksize: int = 16384,
185 | socket_options: None
186 | | _TYPE_SOCKET_OPTIONS = HTTPConnection.default_socket_options,
187 | proxy: Url | None = None,
188 | proxy_config: ProxyConfig | None = None,
189 | cert_reqs: int | str | None = None,
190 | assert_hostname: None | str | typing.Literal[False] = None,
191 | assert_fingerprint: str | None = None,
192 | server_hostname: str | None = None,
193 | ssl_context: typing.Any | None = None,
194 | ca_certs: str | None = None,
195 | ca_cert_dir: str | None = None,
196 | ca_cert_data: None | str | bytes = None,
197 | ssl_minimum_version: int | None = None,
198 | ssl_maximum_version: int | None = None,
199 | ssl_version: int | str | None = None, # Deprecated
200 | cert_file: str | None = None,
201 | key_file: str | None = None,
202 | key_password: str | None = None,
203 | ) -> None:
204 | super().__init__(
205 | host,
206 | port=port,
207 | timeout=timeout,
208 | source_address=source_address,
209 | blocksize=blocksize,
210 | socket_options=socket_options,
211 | proxy=proxy,
212 | proxy_config=proxy_config,
213 | )
214 | self.scheme = "https"
215 |
216 | self.key_file = key_file
217 | self.cert_file = cert_file
218 | self.key_password = key_password
219 | self.ssl_context = ssl_context
220 | self.server_hostname = server_hostname
221 | self.assert_hostname = assert_hostname
222 | self.assert_fingerprint = assert_fingerprint
223 | self.ssl_version = ssl_version
224 | self.ssl_minimum_version = ssl_minimum_version
225 | self.ssl_maximum_version = ssl_maximum_version
226 | self.ca_certs = ca_certs and os.path.expanduser(ca_certs)
227 | self.ca_cert_dir = ca_cert_dir and os.path.expanduser(ca_cert_dir)
228 | self.ca_cert_data = ca_cert_data
229 |
230 | self.cert_reqs = None
231 |
232 | # The browser will automatically verify all requests.
233 | # We have no control over that setting.
234 | self.is_verified = True
235 |
236 | def set_cert(
237 | self,
238 | key_file: str | None = None,
239 | cert_file: str | None = None,
240 | cert_reqs: int | str | None = None,
241 | key_password: str | None = None,
242 | ca_certs: str | None = None,
243 | assert_hostname: None | str | typing.Literal[False] = None,
244 | assert_fingerprint: str | None = None,
245 | ca_cert_dir: str | None = None,
246 | ca_cert_data: None | str | bytes = None,
247 | ) -> None:
248 | pass
249 |
250 |
251 | # verify that this class implements BaseHTTP(s) connection correctly
252 | if typing.TYPE_CHECKING:
253 | _supports_http_protocol: BaseHTTPConnection = EmscriptenHTTPConnection("", 0)
254 | _supports_https_protocol: BaseHTTPSConnection = EmscriptenHTTPSConnection("", 0)
255 |
```
--------------------------------------------------------------------------------
/.venv/lib/python3.12/site-packages/urllib3/util/ssltransport.py:
--------------------------------------------------------------------------------
```python
1 | from __future__ import annotations
2 |
3 | import io
4 | import socket
5 | import ssl
6 | import typing
7 |
8 | from ..exceptions import ProxySchemeUnsupported
9 |
10 | if typing.TYPE_CHECKING:
11 | from typing_extensions import Self
12 |
13 | from .ssl_ import _TYPE_PEER_CERT_RET, _TYPE_PEER_CERT_RET_DICT
14 |
15 |
16 | _WriteBuffer = typing.Union[bytearray, memoryview]
17 | _ReturnValue = typing.TypeVar("_ReturnValue")
18 |
19 | SSL_BLOCKSIZE = 16384
20 |
21 |
22 | class SSLTransport:
23 | """
24 | The SSLTransport wraps an existing socket and establishes an SSL connection.
25 |
26 | Contrary to Python's implementation of SSLSocket, it allows you to chain
27 | multiple TLS connections together. It's particularly useful if you need to
28 | implement TLS within TLS.
29 |
30 | The class supports most of the socket API operations.
31 | """
32 |
33 | @staticmethod
34 | def _validate_ssl_context_for_tls_in_tls(ssl_context: ssl.SSLContext) -> None:
35 | """
36 | Raises a ProxySchemeUnsupported if the provided ssl_context can't be used
37 | for TLS in TLS.
38 |
39 | The only requirement is that the ssl_context provides the 'wrap_bio'
40 | methods.
41 | """
42 |
43 | if not hasattr(ssl_context, "wrap_bio"):
44 | raise ProxySchemeUnsupported(
45 | "TLS in TLS requires SSLContext.wrap_bio() which isn't "
46 | "available on non-native SSLContext"
47 | )
48 |
49 | def __init__(
50 | self,
51 | socket: socket.socket,
52 | ssl_context: ssl.SSLContext,
53 | server_hostname: str | None = None,
54 | suppress_ragged_eofs: bool = True,
55 | ) -> None:
56 | """
57 | Create an SSLTransport around socket using the provided ssl_context.
58 | """
59 | self.incoming = ssl.MemoryBIO()
60 | self.outgoing = ssl.MemoryBIO()
61 |
62 | self.suppress_ragged_eofs = suppress_ragged_eofs
63 | self.socket = socket
64 |
65 | self.sslobj = ssl_context.wrap_bio(
66 | self.incoming, self.outgoing, server_hostname=server_hostname
67 | )
68 |
69 | # Perform initial handshake.
70 | self._ssl_io_loop(self.sslobj.do_handshake)
71 |
72 | def __enter__(self) -> Self:
73 | return self
74 |
75 | def __exit__(self, *_: typing.Any) -> None:
76 | self.close()
77 |
78 | def fileno(self) -> int:
79 | return self.socket.fileno()
80 |
81 | def read(self, len: int = 1024, buffer: typing.Any | None = None) -> int | bytes:
82 | return self._wrap_ssl_read(len, buffer)
83 |
84 | def recv(self, buflen: int = 1024, flags: int = 0) -> int | bytes:
85 | if flags != 0:
86 | raise ValueError("non-zero flags not allowed in calls to recv")
87 | return self._wrap_ssl_read(buflen)
88 |
89 | def recv_into(
90 | self,
91 | buffer: _WriteBuffer,
92 | nbytes: int | None = None,
93 | flags: int = 0,
94 | ) -> None | int | bytes:
95 | if flags != 0:
96 | raise ValueError("non-zero flags not allowed in calls to recv_into")
97 | if nbytes is None:
98 | nbytes = len(buffer)
99 | return self.read(nbytes, buffer)
100 |
101 | def sendall(self, data: bytes, flags: int = 0) -> None:
102 | if flags != 0:
103 | raise ValueError("non-zero flags not allowed in calls to sendall")
104 | count = 0
105 | with memoryview(data) as view, view.cast("B") as byte_view:
106 | amount = len(byte_view)
107 | while count < amount:
108 | v = self.send(byte_view[count:])
109 | count += v
110 |
111 | def send(self, data: bytes, flags: int = 0) -> int:
112 | if flags != 0:
113 | raise ValueError("non-zero flags not allowed in calls to send")
114 | return self._ssl_io_loop(self.sslobj.write, data)
115 |
116 | def makefile(
117 | self,
118 | mode: str,
119 | buffering: int | None = None,
120 | *,
121 | encoding: str | None = None,
122 | errors: str | None = None,
123 | newline: str | None = None,
124 | ) -> typing.BinaryIO | typing.TextIO | socket.SocketIO:
125 | """
126 | Python's httpclient uses makefile and buffered io when reading HTTP
127 | messages and we need to support it.
128 |
129 | This is unfortunately a copy and paste of socket.py makefile with small
130 | changes to point to the socket directly.
131 | """
132 | if not set(mode) <= {"r", "w", "b"}:
133 | raise ValueError(f"invalid mode {mode!r} (only r, w, b allowed)")
134 |
135 | writing = "w" in mode
136 | reading = "r" in mode or not writing
137 | assert reading or writing
138 | binary = "b" in mode
139 | rawmode = ""
140 | if reading:
141 | rawmode += "r"
142 | if writing:
143 | rawmode += "w"
144 | raw = socket.SocketIO(self, rawmode) # type: ignore[arg-type]
145 | self.socket._io_refs += 1 # type: ignore[attr-defined]
146 | if buffering is None:
147 | buffering = -1
148 | if buffering < 0:
149 | buffering = io.DEFAULT_BUFFER_SIZE
150 | if buffering == 0:
151 | if not binary:
152 | raise ValueError("unbuffered streams must be binary")
153 | return raw
154 | buffer: typing.BinaryIO
155 | if reading and writing:
156 | buffer = io.BufferedRWPair(raw, raw, buffering) # type: ignore[assignment]
157 | elif reading:
158 | buffer = io.BufferedReader(raw, buffering)
159 | else:
160 | assert writing
161 | buffer = io.BufferedWriter(raw, buffering)
162 | if binary:
163 | return buffer
164 | text = io.TextIOWrapper(buffer, encoding, errors, newline)
165 | text.mode = mode # type: ignore[misc]
166 | return text
167 |
168 | def unwrap(self) -> None:
169 | self._ssl_io_loop(self.sslobj.unwrap)
170 |
171 | def close(self) -> None:
172 | self.socket.close()
173 |
174 | @typing.overload
175 | def getpeercert(
176 | self, binary_form: typing.Literal[False] = ...
177 | ) -> _TYPE_PEER_CERT_RET_DICT | None:
178 | ...
179 |
180 | @typing.overload
181 | def getpeercert(self, binary_form: typing.Literal[True]) -> bytes | None:
182 | ...
183 |
184 | def getpeercert(self, binary_form: bool = False) -> _TYPE_PEER_CERT_RET:
185 | return self.sslobj.getpeercert(binary_form) # type: ignore[return-value]
186 |
187 | def version(self) -> str | None:
188 | return self.sslobj.version()
189 |
190 | def cipher(self) -> tuple[str, str, int] | None:
191 | return self.sslobj.cipher()
192 |
193 | def selected_alpn_protocol(self) -> str | None:
194 | return self.sslobj.selected_alpn_protocol()
195 |
196 | def shared_ciphers(self) -> list[tuple[str, str, int]] | None:
197 | return self.sslobj.shared_ciphers()
198 |
199 | def compression(self) -> str | None:
200 | return self.sslobj.compression()
201 |
202 | def settimeout(self, value: float | None) -> None:
203 | self.socket.settimeout(value)
204 |
205 | def gettimeout(self) -> float | None:
206 | return self.socket.gettimeout()
207 |
208 | def _decref_socketios(self) -> None:
209 | self.socket._decref_socketios() # type: ignore[attr-defined]
210 |
211 | def _wrap_ssl_read(self, len: int, buffer: bytearray | None = None) -> int | bytes:
212 | try:
213 | return self._ssl_io_loop(self.sslobj.read, len, buffer)
214 | except ssl.SSLError as e:
215 | if e.errno == ssl.SSL_ERROR_EOF and self.suppress_ragged_eofs:
216 | return 0 # eof, return 0.
217 | else:
218 | raise
219 |
220 | # func is sslobj.do_handshake or sslobj.unwrap
221 | @typing.overload
222 | def _ssl_io_loop(self, func: typing.Callable[[], None]) -> None:
223 | ...
224 |
225 | # func is sslobj.write, arg1 is data
226 | @typing.overload
227 | def _ssl_io_loop(self, func: typing.Callable[[bytes], int], arg1: bytes) -> int:
228 | ...
229 |
230 | # func is sslobj.read, arg1 is len, arg2 is buffer
231 | @typing.overload
232 | def _ssl_io_loop(
233 | self,
234 | func: typing.Callable[[int, bytearray | None], bytes],
235 | arg1: int,
236 | arg2: bytearray | None,
237 | ) -> bytes:
238 | ...
239 |
240 | def _ssl_io_loop(
241 | self,
242 | func: typing.Callable[..., _ReturnValue],
243 | arg1: None | bytes | int = None,
244 | arg2: bytearray | None = None,
245 | ) -> _ReturnValue:
246 | """Performs an I/O loop between incoming/outgoing and the socket."""
247 | should_loop = True
248 | ret = None
249 |
250 | while should_loop:
251 | errno = None
252 | try:
253 | if arg1 is None and arg2 is None:
254 | ret = func()
255 | elif arg2 is None:
256 | ret = func(arg1)
257 | else:
258 | ret = func(arg1, arg2)
259 | except ssl.SSLError as e:
260 | if e.errno not in (ssl.SSL_ERROR_WANT_READ, ssl.SSL_ERROR_WANT_WRITE):
261 | # WANT_READ, and WANT_WRITE are expected, others are not.
262 | raise e
263 | errno = e.errno
264 |
265 | buf = self.outgoing.read()
266 | self.socket.sendall(buf)
267 |
268 | if errno is None:
269 | should_loop = False
270 | elif errno == ssl.SSL_ERROR_WANT_READ:
271 | buf = self.socket.recv(SSL_BLOCKSIZE)
272 | if buf:
273 | self.incoming.write(buf)
274 | else:
275 | self.incoming.write_eof()
276 | return typing.cast(_ReturnValue, ret)
277 |
```
--------------------------------------------------------------------------------
/.venv/lib/python3.12/site-packages/pip/_internal/utils/subprocess.py:
--------------------------------------------------------------------------------
```python
1 | import logging
2 | import os
3 | import shlex
4 | import subprocess
5 | from typing import Any, Callable, Iterable, List, Literal, Mapping, Optional, Union
6 |
7 | from pip._vendor.rich.markup import escape
8 |
9 | from pip._internal.cli.spinners import SpinnerInterface, open_spinner
10 | from pip._internal.exceptions import InstallationSubprocessError
11 | from pip._internal.utils.logging import VERBOSE, subprocess_logger
12 | from pip._internal.utils.misc import HiddenText
13 |
14 | CommandArgs = List[Union[str, HiddenText]]
15 |
16 |
17 | def make_command(*args: Union[str, HiddenText, CommandArgs]) -> CommandArgs:
18 | """
19 | Create a CommandArgs object.
20 | """
21 | command_args: CommandArgs = []
22 | for arg in args:
23 | # Check for list instead of CommandArgs since CommandArgs is
24 | # only known during type-checking.
25 | if isinstance(arg, list):
26 | command_args.extend(arg)
27 | else:
28 | # Otherwise, arg is str or HiddenText.
29 | command_args.append(arg)
30 |
31 | return command_args
32 |
33 |
34 | def format_command_args(args: Union[List[str], CommandArgs]) -> str:
35 | """
36 | Format command arguments for display.
37 | """
38 | # For HiddenText arguments, display the redacted form by calling str().
39 | # Also, we don't apply str() to arguments that aren't HiddenText since
40 | # this can trigger a UnicodeDecodeError in Python 2 if the argument
41 | # has type unicode and includes a non-ascii character. (The type
42 | # checker doesn't ensure the annotations are correct in all cases.)
43 | return " ".join(
44 | shlex.quote(str(arg)) if isinstance(arg, HiddenText) else shlex.quote(arg)
45 | for arg in args
46 | )
47 |
48 |
49 | def reveal_command_args(args: Union[List[str], CommandArgs]) -> List[str]:
50 | """
51 | Return the arguments in their raw, unredacted form.
52 | """
53 | return [arg.secret if isinstance(arg, HiddenText) else arg for arg in args]
54 |
55 |
56 | def call_subprocess(
57 | cmd: Union[List[str], CommandArgs],
58 | show_stdout: bool = False,
59 | cwd: Optional[str] = None,
60 | on_returncode: 'Literal["raise", "warn", "ignore"]' = "raise",
61 | extra_ok_returncodes: Optional[Iterable[int]] = None,
62 | extra_environ: Optional[Mapping[str, Any]] = None,
63 | unset_environ: Optional[Iterable[str]] = None,
64 | spinner: Optional[SpinnerInterface] = None,
65 | log_failed_cmd: Optional[bool] = True,
66 | stdout_only: Optional[bool] = False,
67 | *,
68 | command_desc: str,
69 | ) -> str:
70 | """
71 | Args:
72 | show_stdout: if true, use INFO to log the subprocess's stderr and
73 | stdout streams. Otherwise, use DEBUG. Defaults to False.
74 | extra_ok_returncodes: an iterable of integer return codes that are
75 | acceptable, in addition to 0. Defaults to None, which means [].
76 | unset_environ: an iterable of environment variable names to unset
77 | prior to calling subprocess.Popen().
78 | log_failed_cmd: if false, failed commands are not logged, only raised.
79 | stdout_only: if true, return only stdout, else return both. When true,
80 | logging of both stdout and stderr occurs when the subprocess has
81 | terminated, else logging occurs as subprocess output is produced.
82 | """
83 | if extra_ok_returncodes is None:
84 | extra_ok_returncodes = []
85 | if unset_environ is None:
86 | unset_environ = []
87 | # Most places in pip use show_stdout=False. What this means is--
88 | #
89 | # - We connect the child's output (combined stderr and stdout) to a
90 | # single pipe, which we read.
91 | # - We log this output to stderr at DEBUG level as it is received.
92 | # - If DEBUG logging isn't enabled (e.g. if --verbose logging wasn't
93 | # requested), then we show a spinner so the user can still see the
94 | # subprocess is in progress.
95 | # - If the subprocess exits with an error, we log the output to stderr
96 | # at ERROR level if it hasn't already been displayed to the console
97 | # (e.g. if --verbose logging wasn't enabled). This way we don't log
98 | # the output to the console twice.
99 | #
100 | # If show_stdout=True, then the above is still done, but with DEBUG
101 | # replaced by INFO.
102 | if show_stdout:
103 | # Then log the subprocess output at INFO level.
104 | log_subprocess: Callable[..., None] = subprocess_logger.info
105 | used_level = logging.INFO
106 | else:
107 | # Then log the subprocess output using VERBOSE. This also ensures
108 | # it will be logged to the log file (aka user_log), if enabled.
109 | log_subprocess = subprocess_logger.verbose
110 | used_level = VERBOSE
111 |
112 | # Whether the subprocess will be visible in the console.
113 | showing_subprocess = subprocess_logger.getEffectiveLevel() <= used_level
114 |
115 | # Only use the spinner if we're not showing the subprocess output
116 | # and we have a spinner.
117 | use_spinner = not showing_subprocess and spinner is not None
118 |
119 | log_subprocess("Running command %s", command_desc)
120 | env = os.environ.copy()
121 | if extra_environ:
122 | env.update(extra_environ)
123 | for name in unset_environ:
124 | env.pop(name, None)
125 | try:
126 | proc = subprocess.Popen(
127 | # Convert HiddenText objects to the underlying str.
128 | reveal_command_args(cmd),
129 | stdin=subprocess.PIPE,
130 | stdout=subprocess.PIPE,
131 | stderr=subprocess.STDOUT if not stdout_only else subprocess.PIPE,
132 | cwd=cwd,
133 | env=env,
134 | errors="backslashreplace",
135 | )
136 | except Exception as exc:
137 | if log_failed_cmd:
138 | subprocess_logger.critical(
139 | "Error %s while executing command %s",
140 | exc,
141 | command_desc,
142 | )
143 | raise
144 | all_output = []
145 | if not stdout_only:
146 | assert proc.stdout
147 | assert proc.stdin
148 | proc.stdin.close()
149 | # In this mode, stdout and stderr are in the same pipe.
150 | while True:
151 | line: str = proc.stdout.readline()
152 | if not line:
153 | break
154 | line = line.rstrip()
155 | all_output.append(line + "\n")
156 |
157 | # Show the line immediately.
158 | log_subprocess(line)
159 | # Update the spinner.
160 | if use_spinner:
161 | assert spinner
162 | spinner.spin()
163 | try:
164 | proc.wait()
165 | finally:
166 | if proc.stdout:
167 | proc.stdout.close()
168 | output = "".join(all_output)
169 | else:
170 | # In this mode, stdout and stderr are in different pipes.
171 | # We must use communicate() which is the only safe way to read both.
172 | out, err = proc.communicate()
173 | # log line by line to preserve pip log indenting
174 | for out_line in out.splitlines():
175 | log_subprocess(out_line)
176 | all_output.append(out)
177 | for err_line in err.splitlines():
178 | log_subprocess(err_line)
179 | all_output.append(err)
180 | output = out
181 |
182 | proc_had_error = proc.returncode and proc.returncode not in extra_ok_returncodes
183 | if use_spinner:
184 | assert spinner
185 | if proc_had_error:
186 | spinner.finish("error")
187 | else:
188 | spinner.finish("done")
189 | if proc_had_error:
190 | if on_returncode == "raise":
191 | error = InstallationSubprocessError(
192 | command_description=command_desc,
193 | exit_code=proc.returncode,
194 | output_lines=all_output if not showing_subprocess else None,
195 | )
196 | if log_failed_cmd:
197 | subprocess_logger.error("%s", error, extra={"rich": True})
198 | subprocess_logger.verbose(
199 | "[bold magenta]full command[/]: [blue]%s[/]",
200 | escape(format_command_args(cmd)),
201 | extra={"markup": True},
202 | )
203 | subprocess_logger.verbose(
204 | "[bold magenta]cwd[/]: %s",
205 | escape(cwd or "[inherit]"),
206 | extra={"markup": True},
207 | )
208 |
209 | raise error
210 | elif on_returncode == "warn":
211 | subprocess_logger.warning(
212 | 'Command "%s" had error code %s in %s',
213 | command_desc,
214 | proc.returncode,
215 | cwd,
216 | )
217 | elif on_returncode == "ignore":
218 | pass
219 | else:
220 | raise ValueError(f"Invalid value: on_returncode={on_returncode!r}")
221 | return output
222 |
223 |
224 | def runner_with_spinner_message(message: str) -> Callable[..., None]:
225 | """Provide a subprocess_runner that shows a spinner message.
226 |
227 | Intended for use with for BuildBackendHookCaller. Thus, the runner has
228 | an API that matches what's expected by BuildBackendHookCaller.subprocess_runner.
229 | """
230 |
231 | def runner(
232 | cmd: List[str],
233 | cwd: Optional[str] = None,
234 | extra_environ: Optional[Mapping[str, Any]] = None,
235 | ) -> None:
236 | with open_spinner(message) as spinner:
237 | call_subprocess(
238 | cmd,
239 | command_desc=message,
240 | cwd=cwd,
241 | extra_environ=extra_environ,
242 | spinner=spinner,
243 | )
244 |
245 | return runner
246 |
```
--------------------------------------------------------------------------------
/.venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/api.py:
--------------------------------------------------------------------------------
```python
1 | """Base API."""
2 |
3 | from __future__ import annotations
4 |
5 | import os
6 | from abc import ABC, abstractmethod
7 | from pathlib import Path
8 | from typing import TYPE_CHECKING
9 |
10 | if TYPE_CHECKING:
11 | from typing import Iterator, Literal
12 |
13 |
14 | class PlatformDirsABC(ABC): # noqa: PLR0904
15 | """Abstract base class for platform directories."""
16 |
17 | def __init__( # noqa: PLR0913, PLR0917
18 | self,
19 | appname: str | None = None,
20 | appauthor: str | None | Literal[False] = None,
21 | version: str | None = None,
22 | roaming: bool = False, # noqa: FBT001, FBT002
23 | multipath: bool = False, # noqa: FBT001, FBT002
24 | opinion: bool = True, # noqa: FBT001, FBT002
25 | ensure_exists: bool = False, # noqa: FBT001, FBT002
26 | ) -> None:
27 | """
28 | Create a new platform directory.
29 |
30 | :param appname: See `appname`.
31 | :param appauthor: See `appauthor`.
32 | :param version: See `version`.
33 | :param roaming: See `roaming`.
34 | :param multipath: See `multipath`.
35 | :param opinion: See `opinion`.
36 | :param ensure_exists: See `ensure_exists`.
37 |
38 | """
39 | self.appname = appname #: The name of application.
40 | self.appauthor = appauthor
41 | """
42 | The name of the app author or distributing body for this application.
43 |
44 | Typically, it is the owning company name. Defaults to `appname`. You may pass ``False`` to disable it.
45 |
46 | """
47 | self.version = version
48 | """
49 | An optional version path element to append to the path.
50 |
51 | You might want to use this if you want multiple versions of your app to be able to run independently. If used,
52 | this would typically be ``<major>.<minor>``.
53 |
54 | """
55 | self.roaming = roaming
56 | """
57 | Whether to use the roaming appdata directory on Windows.
58 |
59 | That means that for users on a Windows network setup for roaming profiles, this user data will be synced on
60 | login (see
61 | `here <https://technet.microsoft.com/en-us/library/cc766489(WS.10).aspx>`_).
62 |
63 | """
64 | self.multipath = multipath
65 | """
66 | An optional parameter which indicates that the entire list of data dirs should be returned.
67 |
68 | By default, the first item would only be returned.
69 |
70 | """
71 | self.opinion = opinion #: A flag to indicating to use opinionated values.
72 | self.ensure_exists = ensure_exists
73 | """
74 | Optionally create the directory (and any missing parents) upon access if it does not exist.
75 |
76 | By default, no directories are created.
77 |
78 | """
79 |
80 | def _append_app_name_and_version(self, *base: str) -> str:
81 | params = list(base[1:])
82 | if self.appname:
83 | params.append(self.appname)
84 | if self.version:
85 | params.append(self.version)
86 | path = os.path.join(base[0], *params) # noqa: PTH118
87 | self._optionally_create_directory(path)
88 | return path
89 |
90 | def _optionally_create_directory(self, path: str) -> None:
91 | if self.ensure_exists:
92 | Path(path).mkdir(parents=True, exist_ok=True)
93 |
94 | @property
95 | @abstractmethod
96 | def user_data_dir(self) -> str:
97 | """:return: data directory tied to the user"""
98 |
99 | @property
100 | @abstractmethod
101 | def site_data_dir(self) -> str:
102 | """:return: data directory shared by users"""
103 |
104 | @property
105 | @abstractmethod
106 | def user_config_dir(self) -> str:
107 | """:return: config directory tied to the user"""
108 |
109 | @property
110 | @abstractmethod
111 | def site_config_dir(self) -> str:
112 | """:return: config directory shared by the users"""
113 |
114 | @property
115 | @abstractmethod
116 | def user_cache_dir(self) -> str:
117 | """:return: cache directory tied to the user"""
118 |
119 | @property
120 | @abstractmethod
121 | def site_cache_dir(self) -> str:
122 | """:return: cache directory shared by users"""
123 |
124 | @property
125 | @abstractmethod
126 | def user_state_dir(self) -> str:
127 | """:return: state directory tied to the user"""
128 |
129 | @property
130 | @abstractmethod
131 | def user_log_dir(self) -> str:
132 | """:return: log directory tied to the user"""
133 |
134 | @property
135 | @abstractmethod
136 | def user_documents_dir(self) -> str:
137 | """:return: documents directory tied to the user"""
138 |
139 | @property
140 | @abstractmethod
141 | def user_downloads_dir(self) -> str:
142 | """:return: downloads directory tied to the user"""
143 |
144 | @property
145 | @abstractmethod
146 | def user_pictures_dir(self) -> str:
147 | """:return: pictures directory tied to the user"""
148 |
149 | @property
150 | @abstractmethod
151 | def user_videos_dir(self) -> str:
152 | """:return: videos directory tied to the user"""
153 |
154 | @property
155 | @abstractmethod
156 | def user_music_dir(self) -> str:
157 | """:return: music directory tied to the user"""
158 |
159 | @property
160 | @abstractmethod
161 | def user_desktop_dir(self) -> str:
162 | """:return: desktop directory tied to the user"""
163 |
164 | @property
165 | @abstractmethod
166 | def user_runtime_dir(self) -> str:
167 | """:return: runtime directory tied to the user"""
168 |
169 | @property
170 | @abstractmethod
171 | def site_runtime_dir(self) -> str:
172 | """:return: runtime directory shared by users"""
173 |
174 | @property
175 | def user_data_path(self) -> Path:
176 | """:return: data path tied to the user"""
177 | return Path(self.user_data_dir)
178 |
179 | @property
180 | def site_data_path(self) -> Path:
181 | """:return: data path shared by users"""
182 | return Path(self.site_data_dir)
183 |
184 | @property
185 | def user_config_path(self) -> Path:
186 | """:return: config path tied to the user"""
187 | return Path(self.user_config_dir)
188 |
189 | @property
190 | def site_config_path(self) -> Path:
191 | """:return: config path shared by the users"""
192 | return Path(self.site_config_dir)
193 |
194 | @property
195 | def user_cache_path(self) -> Path:
196 | """:return: cache path tied to the user"""
197 | return Path(self.user_cache_dir)
198 |
199 | @property
200 | def site_cache_path(self) -> Path:
201 | """:return: cache path shared by users"""
202 | return Path(self.site_cache_dir)
203 |
204 | @property
205 | def user_state_path(self) -> Path:
206 | """:return: state path tied to the user"""
207 | return Path(self.user_state_dir)
208 |
209 | @property
210 | def user_log_path(self) -> Path:
211 | """:return: log path tied to the user"""
212 | return Path(self.user_log_dir)
213 |
214 | @property
215 | def user_documents_path(self) -> Path:
216 | """:return: documents a path tied to the user"""
217 | return Path(self.user_documents_dir)
218 |
219 | @property
220 | def user_downloads_path(self) -> Path:
221 | """:return: downloads path tied to the user"""
222 | return Path(self.user_downloads_dir)
223 |
224 | @property
225 | def user_pictures_path(self) -> Path:
226 | """:return: pictures path tied to the user"""
227 | return Path(self.user_pictures_dir)
228 |
229 | @property
230 | def user_videos_path(self) -> Path:
231 | """:return: videos path tied to the user"""
232 | return Path(self.user_videos_dir)
233 |
234 | @property
235 | def user_music_path(self) -> Path:
236 | """:return: music path tied to the user"""
237 | return Path(self.user_music_dir)
238 |
239 | @property
240 | def user_desktop_path(self) -> Path:
241 | """:return: desktop path tied to the user"""
242 | return Path(self.user_desktop_dir)
243 |
244 | @property
245 | def user_runtime_path(self) -> Path:
246 | """:return: runtime path tied to the user"""
247 | return Path(self.user_runtime_dir)
248 |
249 | @property
250 | def site_runtime_path(self) -> Path:
251 | """:return: runtime path shared by users"""
252 | return Path(self.site_runtime_dir)
253 |
254 | def iter_config_dirs(self) -> Iterator[str]:
255 | """:yield: all user and site configuration directories."""
256 | yield self.user_config_dir
257 | yield self.site_config_dir
258 |
259 | def iter_data_dirs(self) -> Iterator[str]:
260 | """:yield: all user and site data directories."""
261 | yield self.user_data_dir
262 | yield self.site_data_dir
263 |
264 | def iter_cache_dirs(self) -> Iterator[str]:
265 | """:yield: all user and site cache directories."""
266 | yield self.user_cache_dir
267 | yield self.site_cache_dir
268 |
269 | def iter_runtime_dirs(self) -> Iterator[str]:
270 | """:yield: all user and site runtime directories."""
271 | yield self.user_runtime_dir
272 | yield self.site_runtime_dir
273 |
274 | def iter_config_paths(self) -> Iterator[Path]:
275 | """:yield: all user and site configuration paths."""
276 | for path in self.iter_config_dirs():
277 | yield Path(path)
278 |
279 | def iter_data_paths(self) -> Iterator[Path]:
280 | """:yield: all user and site data paths."""
281 | for path in self.iter_data_dirs():
282 | yield Path(path)
283 |
284 | def iter_cache_paths(self) -> Iterator[Path]:
285 | """:yield: all user and site cache paths."""
286 | for path in self.iter_cache_dirs():
287 | yield Path(path)
288 |
289 | def iter_runtime_paths(self) -> Iterator[Path]:
290 | """:yield: all user and site runtime paths."""
291 | for path in self.iter_runtime_dirs():
292 | yield Path(path)
293 |
```