This is page 23 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/pip/_vendor/urllib3/request.py:
--------------------------------------------------------------------------------
```python
1 | from __future__ import absolute_import
2 |
3 | import sys
4 |
5 | from .filepost import encode_multipart_formdata
6 | from .packages import six
7 | from .packages.six.moves.urllib.parse import urlencode
8 |
9 | __all__ = ["RequestMethods"]
10 |
11 |
12 | class RequestMethods(object):
13 | """
14 | Convenience mixin for classes who implement a :meth:`urlopen` method, such
15 | as :class:`urllib3.HTTPConnectionPool` and
16 | :class:`urllib3.PoolManager`.
17 |
18 | Provides behavior for making common types of HTTP request methods and
19 | decides which type of request field encoding to use.
20 |
21 | Specifically,
22 |
23 | :meth:`.request_encode_url` is for sending requests whose fields are
24 | encoded in the URL (such as GET, HEAD, DELETE).
25 |
26 | :meth:`.request_encode_body` is for sending requests whose fields are
27 | encoded in the *body* of the request using multipart or www-form-urlencoded
28 | (such as for POST, PUT, PATCH).
29 |
30 | :meth:`.request` is for making any kind of request, it will look up the
31 | appropriate encoding format and use one of the above two methods to make
32 | the request.
33 |
34 | Initializer parameters:
35 |
36 | :param headers:
37 | Headers to include with all requests, unless other headers are given
38 | explicitly.
39 | """
40 |
41 | _encode_url_methods = {"DELETE", "GET", "HEAD", "OPTIONS"}
42 |
43 | def __init__(self, headers=None):
44 | self.headers = headers or {}
45 |
46 | def urlopen(
47 | self,
48 | method,
49 | url,
50 | body=None,
51 | headers=None,
52 | encode_multipart=True,
53 | multipart_boundary=None,
54 | **kw
55 | ): # Abstract
56 | raise NotImplementedError(
57 | "Classes extending RequestMethods must implement "
58 | "their own ``urlopen`` method."
59 | )
60 |
61 | def request(self, method, url, fields=None, headers=None, **urlopen_kw):
62 | """
63 | Make a request using :meth:`urlopen` with the appropriate encoding of
64 | ``fields`` based on the ``method`` used.
65 |
66 | This is a convenience method that requires the least amount of manual
67 | effort. It can be used in most situations, while still having the
68 | option to drop down to more specific methods when necessary, such as
69 | :meth:`request_encode_url`, :meth:`request_encode_body`,
70 | or even the lowest level :meth:`urlopen`.
71 | """
72 | method = method.upper()
73 |
74 | urlopen_kw["request_url"] = url
75 |
76 | if method in self._encode_url_methods:
77 | return self.request_encode_url(
78 | method, url, fields=fields, headers=headers, **urlopen_kw
79 | )
80 | else:
81 | return self.request_encode_body(
82 | method, url, fields=fields, headers=headers, **urlopen_kw
83 | )
84 |
85 | def request_encode_url(self, method, url, fields=None, headers=None, **urlopen_kw):
86 | """
87 | Make a request using :meth:`urlopen` with the ``fields`` encoded in
88 | the url. This is useful for request methods like GET, HEAD, DELETE, etc.
89 | """
90 | if headers is None:
91 | headers = self.headers
92 |
93 | extra_kw = {"headers": headers}
94 | extra_kw.update(urlopen_kw)
95 |
96 | if fields:
97 | url += "?" + urlencode(fields)
98 |
99 | return self.urlopen(method, url, **extra_kw)
100 |
101 | def request_encode_body(
102 | self,
103 | method,
104 | url,
105 | fields=None,
106 | headers=None,
107 | encode_multipart=True,
108 | multipart_boundary=None,
109 | **urlopen_kw
110 | ):
111 | """
112 | Make a request using :meth:`urlopen` with the ``fields`` encoded in
113 | the body. This is useful for request methods like POST, PUT, PATCH, etc.
114 |
115 | When ``encode_multipart=True`` (default), then
116 | :func:`urllib3.encode_multipart_formdata` is used to encode
117 | the payload with the appropriate content type. Otherwise
118 | :func:`urllib.parse.urlencode` is used with the
119 | 'application/x-www-form-urlencoded' content type.
120 |
121 | Multipart encoding must be used when posting files, and it's reasonably
122 | safe to use it in other times too. However, it may break request
123 | signing, such as with OAuth.
124 |
125 | Supports an optional ``fields`` parameter of key/value strings AND
126 | key/filetuple. A filetuple is a (filename, data, MIME type) tuple where
127 | the MIME type is optional. For example::
128 |
129 | fields = {
130 | 'foo': 'bar',
131 | 'fakefile': ('foofile.txt', 'contents of foofile'),
132 | 'realfile': ('barfile.txt', open('realfile').read()),
133 | 'typedfile': ('bazfile.bin', open('bazfile').read(),
134 | 'image/jpeg'),
135 | 'nonamefile': 'contents of nonamefile field',
136 | }
137 |
138 | When uploading a file, providing a filename (the first parameter of the
139 | tuple) is optional but recommended to best mimic behavior of browsers.
140 |
141 | Note that if ``headers`` are supplied, the 'Content-Type' header will
142 | be overwritten because it depends on the dynamic random boundary string
143 | which is used to compose the body of the request. The random boundary
144 | string can be explicitly set with the ``multipart_boundary`` parameter.
145 | """
146 | if headers is None:
147 | headers = self.headers
148 |
149 | extra_kw = {"headers": {}}
150 |
151 | if fields:
152 | if "body" in urlopen_kw:
153 | raise TypeError(
154 | "request got values for both 'fields' and 'body', can only specify one."
155 | )
156 |
157 | if encode_multipart:
158 | body, content_type = encode_multipart_formdata(
159 | fields, boundary=multipart_boundary
160 | )
161 | else:
162 | body, content_type = (
163 | urlencode(fields),
164 | "application/x-www-form-urlencoded",
165 | )
166 |
167 | extra_kw["body"] = body
168 | extra_kw["headers"] = {"Content-Type": content_type}
169 |
170 | extra_kw["headers"].update(headers)
171 | extra_kw.update(urlopen_kw)
172 |
173 | return self.urlopen(method, url, **extra_kw)
174 |
175 |
176 | if not six.PY2:
177 |
178 | class RequestModule(sys.modules[__name__].__class__):
179 | def __call__(self, *args, **kwargs):
180 | """
181 | If user tries to call this module directly urllib3 v2.x style raise an error to the user
182 | suggesting they may need urllib3 v2
183 | """
184 | raise TypeError(
185 | "'module' object is not callable\n"
186 | "urllib3.request() method is not supported in this release, "
187 | "upgrade to urllib3 v2 to use it\n"
188 | "see https://urllib3.readthedocs.io/en/stable/v2-migration-guide.html"
189 | )
190 |
191 | sys.modules[__name__].__class__ = RequestModule
192 |
```
--------------------------------------------------------------------------------
/.venv/lib/python3.12/site-packages/pip/_internal/distributions/sdist.py:
--------------------------------------------------------------------------------
```python
1 | import logging
2 | from typing import TYPE_CHECKING, Iterable, Optional, Set, Tuple
3 |
4 | from pip._internal.build_env import BuildEnvironment
5 | from pip._internal.distributions.base import AbstractDistribution
6 | from pip._internal.exceptions import InstallationError
7 | from pip._internal.metadata import BaseDistribution
8 | from pip._internal.utils.subprocess import runner_with_spinner_message
9 |
10 | if TYPE_CHECKING:
11 | from pip._internal.index.package_finder import PackageFinder
12 |
13 | logger = logging.getLogger(__name__)
14 |
15 |
16 | class SourceDistribution(AbstractDistribution):
17 | """Represents a source distribution.
18 |
19 | The preparation step for these needs metadata for the packages to be
20 | generated, either using PEP 517 or using the legacy `setup.py egg_info`.
21 | """
22 |
23 | @property
24 | def build_tracker_id(self) -> Optional[str]:
25 | """Identify this requirement uniquely by its link."""
26 | assert self.req.link
27 | return self.req.link.url_without_fragment
28 |
29 | def get_metadata_distribution(self) -> BaseDistribution:
30 | return self.req.get_dist()
31 |
32 | def prepare_distribution_metadata(
33 | self,
34 | finder: "PackageFinder",
35 | build_isolation: bool,
36 | check_build_deps: bool,
37 | ) -> None:
38 | # Load pyproject.toml, to determine whether PEP 517 is to be used
39 | self.req.load_pyproject_toml()
40 |
41 | # Set up the build isolation, if this requirement should be isolated
42 | should_isolate = self.req.use_pep517 and build_isolation
43 | if should_isolate:
44 | # Setup an isolated environment and install the build backend static
45 | # requirements in it.
46 | self._prepare_build_backend(finder)
47 | # Check that if the requirement is editable, it either supports PEP 660 or
48 | # has a setup.py or a setup.cfg. This cannot be done earlier because we need
49 | # to setup the build backend to verify it supports build_editable, nor can
50 | # it be done later, because we want to avoid installing build requirements
51 | # needlessly. Doing it here also works around setuptools generating
52 | # UNKNOWN.egg-info when running get_requires_for_build_wheel on a directory
53 | # without setup.py nor setup.cfg.
54 | self.req.isolated_editable_sanity_check()
55 | # Install the dynamic build requirements.
56 | self._install_build_reqs(finder)
57 | # Check if the current environment provides build dependencies
58 | should_check_deps = self.req.use_pep517 and check_build_deps
59 | if should_check_deps:
60 | pyproject_requires = self.req.pyproject_requires
61 | assert pyproject_requires is not None
62 | conflicting, missing = self.req.build_env.check_requirements(
63 | pyproject_requires
64 | )
65 | if conflicting:
66 | self._raise_conflicts("the backend dependencies", conflicting)
67 | if missing:
68 | self._raise_missing_reqs(missing)
69 | self.req.prepare_metadata()
70 |
71 | def _prepare_build_backend(self, finder: "PackageFinder") -> None:
72 | # Isolate in a BuildEnvironment and install the build-time
73 | # requirements.
74 | pyproject_requires = self.req.pyproject_requires
75 | assert pyproject_requires is not None
76 |
77 | self.req.build_env = BuildEnvironment()
78 | self.req.build_env.install_requirements(
79 | finder, pyproject_requires, "overlay", kind="build dependencies"
80 | )
81 | conflicting, missing = self.req.build_env.check_requirements(
82 | self.req.requirements_to_check
83 | )
84 | if conflicting:
85 | self._raise_conflicts("PEP 517/518 supported requirements", conflicting)
86 | if missing:
87 | logger.warning(
88 | "Missing build requirements in pyproject.toml for %s.",
89 | self.req,
90 | )
91 | logger.warning(
92 | "The project does not specify a build backend, and "
93 | "pip cannot fall back to setuptools without %s.",
94 | " and ".join(map(repr, sorted(missing))),
95 | )
96 |
97 | def _get_build_requires_wheel(self) -> Iterable[str]:
98 | with self.req.build_env:
99 | runner = runner_with_spinner_message("Getting requirements to build wheel")
100 | backend = self.req.pep517_backend
101 | assert backend is not None
102 | with backend.subprocess_runner(runner):
103 | return backend.get_requires_for_build_wheel()
104 |
105 | def _get_build_requires_editable(self) -> Iterable[str]:
106 | with self.req.build_env:
107 | runner = runner_with_spinner_message(
108 | "Getting requirements to build editable"
109 | )
110 | backend = self.req.pep517_backend
111 | assert backend is not None
112 | with backend.subprocess_runner(runner):
113 | return backend.get_requires_for_build_editable()
114 |
115 | def _install_build_reqs(self, finder: "PackageFinder") -> None:
116 | # Install any extra build dependencies that the backend requests.
117 | # This must be done in a second pass, as the pyproject.toml
118 | # dependencies must be installed before we can call the backend.
119 | if (
120 | self.req.editable
121 | and self.req.permit_editable_wheels
122 | and self.req.supports_pyproject_editable
123 | ):
124 | build_reqs = self._get_build_requires_editable()
125 | else:
126 | build_reqs = self._get_build_requires_wheel()
127 | conflicting, missing = self.req.build_env.check_requirements(build_reqs)
128 | if conflicting:
129 | self._raise_conflicts("the backend dependencies", conflicting)
130 | self.req.build_env.install_requirements(
131 | finder, missing, "normal", kind="backend dependencies"
132 | )
133 |
134 | def _raise_conflicts(
135 | self, conflicting_with: str, conflicting_reqs: Set[Tuple[str, str]]
136 | ) -> None:
137 | format_string = (
138 | "Some build dependencies for {requirement} "
139 | "conflict with {conflicting_with}: {description}."
140 | )
141 | error_message = format_string.format(
142 | requirement=self.req,
143 | conflicting_with=conflicting_with,
144 | description=", ".join(
145 | f"{installed} is incompatible with {wanted}"
146 | for installed, wanted in sorted(conflicting_reqs)
147 | ),
148 | )
149 | raise InstallationError(error_message)
150 |
151 | def _raise_missing_reqs(self, missing: Set[str]) -> None:
152 | format_string = (
153 | "Some build dependencies for {requirement} are missing: {missing}."
154 | )
155 | error_message = format_string.format(
156 | requirement=self.req, missing=", ".join(map(repr, sorted(missing)))
157 | )
158 | raise InstallationError(error_message)
159 |
```
--------------------------------------------------------------------------------
/.venv/lib/python3.12/site-packages/werkzeug/middleware/proxy_fix.py:
--------------------------------------------------------------------------------
```python
1 | """
2 | X-Forwarded-For Proxy Fix
3 | =========================
4 |
5 | This module provides a middleware that adjusts the WSGI environ based on
6 | ``X-Forwarded-`` headers that proxies in front of an application may
7 | set.
8 |
9 | When an application is running behind a proxy server, WSGI may see the
10 | request as coming from that server rather than the real client. Proxies
11 | set various headers to track where the request actually came from.
12 |
13 | This middleware should only be used if the application is actually
14 | behind such a proxy, and should be configured with the number of proxies
15 | that are chained in front of it. Not all proxies set all the headers.
16 | Since incoming headers can be faked, you must set how many proxies are
17 | setting each header so the middleware knows what to trust.
18 |
19 | .. autoclass:: ProxyFix
20 |
21 | :copyright: 2007 Pallets
22 | :license: BSD-3-Clause
23 | """
24 |
25 | from __future__ import annotations
26 |
27 | import typing as t
28 |
29 | from ..http import parse_list_header
30 |
31 | if t.TYPE_CHECKING:
32 | from _typeshed.wsgi import StartResponse
33 | from _typeshed.wsgi import WSGIApplication
34 | from _typeshed.wsgi import WSGIEnvironment
35 |
36 |
37 | class ProxyFix:
38 | """Adjust the WSGI environ based on ``X-Forwarded-`` that proxies in
39 | front of the application may set.
40 |
41 | - ``X-Forwarded-For`` sets ``REMOTE_ADDR``.
42 | - ``X-Forwarded-Proto`` sets ``wsgi.url_scheme``.
43 | - ``X-Forwarded-Host`` sets ``HTTP_HOST``, ``SERVER_NAME``, and
44 | ``SERVER_PORT``.
45 | - ``X-Forwarded-Port`` sets ``HTTP_HOST`` and ``SERVER_PORT``.
46 | - ``X-Forwarded-Prefix`` sets ``SCRIPT_NAME``.
47 |
48 | You must tell the middleware how many proxies set each header so it
49 | knows what values to trust. It is a security issue to trust values
50 | that came from the client rather than a proxy.
51 |
52 | The original values of the headers are stored in the WSGI
53 | environ as ``werkzeug.proxy_fix.orig``, a dict.
54 |
55 | :param app: The WSGI application to wrap.
56 | :param x_for: Number of values to trust for ``X-Forwarded-For``.
57 | :param x_proto: Number of values to trust for ``X-Forwarded-Proto``.
58 | :param x_host: Number of values to trust for ``X-Forwarded-Host``.
59 | :param x_port: Number of values to trust for ``X-Forwarded-Port``.
60 | :param x_prefix: Number of values to trust for
61 | ``X-Forwarded-Prefix``.
62 |
63 | .. code-block:: python
64 |
65 | from werkzeug.middleware.proxy_fix import ProxyFix
66 | # App is behind one proxy that sets the -For and -Host headers.
67 | app = ProxyFix(app, x_for=1, x_host=1)
68 |
69 | .. versionchanged:: 1.0
70 | The ``num_proxies`` argument and attribute; the ``get_remote_addr`` method; and
71 | the environ keys ``orig_remote_addr``, ``orig_wsgi_url_scheme``, and
72 | ``orig_http_host`` were removed.
73 |
74 | .. versionchanged:: 0.15
75 | All headers support multiple values. Each header is configured with a separate
76 | number of trusted proxies.
77 |
78 | .. versionchanged:: 0.15
79 | Original WSGI environ values are stored in the ``werkzeug.proxy_fix.orig`` dict.
80 |
81 | .. versionchanged:: 0.15
82 | Support ``X-Forwarded-Port`` and ``X-Forwarded-Prefix``.
83 |
84 | .. versionchanged:: 0.15
85 | ``X-Forwarded-Host`` and ``X-Forwarded-Port`` modify
86 | ``SERVER_NAME`` and ``SERVER_PORT``.
87 | """
88 |
89 | def __init__(
90 | self,
91 | app: WSGIApplication,
92 | x_for: int = 1,
93 | x_proto: int = 1,
94 | x_host: int = 0,
95 | x_port: int = 0,
96 | x_prefix: int = 0,
97 | ) -> None:
98 | self.app = app
99 | self.x_for = x_for
100 | self.x_proto = x_proto
101 | self.x_host = x_host
102 | self.x_port = x_port
103 | self.x_prefix = x_prefix
104 |
105 | def _get_real_value(self, trusted: int, value: str | None) -> str | None:
106 | """Get the real value from a list header based on the configured
107 | number of trusted proxies.
108 |
109 | :param trusted: Number of values to trust in the header.
110 | :param value: Comma separated list header value to parse.
111 | :return: The real value, or ``None`` if there are fewer values
112 | than the number of trusted proxies.
113 |
114 | .. versionchanged:: 1.0
115 | Renamed from ``_get_trusted_comma``.
116 |
117 | .. versionadded:: 0.15
118 | """
119 | if not (trusted and value):
120 | return None
121 | values = parse_list_header(value)
122 | if len(values) >= trusted:
123 | return values[-trusted]
124 | return None
125 |
126 | def __call__(
127 | self, environ: WSGIEnvironment, start_response: StartResponse
128 | ) -> t.Iterable[bytes]:
129 | """Modify the WSGI environ based on the various ``Forwarded``
130 | headers before calling the wrapped application. Store the
131 | original environ values in ``werkzeug.proxy_fix.orig_{key}``.
132 | """
133 | environ_get = environ.get
134 | orig_remote_addr = environ_get("REMOTE_ADDR")
135 | orig_wsgi_url_scheme = environ_get("wsgi.url_scheme")
136 | orig_http_host = environ_get("HTTP_HOST")
137 | environ.update(
138 | {
139 | "werkzeug.proxy_fix.orig": {
140 | "REMOTE_ADDR": orig_remote_addr,
141 | "wsgi.url_scheme": orig_wsgi_url_scheme,
142 | "HTTP_HOST": orig_http_host,
143 | "SERVER_NAME": environ_get("SERVER_NAME"),
144 | "SERVER_PORT": environ_get("SERVER_PORT"),
145 | "SCRIPT_NAME": environ_get("SCRIPT_NAME"),
146 | }
147 | }
148 | )
149 |
150 | x_for = self._get_real_value(self.x_for, environ_get("HTTP_X_FORWARDED_FOR"))
151 | if x_for:
152 | environ["REMOTE_ADDR"] = x_for
153 |
154 | x_proto = self._get_real_value(
155 | self.x_proto, environ_get("HTTP_X_FORWARDED_PROTO")
156 | )
157 | if x_proto:
158 | environ["wsgi.url_scheme"] = x_proto
159 |
160 | x_host = self._get_real_value(self.x_host, environ_get("HTTP_X_FORWARDED_HOST"))
161 | if x_host:
162 | environ["HTTP_HOST"] = environ["SERVER_NAME"] = x_host
163 | # "]" to check for IPv6 address without port
164 | if ":" in x_host and not x_host.endswith("]"):
165 | environ["SERVER_NAME"], environ["SERVER_PORT"] = x_host.rsplit(":", 1)
166 |
167 | x_port = self._get_real_value(self.x_port, environ_get("HTTP_X_FORWARDED_PORT"))
168 | if x_port:
169 | host = environ.get("HTTP_HOST")
170 | if host:
171 | # "]" to check for IPv6 address without port
172 | if ":" in host and not host.endswith("]"):
173 | host = host.rsplit(":", 1)[0]
174 | environ["HTTP_HOST"] = f"{host}:{x_port}"
175 | environ["SERVER_PORT"] = x_port
176 |
177 | x_prefix = self._get_real_value(
178 | self.x_prefix, environ_get("HTTP_X_FORWARDED_PREFIX")
179 | )
180 | if x_prefix:
181 | environ["SCRIPT_NAME"] = x_prefix
182 |
183 | return self.app(environ, start_response)
184 |
```
--------------------------------------------------------------------------------
/.venv/lib/python3.12/site-packages/soupsieve/__meta__.py:
--------------------------------------------------------------------------------
```python
1 | """Meta related things."""
2 | from __future__ import annotations
3 | from collections import namedtuple
4 | import re
5 |
6 | RE_VER = re.compile(
7 | r'''(?x)
8 | (?P<major>\d+)(?:\.(?P<minor>\d+))?(?:\.(?P<micro>\d+))?
9 | (?:(?P<type>a|b|rc)(?P<pre>\d+))?
10 | (?:\.post(?P<post>\d+))?
11 | (?:\.dev(?P<dev>\d+))?
12 | '''
13 | )
14 |
15 | REL_MAP = {
16 | ".dev": "",
17 | ".dev-alpha": "a",
18 | ".dev-beta": "b",
19 | ".dev-candidate": "rc",
20 | "alpha": "a",
21 | "beta": "b",
22 | "candidate": "rc",
23 | "final": ""
24 | }
25 |
26 | DEV_STATUS = {
27 | ".dev": "2 - Pre-Alpha",
28 | ".dev-alpha": "2 - Pre-Alpha",
29 | ".dev-beta": "2 - Pre-Alpha",
30 | ".dev-candidate": "2 - Pre-Alpha",
31 | "alpha": "3 - Alpha",
32 | "beta": "4 - Beta",
33 | "candidate": "4 - Beta",
34 | "final": "5 - Production/Stable"
35 | }
36 |
37 | PRE_REL_MAP = {"a": 'alpha', "b": 'beta', "rc": 'candidate'}
38 |
39 |
40 | class Version(namedtuple("Version", ["major", "minor", "micro", "release", "pre", "post", "dev"])):
41 | """
42 | Get the version (PEP 440).
43 |
44 | A biased approach to the PEP 440 semantic version.
45 |
46 | Provides a tuple structure which is sorted for comparisons `v1 > v2` etc.
47 | (major, minor, micro, release type, pre-release build, post-release build, development release build)
48 | Release types are named in is such a way they are comparable with ease.
49 | Accessors to check if a development, pre-release, or post-release build. Also provides accessor to get
50 | development status for setup files.
51 |
52 | How it works (currently):
53 |
54 | - You must specify a release type as either `final`, `alpha`, `beta`, or `candidate`.
55 | - To define a development release, you can use either `.dev`, `.dev-alpha`, `.dev-beta`, or `.dev-candidate`.
56 | The dot is used to ensure all development specifiers are sorted before `alpha`.
57 | You can specify a `dev` number for development builds, but do not have to as implicit development releases
58 | are allowed.
59 | - You must specify a `pre` value greater than zero if using a prerelease as this project (not PEP 440) does not
60 | allow implicit prereleases.
61 | - You can optionally set `post` to a value greater than zero to make the build a post release. While post releases
62 | are technically allowed in prereleases, it is strongly discouraged, so we are rejecting them. It should be
63 | noted that we do not allow `post0` even though PEP 440 does not restrict this. This project specifically
64 | does not allow implicit post releases.
65 | - It should be noted that we do not support epochs `1!` or local versions `+some-custom.version-1`.
66 |
67 | Acceptable version releases:
68 |
69 | ```
70 | Version(1, 0, 0, "final") 1.0
71 | Version(1, 2, 0, "final") 1.2
72 | Version(1, 2, 3, "final") 1.2.3
73 | Version(1, 2, 0, ".dev-alpha", pre=4) 1.2a4
74 | Version(1, 2, 0, ".dev-beta", pre=4) 1.2b4
75 | Version(1, 2, 0, ".dev-candidate", pre=4) 1.2rc4
76 | Version(1, 2, 0, "final", post=1) 1.2.post1
77 | Version(1, 2, 3, ".dev") 1.2.3.dev0
78 | Version(1, 2, 3, ".dev", dev=1) 1.2.3.dev1
79 | ```
80 |
81 | """
82 |
83 | def __new__(
84 | cls,
85 | major: int, minor: int, micro: int, release: str = "final",
86 | pre: int = 0, post: int = 0, dev: int = 0
87 | ) -> Version:
88 | """Validate version info."""
89 |
90 | # Ensure all parts are positive integers.
91 | for value in (major, minor, micro, pre, post):
92 | if not (isinstance(value, int) and value >= 0):
93 | raise ValueError("All version parts except 'release' should be integers.")
94 |
95 | if release not in REL_MAP:
96 | raise ValueError(f"'{release}' is not a valid release type.")
97 |
98 | # Ensure valid pre-release (we do not allow implicit pre-releases).
99 | if ".dev-candidate" < release < "final":
100 | if pre == 0:
101 | raise ValueError("Implicit pre-releases not allowed.")
102 | elif dev:
103 | raise ValueError("Version is not a development release.")
104 | elif post:
105 | raise ValueError("Post-releases are not allowed with pre-releases.")
106 |
107 | # Ensure valid development or development/pre release
108 | elif release < "alpha":
109 | if release > ".dev" and pre == 0:
110 | raise ValueError("Implicit pre-release not allowed.")
111 | elif post:
112 | raise ValueError("Post-releases are not allowed with pre-releases.")
113 |
114 | # Ensure a valid normal release
115 | else:
116 | if pre:
117 | raise ValueError("Version is not a pre-release.")
118 | elif dev:
119 | raise ValueError("Version is not a development release.")
120 |
121 | return super().__new__(cls, major, minor, micro, release, pre, post, dev)
122 |
123 | def _is_pre(self) -> bool:
124 | """Is prerelease."""
125 |
126 | return bool(self.pre > 0)
127 |
128 | def _is_dev(self) -> bool:
129 | """Is development."""
130 |
131 | return bool(self.release < "alpha")
132 |
133 | def _is_post(self) -> bool:
134 | """Is post."""
135 |
136 | return bool(self.post > 0)
137 |
138 | def _get_dev_status(self) -> str: # pragma: no cover
139 | """Get development status string."""
140 |
141 | return DEV_STATUS[self.release]
142 |
143 | def _get_canonical(self) -> str:
144 | """Get the canonical output string."""
145 |
146 | # Assemble major, minor, micro version and append `pre`, `post`, or `dev` if needed..
147 | if self.micro == 0:
148 | ver = f"{self.major}.{self.minor}"
149 | else:
150 | ver = f"{self.major}.{self.minor}.{self.micro}"
151 | if self._is_pre():
152 | ver += f'{REL_MAP[self.release]}{self.pre}'
153 | if self._is_post():
154 | ver += f".post{self.post}"
155 | if self._is_dev():
156 | ver += f".dev{self.dev}"
157 |
158 | return ver
159 |
160 |
161 | def parse_version(ver: str) -> Version:
162 | """Parse version into a comparable Version tuple."""
163 |
164 | m = RE_VER.match(ver)
165 |
166 | if m is None:
167 | raise ValueError(f"'{ver}' is not a valid version")
168 |
169 | # Handle major, minor, micro
170 | major = int(m.group('major'))
171 | minor = int(m.group('minor')) if m.group('minor') else 0
172 | micro = int(m.group('micro')) if m.group('micro') else 0
173 |
174 | # Handle pre releases
175 | if m.group('type'):
176 | release = PRE_REL_MAP[m.group('type')]
177 | pre = int(m.group('pre'))
178 | else:
179 | release = "final"
180 | pre = 0
181 |
182 | # Handle development releases
183 | dev = m.group('dev') if m.group('dev') else 0
184 | if m.group('dev'):
185 | dev = int(m.group('dev'))
186 | release = '.dev-' + release if pre else '.dev'
187 | else:
188 | dev = 0
189 |
190 | # Handle post
191 | post = int(m.group('post')) if m.group('post') else 0
192 |
193 | return Version(major, minor, micro, release, pre, post, dev)
194 |
195 |
196 | __version_info__ = Version(2, 6, 0, "final")
197 | __version__ = __version_info__._get_canonical()
198 |
```
--------------------------------------------------------------------------------
/.venv/lib/python3.12/site-packages/pip/_internal/commands/debug.py:
--------------------------------------------------------------------------------
```python
1 | import locale
2 | import logging
3 | import os
4 | import sys
5 | from optparse import Values
6 | from types import ModuleType
7 | from typing import Any, Dict, List, Optional
8 |
9 | import pip._vendor
10 | from pip._vendor.certifi import where
11 | from pip._vendor.packaging.version import parse as parse_version
12 |
13 | from pip._internal.cli import cmdoptions
14 | from pip._internal.cli.base_command import Command
15 | from pip._internal.cli.cmdoptions import make_target_python
16 | from pip._internal.cli.status_codes import SUCCESS
17 | from pip._internal.configuration import Configuration
18 | from pip._internal.metadata import get_environment
19 | from pip._internal.utils.compat import open_text_resource
20 | from pip._internal.utils.logging import indent_log
21 | from pip._internal.utils.misc import get_pip_version
22 |
23 | logger = logging.getLogger(__name__)
24 |
25 |
26 | def show_value(name: str, value: Any) -> None:
27 | logger.info("%s: %s", name, value)
28 |
29 |
30 | def show_sys_implementation() -> None:
31 | logger.info("sys.implementation:")
32 | implementation_name = sys.implementation.name
33 | with indent_log():
34 | show_value("name", implementation_name)
35 |
36 |
37 | def create_vendor_txt_map() -> Dict[str, str]:
38 | with open_text_resource("pip._vendor", "vendor.txt") as f:
39 | # Purge non version specifying lines.
40 | # Also, remove any space prefix or suffixes (including comments).
41 | lines = [
42 | line.strip().split(" ", 1)[0] for line in f.readlines() if "==" in line
43 | ]
44 |
45 | # Transform into "module" -> version dict.
46 | return dict(line.split("==", 1) for line in lines)
47 |
48 |
49 | def get_module_from_module_name(module_name: str) -> Optional[ModuleType]:
50 | # Module name can be uppercase in vendor.txt for some reason...
51 | module_name = module_name.lower().replace("-", "_")
52 | # PATCH: setuptools is actually only pkg_resources.
53 | if module_name == "setuptools":
54 | module_name = "pkg_resources"
55 |
56 | try:
57 | __import__(f"pip._vendor.{module_name}", globals(), locals(), level=0)
58 | return getattr(pip._vendor, module_name)
59 | except ImportError:
60 | # We allow 'truststore' to fail to import due
61 | # to being unavailable on Python 3.9 and earlier.
62 | if module_name == "truststore" and sys.version_info < (3, 10):
63 | return None
64 | raise
65 |
66 |
67 | def get_vendor_version_from_module(module_name: str) -> Optional[str]:
68 | module = get_module_from_module_name(module_name)
69 | version = getattr(module, "__version__", None)
70 |
71 | if module and not version:
72 | # Try to find version in debundled module info.
73 | assert module.__file__ is not None
74 | env = get_environment([os.path.dirname(module.__file__)])
75 | dist = env.get_distribution(module_name)
76 | if dist:
77 | version = str(dist.version)
78 |
79 | return version
80 |
81 |
82 | def show_actual_vendor_versions(vendor_txt_versions: Dict[str, str]) -> None:
83 | """Log the actual version and print extra info if there is
84 | a conflict or if the actual version could not be imported.
85 | """
86 | for module_name, expected_version in vendor_txt_versions.items():
87 | extra_message = ""
88 | actual_version = get_vendor_version_from_module(module_name)
89 | if not actual_version:
90 | extra_message = (
91 | " (Unable to locate actual module version, using"
92 | " vendor.txt specified version)"
93 | )
94 | actual_version = expected_version
95 | elif parse_version(actual_version) != parse_version(expected_version):
96 | extra_message = (
97 | " (CONFLICT: vendor.txt suggests version should"
98 | f" be {expected_version})"
99 | )
100 | logger.info("%s==%s%s", module_name, actual_version, extra_message)
101 |
102 |
103 | def show_vendor_versions() -> None:
104 | logger.info("vendored library versions:")
105 |
106 | vendor_txt_versions = create_vendor_txt_map()
107 | with indent_log():
108 | show_actual_vendor_versions(vendor_txt_versions)
109 |
110 |
111 | def show_tags(options: Values) -> None:
112 | tag_limit = 10
113 |
114 | target_python = make_target_python(options)
115 | tags = target_python.get_sorted_tags()
116 |
117 | # Display the target options that were explicitly provided.
118 | formatted_target = target_python.format_given()
119 | suffix = ""
120 | if formatted_target:
121 | suffix = f" (target: {formatted_target})"
122 |
123 | msg = f"Compatible tags: {len(tags)}{suffix}"
124 | logger.info(msg)
125 |
126 | if options.verbose < 1 and len(tags) > tag_limit:
127 | tags_limited = True
128 | tags = tags[:tag_limit]
129 | else:
130 | tags_limited = False
131 |
132 | with indent_log():
133 | for tag in tags:
134 | logger.info(str(tag))
135 |
136 | if tags_limited:
137 | msg = f"...\n[First {tag_limit} tags shown. Pass --verbose to show all.]"
138 | logger.info(msg)
139 |
140 |
141 | def ca_bundle_info(config: Configuration) -> str:
142 | levels = {key.split(".", 1)[0] for key, _ in config.items()}
143 | if not levels:
144 | return "Not specified"
145 |
146 | levels_that_override_global = ["install", "wheel", "download"]
147 | global_overriding_level = [
148 | level for level in levels if level in levels_that_override_global
149 | ]
150 | if not global_overriding_level:
151 | return "global"
152 |
153 | if "global" in levels:
154 | levels.remove("global")
155 | return ", ".join(levels)
156 |
157 |
158 | class DebugCommand(Command):
159 | """
160 | Display debug information.
161 | """
162 |
163 | usage = """
164 | %prog <options>"""
165 | ignore_require_venv = True
166 |
167 | def add_options(self) -> None:
168 | cmdoptions.add_target_python_options(self.cmd_opts)
169 | self.parser.insert_option_group(0, self.cmd_opts)
170 | self.parser.config.load()
171 |
172 | def run(self, options: Values, args: List[str]) -> int:
173 | logger.warning(
174 | "This command is only meant for debugging. "
175 | "Do not use this with automation for parsing and getting these "
176 | "details, since the output and options of this command may "
177 | "change without notice."
178 | )
179 | show_value("pip version", get_pip_version())
180 | show_value("sys.version", sys.version)
181 | show_value("sys.executable", sys.executable)
182 | show_value("sys.getdefaultencoding", sys.getdefaultencoding())
183 | show_value("sys.getfilesystemencoding", sys.getfilesystemencoding())
184 | show_value(
185 | "locale.getpreferredencoding",
186 | locale.getpreferredencoding(),
187 | )
188 | show_value("sys.platform", sys.platform)
189 | show_sys_implementation()
190 |
191 | show_value("'cert' config value", ca_bundle_info(self.parser.config))
192 | show_value("REQUESTS_CA_BUNDLE", os.environ.get("REQUESTS_CA_BUNDLE"))
193 | show_value("CURL_CA_BUNDLE", os.environ.get("CURL_CA_BUNDLE"))
194 | show_value("pip._vendor.certifi.where()", where())
195 | show_value("pip._vendor.DEBUNDLED", pip._vendor.DEBUNDLED)
196 |
197 | show_vendor_versions()
198 |
199 | show_tags(options)
200 |
201 | return SUCCESS
202 |
```
--------------------------------------------------------------------------------
/.venv/lib/python3.12/site-packages/pip/_internal/cli/autocompletion.py:
--------------------------------------------------------------------------------
```python
1 | """Logic that powers autocompletion installed by ``pip completion``.
2 | """
3 |
4 | import optparse
5 | import os
6 | import sys
7 | from itertools import chain
8 | from typing import Any, Iterable, List, Optional
9 |
10 | from pip._internal.cli.main_parser import create_main_parser
11 | from pip._internal.commands import commands_dict, create_command
12 | from pip._internal.metadata import get_default_environment
13 |
14 |
15 | def autocomplete() -> None:
16 | """Entry Point for completion of main and subcommand options."""
17 | # Don't complete if user hasn't sourced bash_completion file.
18 | if "PIP_AUTO_COMPLETE" not in os.environ:
19 | return
20 | # Don't complete if autocompletion environment variables
21 | # are not present
22 | if not os.environ.get("COMP_WORDS") or not os.environ.get("COMP_CWORD"):
23 | return
24 | cwords = os.environ["COMP_WORDS"].split()[1:]
25 | cword = int(os.environ["COMP_CWORD"])
26 | try:
27 | current = cwords[cword - 1]
28 | except IndexError:
29 | current = ""
30 |
31 | parser = create_main_parser()
32 | subcommands = list(commands_dict)
33 | options = []
34 |
35 | # subcommand
36 | subcommand_name: Optional[str] = None
37 | for word in cwords:
38 | if word in subcommands:
39 | subcommand_name = word
40 | break
41 | # subcommand options
42 | if subcommand_name is not None:
43 | # special case: 'help' subcommand has no options
44 | if subcommand_name == "help":
45 | sys.exit(1)
46 | # special case: list locally installed dists for show and uninstall
47 | should_list_installed = not current.startswith("-") and subcommand_name in [
48 | "show",
49 | "uninstall",
50 | ]
51 | if should_list_installed:
52 | env = get_default_environment()
53 | lc = current.lower()
54 | installed = [
55 | dist.canonical_name
56 | for dist in env.iter_installed_distributions(local_only=True)
57 | if dist.canonical_name.startswith(lc)
58 | and dist.canonical_name not in cwords[1:]
59 | ]
60 | # if there are no dists installed, fall back to option completion
61 | if installed:
62 | for dist in installed:
63 | print(dist)
64 | sys.exit(1)
65 |
66 | should_list_installables = (
67 | not current.startswith("-") and subcommand_name == "install"
68 | )
69 | if should_list_installables:
70 | for path in auto_complete_paths(current, "path"):
71 | print(path)
72 | sys.exit(1)
73 |
74 | subcommand = create_command(subcommand_name)
75 |
76 | for opt in subcommand.parser.option_list_all:
77 | if opt.help != optparse.SUPPRESS_HELP:
78 | options += [
79 | (opt_str, opt.nargs) for opt_str in opt._long_opts + opt._short_opts
80 | ]
81 |
82 | # filter out previously specified options from available options
83 | prev_opts = [x.split("=")[0] for x in cwords[1 : cword - 1]]
84 | options = [(x, v) for (x, v) in options if x not in prev_opts]
85 | # filter options by current input
86 | options = [(k, v) for k, v in options if k.startswith(current)]
87 | # get completion type given cwords and available subcommand options
88 | completion_type = get_path_completion_type(
89 | cwords,
90 | cword,
91 | subcommand.parser.option_list_all,
92 | )
93 | # get completion files and directories if ``completion_type`` is
94 | # ``<file>``, ``<dir>`` or ``<path>``
95 | if completion_type:
96 | paths = auto_complete_paths(current, completion_type)
97 | options = [(path, 0) for path in paths]
98 | for option in options:
99 | opt_label = option[0]
100 | # append '=' to options which require args
101 | if option[1] and option[0][:2] == "--":
102 | opt_label += "="
103 | print(opt_label)
104 | else:
105 | # show main parser options only when necessary
106 |
107 | opts = [i.option_list for i in parser.option_groups]
108 | opts.append(parser.option_list)
109 | flattened_opts = chain.from_iterable(opts)
110 | if current.startswith("-"):
111 | for opt in flattened_opts:
112 | if opt.help != optparse.SUPPRESS_HELP:
113 | subcommands += opt._long_opts + opt._short_opts
114 | else:
115 | # get completion type given cwords and all available options
116 | completion_type = get_path_completion_type(cwords, cword, flattened_opts)
117 | if completion_type:
118 | subcommands = list(auto_complete_paths(current, completion_type))
119 |
120 | print(" ".join([x for x in subcommands if x.startswith(current)]))
121 | sys.exit(1)
122 |
123 |
124 | def get_path_completion_type(
125 | cwords: List[str], cword: int, opts: Iterable[Any]
126 | ) -> Optional[str]:
127 | """Get the type of path completion (``file``, ``dir``, ``path`` or None)
128 |
129 | :param cwords: same as the environmental variable ``COMP_WORDS``
130 | :param cword: same as the environmental variable ``COMP_CWORD``
131 | :param opts: The available options to check
132 | :return: path completion type (``file``, ``dir``, ``path`` or None)
133 | """
134 | if cword < 2 or not cwords[cword - 2].startswith("-"):
135 | return None
136 | for opt in opts:
137 | if opt.help == optparse.SUPPRESS_HELP:
138 | continue
139 | for o in str(opt).split("/"):
140 | if cwords[cword - 2].split("=")[0] == o:
141 | if not opt.metavar or any(
142 | x in ("path", "file", "dir") for x in opt.metavar.split("/")
143 | ):
144 | return opt.metavar
145 | return None
146 |
147 |
148 | def auto_complete_paths(current: str, completion_type: str) -> Iterable[str]:
149 | """If ``completion_type`` is ``file`` or ``path``, list all regular files
150 | and directories starting with ``current``; otherwise only list directories
151 | starting with ``current``.
152 |
153 | :param current: The word to be completed
154 | :param completion_type: path completion type(``file``, ``path`` or ``dir``)
155 | :return: A generator of regular files and/or directories
156 | """
157 | directory, filename = os.path.split(current)
158 | current_path = os.path.abspath(directory)
159 | # Don't complete paths if they can't be accessed
160 | if not os.access(current_path, os.R_OK):
161 | return
162 | filename = os.path.normcase(filename)
163 | # list all files that start with ``filename``
164 | file_list = (
165 | x for x in os.listdir(current_path) if os.path.normcase(x).startswith(filename)
166 | )
167 | for f in file_list:
168 | opt = os.path.join(current_path, f)
169 | comp_file = os.path.normcase(os.path.join(directory, f))
170 | # complete regular files when there is not ``<dir>`` after option
171 | # complete directories when there is ``<file>``, ``<path>`` or
172 | # ``<dir>``after option
173 | if completion_type != "dir" and os.path.isfile(opt):
174 | yield comp_file
175 | elif os.path.isdir(opt):
176 | yield os.path.join(comp_file, "")
177 |
```
--------------------------------------------------------------------------------
/.venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/ssltransport.py:
--------------------------------------------------------------------------------
```python
1 | import io
2 | import socket
3 | import ssl
4 |
5 | from ..exceptions import ProxySchemeUnsupported
6 | from ..packages import six
7 |
8 | SSL_BLOCKSIZE = 16384
9 |
10 |
11 | class SSLTransport:
12 | """
13 | The SSLTransport wraps an existing socket and establishes an SSL connection.
14 |
15 | Contrary to Python's implementation of SSLSocket, it allows you to chain
16 | multiple TLS connections together. It's particularly useful if you need to
17 | implement TLS within TLS.
18 |
19 | The class supports most of the socket API operations.
20 | """
21 |
22 | @staticmethod
23 | def _validate_ssl_context_for_tls_in_tls(ssl_context):
24 | """
25 | Raises a ProxySchemeUnsupported if the provided ssl_context can't be used
26 | for TLS in TLS.
27 |
28 | The only requirement is that the ssl_context provides the 'wrap_bio'
29 | methods.
30 | """
31 |
32 | if not hasattr(ssl_context, "wrap_bio"):
33 | if six.PY2:
34 | raise ProxySchemeUnsupported(
35 | "TLS in TLS requires SSLContext.wrap_bio() which isn't "
36 | "supported on Python 2"
37 | )
38 | else:
39 | raise ProxySchemeUnsupported(
40 | "TLS in TLS requires SSLContext.wrap_bio() which isn't "
41 | "available on non-native SSLContext"
42 | )
43 |
44 | def __init__(
45 | self, socket, ssl_context, server_hostname=None, suppress_ragged_eofs=True
46 | ):
47 | """
48 | Create an SSLTransport around socket using the provided ssl_context.
49 | """
50 | self.incoming = ssl.MemoryBIO()
51 | self.outgoing = ssl.MemoryBIO()
52 |
53 | self.suppress_ragged_eofs = suppress_ragged_eofs
54 | self.socket = socket
55 |
56 | self.sslobj = ssl_context.wrap_bio(
57 | self.incoming, self.outgoing, server_hostname=server_hostname
58 | )
59 |
60 | # Perform initial handshake.
61 | self._ssl_io_loop(self.sslobj.do_handshake)
62 |
63 | def __enter__(self):
64 | return self
65 |
66 | def __exit__(self, *_):
67 | self.close()
68 |
69 | def fileno(self):
70 | return self.socket.fileno()
71 |
72 | def read(self, len=1024, buffer=None):
73 | return self._wrap_ssl_read(len, buffer)
74 |
75 | def recv(self, len=1024, flags=0):
76 | if flags != 0:
77 | raise ValueError("non-zero flags not allowed in calls to recv")
78 | return self._wrap_ssl_read(len)
79 |
80 | def recv_into(self, buffer, nbytes=None, flags=0):
81 | if flags != 0:
82 | raise ValueError("non-zero flags not allowed in calls to recv_into")
83 | if buffer and (nbytes is None):
84 | nbytes = len(buffer)
85 | elif nbytes is None:
86 | nbytes = 1024
87 | return self.read(nbytes, buffer)
88 |
89 | def sendall(self, data, flags=0):
90 | if flags != 0:
91 | raise ValueError("non-zero flags not allowed in calls to sendall")
92 | count = 0
93 | with memoryview(data) as view, view.cast("B") as byte_view:
94 | amount = len(byte_view)
95 | while count < amount:
96 | v = self.send(byte_view[count:])
97 | count += v
98 |
99 | def send(self, data, flags=0):
100 | if flags != 0:
101 | raise ValueError("non-zero flags not allowed in calls to send")
102 | response = self._ssl_io_loop(self.sslobj.write, data)
103 | return response
104 |
105 | def makefile(
106 | self, mode="r", buffering=None, encoding=None, errors=None, newline=None
107 | ):
108 | """
109 | Python's httpclient uses makefile and buffered io when reading HTTP
110 | messages and we need to support it.
111 |
112 | This is unfortunately a copy and paste of socket.py makefile with small
113 | changes to point to the socket directly.
114 | """
115 | if not set(mode) <= {"r", "w", "b"}:
116 | raise ValueError("invalid mode %r (only r, w, b allowed)" % (mode,))
117 |
118 | writing = "w" in mode
119 | reading = "r" in mode or not writing
120 | assert reading or writing
121 | binary = "b" in mode
122 | rawmode = ""
123 | if reading:
124 | rawmode += "r"
125 | if writing:
126 | rawmode += "w"
127 | raw = socket.SocketIO(self, rawmode)
128 | self.socket._io_refs += 1
129 | if buffering is None:
130 | buffering = -1
131 | if buffering < 0:
132 | buffering = io.DEFAULT_BUFFER_SIZE
133 | if buffering == 0:
134 | if not binary:
135 | raise ValueError("unbuffered streams must be binary")
136 | return raw
137 | if reading and writing:
138 | buffer = io.BufferedRWPair(raw, raw, buffering)
139 | elif reading:
140 | buffer = io.BufferedReader(raw, buffering)
141 | else:
142 | assert writing
143 | buffer = io.BufferedWriter(raw, buffering)
144 | if binary:
145 | return buffer
146 | text = io.TextIOWrapper(buffer, encoding, errors, newline)
147 | text.mode = mode
148 | return text
149 |
150 | def unwrap(self):
151 | self._ssl_io_loop(self.sslobj.unwrap)
152 |
153 | def close(self):
154 | self.socket.close()
155 |
156 | def getpeercert(self, binary_form=False):
157 | return self.sslobj.getpeercert(binary_form)
158 |
159 | def version(self):
160 | return self.sslobj.version()
161 |
162 | def cipher(self):
163 | return self.sslobj.cipher()
164 |
165 | def selected_alpn_protocol(self):
166 | return self.sslobj.selected_alpn_protocol()
167 |
168 | def selected_npn_protocol(self):
169 | return self.sslobj.selected_npn_protocol()
170 |
171 | def shared_ciphers(self):
172 | return self.sslobj.shared_ciphers()
173 |
174 | def compression(self):
175 | return self.sslobj.compression()
176 |
177 | def settimeout(self, value):
178 | self.socket.settimeout(value)
179 |
180 | def gettimeout(self):
181 | return self.socket.gettimeout()
182 |
183 | def _decref_socketios(self):
184 | self.socket._decref_socketios()
185 |
186 | def _wrap_ssl_read(self, len, buffer=None):
187 | try:
188 | return self._ssl_io_loop(self.sslobj.read, len, buffer)
189 | except ssl.SSLError as e:
190 | if e.errno == ssl.SSL_ERROR_EOF and self.suppress_ragged_eofs:
191 | return 0 # eof, return 0.
192 | else:
193 | raise
194 |
195 | def _ssl_io_loop(self, func, *args):
196 | """Performs an I/O loop between incoming/outgoing and the socket."""
197 | should_loop = True
198 | ret = None
199 |
200 | while should_loop:
201 | errno = None
202 | try:
203 | ret = func(*args)
204 | except ssl.SSLError as e:
205 | if e.errno not in (ssl.SSL_ERROR_WANT_READ, ssl.SSL_ERROR_WANT_WRITE):
206 | # WANT_READ, and WANT_WRITE are expected, others are not.
207 | raise e
208 | errno = e.errno
209 |
210 | buf = self.outgoing.read()
211 | self.socket.sendall(buf)
212 |
213 | if errno is None:
214 | should_loop = False
215 | elif errno == ssl.SSL_ERROR_WANT_READ:
216 | buf = self.socket.recv(SSL_BLOCKSIZE)
217 | if buf:
218 | self.incoming.write(buf)
219 | else:
220 | self.incoming.write_eof()
221 | return ret
222 |
```
--------------------------------------------------------------------------------
/.venv/lib/python3.12/site-packages/lxml/includes/libxslt/extensions.h:
--------------------------------------------------------------------------------
```
1 | /*
2 | * Summary: interface for the extension support
3 | * Description: This provide the API needed for simple and module
4 | * extension support.
5 | *
6 | * Copy: See Copyright for the status of this software.
7 | *
8 | * Author: Daniel Veillard
9 | */
10 |
11 | #ifndef __XML_XSLT_EXTENSION_H__
12 | #define __XML_XSLT_EXTENSION_H__
13 |
14 | #include <libxml/xpath.h>
15 | #include "xsltexports.h"
16 | #include "xsltInternals.h"
17 |
18 | #ifdef __cplusplus
19 | extern "C" {
20 | #endif
21 |
22 | /**
23 | * Extension Modules API.
24 | */
25 |
26 | /**
27 | * xsltInitGlobals:
28 | *
29 | * Initialize the global variables for extensions
30 | *
31 | */
32 |
33 | XSLTPUBFUN void XSLTCALL
34 | xsltInitGlobals (void);
35 |
36 | /**
37 | * xsltStyleExtInitFunction:
38 | * @ctxt: an XSLT stylesheet
39 | * @URI: the namespace URI for the extension
40 | *
41 | * A function called at initialization time of an XSLT extension module.
42 | *
43 | * Returns a pointer to the module specific data for this transformation.
44 | */
45 | typedef void * (*xsltStyleExtInitFunction) (xsltStylesheetPtr style,
46 | const xmlChar *URI);
47 |
48 | /**
49 | * xsltStyleExtShutdownFunction:
50 | * @ctxt: an XSLT stylesheet
51 | * @URI: the namespace URI for the extension
52 | * @data: the data associated to this module
53 | *
54 | * A function called at shutdown time of an XSLT extension module.
55 | */
56 | typedef void (*xsltStyleExtShutdownFunction) (xsltStylesheetPtr style,
57 | const xmlChar *URI,
58 | void *data);
59 |
60 | /**
61 | * xsltExtInitFunction:
62 | * @ctxt: an XSLT transformation context
63 | * @URI: the namespace URI for the extension
64 | *
65 | * A function called at initialization time of an XSLT extension module.
66 | *
67 | * Returns a pointer to the module specific data for this transformation.
68 | */
69 | typedef void * (*xsltExtInitFunction) (xsltTransformContextPtr ctxt,
70 | const xmlChar *URI);
71 |
72 | /**
73 | * xsltExtShutdownFunction:
74 | * @ctxt: an XSLT transformation context
75 | * @URI: the namespace URI for the extension
76 | * @data: the data associated to this module
77 | *
78 | * A function called at shutdown time of an XSLT extension module.
79 | */
80 | typedef void (*xsltExtShutdownFunction) (xsltTransformContextPtr ctxt,
81 | const xmlChar *URI,
82 | void *data);
83 |
84 | XSLTPUBFUN int XSLTCALL
85 | xsltRegisterExtModule (const xmlChar *URI,
86 | xsltExtInitFunction initFunc,
87 | xsltExtShutdownFunction shutdownFunc);
88 | XSLTPUBFUN int XSLTCALL
89 | xsltRegisterExtModuleFull
90 | (const xmlChar * URI,
91 | xsltExtInitFunction initFunc,
92 | xsltExtShutdownFunction shutdownFunc,
93 | xsltStyleExtInitFunction styleInitFunc,
94 | xsltStyleExtShutdownFunction styleShutdownFunc);
95 |
96 | XSLTPUBFUN int XSLTCALL
97 | xsltUnregisterExtModule (const xmlChar * URI);
98 |
99 | XSLTPUBFUN void * XSLTCALL
100 | xsltGetExtData (xsltTransformContextPtr ctxt,
101 | const xmlChar *URI);
102 |
103 | XSLTPUBFUN void * XSLTCALL
104 | xsltStyleGetExtData (xsltStylesheetPtr style,
105 | const xmlChar *URI);
106 | #ifdef XSLT_REFACTORED
107 | XSLTPUBFUN void * XSLTCALL
108 | xsltStyleStylesheetLevelGetExtData(
109 | xsltStylesheetPtr style,
110 | const xmlChar * URI);
111 | #endif
112 | XSLTPUBFUN void XSLTCALL
113 | xsltShutdownCtxtExts (xsltTransformContextPtr ctxt);
114 |
115 | XSLTPUBFUN void XSLTCALL
116 | xsltShutdownExts (xsltStylesheetPtr style);
117 |
118 | XSLTPUBFUN xsltTransformContextPtr XSLTCALL
119 | xsltXPathGetTransformContext
120 | (xmlXPathParserContextPtr ctxt);
121 |
122 | /*
123 | * extension functions
124 | */
125 | XSLTPUBFUN int XSLTCALL
126 | xsltRegisterExtModuleFunction
127 | (const xmlChar *name,
128 | const xmlChar *URI,
129 | xmlXPathFunction function);
130 | XSLTPUBFUN xmlXPathFunction XSLTCALL
131 | xsltExtModuleFunctionLookup (const xmlChar *name,
132 | const xmlChar *URI);
133 | XSLTPUBFUN int XSLTCALL
134 | xsltUnregisterExtModuleFunction
135 | (const xmlChar *name,
136 | const xmlChar *URI);
137 |
138 | /*
139 | * extension elements
140 | */
141 | typedef xsltElemPreCompPtr (*xsltPreComputeFunction)
142 | (xsltStylesheetPtr style,
143 | xmlNodePtr inst,
144 | xsltTransformFunction function);
145 |
146 | XSLTPUBFUN xsltElemPreCompPtr XSLTCALL
147 | xsltNewElemPreComp (xsltStylesheetPtr style,
148 | xmlNodePtr inst,
149 | xsltTransformFunction function);
150 | XSLTPUBFUN void XSLTCALL
151 | xsltInitElemPreComp (xsltElemPreCompPtr comp,
152 | xsltStylesheetPtr style,
153 | xmlNodePtr inst,
154 | xsltTransformFunction function,
155 | xsltElemPreCompDeallocator freeFunc);
156 |
157 | XSLTPUBFUN int XSLTCALL
158 | xsltRegisterExtModuleElement
159 | (const xmlChar *name,
160 | const xmlChar *URI,
161 | xsltPreComputeFunction precomp,
162 | xsltTransformFunction transform);
163 | XSLTPUBFUN xsltTransformFunction XSLTCALL
164 | xsltExtElementLookup (xsltTransformContextPtr ctxt,
165 | const xmlChar *name,
166 | const xmlChar *URI);
167 | XSLTPUBFUN xsltTransformFunction XSLTCALL
168 | xsltExtModuleElementLookup
169 | (const xmlChar *name,
170 | const xmlChar *URI);
171 | XSLTPUBFUN xsltPreComputeFunction XSLTCALL
172 | xsltExtModuleElementPreComputeLookup
173 | (const xmlChar *name,
174 | const xmlChar *URI);
175 | XSLTPUBFUN int XSLTCALL
176 | xsltUnregisterExtModuleElement
177 | (const xmlChar *name,
178 | const xmlChar *URI);
179 |
180 | /*
181 | * top-level elements
182 | */
183 | typedef void (*xsltTopLevelFunction) (xsltStylesheetPtr style,
184 | xmlNodePtr inst);
185 |
186 | XSLTPUBFUN int XSLTCALL
187 | xsltRegisterExtModuleTopLevel
188 | (const xmlChar *name,
189 | const xmlChar *URI,
190 | xsltTopLevelFunction function);
191 | XSLTPUBFUN xsltTopLevelFunction XSLTCALL
192 | xsltExtModuleTopLevelLookup
193 | (const xmlChar *name,
194 | const xmlChar *URI);
195 | XSLTPUBFUN int XSLTCALL
196 | xsltUnregisterExtModuleTopLevel
197 | (const xmlChar *name,
198 | const xmlChar *URI);
199 |
200 |
201 | /* These 2 functions are deprecated for use within modules. */
202 | XSLTPUBFUN int XSLTCALL
203 | xsltRegisterExtFunction (xsltTransformContextPtr ctxt,
204 | const xmlChar *name,
205 | const xmlChar *URI,
206 | xmlXPathFunction function);
207 | XSLTPUBFUN int XSLTCALL
208 | xsltRegisterExtElement (xsltTransformContextPtr ctxt,
209 | const xmlChar *name,
210 | const xmlChar *URI,
211 | xsltTransformFunction function);
212 |
213 | /*
214 | * Extension Prefix handling API.
215 | * Those are used by the XSLT (pre)processor.
216 | */
217 |
218 | XSLTPUBFUN int XSLTCALL
219 | xsltRegisterExtPrefix (xsltStylesheetPtr style,
220 | const xmlChar *prefix,
221 | const xmlChar *URI);
222 | XSLTPUBFUN int XSLTCALL
223 | xsltCheckExtPrefix (xsltStylesheetPtr style,
224 | const xmlChar *URI);
225 | XSLTPUBFUN int XSLTCALL
226 | xsltCheckExtURI (xsltStylesheetPtr style,
227 | const xmlChar *URI);
228 | XSLTPUBFUN int XSLTCALL
229 | xsltInitCtxtExts (xsltTransformContextPtr ctxt);
230 | XSLTPUBFUN void XSLTCALL
231 | xsltFreeCtxtExts (xsltTransformContextPtr ctxt);
232 | XSLTPUBFUN void XSLTCALL
233 | xsltFreeExts (xsltStylesheetPtr style);
234 |
235 | XSLTPUBFUN xsltElemPreCompPtr XSLTCALL
236 | xsltPreComputeExtModuleElement
237 | (xsltStylesheetPtr style,
238 | xmlNodePtr inst);
239 | /*
240 | * Extension Infos access.
241 | * Used by exslt initialisation
242 | */
243 |
244 | XSLTPUBFUN xmlHashTablePtr XSLTCALL
245 | xsltGetExtInfo (xsltStylesheetPtr style,
246 | const xmlChar *URI);
247 |
248 | /**
249 | * Test of the extension module API
250 | */
251 | XSLTPUBFUN void XSLTCALL
252 | xsltRegisterTestModule (void);
253 | XSLTPUBFUN void XSLTCALL
254 | xsltDebugDumpExtensions (FILE * output);
255 |
256 |
257 | #ifdef __cplusplus
258 | }
259 | #endif
260 |
261 | #endif /* __XML_XSLT_EXTENSION_H__ */
262 |
263 |
```