This is page 28 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/itsdangerous/timed.py:
--------------------------------------------------------------------------------
```python
1 | from __future__ import annotations
2 |
3 | import collections.abc as cabc
4 | import time
5 | import typing as t
6 | from datetime import datetime
7 | from datetime import timezone
8 |
9 | from .encoding import base64_decode
10 | from .encoding import base64_encode
11 | from .encoding import bytes_to_int
12 | from .encoding import int_to_bytes
13 | from .encoding import want_bytes
14 | from .exc import BadSignature
15 | from .exc import BadTimeSignature
16 | from .exc import SignatureExpired
17 | from .serializer import _TSerialized
18 | from .serializer import Serializer
19 | from .signer import Signer
20 |
21 |
22 | class TimestampSigner(Signer):
23 | """Works like the regular :class:`.Signer` but also records the time
24 | of the signing and can be used to expire signatures. The
25 | :meth:`unsign` method can raise :exc:`.SignatureExpired` if the
26 | unsigning failed because the signature is expired.
27 | """
28 |
29 | def get_timestamp(self) -> int:
30 | """Returns the current timestamp. The function must return an
31 | integer.
32 | """
33 | return int(time.time())
34 |
35 | def timestamp_to_datetime(self, ts: int) -> datetime:
36 | """Convert the timestamp from :meth:`get_timestamp` into an
37 | aware :class`datetime.datetime` in UTC.
38 |
39 | .. versionchanged:: 2.0
40 | The timestamp is returned as a timezone-aware ``datetime``
41 | in UTC rather than a naive ``datetime`` assumed to be UTC.
42 | """
43 | return datetime.fromtimestamp(ts, tz=timezone.utc)
44 |
45 | def sign(self, value: str | bytes) -> bytes:
46 | """Signs the given string and also attaches time information."""
47 | value = want_bytes(value)
48 | timestamp = base64_encode(int_to_bytes(self.get_timestamp()))
49 | sep = want_bytes(self.sep)
50 | value = value + sep + timestamp
51 | return value + sep + self.get_signature(value)
52 |
53 | # Ignore overlapping signatures check, return_timestamp is the only
54 | # parameter that affects the return type.
55 |
56 | @t.overload
57 | def unsign( # type: ignore[overload-overlap]
58 | self,
59 | signed_value: str | bytes,
60 | max_age: int | None = None,
61 | return_timestamp: t.Literal[False] = False,
62 | ) -> bytes: ...
63 |
64 | @t.overload
65 | def unsign(
66 | self,
67 | signed_value: str | bytes,
68 | max_age: int | None = None,
69 | return_timestamp: t.Literal[True] = True,
70 | ) -> tuple[bytes, datetime]: ...
71 |
72 | def unsign(
73 | self,
74 | signed_value: str | bytes,
75 | max_age: int | None = None,
76 | return_timestamp: bool = False,
77 | ) -> tuple[bytes, datetime] | bytes:
78 | """Works like the regular :meth:`.Signer.unsign` but can also
79 | validate the time. See the base docstring of the class for
80 | the general behavior. If ``return_timestamp`` is ``True`` the
81 | timestamp of the signature will be returned as an aware
82 | :class:`datetime.datetime` object in UTC.
83 |
84 | .. versionchanged:: 2.0
85 | The timestamp is returned as a timezone-aware ``datetime``
86 | in UTC rather than a naive ``datetime`` assumed to be UTC.
87 | """
88 | try:
89 | result = super().unsign(signed_value)
90 | sig_error = None
91 | except BadSignature as e:
92 | sig_error = e
93 | result = e.payload or b""
94 |
95 | sep = want_bytes(self.sep)
96 |
97 | # If there is no timestamp in the result there is something
98 | # seriously wrong. In case there was a signature error, we raise
99 | # that one directly, otherwise we have a weird situation in
100 | # which we shouldn't have come except someone uses a time-based
101 | # serializer on non-timestamp data, so catch that.
102 | if sep not in result:
103 | if sig_error:
104 | raise sig_error
105 |
106 | raise BadTimeSignature("timestamp missing", payload=result)
107 |
108 | value, ts_bytes = result.rsplit(sep, 1)
109 | ts_int: int | None = None
110 | ts_dt: datetime | None = None
111 |
112 | try:
113 | ts_int = bytes_to_int(base64_decode(ts_bytes))
114 | except Exception:
115 | pass
116 |
117 | # Signature is *not* okay. Raise a proper error now that we have
118 | # split the value and the timestamp.
119 | if sig_error is not None:
120 | if ts_int is not None:
121 | try:
122 | ts_dt = self.timestamp_to_datetime(ts_int)
123 | except (ValueError, OSError, OverflowError) as exc:
124 | # Windows raises OSError
125 | # 32-bit raises OverflowError
126 | raise BadTimeSignature(
127 | "Malformed timestamp", payload=value
128 | ) from exc
129 |
130 | raise BadTimeSignature(str(sig_error), payload=value, date_signed=ts_dt)
131 |
132 | # Signature was okay but the timestamp is actually not there or
133 | # malformed. Should not happen, but we handle it anyway.
134 | if ts_int is None:
135 | raise BadTimeSignature("Malformed timestamp", payload=value)
136 |
137 | # Check timestamp is not older than max_age
138 | if max_age is not None:
139 | age = self.get_timestamp() - ts_int
140 |
141 | if age > max_age:
142 | raise SignatureExpired(
143 | f"Signature age {age} > {max_age} seconds",
144 | payload=value,
145 | date_signed=self.timestamp_to_datetime(ts_int),
146 | )
147 |
148 | if age < 0:
149 | raise SignatureExpired(
150 | f"Signature age {age} < 0 seconds",
151 | payload=value,
152 | date_signed=self.timestamp_to_datetime(ts_int),
153 | )
154 |
155 | if return_timestamp:
156 | return value, self.timestamp_to_datetime(ts_int)
157 |
158 | return value
159 |
160 | def validate(self, signed_value: str | bytes, max_age: int | None = None) -> bool:
161 | """Only validates the given signed value. Returns ``True`` if
162 | the signature exists and is valid."""
163 | try:
164 | self.unsign(signed_value, max_age=max_age)
165 | return True
166 | except BadSignature:
167 | return False
168 |
169 |
170 | class TimedSerializer(Serializer[_TSerialized]):
171 | """Uses :class:`TimestampSigner` instead of the default
172 | :class:`.Signer`.
173 | """
174 |
175 | default_signer: type[TimestampSigner] = TimestampSigner
176 |
177 | def iter_unsigners(
178 | self, salt: str | bytes | None = None
179 | ) -> cabc.Iterator[TimestampSigner]:
180 | return t.cast("cabc.Iterator[TimestampSigner]", super().iter_unsigners(salt))
181 |
182 | # TODO: Signature is incompatible because parameters were added
183 | # before salt.
184 |
185 | def loads( # type: ignore[override]
186 | self,
187 | s: str | bytes,
188 | max_age: int | None = None,
189 | return_timestamp: bool = False,
190 | salt: str | bytes | None = None,
191 | ) -> t.Any:
192 | """Reverse of :meth:`dumps`, raises :exc:`.BadSignature` if the
193 | signature validation fails. If a ``max_age`` is provided it will
194 | ensure the signature is not older than that time in seconds. In
195 | case the signature is outdated, :exc:`.SignatureExpired` is
196 | raised. All arguments are forwarded to the signer's
197 | :meth:`~TimestampSigner.unsign` method.
198 | """
199 | s = want_bytes(s)
200 | last_exception = None
201 |
202 | for signer in self.iter_unsigners(salt):
203 | try:
204 | base64d, timestamp = signer.unsign(
205 | s, max_age=max_age, return_timestamp=True
206 | )
207 | payload = self.load_payload(base64d)
208 |
209 | if return_timestamp:
210 | return payload, timestamp
211 |
212 | return payload
213 | except SignatureExpired:
214 | # The signature was unsigned successfully but was
215 | # expired. Do not try the next signer.
216 | raise
217 | except BadSignature as err:
218 | last_exception = err
219 |
220 | raise t.cast(BadSignature, last_exception)
221 |
222 | def loads_unsafe( # type: ignore[override]
223 | self,
224 | s: str | bytes,
225 | max_age: int | None = None,
226 | salt: str | bytes | None = None,
227 | ) -> tuple[bool, t.Any]:
228 | return self._loads_unsafe_impl(s, salt, load_kwargs={"max_age": max_age})
229 |
```
--------------------------------------------------------------------------------
/.venv/lib/python3.12/site-packages/lxml/builder.py:
--------------------------------------------------------------------------------
```python
1 | # cython: language_level=2
2 |
3 | #
4 | # Element generator factory by Fredrik Lundh.
5 | #
6 | # Source:
7 | # http://online.effbot.org/2006_11_01_archive.htm#et-builder
8 | # http://effbot.python-hosting.com/file/stuff/sandbox/elementlib/builder.py
9 | #
10 | # --------------------------------------------------------------------
11 | # The ElementTree toolkit is
12 | #
13 | # Copyright (c) 1999-2004 by Fredrik Lundh
14 | #
15 | # By obtaining, using, and/or copying this software and/or its
16 | # associated documentation, you agree that you have read, understood,
17 | # and will comply with the following terms and conditions:
18 | #
19 | # Permission to use, copy, modify, and distribute this software and
20 | # its associated documentation for any purpose and without fee is
21 | # hereby granted, provided that the above copyright notice appears in
22 | # all copies, and that both that copyright notice and this permission
23 | # notice appear in supporting documentation, and that the name of
24 | # Secret Labs AB or the author not be used in advertising or publicity
25 | # pertaining to distribution of the software without specific, written
26 | # prior permission.
27 | #
28 | # SECRET LABS AB AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD
29 | # TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANT-
30 | # ABILITY AND FITNESS. IN NO EVENT SHALL SECRET LABS AB OR THE AUTHOR
31 | # BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY
32 | # DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
33 | # WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
34 | # ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
35 | # OF THIS SOFTWARE.
36 | # --------------------------------------------------------------------
37 |
38 | """
39 | The ``E`` Element factory for generating XML documents.
40 | """
41 |
42 |
43 | import lxml.etree as ET
44 | _QName = ET.QName
45 |
46 | from functools import partial
47 |
48 | try:
49 | basestring
50 | except NameError:
51 | basestring = str
52 |
53 | try:
54 | unicode
55 | except NameError:
56 | unicode = str
57 |
58 |
59 | class ElementMaker:
60 | """Element generator factory.
61 |
62 | Unlike the ordinary Element factory, the E factory allows you to pass in
63 | more than just a tag and some optional attributes; you can also pass in
64 | text and other elements. The text is added as either text or tail
65 | attributes, and elements are inserted at the right spot. Some small
66 | examples::
67 |
68 | >>> from lxml import etree as ET
69 | >>> from lxml.builder import E
70 |
71 | >>> ET.tostring(E("tag"))
72 | '<tag/>'
73 | >>> ET.tostring(E("tag", "text"))
74 | '<tag>text</tag>'
75 | >>> ET.tostring(E("tag", "text", key="value"))
76 | '<tag key="value">text</tag>'
77 | >>> ET.tostring(E("tag", E("subtag", "text"), "tail"))
78 | '<tag><subtag>text</subtag>tail</tag>'
79 |
80 | For simple tags, the factory also allows you to write ``E.tag(...)`` instead
81 | of ``E('tag', ...)``::
82 |
83 | >>> ET.tostring(E.tag())
84 | '<tag/>'
85 | >>> ET.tostring(E.tag("text"))
86 | '<tag>text</tag>'
87 | >>> ET.tostring(E.tag(E.subtag("text"), "tail"))
88 | '<tag><subtag>text</subtag>tail</tag>'
89 |
90 | Here's a somewhat larger example; this shows how to generate HTML
91 | documents, using a mix of prepared factory functions for inline elements,
92 | nested ``E.tag`` calls, and embedded XHTML fragments::
93 |
94 | # some common inline elements
95 | A = E.a
96 | I = E.i
97 | B = E.b
98 |
99 | def CLASS(v):
100 | # helper function, 'class' is a reserved word
101 | return {'class': v}
102 |
103 | page = (
104 | E.html(
105 | E.head(
106 | E.title("This is a sample document")
107 | ),
108 | E.body(
109 | E.h1("Hello!", CLASS("title")),
110 | E.p("This is a paragraph with ", B("bold"), " text in it!"),
111 | E.p("This is another paragraph, with a ",
112 | A("link", href="http://www.python.org"), "."),
113 | E.p("Here are some reserved characters: <spam&egg>."),
114 | ET.XML("<p>And finally, here is an embedded XHTML fragment.</p>"),
115 | )
116 | )
117 | )
118 |
119 | print ET.tostring(page)
120 |
121 | Here's a prettyprinted version of the output from the above script::
122 |
123 | <html>
124 | <head>
125 | <title>This is a sample document</title>
126 | </head>
127 | <body>
128 | <h1 class="title">Hello!</h1>
129 | <p>This is a paragraph with <b>bold</b> text in it!</p>
130 | <p>This is another paragraph, with <a href="http://www.python.org">link</a>.</p>
131 | <p>Here are some reserved characters: <spam&egg>.</p>
132 | <p>And finally, here is an embedded XHTML fragment.</p>
133 | </body>
134 | </html>
135 |
136 | For namespace support, you can pass a namespace map (``nsmap``)
137 | and/or a specific target ``namespace`` to the ElementMaker class::
138 |
139 | >>> E = ElementMaker(namespace="http://my.ns/")
140 | >>> print(ET.tostring( E.test ))
141 | <test xmlns="http://my.ns/"/>
142 |
143 | >>> E = ElementMaker(namespace="http://my.ns/", nsmap={'p':'http://my.ns/'})
144 | >>> print(ET.tostring( E.test ))
145 | <p:test xmlns:p="http://my.ns/"/>
146 | """
147 |
148 | def __init__(self, typemap=None,
149 | namespace=None, nsmap=None, makeelement=None):
150 | self._namespace = '{' + namespace + '}' if namespace is not None else None
151 | self._nsmap = dict(nsmap) if nsmap else None
152 |
153 | assert makeelement is None or callable(makeelement)
154 | self._makeelement = makeelement if makeelement is not None else ET.Element
155 |
156 | # initialize the default type map functions for this element factory
157 | typemap = dict(typemap) if typemap else {}
158 |
159 | def add_text(elem, item):
160 | try:
161 | last_child = elem[-1]
162 | except IndexError:
163 | elem.text = (elem.text or "") + item
164 | else:
165 | last_child.tail = (last_child.tail or "") + item
166 |
167 | def add_cdata(elem, cdata):
168 | if elem.text:
169 | raise ValueError("Can't add a CDATA section. Element already has some text: %r" % elem.text)
170 | elem.text = cdata
171 |
172 | if str not in typemap:
173 | typemap[str] = add_text
174 | if unicode not in typemap:
175 | typemap[unicode] = add_text
176 | if ET.CDATA not in typemap:
177 | typemap[ET.CDATA] = add_cdata
178 |
179 | def add_dict(elem, item):
180 | attrib = elem.attrib
181 | for k, v in item.items():
182 | if isinstance(v, basestring):
183 | attrib[k] = v
184 | else:
185 | attrib[k] = typemap[type(v)](None, v)
186 |
187 | if dict not in typemap:
188 | typemap[dict] = add_dict
189 |
190 | self._typemap = typemap
191 |
192 | def __call__(self, tag, *children, **attrib):
193 | typemap = self._typemap
194 |
195 | # We'll usually get a 'str', and the compiled type check is very fast.
196 | if not isinstance(tag, str) and isinstance(tag, _QName):
197 | # A QName is explicitly qualified, do not look at self._namespace.
198 | tag = tag.text
199 | elif self._namespace is not None and tag[0] != '{':
200 | tag = self._namespace + tag
201 | elem = self._makeelement(tag, nsmap=self._nsmap)
202 | if attrib:
203 | typemap[dict](elem, attrib)
204 |
205 | for item in children:
206 | if callable(item):
207 | item = item()
208 | t = typemap.get(type(item))
209 | if t is None:
210 | if ET.iselement(item):
211 | elem.append(item)
212 | continue
213 | for basetype in type(item).__mro__:
214 | # See if the typemap knows of any of this type's bases.
215 | t = typemap.get(basetype)
216 | if t is not None:
217 | break
218 | else:
219 | raise TypeError("bad argument type: %s(%r)" %
220 | (type(item).__name__, item))
221 | v = t(elem, item)
222 | if v:
223 | typemap.get(type(v))(elem, v)
224 |
225 | return elem
226 |
227 | def __getattr__(self, tag):
228 | return partial(self, tag)
229 |
230 |
231 | # create factory object
232 | E = ElementMaker()
233 |
```
--------------------------------------------------------------------------------
/.venv/lib/python3.12/site-packages/lxml/includes/libxml/encoding.h:
--------------------------------------------------------------------------------
```
1 | /*
2 | * Summary: interface for the encoding conversion functions
3 | * Description: interface for the encoding conversion functions needed for
4 | * XML basic encoding and iconv() support.
5 | *
6 | * Related specs are
7 | * rfc2044 (UTF-8 and UTF-16) F. Yergeau Alis Technologies
8 | * [ISO-10646] UTF-8 and UTF-16 in Annexes
9 | * [ISO-8859-1] ISO Latin-1 characters codes.
10 | * [UNICODE] The Unicode Consortium, "The Unicode Standard --
11 | * Worldwide Character Encoding -- Version 1.0", Addison-
12 | * Wesley, Volume 1, 1991, Volume 2, 1992. UTF-8 is
13 | * described in Unicode Technical Report #4.
14 | * [US-ASCII] Coded Character Set--7-bit American Standard Code for
15 | * Information Interchange, ANSI X3.4-1986.
16 | *
17 | * Copy: See Copyright for the status of this software.
18 | *
19 | * Author: Daniel Veillard
20 | */
21 |
22 | #ifndef __XML_CHAR_ENCODING_H__
23 | #define __XML_CHAR_ENCODING_H__
24 |
25 | #include <libxml/xmlversion.h>
26 |
27 | #ifdef LIBXML_ICONV_ENABLED
28 | #include <iconv.h>
29 | #endif
30 |
31 | #ifdef __cplusplus
32 | extern "C" {
33 | #endif
34 |
35 | typedef enum {
36 | XML_ENC_ERR_SUCCESS = 0,
37 | XML_ENC_ERR_SPACE = -1,
38 | XML_ENC_ERR_INPUT = -2,
39 | XML_ENC_ERR_PARTIAL = -3,
40 | XML_ENC_ERR_INTERNAL = -4,
41 | XML_ENC_ERR_MEMORY = -5
42 | } xmlCharEncError;
43 |
44 | /*
45 | * xmlCharEncoding:
46 | *
47 | * Predefined values for some standard encodings.
48 | * Libxml does not do beforehand translation on UTF8 and ISOLatinX.
49 | * It also supports ASCII, ISO-8859-1, and UTF16 (LE and BE) by default.
50 | *
51 | * Anything else would have to be translated to UTF8 before being
52 | * given to the parser itself. The BOM for UTF16 and the encoding
53 | * declaration are looked at and a converter is looked for at that
54 | * point. If not found the parser stops here as asked by the XML REC. A
55 | * converter can be registered by the user using xmlRegisterCharEncodingHandler
56 | * but the current form doesn't allow stateful transcoding (a serious
57 | * problem agreed !). If iconv has been found it will be used
58 | * automatically and allow stateful transcoding, the simplest is then
59 | * to be sure to enable iconv and to provide iconv libs for the encoding
60 | * support needed.
61 | *
62 | * Note that the generic "UTF-16" is not a predefined value. Instead, only
63 | * the specific UTF-16LE and UTF-16BE are present.
64 | */
65 | typedef enum {
66 | XML_CHAR_ENCODING_ERROR= -1, /* No char encoding detected */
67 | XML_CHAR_ENCODING_NONE= 0, /* No char encoding detected */
68 | XML_CHAR_ENCODING_UTF8= 1, /* UTF-8 */
69 | XML_CHAR_ENCODING_UTF16LE= 2, /* UTF-16 little endian */
70 | XML_CHAR_ENCODING_UTF16BE= 3, /* UTF-16 big endian */
71 | XML_CHAR_ENCODING_UCS4LE= 4, /* UCS-4 little endian */
72 | XML_CHAR_ENCODING_UCS4BE= 5, /* UCS-4 big endian */
73 | XML_CHAR_ENCODING_EBCDIC= 6, /* EBCDIC uh! */
74 | XML_CHAR_ENCODING_UCS4_2143=7, /* UCS-4 unusual ordering */
75 | XML_CHAR_ENCODING_UCS4_3412=8, /* UCS-4 unusual ordering */
76 | XML_CHAR_ENCODING_UCS2= 9, /* UCS-2 */
77 | XML_CHAR_ENCODING_8859_1= 10,/* ISO-8859-1 ISO Latin 1 */
78 | XML_CHAR_ENCODING_8859_2= 11,/* ISO-8859-2 ISO Latin 2 */
79 | XML_CHAR_ENCODING_8859_3= 12,/* ISO-8859-3 */
80 | XML_CHAR_ENCODING_8859_4= 13,/* ISO-8859-4 */
81 | XML_CHAR_ENCODING_8859_5= 14,/* ISO-8859-5 */
82 | XML_CHAR_ENCODING_8859_6= 15,/* ISO-8859-6 */
83 | XML_CHAR_ENCODING_8859_7= 16,/* ISO-8859-7 */
84 | XML_CHAR_ENCODING_8859_8= 17,/* ISO-8859-8 */
85 | XML_CHAR_ENCODING_8859_9= 18,/* ISO-8859-9 */
86 | XML_CHAR_ENCODING_2022_JP= 19,/* ISO-2022-JP */
87 | XML_CHAR_ENCODING_SHIFT_JIS=20,/* Shift_JIS */
88 | XML_CHAR_ENCODING_EUC_JP= 21,/* EUC-JP */
89 | XML_CHAR_ENCODING_ASCII= 22 /* pure ASCII */
90 | } xmlCharEncoding;
91 |
92 | /**
93 | * xmlCharEncodingInputFunc:
94 | * @out: a pointer to an array of bytes to store the UTF-8 result
95 | * @outlen: the length of @out
96 | * @in: a pointer to an array of chars in the original encoding
97 | * @inlen: the length of @in
98 | *
99 | * Take a block of chars in the original encoding and try to convert
100 | * it to an UTF-8 block of chars out.
101 | *
102 | * Returns the number of bytes written, -1 if lack of space, or -2
103 | * if the transcoding failed.
104 | * The value of @inlen after return is the number of octets consumed
105 | * if the return value is positive, else unpredictiable.
106 | * The value of @outlen after return is the number of octets consumed.
107 | */
108 | typedef int (* xmlCharEncodingInputFunc)(unsigned char *out, int *outlen,
109 | const unsigned char *in, int *inlen);
110 |
111 |
112 | /**
113 | * xmlCharEncodingOutputFunc:
114 | * @out: a pointer to an array of bytes to store the result
115 | * @outlen: the length of @out
116 | * @in: a pointer to an array of UTF-8 chars
117 | * @inlen: the length of @in
118 | *
119 | * Take a block of UTF-8 chars in and try to convert it to another
120 | * encoding.
121 | * Note: a first call designed to produce heading info is called with
122 | * in = NULL. If stateful this should also initialize the encoder state.
123 | *
124 | * Returns the number of bytes written, -1 if lack of space, or -2
125 | * if the transcoding failed.
126 | * The value of @inlen after return is the number of octets consumed
127 | * if the return value is positive, else unpredictiable.
128 | * The value of @outlen after return is the number of octets produced.
129 | */
130 | typedef int (* xmlCharEncodingOutputFunc)(unsigned char *out, int *outlen,
131 | const unsigned char *in, int *inlen);
132 |
133 |
134 | /*
135 | * Block defining the handlers for non UTF-8 encodings.
136 | * If iconv is supported, there are two extra fields.
137 | */
138 | typedef struct _xmlCharEncodingHandler xmlCharEncodingHandler;
139 | typedef xmlCharEncodingHandler *xmlCharEncodingHandlerPtr;
140 | struct _xmlCharEncodingHandler {
141 | char *name;
142 | xmlCharEncodingInputFunc input;
143 | xmlCharEncodingOutputFunc output;
144 | #ifdef LIBXML_ICONV_ENABLED
145 | iconv_t iconv_in;
146 | iconv_t iconv_out;
147 | #endif /* LIBXML_ICONV_ENABLED */
148 | #ifdef LIBXML_ICU_ENABLED
149 | struct _uconv_t *uconv_in;
150 | struct _uconv_t *uconv_out;
151 | #endif /* LIBXML_ICU_ENABLED */
152 | };
153 |
154 | /*
155 | * Interfaces for encoding handlers.
156 | */
157 | XML_DEPRECATED
158 | XMLPUBFUN void
159 | xmlInitCharEncodingHandlers (void);
160 | XML_DEPRECATED
161 | XMLPUBFUN void
162 | xmlCleanupCharEncodingHandlers (void);
163 | XMLPUBFUN void
164 | xmlRegisterCharEncodingHandler (xmlCharEncodingHandlerPtr handler);
165 | XMLPUBFUN xmlCharEncodingHandlerPtr
166 | xmlGetCharEncodingHandler (xmlCharEncoding enc);
167 | XMLPUBFUN xmlCharEncodingHandlerPtr
168 | xmlFindCharEncodingHandler (const char *name);
169 | XMLPUBFUN xmlCharEncodingHandlerPtr
170 | xmlNewCharEncodingHandler (const char *name,
171 | xmlCharEncodingInputFunc input,
172 | xmlCharEncodingOutputFunc output);
173 |
174 | /*
175 | * Interfaces for encoding names and aliases.
176 | */
177 | XMLPUBFUN int
178 | xmlAddEncodingAlias (const char *name,
179 | const char *alias);
180 | XMLPUBFUN int
181 | xmlDelEncodingAlias (const char *alias);
182 | XMLPUBFUN const char *
183 | xmlGetEncodingAlias (const char *alias);
184 | XMLPUBFUN void
185 | xmlCleanupEncodingAliases (void);
186 | XMLPUBFUN xmlCharEncoding
187 | xmlParseCharEncoding (const char *name);
188 | XMLPUBFUN const char *
189 | xmlGetCharEncodingName (xmlCharEncoding enc);
190 |
191 | /*
192 | * Interfaces directly used by the parsers.
193 | */
194 | XMLPUBFUN xmlCharEncoding
195 | xmlDetectCharEncoding (const unsigned char *in,
196 | int len);
197 |
198 | struct _xmlBuffer;
199 | XMLPUBFUN int
200 | xmlCharEncOutFunc (xmlCharEncodingHandler *handler,
201 | struct _xmlBuffer *out,
202 | struct _xmlBuffer *in);
203 |
204 | XMLPUBFUN int
205 | xmlCharEncInFunc (xmlCharEncodingHandler *handler,
206 | struct _xmlBuffer *out,
207 | struct _xmlBuffer *in);
208 | XML_DEPRECATED
209 | XMLPUBFUN int
210 | xmlCharEncFirstLine (xmlCharEncodingHandler *handler,
211 | struct _xmlBuffer *out,
212 | struct _xmlBuffer *in);
213 | XMLPUBFUN int
214 | xmlCharEncCloseFunc (xmlCharEncodingHandler *handler);
215 |
216 | /*
217 | * Export a few useful functions
218 | */
219 | #ifdef LIBXML_OUTPUT_ENABLED
220 | XMLPUBFUN int
221 | UTF8Toisolat1 (unsigned char *out,
222 | int *outlen,
223 | const unsigned char *in,
224 | int *inlen);
225 | #endif /* LIBXML_OUTPUT_ENABLED */
226 | XMLPUBFUN int
227 | isolat1ToUTF8 (unsigned char *out,
228 | int *outlen,
229 | const unsigned char *in,
230 | int *inlen);
231 | #ifdef __cplusplus
232 | }
233 | #endif
234 |
235 | #endif /* __XML_CHAR_ENCODING_H__ */
236 |
```
--------------------------------------------------------------------------------
/.venv/lib/python3.12/site-packages/pip/_internal/self_outdated_check.py:
--------------------------------------------------------------------------------
```python
1 | import datetime
2 | import functools
3 | import hashlib
4 | import json
5 | import logging
6 | import optparse
7 | import os.path
8 | import sys
9 | from dataclasses import dataclass
10 | from typing import Any, Callable, Dict, Optional
11 |
12 | from pip._vendor.packaging.version import Version
13 | from pip._vendor.packaging.version import parse as parse_version
14 | from pip._vendor.rich.console import Group
15 | from pip._vendor.rich.markup import escape
16 | from pip._vendor.rich.text import Text
17 |
18 | from pip._internal.index.collector import LinkCollector
19 | from pip._internal.index.package_finder import PackageFinder
20 | from pip._internal.metadata import get_default_environment
21 | from pip._internal.models.selection_prefs import SelectionPreferences
22 | from pip._internal.network.session import PipSession
23 | from pip._internal.utils.compat import WINDOWS
24 | from pip._internal.utils.entrypoints import (
25 | get_best_invocation_for_this_pip,
26 | get_best_invocation_for_this_python,
27 | )
28 | from pip._internal.utils.filesystem import adjacent_tmp_file, check_path_owner, replace
29 | from pip._internal.utils.misc import ensure_dir
30 |
31 | _WEEK = datetime.timedelta(days=7)
32 |
33 | logger = logging.getLogger(__name__)
34 |
35 |
36 | def _get_statefile_name(key: str) -> str:
37 | key_bytes = key.encode()
38 | name = hashlib.sha224(key_bytes).hexdigest()
39 | return name
40 |
41 |
42 | def _convert_date(isodate: str) -> datetime.datetime:
43 | """Convert an ISO format string to a date.
44 |
45 | Handles the format 2020-01-22T14:24:01Z (trailing Z)
46 | which is not supported by older versions of fromisoformat.
47 | """
48 | return datetime.datetime.fromisoformat(isodate.replace("Z", "+00:00"))
49 |
50 |
51 | class SelfCheckState:
52 | def __init__(self, cache_dir: str) -> None:
53 | self._state: Dict[str, Any] = {}
54 | self._statefile_path = None
55 |
56 | # Try to load the existing state
57 | if cache_dir:
58 | self._statefile_path = os.path.join(
59 | cache_dir, "selfcheck", _get_statefile_name(self.key)
60 | )
61 | try:
62 | with open(self._statefile_path, encoding="utf-8") as statefile:
63 | self._state = json.load(statefile)
64 | except (OSError, ValueError, KeyError):
65 | # Explicitly suppressing exceptions, since we don't want to
66 | # error out if the cache file is invalid.
67 | pass
68 |
69 | @property
70 | def key(self) -> str:
71 | return sys.prefix
72 |
73 | def get(self, current_time: datetime.datetime) -> Optional[str]:
74 | """Check if we have a not-outdated version loaded already."""
75 | if not self._state:
76 | return None
77 |
78 | if "last_check" not in self._state:
79 | return None
80 |
81 | if "pypi_version" not in self._state:
82 | return None
83 |
84 | # Determine if we need to refresh the state
85 | last_check = _convert_date(self._state["last_check"])
86 | time_since_last_check = current_time - last_check
87 | if time_since_last_check > _WEEK:
88 | return None
89 |
90 | return self._state["pypi_version"]
91 |
92 | def set(self, pypi_version: str, current_time: datetime.datetime) -> None:
93 | # If we do not have a path to cache in, don't bother saving.
94 | if not self._statefile_path:
95 | return
96 |
97 | # Check to make sure that we own the directory
98 | if not check_path_owner(os.path.dirname(self._statefile_path)):
99 | return
100 |
101 | # Now that we've ensured the directory is owned by this user, we'll go
102 | # ahead and make sure that all our directories are created.
103 | ensure_dir(os.path.dirname(self._statefile_path))
104 |
105 | state = {
106 | # Include the key so it's easy to tell which pip wrote the
107 | # file.
108 | "key": self.key,
109 | "last_check": current_time.isoformat(),
110 | "pypi_version": pypi_version,
111 | }
112 |
113 | text = json.dumps(state, sort_keys=True, separators=(",", ":"))
114 |
115 | with adjacent_tmp_file(self._statefile_path) as f:
116 | f.write(text.encode())
117 |
118 | try:
119 | # Since we have a prefix-specific state file, we can just
120 | # overwrite whatever is there, no need to check.
121 | replace(f.name, self._statefile_path)
122 | except OSError:
123 | # Best effort.
124 | pass
125 |
126 |
127 | @dataclass
128 | class UpgradePrompt:
129 | old: str
130 | new: str
131 |
132 | def __rich__(self) -> Group:
133 | if WINDOWS:
134 | pip_cmd = f"{get_best_invocation_for_this_python()} -m pip"
135 | else:
136 | pip_cmd = get_best_invocation_for_this_pip()
137 |
138 | notice = "[bold][[reset][blue]notice[reset][bold]][reset]"
139 | return Group(
140 | Text(),
141 | Text.from_markup(
142 | f"{notice} A new release of pip is available: "
143 | f"[red]{self.old}[reset] -> [green]{self.new}[reset]"
144 | ),
145 | Text.from_markup(
146 | f"{notice} To update, run: "
147 | f"[green]{escape(pip_cmd)} install --upgrade pip"
148 | ),
149 | )
150 |
151 |
152 | def was_installed_by_pip(pkg: str) -> bool:
153 | """Checks whether pkg was installed by pip
154 |
155 | This is used not to display the upgrade message when pip is in fact
156 | installed by system package manager, such as dnf on Fedora.
157 | """
158 | dist = get_default_environment().get_distribution(pkg)
159 | return dist is not None and "pip" == dist.installer
160 |
161 |
162 | def _get_current_remote_pip_version(
163 | session: PipSession, options: optparse.Values
164 | ) -> Optional[str]:
165 | # Lets use PackageFinder to see what the latest pip version is
166 | link_collector = LinkCollector.create(
167 | session,
168 | options=options,
169 | suppress_no_index=True,
170 | )
171 |
172 | # Pass allow_yanked=False so we don't suggest upgrading to a
173 | # yanked version.
174 | selection_prefs = SelectionPreferences(
175 | allow_yanked=False,
176 | allow_all_prereleases=False, # Explicitly set to False
177 | )
178 |
179 | finder = PackageFinder.create(
180 | link_collector=link_collector,
181 | selection_prefs=selection_prefs,
182 | )
183 | best_candidate = finder.find_best_candidate("pip").best_candidate
184 | if best_candidate is None:
185 | return None
186 |
187 | return str(best_candidate.version)
188 |
189 |
190 | def _self_version_check_logic(
191 | *,
192 | state: SelfCheckState,
193 | current_time: datetime.datetime,
194 | local_version: Version,
195 | get_remote_version: Callable[[], Optional[str]],
196 | ) -> Optional[UpgradePrompt]:
197 | remote_version_str = state.get(current_time)
198 | if remote_version_str is None:
199 | remote_version_str = get_remote_version()
200 | if remote_version_str is None:
201 | logger.debug("No remote pip version found")
202 | return None
203 | state.set(remote_version_str, current_time)
204 |
205 | remote_version = parse_version(remote_version_str)
206 | logger.debug("Remote version of pip: %s", remote_version)
207 | logger.debug("Local version of pip: %s", local_version)
208 |
209 | pip_installed_by_pip = was_installed_by_pip("pip")
210 | logger.debug("Was pip installed by pip? %s", pip_installed_by_pip)
211 | if not pip_installed_by_pip:
212 | return None # Only suggest upgrade if pip is installed by pip.
213 |
214 | local_version_is_older = (
215 | local_version < remote_version
216 | and local_version.base_version != remote_version.base_version
217 | )
218 | if local_version_is_older:
219 | return UpgradePrompt(old=str(local_version), new=remote_version_str)
220 |
221 | return None
222 |
223 |
224 | def pip_self_version_check(session: PipSession, options: optparse.Values) -> None:
225 | """Check for an update for pip.
226 |
227 | Limit the frequency of checks to once per week. State is stored either in
228 | the active virtualenv or in the user's USER_CACHE_DIR keyed off the prefix
229 | of the pip script path.
230 | """
231 | installed_dist = get_default_environment().get_distribution("pip")
232 | if not installed_dist:
233 | return
234 |
235 | upgrade_prompt = _self_version_check_logic(
236 | state=SelfCheckState(cache_dir=options.cache_dir),
237 | current_time=datetime.datetime.now(datetime.timezone.utc),
238 | local_version=installed_dist.version,
239 | get_remote_version=functools.partial(
240 | _get_current_remote_pip_version, session, options
241 | ),
242 | )
243 | if upgrade_prompt is not None:
244 | logger.warning("%s", upgrade_prompt, extra={"rich": True})
245 |
```
--------------------------------------------------------------------------------
/.venv/lib/python3.12/site-packages/pip/_vendor/rich/progress_bar.py:
--------------------------------------------------------------------------------
```python
1 | import math
2 | from functools import lru_cache
3 | from time import monotonic
4 | from typing import Iterable, List, Optional
5 |
6 | from .color import Color, blend_rgb
7 | from .color_triplet import ColorTriplet
8 | from .console import Console, ConsoleOptions, RenderResult
9 | from .jupyter import JupyterMixin
10 | from .measure import Measurement
11 | from .segment import Segment
12 | from .style import Style, StyleType
13 |
14 | # Number of characters before 'pulse' animation repeats
15 | PULSE_SIZE = 20
16 |
17 |
18 | class ProgressBar(JupyterMixin):
19 | """Renders a (progress) bar. Used by rich.progress.
20 |
21 | Args:
22 | total (float, optional): Number of steps in the bar. Defaults to 100. Set to None to render a pulsing animation.
23 | completed (float, optional): Number of steps completed. Defaults to 0.
24 | width (int, optional): Width of the bar, or ``None`` for maximum width. Defaults to None.
25 | pulse (bool, optional): Enable pulse effect. Defaults to False. Will pulse if a None total was passed.
26 | style (StyleType, optional): Style for the bar background. Defaults to "bar.back".
27 | complete_style (StyleType, optional): Style for the completed bar. Defaults to "bar.complete".
28 | finished_style (StyleType, optional): Style for a finished bar. Defaults to "bar.finished".
29 | pulse_style (StyleType, optional): Style for pulsing bars. Defaults to "bar.pulse".
30 | animation_time (Optional[float], optional): Time in seconds to use for animation, or None to use system time.
31 | """
32 |
33 | def __init__(
34 | self,
35 | total: Optional[float] = 100.0,
36 | completed: float = 0,
37 | width: Optional[int] = None,
38 | pulse: bool = False,
39 | style: StyleType = "bar.back",
40 | complete_style: StyleType = "bar.complete",
41 | finished_style: StyleType = "bar.finished",
42 | pulse_style: StyleType = "bar.pulse",
43 | animation_time: Optional[float] = None,
44 | ):
45 | self.total = total
46 | self.completed = completed
47 | self.width = width
48 | self.pulse = pulse
49 | self.style = style
50 | self.complete_style = complete_style
51 | self.finished_style = finished_style
52 | self.pulse_style = pulse_style
53 | self.animation_time = animation_time
54 |
55 | self._pulse_segments: Optional[List[Segment]] = None
56 |
57 | def __repr__(self) -> str:
58 | return f"<Bar {self.completed!r} of {self.total!r}>"
59 |
60 | @property
61 | def percentage_completed(self) -> Optional[float]:
62 | """Calculate percentage complete."""
63 | if self.total is None:
64 | return None
65 | completed = (self.completed / self.total) * 100.0
66 | completed = min(100, max(0.0, completed))
67 | return completed
68 |
69 | @lru_cache(maxsize=16)
70 | def _get_pulse_segments(
71 | self,
72 | fore_style: Style,
73 | back_style: Style,
74 | color_system: str,
75 | no_color: bool,
76 | ascii: bool = False,
77 | ) -> List[Segment]:
78 | """Get a list of segments to render a pulse animation.
79 |
80 | Returns:
81 | List[Segment]: A list of segments, one segment per character.
82 | """
83 | bar = "-" if ascii else "━"
84 | segments: List[Segment] = []
85 | if color_system not in ("standard", "eight_bit", "truecolor") or no_color:
86 | segments += [Segment(bar, fore_style)] * (PULSE_SIZE // 2)
87 | segments += [Segment(" " if no_color else bar, back_style)] * (
88 | PULSE_SIZE - (PULSE_SIZE // 2)
89 | )
90 | return segments
91 |
92 | append = segments.append
93 | fore_color = (
94 | fore_style.color.get_truecolor()
95 | if fore_style.color
96 | else ColorTriplet(255, 0, 255)
97 | )
98 | back_color = (
99 | back_style.color.get_truecolor()
100 | if back_style.color
101 | else ColorTriplet(0, 0, 0)
102 | )
103 | cos = math.cos
104 | pi = math.pi
105 | _Segment = Segment
106 | _Style = Style
107 | from_triplet = Color.from_triplet
108 |
109 | for index in range(PULSE_SIZE):
110 | position = index / PULSE_SIZE
111 | fade = 0.5 + cos((position * pi * 2)) / 2.0
112 | color = blend_rgb(fore_color, back_color, cross_fade=fade)
113 | append(_Segment(bar, _Style(color=from_triplet(color))))
114 | return segments
115 |
116 | def update(self, completed: float, total: Optional[float] = None) -> None:
117 | """Update progress with new values.
118 |
119 | Args:
120 | completed (float): Number of steps completed.
121 | total (float, optional): Total number of steps, or ``None`` to not change. Defaults to None.
122 | """
123 | self.completed = completed
124 | self.total = total if total is not None else self.total
125 |
126 | def _render_pulse(
127 | self, console: Console, width: int, ascii: bool = False
128 | ) -> Iterable[Segment]:
129 | """Renders the pulse animation.
130 |
131 | Args:
132 | console (Console): Console instance.
133 | width (int): Width in characters of pulse animation.
134 |
135 | Returns:
136 | RenderResult: [description]
137 |
138 | Yields:
139 | Iterator[Segment]: Segments to render pulse
140 | """
141 | fore_style = console.get_style(self.pulse_style, default="white")
142 | back_style = console.get_style(self.style, default="black")
143 |
144 | pulse_segments = self._get_pulse_segments(
145 | fore_style, back_style, console.color_system, console.no_color, ascii=ascii
146 | )
147 | segment_count = len(pulse_segments)
148 | current_time = (
149 | monotonic() if self.animation_time is None else self.animation_time
150 | )
151 | segments = pulse_segments * (int(width / segment_count) + 2)
152 | offset = int(-current_time * 15) % segment_count
153 | segments = segments[offset : offset + width]
154 | yield from segments
155 |
156 | def __rich_console__(
157 | self, console: Console, options: ConsoleOptions
158 | ) -> RenderResult:
159 | width = min(self.width or options.max_width, options.max_width)
160 | ascii = options.legacy_windows or options.ascii_only
161 | should_pulse = self.pulse or self.total is None
162 | if should_pulse:
163 | yield from self._render_pulse(console, width, ascii=ascii)
164 | return
165 |
166 | completed: Optional[float] = (
167 | min(self.total, max(0, self.completed)) if self.total is not None else None
168 | )
169 |
170 | bar = "-" if ascii else "━"
171 | half_bar_right = " " if ascii else "╸"
172 | half_bar_left = " " if ascii else "╺"
173 | complete_halves = (
174 | int(width * 2 * completed / self.total)
175 | if self.total and completed is not None
176 | else width * 2
177 | )
178 | bar_count = complete_halves // 2
179 | half_bar_count = complete_halves % 2
180 | style = console.get_style(self.style)
181 | is_finished = self.total is None or self.completed >= self.total
182 | complete_style = console.get_style(
183 | self.finished_style if is_finished else self.complete_style
184 | )
185 | _Segment = Segment
186 | if bar_count:
187 | yield _Segment(bar * bar_count, complete_style)
188 | if half_bar_count:
189 | yield _Segment(half_bar_right * half_bar_count, complete_style)
190 |
191 | if not console.no_color:
192 | remaining_bars = width - bar_count - half_bar_count
193 | if remaining_bars and console.color_system is not None:
194 | if not half_bar_count and bar_count:
195 | yield _Segment(half_bar_left, style)
196 | remaining_bars -= 1
197 | if remaining_bars:
198 | yield _Segment(bar * remaining_bars, style)
199 |
200 | def __rich_measure__(
201 | self, console: Console, options: ConsoleOptions
202 | ) -> Measurement:
203 | return (
204 | Measurement(self.width, self.width)
205 | if self.width is not None
206 | else Measurement(4, options.max_width)
207 | )
208 |
209 |
210 | if __name__ == "__main__": # pragma: no cover
211 | console = Console()
212 | bar = ProgressBar(width=50, total=100)
213 |
214 | import time
215 |
216 | console.show_cursor(False)
217 | for n in range(0, 101, 1):
218 | bar.update(n)
219 | console.print(bar)
220 | console.file.write("\r")
221 | time.sleep(0.05)
222 | console.show_cursor(True)
223 | console.print()
224 |
```
--------------------------------------------------------------------------------
/.venv/lib/python3.12/site-packages/pip/_vendor/urllib3/exceptions.py:
--------------------------------------------------------------------------------
```python
1 | from __future__ import absolute_import
2 |
3 | from .packages.six.moves.http_client import IncompleteRead as httplib_IncompleteRead
4 |
5 | # Base Exceptions
6 |
7 |
8 | class HTTPError(Exception):
9 | """Base exception used by this module."""
10 |
11 | pass
12 |
13 |
14 | class HTTPWarning(Warning):
15 | """Base warning used by this module."""
16 |
17 | pass
18 |
19 |
20 | class PoolError(HTTPError):
21 | """Base exception for errors caused within a pool."""
22 |
23 | def __init__(self, pool, message):
24 | self.pool = pool
25 | HTTPError.__init__(self, "%s: %s" % (pool, message))
26 |
27 | def __reduce__(self):
28 | # For pickling purposes.
29 | return self.__class__, (None, None)
30 |
31 |
32 | class RequestError(PoolError):
33 | """Base exception for PoolErrors that have associated URLs."""
34 |
35 | def __init__(self, pool, url, message):
36 | self.url = url
37 | PoolError.__init__(self, pool, message)
38 |
39 | def __reduce__(self):
40 | # For pickling purposes.
41 | return self.__class__, (None, self.url, None)
42 |
43 |
44 | class SSLError(HTTPError):
45 | """Raised when SSL certificate fails in an HTTPS connection."""
46 |
47 | pass
48 |
49 |
50 | class ProxyError(HTTPError):
51 | """Raised when the connection to a proxy fails."""
52 |
53 | def __init__(self, message, error, *args):
54 | super(ProxyError, self).__init__(message, error, *args)
55 | self.original_error = error
56 |
57 |
58 | class DecodeError(HTTPError):
59 | """Raised when automatic decoding based on Content-Type fails."""
60 |
61 | pass
62 |
63 |
64 | class ProtocolError(HTTPError):
65 | """Raised when something unexpected happens mid-request/response."""
66 |
67 | pass
68 |
69 |
70 | #: Renamed to ProtocolError but aliased for backwards compatibility.
71 | ConnectionError = ProtocolError
72 |
73 |
74 | # Leaf Exceptions
75 |
76 |
77 | class MaxRetryError(RequestError):
78 | """Raised when the maximum number of retries is exceeded.
79 |
80 | :param pool: The connection pool
81 | :type pool: :class:`~urllib3.connectionpool.HTTPConnectionPool`
82 | :param string url: The requested Url
83 | :param exceptions.Exception reason: The underlying error
84 |
85 | """
86 |
87 | def __init__(self, pool, url, reason=None):
88 | self.reason = reason
89 |
90 | message = "Max retries exceeded with url: %s (Caused by %r)" % (url, reason)
91 |
92 | RequestError.__init__(self, pool, url, message)
93 |
94 |
95 | class HostChangedError(RequestError):
96 | """Raised when an existing pool gets a request for a foreign host."""
97 |
98 | def __init__(self, pool, url, retries=3):
99 | message = "Tried to open a foreign host with url: %s" % url
100 | RequestError.__init__(self, pool, url, message)
101 | self.retries = retries
102 |
103 |
104 | class TimeoutStateError(HTTPError):
105 | """Raised when passing an invalid state to a timeout"""
106 |
107 | pass
108 |
109 |
110 | class TimeoutError(HTTPError):
111 | """Raised when a socket timeout error occurs.
112 |
113 | Catching this error will catch both :exc:`ReadTimeoutErrors
114 | <ReadTimeoutError>` and :exc:`ConnectTimeoutErrors <ConnectTimeoutError>`.
115 | """
116 |
117 | pass
118 |
119 |
120 | class ReadTimeoutError(TimeoutError, RequestError):
121 | """Raised when a socket timeout occurs while receiving data from a server"""
122 |
123 | pass
124 |
125 |
126 | # This timeout error does not have a URL attached and needs to inherit from the
127 | # base HTTPError
128 | class ConnectTimeoutError(TimeoutError):
129 | """Raised when a socket timeout occurs while connecting to a server"""
130 |
131 | pass
132 |
133 |
134 | class NewConnectionError(ConnectTimeoutError, PoolError):
135 | """Raised when we fail to establish a new connection. Usually ECONNREFUSED."""
136 |
137 | pass
138 |
139 |
140 | class EmptyPoolError(PoolError):
141 | """Raised when a pool runs out of connections and no more are allowed."""
142 |
143 | pass
144 |
145 |
146 | class ClosedPoolError(PoolError):
147 | """Raised when a request enters a pool after the pool has been closed."""
148 |
149 | pass
150 |
151 |
152 | class LocationValueError(ValueError, HTTPError):
153 | """Raised when there is something wrong with a given URL input."""
154 |
155 | pass
156 |
157 |
158 | class LocationParseError(LocationValueError):
159 | """Raised when get_host or similar fails to parse the URL input."""
160 |
161 | def __init__(self, location):
162 | message = "Failed to parse: %s" % location
163 | HTTPError.__init__(self, message)
164 |
165 | self.location = location
166 |
167 |
168 | class URLSchemeUnknown(LocationValueError):
169 | """Raised when a URL input has an unsupported scheme."""
170 |
171 | def __init__(self, scheme):
172 | message = "Not supported URL scheme %s" % scheme
173 | super(URLSchemeUnknown, self).__init__(message)
174 |
175 | self.scheme = scheme
176 |
177 |
178 | class ResponseError(HTTPError):
179 | """Used as a container for an error reason supplied in a MaxRetryError."""
180 |
181 | GENERIC_ERROR = "too many error responses"
182 | SPECIFIC_ERROR = "too many {status_code} error responses"
183 |
184 |
185 | class SecurityWarning(HTTPWarning):
186 | """Warned when performing security reducing actions"""
187 |
188 | pass
189 |
190 |
191 | class SubjectAltNameWarning(SecurityWarning):
192 | """Warned when connecting to a host with a certificate missing a SAN."""
193 |
194 | pass
195 |
196 |
197 | class InsecureRequestWarning(SecurityWarning):
198 | """Warned when making an unverified HTTPS request."""
199 |
200 | pass
201 |
202 |
203 | class SystemTimeWarning(SecurityWarning):
204 | """Warned when system time is suspected to be wrong"""
205 |
206 | pass
207 |
208 |
209 | class InsecurePlatformWarning(SecurityWarning):
210 | """Warned when certain TLS/SSL configuration is not available on a platform."""
211 |
212 | pass
213 |
214 |
215 | class SNIMissingWarning(HTTPWarning):
216 | """Warned when making a HTTPS request without SNI available."""
217 |
218 | pass
219 |
220 |
221 | class DependencyWarning(HTTPWarning):
222 | """
223 | Warned when an attempt is made to import a module with missing optional
224 | dependencies.
225 | """
226 |
227 | pass
228 |
229 |
230 | class ResponseNotChunked(ProtocolError, ValueError):
231 | """Response needs to be chunked in order to read it as chunks."""
232 |
233 | pass
234 |
235 |
236 | class BodyNotHttplibCompatible(HTTPError):
237 | """
238 | Body should be :class:`http.client.HTTPResponse` like
239 | (have an fp attribute which returns raw chunks) for read_chunked().
240 | """
241 |
242 | pass
243 |
244 |
245 | class IncompleteRead(HTTPError, httplib_IncompleteRead):
246 | """
247 | Response length doesn't match expected Content-Length
248 |
249 | Subclass of :class:`http.client.IncompleteRead` to allow int value
250 | for ``partial`` to avoid creating large objects on streamed reads.
251 | """
252 |
253 | def __init__(self, partial, expected):
254 | super(IncompleteRead, self).__init__(partial, expected)
255 |
256 | def __repr__(self):
257 | return "IncompleteRead(%i bytes read, %i more expected)" % (
258 | self.partial,
259 | self.expected,
260 | )
261 |
262 |
263 | class InvalidChunkLength(HTTPError, httplib_IncompleteRead):
264 | """Invalid chunk length in a chunked response."""
265 |
266 | def __init__(self, response, length):
267 | super(InvalidChunkLength, self).__init__(
268 | response.tell(), response.length_remaining
269 | )
270 | self.response = response
271 | self.length = length
272 |
273 | def __repr__(self):
274 | return "InvalidChunkLength(got length %r, %i bytes read)" % (
275 | self.length,
276 | self.partial,
277 | )
278 |
279 |
280 | class InvalidHeader(HTTPError):
281 | """The header provided was somehow invalid."""
282 |
283 | pass
284 |
285 |
286 | class ProxySchemeUnknown(AssertionError, URLSchemeUnknown):
287 | """ProxyManager does not support the supplied scheme"""
288 |
289 | # TODO(t-8ch): Stop inheriting from AssertionError in v2.0.
290 |
291 | def __init__(self, scheme):
292 | # 'localhost' is here because our URL parser parses
293 | # localhost:8080 -> scheme=localhost, remove if we fix this.
294 | if scheme == "localhost":
295 | scheme = None
296 | if scheme is None:
297 | message = "Proxy URL had no scheme, should start with http:// or https://"
298 | else:
299 | message = (
300 | "Proxy URL had unsupported scheme %s, should use http:// or https://"
301 | % scheme
302 | )
303 | super(ProxySchemeUnknown, self).__init__(message)
304 |
305 |
306 | class ProxySchemeUnsupported(ValueError):
307 | """Fetching HTTPS resources through HTTPS proxies is unsupported"""
308 |
309 | pass
310 |
311 |
312 | class HeaderParsingError(HTTPError):
313 | """Raised by assert_header_parsing, but we convert it to a log.warning statement."""
314 |
315 | def __init__(self, defects, unparsed_data):
316 | message = "%s, unparsed data: %r" % (defects or "Unknown", unparsed_data)
317 | super(HeaderParsingError, self).__init__(message)
318 |
319 |
320 | class UnrewindableBodyError(HTTPError):
321 | """urllib3 encountered an error when trying to rewind a body"""
322 |
323 | pass
324 |
```
--------------------------------------------------------------------------------
/.venv/lib/python3.12/site-packages/pip/_internal/cli/base_command.py:
--------------------------------------------------------------------------------
```python
1 | """Base Command class, and related routines"""
2 |
3 | import logging
4 | import logging.config
5 | import optparse
6 | import os
7 | import sys
8 | import traceback
9 | from optparse import Values
10 | from typing import List, Optional, Tuple
11 |
12 | from pip._vendor.rich import reconfigure
13 | from pip._vendor.rich import traceback as rich_traceback
14 |
15 | from pip._internal.cli import cmdoptions
16 | from pip._internal.cli.command_context import CommandContextMixIn
17 | from pip._internal.cli.parser import ConfigOptionParser, UpdatingDefaultsHelpFormatter
18 | from pip._internal.cli.status_codes import (
19 | ERROR,
20 | PREVIOUS_BUILD_DIR_ERROR,
21 | UNKNOWN_ERROR,
22 | VIRTUALENV_NOT_FOUND,
23 | )
24 | from pip._internal.exceptions import (
25 | BadCommand,
26 | CommandError,
27 | DiagnosticPipError,
28 | InstallationError,
29 | NetworkConnectionError,
30 | PreviousBuildDirError,
31 | )
32 | from pip._internal.utils.filesystem import check_path_owner
33 | from pip._internal.utils.logging import BrokenStdoutLoggingError, setup_logging
34 | from pip._internal.utils.misc import get_prog, normalize_path
35 | from pip._internal.utils.temp_dir import TempDirectoryTypeRegistry as TempDirRegistry
36 | from pip._internal.utils.temp_dir import global_tempdir_manager, tempdir_registry
37 | from pip._internal.utils.virtualenv import running_under_virtualenv
38 |
39 | __all__ = ["Command"]
40 |
41 | logger = logging.getLogger(__name__)
42 |
43 |
44 | class Command(CommandContextMixIn):
45 | usage: str = ""
46 | ignore_require_venv: bool = False
47 |
48 | def __init__(self, name: str, summary: str, isolated: bool = False) -> None:
49 | super().__init__()
50 |
51 | self.name = name
52 | self.summary = summary
53 | self.parser = ConfigOptionParser(
54 | usage=self.usage,
55 | prog=f"{get_prog()} {name}",
56 | formatter=UpdatingDefaultsHelpFormatter(),
57 | add_help_option=False,
58 | name=name,
59 | description=self.__doc__,
60 | isolated=isolated,
61 | )
62 |
63 | self.tempdir_registry: Optional[TempDirRegistry] = None
64 |
65 | # Commands should add options to this option group
66 | optgroup_name = f"{self.name.capitalize()} Options"
67 | self.cmd_opts = optparse.OptionGroup(self.parser, optgroup_name)
68 |
69 | # Add the general options
70 | gen_opts = cmdoptions.make_option_group(
71 | cmdoptions.general_group,
72 | self.parser,
73 | )
74 | self.parser.add_option_group(gen_opts)
75 |
76 | self.add_options()
77 |
78 | def add_options(self) -> None:
79 | pass
80 |
81 | def handle_pip_version_check(self, options: Values) -> None:
82 | """
83 | This is a no-op so that commands by default do not do the pip version
84 | check.
85 | """
86 | # Make sure we do the pip version check if the index_group options
87 | # are present.
88 | assert not hasattr(options, "no_index")
89 |
90 | def run(self, options: Values, args: List[str]) -> int:
91 | raise NotImplementedError
92 |
93 | def _run_wrapper(self, level_number: int, options: Values, args: List[str]) -> int:
94 | def _inner_run() -> int:
95 | try:
96 | return self.run(options, args)
97 | finally:
98 | self.handle_pip_version_check(options)
99 |
100 | if options.debug_mode:
101 | rich_traceback.install(show_locals=True)
102 | return _inner_run()
103 |
104 | try:
105 | status = _inner_run()
106 | assert isinstance(status, int)
107 | return status
108 | except DiagnosticPipError as exc:
109 | logger.error("%s", exc, extra={"rich": True})
110 | logger.debug("Exception information:", exc_info=True)
111 |
112 | return ERROR
113 | except PreviousBuildDirError as exc:
114 | logger.critical(str(exc))
115 | logger.debug("Exception information:", exc_info=True)
116 |
117 | return PREVIOUS_BUILD_DIR_ERROR
118 | except (
119 | InstallationError,
120 | BadCommand,
121 | NetworkConnectionError,
122 | ) as exc:
123 | logger.critical(str(exc))
124 | logger.debug("Exception information:", exc_info=True)
125 |
126 | return ERROR
127 | except CommandError as exc:
128 | logger.critical("%s", exc)
129 | logger.debug("Exception information:", exc_info=True)
130 |
131 | return ERROR
132 | except BrokenStdoutLoggingError:
133 | # Bypass our logger and write any remaining messages to
134 | # stderr because stdout no longer works.
135 | print("ERROR: Pipe to stdout was broken", file=sys.stderr)
136 | if level_number <= logging.DEBUG:
137 | traceback.print_exc(file=sys.stderr)
138 |
139 | return ERROR
140 | except KeyboardInterrupt:
141 | logger.critical("Operation cancelled by user")
142 | logger.debug("Exception information:", exc_info=True)
143 |
144 | return ERROR
145 | except BaseException:
146 | logger.critical("Exception:", exc_info=True)
147 |
148 | return UNKNOWN_ERROR
149 |
150 | def parse_args(self, args: List[str]) -> Tuple[Values, List[str]]:
151 | # factored out for testability
152 | return self.parser.parse_args(args)
153 |
154 | def main(self, args: List[str]) -> int:
155 | try:
156 | with self.main_context():
157 | return self._main(args)
158 | finally:
159 | logging.shutdown()
160 |
161 | def _main(self, args: List[str]) -> int:
162 | # We must initialize this before the tempdir manager, otherwise the
163 | # configuration would not be accessible by the time we clean up the
164 | # tempdir manager.
165 | self.tempdir_registry = self.enter_context(tempdir_registry())
166 | # Intentionally set as early as possible so globally-managed temporary
167 | # directories are available to the rest of the code.
168 | self.enter_context(global_tempdir_manager())
169 |
170 | options, args = self.parse_args(args)
171 |
172 | # Set verbosity so that it can be used elsewhere.
173 | self.verbosity = options.verbose - options.quiet
174 |
175 | reconfigure(no_color=options.no_color)
176 | level_number = setup_logging(
177 | verbosity=self.verbosity,
178 | no_color=options.no_color,
179 | user_log_file=options.log,
180 | )
181 |
182 | always_enabled_features = set(options.features_enabled) & set(
183 | cmdoptions.ALWAYS_ENABLED_FEATURES
184 | )
185 | if always_enabled_features:
186 | logger.warning(
187 | "The following features are always enabled: %s. ",
188 | ", ".join(sorted(always_enabled_features)),
189 | )
190 |
191 | # Make sure that the --python argument isn't specified after the
192 | # subcommand. We can tell, because if --python was specified,
193 | # we should only reach this point if we're running in the created
194 | # subprocess, which has the _PIP_RUNNING_IN_SUBPROCESS environment
195 | # variable set.
196 | if options.python and "_PIP_RUNNING_IN_SUBPROCESS" not in os.environ:
197 | logger.critical(
198 | "The --python option must be placed before the pip subcommand name"
199 | )
200 | sys.exit(ERROR)
201 |
202 | # TODO: Try to get these passing down from the command?
203 | # without resorting to os.environ to hold these.
204 | # This also affects isolated builds and it should.
205 |
206 | if options.no_input:
207 | os.environ["PIP_NO_INPUT"] = "1"
208 |
209 | if options.exists_action:
210 | os.environ["PIP_EXISTS_ACTION"] = " ".join(options.exists_action)
211 |
212 | if options.require_venv and not self.ignore_require_venv:
213 | # If a venv is required check if it can really be found
214 | if not running_under_virtualenv():
215 | logger.critical("Could not find an activated virtualenv (required).")
216 | sys.exit(VIRTUALENV_NOT_FOUND)
217 |
218 | if options.cache_dir:
219 | options.cache_dir = normalize_path(options.cache_dir)
220 | if not check_path_owner(options.cache_dir):
221 | logger.warning(
222 | "The directory '%s' or its parent directory is not owned "
223 | "or is not writable by the current user. The cache "
224 | "has been disabled. Check the permissions and owner of "
225 | "that directory. If executing pip with sudo, you should "
226 | "use sudo's -H flag.",
227 | options.cache_dir,
228 | )
229 | options.cache_dir = None
230 |
231 | return self._run_wrapper(level_number, options, args)
232 |
```