This is page 32 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/click/exceptions.py:
--------------------------------------------------------------------------------
```python
1 | import typing as t
2 | from gettext import gettext as _
3 | from gettext import ngettext
4 |
5 | from ._compat import get_text_stderr
6 | from .utils import echo
7 | from .utils import format_filename
8 |
9 | if t.TYPE_CHECKING:
10 | from .core import Command
11 | from .core import Context
12 | from .core import Parameter
13 |
14 |
15 | def _join_param_hints(
16 | param_hint: t.Optional[t.Union[t.Sequence[str], str]]
17 | ) -> t.Optional[str]:
18 | if param_hint is not None and not isinstance(param_hint, str):
19 | return " / ".join(repr(x) for x in param_hint)
20 |
21 | return param_hint
22 |
23 |
24 | class ClickException(Exception):
25 | """An exception that Click can handle and show to the user."""
26 |
27 | #: The exit code for this exception.
28 | exit_code = 1
29 |
30 | def __init__(self, message: str) -> None:
31 | super().__init__(message)
32 | self.message = message
33 |
34 | def format_message(self) -> str:
35 | return self.message
36 |
37 | def __str__(self) -> str:
38 | return self.message
39 |
40 | def show(self, file: t.Optional[t.IO[t.Any]] = None) -> None:
41 | if file is None:
42 | file = get_text_stderr()
43 |
44 | echo(_("Error: {message}").format(message=self.format_message()), file=file)
45 |
46 |
47 | class UsageError(ClickException):
48 | """An internal exception that signals a usage error. This typically
49 | aborts any further handling.
50 |
51 | :param message: the error message to display.
52 | :param ctx: optionally the context that caused this error. Click will
53 | fill in the context automatically in some situations.
54 | """
55 |
56 | exit_code = 2
57 |
58 | def __init__(self, message: str, ctx: t.Optional["Context"] = None) -> None:
59 | super().__init__(message)
60 | self.ctx = ctx
61 | self.cmd: t.Optional["Command"] = self.ctx.command if self.ctx else None
62 |
63 | def show(self, file: t.Optional[t.IO[t.Any]] = None) -> None:
64 | if file is None:
65 | file = get_text_stderr()
66 | color = None
67 | hint = ""
68 | if (
69 | self.ctx is not None
70 | and self.ctx.command.get_help_option(self.ctx) is not None
71 | ):
72 | hint = _("Try '{command} {option}' for help.").format(
73 | command=self.ctx.command_path, option=self.ctx.help_option_names[0]
74 | )
75 | hint = f"{hint}\n"
76 | if self.ctx is not None:
77 | color = self.ctx.color
78 | echo(f"{self.ctx.get_usage()}\n{hint}", file=file, color=color)
79 | echo(
80 | _("Error: {message}").format(message=self.format_message()),
81 | file=file,
82 | color=color,
83 | )
84 |
85 |
86 | class BadParameter(UsageError):
87 | """An exception that formats out a standardized error message for a
88 | bad parameter. This is useful when thrown from a callback or type as
89 | Click will attach contextual information to it (for instance, which
90 | parameter it is).
91 |
92 | .. versionadded:: 2.0
93 |
94 | :param param: the parameter object that caused this error. This can
95 | be left out, and Click will attach this info itself
96 | if possible.
97 | :param param_hint: a string that shows up as parameter name. This
98 | can be used as alternative to `param` in cases
99 | where custom validation should happen. If it is
100 | a string it's used as such, if it's a list then
101 | each item is quoted and separated.
102 | """
103 |
104 | def __init__(
105 | self,
106 | message: str,
107 | ctx: t.Optional["Context"] = None,
108 | param: t.Optional["Parameter"] = None,
109 | param_hint: t.Optional[str] = None,
110 | ) -> None:
111 | super().__init__(message, ctx)
112 | self.param = param
113 | self.param_hint = param_hint
114 |
115 | def format_message(self) -> str:
116 | if self.param_hint is not None:
117 | param_hint = self.param_hint
118 | elif self.param is not None:
119 | param_hint = self.param.get_error_hint(self.ctx) # type: ignore
120 | else:
121 | return _("Invalid value: {message}").format(message=self.message)
122 |
123 | return _("Invalid value for {param_hint}: {message}").format(
124 | param_hint=_join_param_hints(param_hint), message=self.message
125 | )
126 |
127 |
128 | class MissingParameter(BadParameter):
129 | """Raised if click required an option or argument but it was not
130 | provided when invoking the script.
131 |
132 | .. versionadded:: 4.0
133 |
134 | :param param_type: a string that indicates the type of the parameter.
135 | The default is to inherit the parameter type from
136 | the given `param`. Valid values are ``'parameter'``,
137 | ``'option'`` or ``'argument'``.
138 | """
139 |
140 | def __init__(
141 | self,
142 | message: t.Optional[str] = None,
143 | ctx: t.Optional["Context"] = None,
144 | param: t.Optional["Parameter"] = None,
145 | param_hint: t.Optional[str] = None,
146 | param_type: t.Optional[str] = None,
147 | ) -> None:
148 | super().__init__(message or "", ctx, param, param_hint)
149 | self.param_type = param_type
150 |
151 | def format_message(self) -> str:
152 | if self.param_hint is not None:
153 | param_hint: t.Optional[str] = self.param_hint
154 | elif self.param is not None:
155 | param_hint = self.param.get_error_hint(self.ctx) # type: ignore
156 | else:
157 | param_hint = None
158 |
159 | param_hint = _join_param_hints(param_hint)
160 | param_hint = f" {param_hint}" if param_hint else ""
161 |
162 | param_type = self.param_type
163 | if param_type is None and self.param is not None:
164 | param_type = self.param.param_type_name
165 |
166 | msg = self.message
167 | if self.param is not None:
168 | msg_extra = self.param.type.get_missing_message(self.param)
169 | if msg_extra:
170 | if msg:
171 | msg += f". {msg_extra}"
172 | else:
173 | msg = msg_extra
174 |
175 | msg = f" {msg}" if msg else ""
176 |
177 | # Translate param_type for known types.
178 | if param_type == "argument":
179 | missing = _("Missing argument")
180 | elif param_type == "option":
181 | missing = _("Missing option")
182 | elif param_type == "parameter":
183 | missing = _("Missing parameter")
184 | else:
185 | missing = _("Missing {param_type}").format(param_type=param_type)
186 |
187 | return f"{missing}{param_hint}.{msg}"
188 |
189 | def __str__(self) -> str:
190 | if not self.message:
191 | param_name = self.param.name if self.param else None
192 | return _("Missing parameter: {param_name}").format(param_name=param_name)
193 | else:
194 | return self.message
195 |
196 |
197 | class NoSuchOption(UsageError):
198 | """Raised if click attempted to handle an option that does not
199 | exist.
200 |
201 | .. versionadded:: 4.0
202 | """
203 |
204 | def __init__(
205 | self,
206 | option_name: str,
207 | message: t.Optional[str] = None,
208 | possibilities: t.Optional[t.Sequence[str]] = None,
209 | ctx: t.Optional["Context"] = None,
210 | ) -> None:
211 | if message is None:
212 | message = _("No such option: {name}").format(name=option_name)
213 |
214 | super().__init__(message, ctx)
215 | self.option_name = option_name
216 | self.possibilities = possibilities
217 |
218 | def format_message(self) -> str:
219 | if not self.possibilities:
220 | return self.message
221 |
222 | possibility_str = ", ".join(sorted(self.possibilities))
223 | suggest = ngettext(
224 | "Did you mean {possibility}?",
225 | "(Possible options: {possibilities})",
226 | len(self.possibilities),
227 | ).format(possibility=possibility_str, possibilities=possibility_str)
228 | return f"{self.message} {suggest}"
229 |
230 |
231 | class BadOptionUsage(UsageError):
232 | """Raised if an option is generally supplied but the use of the option
233 | was incorrect. This is for instance raised if the number of arguments
234 | for an option is not correct.
235 |
236 | .. versionadded:: 4.0
237 |
238 | :param option_name: the name of the option being used incorrectly.
239 | """
240 |
241 | def __init__(
242 | self, option_name: str, message: str, ctx: t.Optional["Context"] = None
243 | ) -> None:
244 | super().__init__(message, ctx)
245 | self.option_name = option_name
246 |
247 |
248 | class BadArgumentUsage(UsageError):
249 | """Raised if an argument is generally supplied but the use of the argument
250 | was incorrect. This is for instance raised if the number of values
251 | for an argument is not correct.
252 |
253 | .. versionadded:: 6.0
254 | """
255 |
256 |
257 | class FileError(ClickException):
258 | """Raised if a file cannot be opened."""
259 |
260 | def __init__(self, filename: str, hint: t.Optional[str] = None) -> None:
261 | if hint is None:
262 | hint = _("unknown error")
263 |
264 | super().__init__(hint)
265 | self.ui_filename: str = format_filename(filename)
266 | self.filename = filename
267 |
268 | def format_message(self) -> str:
269 | return _("Could not open file {filename!r}: {message}").format(
270 | filename=self.ui_filename, message=self.message
271 | )
272 |
273 |
274 | class Abort(RuntimeError):
275 | """An internal signalling exception that signals Click to abort."""
276 |
277 |
278 | class Exit(RuntimeError):
279 | """An exception that indicates that the application should exit with some
280 | status code.
281 |
282 | :param code: the status code to exit with.
283 | """
284 |
285 | __slots__ = ("exit_code",)
286 |
287 | def __init__(self, code: int = 0) -> None:
288 | self.exit_code: int = code
289 |
```
--------------------------------------------------------------------------------
/.venv/lib/python3.12/site-packages/flask/json/tag.py:
--------------------------------------------------------------------------------
```python
1 | """
2 | Tagged JSON
3 | ~~~~~~~~~~~
4 |
5 | A compact representation for lossless serialization of non-standard JSON
6 | types. :class:`~flask.sessions.SecureCookieSessionInterface` uses this
7 | to serialize the session data, but it may be useful in other places. It
8 | can be extended to support other types.
9 |
10 | .. autoclass:: TaggedJSONSerializer
11 | :members:
12 |
13 | .. autoclass:: JSONTag
14 | :members:
15 |
16 | Let's see an example that adds support for
17 | :class:`~collections.OrderedDict`. Dicts don't have an order in JSON, so
18 | to handle this we will dump the items as a list of ``[key, value]``
19 | pairs. Subclass :class:`JSONTag` and give it the new key ``' od'`` to
20 | identify the type. The session serializer processes dicts first, so
21 | insert the new tag at the front of the order since ``OrderedDict`` must
22 | be processed before ``dict``.
23 |
24 | .. code-block:: python
25 |
26 | from flask.json.tag import JSONTag
27 |
28 | class TagOrderedDict(JSONTag):
29 | __slots__ = ('serializer',)
30 | key = ' od'
31 |
32 | def check(self, value):
33 | return isinstance(value, OrderedDict)
34 |
35 | def to_json(self, value):
36 | return [[k, self.serializer.tag(v)] for k, v in iteritems(value)]
37 |
38 | def to_python(self, value):
39 | return OrderedDict(value)
40 |
41 | app.session_interface.serializer.register(TagOrderedDict, index=0)
42 | """
43 |
44 | from __future__ import annotations
45 |
46 | import typing as t
47 | from base64 import b64decode
48 | from base64 import b64encode
49 | from datetime import datetime
50 | from uuid import UUID
51 |
52 | from markupsafe import Markup
53 | from werkzeug.http import http_date
54 | from werkzeug.http import parse_date
55 |
56 | from ..json import dumps
57 | from ..json import loads
58 |
59 |
60 | class JSONTag:
61 | """Base class for defining type tags for :class:`TaggedJSONSerializer`."""
62 |
63 | __slots__ = ("serializer",)
64 |
65 | #: The tag to mark the serialized object with. If empty, this tag is
66 | #: only used as an intermediate step during tagging.
67 | key: str = ""
68 |
69 | def __init__(self, serializer: TaggedJSONSerializer) -> None:
70 | """Create a tagger for the given serializer."""
71 | self.serializer = serializer
72 |
73 | def check(self, value: t.Any) -> bool:
74 | """Check if the given value should be tagged by this tag."""
75 | raise NotImplementedError
76 |
77 | def to_json(self, value: t.Any) -> t.Any:
78 | """Convert the Python object to an object that is a valid JSON type.
79 | The tag will be added later."""
80 | raise NotImplementedError
81 |
82 | def to_python(self, value: t.Any) -> t.Any:
83 | """Convert the JSON representation back to the correct type. The tag
84 | will already be removed."""
85 | raise NotImplementedError
86 |
87 | def tag(self, value: t.Any) -> dict[str, t.Any]:
88 | """Convert the value to a valid JSON type and add the tag structure
89 | around it."""
90 | return {self.key: self.to_json(value)}
91 |
92 |
93 | class TagDict(JSONTag):
94 | """Tag for 1-item dicts whose only key matches a registered tag.
95 |
96 | Internally, the dict key is suffixed with `__`, and the suffix is removed
97 | when deserializing.
98 | """
99 |
100 | __slots__ = ()
101 | key = " di"
102 |
103 | def check(self, value: t.Any) -> bool:
104 | return (
105 | isinstance(value, dict)
106 | and len(value) == 1
107 | and next(iter(value)) in self.serializer.tags
108 | )
109 |
110 | def to_json(self, value: t.Any) -> t.Any:
111 | key = next(iter(value))
112 | return {f"{key}__": self.serializer.tag(value[key])}
113 |
114 | def to_python(self, value: t.Any) -> t.Any:
115 | key = next(iter(value))
116 | return {key[:-2]: value[key]}
117 |
118 |
119 | class PassDict(JSONTag):
120 | __slots__ = ()
121 |
122 | def check(self, value: t.Any) -> bool:
123 | return isinstance(value, dict)
124 |
125 | def to_json(self, value: t.Any) -> t.Any:
126 | # JSON objects may only have string keys, so don't bother tagging the
127 | # key here.
128 | return {k: self.serializer.tag(v) for k, v in value.items()}
129 |
130 | tag = to_json
131 |
132 |
133 | class TagTuple(JSONTag):
134 | __slots__ = ()
135 | key = " t"
136 |
137 | def check(self, value: t.Any) -> bool:
138 | return isinstance(value, tuple)
139 |
140 | def to_json(self, value: t.Any) -> t.Any:
141 | return [self.serializer.tag(item) for item in value]
142 |
143 | def to_python(self, value: t.Any) -> t.Any:
144 | return tuple(value)
145 |
146 |
147 | class PassList(JSONTag):
148 | __slots__ = ()
149 |
150 | def check(self, value: t.Any) -> bool:
151 | return isinstance(value, list)
152 |
153 | def to_json(self, value: t.Any) -> t.Any:
154 | return [self.serializer.tag(item) for item in value]
155 |
156 | tag = to_json
157 |
158 |
159 | class TagBytes(JSONTag):
160 | __slots__ = ()
161 | key = " b"
162 |
163 | def check(self, value: t.Any) -> bool:
164 | return isinstance(value, bytes)
165 |
166 | def to_json(self, value: t.Any) -> t.Any:
167 | return b64encode(value).decode("ascii")
168 |
169 | def to_python(self, value: t.Any) -> t.Any:
170 | return b64decode(value)
171 |
172 |
173 | class TagMarkup(JSONTag):
174 | """Serialize anything matching the :class:`~markupsafe.Markup` API by
175 | having a ``__html__`` method to the result of that method. Always
176 | deserializes to an instance of :class:`~markupsafe.Markup`."""
177 |
178 | __slots__ = ()
179 | key = " m"
180 |
181 | def check(self, value: t.Any) -> bool:
182 | return callable(getattr(value, "__html__", None))
183 |
184 | def to_json(self, value: t.Any) -> t.Any:
185 | return str(value.__html__())
186 |
187 | def to_python(self, value: t.Any) -> t.Any:
188 | return Markup(value)
189 |
190 |
191 | class TagUUID(JSONTag):
192 | __slots__ = ()
193 | key = " u"
194 |
195 | def check(self, value: t.Any) -> bool:
196 | return isinstance(value, UUID)
197 |
198 | def to_json(self, value: t.Any) -> t.Any:
199 | return value.hex
200 |
201 | def to_python(self, value: t.Any) -> t.Any:
202 | return UUID(value)
203 |
204 |
205 | class TagDateTime(JSONTag):
206 | __slots__ = ()
207 | key = " d"
208 |
209 | def check(self, value: t.Any) -> bool:
210 | return isinstance(value, datetime)
211 |
212 | def to_json(self, value: t.Any) -> t.Any:
213 | return http_date(value)
214 |
215 | def to_python(self, value: t.Any) -> t.Any:
216 | return parse_date(value)
217 |
218 |
219 | class TaggedJSONSerializer:
220 | """Serializer that uses a tag system to compactly represent objects that
221 | are not JSON types. Passed as the intermediate serializer to
222 | :class:`itsdangerous.Serializer`.
223 |
224 | The following extra types are supported:
225 |
226 | * :class:`dict`
227 | * :class:`tuple`
228 | * :class:`bytes`
229 | * :class:`~markupsafe.Markup`
230 | * :class:`~uuid.UUID`
231 | * :class:`~datetime.datetime`
232 | """
233 |
234 | __slots__ = ("tags", "order")
235 |
236 | #: Tag classes to bind when creating the serializer. Other tags can be
237 | #: added later using :meth:`~register`.
238 | default_tags = [
239 | TagDict,
240 | PassDict,
241 | TagTuple,
242 | PassList,
243 | TagBytes,
244 | TagMarkup,
245 | TagUUID,
246 | TagDateTime,
247 | ]
248 |
249 | def __init__(self) -> None:
250 | self.tags: dict[str, JSONTag] = {}
251 | self.order: list[JSONTag] = []
252 |
253 | for cls in self.default_tags:
254 | self.register(cls)
255 |
256 | def register(
257 | self,
258 | tag_class: type[JSONTag],
259 | force: bool = False,
260 | index: int | None = None,
261 | ) -> None:
262 | """Register a new tag with this serializer.
263 |
264 | :param tag_class: tag class to register. Will be instantiated with this
265 | serializer instance.
266 | :param force: overwrite an existing tag. If false (default), a
267 | :exc:`KeyError` is raised.
268 | :param index: index to insert the new tag in the tag order. Useful when
269 | the new tag is a special case of an existing tag. If ``None``
270 | (default), the tag is appended to the end of the order.
271 |
272 | :raise KeyError: if the tag key is already registered and ``force`` is
273 | not true.
274 | """
275 | tag = tag_class(self)
276 | key = tag.key
277 |
278 | if key:
279 | if not force and key in self.tags:
280 | raise KeyError(f"Tag '{key}' is already registered.")
281 |
282 | self.tags[key] = tag
283 |
284 | if index is None:
285 | self.order.append(tag)
286 | else:
287 | self.order.insert(index, tag)
288 |
289 | def tag(self, value: t.Any) -> t.Any:
290 | """Convert a value to a tagged representation if necessary."""
291 | for tag in self.order:
292 | if tag.check(value):
293 | return tag.tag(value)
294 |
295 | return value
296 |
297 | def untag(self, value: dict[str, t.Any]) -> t.Any:
298 | """Convert a tagged representation back to the original type."""
299 | if len(value) != 1:
300 | return value
301 |
302 | key = next(iter(value))
303 |
304 | if key not in self.tags:
305 | return value
306 |
307 | return self.tags[key].to_python(value[key])
308 |
309 | def _untag_scan(self, value: t.Any) -> t.Any:
310 | if isinstance(value, dict):
311 | # untag each item recursively
312 | value = {k: self._untag_scan(v) for k, v in value.items()}
313 | # untag the dict itself
314 | value = self.untag(value)
315 | elif isinstance(value, list):
316 | # untag each item recursively
317 | value = [self._untag_scan(item) for item in value]
318 |
319 | return value
320 |
321 | def dumps(self, value: t.Any) -> str:
322 | """Tag the value and dump it to a compact JSON string."""
323 | return dumps(self.tag(value), separators=(",", ":"))
324 |
325 | def loads(self, value: str) -> t.Any:
326 | """Load data from a JSON string and deserialized any tagged objects."""
327 | return self._untag_scan(loads(value))
328 |
```
--------------------------------------------------------------------------------
/.venv/lib/python3.12/site-packages/lxml/sax.py:
--------------------------------------------------------------------------------
```python
1 | # cython: language_level=2
2 |
3 | """
4 | SAX-based adapter to copy trees from/to the Python standard library.
5 |
6 | Use the `ElementTreeContentHandler` class to build an ElementTree from
7 | SAX events.
8 |
9 | Use the `ElementTreeProducer` class or the `saxify()` function to fire
10 | the SAX events of an ElementTree against a SAX ContentHandler.
11 |
12 | See https://lxml.de/sax.html
13 | """
14 |
15 |
16 | from xml.sax.handler import ContentHandler
17 | from lxml import etree
18 | from lxml.etree import ElementTree, SubElement
19 | from lxml.etree import Comment, ProcessingInstruction
20 |
21 |
22 | class SaxError(etree.LxmlError):
23 | """General SAX error.
24 | """
25 |
26 |
27 | def _getNsTag(tag):
28 | if tag[0] == '{':
29 | return tuple(tag[1:].split('}', 1))
30 | else:
31 | return None, tag
32 |
33 |
34 | class ElementTreeContentHandler(ContentHandler):
35 | """Build an lxml ElementTree from SAX events.
36 | """
37 | def __init__(self, makeelement=None):
38 | ContentHandler.__init__(self)
39 | self._root = None
40 | self._root_siblings = []
41 | self._element_stack = []
42 | self._default_ns = None
43 | self._ns_mapping = { None : [None] }
44 | self._new_mappings = {}
45 | if makeelement is None:
46 | makeelement = etree.Element
47 | self._makeelement = makeelement
48 |
49 | def _get_etree(self):
50 | "Contains the generated ElementTree after parsing is finished."
51 | return ElementTree(self._root)
52 |
53 | etree = property(_get_etree, doc=_get_etree.__doc__)
54 |
55 | def setDocumentLocator(self, locator):
56 | pass
57 |
58 | def startDocument(self):
59 | pass
60 |
61 | def endDocument(self):
62 | pass
63 |
64 | def startPrefixMapping(self, prefix, uri):
65 | self._new_mappings[prefix] = uri
66 | try:
67 | self._ns_mapping[prefix].append(uri)
68 | except KeyError:
69 | self._ns_mapping[prefix] = [uri]
70 | if prefix is None:
71 | self._default_ns = uri
72 |
73 | def endPrefixMapping(self, prefix):
74 | ns_uri_list = self._ns_mapping[prefix]
75 | ns_uri_list.pop()
76 | if prefix is None:
77 | self._default_ns = ns_uri_list[-1]
78 |
79 | def _buildTag(self, ns_name_tuple):
80 | ns_uri, local_name = ns_name_tuple
81 | if ns_uri:
82 | el_tag = "{%s}%s" % ns_name_tuple
83 | elif self._default_ns:
84 | el_tag = "{%s}%s" % (self._default_ns, local_name)
85 | else:
86 | el_tag = local_name
87 | return el_tag
88 |
89 | def startElementNS(self, ns_name, qname, attributes=None):
90 | el_name = self._buildTag(ns_name)
91 | if attributes:
92 | attrs = {}
93 | try:
94 | iter_attributes = attributes.iteritems()
95 | except AttributeError:
96 | iter_attributes = attributes.items()
97 |
98 | for name_tuple, value in iter_attributes:
99 | if name_tuple[0]:
100 | attr_name = "{%s}%s" % name_tuple
101 | else:
102 | attr_name = name_tuple[1]
103 | attrs[attr_name] = value
104 | else:
105 | attrs = None
106 |
107 | element_stack = self._element_stack
108 | if self._root is None:
109 | element = self._root = \
110 | self._makeelement(el_name, attrs, self._new_mappings)
111 | if self._root_siblings and hasattr(element, 'addprevious'):
112 | for sibling in self._root_siblings:
113 | element.addprevious(sibling)
114 | del self._root_siblings[:]
115 | else:
116 | element = SubElement(element_stack[-1], el_name,
117 | attrs, self._new_mappings)
118 | element_stack.append(element)
119 |
120 | self._new_mappings.clear()
121 |
122 | def processingInstruction(self, target, data):
123 | pi = ProcessingInstruction(target, data)
124 | if self._root is None:
125 | self._root_siblings.append(pi)
126 | else:
127 | self._element_stack[-1].append(pi)
128 |
129 | def endElementNS(self, ns_name, qname):
130 | element = self._element_stack.pop()
131 | el_tag = self._buildTag(ns_name)
132 | if el_tag != element.tag:
133 | raise SaxError("Unexpected element closed: " + el_tag)
134 |
135 | def startElement(self, name, attributes=None):
136 | if attributes:
137 | attributes = {(None, k): v for k, v in attributes.items()}
138 | self.startElementNS((None, name), name, attributes)
139 |
140 | def endElement(self, name):
141 | self.endElementNS((None, name), name)
142 |
143 | def characters(self, data):
144 | last_element = self._element_stack[-1]
145 | try:
146 | # if there already is a child element, we must append to its tail
147 | last_element = last_element[-1]
148 | last_element.tail = (last_element.tail or '') + data
149 | except IndexError:
150 | # otherwise: append to the text
151 | last_element.text = (last_element.text or '') + data
152 |
153 | ignorableWhitespace = characters
154 |
155 |
156 | class ElementTreeProducer:
157 | """Produces SAX events for an element and children.
158 | """
159 | def __init__(self, element_or_tree, content_handler):
160 | try:
161 | element = element_or_tree.getroot()
162 | except AttributeError:
163 | element = element_or_tree
164 | self._element = element
165 | self._content_handler = content_handler
166 | from xml.sax.xmlreader import AttributesNSImpl as attr_class
167 | self._attr_class = attr_class
168 | self._empty_attributes = attr_class({}, {})
169 |
170 | def saxify(self):
171 | self._content_handler.startDocument()
172 |
173 | element = self._element
174 | if hasattr(element, 'getprevious'):
175 | siblings = []
176 | sibling = element.getprevious()
177 | while getattr(sibling, 'tag', None) is ProcessingInstruction:
178 | siblings.append(sibling)
179 | sibling = sibling.getprevious()
180 | for sibling in siblings[::-1]:
181 | self._recursive_saxify(sibling, {})
182 |
183 | self._recursive_saxify(element, {})
184 |
185 | if hasattr(element, 'getnext'):
186 | sibling = element.getnext()
187 | while getattr(sibling, 'tag', None) is ProcessingInstruction:
188 | self._recursive_saxify(sibling, {})
189 | sibling = sibling.getnext()
190 |
191 | self._content_handler.endDocument()
192 |
193 | def _recursive_saxify(self, element, parent_nsmap):
194 | content_handler = self._content_handler
195 | tag = element.tag
196 | if tag is Comment or tag is ProcessingInstruction:
197 | if tag is ProcessingInstruction:
198 | content_handler.processingInstruction(
199 | element.target, element.text)
200 | tail = element.tail
201 | if tail:
202 | content_handler.characters(tail)
203 | return
204 |
205 | element_nsmap = element.nsmap
206 | new_prefixes = []
207 | if element_nsmap != parent_nsmap:
208 | # There have been updates to the namespace
209 | for prefix, ns_uri in element_nsmap.items():
210 | if parent_nsmap.get(prefix) != ns_uri:
211 | new_prefixes.append( (prefix, ns_uri) )
212 |
213 | attribs = element.items()
214 | if attribs:
215 | attr_values = {}
216 | attr_qnames = {}
217 | for attr_ns_name, value in attribs:
218 | attr_ns_tuple = _getNsTag(attr_ns_name)
219 | attr_values[attr_ns_tuple] = value
220 | attr_qnames[attr_ns_tuple] = self._build_qname(
221 | attr_ns_tuple[0], attr_ns_tuple[1], element_nsmap,
222 | preferred_prefix=None, is_attribute=True)
223 | sax_attributes = self._attr_class(attr_values, attr_qnames)
224 | else:
225 | sax_attributes = self._empty_attributes
226 |
227 | ns_uri, local_name = _getNsTag(tag)
228 | qname = self._build_qname(
229 | ns_uri, local_name, element_nsmap, element.prefix, is_attribute=False)
230 |
231 | for prefix, uri in new_prefixes:
232 | content_handler.startPrefixMapping(prefix, uri)
233 | content_handler.startElementNS(
234 | (ns_uri, local_name), qname, sax_attributes)
235 | text = element.text
236 | if text:
237 | content_handler.characters(text)
238 | for child in element:
239 | self._recursive_saxify(child, element_nsmap)
240 | content_handler.endElementNS((ns_uri, local_name), qname)
241 | for prefix, uri in new_prefixes:
242 | content_handler.endPrefixMapping(prefix)
243 | tail = element.tail
244 | if tail:
245 | content_handler.characters(tail)
246 |
247 | def _build_qname(self, ns_uri, local_name, nsmap, preferred_prefix, is_attribute):
248 | if ns_uri is None:
249 | return local_name
250 |
251 | if not is_attribute and nsmap.get(preferred_prefix) == ns_uri:
252 | prefix = preferred_prefix
253 | else:
254 | # Pick the first matching prefix, in alphabetical order.
255 | candidates = [
256 | pfx for (pfx, uri) in nsmap.items()
257 | if pfx is not None and uri == ns_uri
258 | ]
259 | prefix = (
260 | candidates[0] if len(candidates) == 1
261 | else min(candidates) if candidates
262 | else None
263 | )
264 |
265 | if prefix is None:
266 | # Default namespace
267 | return local_name
268 | return prefix + ':' + local_name
269 |
270 |
271 | def saxify(element_or_tree, content_handler):
272 | """One-shot helper to generate SAX events from an XML tree and fire
273 | them against a SAX ContentHandler.
274 | """
275 | return ElementTreeProducer(element_or_tree, content_handler).saxify()
276 |
```
--------------------------------------------------------------------------------
/.venv/lib/python3.12/site-packages/werkzeug/debug/repr.py:
--------------------------------------------------------------------------------
```python
1 | """Object representations for debugging purposes. Unlike the default
2 | repr, these expose more information and produce HTML instead of ASCII.
3 |
4 | Together with the CSS and JavaScript of the debugger this gives a
5 | colorful and more compact output.
6 | """
7 |
8 | from __future__ import annotations
9 |
10 | import codecs
11 | import re
12 | import sys
13 | import typing as t
14 | from collections import deque
15 | from traceback import format_exception_only
16 |
17 | from markupsafe import escape
18 |
19 | missing = object()
20 | _paragraph_re = re.compile(r"(?:\r\n|\r|\n){2,}")
21 | RegexType = type(_paragraph_re)
22 |
23 | HELP_HTML = """\
24 | <div class=box>
25 | <h3>%(title)s</h3>
26 | <pre class=help>%(text)s</pre>
27 | </div>\
28 | """
29 | OBJECT_DUMP_HTML = """\
30 | <div class=box>
31 | <h3>%(title)s</h3>
32 | %(repr)s
33 | <table>%(items)s</table>
34 | </div>\
35 | """
36 |
37 |
38 | def debug_repr(obj: object) -> str:
39 | """Creates a debug repr of an object as HTML string."""
40 | return DebugReprGenerator().repr(obj)
41 |
42 |
43 | def dump(obj: object = missing) -> None:
44 | """Print the object details to stdout._write (for the interactive
45 | console of the web debugger.
46 | """
47 | gen = DebugReprGenerator()
48 | if obj is missing:
49 | rv = gen.dump_locals(sys._getframe(1).f_locals)
50 | else:
51 | rv = gen.dump_object(obj)
52 | sys.stdout._write(rv) # type: ignore
53 |
54 |
55 | class _Helper:
56 | """Displays an HTML version of the normal help, for the interactive
57 | debugger only because it requires a patched sys.stdout.
58 | """
59 |
60 | def __repr__(self) -> str:
61 | return "Type help(object) for help about object."
62 |
63 | def __call__(self, topic: t.Any | None = None) -> None:
64 | if topic is None:
65 | sys.stdout._write(f"<span class=help>{self!r}</span>") # type: ignore
66 | return
67 | import pydoc
68 |
69 | pydoc.help(topic)
70 | rv = sys.stdout.reset() # type: ignore
71 | paragraphs = _paragraph_re.split(rv)
72 | if len(paragraphs) > 1:
73 | title = paragraphs[0]
74 | text = "\n\n".join(paragraphs[1:])
75 | else:
76 | title = "Help"
77 | text = paragraphs[0]
78 | sys.stdout._write(HELP_HTML % {"title": title, "text": text}) # type: ignore
79 |
80 |
81 | helper = _Helper()
82 |
83 |
84 | def _add_subclass_info(inner: str, obj: object, base: type | tuple[type, ...]) -> str:
85 | if isinstance(base, tuple):
86 | for cls in base:
87 | if type(obj) is cls:
88 | return inner
89 | elif type(obj) is base:
90 | return inner
91 | module = ""
92 | if obj.__class__.__module__ not in ("__builtin__", "exceptions"):
93 | module = f'<span class="module">{obj.__class__.__module__}.</span>'
94 | return f"{module}{type(obj).__name__}({inner})"
95 |
96 |
97 | def _sequence_repr_maker(
98 | left: str, right: str, base: type, limit: int = 8
99 | ) -> t.Callable[[DebugReprGenerator, t.Iterable[t.Any], bool], str]:
100 | def proxy(self: DebugReprGenerator, obj: t.Iterable[t.Any], recursive: bool) -> str:
101 | if recursive:
102 | return _add_subclass_info(f"{left}...{right}", obj, base)
103 | buf = [left]
104 | have_extended_section = False
105 | for idx, item in enumerate(obj):
106 | if idx:
107 | buf.append(", ")
108 | if idx == limit:
109 | buf.append('<span class="extended">')
110 | have_extended_section = True
111 | buf.append(self.repr(item))
112 | if have_extended_section:
113 | buf.append("</span>")
114 | buf.append(right)
115 | return _add_subclass_info("".join(buf), obj, base)
116 |
117 | return proxy
118 |
119 |
120 | class DebugReprGenerator:
121 | def __init__(self) -> None:
122 | self._stack: list[t.Any] = []
123 |
124 | list_repr = _sequence_repr_maker("[", "]", list)
125 | tuple_repr = _sequence_repr_maker("(", ")", tuple)
126 | set_repr = _sequence_repr_maker("set([", "])", set)
127 | frozenset_repr = _sequence_repr_maker("frozenset([", "])", frozenset)
128 | deque_repr = _sequence_repr_maker(
129 | '<span class="module">collections.</span>deque([', "])", deque
130 | )
131 |
132 | def regex_repr(self, obj: t.Pattern[t.AnyStr]) -> str:
133 | pattern = repr(obj.pattern)
134 | pattern = codecs.decode(pattern, "unicode-escape", "ignore")
135 | pattern = f"r{pattern}"
136 | return f're.compile(<span class="string regex">{pattern}</span>)'
137 |
138 | def string_repr(self, obj: str | bytes, limit: int = 70) -> str:
139 | buf = ['<span class="string">']
140 | r = repr(obj)
141 |
142 | # shorten the repr when the hidden part would be at least 3 chars
143 | if len(r) - limit > 2:
144 | buf.extend(
145 | (
146 | escape(r[:limit]),
147 | '<span class="extended">',
148 | escape(r[limit:]),
149 | "</span>",
150 | )
151 | )
152 | else:
153 | buf.append(escape(r))
154 |
155 | buf.append("</span>")
156 | out = "".join(buf)
157 |
158 | # if the repr looks like a standard string, add subclass info if needed
159 | if r[0] in "'\"" or (r[0] == "b" and r[1] in "'\""):
160 | return _add_subclass_info(out, obj, (bytes, str))
161 |
162 | # otherwise, assume the repr distinguishes the subclass already
163 | return out
164 |
165 | def dict_repr(
166 | self,
167 | d: dict[int, None] | dict[str, int] | dict[str | int, int],
168 | recursive: bool,
169 | limit: int = 5,
170 | ) -> str:
171 | if recursive:
172 | return _add_subclass_info("{...}", d, dict)
173 | buf = ["{"]
174 | have_extended_section = False
175 | for idx, (key, value) in enumerate(d.items()):
176 | if idx:
177 | buf.append(", ")
178 | if idx == limit - 1:
179 | buf.append('<span class="extended">')
180 | have_extended_section = True
181 | buf.append(
182 | f'<span class="pair"><span class="key">{self.repr(key)}</span>:'
183 | f' <span class="value">{self.repr(value)}</span></span>'
184 | )
185 | if have_extended_section:
186 | buf.append("</span>")
187 | buf.append("}")
188 | return _add_subclass_info("".join(buf), d, dict)
189 |
190 | def object_repr(self, obj: t.Any) -> str:
191 | r = repr(obj)
192 | return f'<span class="object">{escape(r)}</span>'
193 |
194 | def dispatch_repr(self, obj: t.Any, recursive: bool) -> str:
195 | if obj is helper:
196 | return f'<span class="help">{helper!r}</span>'
197 | if isinstance(obj, (int, float, complex)):
198 | return f'<span class="number">{obj!r}</span>'
199 | if isinstance(obj, str) or isinstance(obj, bytes):
200 | return self.string_repr(obj)
201 | if isinstance(obj, RegexType):
202 | return self.regex_repr(obj)
203 | if isinstance(obj, list):
204 | return self.list_repr(obj, recursive)
205 | if isinstance(obj, tuple):
206 | return self.tuple_repr(obj, recursive)
207 | if isinstance(obj, set):
208 | return self.set_repr(obj, recursive)
209 | if isinstance(obj, frozenset):
210 | return self.frozenset_repr(obj, recursive)
211 | if isinstance(obj, dict):
212 | return self.dict_repr(obj, recursive)
213 | if isinstance(obj, deque):
214 | return self.deque_repr(obj, recursive)
215 | return self.object_repr(obj)
216 |
217 | def fallback_repr(self) -> str:
218 | try:
219 | info = "".join(format_exception_only(*sys.exc_info()[:2]))
220 | except Exception:
221 | info = "?"
222 | return (
223 | '<span class="brokenrepr">'
224 | f"<broken repr ({escape(info.strip())})></span>"
225 | )
226 |
227 | def repr(self, obj: object) -> str:
228 | recursive = False
229 | for item in self._stack:
230 | if item is obj:
231 | recursive = True
232 | break
233 | self._stack.append(obj)
234 | try:
235 | try:
236 | return self.dispatch_repr(obj, recursive)
237 | except Exception:
238 | return self.fallback_repr()
239 | finally:
240 | self._stack.pop()
241 |
242 | def dump_object(self, obj: object) -> str:
243 | repr = None
244 | items: list[tuple[str, str]] | None = None
245 |
246 | if isinstance(obj, dict):
247 | title = "Contents of"
248 | items = []
249 | for key, value in obj.items():
250 | if not isinstance(key, str):
251 | items = None
252 | break
253 | items.append((key, self.repr(value)))
254 | if items is None:
255 | items = []
256 | repr = self.repr(obj)
257 | for key in dir(obj):
258 | try:
259 | items.append((key, self.repr(getattr(obj, key))))
260 | except Exception:
261 | pass
262 | title = "Details for"
263 | title += f" {object.__repr__(obj)[1:-1]}"
264 | return self.render_object_dump(items, title, repr)
265 |
266 | def dump_locals(self, d: dict[str, t.Any]) -> str:
267 | items = [(key, self.repr(value)) for key, value in d.items()]
268 | return self.render_object_dump(items, "Local variables in frame")
269 |
270 | def render_object_dump(
271 | self, items: list[tuple[str, str]], title: str, repr: str | None = None
272 | ) -> str:
273 | html_items = []
274 | for key, value in items:
275 | html_items.append(f"<tr><th>{escape(key)}<td><pre class=repr>{value}</pre>")
276 | if not html_items:
277 | html_items.append("<tr><td><em>Nothing</em>")
278 | return OBJECT_DUMP_HTML % {
279 | "title": escape(title),
280 | "repr": f"<pre class=repr>{repr if repr else ''}</pre>",
281 | "items": "\n".join(html_items),
282 | }
283 |
```
--------------------------------------------------------------------------------
/.venv/lib/python3.12/site-packages/pip/_internal/utils/temp_dir.py:
--------------------------------------------------------------------------------
```python
1 | import errno
2 | import itertools
3 | import logging
4 | import os.path
5 | import tempfile
6 | import traceback
7 | from contextlib import ExitStack, contextmanager
8 | from pathlib import Path
9 | from typing import (
10 | Any,
11 | Callable,
12 | Dict,
13 | Generator,
14 | List,
15 | Optional,
16 | TypeVar,
17 | Union,
18 | )
19 |
20 | from pip._internal.utils.misc import enum, rmtree
21 |
22 | logger = logging.getLogger(__name__)
23 |
24 | _T = TypeVar("_T", bound="TempDirectory")
25 |
26 |
27 | # Kinds of temporary directories. Only needed for ones that are
28 | # globally-managed.
29 | tempdir_kinds = enum(
30 | BUILD_ENV="build-env",
31 | EPHEM_WHEEL_CACHE="ephem-wheel-cache",
32 | REQ_BUILD="req-build",
33 | )
34 |
35 |
36 | _tempdir_manager: Optional[ExitStack] = None
37 |
38 |
39 | @contextmanager
40 | def global_tempdir_manager() -> Generator[None, None, None]:
41 | global _tempdir_manager
42 | with ExitStack() as stack:
43 | old_tempdir_manager, _tempdir_manager = _tempdir_manager, stack
44 | try:
45 | yield
46 | finally:
47 | _tempdir_manager = old_tempdir_manager
48 |
49 |
50 | class TempDirectoryTypeRegistry:
51 | """Manages temp directory behavior"""
52 |
53 | def __init__(self) -> None:
54 | self._should_delete: Dict[str, bool] = {}
55 |
56 | def set_delete(self, kind: str, value: bool) -> None:
57 | """Indicate whether a TempDirectory of the given kind should be
58 | auto-deleted.
59 | """
60 | self._should_delete[kind] = value
61 |
62 | def get_delete(self, kind: str) -> bool:
63 | """Get configured auto-delete flag for a given TempDirectory type,
64 | default True.
65 | """
66 | return self._should_delete.get(kind, True)
67 |
68 |
69 | _tempdir_registry: Optional[TempDirectoryTypeRegistry] = None
70 |
71 |
72 | @contextmanager
73 | def tempdir_registry() -> Generator[TempDirectoryTypeRegistry, None, None]:
74 | """Provides a scoped global tempdir registry that can be used to dictate
75 | whether directories should be deleted.
76 | """
77 | global _tempdir_registry
78 | old_tempdir_registry = _tempdir_registry
79 | _tempdir_registry = TempDirectoryTypeRegistry()
80 | try:
81 | yield _tempdir_registry
82 | finally:
83 | _tempdir_registry = old_tempdir_registry
84 |
85 |
86 | class _Default:
87 | pass
88 |
89 |
90 | _default = _Default()
91 |
92 |
93 | class TempDirectory:
94 | """Helper class that owns and cleans up a temporary directory.
95 |
96 | This class can be used as a context manager or as an OO representation of a
97 | temporary directory.
98 |
99 | Attributes:
100 | path
101 | Location to the created temporary directory
102 | delete
103 | Whether the directory should be deleted when exiting
104 | (when used as a contextmanager)
105 |
106 | Methods:
107 | cleanup()
108 | Deletes the temporary directory
109 |
110 | When used as a context manager, if the delete attribute is True, on
111 | exiting the context the temporary directory is deleted.
112 | """
113 |
114 | def __init__(
115 | self,
116 | path: Optional[str] = None,
117 | delete: Union[bool, None, _Default] = _default,
118 | kind: str = "temp",
119 | globally_managed: bool = False,
120 | ignore_cleanup_errors: bool = True,
121 | ):
122 | super().__init__()
123 |
124 | if delete is _default:
125 | if path is not None:
126 | # If we were given an explicit directory, resolve delete option
127 | # now.
128 | delete = False
129 | else:
130 | # Otherwise, we wait until cleanup and see what
131 | # tempdir_registry says.
132 | delete = None
133 |
134 | # The only time we specify path is in for editables where it
135 | # is the value of the --src option.
136 | if path is None:
137 | path = self._create(kind)
138 |
139 | self._path = path
140 | self._deleted = False
141 | self.delete = delete
142 | self.kind = kind
143 | self.ignore_cleanup_errors = ignore_cleanup_errors
144 |
145 | if globally_managed:
146 | assert _tempdir_manager is not None
147 | _tempdir_manager.enter_context(self)
148 |
149 | @property
150 | def path(self) -> str:
151 | assert not self._deleted, f"Attempted to access deleted path: {self._path}"
152 | return self._path
153 |
154 | def __repr__(self) -> str:
155 | return f"<{self.__class__.__name__} {self.path!r}>"
156 |
157 | def __enter__(self: _T) -> _T:
158 | return self
159 |
160 | def __exit__(self, exc: Any, value: Any, tb: Any) -> None:
161 | if self.delete is not None:
162 | delete = self.delete
163 | elif _tempdir_registry:
164 | delete = _tempdir_registry.get_delete(self.kind)
165 | else:
166 | delete = True
167 |
168 | if delete:
169 | self.cleanup()
170 |
171 | def _create(self, kind: str) -> str:
172 | """Create a temporary directory and store its path in self.path"""
173 | # We realpath here because some systems have their default tmpdir
174 | # symlinked to another directory. This tends to confuse build
175 | # scripts, so we canonicalize the path by traversing potential
176 | # symlinks here.
177 | path = os.path.realpath(tempfile.mkdtemp(prefix=f"pip-{kind}-"))
178 | logger.debug("Created temporary directory: %s", path)
179 | return path
180 |
181 | def cleanup(self) -> None:
182 | """Remove the temporary directory created and reset state"""
183 | self._deleted = True
184 | if not os.path.exists(self._path):
185 | return
186 |
187 | errors: List[BaseException] = []
188 |
189 | def onerror(
190 | func: Callable[..., Any],
191 | path: Path,
192 | exc_val: BaseException,
193 | ) -> None:
194 | """Log a warning for a `rmtree` error and continue"""
195 | formatted_exc = "\n".join(
196 | traceback.format_exception_only(type(exc_val), exc_val)
197 | )
198 | formatted_exc = formatted_exc.rstrip() # remove trailing new line
199 | if func in (os.unlink, os.remove, os.rmdir):
200 | logger.debug(
201 | "Failed to remove a temporary file '%s' due to %s.\n",
202 | path,
203 | formatted_exc,
204 | )
205 | else:
206 | logger.debug("%s failed with %s.", func.__qualname__, formatted_exc)
207 | errors.append(exc_val)
208 |
209 | if self.ignore_cleanup_errors:
210 | try:
211 | # first try with @retry; retrying to handle ephemeral errors
212 | rmtree(self._path, ignore_errors=False)
213 | except OSError:
214 | # last pass ignore/log all errors
215 | rmtree(self._path, onexc=onerror)
216 | if errors:
217 | logger.warning(
218 | "Failed to remove contents in a temporary directory '%s'.\n"
219 | "You can safely remove it manually.",
220 | self._path,
221 | )
222 | else:
223 | rmtree(self._path)
224 |
225 |
226 | class AdjacentTempDirectory(TempDirectory):
227 | """Helper class that creates a temporary directory adjacent to a real one.
228 |
229 | Attributes:
230 | original
231 | The original directory to create a temp directory for.
232 | path
233 | After calling create() or entering, contains the full
234 | path to the temporary directory.
235 | delete
236 | Whether the directory should be deleted when exiting
237 | (when used as a contextmanager)
238 |
239 | """
240 |
241 | # The characters that may be used to name the temp directory
242 | # We always prepend a ~ and then rotate through these until
243 | # a usable name is found.
244 | # pkg_resources raises a different error for .dist-info folder
245 | # with leading '-' and invalid metadata
246 | LEADING_CHARS = "-~.=%0123456789"
247 |
248 | def __init__(self, original: str, delete: Optional[bool] = None) -> None:
249 | self.original = original.rstrip("/\\")
250 | super().__init__(delete=delete)
251 |
252 | @classmethod
253 | def _generate_names(cls, name: str) -> Generator[str, None, None]:
254 | """Generates a series of temporary names.
255 |
256 | The algorithm replaces the leading characters in the name
257 | with ones that are valid filesystem characters, but are not
258 | valid package names (for both Python and pip definitions of
259 | package).
260 | """
261 | for i in range(1, len(name)):
262 | for candidate in itertools.combinations_with_replacement(
263 | cls.LEADING_CHARS, i - 1
264 | ):
265 | new_name = "~" + "".join(candidate) + name[i:]
266 | if new_name != name:
267 | yield new_name
268 |
269 | # If we make it this far, we will have to make a longer name
270 | for i in range(len(cls.LEADING_CHARS)):
271 | for candidate in itertools.combinations_with_replacement(
272 | cls.LEADING_CHARS, i
273 | ):
274 | new_name = "~" + "".join(candidate) + name
275 | if new_name != name:
276 | yield new_name
277 |
278 | def _create(self, kind: str) -> str:
279 | root, name = os.path.split(self.original)
280 | for candidate in self._generate_names(name):
281 | path = os.path.join(root, candidate)
282 | try:
283 | os.mkdir(path)
284 | except OSError as ex:
285 | # Continue if the name exists already
286 | if ex.errno != errno.EEXIST:
287 | raise
288 | else:
289 | path = os.path.realpath(path)
290 | break
291 | else:
292 | # Final fallback on the default behavior.
293 | path = os.path.realpath(tempfile.mkdtemp(prefix=f"pip-{kind}-"))
294 |
295 | logger.debug("Created temporary directory: %s", path)
296 | return path
297 |
```
--------------------------------------------------------------------------------
/.venv/lib/python3.12/site-packages/urllib3/exceptions.py:
--------------------------------------------------------------------------------
```python
1 | from __future__ import annotations
2 |
3 | import socket
4 | import typing
5 | import warnings
6 | from email.errors import MessageDefect
7 | from http.client import IncompleteRead as httplib_IncompleteRead
8 |
9 | if typing.TYPE_CHECKING:
10 | from .connection import HTTPConnection
11 | from .connectionpool import ConnectionPool
12 | from .response import HTTPResponse
13 | from .util.retry import Retry
14 |
15 | # Base Exceptions
16 |
17 |
18 | class HTTPError(Exception):
19 | """Base exception used by this module."""
20 |
21 |
22 | class HTTPWarning(Warning):
23 | """Base warning used by this module."""
24 |
25 |
26 | _TYPE_REDUCE_RESULT = typing.Tuple[
27 | typing.Callable[..., object], typing.Tuple[object, ...]
28 | ]
29 |
30 |
31 | class PoolError(HTTPError):
32 | """Base exception for errors caused within a pool."""
33 |
34 | def __init__(self, pool: ConnectionPool, message: str) -> None:
35 | self.pool = pool
36 | super().__init__(f"{pool}: {message}")
37 |
38 | def __reduce__(self) -> _TYPE_REDUCE_RESULT:
39 | # For pickling purposes.
40 | return self.__class__, (None, None)
41 |
42 |
43 | class RequestError(PoolError):
44 | """Base exception for PoolErrors that have associated URLs."""
45 |
46 | def __init__(self, pool: ConnectionPool, url: str, message: str) -> None:
47 | self.url = url
48 | super().__init__(pool, message)
49 |
50 | def __reduce__(self) -> _TYPE_REDUCE_RESULT:
51 | # For pickling purposes.
52 | return self.__class__, (None, self.url, None)
53 |
54 |
55 | class SSLError(HTTPError):
56 | """Raised when SSL certificate fails in an HTTPS connection."""
57 |
58 |
59 | class ProxyError(HTTPError):
60 | """Raised when the connection to a proxy fails."""
61 |
62 | # The original error is also available as __cause__.
63 | original_error: Exception
64 |
65 | def __init__(self, message: str, error: Exception) -> None:
66 | super().__init__(message, error)
67 | self.original_error = error
68 |
69 |
70 | class DecodeError(HTTPError):
71 | """Raised when automatic decoding based on Content-Type fails."""
72 |
73 |
74 | class ProtocolError(HTTPError):
75 | """Raised when something unexpected happens mid-request/response."""
76 |
77 |
78 | #: Renamed to ProtocolError but aliased for backwards compatibility.
79 | ConnectionError = ProtocolError
80 |
81 |
82 | # Leaf Exceptions
83 |
84 |
85 | class MaxRetryError(RequestError):
86 | """Raised when the maximum number of retries is exceeded.
87 |
88 | :param pool: The connection pool
89 | :type pool: :class:`~urllib3.connectionpool.HTTPConnectionPool`
90 | :param str url: The requested Url
91 | :param reason: The underlying error
92 | :type reason: :class:`Exception`
93 |
94 | """
95 |
96 | def __init__(
97 | self, pool: ConnectionPool, url: str, reason: Exception | None = None
98 | ) -> None:
99 | self.reason = reason
100 |
101 | message = f"Max retries exceeded with url: {url} (Caused by {reason!r})"
102 |
103 | super().__init__(pool, url, message)
104 |
105 |
106 | class HostChangedError(RequestError):
107 | """Raised when an existing pool gets a request for a foreign host."""
108 |
109 | def __init__(
110 | self, pool: ConnectionPool, url: str, retries: Retry | int = 3
111 | ) -> None:
112 | message = f"Tried to open a foreign host with url: {url}"
113 | super().__init__(pool, url, message)
114 | self.retries = retries
115 |
116 |
117 | class TimeoutStateError(HTTPError):
118 | """Raised when passing an invalid state to a timeout"""
119 |
120 |
121 | class TimeoutError(HTTPError):
122 | """Raised when a socket timeout error occurs.
123 |
124 | Catching this error will catch both :exc:`ReadTimeoutErrors
125 | <ReadTimeoutError>` and :exc:`ConnectTimeoutErrors <ConnectTimeoutError>`.
126 | """
127 |
128 |
129 | class ReadTimeoutError(TimeoutError, RequestError):
130 | """Raised when a socket timeout occurs while receiving data from a server"""
131 |
132 |
133 | # This timeout error does not have a URL attached and needs to inherit from the
134 | # base HTTPError
135 | class ConnectTimeoutError(TimeoutError):
136 | """Raised when a socket timeout occurs while connecting to a server"""
137 |
138 |
139 | class NewConnectionError(ConnectTimeoutError, HTTPError):
140 | """Raised when we fail to establish a new connection. Usually ECONNREFUSED."""
141 |
142 | def __init__(self, conn: HTTPConnection, message: str) -> None:
143 | self.conn = conn
144 | super().__init__(f"{conn}: {message}")
145 |
146 | @property
147 | def pool(self) -> HTTPConnection:
148 | warnings.warn(
149 | "The 'pool' property is deprecated and will be removed "
150 | "in urllib3 v2.1.0. Use 'conn' instead.",
151 | DeprecationWarning,
152 | stacklevel=2,
153 | )
154 |
155 | return self.conn
156 |
157 |
158 | class NameResolutionError(NewConnectionError):
159 | """Raised when host name resolution fails."""
160 |
161 | def __init__(self, host: str, conn: HTTPConnection, reason: socket.gaierror):
162 | message = f"Failed to resolve '{host}' ({reason})"
163 | super().__init__(conn, message)
164 |
165 |
166 | class EmptyPoolError(PoolError):
167 | """Raised when a pool runs out of connections and no more are allowed."""
168 |
169 |
170 | class FullPoolError(PoolError):
171 | """Raised when we try to add a connection to a full pool in blocking mode."""
172 |
173 |
174 | class ClosedPoolError(PoolError):
175 | """Raised when a request enters a pool after the pool has been closed."""
176 |
177 |
178 | class LocationValueError(ValueError, HTTPError):
179 | """Raised when there is something wrong with a given URL input."""
180 |
181 |
182 | class LocationParseError(LocationValueError):
183 | """Raised when get_host or similar fails to parse the URL input."""
184 |
185 | def __init__(self, location: str) -> None:
186 | message = f"Failed to parse: {location}"
187 | super().__init__(message)
188 |
189 | self.location = location
190 |
191 |
192 | class URLSchemeUnknown(LocationValueError):
193 | """Raised when a URL input has an unsupported scheme."""
194 |
195 | def __init__(self, scheme: str):
196 | message = f"Not supported URL scheme {scheme}"
197 | super().__init__(message)
198 |
199 | self.scheme = scheme
200 |
201 |
202 | class ResponseError(HTTPError):
203 | """Used as a container for an error reason supplied in a MaxRetryError."""
204 |
205 | GENERIC_ERROR = "too many error responses"
206 | SPECIFIC_ERROR = "too many {status_code} error responses"
207 |
208 |
209 | class SecurityWarning(HTTPWarning):
210 | """Warned when performing security reducing actions"""
211 |
212 |
213 | class InsecureRequestWarning(SecurityWarning):
214 | """Warned when making an unverified HTTPS request."""
215 |
216 |
217 | class NotOpenSSLWarning(SecurityWarning):
218 | """Warned when using unsupported SSL library"""
219 |
220 |
221 | class SystemTimeWarning(SecurityWarning):
222 | """Warned when system time is suspected to be wrong"""
223 |
224 |
225 | class InsecurePlatformWarning(SecurityWarning):
226 | """Warned when certain TLS/SSL configuration is not available on a platform."""
227 |
228 |
229 | class DependencyWarning(HTTPWarning):
230 | """
231 | Warned when an attempt is made to import a module with missing optional
232 | dependencies.
233 | """
234 |
235 |
236 | class ResponseNotChunked(ProtocolError, ValueError):
237 | """Response needs to be chunked in order to read it as chunks."""
238 |
239 |
240 | class BodyNotHttplibCompatible(HTTPError):
241 | """
242 | Body should be :class:`http.client.HTTPResponse` like
243 | (have an fp attribute which returns raw chunks) for read_chunked().
244 | """
245 |
246 |
247 | class IncompleteRead(HTTPError, httplib_IncompleteRead):
248 | """
249 | Response length doesn't match expected Content-Length
250 |
251 | Subclass of :class:`http.client.IncompleteRead` to allow int value
252 | for ``partial`` to avoid creating large objects on streamed reads.
253 | """
254 |
255 | partial: int # type: ignore[assignment]
256 | expected: int
257 |
258 | def __init__(self, partial: int, expected: int) -> None:
259 | self.partial = partial
260 | self.expected = expected
261 |
262 | def __repr__(self) -> str:
263 | return "IncompleteRead(%i bytes read, %i more expected)" % (
264 | self.partial,
265 | self.expected,
266 | )
267 |
268 |
269 | class InvalidChunkLength(HTTPError, httplib_IncompleteRead):
270 | """Invalid chunk length in a chunked response."""
271 |
272 | def __init__(self, response: HTTPResponse, length: bytes) -> None:
273 | self.partial: int = response.tell() # type: ignore[assignment]
274 | self.expected: int | None = response.length_remaining
275 | self.response = response
276 | self.length = length
277 |
278 | def __repr__(self) -> str:
279 | return "InvalidChunkLength(got length %r, %i bytes read)" % (
280 | self.length,
281 | self.partial,
282 | )
283 |
284 |
285 | class InvalidHeader(HTTPError):
286 | """The header provided was somehow invalid."""
287 |
288 |
289 | class ProxySchemeUnknown(AssertionError, URLSchemeUnknown):
290 | """ProxyManager does not support the supplied scheme"""
291 |
292 | # TODO(t-8ch): Stop inheriting from AssertionError in v2.0.
293 |
294 | def __init__(self, scheme: str | None) -> None:
295 | # 'localhost' is here because our URL parser parses
296 | # localhost:8080 -> scheme=localhost, remove if we fix this.
297 | if scheme == "localhost":
298 | scheme = None
299 | if scheme is None:
300 | message = "Proxy URL had no scheme, should start with http:// or https://"
301 | else:
302 | message = f"Proxy URL had unsupported scheme {scheme}, should use http:// or https://"
303 | super().__init__(message)
304 |
305 |
306 | class ProxySchemeUnsupported(ValueError):
307 | """Fetching HTTPS resources through HTTPS proxies is unsupported"""
308 |
309 |
310 | class HeaderParsingError(HTTPError):
311 | """Raised by assert_header_parsing, but we convert it to a log.warning statement."""
312 |
313 | def __init__(
314 | self, defects: list[MessageDefect], unparsed_data: bytes | str | None
315 | ) -> None:
316 | message = f"{defects or 'Unknown'}, unparsed data: {unparsed_data!r}"
317 | super().__init__(message)
318 |
319 |
320 | class UnrewindableBodyError(HTTPError):
321 | """urllib3 encountered an error when trying to rewind a body"""
322 |
```